diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..3dfaa58df --- /dev/null +++ b/.travis.yml @@ -0,0 +1,10 @@ +dist: trusty +language: node_js +node_js: + - '6' +before_install: npm install -g grunt-cli +before_script: + - cd build +script: + - npm install + - grunt --level=ADVANCED diff --git a/apps/api/documents/api.js b/apps/api/documents/api.js index edad26b69..530e3547c 100644 --- a/apps/api/documents/api.js +++ b/apps/api/documents/api.js @@ -328,7 +328,7 @@ if (type && typeof type[1] === 'string') { if (!_config.document.permissions) _config.document.permissions = {}; - _config.document.permissions.edit = false; + _config.document.permissions.edit = _config.document.permissions.review = false; _config.editorConfig.canUseHistory = false; } @@ -411,21 +411,12 @@ }); }; - var _showError = function(title, msg) { - _showMessage(title, msg, "error"); - }; - - // severity could be one of: "error", "info" or "warning" - var _showMessage = function(title, msg, severity) { - if (typeof severity !== 'string') { - severity = "info"; - } + var _showMessage = function(title, msg) { + msg = msg || title; _sendCommand({ command: 'showMessage', data: { - title: title, - msg: msg, - severity: severity + msg: msg } }); }; @@ -542,7 +533,6 @@ }; return { - showError : _showError, showMessage : _showMessage, processSaveResult : _processSaveResult, processRightsChange : _processRightsChange, diff --git a/apps/common/embed/resources/less/common.less b/apps/common/embed/resources/less/common.less index b32a2acca..d19c6bde5 100644 --- a/apps/common/embed/resources/less/common.less +++ b/apps/common/embed/resources/less/common.less @@ -563,6 +563,10 @@ background-position: 0 -22px; } } + + a { + cursor: pointer; + } } .masked { diff --git a/apps/common/main/lib/component/Button.js b/apps/common/main/lib/component/Button.js index 4fe884223..7a3176804 100644 --- a/apps/common/main/lib/component/Button.js +++ b/apps/common/main/lib/component/Button.js @@ -487,12 +487,12 @@ define([ this.caption = caption; if (this.rendered) { - var captionNode = this.cmpEl.find('button:first > .caption').andSelf().filter('button > .caption'); + var captionNode = this.cmpEl.find('button:first > .caption').addBack().filter('button > .caption'); if (captionNode.length > 0) { captionNode.text(caption); } else { - this.cmpEl.find('button:first').andSelf().filter('button').text(caption); + this.cmpEl.find('button:first').addBack().filter('button').text(caption); } } } diff --git a/apps/common/main/lib/component/ComboBox.js b/apps/common/main/lib/component/ComboBox.js index d45a3054c..612729bb2 100644 --- a/apps/common/main/lib/component/ComboBox.js +++ b/apps/common/main/lib/component/ComboBox.js @@ -188,6 +188,11 @@ define([ title : me.options.hint, placement : me.options.hintAnchor||'cursor' }); + + var modalParents = el.closest('.asc-window'); + if (modalParents.length > 0) { + el.data('bs.tooltip').tip().css('z-index', parseInt(modalParents.css('z-index')) + 10); + } } el.on('show.bs.dropdown', _.bind(me.onBeforeShowMenu, me)); @@ -227,6 +232,7 @@ define([ minScrollbarLength: 40, scrollYMarginOffset: 30, includePadding: true, + wheelSpeed: 10, alwaysVisibleY: this.scrollAlwaysVisible }, this.options.scroller)); } @@ -251,6 +257,7 @@ define([ minScrollbarLength: 40, scrollYMarginOffset: 30, includePadding: true, + wheelSpeed: 10, alwaysVisibleY: this.scrollAlwaysVisible }, this.options.scroller)); } @@ -547,7 +554,7 @@ define([ '<% _.each(items, function(item) { %>', '
  • <%= scope.getDisplayValue(item) %>
  • ', '<% }); %>' - ].join(''), { + ].join(''))({ items: this.store.toJSON(), scope: this })); @@ -562,6 +569,7 @@ define([ minScrollbarLength : 40, scrollYMarginOffset: 30, includePadding : true, + wheelSpeed: 10, alwaysVisibleY: this.scrollAlwaysVisible }, this.options.scroller)); } diff --git a/apps/common/main/lib/component/ComboBoxFonts.js b/apps/common/main/lib/component/ComboBoxFonts.js index 23fc458ad..c1bf141bd 100644 --- a/apps/common/main/lib/component/ComboBoxFonts.js +++ b/apps/common/main/lib/component/ComboBoxFonts.js @@ -87,6 +87,7 @@ define([ Common.UI.ComboBox.prototype.initialize.call(this, _.extend(options, { displayField: 'name', scroller: { + wheelSpeed: 20, alwaysVisibleY: true, onChange: this.updateVisibleFontsTiles.bind(this) } @@ -353,7 +354,7 @@ define([ '
  • ', '', '
  • ' - ].join(''), { + ].join(''))({ item: item.attributes, scope: this })); diff --git a/apps/common/main/lib/component/ComboDataView.js b/apps/common/main/lib/component/ComboDataView.js index e6816a990..421f85653 100644 --- a/apps/common/main/lib/component/ComboDataView.js +++ b/apps/common/main/lib/component/ComboDataView.js @@ -59,7 +59,8 @@ define([ enableKeyEvents : false, beforeOpenHandler : null, additionalMenuItems : null, - showLast: true + showLast: true, + minWidth: -1 }, template: _.template([ @@ -86,6 +87,7 @@ define([ this.rootHeight = 0; this.rendered = false; this.needFillComboView = false; + this.minWidth = this.options.minWidth; this.fieldPicker = new Common.UI.DataView({ cls: 'field-picker', @@ -215,6 +217,8 @@ define([ width = this.cmpEl.width(), height = this.cmpEl.height(); + if (width < this.minWidth) return; + if (this.rootWidth != width || this.rootHeight != height) { this.rootWidth = width; this.rootHeight = height; @@ -420,7 +424,7 @@ define([ var indexRec = store.indexOf(record), countRec = store.length, - maxViewCount = Math.floor((fieldPickerEl.width()) / (me.itemWidth + (me.itemMarginLeft || 0) + (me.itemMarginRight || 0) + (me.itemPaddingLeft || 0) + (me.itemPaddingRight || 0) + + maxViewCount = Math.floor(Math.max(fieldPickerEl.width(), me.minWidth) / (me.itemWidth + (me.itemMarginLeft || 0) + (me.itemMarginRight || 0) + (me.itemPaddingLeft || 0) + (me.itemPaddingRight || 0) + (me.itemBorderLeft || 0) + (me.itemBorderRight || 0))), newStyles = []; @@ -452,6 +456,10 @@ define([ } }, + clearComboView: function() { + this.fieldPicker.store.reset([]); + }, + selectByIndex: function(index) { if (index < 0) this.fieldPicker.deselectAll(); diff --git a/apps/common/main/lib/component/DataView.js b/apps/common/main/lib/component/DataView.js index 90b51aeaa..5aa890434 100644 --- a/apps/common/main/lib/component/DataView.js +++ b/apps/common/main/lib/component/DataView.js @@ -297,7 +297,7 @@ define([ if (_.isUndefined(this.scroller) && this.allowScrollbar) { this.scroller = new Common.UI.Scroller({ - el: $(this.el).find('.inner').andSelf().filter('.inner'), + el: $(this.el).find('.inner').addBack().filter('.inner'), useKeyboard: this.enableKeyEvents && !this.handleSelect, minScrollbarLength : 40, wheelSpeed: 10 @@ -394,7 +394,7 @@ define([ }); if (view) { - var innerEl = $(this.el).find('.inner').andSelf().filter('.inner'); + var innerEl = $(this.el).find('.inner').addBack().filter('.inner'); if (this.groups && this.groups.length > 0) { var group = this.groups.findWhere({id: record.get('group')}); @@ -452,7 +452,7 @@ define([ } if (this.store.length < 1 && this.emptyText.length > 0) - $(this.el).find('.inner').andSelf().filter('.inner').append('
    ' + this.emptyText + '
    '); + $(this.el).find('.inner').addBack().filter('.inner').append('
    ' + this.emptyText + '
    '); _.each(this.dataViewItems, function(item) { this.stopListening(item); @@ -464,7 +464,7 @@ define([ if (this.allowScrollbar) { this.scroller = new Common.UI.Scroller({ - el: $(this.el).find('.inner').andSelf().filter('.inner'), + el: $(this.el).find('.inner').addBack().filter('.inner'), useKeyboard: this.enableKeyEvents && !this.handleSelect, minScrollbarLength : 40, wheelSpeed: 10 @@ -487,7 +487,7 @@ define([ view.stopListening(); if (this.store.length < 1 && this.emptyText.length > 0) { - var el = $(this.el).find('.inner').andSelf().filter('.inner'); + var el = $(this.el).find('.inner').addBack().filter('.inner'); if ( el.find('.empty-text').length<=0 ) el.append('
    ' + this.emptyText + '
    '); } @@ -653,7 +653,7 @@ define([ attachKeyEvents: function() { if (this.enableKeyEvents && this.handleSelect) { - var el = $(this.el).find('.inner').andSelf().filter('.inner'); + var el = $(this.el).find('.inner').addBack().filter('.inner'); el.addClass('canfocused'); el.attr('tabindex', '0'); el.on((this.parentMenu && this.useBSKeydown) ? 'dataview:keydown' : 'keydown', _.bind(this.onKeyDown, this)); @@ -673,7 +673,7 @@ define([ setDisabled: function(disabled) { this.disabled = disabled; - $(this.el).find('.inner').andSelf().filter('.inner').toggleClass('disabled', disabled); + $(this.el).find('.inner').addBack().filter('.inner').toggleClass('disabled', disabled); }, isDisabled: function() { @@ -688,7 +688,7 @@ define([ var menuRoot = (this.parentMenu.cmpEl.attr('role') === 'menu') ? this.parentMenu.cmpEl : this.parentMenu.cmpEl.find('[role=menu]'), - innerEl = $(this.el).find('.inner').andSelf().filter('.inner'), + innerEl = $(this.el).find('.inner').addBack().filter('.inner'), docH = Common.Utils.innerHeight(), menuH = menuRoot.outerHeight(), top = parseInt(menuRoot.css('top')); diff --git a/apps/common/main/lib/component/InputField.js b/apps/common/main/lib/component/InputField.js index 6c44ba7ae..faf1c662a 100644 --- a/apps/common/main/lib/component/InputField.js +++ b/apps/common/main/lib/component/InputField.js @@ -150,7 +150,7 @@ define([ if (!me.rendered) { var el = this.cmpEl; - this._input = this.cmpEl.find('input').andSelf().filter('input'); + this._input = this.cmpEl.find('input').addBack().filter('input'); if (this.editable) { this._input.on('blur', _.bind(this.onInputChanged, this)); diff --git a/apps/common/main/lib/component/Menu.js b/apps/common/main/lib/component/Menu.js index 5cbd8a087..cf6917e6a 100644 --- a/apps/common/main/lib/component/Menu.js +++ b/apps/common/main/lib/component/Menu.js @@ -405,6 +405,7 @@ define([ item.off('click').off('toggle'); item.remove(); }); + this.rendered && this.cmpEl.find('.menu-scroll').off('click').remove(); me.items = []; }, diff --git a/apps/common/main/lib/component/MultiSliderGradient.js b/apps/common/main/lib/component/MultiSliderGradient.js index c738bb976..86290981b 100644 --- a/apps/common/main/lib/component/MultiSliderGradient.js +++ b/apps/common/main/lib/component/MultiSliderGradient.js @@ -150,6 +150,18 @@ define([ } style = Common.Utils.String.format('linear-gradient(to right, {0} {1}%, {2} {3}%)', this.colorValues[0], this.getValue(0), this.colorValues[1], this.getValue(1)); this.trackEl.css('background', style); + }, + + sortThumbs: function() { + var recalc_indexes = Common.UI.MultiSlider.prototype.sortThumbs.call(this), + new_colors = [], + me = this; + _.each (recalc_indexes, function(recalc_index) { + new_colors.push(me.colorValues[recalc_index]); + }); + this.colorValues = new_colors; + this.trigger('sortthumbs', me, recalc_indexes); + return recalc_indexes; } }); }); diff --git a/apps/common/main/lib/component/Slider.js b/apps/common/main/lib/component/Slider.js index 2d34c85e0..67a86d2d2 100644 --- a/apps/common/main/lib/component/Slider.js +++ b/apps/common/main/lib/component/Slider.js @@ -338,16 +338,21 @@ define([ e.preventDefault(); e.stopPropagation(); - var index = e.data, + var index = e.data.index, lastValue = me.thumbs[index].value, minValue = (index-1<0) ? 0 : me.thumbs[index-1].position, maxValue = (index+1 maxValue, + pos = Math.max(0, Math.min(100, position)), value = pos/me.delta + me.minValue; me.setThumbPosition(index, pos); me.thumbs[index].value = value; + if (need_sort) + me.sortThumbs(); + $(document).off('mouseup', onMouseUp); $(document).off('mousemove', onMouseMove); @@ -362,16 +367,21 @@ define([ e.preventDefault(); e.stopPropagation(); - var index = e.data, + var index = e.data.index, lastValue = me.thumbs[index].value, minValue = (index-1<0) ? 0 : me.thumbs[index-1].position, maxValue = (index+1 maxValue, + pos = Math.max(0, Math.min(100, position)), value = pos/me.delta + me.minValue; me.setThumbPosition(index, pos); me.thumbs[index].value = value; + if (need_sort) + me.sortThumbs(); + if (Math.abs(value-lastValue)>0.001) me.trigger('change', me, value, lastValue); }; @@ -379,7 +389,7 @@ define([ var onMouseDown = function (e) { if ( me.disabled ) return; - var index = e.data, + var index = e.data.index, thumb = me.thumbs[index].thumb; me._dragstart = e.pageX*Common.Utils.zoom() - thumb.offset().left - thumb.width()/2; @@ -389,8 +399,8 @@ define([ (index == idx) ? item.thumb.css('z-index', 500) : item.thumb.css('z-index', ''); }); - $(document).on('mouseup', null, index, onMouseUp); - $(document).on('mousemove', null, index, onMouseMove); + $(document).on('mouseup', null, e.data, onMouseUp); + $(document).on('mousemove', null, e.data, onMouseMove); }; var onTrackMouseDown = function (e) { @@ -441,7 +451,7 @@ define([ index: index }); me.setValue(index, me.options.values[index]); - thumb.on('mousedown', null, index, onMouseDown); + thumb.on('mousedown', null, me.thumbs[index], onMouseDown); }); me.setActiveThumb(0, true); @@ -489,6 +499,18 @@ define([ if (disabled !== this.disabled) this.cmpEl.toggleClass('disabled', disabled); this.disabled = disabled; + }, + + sortThumbs: function() { + this.thumbs.sort(function(a, b) { + return (a.position - b.position); + }); + var recalc_indexes = []; + _.each (this.thumbs, function(thumb, index) { + recalc_indexes.push(thumb.index); + thumb.index = index; + }); + return recalc_indexes; } }); }); diff --git a/apps/common/main/lib/component/Window.js b/apps/common/main/lib/component/Window.js index b9750e2ad..37f78a80e 100644 --- a/apps/common/main/lib/component/Window.js +++ b/apps/common/main/lib/component/Window.js @@ -421,7 +421,7 @@ define([ _.extend(options, { cls: 'alert', onprimary: onKeyDown, - tpl: _.template(template, options) + tpl: _.template(template)(options) }); var win = new Common.UI.Window(options), @@ -433,7 +433,8 @@ define([ var footer = window.getChild('.footer'); var header = window.getChild('.header'); var body = window.getChild('.body'); - var icon = window.getChild('.icon'); + var icon = window.getChild('.icon'), + icon_height = (icon.length>0) ? icon.height() : 0; var check = window.getChild('.info-box .dont-show-checkbox'); if (!options.dontshow) body.css('padding-bottom', '10px'); @@ -443,19 +444,19 @@ define([ options.width = options.maxwidth; } if (options.width=='auto') { - text_cnt.height(Math.max(text.height() + ((check.length>0) ? (check.height() + parseInt(check.css('margin-top'))) : 0), icon.height())); + text_cnt.height(Math.max(text.height() + ((check.length>0) ? (check.height() + parseInt(check.css('margin-top'))) : 0), icon_height)); body.height(parseInt(text_cnt.css('height')) + parseInt(footer.css('height'))); window.setSize(text.position().left + text.width() + parseInt(text_cnt.css('padding-right')), parseInt(body.css('height')) + parseInt(header.css('height'))); } else { text.css('white-space', 'normal'); window.setWidth(options.width); - text_cnt.height(Math.max(text.height() + ((check.length>0) ? (check.height() + parseInt(check.css('margin-top'))) : 0), icon.height())); + text_cnt.height(Math.max(text.height() + ((check.length>0) ? (check.height() + parseInt(check.css('margin-top'))) : 0), icon_height)); body.height(parseInt(text_cnt.css('height')) + parseInt(footer.css('height'))); window.setHeight(parseInt(body.css('height')) + parseInt(header.css('height'))); } - if (text.height() < icon.height()-10) - text.css({'vertical-align': 'baseline', 'line-height': icon.height()+'px'}); + if (text.height() < icon_height-10) + text.css({'vertical-align': 'baseline', 'line-height': icon_height+'px'}); } function onBtnClick(event) { @@ -556,7 +557,7 @@ define([ render : function() { var renderto = this.initConfig.renderTo || document.body; $(renderto).append( - _.template(template, this.initConfig) + _.template(template)(this.initConfig) ); this.$window = $('#' + this.initConfig.id); @@ -695,7 +696,7 @@ define([ hide_mask = true; mask.attr('counter', parseInt(mask.attr('counter'))-1); - if (this.$lastmodal.size() > 0) { + if (this.$lastmodal.length > 0) { this.$lastmodal.removeClass('dethrone'); hide_mask = !(this.$lastmodal.hasClass('modal') && this.$lastmodal.is(':visible')); } @@ -736,7 +737,7 @@ define([ hide_mask = true; mask.attr('counter', parseInt(mask.attr('counter'))-1); - if (this.$lastmodal.size() > 0) { + if (this.$lastmodal.length > 0) { this.$lastmodal.removeClass('dethrone'); hide_mask = !(this.$lastmodal.hasClass('modal') && this.$lastmodal.is(':visible')); } diff --git a/apps/common/main/lib/controller/Comments.js b/apps/common/main/lib/controller/Comments.js index 9b68cbd73..d929f68ab 100644 --- a/apps/common/main/lib/controller/Comments.js +++ b/apps/common/main/lib/controller/Comments.js @@ -211,8 +211,8 @@ define([ ascComment.asc_putText(comment.get('comment')); ascComment.asc_putQuoteText(comment.get('quote')); ascComment.asc_putTime(t.utcDateToString(new Date(comment.get('time')))); - ascComment.asc_putUserId(t.currentUserId); - ascComment.asc_putUserName(t.currentUserName); + ascComment.asc_putUserId(comment.get('userid')); + ascComment.asc_putUserName(comment.get('username')); ascComment.asc_putSolved(!comment.get('resolved')); if (!_.isUndefined(ascComment.asc_putDocumentFlag)) { diff --git a/apps/common/main/lib/extend/Bootstrap.js b/apps/common/main/lib/extend/Bootstrap.js index 62ce6b868..ab55b71f9 100755 --- a/apps/common/main/lib/extend/Bootstrap.js +++ b/apps/common/main/lib/extend/Bootstrap.js @@ -81,8 +81,8 @@ function patchDropDownKeyDown(e) { if (!isActive || (isActive && e.keyCode == 27)) { if (e.which == 27) { $items = $('[role=menu] li.dropdown-submenu.over:visible', $parent); - if ($items.size()) { - $items.eq($items.size()-1).removeClass('over'); + if ($items.length) { + $items.eq($items.length-1).removeClass('over'); return false; } else if ($parent.hasClass('dropdown-submenu') && $parent.hasClass('over')) { $parent.removeClass('over'); @@ -110,6 +110,7 @@ function patchDropDownKeyDown(e) { _.delay(function() { var mnu = $('> [role=menu]', li), $subitems = mnu.find('> li:not(.divider):not(.disabled):visible > a'), + $dataviews = mnu.find('> li:not(.divider):not(.disabled):visible .dataview'), focusIdx = 0; if (mnu.find('> .menu-scroll').length>0) { var offset = mnu.scrollTop(); @@ -119,7 +120,7 @@ function patchDropDownKeyDown(e) { } } } - if ($subitems.length>0) + if ($subitems.length>0 && $dataviews.length<1) $subitems.eq(focusIdx).focus(); }, 250); } diff --git a/apps/common/main/lib/util/LanguageInfo.js b/apps/common/main/lib/util/LanguageInfo.js index 25c078385..ba3db2877 100644 --- a/apps/common/main/lib/util/LanguageInfo.js +++ b/apps/common/main/lib/util/LanguageInfo.js @@ -142,6 +142,8 @@ Common.util.LanguageInfo = new(function() { 0x0809 : ["en-GB", "English (United Kingdom)"], 0x0409 : ["en-US", "English (United States)"], 0x3009 : ["en-ZW", "English (Zimbabwe)"], + 0x3c09 : ["en-HK", "English (Hong Kong)"], + 0x3809 : ["en-ID", "English (Indonesia)"], 0x0025 : ["et", "Eesti"], 0x0425 : ["et-EE", "Eesti (Eesti)"], 0x0038 : ["fo", "Føroyskt"], @@ -157,6 +159,15 @@ Common.util.LanguageInfo = new(function() { 0x140C : ["fr-LU", "Français (Luxembourg)"], 0x180C : ["fr-MC", "Français (Principauté de Monaco)"], 0x100C : ["fr-CH", "Français (Suisse)"], + 0x3c0c : ["fr-HT", "French (Haiti)"], + 0x240c : ["fr-CG", "French (Congo)"], + 0x300c : ["fr-CI", "French (Cote d'Ivoire)"], + 0x2c0c : ["fr-CM", "French (Cameroon)"], + 0x380c : ["fr-MA", "French (Morocco)"], + 0x340c : ["fr-ML", "French (Mali)"], + 0x200c : ["fr-RE", "French (Reunion)"], + 0x280c : ["fr-SN", "French (Senegal)"], + 0x1c0c : ["fr-West", "French"], 0x0062 : ["fy", "Frysk"], 0x0462 : ["fy-NL", "Frysk (Nederlân)"], 0x0056 : ["gl", "Galego"], @@ -284,10 +295,12 @@ Common.util.LanguageInfo = new(function() { 0x0C6B : ["quz-PE", "Runasimi (Piruw)"], 0x0018 : ["ro", "Română"], 0x0418 : ["ro-RO", "Română (România)"], + 0x0818 : ["ro-MD", "Română (Moldova)"], 0x0017 : ["rm", "Rumantsch"], 0x0417 : ["rm-CH", "Rumantsch (Svizra)"], 0x0019 : ["ru", "Русский"], 0x0419 : ["ru-RU", "Русский (Россия)"], + 0x0819 : ["ru-MD", "Русский (Молдавия)"], 0x703B : ["smn", "Sämikielâ"], 0x7C3B : ["smj", "Julevusámegiella"], 0x003B : ["se", "Davvisámegiella"], @@ -348,6 +361,7 @@ Common.util.LanguageInfo = new(function() { 0x540A : ["es-US", "Español (Estados Unidos)"], 0x380A : ["es-UY", "Español (Uruguay)"], 0x200A : ["es-VE", "Español (Republica Bolivariana de Venezuela)"], + 0x040a : ["es-ES_tradnl", "Spanish"], 0x001D : ["sv", "Svenska"], 0x081D : ["sv-FI", "Svenska (Finland)"], 0x041D : ["sv-SE", "Svenska (Sverige)"], @@ -398,45 +412,31 @@ Common.util.LanguageInfo = new(function() { 0x0478 : ["ii-CN", "ꆈꌠꁱꂷ (ꍏꉸꏓꂱꇭꉼꇩ)"], 0x006A : ["yo", "Yoruba"], 0x046A : ["yo-NG", "Yoruba (Nigeria)"], - 0x0851 : ["bo-BT", "Tibetan, Bhutan"], - 0x0466 : ["bin-NG", "Bini, Nigeria"], - 0x045c : ["chr-US", "Cherokee, United States"], - 0x3c09 : ["en-HK", "English, Hong Kong"], - 0x3809 : ["en-ID", "English, Indonesia"], - 0x040a : ["es-ES_tradnl", "Spanish"], - 0x3c0c : ["fr-HT", "French, Haiti"], - 0x240c : ["fr-CG", "French, Congo"], - 0x300c : ["fr-CI", "French, Cote d'Ivoire"], - 0x2c0c : ["fr-CM", "French, Cameroon"], - 0x380c : ["fr-MA", "French, Morocco"], - 0x340c : ["fr-ML", "French, Mali"], - 0x200c : ["fr-RE", "French, Reunion"], - 0x280c : ["fr-SN", "French, Senegal"], - 0x1c0c : ["fr-West", "French"], - 0x0467 : ["fuv-NG", "Nigerian Fulfulde, Nigeria"], - 0x0472 : ["gaz-ET", "West Central Oromo, Ethiopia"], - 0x0474 : ["gn-PY", "Guarani, Paraguay"], - 0x0475 : ["haw-US", "Hawaiian, UnitedStates"], - 0x0469 : ["ibb-NG", "Ibibio, Nigeria"], - 0x0471 : ["kr-NG", "Kanuri, Nigeria"], + 0x0851 : ["bo-BT", "Tibetan (Bhutan)"], + 0x0466 : ["bin-NG", "Bini (Nigeria)"], + 0x045c : ["chr-US", "Cherokee (United States)"], + 0x0467 : ["fuv-NG", "Nigerian Fulfulde (Nigeria)"], + 0x0472 : ["gaz-ET", "West Central Oromo (Ethiopia)"], + 0x0474 : ["gn-PY", "Guarani (Paraguay)"], + 0x0475 : ["haw-US", "Hawaiian (United States)"], + 0x0469 : ["ibb-NG", "Ibibio (Nigeria)"], + 0x0471 : ["kr-NG", "Kanuri (Nigeria)"], 0x0458 : ["mni", "Manipuri"], - 0x0455 : ["my-MM", "Burmese, Myanmar"], - 0x0861 : ["ne-IN", "Nepali, India"], + 0x0455 : ["my-MM", "Burmese (Myanmar)"], + 0x0861 : ["ne-IN", "Nepali (India)"], 0x0479 : ["pap-AN", "Papiamento, Netherlands Antilles"], - 0x0846 : ["pa-PK", "Panjabi, Pakistan"], - 0x048d : ["plt-MG", "Plateau Malagasy, Madagascar"], - 0x0818 : ["ro-MO", "Romanian, Macao"], - 0x0819 : ["ru-MO", "Russian, Macao"], - 0x0459 : ["sd-IN", "Sindhi, India"], - 0x0859 : ["sd-PK", "Sindhi, Pakistan"], - 0x0477 : ["so-SO", "Somali, Somalia"], - 0x0430 : ["st-ZA", "Southern Sotho, South Africa"], - 0x0473 : ["ti-ER", "Tigrinya, Eritrea"], - 0x0873 : ["ti-ET", "Tigrinya, Ethiopia"], + 0x0846 : ["pa-PK", "Panjabi (Pakistan)"], + 0x048d : ["plt-MG", "Plateau Malagasy (Madagascar)"], + 0x0459 : ["sd-IN", "Sindhi (India)"], + 0x0859 : ["sd-PK", "Sindhi (Pakistan)"], + 0x0477 : ["so-SO", "Somali (Somalia)"], + 0x0430 : ["st-ZA", "Southern Sotho (South Africa)"], + 0x0473 : ["ti-ER", "Tigrinya (Eritrea)"], + 0x0873 : ["ti-ET", "Tigrinya (Ethiopia)"], 0x045f : ["tmz", "Tamanaku"], - 0x0c5f : ["tmz-MA", "Tamanaku, Morocco"], - 0x0431 : ["ts-ZA", "Tsonga, South Africa"], - 0x0820 : ["ur-IN", "Urdu, India"], + 0x0c5f : ["tmz-MA", "Tamanaku (Morocco)"], + 0x0431 : ["ts-ZA", "Tsonga (South Africa)"], + 0x0820 : ["ur-IN", "Urdu (India)"], 0x0433 : ["ven-ZA", "South Africa"] }; diff --git a/apps/common/main/lib/util/LocalStorage.js b/apps/common/main/lib/util/LocalStorage.js index 1adbb95ff..75660c553 100644 --- a/apps/common/main/lib/util/LocalStorage.js +++ b/apps/common/main/lib/util/LocalStorage.js @@ -63,7 +63,12 @@ define(['gateway'], function () { var _setItem = function(name, value, just) { if (_lsAllowed) { - localStorage.setItem(name, value); + try + { + localStorage.setItem(name, value); + } + catch (error){} + } else { _store[name] = value; diff --git a/apps/common/main/lib/view/AdvancedSettingsWindow.js b/apps/common/main/lib/view/AdvancedSettingsWindow.js index 9b87f1b71..693fbc094 100644 --- a/apps/common/main/lib/view/AdvancedSettingsWindow.js +++ b/apps/common/main/lib/view/AdvancedSettingsWindow.js @@ -71,7 +71,7 @@ define([ '' ].join(''); - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); this.handler = _options.handler; this.toggleGroup = _options.toggleGroup; @@ -102,9 +102,10 @@ define([ btn.on('click', _.bind(me.onCategoryClick, me)); me.btnsCategory.push(btn); }); - var cnt_panel = $window.find('.content-panel'); + var cnt_panel = $window.find('.content-panel'), + menu_panel = $window.find('.menu-panel'); cnt_panel.width(this.contentWidth); - $window.width($window.find('.menu-panel').width() + cnt_panel.outerWidth() + 2); + $window.width(((menu_panel.length>0) ? menu_panel.width() : 0) + cnt_panel.outerWidth() + 2); this.content_panels = $window.find('.settings-panel'); if (this.btnsCategory.length>0) diff --git a/apps/common/main/lib/view/Chat.js b/apps/common/main/lib/view/Chat.js index 308854791..d84448032 100644 --- a/apps/common/main/lib/view/Chat.js +++ b/apps/common/main/lib/view/Chat.js @@ -67,7 +67,7 @@ define([ templateUserList: _.template('
      ' + '<% _.each(users, function(item) { %>' + - '<%= _.template(usertpl, {user: item, scope: scope}) %>' + + '<%= _.template(usertpl)({user: item, scope: scope}) %>' + '<% }); %>' + '
    '), @@ -82,7 +82,7 @@ define([ templateMsgList: _.template('
      ' + '<% _.each(messages, function(item) { %>' + - '<%= _.template(msgtpl, {msg: item, scope: scope}) %>' + + '<%= _.template(msgtpl)({msg: item, scope: scope}) %>' + '<% }); %>' + '
    '), @@ -162,7 +162,7 @@ define([ _onAddUser: function(m, c, opts) { if (this.panelUsers) { - this.panelUsers.find('ul').append(_.template(this.tplUser, {user: m, scope: this})); + this.panelUsers.find('ul').append(_.template(this.tplUser)({user: m, scope: this})); this.panelUsers.scroller.update({minScrollbarLength : 25, alwaysVisibleY: true}); } }, @@ -186,7 +186,7 @@ define([ var content = this.panelMessages.find('ul'); if (content && content.length) { this._prepareMessage(m); - content.append(_.template(this.tplMsg, {msg: m, scope: this})); + content.append(_.template(this.tplMsg)({msg: m, scope: this})); // scroll to end diff --git a/apps/common/main/lib/view/Comments.js b/apps/common/main/lib/view/Comments.js index 7b9389e4a..e238a5eb3 100644 --- a/apps/common/main/lib/view/Comments.js +++ b/apps/common/main/lib/view/Comments.js @@ -98,7 +98,7 @@ define([ this.store = options.store; this.delegate = options.delegate; - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); this.arrow = {margin: 20, width: 12, height: 34}; this.sdkBounds = {width: 0, height: 0, padding: 10, paddingTop: 20}; diff --git a/apps/common/main/lib/view/CopyWarningDialog.js b/apps/common/main/lib/view/CopyWarningDialog.js index b98fc3e78..7d8fff28c 100644 --- a/apps/common/main/lib/view/CopyWarningDialog.js +++ b/apps/common/main/lib/view/CopyWarningDialog.js @@ -83,7 +83,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); Common.UI.Window.prototype.initialize.call(this, this.options); }, diff --git a/apps/common/main/lib/view/DocumentAccessDialog.js b/apps/common/main/lib/view/DocumentAccessDialog.js index e79ce6bf1..30fc76d9c 100644 --- a/apps/common/main/lib/view/DocumentAccessDialog.js +++ b/apps/common/main/lib/view/DocumentAccessDialog.js @@ -48,7 +48,7 @@ define([ var _options = {}; _.extend(_options, { title: this.textTitle, - width: 850, + width: 600, height: 536, header: true }, options); @@ -57,7 +57,7 @@ define([ '
    ' ].join(''); - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); this.settingsurl = options.settingsurl || ''; Common.UI.Window.prototype.initialize.call(this, _options); diff --git a/apps/common/main/lib/view/ExternalDiagramEditor.js b/apps/common/main/lib/view/ExternalDiagramEditor.js index fa55e24b0..5f917b156 100644 --- a/apps/common/main/lib/view/ExternalDiagramEditor.js +++ b/apps/common/main/lib/view/ExternalDiagramEditor.js @@ -66,7 +66,7 @@ define([ '' ].join(''); - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); this.handler = _options.handler; this._chartData = null; diff --git a/apps/common/main/lib/view/ExternalMergeEditor.js b/apps/common/main/lib/view/ExternalMergeEditor.js index dab4427a6..25138e485 100644 --- a/apps/common/main/lib/view/ExternalMergeEditor.js +++ b/apps/common/main/lib/view/ExternalMergeEditor.js @@ -66,7 +66,7 @@ define([ '' ].join(''); - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); this.handler = _options.handler; this._mergeData = null; diff --git a/apps/common/main/lib/view/ImageFromUrlDialog.js b/apps/common/main/lib/view/ImageFromUrlDialog.js index 46888b3dd..992257873 100644 --- a/apps/common/main/lib/view/ImageFromUrlDialog.js +++ b/apps/common/main/lib/view/ImageFromUrlDialog.js @@ -65,7 +65,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); Common.UI.Window.prototype.initialize.call(this, this.options); }, diff --git a/apps/common/main/lib/view/InsertTableDialog.js b/apps/common/main/lib/view/InsertTableDialog.js index c24d11ea3..22655700a 100644 --- a/apps/common/main/lib/view/InsertTableDialog.js +++ b/apps/common/main/lib/view/InsertTableDialog.js @@ -73,7 +73,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); Common.UI.Window.prototype.initialize.call(this, this.options); }, diff --git a/apps/common/main/lib/view/LanguageDialog.js b/apps/common/main/lib/view/LanguageDialog.js new file mode 100644 index 000000000..613f90ede --- /dev/null +++ b/apps/common/main/lib/view/LanguageDialog.js @@ -0,0 +1,143 @@ +/* + * + * (c) Copyright Ascensio System Limited 2010-2017 + * + * 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 + * + */ + +/** + * LanguageDialog.js + * + * Created by Julia Radzhabova on 04/25/2017 + * Copyright (c) 2017 Ascensio System SIA. All rights reserved. + * + */ + +if (Common === undefined) + var Common = {}; + +define([ + 'common/main/lib/component/Window' +], function () { 'use strict'; + + Common.Views.LanguageDialog = Common.UI.Window.extend(_.extend({ + + options: { + header: false, + width: 350, + cls: 'modal-dlg' + }, + + template: '
    ' + + '
    ' + + '' + + '
    ' + + '
    ' + + '
    ' + + '
    ' + + '', + + initialize : function(options) { + _.extend(this.options, options || {}, { + label: this.labelSelect, + btns: {ok: this.btnOk, cancel: this.btnCancel} + }); + this.options.tpl = _.template(this.template)(this.options); + + Common.UI.Window.prototype.initialize.call(this, this.options); + }, + + render: function() { + Common.UI.Window.prototype.render.call(this); + + var $window = this.getChild(); + $window.find('.dlg-btn').on('click', _.bind(this.onBtnClick, this)); + + this.cmbLanguage = new Common.UI.ComboBox({ + el: $window.find('#id-document-language'), + cls: 'input-group-nr', + menuStyle: 'min-width: 318px; max-height: 300px;', + editable: false, + template: _.template([ + '', + '', + '', + '', + '
    ', + '' + ].join('')), + data: this.options.languages + }); + + if (this.cmbLanguage.scroller) this.cmbLanguage.scroller.update({alwaysVisibleY: true}); + this.cmbLanguage.on('selected', _.bind(this.onLangSelect, this)); + this.cmbLanguage.setValue(Common.util.LanguageInfo.getLocalLanguageName(this.options.current)[0]); + this.onLangSelect(this.cmbLanguage, this.cmbLanguage.getSelectedRecord()); + }, + + close: function(suppressevent) { + var $window = this.getChild(); + if (!$window.find('.combobox.open').length) { + Common.UI.Window.prototype.close.call(this, arguments); + } + }, + + onBtnClick: function(event) { + if (this.options.handler) { + this.options.handler.call(this, event.currentTarget.attributes['result'].value, this.cmbLanguage.getValue()); + } + + this.close(); + }, + + onLangSelect: function(cmb, rec, e) { + var icon = cmb.$el.find('.input-lang-icon'), + plang = icon.attr('lang'); + + if (plang) icon.removeClass(plang); + icon.addClass(rec.value).attr('lang',rec.value); + }, + + labelSelect : 'Select document language', + btnCancel : 'Cancel', + btnOk : 'Ok' + }, Common.Views.LanguageDialog || {})) +}); \ No newline at end of file diff --git a/apps/common/main/lib/view/OpenDialog.js b/apps/common/main/lib/view/OpenDialog.js index cf70abcb3..e124c45a8 100644 --- a/apps/common/main/lib/view/OpenDialog.js +++ b/apps/common/main/lib/view/OpenDialog.js @@ -76,7 +76,10 @@ define([ '
    ', '<% if (type == Asc.c_oAscAdvancedOptionsID.CSV) { %>', '', - '
    ', + '
    ', + '
    ', + '
    ', + '
    ', '<% } %>', '<% } %>', '', @@ -93,7 +96,7 @@ define([ this.codepages = options.codepages; this.settings = options.settings; - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); Common.UI.Window.prototype.initialize.call(this, _options); }, @@ -135,9 +138,12 @@ define([ onBtnClick: function (event) { if (this.handler) { - if (this.cmbEncoding) - this.handler.call(this, this.cmbEncoding.getValue(), this.cmbDelimiter ? this.cmbDelimiter.getValue() : null); - else + if (this.cmbEncoding) { + var delimiter = this.cmbDelimiter ? this.cmbDelimiter.getValue() : null, + delimiterChar = (delimiter == -1) ? this.inputDelimiter.getValue() : null; + (delimiter == -1) && (delimiter = null); + this.handler.call(this, this.cmbEncoding.getValue(), delimiter, delimiterChar); + } else this.handler.call(this, this.inputPwd.getValue()); } @@ -337,14 +343,29 @@ define([ {value: 2, displayValue: ';'}, {value: 3, displayValue: ':'}, {value: 1, displayValue: this.txtTab}, - {value: 5, displayValue: this.txtSpace}], + {value: 5, displayValue: this.txtSpace}, + {value: -1, displayValue: this.txtOther}], editable: false }); this.cmbDelimiter.setValue( (this.settings && this.settings.asc_getDelimiter()) ? this.settings.asc_getDelimiter() : 4); + this.cmbDelimiter.on('selected', _.bind(this.onCmbDelimiterSelect, this)); + + this.inputDelimiter = new Common.UI.InputField({ + el : $('#id-delimiter-other'), + style : 'width: 30px;', + maxLength: 1, + value: (this.settings && this.settings.asc_getDelimiterChar()) ? this.settings.asc_getDelimiterChar() : '' + }); + this.inputDelimiter.setVisible(false); + } } }, + onCmbDelimiterSelect: function(combo, record){ + this.inputDelimiter.setVisible(record.value == -1); + }, + okButtonText : "OK", cancelButtonText : "Cancel", txtDelimiter : "Delimiter", @@ -353,7 +374,8 @@ define([ txtTab : "Tab", txtTitle : "Choose %1 options", txtPassword : "Password", - txtTitleProtected : "Protected File" + txtTitleProtected : "Protected File", + txtOther: 'Other' }, Common.Views.OpenDialog || {})); }); \ No newline at end of file diff --git a/apps/common/main/lib/view/Plugins.js b/apps/common/main/lib/view/Plugins.js index 2089c7753..61d02c715 100644 --- a/apps/common/main/lib/view/Plugins.js +++ b/apps/common/main/lib/view/Plugins.js @@ -225,7 +225,7 @@ define([ '<% } %>' ].join(''); - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); this.url = options.url || ''; Common.UI.Window.prototype.initialize.call(this, _options); diff --git a/apps/common/main/lib/view/RenameDialog.js b/apps/common/main/lib/view/RenameDialog.js index 11f9ebffe..95207e9bf 100644 --- a/apps/common/main/lib/view/RenameDialog.js +++ b/apps/common/main/lib/view/RenameDialog.js @@ -66,7 +66,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); Common.UI.Window.prototype.initialize.call(this, this.options); }, diff --git a/apps/common/main/lib/view/ReviewChanges.js b/apps/common/main/lib/view/ReviewChanges.js index 28f6377a0..af8ca28a7 100644 --- a/apps/common/main/lib/view/ReviewChanges.js +++ b/apps/common/main/lib/view/ReviewChanges.js @@ -80,7 +80,7 @@ define([ this.store = options.store; this.delegate = options.delegate; - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); this.arrow = {margin: 20, width: 12, height: 34}; this.sdkBounds = {width: 0, height: 0, padding: 10, paddingTop: 20}; @@ -441,7 +441,7 @@ define([ var el = $(this.el), me = this; el.addClass('review-changes'); - el.html(_.template(this.template, { + el.html(_.template(this.template)({ scope: this })); diff --git a/apps/common/main/lib/view/SearchDialog.js b/apps/common/main/lib/view/SearchDialog.js index a6128c349..f518a9a88 100644 --- a/apps/common/main/lib/view/SearchDialog.js +++ b/apps/common/main/lib/view/SearchDialog.js @@ -105,7 +105,7 @@ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); Common.UI.Window.prototype.initialize.call(this, this.options); }, diff --git a/apps/common/main/resources/img/controls/flags.png b/apps/common/main/resources/img/controls/flags.png new file mode 100644 index 000000000..f446f0639 Binary files /dev/null and b/apps/common/main/resources/img/controls/flags.png differ diff --git a/apps/common/main/resources/img/controls/flags@2x.png b/apps/common/main/resources/img/controls/flags@2x.png new file mode 100644 index 000000000..1c3c34b3c Binary files /dev/null and b/apps/common/main/resources/img/controls/flags@2x.png differ diff --git a/apps/common/main/resources/less/asc-mixins.less b/apps/common/main/resources/less/asc-mixins.less index c259f8f90..20d7427a2 100644 --- a/apps/common/main/resources/less/asc-mixins.less +++ b/apps/common/main/resources/less/asc-mixins.less @@ -178,4 +178,20 @@ background-image: data-uri(%("%s",'@{common-image-path}/hsbcolorpicker/hsb-colorpicker@2x.png')); background-size: @img-colorpicker-width auto; } +} + +@img-flags-width: 48px; +.lang-flag { + width: 16px; + height: 12px; + background-image: data-uri(%("%s",'@{common-image-path}/controls/flags.png')); + background-repeat: no-repeat; + + @media + only screen and (-webkit-min-device-pixel-ratio: 2), + only screen and (min-resolution: 2dppx), + only screen and (min-resolution: 192dpi) { + background-image: data-uri(%("%s",'@{common-image-path}/controls/flags@2x.png')); + background-size: @img-flags-width auto; + } } \ No newline at end of file diff --git a/apps/common/main/resources/less/language-dialog.less b/apps/common/main/resources/less/language-dialog.less new file mode 100644 index 000000000..eb0d4bf78 --- /dev/null +++ b/apps/common/main/resources/less/language-dialog.less @@ -0,0 +1,67 @@ +.combo-langs { + .dropdown-menu { + li .lang-item-icon { + margin-top: 1px; + } + } + + .input-lang-icon { + position: absolute; + left: 5px; + top: 5px; + } + + input { + padding-left: 25px !important; + } +} + +.lang-flag { + background-position: -16px -108px; + + &.ca, &.ca-ES {background-position: 0 0;} + &.cs, &.cs-CZ {background-position: -16px 0;} + &.da, &.da-DK {background-position: -32px 0;} + &.de, &.de-DE {background-position: 0 -12px;} + &.el, &.el-GR {background-position: -16px -12px;} + &.en, &.en-US {background-position: -32px -12px;} + &.fr, &.fr-FR {background-position: 0 -24px;} + &.hu, &.hu-HU {background-position: -16px -24px;} + &.it, &.it-IT {background-position: -32px -24px;} + &.ko, &.ko-KR {background-position: 0 -36px;} + &.nl, &.nl-NL {background-position: -16px -36px;} + &.nb, &.nb-NO {background-position: -32px -36px;} + &.pl, &.pl-PL {background-position: 0 -48px;} + &.pt, &.pt-BR {background-position: -16px -48px;} + &.ro, &.ro-RO {background-position: -32px -48px;} + &.ru, &.ru-RU {background-position: 0 -60px;} + &.sv, &.sv-SE {background-position: -32px -60px;} + &.tr, &.tr-TR {background-position: 0 -72px;} + &.uk, &.uk-UA {background-position: -16px -72px;} + &.lv, &.lv-LV {background-position: -32px -72px;} + &.lt, &.lt-LT {background-position: 0 -84px;} + &.vi, &.vi-VN {background-position: -16px -84px;} + &.de-CH {background-position: -32px -84px;} + &.nn, &.nn-NO {background-position: 0 -96px;} + &.pt-PT {background-position: -16px -96px;} + &.de-AT {background-position: -32px -96px;} + &.es, &.es-ES {background-position: 0 -108px;} + &.en-GB {background-position: -32px -108px;} + &.en-AU {background-position: 0 -120px;} + &.az-Latn-AZ {background-position: -16px -120px;} + &.id, &.id-ID {background-position: -32px -120px;} + + &.bg, &.bg-BG {background-position: 0 -132px;} + &.ca-ES-valencia {background-position: -16px -132px;} + &.en-CA {background-position: -32px -132px;} + &.en-ZA {background-position: 0 -144px;} + &.eu, &.eu-ES {background-position: -16px -144px;} + &.gl, &.gl-ES {background-position: -32px -144px;} + &.hr, &.hr-HR {background-position: 0 -156px;} + &.lb, &.lb-LU {background-position: -16px -156px;} + &.mn, &.mn-MN {background-position: -32px -156px;} + &.sl, &.sl-SI {background-position: 0 -168px;} + &.sr, &.sr-Cyrl-RS, &.sr-Latn-RS {background-position: -16px -168px;} + &.sk, &.sk-SK {background-position: -32px -168px;} + &.kk, &.kk-KZ {background-position: 0 -180px;} +} diff --git a/apps/documenteditor/embed/index.html b/apps/documenteditor/embed/index.html index 9bf9f202b..e38b8579b 100644 --- a/apps/documenteditor/embed/index.html +++ b/apps/documenteditor/embed/index.html @@ -321,9 +321,6 @@ - - - - - - diff --git a/apps/documenteditor/embed/js/ApplicationController.js b/apps/documenteditor/embed/js/ApplicationController.js index 873fe70c8..c938f38a8 100644 --- a/apps/documenteditor/embed/js/ApplicationController.js +++ b/apps/documenteditor/embed/js/ApplicationController.js @@ -402,14 +402,14 @@ var ApplicationController = new(function(){ Common.Analytics.trackEvent('Internal Error', id.toString()); } - function onExternalError(error) { + function onExternalMessage(error) { if (error) { hidePreloader(); - $('#id-error-mask-title').text(error.title); + $('#id-error-mask-title').text('Error'); $('#id-error-mask-text').text(error.msg); $('#id-error-mask').css('display', 'block'); - Common.Analytics.trackEvent('External Error', error.title); + Common.Analytics.trackEvent('External Error'); } } @@ -497,7 +497,7 @@ var ApplicationController = new(function(){ // Initialize api gateway Common.Gateway.on('init', loadConfig); Common.Gateway.on('opendocument', loadDocument); - Common.Gateway.on('showerror', onExternalError); + Common.Gateway.on('showmessage', onExternalMessage); Common.Gateway.ready(); } diff --git a/apps/documenteditor/embed/js/ApplicationView.js b/apps/documenteditor/embed/js/ApplicationView.js index 0fe549952..84177b54c 100644 --- a/apps/documenteditor/embed/js/ApplicationView.js +++ b/apps/documenteditor/embed/js/ApplicationView.js @@ -41,10 +41,10 @@ var ApplicationView = new(function(){ $btnTools.addClass('dropdown-toggle').attr('data-toggle', 'dropdown').attr('aria-expanded', 'true'); $btnTools.parent().append( ''); } diff --git a/apps/documenteditor/main/app.js b/apps/documenteditor/main/app.js index 5c2a4049d..3cb20c44f 100644 --- a/apps/documenteditor/main/app.js +++ b/apps/documenteditor/main/app.js @@ -56,7 +56,6 @@ require.config({ sockjs : '../vendor/sockjs/sockjs.min', jszip : '../vendor/jszip/jszip.min', jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', allfonts : '../../sdkjs/common/AllFonts', sdk : '../../sdkjs/word/sdk-all-min', api : 'api/documents/api', @@ -112,8 +111,7 @@ require.config({ 'xregexp', 'sockjs', 'jszip', - 'jsziputils', - 'jsrsasign' + 'jsziputils' ] }, gateway: { diff --git a/apps/documenteditor/main/app/controller/LeftMenu.js b/apps/documenteditor/main/app/controller/LeftMenu.js index 33cfebf1f..4c66f570d 100644 --- a/apps/documenteditor/main/app/controller/LeftMenu.js +++ b/apps/documenteditor/main/app/controller/LeftMenu.js @@ -302,7 +302,8 @@ define([ } value = Common.localStorage.getItem("de-settings-livecomment"); - (!(value!==null && parseInt(value) == 0)) ? this.api.asc_showComments() : this.api.asc_hideComments(); + var resolved = Common.localStorage.getItem("de-settings-resolvedcomment"); + (!(value!==null && parseInt(value) == 0)) ? this.api.asc_showComments(!(resolved!==null && parseInt(resolved) == 0)) : this.api.asc_hideComments(); /** coauthoring end **/ value = Common.localStorage.getItem("de-settings-fontrender"); @@ -498,9 +499,12 @@ define([ }, commentsShowHide: function(mode) { - var value = Common.localStorage.getItem("de-settings-livecomment"); - if (value !== null && 0 === parseInt(value)) { - (mode === 'show') ? this.api.asc_showComments() : this.api.asc_hideComments(); + var value = Common.localStorage.getItem("de-settings-livecomment"), + resolved = Common.localStorage.getItem("de-settings-resolvedcomment"); + value = (value!==null && parseInt(value) == 0); + resolved = (resolved!==null && parseInt(resolved) == 0); + if (value || resolved) { + (mode === 'show') ? this.api.asc_showComments(true) : ((!value) ? this.api.asc_showComments(!resolved) : this.api.asc_hideComments()); } if (mode === 'show') { diff --git a/apps/documenteditor/main/app/controller/Main.js b/apps/documenteditor/main/app/controller/Main.js index e259e976a..5b95fbcaa 100644 --- a/apps/documenteditor/main/app/controller/Main.js +++ b/apps/documenteditor/main/app/controller/Main.js @@ -105,7 +105,7 @@ define([ }); this._state = {isDisconnected: false, usersCount: 1, fastCoauth: true, lostEditingRights: false, licenseWarning: false}; - + this.languages = null; // Initialize viewport if (!Common.Utils.isBrowserSupported()){ @@ -141,6 +141,8 @@ define([ this.api.asc_registerCallback('asc_onDocumentName', _.bind(this.onDocumentName, this)); this.api.asc_registerCallback('asc_onPrintUrl', _.bind(this.onPrintUrl, this)); this.api.asc_registerCallback('asc_onMeta', _.bind(this.onMeta, this)); + this.api.asc_registerCallback('asc_onSpellCheckInit', _.bind(this.loadLanguages, this)); + Common.NotificationCenter.on('api:disconnect', _.bind(this.onCoAuthoringDisconnect, this)); Common.NotificationCenter.on('goback', _.bind(this.goBack, this)); @@ -202,13 +204,13 @@ define([ me.api.asc_enableKeyEvents(false); }, 'modal:close': function(dlg) { - if (dlg && dlg.$lastmodal && dlg.$lastmodal.size() < 1) { + if (dlg && dlg.$lastmodal && dlg.$lastmodal.length < 1) { me.isModalShowed = false; me.api.asc_enableKeyEvents(true); } }, 'modal:hide': function(dlg) { - if (dlg && dlg.$lastmodal && dlg.$lastmodal.size() < 1) { + if (dlg && dlg.$lastmodal && dlg.$lastmodal.length < 1) { me.isModalShowed = false; me.api.asc_enableKeyEvents(true); } @@ -231,6 +233,15 @@ define([ }); this.initNames(); //for shapes + + Common.util.Shortcuts.delegateShortcuts({ + shortcuts: { + 'command+s,ctrl+s': _.bind(function (e) { + e.preventDefault(); + e.stopPropagation(); + }, this) + } + }); } }, @@ -734,7 +745,8 @@ define([ /** coauthoring begin **/ value = Common.localStorage.getItem("de-settings-livecomment"); this.isLiveCommenting = !(value!==null && parseInt(value) == 0); - this.isLiveCommenting ? this.api.asc_showComments() : this.api.asc_hideComments(); + var resolved = Common.localStorage.getItem("de-settings-resolvedcomment"); + this.isLiveCommenting ? this.api.asc_showComments(!(resolved!==null && parseInt(resolved) == 0)) : this.api.asc_hideComments(); /** coauthoring end **/ value = Common.localStorage.getItem("de-settings-zoom"); @@ -859,7 +871,7 @@ define([ toolbarController.createDelayedElements(); documentHolderController.getView('DocumentHolder').createDelayedElements(); - me.loadLanguages(); + me.setLanguages(); var shapes = me.api.asc_getPropertyEditorShapes(); if (shapes) @@ -878,9 +890,11 @@ define([ Common.NotificationCenter.trigger('document:ready', 'main'); } }, 50); - } else if (me.appOptions.canBrandingExt) - Common.NotificationCenter.trigger('document:ready', 'main'); - + } else { + documentHolderController.getView('DocumentHolder').createDelayedElementsViewer(); + if (me.appOptions.canBrandingExt) + Common.NotificationCenter.trigger('document:ready', 'main'); + } if (this.appOptions.canAnalytics && false) Common.component.Analytics.initialize('UA-12442749-13', 'Document Editor'); @@ -1131,7 +1145,7 @@ define([ msg.msg = (msg.msg).toString(); this.showTips([msg.msg.charAt(0).toUpperCase() + msg.msg.substring(1)]); - Common.component.Analytics.trackEvent('External Error', msg.title); + Common.component.Analytics.trackEvent('External Error'); } }, @@ -1646,15 +1660,15 @@ define([ } }, - loadLanguages: function() { - var apiLangs = this.api.asc_getSpellCheckLanguages(), - langs = [], info; + loadLanguages: function(apiLangs) { + var langs = [], info; _.each(apiLangs, function(lang, index, list){ - info = Common.util.LanguageInfo.getLocalLanguageName(lang.asc_getId()); + lang = parseInt(lang); + info = Common.util.LanguageInfo.getLocalLanguageName(lang); langs.push({ title: info[1], tip: info[0], - code: lang.asc_getId() + code: lang }); }, this); @@ -1664,8 +1678,15 @@ define([ return 0; }); - this.getApplication().getController('DocumentHolder').getView('DocumentHolder').setLanguages(langs); - this.getApplication().getController('Statusbar').setLanguages(langs); + this.languages = langs; + window.styles_loaded && this.setLanguages(); + }, + + setLanguages: function() { + if (this.languages && this.languages.length>0) { + this.getApplication().getController('DocumentHolder').getView('DocumentHolder').setLanguages(this.languages); + this.getApplication().getController('Statusbar').setLanguages(this.languages); + } }, onInsertTable: function() { diff --git a/apps/documenteditor/main/app/controller/Statusbar.js b/apps/documenteditor/main/app/controller/Statusbar.js index b46f51cde..e65a4432c 100644 --- a/apps/documenteditor/main/app/controller/Statusbar.js +++ b/apps/documenteditor/main/app/controller/Statusbar.js @@ -44,7 +44,8 @@ define([ 'core', 'documenteditor/main/app/view/Statusbar', 'common/main/lib/util/LanguageInfo', - 'common/main/lib/view/ReviewChanges' + 'common/main/lib/view/ReviewChanges', + 'common/main/lib/view/LanguageDialog' ], function () { 'use strict'; @@ -141,9 +142,6 @@ define([ }); }, - /* - * */ - setLanguages: function(langs) { this.langs = langs; this.statusbar.reloadLanguages(langs); @@ -243,7 +241,7 @@ define([ }); var me = this; - (new DE.Views.Statusbar.LanguageDialog({ + (new Common.Views.LanguageDialog({ languages: langs, current: me.api.asc_getDefaultLanguage(), handler: function(result, tip) { diff --git a/apps/documenteditor/main/app/controller/Toolbar.js b/apps/documenteditor/main/app/controller/Toolbar.js index 255e609d5..ca2da17ad 100644 --- a/apps/documenteditor/main/app/controller/Toolbar.js +++ b/apps/documenteditor/main/app/controller/Toolbar.js @@ -733,7 +733,7 @@ define([ var styleRec = listStyle.menuPicker.store.findWhere({ title: name }); - this._state.prstyle = (listStyle.menuPicker.store.length>0) ? name : undefined; + this._state.prstyle = (listStyle.menuPicker.store.length>0 || window.styles_loaded) ? name : undefined; listStyle.menuPicker.selectRecord(styleRec); listStyle.resumeEvents(); @@ -1892,7 +1892,7 @@ define([ me._state.prstyle = title; style.put_Name(title); characterStyle.put_Name(title + '_character'); - style.put_Next(nextStyle.asc_getName()); + style.put_Next((nextStyle) ? nextStyle.asc_getName() : null); me.api.asc_AddNewStyle(style); } Common.NotificationCenter.trigger('edit:complete', me.toolbar); @@ -2516,7 +2516,7 @@ define([ store: this.getApplication().getCollection('Common.Collections.TextArt'), parentMenu: this.toolbar.mnuInsertTextArt.menu, showLast: false, - itemTemplate: _.template('
    ') + itemTemplate: _.template('
    ') }); this.toolbar.mnuTextArtPicker.on('item:click', function(picker, item, record, e) { @@ -2630,7 +2630,8 @@ define([ if (self._state.prstyle) styleRec = listStyles.menuPicker.store.findWhere({title: self._state.prstyle}); listStyles.fillComboView((styleRec) ? styleRec : listStyles.menuPicker.store.at(0), true); Common.NotificationCenter.trigger('edit:complete', this); - } + } else if (listStyles.rendered) + listStyles.clearComboView(); window.styles_loaded = true; }, diff --git a/apps/documenteditor/main/app/template/StatusBar.template b/apps/documenteditor/main/app/template/StatusBar.template index d46ad1658..3e742c47c 100644 --- a/apps/documenteditor/main/app/template/StatusBar.template +++ b/apps/documenteditor/main/app/template/StatusBar.template @@ -29,7 +29,7 @@
    '); + me.cmpEl.append(pasteContainer); + + me.btnSpecialPaste = new Common.UI.Button({ + cls : 'btn-toolbar', + iconCls : 'btn-paste', + menu : new Common.UI.Menu({items: []}) + }); + me.btnSpecialPaste.render($('#id-document-holder-btn-special-paste')) ; + } + + if (pasteItems.length>0) { + var menu = me.btnSpecialPaste.menu; + for (var i = 0; i < menu.items.length; i++) { + menu.removeItem(menu.items[i]); + i--; + } + + var group_prev = -1; + _.each(pasteItems, function(menuItem, index) { + var mnu = new Common.UI.MenuItem({ + caption: me._arrSpecialPaste[menuItem], + value: menuItem, + checkable: true, + toggleGroup : 'specialPasteGroup' + }).on('click', function(item, e) { + me.api.asc_SpecialPaste(item.value); + setTimeout(function(){menu.hide();}, 100); + }); + menu.addItem(mnu); + }); + (menu.items.length>0) && menu.items[0].setChecked(true, true); + } + if (coord.asc_getX()<0 || coord.asc_getY()<0) { + if (pasteContainer.is(':visible')) pasteContainer.hide(); + } else { + var showPoint = [coord.asc_getX() + coord.asc_getWidth() + 3, coord.asc_getY() + coord.asc_getHeight() + 3]; + pasteContainer.css({left: showPoint[0], top : showPoint[1]}); + pasteContainer.show(); + } + }; + + var onHideSpecialPasteOptions = function() { + var pasteContainer = me.cmpEl.find('#special-paste-container'); + if (pasteContainer.is(':visible')) + pasteContainer.hide(); + }; + var onDialogAddHyperlink = function() { var win, props, text; if (me.api && me.mode.isEdit){ @@ -1438,6 +1521,9 @@ define([ this.api.asc_registerCallback('asc_onShowForeignCursorLabel', _.bind(onShowForeignCursorLabel, this)); this.api.asc_registerCallback('asc_onHideForeignCursorLabel', _.bind(onHideForeignCursorLabel, this)); this.api.asc_registerCallback('asc_onFocusObject', _.bind(onFocusObject, this)); + this.api.asc_registerCallback('asc_onShowSpecialPasteOptions', _.bind(onShowSpecialPasteOptions, this)); + this.api.asc_registerCallback('asc_onHideSpecialPasteOptions', _.bind(onHideSpecialPasteOptions, this)); + } return this; @@ -1707,6 +1793,58 @@ define([ me.fireEvent('editcomplete', me); }, + createDelayedElementsViewer: function() { + var me = this; + + var menuViewCopy = new Common.UI.MenuItem({ + caption: me.textCopy, + value: 'copy' + }).on('click', _.bind(me.onCutCopyPaste, me)); + + var menuViewUndo = new Common.UI.MenuItem({ + caption: me.textUndo + }).on('click', function () { + me.api.Undo(); + }); + + var menuViewCopySeparator = new Common.UI.MenuItem({ + caption: '--' + }); + + var menuViewAddComment = new Common.UI.MenuItem({ + caption: me.addCommentText + }).on('click', _.bind(me.addComment, me)); + + this.viewModeMenu = new Common.UI.Menu({ + initMenu: function (value) { + var isInChart = (value.imgProps && value.imgProps.value && !_.isNull(value.imgProps.value.get_ChartProperties())); + + menuViewUndo.setVisible(me.mode.isEdit); + menuViewCopySeparator.setVisible(!isInChart && me.api.can_AddQuotedComment() !== false && me.mode.canCoAuthoring && me.mode.canComments && me.mode.isEdit); + menuViewAddComment.setVisible(!isInChart && me.api.can_AddQuotedComment() !== false && me.mode.canCoAuthoring && me.mode.canComments && me.mode.isEdit); + menuViewAddComment.setDisabled(value.paraProps && value.paraProps.locked === true); + + var cancopy = me.api && me.api.can_CopyCut(); + menuViewCopy.setDisabled(!cancopy); + }, + items: [ + menuViewCopy, + menuViewUndo, + menuViewCopySeparator, + menuViewAddComment + ] + }).on('hide:after', function (menu, e, isFromInputControl) { + if (me.suppressEditComplete) { + me.suppressEditComplete = false; + return; + } + + if (!isFromInputControl) me.fireEvent('editcomplete', me); + me.currentMenu = null; + }); + + }, + createDelayedElements: function() { var me = this; @@ -2209,21 +2347,21 @@ define([ menuAlign: 'tl-tr', items : [ me.menuTableCellTop = new Common.UI.MenuItem({ - caption : me.topCellText, + caption : me.textShapeAlignTop, toggleGroup : 'popuptablecellalign', checkable : true, checked : false, valign : Asc.c_oAscVertAlignJc.Top }).on('click', _.bind(tableCellsVAlign, me)), me.menuTableCellCenter = new Common.UI.MenuItem({ - caption : me.centerCellText, + caption : me.textShapeAlignMiddle, toggleGroup : 'popuptablecellalign', checkable : true, checked : false, valign : Asc.c_oAscVertAlignJc.Center }).on('click', _.bind(tableCellsVAlign, me)), me.menuTableCellBottom = new Common.UI.MenuItem({ - caption : me.bottomCellText, + caption : me.textShapeAlignBottom, toggleGroup : 'popuptablecellalign', checkable : true, checked : false, @@ -2725,21 +2863,21 @@ define([ menuAlign: 'tl-tr', items : [ me.menuParagraphTop = new Common.UI.MenuItem({ - caption : me.topCellText, + caption : me.textShapeAlignTop, checkable : true, checked : false, toggleGroup : 'popupparagraphvalign', valign : Asc.c_oAscVAlign.Top }).on('click', _.bind(paragraphVAlign, me)), me.menuParagraphCenter = new Common.UI.MenuItem({ - caption : me.centerCellText, + caption : me.textShapeAlignMiddle, checkable : true, checked : false, toggleGroup : 'popupparagraphvalign', valign : Asc.c_oAscVAlign.Center }).on('click', _.bind(paragraphVAlign, me)), me.menuParagraphBottom = new Common.UI.MenuItem({ - caption : me.bottomCellText, + caption : me.textShapeAlignBottom, checkable : true, checked : false, toggleGroup : 'popupparagraphvalign', @@ -3119,7 +3257,9 @@ define([ setLanguages: function(langs){ var me = this; - if (langs && langs.length > 0) { + if (langs && langs.length > 0 && me.langParaMenu && me.langTableMenu) { + me.langParaMenu.menu.removeAll(); + me.langTableMenu.menu.removeAll(); _.each(langs, function(lang, index){ me.langParaMenu.menu.addItem(new Common.UI.MenuItem({ caption : lang.title, @@ -3217,9 +3357,6 @@ define([ /** coauthoring begin **/ addCommentText : 'Add Comment', /** coauthoring end **/ - topCellText: 'Align Top', - centerCellText: 'Align Center', - bottomCellText: 'Align Bottom', cellAlignText: 'Cell Vertical Alignment', txtInline: 'Inline', txtSquare: 'Square', @@ -3265,8 +3402,8 @@ define([ textCut: 'Cut', directionText: 'Text Direction', directHText: 'Horizontal', - direct90Text: 'Rotate at 90°', - direct270Text: 'Rotate at 270°', + direct90Text: 'Rotate Text Down', + direct270Text: 'Rotate Text Up°', txtRemoveAccentChar: 'Remove accent character', txtBorderProps: 'Borders property', txtHideTop: 'Hide top border', @@ -3336,7 +3473,9 @@ define([ txtAlignToChar: 'Align to character', txtDeleteRadical: 'Delete radical', txtDeleteChars: 'Delete enclosing characters', - txtDeleteCharsAndSeparators: 'Delete enclosing characters and separators' + txtDeleteCharsAndSeparators: 'Delete enclosing characters and separators', + txtKeepTextOnly: 'Keep text only', + textUndo: 'Undo' }, DE.Views.DocumentHolder || {})); }); \ No newline at end of file diff --git a/apps/documenteditor/main/app/view/FileMenuPanels.js b/apps/documenteditor/main/app/view/FileMenuPanels.js index 5ebd241ae..be14a186f 100644 --- a/apps/documenteditor/main/app/view/FileMenuPanels.js +++ b/apps/documenteditor/main/app/view/FileMenuPanels.js @@ -115,6 +115,10 @@ define([ '', '
    ', '','', + '', + '', + '
    ', + '','', /** coauthoring end **/ '', '', @@ -185,6 +189,13 @@ define([ this.chLiveComment = new Common.UI.CheckBox({ el: $('#fms-chb-live-comment'), labelText: this.strLiveComment + }).on('change', _.bind(function(field, newValue, oldValue, eOpts){ + this.chResolvedComment.setDisabled(field.getValue()!=='checked'); + }, this)); + + this.chResolvedComment = new Common.UI.CheckBox({ + el: $('#fms-chb-resolved-comment'), + labelText: this.strResolvedComment }); /** coauthoring end **/ @@ -342,6 +353,9 @@ define([ value = Common.localStorage.getItem("de-settings-livecomment"); this.chLiveComment.setValue(!(value!==null && parseInt(value) == 0)); + value = Common.localStorage.getItem("de-settings-resolvedcomment"); + this.chResolvedComment.setValue(!(value!==null && parseInt(value) == 0)); + value = Common.localStorage.getItem("de-settings-coauthmode"); if (value===null && Common.localStorage.getItem("de-settings-autosave")===null && this.mode.customization && this.mode.customization.autosave===false) @@ -391,6 +405,7 @@ define([ Common.localStorage.setItem("de-settings-zoom", this.cmbZoom.getValue()); /** coauthoring begin **/ Common.localStorage.setItem("de-settings-livecomment", this.chLiveComment.isChecked() ? 1 : 0); + Common.localStorage.setItem("de-settings-resolvedcomment", this.chResolvedComment.isChecked() ? 1 : 0); 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()); @@ -463,7 +478,8 @@ define([ txtFitPage: 'Fit to Page', txtFitWidth: 'Fit to Width', textForceSave: 'Save to Server', - strForcesave: 'Always save to server (otherwise save to server on document close)' + strForcesave: 'Always save to server (otherwise save to server on document close)', + strResolvedComment: 'Turn on display of the resolved comments' }, DE.Views.FileMenuPanels.Settings || {})); DE.Views.FileMenuPanels.RecentFiles = Common.UI.BaseView.extend({ diff --git a/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js b/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js index 335bd1de5..eda22b39d 100644 --- a/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js +++ b/apps/documenteditor/main/app/view/HyperlinkSettingsDialog.js @@ -81,7 +81,7 @@ define([ '
    ' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); this.api = this.options.api; Common.UI.Window.prototype.initialize.call(this, this.options); diff --git a/apps/documenteditor/main/app/view/MailMergeRecepients.js b/apps/documenteditor/main/app/view/MailMergeRecepients.js index 1d6421a77..9135a9886 100644 --- a/apps/documenteditor/main/app/view/MailMergeRecepients.js +++ b/apps/documenteditor/main/app/view/MailMergeRecepients.js @@ -54,7 +54,7 @@ define([ '
    ' ].join(''); - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); this.fileChoiceUrl = options.fileChoiceUrl || ''; Common.UI.Window.prototype.initialize.call(this, _options); diff --git a/apps/documenteditor/main/app/view/MailMergeSaveDlg.js b/apps/documenteditor/main/app/view/MailMergeSaveDlg.js index 7158ac534..3a76f35e6 100644 --- a/apps/documenteditor/main/app/view/MailMergeSaveDlg.js +++ b/apps/documenteditor/main/app/view/MailMergeSaveDlg.js @@ -55,7 +55,7 @@ define([ '
    ' ].join(''); - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); this.mergeFolderUrl = options.mergeFolderUrl || ''; this.mergedFileUrl = options.mergedFileUrl || ''; diff --git a/apps/documenteditor/main/app/view/PageMarginsDialog.js b/apps/documenteditor/main/app/view/PageMarginsDialog.js index d9fb32f4e..fcb925a01 100644 --- a/apps/documenteditor/main/app/view/PageMarginsDialog.js +++ b/apps/documenteditor/main/app/view/PageMarginsDialog.js @@ -89,7 +89,7 @@ define([ '
    ' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); this.spinners = []; this._noApply = false; diff --git a/apps/documenteditor/main/app/view/PageSizeDialog.js b/apps/documenteditor/main/app/view/PageSizeDialog.js index 3537e1e3c..c3f5ac6da 100644 --- a/apps/documenteditor/main/app/view/PageSizeDialog.js +++ b/apps/documenteditor/main/app/view/PageSizeDialog.js @@ -79,7 +79,7 @@ define([ '
    ' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); this.spinners = []; this._noApply = false; diff --git a/apps/documenteditor/main/app/view/ShapeSettings.js b/apps/documenteditor/main/app/view/ShapeSettings.js index 2d131a7ad..d33dec7d0 100644 --- a/apps/documenteditor/main/app/view/ShapeSettings.js +++ b/apps/documenteditor/main/app/view/ShapeSettings.js @@ -1341,6 +1341,18 @@ define([ this.sldrGradient.on('thumbdblclick', function(cmp){ me.btnGradColor.cmpEl.find('button').dropdown('toggle'); }); + this.sldrGradient.on('sortthumbs', function(cmp, recalc_indexes){ + var colors = [], + currentIdx; + _.each (recalc_indexes, function(recalc_index, index) { + colors.push(me.GradColor.colors[recalc_index]); + if (me.GradColor.currentIdx == recalc_index) + currentIdx = index; + }); + me.OriginalFillType = null; + me.GradColor.colors = colors; + me.GradColor.currentIdx = currentIdx; + }); this.fillControls.push(this.sldrGradient); this.cmbBorderSize = new Common.UI.ComboBorderSizeEditable({ diff --git a/apps/documenteditor/main/app/view/Statusbar.js b/apps/documenteditor/main/app/view/Statusbar.js index 4017ad6a0..66ca25424 100644 --- a/apps/documenteditor/main/app/view/Statusbar.js +++ b/apps/documenteditor/main/app/view/Statusbar.js @@ -79,9 +79,6 @@ define([ this.fireEvent('langchanged', [this, item.value.code, item.caption]); } - if ( DE.Views.Statusbar ) - var LanguageDialog = DE.Views.Statusbar.LanguageDialog || {}; - DE.Views.Statusbar = Backbone.View.extend(_.extend({ el: '#statusbar', template: _.template(template), @@ -96,7 +93,7 @@ define([ templateUserList: _.template(''), @@ -194,7 +191,7 @@ define([ maxHeight: 300, itemTemplate: _.template([ '', - '', + '', '<%= caption %>', '' ].join('')), @@ -436,7 +433,7 @@ define([ _onAddUser: function(m, c, opts) { if (this.panelUsersList) { - this.panelUsersList.find('ul').append(_.template(this.tplUser, {user: m, scope: this})); + this.panelUsersList.find('ul').append(_.template(this.tplUser)({user: m, scope: this})); this.panelUsersList.scroller.update({minScrollbarLength : 40, alwaysVisibleY: true}); } }, @@ -466,6 +463,7 @@ define([ /** coauthoring end **/ reloadLanguages: function(array) { + this.langMenu.removeAll(); _.each(array, function(item) { this.langMenu.addItem({ iconCls : item['tip'], @@ -485,7 +483,7 @@ define([ }, setLanguage: function(info) { - if (this.langMenu.prevTip != info.tip) { + if (this.langMenu.prevTip != info.tip && info.code !== undefined) { var $parent = $(this.langMenu.el.parentNode, this.$el); $parent.find('.icon-lang-flag') .removeClass(this.langMenu.prevTip) @@ -541,99 +539,5 @@ define([ tipViewUsers : 'View users and manage document access rights', txAccessRights : 'Change access rights' }, DE.Views.Statusbar || {})); - - DE.Views.Statusbar.LanguageDialog = Common.UI.Window.extend(_.extend({ - options: { - header: false, - width: 350, - cls: 'modal-dlg' - }, - - template: '
    ' + - '
    ' + - '' + - '
    ' + - '
    ' + - '
    ' + - '
    ' + - '', - - initialize : function(options) { - _.extend(this.options, options || {}, { - label: this.labelSelect, - btns: {ok: this.btnOk, cancel: this.btnCancel} - }); - this.options.tpl = _.template(this.template, this.options); - - Common.UI.Window.prototype.initialize.call(this, this.options); - }, - - render: function() { - Common.UI.Window.prototype.render.call(this); - - var $window = this.getChild(); - $window.find('.dlg-btn').on('click', _.bind(this.onBtnClick, this)); - - this.cmbLanguage = new Common.UI.ComboBox({ - el: $window.find('#id-document-language'), - cls: 'input-group-nr', - menuStyle: 'min-width: 318px; max-height: 300px;', - editable: false, - template: _.template([ - '', - '', - '', - '', - '', - '' - ].join('')), - data: this.options.languages - }); - - if (this.cmbLanguage.scroller) this.cmbLanguage.scroller.update({alwaysVisibleY: true}); - this.cmbLanguage.on('selected', _.bind(this.onLangSelect, this)); - this.cmbLanguage.setValue(Common.util.LanguageInfo.getLocalLanguageName(this.options.current)[0]); - this.onLangSelect(this.cmbLanguage, this.cmbLanguage.getSelectedRecord()); - }, - - close: function(suppressevent) { - var $window = this.getChild(); - if (!$window.find('.combobox.open').length) { - Common.UI.Window.prototype.close.call(this, arguments); - } - }, - - onBtnClick: function(event) { - if (this.options.handler) { - this.options.handler.call(this, event.currentTarget.attributes['result'].value, this.cmbLanguage.getValue()); - } - - this.close(); - }, - - onLangSelect: function(cmb, rec, e) { - var icon = cmb.$el.find('.input-lang-icon'), - plang = icon.attr('lang'); - - if (plang) icon.removeClass(plang); - icon.addClass(rec.value).attr('lang',rec.value); - }, - - labelSelect : 'Select document language', - btnCancel : 'Cancel', - btnOk : 'Ok' - }, LanguageDialog||{})); } ); \ No newline at end of file diff --git a/apps/documenteditor/main/app/view/StyleTitleDialog.js b/apps/documenteditor/main/app/view/StyleTitleDialog.js index 14e605088..8fd238dd1 100644 --- a/apps/documenteditor/main/app/view/StyleTitleDialog.js +++ b/apps/documenteditor/main/app/view/StyleTitleDialog.js @@ -70,7 +70,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); Common.UI.Window.prototype.initialize.call(this, this.options); }, @@ -107,10 +107,11 @@ define([ menuStyle : 'width: 100%; max-height: 290px;', editable : false, cls : 'input-group-nr', - data : this.options.formats + data : this.options.formats, + disabled : (this.options.formats.length==0) }); - - this.cmbNextStyle.setValue(this.options.formats[0].value); + if (this.options.formats.length>0) + this.cmbNextStyle.setValue(this.options.formats[0].value); }, show: function() { @@ -129,7 +130,7 @@ define([ getNextStyle: function () { var me = this; - return me.cmbNextStyle.getValue(); + return (me.options.formats.length>0) ? me.cmbNextStyle.getValue() : null; }, onBtnClick: function(event) { diff --git a/apps/documenteditor/main/app/view/TextArtSettings.js b/apps/documenteditor/main/app/view/TextArtSettings.js index 4a8259e87..479909abb 100644 --- a/apps/documenteditor/main/app/view/TextArtSettings.js +++ b/apps/documenteditor/main/app/view/TextArtSettings.js @@ -916,6 +916,18 @@ define([ this.sldrGradient.on('thumbdblclick', function(cmp){ me.btnGradColor.cmpEl.find('button').dropdown('toggle'); }); + this.sldrGradient.on('sortthumbs', function(cmp, recalc_indexes){ + var colors = [], + currentIdx; + _.each (recalc_indexes, function(recalc_index, index) { + colors.push(me.GradColor.colors[recalc_index]); + if (me.GradColor.currentIdx == recalc_index) + currentIdx = index; + }); + me.OriginalFillType = null; + me.GradColor.colors = colors; + me.GradColor.currentIdx = currentIdx; + }); this.lockedControls.push(this.sldrGradient); this.cmbBorderSize = new Common.UI.ComboBorderSizeEditable({ diff --git a/apps/documenteditor/main/app/view/Toolbar.js b/apps/documenteditor/main/app/view/Toolbar.js index fa20b37f2..15ace2bb8 100644 --- a/apps/documenteditor/main/app/view/Toolbar.js +++ b/apps/documenteditor/main/app/view/Toolbar.js @@ -1220,15 +1220,16 @@ define([ this.btnNumbers.setMenu( new Common.UI.Menu({ items: [ - { template: _.template('') } + { template: _.template('') } ] }) ); this.btnMultilevels.setMenu( new Common.UI.Menu({ + style: 'min-width: 90px', items: [ - { template: _.template('') } + { template: _.template('') } ] }) ); @@ -1353,19 +1354,19 @@ define([ this.mnuNumbersPicker = new Common.UI.DataView({ el: $('#id-toolbar-menu-numbering'), parentMenu: this.btnNumbers.menu, - restoreHeight: 164, + restoreHeight: 92, allowScrollbar: false, store: new Common.UI.DataViewStore([ {offsety: 0, data: {type: 1, subtype: -1}}, - {offsety: 518, data: {type: 1, subtype: 4}}, - {offsety: 592, data: {type: 1, subtype: 5}}, - {offsety: 666, data: {type: 1, subtype: 6}}, - {offsety: 296, data: {type: 1, subtype: 1}}, - {offsety: 370, data: {type: 1, subtype: 2}}, - {offsety: 444, data: {type: 1, subtype: 3}}, - {offsety: 740, data: {type: 1, subtype: 7}} + {offsety: 570, data: {type: 1, subtype: 4}}, + {offsety: 532, data: {type: 1, subtype: 5}}, + {offsety: 608, data: {type: 1, subtype: 6}}, + {offsety: 418, data: {type: 1, subtype: 1}}, + {offsety: 456, data: {type: 1, subtype: 2}}, + {offsety: 494, data: {type: 1, subtype: 3}}, + {offsety: 646, data: {type: 1, subtype: 7}} ]), - itemTemplate: _.template('
    ') + itemTemplate: _.template('
    ') }); _conf && this.mnuNumbersPicker.selectByIndex(_conf.index, true); @@ -1373,15 +1374,15 @@ define([ this.mnuMultilevelPicker = new Common.UI.DataView({ el: $('#id-toolbar-menu-multilevels'), parentMenu: this.btnMultilevels.menu, - restoreHeight: 164, + restoreHeight: 92, allowScrollbar: false, store: new Common.UI.DataViewStore([ { offsety:0, data:{type:2, subtype:-1} }, - { offsety:74, data:{type:2, subtype:1} }, - { offsety:148, data:{type:2, subtype:2} }, - { offsety:222, data:{type:2, subtype:3} } - ]), - itemTemplate: _.template('
    ') + {offsety: 304, data: {type: 2, subtype: 1}}, + {offsety: 342, data: {type: 2, subtype: 2}}, + {offsety: 380, data: {type: 2, subtype: 3}} + ]), + itemTemplate: _.template('
    ') }); _conf && this.mnuMultilevelPicker.selectByIndex(_conf.index, true); diff --git a/apps/documenteditor/main/app_dev.js b/apps/documenteditor/main/app_dev.js index d15f17707..49d9e8fa0 100644 --- a/apps/documenteditor/main/app_dev.js +++ b/apps/documenteditor/main/app_dev.js @@ -56,7 +56,6 @@ require.config({ sockjs : '../vendor/sockjs/sockjs.min', jszip : '../vendor/jszip/jszip.min', jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', api : 'api/documents/api', core : 'common/main/lib/core/application', notification : 'common/main/lib/core/NotificationCenter', @@ -125,7 +124,6 @@ require([ 'locale', 'jszip', 'jsziputils', - 'jsrsasign', 'sockjs', 'underscore' ], function (Backbone, Bootstrap, Core) { diff --git a/apps/documenteditor/main/locale/de.json b/apps/documenteditor/main/locale/de.json index 3292d4abd..ebe94dd21 100644 --- a/apps/documenteditor/main/locale/de.json +++ b/apps/documenteditor/main/locale/de.json @@ -161,6 +161,9 @@ "Common.Views.InsertTableDialog.txtMinText": "Der minimale Wert für dieses Feld ist {0}.", "Common.Views.InsertTableDialog.txtRows": "Anzahl von Zeilen\t", "Common.Views.InsertTableDialog.txtTitle": "Größe der Tabelle", + "Common.Views.LanguageDialog.btnCancel": "Abbrechen", + "Common.Views.LanguageDialog.btnOk": "OK", + "Common.Views.LanguageDialog.labelSelect": "Sprache des Dokuments wählen", "Common.Views.OpenDialog.cancelButtonText": "Abbrechen", "Common.Views.OpenDialog.okButtonText": "OK", "Common.Views.OpenDialog.txtEncoding": "Verschlüsselung ", @@ -686,8 +689,8 @@ "DE.Views.DocumentHolder.deleteRowText": "Zeile löschen", "DE.Views.DocumentHolder.deleteTableText": "Tabelle löschen", "DE.Views.DocumentHolder.deleteText": "Löschen", - "DE.Views.DocumentHolder.direct270Text": "um 270° drehen", - "DE.Views.DocumentHolder.direct90Text": "um 90° drehen ", + "DE.Views.DocumentHolder.direct270Text": "Text nach oben drehen", + "DE.Views.DocumentHolder.direct90Text": "Text nach unten drehen", "DE.Views.DocumentHolder.directHText": "Horizontal", "DE.Views.DocumentHolder.directionText": "Textausrichtung\t", "DE.Views.DocumentHolder.editChartText": "Daten ändern", @@ -803,6 +806,7 @@ "DE.Views.DocumentHolder.txtInsertBreak": "Manuellen Umbruch einfügen\t", "DE.Views.DocumentHolder.txtInsertEqAfter": "Formel nachher einfügen\t", "DE.Views.DocumentHolder.txtInsertEqBefore": "Formel vorher einfügen\t", + "DE.Views.DocumentHolder.txtKeepTextOnly": "Nur Text beibehalten", "DE.Views.DocumentHolder.txtLimitChange": "Grenzwerten ändern ", "DE.Views.DocumentHolder.txtLimitOver": "Grenzwert über den Text\n", "DE.Views.DocumentHolder.txtLimitUnder": "Grenzwert unter den Text", @@ -928,6 +932,7 @@ "DE.Views.FileMenuPanels.Settings.strForcesave": "Immer auf dem Server speichern (ansonsten auf dem Server beim Schließen des Dokuments speichern)", "DE.Views.FileMenuPanels.Settings.strInputMode": "Hieroglyphen einschalten", "DE.Views.FileMenuPanels.Settings.strLiveComment": "Live-Kommentare einschalten", + "DE.Views.FileMenuPanels.Settings.strResolvedComment": "Die Anzeige der aufgelösten Kommentare einschalten", "DE.Views.FileMenuPanels.Settings.strShowChanges": "Änderungen bei der Echtzeit-Zusammenarbeit zeigen", "DE.Views.FileMenuPanels.Settings.strSpellCheckMode": "Rechtschreibprüfung einschalten", "DE.Views.FileMenuPanels.Settings.strStrict": "Formal", @@ -1287,9 +1292,6 @@ "DE.Views.ShapeSettings.txtTopAndBottom": "Oben und unten", "DE.Views.ShapeSettings.txtWood": "Holz", "DE.Views.Statusbar.goToPageText": "Auf die Seite übergehen", - "DE.Views.Statusbar.LanguageDialog.btnCancel": "Abbrechen", - "DE.Views.Statusbar.LanguageDialog.btnOk": "OK", - "DE.Views.Statusbar.LanguageDialog.labelSelect": "Sprache des Dokuments wählen", "DE.Views.Statusbar.pageIndexText": "Seite {0} von {1}", "DE.Views.Statusbar.textChangesPanel": "Änderungen anzeigen", "DE.Views.Statusbar.textTrackChanges": "Nachverfolgen von Änderungen", diff --git a/apps/documenteditor/main/locale/en.json b/apps/documenteditor/main/locale/en.json index 4ab3363d7..627d70cea 100644 --- a/apps/documenteditor/main/locale/en.json +++ b/apps/documenteditor/main/locale/en.json @@ -161,6 +161,9 @@ "Common.Views.InsertTableDialog.txtMinText": "The minimum value for this field is {0}.", "Common.Views.InsertTableDialog.txtRows": "Number of Rows", "Common.Views.InsertTableDialog.txtTitle": "Table Size", + "Common.Views.LanguageDialog.btnCancel": "Cancel", + "Common.Views.LanguageDialog.btnOk": "Ok", + "Common.Views.LanguageDialog.labelSelect": "Select document language", "Common.Views.OpenDialog.cancelButtonText": "Cancel", "Common.Views.OpenDialog.okButtonText": "OK", "Common.Views.OpenDialog.txtEncoding": "Encoding ", @@ -674,11 +677,11 @@ "DE.Views.DocumentHolder.advancedText": "Advanced Settings", "DE.Views.DocumentHolder.alignmentText": "Alignment", "DE.Views.DocumentHolder.belowText": "Below", - "DE.Views.DocumentHolder.bottomCellText": "Align Bottom", + "del_DE.Views.DocumentHolder.bottomCellText": "Align Bottom", "DE.Views.DocumentHolder.breakBeforeText": "Page break before", "DE.Views.DocumentHolder.cellAlignText": "Cell Vertical Alignment", "DE.Views.DocumentHolder.cellText": "Cell", - "DE.Views.DocumentHolder.centerCellText": "Align Center", + "del_DE.Views.DocumentHolder.centerCellText": "Align Center", "DE.Views.DocumentHolder.centerText": "Center", "DE.Views.DocumentHolder.chartText": "Chart Advanced Settings", "DE.Views.DocumentHolder.columnText": "Column", @@ -686,8 +689,8 @@ "DE.Views.DocumentHolder.deleteRowText": "Delete Row", "DE.Views.DocumentHolder.deleteTableText": "Delete Table", "DE.Views.DocumentHolder.deleteText": "Delete", - "DE.Views.DocumentHolder.direct270Text": "Rotate at 270°", - "DE.Views.DocumentHolder.direct90Text": "Rotate at 90°", + "DE.Views.DocumentHolder.direct270Text": "Rotate Text Up", + "DE.Views.DocumentHolder.direct90Text": "Rotate Text Down", "DE.Views.DocumentHolder.directHText": "Horizontal", "DE.Views.DocumentHolder.directionText": "Text Direction", "DE.Views.DocumentHolder.editChartText": "Edit Data", @@ -752,7 +755,7 @@ "DE.Views.DocumentHolder.textShapeAlignTop": "Align Top", "DE.Views.DocumentHolder.textWrap": "Wrapping Style", "DE.Views.DocumentHolder.tipIsLocked": "This element is currently being edited by another user.", - "DE.Views.DocumentHolder.topCellText": "Align Top", + "del_DE.Views.DocumentHolder.topCellText": "Align Top", "DE.Views.DocumentHolder.txtAddBottom": "Add bottom border", "DE.Views.DocumentHolder.txtAddFractionBar": "Add fraction bar", "DE.Views.DocumentHolder.txtAddHor": "Add horizontal line", @@ -803,6 +806,7 @@ "DE.Views.DocumentHolder.txtInsertBreak": "Insert manual break", "DE.Views.DocumentHolder.txtInsertEqAfter": "Insert equation after", "DE.Views.DocumentHolder.txtInsertEqBefore": "Insert equation before", + "DE.Views.DocumentHolder.txtKeepTextOnly": "Keep text only", "DE.Views.DocumentHolder.txtLimitChange": "Change limits location", "DE.Views.DocumentHolder.txtLimitOver": "Limit over text", "DE.Views.DocumentHolder.txtLimitUnder": "Limit under text", @@ -835,6 +839,7 @@ "DE.Views.DocumentHolder.txtUngroup": "Ungroup", "DE.Views.DocumentHolder.updateStyleText": "Update %1 style", "DE.Views.DocumentHolder.vertAlignText": "Vertical Alignment", + "DE.Views.DocumentHolder.textUndo": "Undo", "DE.Views.DropcapSettingsAdvanced.cancelButtonText": "Cancel", "DE.Views.DropcapSettingsAdvanced.okButtonText": "Ok", "DE.Views.DropcapSettingsAdvanced.strBorders": "Borders & Fill", @@ -928,6 +933,7 @@ "DE.Views.FileMenuPanels.Settings.strForcesave": "Always save to server (otherwise save to server on document close)", "DE.Views.FileMenuPanels.Settings.strInputMode": "Turn on hieroglyphs", "DE.Views.FileMenuPanels.Settings.strLiveComment": "Turn on display of the comments", + "DE.Views.FileMenuPanels.Settings.strResolvedComment": "Turn on display of the resolved comments", "DE.Views.FileMenuPanels.Settings.strShowChanges": "Realtime Collaboration Changes", "DE.Views.FileMenuPanels.Settings.strSpellCheckMode": "Turn on spell checking option", "DE.Views.FileMenuPanels.Settings.strStrict": "Strict", @@ -1287,9 +1293,6 @@ "DE.Views.ShapeSettings.txtTopAndBottom": "Top and bottom", "DE.Views.ShapeSettings.txtWood": "Wood", "DE.Views.Statusbar.goToPageText": "Go to Page", - "DE.Views.Statusbar.LanguageDialog.btnCancel": "Cancel", - "DE.Views.Statusbar.LanguageDialog.btnOk": "Ok", - "DE.Views.Statusbar.LanguageDialog.labelSelect": "Select document language", "DE.Views.Statusbar.pageIndexText": "Page {0} of {1}", "DE.Views.Statusbar.textChangesPanel": "Changes Panel", "DE.Views.Statusbar.textTrackChanges": "Track Changes", diff --git a/apps/documenteditor/main/locale/fr.json b/apps/documenteditor/main/locale/fr.json index 81a6bfaa0..df02fa1a3 100644 --- a/apps/documenteditor/main/locale/fr.json +++ b/apps/documenteditor/main/locale/fr.json @@ -20,7 +20,7 @@ "Common.Controllers.ReviewChanges.textCenter": "Aligner au centre", "Common.Controllers.ReviewChanges.textChart": "Graphique", "Common.Controllers.ReviewChanges.textColor": "Couleur de police", - "Common.Controllers.ReviewChanges.textContextual": "N'ajoutez pas l'intervalle entre paragraphes du même style", + "Common.Controllers.ReviewChanges.textContextual": "Ne pas ajouter d'intervalle entre paragraphes du même style", "Common.Controllers.ReviewChanges.textDeleted": "Supprimé:\n\n", "Common.Controllers.ReviewChanges.textDStrikeout": "Double barré", "Common.Controllers.ReviewChanges.textEquation": "Équation", @@ -161,6 +161,9 @@ "Common.Views.InsertTableDialog.txtMinText": "La valeur minimale pour ce champ est {0}.", "Common.Views.InsertTableDialog.txtRows": "Nombre de lignes", "Common.Views.InsertTableDialog.txtTitle": "Taille du tableau", + "Common.Views.LanguageDialog.btnCancel": "Annuler", + "Common.Views.LanguageDialog.btnOk": "OK", + "Common.Views.LanguageDialog.labelSelect": "Sélectionner la langue du document", "Common.Views.OpenDialog.cancelButtonText": "Annuler", "Common.Views.OpenDialog.okButtonText": "OK", "Common.Views.OpenDialog.txtEncoding": "Codage ", @@ -195,7 +198,7 @@ "DE.Controllers.LeftMenu.warnDownloadAs": "Si vous continuez à enregistrer dans ce format toutes les fonctions sauf le texte seront perdues.
    Êtes-vous sûr de vouloir continuer ?", "DE.Controllers.Main.applyChangesTextText": "Chargement des changemets...", "DE.Controllers.Main.applyChangesTitleText": "Chargement des changemets", - "DE.Controllers.Main.convertationTimeoutText": "Expiration du délai de conversion.", + "DE.Controllers.Main.convertationTimeoutText": "Délai de conversion expiré.", "DE.Controllers.Main.criticalErrorExtText": "Cliquez sur \"OK\" pour revenir à la liste des documents.", "DE.Controllers.Main.criticalErrorTitle": "Erreur", "DE.Controllers.Main.defaultTitleText": "ONLYOFFICE Document Editor", @@ -218,8 +221,8 @@ "DE.Controllers.Main.errorMailMergeSaveFile": "Fusionner échoué.", "DE.Controllers.Main.errorProcessSaveResult": "Échec de l'enregistrement", "DE.Controllers.Main.errorServerVersion": "La version de l'éditeur a été mise à jour. La page sera rechargée pour appliquer les modifications.", - "DE.Controllers.Main.errorSessionAbsolute": "La session de la modification de document a expiré.Veuillez recharger la page.", - "DE.Controllers.Main.errorSessionIdle": "Le document n'est pas modifié depuis longtemps. Veuillez recharger la page.", + "DE.Controllers.Main.errorSessionAbsolute": "Votre session a expiré. Veuillez recharger la page.", + "DE.Controllers.Main.errorSessionIdle": "Le document n'a pas été modifié depuis trop longtemps. Veuillez recharger la page.", "DE.Controllers.Main.errorSessionToken": "La connexion au serveur a été interrompue. Veuillez recharger la page.", "DE.Controllers.Main.errorStockChart": "Ordre des lignes est incorrect. Pour créer un graphique boursier organisez vos données sur la feuille de calcul dans l'ordre suivant:
    cours à l'ouverture, cours maximal, cours minimal, cours à la clôture.", "DE.Controllers.Main.errorToken": "Le jeton de sécurité du document n’était pas formé correctement.
    Veuillez contacter l'administrateur de Document Server.", @@ -262,7 +265,7 @@ "DE.Controllers.Main.splitMaxRowsErrorText": "Le nombre de lignes doit être inférieure à %1.", "DE.Controllers.Main.textAnonymous": "Anonyme", "DE.Controllers.Main.textBuyNow": "Visiter le site web", - "DE.Controllers.Main.textChangesSaved": "Toutes les modifications sont enregistrées", + "DE.Controllers.Main.textChangesSaved": "Toutes les modifications ont été enregistrées", "DE.Controllers.Main.textCloseTip": "Cliquez pour fermer le conseil", "DE.Controllers.Main.textContactUs": "Contacter l'équipe de ventes", "DE.Controllers.Main.textLoadingDocument": "Chargement du document", @@ -686,8 +689,8 @@ "DE.Views.DocumentHolder.deleteRowText": "Supprimer la ligne", "DE.Views.DocumentHolder.deleteTableText": "Supprimer le tableau", "DE.Views.DocumentHolder.deleteText": "Supprimer", - "DE.Views.DocumentHolder.direct270Text": "Rotation à 270 °", - "DE.Views.DocumentHolder.direct90Text": "Rotation à 90 °", + "DE.Views.DocumentHolder.direct270Text": "Rotation du texte vers le haut", + "DE.Views.DocumentHolder.direct90Text": "Rotation du texte vers le bas", "DE.Views.DocumentHolder.directHText": "Horizontal", "DE.Views.DocumentHolder.directionText": "Orientation du texte", "DE.Views.DocumentHolder.editChartText": "Modifier les données", @@ -803,6 +806,7 @@ "DE.Views.DocumentHolder.txtInsertBreak": "Insérer pause manuelle", "DE.Views.DocumentHolder.txtInsertEqAfter": "Insérer équation après", "DE.Views.DocumentHolder.txtInsertEqBefore": "Insérez l'équation avant", + "DE.Views.DocumentHolder.txtKeepTextOnly": "Keep text only", "DE.Views.DocumentHolder.txtLimitChange": "Modifier d'emplacement des locations", "DE.Views.DocumentHolder.txtLimitOver": "Limite au-dessous le texte", "DE.Views.DocumentHolder.txtLimitUnder": "Limite en dessous le texte", @@ -921,14 +925,15 @@ "DE.Views.FileMenuPanels.Settings.strAutoRecover": "Activer la récupération automatique", "DE.Views.FileMenuPanels.Settings.strAutosave": "Activer l'enregistrement automatique", "DE.Views.FileMenuPanels.Settings.strCoAuthMode": "Mode de co-édition ", - "DE.Views.FileMenuPanels.Settings.strCoAuthModeDescFast": "Les autres utilisateurs pourront voir immédiatement vos modifications ", + "DE.Views.FileMenuPanels.Settings.strCoAuthModeDescFast": "Les autres utilisateurs verront vos modifications en temps reel", "DE.Views.FileMenuPanels.Settings.strCoAuthModeDescStrict": "Avant de pouvoir afficher les modifications, vous avez besoin de les accépter ", "DE.Views.FileMenuPanels.Settings.strFast": "Rapide", "DE.Views.FileMenuPanels.Settings.strFontRender": "Hinting de la police", "DE.Views.FileMenuPanels.Settings.strForcesave": "Toujours enregistrer sur le serveur ( sinon enregistrer sur le serveur lors de la fermeture du document )", "DE.Views.FileMenuPanels.Settings.strInputMode": "Activer des hiéroglyphes", "DE.Views.FileMenuPanels.Settings.strLiveComment": "Activer l'affichage des commentaires", - "DE.Views.FileMenuPanels.Settings.strShowChanges": "Changements de collaboration en temps réel", + "DE.Views.FileMenuPanels.Settings.strResolvedComment": "Turn on display of the resolved comments", + "DE.Views.FileMenuPanels.Settings.strShowChanges": "Visibilité des modifications en co-édition", "DE.Views.FileMenuPanels.Settings.strSpellCheckMode": "Activer la vérification de l'orthographe", "DE.Views.FileMenuPanels.Settings.strStrict": "Strict", "DE.Views.FileMenuPanels.Settings.strUnit": "Unité de mesure", @@ -943,7 +948,7 @@ "DE.Views.FileMenuPanels.Settings.textDisabled": "Désactivé", "DE.Views.FileMenuPanels.Settings.textForceSave": "Enregistrer sur le serveur", "DE.Views.FileMenuPanels.Settings.textMinute": "Chaque minute", - "DE.Views.FileMenuPanels.Settings.txtAll": "Tous", + "DE.Views.FileMenuPanels.Settings.txtAll": "Surligner toutes les modifications", "DE.Views.FileMenuPanels.Settings.txtCm": "Centimètre", "DE.Views.FileMenuPanels.Settings.txtFitPage": "Ajuster à la page", "DE.Views.FileMenuPanels.Settings.txtFitWidth": "Ajuster à la largeur", @@ -953,7 +958,7 @@ "DE.Views.FileMenuPanels.Settings.txtLiveComment": "Affichage des commentaires ", "DE.Views.FileMenuPanels.Settings.txtMac": "comme OS X", "DE.Views.FileMenuPanels.Settings.txtNative": "Natif", - "DE.Views.FileMenuPanels.Settings.txtNone": "Aucuns", + "DE.Views.FileMenuPanels.Settings.txtNone": "Surligner aucune modification", "DE.Views.FileMenuPanels.Settings.txtPt": "Point", "DE.Views.FileMenuPanels.Settings.txtSpellCheck": "Vérification de l'orthographe", "DE.Views.FileMenuPanels.Settings.txtWin": "comme Windows", @@ -1163,7 +1168,7 @@ "DE.Views.PageSizeDialog.textWidth": "Largeur", "DE.Views.ParagraphSettings.strLineHeight": "Interligne", "DE.Views.ParagraphSettings.strParagraphSpacing": "Espacement de paragraphe", - "DE.Views.ParagraphSettings.strSomeParagraphSpace": "N'ajoutez pas l'intervalle entre paragraphes du même style", + "DE.Views.ParagraphSettings.strSomeParagraphSpace": "Ne pas ajouter d'intervalle entre paragraphes du même style", "DE.Views.ParagraphSettings.strSpacingAfter": "Après", "DE.Views.ParagraphSettings.strSpacingBefore": "Avant", "DE.Views.ParagraphSettings.textAdvanced": "Afficher les paramètres avancés", @@ -1180,7 +1185,7 @@ "DE.Views.ParagraphSettingsAdvanced.strAllCaps": "Toutes en majuscules", "DE.Views.ParagraphSettingsAdvanced.strBorders": "Bordures et remplissage", "DE.Views.ParagraphSettingsAdvanced.strBreakBefore": "Saut de page avant", - "DE.Views.ParagraphSettingsAdvanced.strDoubleStrike": "Barré double", + "DE.Views.ParagraphSettingsAdvanced.strDoubleStrike": "Double barré", "DE.Views.ParagraphSettingsAdvanced.strIndentsFirstLine": "Première ligne", "DE.Views.ParagraphSettingsAdvanced.strIndentsLeftText": "A gauche", "DE.Views.ParagraphSettingsAdvanced.strIndentsRightText": "A droite", @@ -1287,9 +1292,6 @@ "DE.Views.ShapeSettings.txtTopAndBottom": "Haut et bas", "DE.Views.ShapeSettings.txtWood": "Bois", "DE.Views.Statusbar.goToPageText": "Aller à la page", - "DE.Views.Statusbar.LanguageDialog.btnCancel": "Annuler", - "DE.Views.Statusbar.LanguageDialog.btnOk": "OK", - "DE.Views.Statusbar.LanguageDialog.labelSelect": "Sélectionner la langue du document", "DE.Views.Statusbar.pageIndexText": "Page {0} de {1}", "DE.Views.Statusbar.textChangesPanel": "Сhangements de panneau", "DE.Views.Statusbar.textTrackChanges": "Suivi des modifications", @@ -1408,7 +1410,7 @@ "DE.Views.TableSettingsAdvanced.textRightOf": "à droite de", "DE.Views.TableSettingsAdvanced.textRightTooltip": "A droite", "DE.Views.TableSettingsAdvanced.textTable": "Tableau", - "DE.Views.TableSettingsAdvanced.textTableBackColor": "Tableau de fond", + "DE.Views.TableSettingsAdvanced.textTableBackColor": "Fond du tableau", "DE.Views.TableSettingsAdvanced.textTablePosition": "Position du tableau", "DE.Views.TableSettingsAdvanced.textTableSize": "Taille du tableau", "DE.Views.TableSettingsAdvanced.textTitle": "Tableau - Paramètres avancés", @@ -1456,7 +1458,7 @@ "DE.Views.TextArtSettings.textTemplate": "Modèle", "DE.Views.TextArtSettings.textTransform": "Transformer", "DE.Views.TextArtSettings.txtNoBorders": "Pas de ligne", - "DE.Views.Toolbar.mniCustomTable": "Inserer tableau personnalisé", + "DE.Views.Toolbar.mniCustomTable": "Inserer un tableau personnalisé", "DE.Views.Toolbar.mniDelFootnote": "Supprimer les notes de bas de page", "DE.Views.Toolbar.mniEditDropCap": "Paramètres de la lettrine", "DE.Views.Toolbar.mniEditFooter": "Modifier le pied de page", diff --git a/apps/documenteditor/main/locale/ru.json b/apps/documenteditor/main/locale/ru.json index 12ee32989..3e2ac4a6b 100644 --- a/apps/documenteditor/main/locale/ru.json +++ b/apps/documenteditor/main/locale/ru.json @@ -161,6 +161,9 @@ "Common.Views.InsertTableDialog.txtMinText": "Минимальное значение для этого поля - {0}.", "Common.Views.InsertTableDialog.txtRows": "Количество строк", "Common.Views.InsertTableDialog.txtTitle": "Размер таблицы", + "Common.Views.LanguageDialog.btnCancel": "Отмена", + "Common.Views.LanguageDialog.btnOk": "Ок", + "Common.Views.LanguageDialog.labelSelect": "Выбрать язык документа", "Common.Views.OpenDialog.cancelButtonText": "Отмена", "Common.Views.OpenDialog.okButtonText": "OK", "Common.Views.OpenDialog.txtEncoding": "Кодировка", @@ -686,8 +689,8 @@ "DE.Views.DocumentHolder.deleteRowText": "Удалить строку", "DE.Views.DocumentHolder.deleteTableText": "Удалить таблицу", "DE.Views.DocumentHolder.deleteText": "Удалить", - "DE.Views.DocumentHolder.direct270Text": "Поворот на 270°", - "DE.Views.DocumentHolder.direct90Text": "Поворот на 90°", + "DE.Views.DocumentHolder.direct270Text": "Повернуть текст вверх", + "DE.Views.DocumentHolder.direct90Text": "Повернуть текст вниз", "DE.Views.DocumentHolder.directHText": "Горизонтальное", "DE.Views.DocumentHolder.directionText": "Направление текста", "DE.Views.DocumentHolder.editChartText": "Изменить данные", @@ -803,6 +806,7 @@ "DE.Views.DocumentHolder.txtInsertBreak": "Вставить принудительный разрыв", "DE.Views.DocumentHolder.txtInsertEqAfter": "Вставить формулу после", "DE.Views.DocumentHolder.txtInsertEqBefore": "Вставить формулу перед", + "DE.Views.DocumentHolder.txtKeepTextOnly": "Сохранить только текст", "DE.Views.DocumentHolder.txtLimitChange": "Изменить положение пределов", "DE.Views.DocumentHolder.txtLimitOver": "Предел над текстом", "DE.Views.DocumentHolder.txtLimitUnder": "Предел под текстом", @@ -928,6 +932,7 @@ "DE.Views.FileMenuPanels.Settings.strForcesave": "Всегда сохранять на сервере (в противном случае сохранять на сервере при закрытии документа)", "DE.Views.FileMenuPanels.Settings.strInputMode": "Включить иероглифы", "DE.Views.FileMenuPanels.Settings.strLiveComment": "Включить отображение комментариев в тексте", + "DE.Views.FileMenuPanels.Settings.strResolvedComment": "Включить отображение решенных комментариев", "DE.Views.FileMenuPanels.Settings.strShowChanges": "Отображать изменения при совместной работе", "DE.Views.FileMenuPanels.Settings.strSpellCheckMode": "Включить проверку орфографии", "DE.Views.FileMenuPanels.Settings.strStrict": "Строгий", @@ -1287,9 +1292,6 @@ "DE.Views.ShapeSettings.txtTopAndBottom": "Сверху и снизу", "DE.Views.ShapeSettings.txtWood": "Дерево", "DE.Views.Statusbar.goToPageText": "Перейти на страницу", - "DE.Views.Statusbar.LanguageDialog.btnCancel": "Отмена", - "DE.Views.Statusbar.LanguageDialog.btnOk": "ОК", - "DE.Views.Statusbar.LanguageDialog.labelSelect": "Выбрать язык документа", "DE.Views.Statusbar.pageIndexText": "Страница {0} из {1}", "DE.Views.Statusbar.textChangesPanel": "Панель изменений", "DE.Views.Statusbar.textTrackChanges": "Отслеживание изменений", diff --git a/apps/documenteditor/main/resources/help/en/Contents.json b/apps/documenteditor/main/resources/help/en/Contents.json index 100024d79..d319d7900 100644 --- a/apps/documenteditor/main/resources/help/en/Contents.json +++ b/apps/documenteditor/main/resources/help/en/Contents.json @@ -23,7 +23,8 @@ {"src": "UsageInstructions/AddHyperlinks.htm", "name": "Add hyperlinks"}, {"src": "UsageInstructions/InsertDropCap.htm", "name": "Insert a drop cap"}, {"src": "UsageInstructions/InsertHeadersFooters.htm", "name": "Insert headers and footers"}, - {"src":"UsageInstructions/InsertPageNumbers.htm", "name": "Insert page numbers" }, + { "src": "UsageInstructions/InsertPageNumbers.htm", "name": "Insert page numbers" }, + {"src": "UsageInstructions/InsertFootnotes.htm", "name": "Insert footnotes" }, {"src": "UsageInstructions/InsertEquation.htm", "name": "Insert equations" }, {"src": "UsageInstructions/InsertTextObjects.htm", "name": "Insert text objects" }, {"src": "UsageInstructions/UseMailMerge.htm", "name": "Use mail merge"}, diff --git a/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertAutoshapes.htm b/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertAutoshapes.htm index 5328bd72a..099ed430b 100644 --- a/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertAutoshapes.htm +++ b/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertAutoshapes.htm @@ -183,6 +183,8 @@

    Shape - Advanced Settings

    The Text Padding tab allows to change the autoshape Top, Bottom, Left and Right internal margins (i.e. the distance between the text within the shape and the autoshape borders).

    Note: this tab is only available if text is added within the autoshape, otherwise the tab is disabled.

    +

    Shape - Advanced Settings

    +

    The Alternative Text tab allows to specify a Title and Description which will be read to the people with vision or cognitive impairments to help them better understand what information there is in the shape.

    \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertCharts.htm b/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertCharts.htm index 7ad1f0334..e17118c6c 100644 --- a/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertCharts.htm +++ b/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertCharts.htm @@ -158,6 +158,8 @@ +

    Chart - Advanced Settings

    +

    The Alternative Text tab allows to specify a Title and Description which will be read to the people with vision or cognitive impairments to help them better understand what information there is in the chart.


    @@ -242,6 +244,8 @@
  • Move object with text controls whether the chart moves as the text to which it is anchored moves.
  • Allow overlap controls whether two charts overlap or not if you drag them near each other on the page.
  • +

    Chart - Advanced Settings

    +

    The Alternative Text tab allows to specify a Title and Description which will be read to the people with vision or cognitive impairments to help them better understand what information there is in the chart.

    \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertFootnotes.htm b/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertFootnotes.htm new file mode 100644 index 000000000..13feac827 --- /dev/null +++ b/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertFootnotes.htm @@ -0,0 +1,77 @@ + + + + Insert footnotes + + + + + + +
    +

    Insert footnotes

    +

    You can add footnotes to provide explanations or comments for certain sentences or terms used in your text, make references to the sources etc.

    +

    To insert a footnote into your document,

    +
      +
    1. position the insertion point at the end of the text passage that you want to add a footnote to,
    2. +
    3. click the Footnotes Footnotes icon icon at the top toolbar, or
      + click the arrow next to the Footnotes Footnotes icon icon and select the Insert Footnote option from the menu, +

      The footnote mark (i.e. the superscript character that indicates a footnote) appears in the document text and the insertion point moves to the bottom of the current page.

      +
    4. +
    5. type in the footnote text.
    6. +
    +

    Repeat the above mentioned operations to add subsequent footnotes for other text passages in the document. The footnotes are numbered automatically.

    +

    Footnotes

    +

    If you hover the mouse pointer over the footnote mark in the document text, a small pop-up window with the footnote text appears.

    +

    Footnote text

    +

    To easily navigate between the added footnotes within the document text,

    +
      +
    1. click the arrow next to the Footnotes Footnotes icon icon,
    2. +
    3. in the Go to Footnotes section, use the Previous footnote icon arrow to go to the previous footnote or the Next footnote icon arrow to go to the next footnote.
    4. +
    +
    +

    To edit the footnotes settings,

    +
      +
    1. click the arrow next to the Footnotes Footnotes icon icon at the top toolbar,
    2. +
    3. select the Notes Settings option from the menu,
    4. +
    5. change the current parameters in the Notes Settings window that opens: +

      Footnotes Settings window

      +
        +
      • Set the Location of footnotes on the page selecting one of the available options: +
          +
        • Bottom of page - to position footnotes at the bottom of the page (this option is selected by default).
        • +
        • Below text - to position footnotes closer to the text. This option can be useful in cases when the page contains a short text.
        • +
        +
      • +
      • Adjust the footnotes Format: +
          +
        • Number Format - select the necessary number format from the available ones: 1, 2, 3,..., a, b, c,..., A, B, C,..., i, ii, iii,..., I, II, III,....
        • +
        • Start at - use the arrows to set the number or letter you want to start numbering with.
        • +
        • Numbering - select a way to number your footnotes: +
            +
          • Continuous - to number footnotes sequentially throughout the document,
          • +
          • Restart each section - to start footnote numbering with the number 1 (or some other specified character) at the beginning of each section,
          • +
          • Restart each page - to start footnote numbering with the number 1 (or some other specified character) at the beginning of each page.
          • +
          +
        • +
        • Custom Mark - set a special character or a word you want to use as the footnote mark (e.g. * or Note1). Enter the necessary character/word into the text entry field and click the Insert button at the bottom of the Notes Settings window.
        • +
        +
      • +
      • Use the Apply changes to drop-down list to select if you want to apply the specified notes settings to the Whole document or the Current section only. +

        Note: to use different footnotes formatting in separate parts of the document, you need to add section breaks first.

        +
      • +
      +
    6. +
    7. When ready, click the Apply button.
    8. +
    + +
    +

    To remove a single footnote, position the insertion point directly before the footnote mark in the document text and press Delete. Other footnotes will be renumbered automatically.

    +

    To delete all the footnotes in the document,

    +
      +
    1. click the arrow next to the Footnotes Footnotes icon icon at the top toolbar,
    2. +
    3. select the Delete All Footnotes option from the menu.
    4. +
    +
    + + \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertImages.htm b/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertImages.htm index 695b3cffd..b61ea68bf 100644 --- a/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertImages.htm +++ b/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertImages.htm @@ -46,7 +46,7 @@
  • Image Advanced Settings is used to open the 'Image - Advanced Settings' window.

  • -

    To change its advanced settings, click the image with the right mouse button and select Advanced Settings from the right-click menu or just click the Show advanced settings link at the right sidebar. The image properties window will open:

    +

    To change its advanced settings, click the image with the right mouse button and select the Image Advanced Settings option from the right-click menu or just click the Show advanced settings link at the right sidebar. The image properties window will open:

    Image - Advanced Settings: Size

    The Size tab contains the following parameters:

    +

    Image - Advanced Settings

    +

    The Alternative Text tab allows to specify a Title and Description which will be read to the people with vision or cognitive impairments to help them better understand what information there is in the image.

    \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertPageNumbers.htm b/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertPageNumbers.htm index cdd94f945..04a6d836d 100644 --- a/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertPageNumbers.htm +++ b/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertPageNumbers.htm @@ -37,7 +37,7 @@
  • Set the Position of page numbers on the page as well as relative to the top and bottom of the page.
  • Check the Different first page box to apply a different page number to the very first page or in case you don't want to add any number to it at all.
  • Use the Different odd and even pages box to insert different page numbers for odd and even pages.
  • -
  • The Link to Previous option is available in case you've previously added sections into your document. If not, it will be grayed out. Moreover, this option is also unavailable for the very first section (i.e. when a header or footer that belongs to the first section is selected). By default, this box is checked, so that unified numbering is applied to all the sections. If you select a header or footer area, you will see that the area is marked with the Same as Previous label. Uncheck the Link to Previous box to use different page numbering for each section of the document, for example, to start each section numbering at 1. The Same as Previous label will no longer be displayed.
  • +
  • The Link to Previous option is available in case you've previously added sections into your document. If not, it will be grayed out. Moreover, this option is also unavailable for the very first section (i.e. when a header or footer that belongs to the first section is selected). By default, this box is checked, so that unified numbering is applied to all the sections. If you select a header or footer area, you will see that the area is marked with the Same as Previous label. Uncheck the Link to Previous box to use different page numbering for each section of the document. The Same as Previous label will no longer be displayed.
  • Same as previous label

    diff --git a/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertTables.htm b/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertTables.htm index 8c1c8a28b..28bcba774 100644 --- a/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertTables.htm +++ b/apps/documenteditor/main/resources/help/en/UsageInstructions/InsertTables.htm @@ -64,7 +64,7 @@
  • Select from Template is used to choose a table template from the available ones.

  • Borders Style is used to select the border size, color, style as well as background color.

  • -
  • Text Wrapping is used to select between two text wrapping styles - inline and flow.

  • +
  • Wrapping Style is used to select between two text wrapping styles - inline and flow.

  • Rows & Columns is used to perform some operations with the table: select, delete, insert rows and columns, merge cells, split a cell.

  • Repeat as header row at the top of each page is used to insert the same header row at the top of each page in long tables.

  • Show advanced settings is used to open the 'Table - Advanced Settings' window.

  • @@ -149,7 +149,9 @@ - +

    Table - Advanced Settings

    +

    The Alternative Text tab allows to specify a Title and Description which will be read to the people with vision or cognitive impairments to help them better understand what information there is in the table.

    + \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/en/UsageInstructions/ParagraphIndents.htm b/apps/documenteditor/main/resources/help/en/UsageInstructions/ParagraphIndents.htm index e0429fa21..938a1e304 100644 --- a/apps/documenteditor/main/resources/help/en/UsageInstructions/ParagraphIndents.htm +++ b/apps/documenteditor/main/resources/help/en/UsageInstructions/ParagraphIndents.htm @@ -25,7 +25,8 @@

    Select the necessary paragraph(s) and drag the indent markers along the ruler.

    diff --git a/apps/documenteditor/main/resources/help/en/UsageInstructions/SectionBreaks.htm b/apps/documenteditor/main/resources/help/en/UsageInstructions/SectionBreaks.htm index 37802ff1b..4a77f3896 100644 --- a/apps/documenteditor/main/resources/help/en/UsageInstructions/SectionBreaks.htm +++ b/apps/documenteditor/main/resources/help/en/UsageInstructions/SectionBreaks.htm @@ -10,7 +10,7 @@

    Insert section breaks

    -

    Section breaks allow you to apply a different layout or formatting for the certain parts of your document. For example, you can use individual headers and footers, page numbering, margins, size, orientation, or column number for each separate section.

    +

    Section breaks allow you to apply a different layout or formatting for the certain parts of your document. For example, you can use individual headers and footers, page numbering, footnotes format, margins, size, orientation, or column number for each separate section.

    Note: an inserted section break defines formatting of the preceding part of the document.

    To insert a section break at the current cursor position:

      diff --git a/apps/documenteditor/main/resources/help/en/images/addfootnote.png b/apps/documenteditor/main/resources/help/en/images/addfootnote.png new file mode 100644 index 000000000..319115353 Binary files /dev/null and b/apps/documenteditor/main/resources/help/en/images/addfootnote.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/chart_properties.png b/apps/documenteditor/main/resources/help/en/images/chart_properties.png index 71547eca6..48f32f701 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/chart_properties.png and b/apps/documenteditor/main/resources/help/en/images/chart_properties.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/chart_properties_1.png b/apps/documenteditor/main/resources/help/en/images/chart_properties_1.png index 7e2096d66..30079065c 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/chart_properties_1.png and b/apps/documenteditor/main/resources/help/en/images/chart_properties_1.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/chart_properties_2.png b/apps/documenteditor/main/resources/help/en/images/chart_properties_2.png index 47e06e533..9e9e856db 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/chart_properties_2.png and b/apps/documenteditor/main/resources/help/en/images/chart_properties_2.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/chart_properties_3.png b/apps/documenteditor/main/resources/help/en/images/chart_properties_3.png new file mode 100644 index 000000000..95ddb6fea Binary files /dev/null and b/apps/documenteditor/main/resources/help/en/images/chart_properties_3.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/chartsettings.png b/apps/documenteditor/main/resources/help/en/images/chartsettings.png index ca59667a5..d67deb65f 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/chartsettings.png and b/apps/documenteditor/main/resources/help/en/images/chartsettings.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/chartsettings2.png b/apps/documenteditor/main/resources/help/en/images/chartsettings2.png index e96ba9c2a..9cf408b40 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/chartsettings2.png and b/apps/documenteditor/main/resources/help/en/images/chartsettings2.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/chartsettings3.png b/apps/documenteditor/main/resources/help/en/images/chartsettings3.png index afa6205aa..16d40b060 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/chartsettings3.png and b/apps/documenteditor/main/resources/help/en/images/chartsettings3.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/chartsettings4.png b/apps/documenteditor/main/resources/help/en/images/chartsettings4.png index 47cadf460..f37c62cc6 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/chartsettings4.png and b/apps/documenteditor/main/resources/help/en/images/chartsettings4.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/chartsettings5.png b/apps/documenteditor/main/resources/help/en/images/chartsettings5.png new file mode 100644 index 000000000..1762bfc52 Binary files /dev/null and b/apps/documenteditor/main/resources/help/en/images/chartsettings5.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/footnotes.png b/apps/documenteditor/main/resources/help/en/images/footnotes.png new file mode 100644 index 000000000..2232db084 Binary files /dev/null and b/apps/documenteditor/main/resources/help/en/images/footnotes.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/footnotes_settings.png b/apps/documenteditor/main/resources/help/en/images/footnotes_settings.png new file mode 100644 index 000000000..6289bdb67 Binary files /dev/null and b/apps/documenteditor/main/resources/help/en/images/footnotes_settings.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/footnotesadded.png b/apps/documenteditor/main/resources/help/en/images/footnotesadded.png new file mode 100644 index 000000000..28b9526fd Binary files /dev/null and b/apps/documenteditor/main/resources/help/en/images/footnotesadded.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/footnotetext.png b/apps/documenteditor/main/resources/help/en/images/footnotetext.png new file mode 100644 index 000000000..c0ea870ae Binary files /dev/null and b/apps/documenteditor/main/resources/help/en/images/footnotetext.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/hanging.png b/apps/documenteditor/main/resources/help/en/images/hanging.png index 3db644fa8..51e673343 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/hanging.png and b/apps/documenteditor/main/resources/help/en/images/hanging.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/image_properties.png b/apps/documenteditor/main/resources/help/en/images/image_properties.png index 50f3cba77..f13fc1e69 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/image_properties.png and b/apps/documenteditor/main/resources/help/en/images/image_properties.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/image_properties_1.png b/apps/documenteditor/main/resources/help/en/images/image_properties_1.png index 1a869aab0..b128c15b9 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/image_properties_1.png and b/apps/documenteditor/main/resources/help/en/images/image_properties_1.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/image_properties_2.png b/apps/documenteditor/main/resources/help/en/images/image_properties_2.png index 4248d0b49..c47bc86d6 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/image_properties_2.png and b/apps/documenteditor/main/resources/help/en/images/image_properties_2.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/image_properties_3.png b/apps/documenteditor/main/resources/help/en/images/image_properties_3.png new file mode 100644 index 000000000..8629aecd2 Binary files /dev/null and b/apps/documenteditor/main/resources/help/en/images/image_properties_3.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/leftindent.png b/apps/documenteditor/main/resources/help/en/images/leftindent.png new file mode 100644 index 000000000..fafac7f07 Binary files /dev/null and b/apps/documenteditor/main/resources/help/en/images/leftindent.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/nextfootnote.png b/apps/documenteditor/main/resources/help/en/images/nextfootnote.png new file mode 100644 index 000000000..eb50b4b91 Binary files /dev/null and b/apps/documenteditor/main/resources/help/en/images/nextfootnote.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/previousfootnote.png b/apps/documenteditor/main/resources/help/en/images/previousfootnote.png new file mode 100644 index 000000000..dab90e652 Binary files /dev/null and b/apps/documenteditor/main/resources/help/en/images/previousfootnote.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/right_table.png b/apps/documenteditor/main/resources/help/en/images/right_table.png index b938a0660..b84461b27 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/right_table.png and b/apps/documenteditor/main/resources/help/en/images/right_table.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/shape_properties.png b/apps/documenteditor/main/resources/help/en/images/shape_properties.png index 939ce3b81..ac0da9a1b 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/shape_properties.png and b/apps/documenteditor/main/resources/help/en/images/shape_properties.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/shape_properties_1.png b/apps/documenteditor/main/resources/help/en/images/shape_properties_1.png index 2f242689e..e101069bc 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/shape_properties_1.png and b/apps/documenteditor/main/resources/help/en/images/shape_properties_1.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/shape_properties_2.png b/apps/documenteditor/main/resources/help/en/images/shape_properties_2.png index 66bebea60..0664cd19c 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/shape_properties_2.png and b/apps/documenteditor/main/resources/help/en/images/shape_properties_2.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/shape_properties_3.png b/apps/documenteditor/main/resources/help/en/images/shape_properties_3.png index 13ebe1e10..942e46933 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/shape_properties_3.png and b/apps/documenteditor/main/resources/help/en/images/shape_properties_3.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/shape_properties_4.png b/apps/documenteditor/main/resources/help/en/images/shape_properties_4.png index 03be3f8bb..1a44af63e 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/shape_properties_4.png and b/apps/documenteditor/main/resources/help/en/images/shape_properties_4.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/shape_properties_5.png b/apps/documenteditor/main/resources/help/en/images/shape_properties_5.png new file mode 100644 index 000000000..20251a5a9 Binary files /dev/null and b/apps/documenteditor/main/resources/help/en/images/shape_properties_5.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/table_properties_1.png b/apps/documenteditor/main/resources/help/en/images/table_properties_1.png index 7b7f6161a..8e6f3d6c8 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/table_properties_1.png and b/apps/documenteditor/main/resources/help/en/images/table_properties_1.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/table_properties_2.png b/apps/documenteditor/main/resources/help/en/images/table_properties_2.png index 811ac56f1..3a8273f43 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/table_properties_2.png and b/apps/documenteditor/main/resources/help/en/images/table_properties_2.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/table_properties_3.png b/apps/documenteditor/main/resources/help/en/images/table_properties_3.png index b4a82300c..a53192c6b 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/table_properties_3.png and b/apps/documenteditor/main/resources/help/en/images/table_properties_3.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/table_properties_4.png b/apps/documenteditor/main/resources/help/en/images/table_properties_4.png index 03402721d..5819f50db 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/table_properties_4.png and b/apps/documenteditor/main/resources/help/en/images/table_properties_4.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/table_properties_5.png b/apps/documenteditor/main/resources/help/en/images/table_properties_5.png index 9abfcdf0b..e1a963e38 100644 Binary files a/apps/documenteditor/main/resources/help/en/images/table_properties_5.png and b/apps/documenteditor/main/resources/help/en/images/table_properties_5.png differ diff --git a/apps/documenteditor/main/resources/help/en/images/table_properties_6.png b/apps/documenteditor/main/resources/help/en/images/table_properties_6.png new file mode 100644 index 000000000..511ec01df Binary files /dev/null and b/apps/documenteditor/main/resources/help/en/images/table_properties_6.png differ diff --git a/apps/documenteditor/main/resources/help/fr/images/createnewstylewindow.png b/apps/documenteditor/main/resources/help/fr/images/createnewstylewindow.png new file mode 100644 index 000000000..8a730c1e7 Binary files /dev/null and b/apps/documenteditor/main/resources/help/fr/images/createnewstylewindow.png differ diff --git a/apps/documenteditor/main/resources/help/fr/images/customstylemenu.png b/apps/documenteditor/main/resources/help/fr/images/customstylemenu.png new file mode 100644 index 000000000..c1ab6d926 Binary files /dev/null and b/apps/documenteditor/main/resources/help/fr/images/customstylemenu.png differ diff --git a/apps/documenteditor/main/resources/help/fr/images/editedstylemenu.png b/apps/documenteditor/main/resources/help/fr/images/editedstylemenu.png new file mode 100644 index 000000000..3a5a48d1a Binary files /dev/null and b/apps/documenteditor/main/resources/help/fr/images/editedstylemenu.png differ diff --git a/apps/documenteditor/main/resources/help/fr/images/onecolumn.png b/apps/documenteditor/main/resources/help/fr/images/onecolumn.png new file mode 100644 index 000000000..ff0e02e20 Binary files /dev/null and b/apps/documenteditor/main/resources/help/fr/images/onecolumn.png differ diff --git a/apps/documenteditor/main/resources/help/ru/Contents.json b/apps/documenteditor/main/resources/help/ru/Contents.json index c1187c656..632599fa8 100644 --- a/apps/documenteditor/main/resources/help/ru/Contents.json +++ b/apps/documenteditor/main/resources/help/ru/Contents.json @@ -23,7 +23,8 @@ {"src":"UsageInstructions/AddHyperlinks.htm", "name": "Добавление гиперссылок"}, {"src":"UsageInstructions/InsertDropCap.htm", "name": "Вставка буквицы"}, {"src":"UsageInstructions/InsertHeadersFooters.htm", "name": "Вставка колонтитулов"}, - {"src":"UsageInstructions/InsertPageNumbers.htm", "name": "Вставка номеров страниц" }, + { "src": "UsageInstructions/InsertPageNumbers.htm", "name": "Вставка номеров страниц" }, + {"src": "UsageInstructions/InsertFootnotes.htm", "name": "Вставка сносок" }, {"src": "UsageInstructions/InsertEquation.htm", "name": "Вставка формул" }, {"src": "UsageInstructions/InsertTextObjects.htm", "name": "Вставка текстовых объектов" }, {"src": "UsageInstructions/UseMailMerge.htm", "name": "Использование слияния"}, diff --git a/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertAutoshapes.htm b/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertAutoshapes.htm index 9f58647fa..5c67b6ab0 100644 --- a/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertAutoshapes.htm +++ b/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertAutoshapes.htm @@ -185,6 +185,8 @@

      Фигура - Дополнительные параметры

      На вкладке Поля вокруг текста можно изменить внутренние поля автофигуры Сверху, Снизу, Слева и Справа (то есть расстояние между текстом внутри фигуры и границами автофигуры).

      Примечание: эта вкладка доступна, только если в автофигуру добавлен текст, в противном случае вкладка неактивна.

      +

      Фигура - Дополнительные параметры

      +

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

    \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertCharts.htm b/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertCharts.htm index 04bc2cd8c..a85f48cd3 100644 --- a/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertCharts.htm +++ b/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertCharts.htm @@ -275,6 +275,8 @@ +

    Диаграмма - Дополнительные параметры

    +

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


    @@ -367,6 +369,8 @@
  • Опция Перемещать с текстом определяет, будет ли диаграмма перемещаться вместе с текстом, к которому она привязана.
  • Опция Разрешить перекрытие определяет, будут ли перекрываться две диаграммы, если перетащить их близко друг к другу на странице.
  • +

    Диаграмма - Дополнительные параметры

    +

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

    \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertFootnotes.htm b/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertFootnotes.htm new file mode 100644 index 000000000..622ae916a --- /dev/null +++ b/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertFootnotes.htm @@ -0,0 +1,77 @@ + + + + Вставка сносок + + + + + + +
    +

    Вставка сносок

    +

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

    +

    Чтобы вставить сноску в документ:

    +
      +
    1. установите курсор в конце фрагмента текста, к которому надо добавить сноску,
    2. +
    3. нажмите на значок Сноски Значок Сноски на верхней панели инструментов или
      + нажмите на стрелку рядом со значком Сноски Значок Сноски и выберите в меню опцию Вставить сноску, +

      В тексте документа появится знак сноски (то есть надстрочный знак, обозначающий сноску), а курсор переместится в нижнюю часть текущей страницы.

      +
    4. +
    5. введите текст сноски.
    6. +
    +

    Повторите вышеуказанные действия, чтобы добавить последующие сноски к другим фрагментам текста в документе. Сноски нумеруются автоматически.

    +

    Сноски

    +

    При наведении курсора на знак сноски в тексте документа появляется небольшое всплывающее окно с текстом сноски.

    +

    Текст сноски

    +

    Чтобы легко переходить между добавленными сносками в тексте документа:

    +
      +
    1. нажмите на стрелку рядом со значком Сноски Значок Сноски,
    2. +
    3. в разделе Перейти к сноскам используйте стрелку Значок Предыдущая сноска для перехода к предыдущей сноске или стрелку Значок Следующая сноска для перехода к следующей сноске.
    4. +
    +
    +

    Чтобы изменить параметры сносок:

    +
      +
    1. нажмите на стрелку рядом со значком Сноски Значок Сноски на верхней панели инструментов,
    2. +
    3. выберите в меню опцию Параметры сносок,
    4. +
    5. измените текущие параметры в открывшемся окне Параметры сносок: +

      Окно параметры сносок

      +
        +
      • Задайте Положение сносок на странице, выбрав один из доступных вариантов: +
          +
        • Внизу страницы - чтобы расположить сноски внизу страницы (эта опция выбрана по умолчанию).
        • +
        • Под текстом - чтобы расположить сноски ближе к тексту. Эта опция может быть полезна в тех случаях, когда на странице содержится короткий текст.
        • +
        +
      • +
      • Настройте Формат сносок: +
          +
        • Формат номера - выберите нужный формат номера из доступных вариантов: 1, 2, 3,..., a, b, c,..., A, B, C,..., i, ii, iii,..., I, II, III,....
        • +
        • Начать с - используйте стрелки, чтобы задать цифру или букву, с которой должна начинаться нумерация.
        • +
        • Нумерация - выберите способ нумерации сносок: +
            +
          • Непрерывная - чтобы нумеровать сноски последовательно во всем документе,
          • +
          • В каждом разделе - чтобы начинать нумерацию сносок с цифры 1 (или другого заданного символа) в начале каждого раздела,
          • +
          • На каждой странице - чтобы начинать нумерацию сносок с цифры 1 (или другого заданного символа) в начале каждой страницы.
          • +
          +
        • +
        • Особый символ - задайте специальный символ или слово, которые требуется использовать в качестве знака сноски (например, * или Прим.1). Введите в поле ввода текста нужный символ или слово и нажмите кнопку Вставить в нижней части окна Параметры сносок.
        • +
        +
      • +
      • Используйте раскрывающийся список Применить изменения, чтобы выбрать, требуется ли применить указанные параметры сносок Ко всему документу или только К текущему разделу. +

        Примечание: чтобы использовать различное форматирование сносок в отдельных частях документа, сначала необходимо добавить разрывы раздела.

        +
      • +
      +
    6. +
    7. Когда все будет готово, нажмите на кнопку Применить.
    8. +
    + +
    +

    Чтобы удалить отдельную сноску, установите курсор непосредственно перед знаком сноски в тексте документа и нажмите клавишу Delete. Нумерация оставшихся сносок изменится автоматически.

    +

    Чтобы удалить все сноски в документе:

    +
      +
    1. нажмите на стрелку рядом со значком Сноски Значок Сноски на верхней панели инструментов,
    2. +
    3. выберите в меню опцию Удалить все сноски.
    4. +
    +
    + + \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertImages.htm b/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertImages.htm index 621d2e9db..f1dc50917 100644 --- a/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertImages.htm +++ b/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertImages.htm @@ -47,7 +47,7 @@
  • Дополнительные параметры изображения - используется для вызова окна 'Изображение - Дополнительные параметры'.

  • -

    Чтобы изменить дополнительные параметры изображения, щелкните по нему правой кнопкой мыши и выберите из контекстного меню пункт Дополнительные параметры. Или нажмите ссылку Дополнительные параметры на правой боковой панели. Откроется окно свойств изображения:

    +

    Чтобы изменить дополнительные параметры изображения, щелкните по нему правой кнопкой мыши и выберите из контекстного меню пункт Дополнительные параметры изображения. Или нажмите ссылку Дополнительные параметры на правой боковой панели. Откроется окно свойств изображения:

    Изображение - Дополнительные параметры: Размер

    Вкладка Размер содержит следующие параметры:

    + +

    Изображение - Дополнительные параметры

    +

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

    \ No newline at end of file diff --git a/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertTables.htm b/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertTables.htm index 33ee682e8..612dd094e 100644 --- a/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertTables.htm +++ b/apps/documenteditor/main/resources/help/ru/UsageInstructions/InsertTables.htm @@ -64,7 +64,7 @@
  • По шаблону - используется для выбора одного из доступных шаблонов таблиц.

  • Стиль границ - используется для выбора толщины, цвета и стиля границ, а также цвета фона.

  • -
  • Обтекание текстом - используется для выбора одного из двух стилей обтекания текстом - встроенного и плавающего.

  • +
  • Стиль обтекания - используется для выбора одного из двух стилей обтекания текстом - встроенного и плавающего.

  • Строки и столбцы - используется для выполнения некоторых операций с таблицей: выделения, удаления, вставки строк и столбцов, объединения ячеек, разделения ячейки.

  • Повторять как заголовок на каждой странице - в длинных таблицах используется для вставки одной и той же строки заголовка наверху каждой страницы.

  • Дополнительные параметры - используется для вызова окна 'Таблица - Дополнительные параметры'.

  • @@ -154,6 +154,8 @@ +

    Таблица - Дополнительные параметры

    +

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

    diff --git a/apps/documenteditor/main/resources/help/ru/UsageInstructions/ParagraphIndents.htm b/apps/documenteditor/main/resources/help/ru/UsageInstructions/ParagraphIndents.htm index 77a73d55d..6e89fedd5 100644 --- a/apps/documenteditor/main/resources/help/ru/UsageInstructions/ParagraphIndents.htm +++ b/apps/documenteditor/main/resources/help/ru/UsageInstructions/ParagraphIndents.htm @@ -26,6 +26,7 @@ diff --git a/apps/documenteditor/main/resources/help/ru/UsageInstructions/SectionBreaks.htm b/apps/documenteditor/main/resources/help/ru/UsageInstructions/SectionBreaks.htm index aa0b47138..7d797e127 100644 --- a/apps/documenteditor/main/resources/help/ru/UsageInstructions/SectionBreaks.htm +++ b/apps/documenteditor/main/resources/help/ru/UsageInstructions/SectionBreaks.htm @@ -12,7 +12,7 @@

    Вставка разрывов раздела

    Разрывы раздела дают возможность применять разные виды форматирования к определенным разделам вашего документа. Например, вы можете применить особые - верхние и нижние колонтитулы, нумерацию страниц, поля, размер, ориентацию страницы или количество колонок + верхние и нижние колонтитулы, нумерацию страниц, формат сносок, поля, размер, ориентацию страницы или количество колонок к каждому отдельно взятому разделу.

    Примечание: вставленный разрыв раздела определяет форматирование предшествующей части документа.

    Для вставки разрыва раздела в то место, где находится курсор:

    diff --git a/apps/documenteditor/main/resources/help/ru/images/addfootnote.png b/apps/documenteditor/main/resources/help/ru/images/addfootnote.png new file mode 100644 index 000000000..319115353 Binary files /dev/null and b/apps/documenteditor/main/resources/help/ru/images/addfootnote.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/chart_properties.png b/apps/documenteditor/main/resources/help/ru/images/chart_properties.png index 7019468ce..cfa9628a6 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/chart_properties.png and b/apps/documenteditor/main/resources/help/ru/images/chart_properties.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/chart_properties_1.png b/apps/documenteditor/main/resources/help/ru/images/chart_properties_1.png index 0bb9d13fd..0016c5747 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/chart_properties_1.png and b/apps/documenteditor/main/resources/help/ru/images/chart_properties_1.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/chart_properties_2.png b/apps/documenteditor/main/resources/help/ru/images/chart_properties_2.png index 9a07c74bc..6317516c6 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/chart_properties_2.png and b/apps/documenteditor/main/resources/help/ru/images/chart_properties_2.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/chart_properties_3.png b/apps/documenteditor/main/resources/help/ru/images/chart_properties_3.png new file mode 100644 index 000000000..fac3a217e Binary files /dev/null and b/apps/documenteditor/main/resources/help/ru/images/chart_properties_3.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/chartsettings.png b/apps/documenteditor/main/resources/help/ru/images/chartsettings.png index 5c9d50a64..b2f541474 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/chartsettings.png and b/apps/documenteditor/main/resources/help/ru/images/chartsettings.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/chartsettings2.png b/apps/documenteditor/main/resources/help/ru/images/chartsettings2.png index b398cb95f..0faed4ff3 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/chartsettings2.png and b/apps/documenteditor/main/resources/help/ru/images/chartsettings2.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/chartsettings3.png b/apps/documenteditor/main/resources/help/ru/images/chartsettings3.png index 50f1201d2..6398a67ad 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/chartsettings3.png and b/apps/documenteditor/main/resources/help/ru/images/chartsettings3.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/chartsettings4.png b/apps/documenteditor/main/resources/help/ru/images/chartsettings4.png index b058b1e7e..c6126c722 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/chartsettings4.png and b/apps/documenteditor/main/resources/help/ru/images/chartsettings4.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/chartsettings5.png b/apps/documenteditor/main/resources/help/ru/images/chartsettings5.png new file mode 100644 index 000000000..fdb31a631 Binary files /dev/null and b/apps/documenteditor/main/resources/help/ru/images/chartsettings5.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/footnotes.png b/apps/documenteditor/main/resources/help/ru/images/footnotes.png new file mode 100644 index 000000000..2232db084 Binary files /dev/null and b/apps/documenteditor/main/resources/help/ru/images/footnotes.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/footnotes_settings.png b/apps/documenteditor/main/resources/help/ru/images/footnotes_settings.png new file mode 100644 index 000000000..5d59dd6f6 Binary files /dev/null and b/apps/documenteditor/main/resources/help/ru/images/footnotes_settings.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/footnotesadded.png b/apps/documenteditor/main/resources/help/ru/images/footnotesadded.png new file mode 100644 index 000000000..5a97a4eb9 Binary files /dev/null and b/apps/documenteditor/main/resources/help/ru/images/footnotesadded.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/footnotetext.png b/apps/documenteditor/main/resources/help/ru/images/footnotetext.png new file mode 100644 index 000000000..cf1d7c1f0 Binary files /dev/null and b/apps/documenteditor/main/resources/help/ru/images/footnotetext.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/hanging.png b/apps/documenteditor/main/resources/help/ru/images/hanging.png index 3db644fa8..51e673343 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/hanging.png and b/apps/documenteditor/main/resources/help/ru/images/hanging.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/image_properties.png b/apps/documenteditor/main/resources/help/ru/images/image_properties.png index 1e0fb6f19..691574dd8 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/image_properties.png and b/apps/documenteditor/main/resources/help/ru/images/image_properties.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/image_properties_1.png b/apps/documenteditor/main/resources/help/ru/images/image_properties_1.png index 8d2811773..9f170278f 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/image_properties_1.png and b/apps/documenteditor/main/resources/help/ru/images/image_properties_1.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/image_properties_2.png b/apps/documenteditor/main/resources/help/ru/images/image_properties_2.png index f7551a0b8..990478d59 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/image_properties_2.png and b/apps/documenteditor/main/resources/help/ru/images/image_properties_2.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/image_properties_3.png b/apps/documenteditor/main/resources/help/ru/images/image_properties_3.png new file mode 100644 index 000000000..2d8547929 Binary files /dev/null and b/apps/documenteditor/main/resources/help/ru/images/image_properties_3.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/leftindent.png b/apps/documenteditor/main/resources/help/ru/images/leftindent.png new file mode 100644 index 000000000..fafac7f07 Binary files /dev/null and b/apps/documenteditor/main/resources/help/ru/images/leftindent.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/nextfootnote.png b/apps/documenteditor/main/resources/help/ru/images/nextfootnote.png new file mode 100644 index 000000000..eb50b4b91 Binary files /dev/null and b/apps/documenteditor/main/resources/help/ru/images/nextfootnote.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/previousfootnote.png b/apps/documenteditor/main/resources/help/ru/images/previousfootnote.png new file mode 100644 index 000000000..dab90e652 Binary files /dev/null and b/apps/documenteditor/main/resources/help/ru/images/previousfootnote.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/right_table.png b/apps/documenteditor/main/resources/help/ru/images/right_table.png index 05e1bdbfa..2a628708b 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/right_table.png and b/apps/documenteditor/main/resources/help/ru/images/right_table.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/shape_properties.png b/apps/documenteditor/main/resources/help/ru/images/shape_properties.png index 358762612..55deeacb6 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/shape_properties.png and b/apps/documenteditor/main/resources/help/ru/images/shape_properties.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/shape_properties_1.png b/apps/documenteditor/main/resources/help/ru/images/shape_properties_1.png index e38c687ea..c8cf80b65 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/shape_properties_1.png and b/apps/documenteditor/main/resources/help/ru/images/shape_properties_1.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/shape_properties_2.png b/apps/documenteditor/main/resources/help/ru/images/shape_properties_2.png index 1d08009b5..fa7e00e9c 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/shape_properties_2.png and b/apps/documenteditor/main/resources/help/ru/images/shape_properties_2.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/shape_properties_3.png b/apps/documenteditor/main/resources/help/ru/images/shape_properties_3.png index 04db30cdc..40862bfd7 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/shape_properties_3.png and b/apps/documenteditor/main/resources/help/ru/images/shape_properties_3.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/shape_properties_4.png b/apps/documenteditor/main/resources/help/ru/images/shape_properties_4.png index 13b7f075a..291b988ee 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/shape_properties_4.png and b/apps/documenteditor/main/resources/help/ru/images/shape_properties_4.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/shape_properties_5.png b/apps/documenteditor/main/resources/help/ru/images/shape_properties_5.png new file mode 100644 index 000000000..56ae62434 Binary files /dev/null and b/apps/documenteditor/main/resources/help/ru/images/shape_properties_5.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/table_properties_1.png b/apps/documenteditor/main/resources/help/ru/images/table_properties_1.png index bf35e6c5f..676b3ba0c 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/table_properties_1.png and b/apps/documenteditor/main/resources/help/ru/images/table_properties_1.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/table_properties_2.png b/apps/documenteditor/main/resources/help/ru/images/table_properties_2.png index 980368251..53ca884e0 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/table_properties_2.png and b/apps/documenteditor/main/resources/help/ru/images/table_properties_2.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/table_properties_3.png b/apps/documenteditor/main/resources/help/ru/images/table_properties_3.png index 3b3574050..896048809 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/table_properties_3.png and b/apps/documenteditor/main/resources/help/ru/images/table_properties_3.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/table_properties_4.png b/apps/documenteditor/main/resources/help/ru/images/table_properties_4.png index 8119f3460..99639e437 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/table_properties_4.png and b/apps/documenteditor/main/resources/help/ru/images/table_properties_4.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/table_properties_5.png b/apps/documenteditor/main/resources/help/ru/images/table_properties_5.png index 72176b26d..1ea5d56e5 100644 Binary files a/apps/documenteditor/main/resources/help/ru/images/table_properties_5.png and b/apps/documenteditor/main/resources/help/ru/images/table_properties_5.png differ diff --git a/apps/documenteditor/main/resources/help/ru/images/table_properties_6.png b/apps/documenteditor/main/resources/help/ru/images/table_properties_6.png new file mode 100644 index 000000000..55173847a Binary files /dev/null and b/apps/documenteditor/main/resources/help/ru/images/table_properties_6.png differ diff --git a/apps/documenteditor/main/resources/img/toolbar/bullets-and-numbering.png b/apps/documenteditor/main/resources/img/toolbar/bullets-and-numbering.png new file mode 100644 index 000000000..7831c5018 Binary files /dev/null and b/apps/documenteditor/main/resources/img/toolbar/bullets-and-numbering.png differ diff --git a/apps/documenteditor/main/resources/img/toolbar/bullets-and-numbering@2x.png b/apps/documenteditor/main/resources/img/toolbar/bullets-and-numbering@2x.png new file mode 100644 index 000000000..2839461c1 Binary files /dev/null and b/apps/documenteditor/main/resources/img/toolbar/bullets-and-numbering@2x.png differ diff --git a/apps/documenteditor/main/resources/img/toolbar/bullets.png b/apps/documenteditor/main/resources/img/toolbar/bullets.png deleted file mode 100644 index afafb2327..000000000 Binary files a/apps/documenteditor/main/resources/img/toolbar/bullets.png and /dev/null differ diff --git a/apps/documenteditor/main/resources/img/toolbar/bullets@2x.png b/apps/documenteditor/main/resources/img/toolbar/bullets@2x.png deleted file mode 100644 index 328cd3fb8..000000000 Binary files a/apps/documenteditor/main/resources/img/toolbar/bullets@2x.png and /dev/null differ diff --git a/apps/documenteditor/main/resources/img/toolbar/multilevels-numbering.png b/apps/documenteditor/main/resources/img/toolbar/multilevels-numbering.png deleted file mode 100644 index 4c4251d92..000000000 Binary files a/apps/documenteditor/main/resources/img/toolbar/multilevels-numbering.png and /dev/null differ diff --git a/apps/documenteditor/main/resources/img/toolbar/multilevels-numbering@2x.png b/apps/documenteditor/main/resources/img/toolbar/multilevels-numbering@2x.png deleted file mode 100644 index 8208d6e59..000000000 Binary files a/apps/documenteditor/main/resources/img/toolbar/multilevels-numbering@2x.png and /dev/null differ diff --git a/apps/documenteditor/main/resources/less/app.less b/apps/documenteditor/main/resources/less/app.less index bd9d4249b..e6d82d329 100644 --- a/apps/documenteditor/main/resources/less/app.less +++ b/apps/documenteditor/main/resources/less/app.less @@ -114,6 +114,7 @@ @import "../../../../common/main/resources/less/opendialog.less"; @import "../../../../common/main/resources/less/review-changes.less"; @import "../../../../common/main/resources/less/plugins.less"; +@import "../../../../common/main/resources/less/language-dialog.less"; // App // -------------------------------------------------- diff --git a/apps/documenteditor/main/resources/less/leftmenu.less b/apps/documenteditor/main/resources/less/leftmenu.less index d1c5c039f..ae02afe2b 100644 --- a/apps/documenteditor/main/resources/less/leftmenu.less +++ b/apps/documenteditor/main/resources/less/leftmenu.less @@ -6,6 +6,7 @@ overflow: hidden; .tool-menu-btns { + border-right: 1px solid @gray-dark; } } } @@ -28,7 +29,6 @@ button.notify .btn-menu-comments {background-position: -0*@toolbar-icon-size -60 display: inline-block; position: absolute; padding-top: 15px; - border-right: 1px solid @gray-dark; button { margin-bottom: 8px; diff --git a/apps/documenteditor/main/resources/less/statusbar.less b/apps/documenteditor/main/resources/less/statusbar.less index 45fd75699..222cfa5a8 100644 --- a/apps/documenteditor/main/resources/less/statusbar.less +++ b/apps/documenteditor/main/resources/less/statusbar.less @@ -78,13 +78,11 @@ color: #000; margin-left: 6px; - .icon-lang-flag { + .dropdown-toggle > .icon-lang-flag { position: relative; top: 3px; margin-left: 3px; margin-right: 2px; - width: 16px; - height: 12px; display: inline-block; } @@ -102,9 +100,6 @@ .dropdown-menu { li .lang-item-icon { - width: 16px; - height: 12px; - display: inline-block; vertical-align: text-bottom; margin: 1px 5px 0 2px; @@ -217,79 +212,6 @@ } } -.combo-langs { - .dropdown-menu { - li .lang-item-icon { - margin-top: 1px; - - width: 16px; - height: 12px; - } - } - - .input-lang-icon { - position: absolute; - width: 16px; - height: 12px; - left: 5px; - top: 5px; - } - - input { - padding-left: 25px !important; - } -} - -.lang-flag { - background-position: -16px -1608px; - - &.ca, &.ca-ES {background-position: 0 -1499px;} - &.cs, &.cs-CZ {background-position: -16px -1500px;} - &.da, &.da-DK {background-position: -32px -1500px;} - &.de, &.de-DE {background-position: 0 -1512px;} - &.el, &.el-GR {background-position: -16px -1512px;} - &.en, &.en-US {background-position: -32px -1512px;} - &.fr, &.fr-FR {background-position: 0 -1524px;} - &.hu, &.hu-HU {background-position: -16px -1524px;} - &.it, &.it-IT {background-position: -32px -1524px;} - &.ko, &.ko-KR {background-position: 0 -1536px;} - &.nl, &.nl-NL {background-position: -16px -1536px;} - &.nb, &.nb-NO {background-position: -32px -1536px;} - &.pl, &.pl-PL {background-position: 0 -1548px;} - &.pt, &.pt-BR {background-position: -16px -1548px;} - &.ro, &.ro-RO {background-position: -32px -1548px;} - &.ru, &.ru-RU {background-position: 0 -1560px;} - &.sv, &.sv-SE {background-position: -32px -1560px;} - &.tr, &.tr-TR {background-position: 0 -1572px;} - &.uk, &.uk-UA {background-position: -16px -1572px;} - &.lv, &.lv-LV {background-position: -32px -1572px;} - &.lt, &.lt-LT {background-position: 0 -1584px;} - &.vi, &.vi-VN {background-position: -16px -1584px;} - &.de-CH {background-position: -32px -1584px;} - &.nn, &.nn-NO {background-position: 0 -1596px;} - &.pt-PT {background-position: -16px -1596px;} - &.de-AT {background-position: -32px -1596px;} - &.es, &.es-ES {background-position: 0 -1608px;} - &.en-GB {background-position: -32px -1608px;} - &.en-AU {background-position: 0 -1620px;} - &.az-Latn-AZ {background-position: -16px -1620px;} - &.id, &.id-ID {background-position: -32px -1620px;} - - &.bg, &.bg-BG {background-position: 0 -1720px;} - &.ca-ES-valencia {background-position: -16px -1720px;} - &.en-CA {background-position: -32px -1720px;} - &.en-ZA {background-position: 0 -1732px;} - &.eu, &.eu-ES {background-position: -16px -1732px;} - &.gl, &.gl-ES {background-position: -32px -1732px;} - &.hr, &.hr-HR {background-position: 0 -1744px;} - &.lb, &.lb-LU {background-position: -16px -1744px;} - &.mn, &.mn-MN {background-position: -32px -1744px;} - &.sl, &.sl-SI {background-position: 0 -1756px;} - &.sr, &.sr-Cyrl-RS, &.sr-Latn-RS {background-position: -16px -1756px;} - &.sk, &.sk-SK {background-position: -32px -1756px;} - &.kk, &.kk-KZ {background-position: 0 -1768px;} -} - .button-normal-icon(btn-ic-zoomtowidth, 55, @toolbar-icon-size); .button-normal-icon(btn-ic-zoomtopage, 56, @toolbar-icon-size); .button-normal-icon(btn-ic-zoomup, 57, @toolbar-icon-size); diff --git a/apps/documenteditor/main/resources/less/toolbar.less b/apps/documenteditor/main/resources/less/toolbar.less index f29f73763..ae4703bf8 100644 --- a/apps/documenteditor/main/resources/less/toolbar.less +++ b/apps/documenteditor/main/resources/less/toolbar.less @@ -78,25 +78,12 @@ z-index: @zindex-tooltip + 1; } -.menu-markers, -.menu-numbers { - // -} - .item-markerlist { - .background-ximage('@{app-image-path}/toolbar/bullets.png', '@{app-image-path}/toolbar/bullets@2x.png', 38px); + .background-ximage('@{app-image-path}/toolbar/bullets-and-numbering.png', '@{app-image-path}/toolbar/bullets-and-numbering@2x.png', 38px); width: 38px; height: 38px; } -.item-numberlist, -.item-multilevellist { - .background-ximage('@{app-image-path}/toolbar/multilevels-numbering.png', '@{app-image-path}/toolbar/multilevels-numbering@2x.png', 74px); - width: 74px; - height: 74px; -} - - .color-schemas-menu { span { &.colors { @@ -438,3 +425,10 @@ background-position: @plus-offset-x @plus-offset-y - 16; } } + +#special-paste-container { + position: absolute; + z-index: @zindex-dropdown - 20; + background-color: @gray-light; + border: 1px solid @gray; +} \ No newline at end of file diff --git a/apps/documenteditor/mobile/app-dev.js b/apps/documenteditor/mobile/app-dev.js index 8f9d3a3be..bc204844a 100644 --- a/apps/documenteditor/mobile/app-dev.js +++ b/apps/documenteditor/mobile/app-dev.js @@ -51,9 +51,6 @@ require.config({ text : '../vendor/requirejs-text/text', xregexp : '../vendor/xregexp/xregexp-all-min', sockjs : '../vendor/sockjs/sockjs.min', - jszip : '../vendor/jszip/jszip.min', - jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', api : 'api/documents/api', core : 'common/main/lib/core/application', extendes : 'common/mobile/utils/extendes', @@ -118,9 +115,6 @@ require([ 'analytics', 'gateway', 'locale', - 'jszip', - 'jsziputils', - 'jsrsasign', 'sockjs' ], function (Backbone, Framework7, Core) { Backbone.history.start(); diff --git a/apps/documenteditor/mobile/app.js b/apps/documenteditor/mobile/app.js index ebf92413d..9f6b018a8 100644 --- a/apps/documenteditor/mobile/app.js +++ b/apps/documenteditor/mobile/app.js @@ -51,9 +51,6 @@ require.config({ text : '../vendor/requirejs-text/text', xregexp : '../vendor/xregexp/xregexp-all-min', sockjs : '../vendor/sockjs/sockjs.min', - jszip : '../vendor/jszip/jszip.min', - jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', allfonts : '../../sdkjs/common/AllFonts', sdk : '../../sdkjs/word/sdk-all-min', api : 'api/documents/api', @@ -103,10 +100,7 @@ require.config({ 'underscore', 'allfonts', 'xregexp', - 'sockjs', - 'jszip', - 'jsziputils', - 'jsrsasign' + 'sockjs' ] }, gateway: { diff --git a/apps/documenteditor/mobile/app/controller/DocumentHolder.js b/apps/documenteditor/mobile/app/controller/DocumentHolder.js index 73973ca18..127777c59 100644 --- a/apps/documenteditor/mobile/app/controller/DocumentHolder.js +++ b/apps/documenteditor/mobile/app/controller/DocumentHolder.js @@ -92,7 +92,7 @@ define([ }, setMode: function (mode) { - _isEdit = ('edit' === mode); + _isEdit = mode.isEdit; }, // When our application is ready, lets get started diff --git a/apps/documenteditor/mobile/app/controller/Main.js b/apps/documenteditor/mobile/app/controller/Main.js index e6be4a38f..bbf9b3c35 100644 --- a/apps/documenteditor/mobile/app/controller/Main.js +++ b/apps/documenteditor/mobile/app/controller/Main.js @@ -230,11 +230,11 @@ define([ setMode: function(mode){ var me = this; - Common.SharedSettings.set('mode', mode); + Common.SharedSettings.set('mode', mode.isEdit ? 'edit' : 'view'); if (me.api) { - me.api.asc_enableKeyEvents(mode == 'edit'); - me.api.asc_setViewMode(mode != 'edit'); + me.api.asc_enableKeyEvents(mode.isEdit); + me.api.asc_setViewMode(!mode.isEdit); } }, @@ -455,7 +455,7 @@ define([ /** coauthoring begin **/ value = Common.localStorage.getItem("de-settings-livecomment"); this.isLiveCommenting = !(value!==null && parseInt(value) == 0); - this.isLiveCommenting ? this.api.asc_showComments() : this.api.asc_hideComments(); + this.isLiveCommenting ? this.api.asc_showComments(true) : this.api.asc_hideComments(); /** coauthoring end **/ value = Common.localStorage.getItem("de-settings-zoom"); @@ -468,8 +468,7 @@ define([ value = Common.localStorage.getItem("de-show-tableline"); me.api.put_ShowTableEmptyLine((value!==null) ? eval(value) : true); - value = Common.localStorage.getItem("de-settings-spellcheck"); - me.api.asc_setSpellCheck(value===null || parseInt(value) == 1); + me.api.asc_setSpellCheck(false); // don't use spellcheck for mobile mode Common.localStorage.setItem("de-settings-showsnaplines", me.api.get_ShowSnapLines() ? 1 : 0); @@ -614,6 +613,7 @@ define([ var type = /^(?:(pdf|djvu|xps))$/.exec(me.document.fileType); me.appOptions.canDownloadOrigin = !me.appOptions.nativeApp && me.permissions.download !== false && (type && typeof type[1] === 'string'); me.appOptions.canDownload = !me.appOptions.nativeApp && me.permissions.download !== false && (!type || typeof type[1] !== 'string'); + me.appOptions.canReader = (!type || typeof type[1] !== 'string'); me._state.licenseWarning = (licType===Asc.c_oLicenseResult.Connections) && me.appOptions.canEdit && me.editorConfig.mode !== 'view'; @@ -639,7 +639,7 @@ define([ _.each(me.getApplication().controllers, function(controller) { if (controller && _.isFunction(controller.setMode)) { - controller.setMode(me.editorConfig.mode); + controller.setMode(me.appOptions); } }); @@ -699,7 +699,7 @@ define([ message: [msg.msg.charAt(0).toUpperCase() + msg.msg.substring(1)] }); - Common.component.Analytics.trackEvent('External Error', msg.title); + Common.component.Analytics.trackEvent('External Error'); } }, diff --git a/apps/documenteditor/mobile/app/controller/Settings.js b/apps/documenteditor/mobile/app/controller/Settings.js index 8a67713e1..443cbd403 100644 --- a/apps/documenteditor/mobile/app/controller/Settings.js +++ b/apps/documenteditor/mobile/app/controller/Settings.js @@ -191,6 +191,7 @@ define([ $('#settings-readermode input:checkbox').single('change', _.bind(me.onReaderMode, me)); $('#settings-edit-document').single('click', _.bind(me.onEditDocumet, me)); $('#settings-help').single('click', _.bind(me.onShowHelp, me)); + $('#settings-download').single('click', _.bind(me.onDownloadOrigin, me)); } }, @@ -285,6 +286,15 @@ define([ } }, + onDownloadOrigin: function(e) { + var me = this; + + _.defer(function () { + me.api.asc_DownloadOrigin(); + }); + me.hideModal(); + }, + onFormatChange: function (e) { var me = this, rawValue = $(e.currentTarget).val(), diff --git a/apps/documenteditor/mobile/app/template/AddImage.template b/apps/documenteditor/mobile/app/template/AddImage.template index 0ac3570e4..f5bbcb0c8 100644 --- a/apps/documenteditor/mobile/app/template/AddImage.template +++ b/apps/documenteditor/mobile/app/template/AddImage.template @@ -40,12 +40,13 @@
    -
    <%= scope.textAddress %>
    + <% if (!android) { %>
    <%= scope.textAddress %>
    <% } %>
    ', '<% }); %>' - ].join(''), { + ].join(''))({ styles: styles }); diff --git a/apps/documenteditor/mobile/app/view/edit/EditTable.js b/apps/documenteditor/mobile/app/view/edit/EditTable.js index 2f546509b..172c53ec3 100644 --- a/apps/documenteditor/mobile/app/view/edit/EditTable.js +++ b/apps/documenteditor/mobile/app/view/edit/EditTable.js @@ -138,7 +138,7 @@ define([ '
    ', '<% }); %>', '
    ' - ].join(''), { + ].join(''))({ styles: styles }); diff --git a/apps/documenteditor/sdk_dev_scripts.js b/apps/documenteditor/sdk_dev_scripts.js index 86fc92358..c021353bd 100644 --- a/apps/documenteditor/sdk_dev_scripts.js +++ b/apps/documenteditor/sdk_dev_scripts.js @@ -6,8 +6,6 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/docscoapicommon.js", "../../../../sdkjs/common/docscoapi.js", "../../../../sdkjs/common/spellcheckapi.js", - "../../../../sdkjs/common/spellCheckLanguage.js", - "../../../../sdkjs/common/spellCheckLanguagesAll.js", "../../../../sdkjs/common/apiCommon.js", "../../../../sdkjs/common/SerializeCommonWordExcel.js", "../../../../sdkjs/common/editorscommon.js", @@ -19,9 +17,10 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/AdvancedOptions.js", "../../../../sdkjs/common/FontsFreeType/font_engine.js", "../../../../sdkjs/common/FontsFreeType/FontFile.js", - "../../../../sdkjs/common/FontsFreeType/font_map.js", + "../../../../sdkjs/common/FontsFreeType/font_map.js", "../../../../sdkjs/common/FontsFreeType/FontManager.js", "../../../../sdkjs/word/Editor/FontClassification.js", + "../../../../sdkjs/common/FontsFreeType/character.js", "../../../../sdkjs/common/Drawings/Metafile.js", "../../../../sdkjs/common/FontsFreeType/TextMeasurer.js", "../../../../sdkjs/common/Drawings/WorkEvents.js", @@ -40,6 +39,7 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/Drawings/Format/Format.js", "../../../../sdkjs/common/Drawings/Format/GraphicObjectBase.js", "../../../../sdkjs/common/Drawings/Format/Shape.js", + "../../../../sdkjs/common/Drawings/Format/CnxShape.js", "../../../../sdkjs/common/Drawings/Format/Path.js", "../../../../sdkjs/common/Drawings/Format/Image.js", "../../../../sdkjs/common/Drawings/Format/GroupShape.js", @@ -59,6 +59,7 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/Drawings/TrackObjects/ResizeTracks.js", "../../../../sdkjs/common/Drawings/TrackObjects/RotateTracks.js", "../../../../sdkjs/common/Drawings/TrackObjects/Spline.js", + "../../../../sdkjs/common/Drawings/TrackObjects/ConnectorTrack.js", "../../../../sdkjs/common/Drawings/DrawingObjectsHandlers.js", "../../../../sdkjs/common/Drawings/TextDrawer.js", "../../../../sdkjs/common/Drawings/Externals.js", @@ -86,10 +87,12 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/word/Editor/GraphicObjects/GraphicPage.js", "../../../../sdkjs/word/Editor/GraphicObjects/WrapManager.js", "../../../../sdkjs/word/Editor/CollaborativeEditing.js", + "../../../../sdkjs/word/Editor/DocumentContentElementBase.js", "../../../../sdkjs/word/Editor/Comments.js", "../../../../sdkjs/word/Editor/CommentsChanges.js", "../../../../sdkjs/word/Editor/Styles.js", "../../../../sdkjs/word/Editor/StylesChanges.js", + "../../../../sdkjs/word/Editor/RevisionsChange.js", "../../../../sdkjs/word/Editor/ParagraphContent.js", "../../../../sdkjs/word/Editor/Paragraph/ParaTextPr.js", "../../../../sdkjs/word/Editor/Paragraph/ParaTextPrChanges.js", @@ -132,6 +135,10 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/word/Editor/Table/TableRowChanges.js", "../../../../sdkjs/word/Editor/Table/TableCell.js", "../../../../sdkjs/word/Editor/Table/TableCellChanges.js", + "../../../../sdkjs/word/Editor/StructuredDocumentTags/BlockLevel.js", + "../../../../sdkjs/word/Editor/StructuredDocumentTags/InlineLevel.js", + "../../../../sdkjs/word/Editor/StructuredDocumentTags/SdtPr.js", + "../../../../sdkjs/word/Editor/StructuredDocumentTags/SdtPrChanges.js", "../../../../sdkjs/word/Editor/Serialize2.js", "../../../../sdkjs/word/Editor/Search.js", "../../../../sdkjs/word/Editor/Spelling.js", diff --git a/apps/presentationeditor/embed/index.html b/apps/presentationeditor/embed/index.html index aa4c5f04b..b093b6577 100644 --- a/apps/presentationeditor/embed/index.html +++ b/apps/presentationeditor/embed/index.html @@ -323,9 +323,6 @@ - - - - - - diff --git a/apps/presentationeditor/embed/js/ApplicationController.js b/apps/presentationeditor/embed/js/ApplicationController.js index 6c0b73584..4cbe3951d 100644 --- a/apps/presentationeditor/embed/js/ApplicationController.js +++ b/apps/presentationeditor/embed/js/ApplicationController.js @@ -506,14 +506,14 @@ var ApplicationController = new(function(){ Common.Analytics.trackEvent('Internal Error', id.toString()); } - function onExternalError(error) { + function onExternalMessage(error) { if (error) { hidePreloader(); - $('#id-error-mask-title').text(error.title); + $('#id-error-mask-title').text('Error'); $('#id-error-mask-text').text(error.msg); $('#id-error-mask').css('display', 'block'); - Common.Analytics.trackEvent('External Error', error.title); + Common.Analytics.trackEvent('External Error'); } } @@ -573,7 +573,7 @@ var ApplicationController = new(function(){ // Initialize api gateway Common.Gateway.on('init', loadConfig); Common.Gateway.on('opendocument', loadDocument); - Common.Gateway.on('showerror', onExternalError); + Common.Gateway.on('showmessage', onExternalMessage); Common.Gateway.ready(); } diff --git a/apps/presentationeditor/embed/js/ApplicationView.js b/apps/presentationeditor/embed/js/ApplicationView.js index 2dcaa32b6..058c7bde5 100644 --- a/apps/presentationeditor/embed/js/ApplicationView.js +++ b/apps/presentationeditor/embed/js/ApplicationView.js @@ -41,10 +41,10 @@ var ApplicationView = new(function(){ $btnTools.addClass('dropdown-toggle').attr('data-toggle', 'dropdown').attr('aria-expanded', 'true'); $btnTools.parent().append( ''); } diff --git a/apps/presentationeditor/main/app.js b/apps/presentationeditor/main/app.js index 941fc47b2..3a3f9a384 100644 --- a/apps/presentationeditor/main/app.js +++ b/apps/presentationeditor/main/app.js @@ -54,8 +54,6 @@ require.config({ jmousewheel : '../vendor/perfect-scrollbar/src/jquery.mousewheel', xregexp : '../vendor/xregexp/xregexp-all-min', sockjs : '../vendor/sockjs/sockjs.min', - jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', allfonts : '../../sdkjs/common/AllFonts', sdk : '../../sdkjs/slide/sdk-all-min', api : 'api/documents/api', @@ -108,9 +106,7 @@ require.config({ 'underscore', 'allfonts', 'xregexp', - 'sockjs', - 'jsziputils', - 'jsrsasign' + 'sockjs' ] }, gateway: { diff --git a/apps/presentationeditor/main/app/controller/LeftMenu.js b/apps/presentationeditor/main/app/controller/LeftMenu.js index 392a61ebb..2da063bda 100644 --- a/apps/presentationeditor/main/app/controller/LeftMenu.js +++ b/apps/presentationeditor/main/app/controller/LeftMenu.js @@ -232,6 +232,9 @@ define([ var value = Common.localStorage.getItem("pe-settings-inputmode"); this.api.SetTextBoxInputMode(parseInt(value) == 1); + value = Common.localStorage.getItem("pe-settings-spellcheck"); + this.api.asc_setSpellCheck(parseInt(value) == 1); + /** coauthoring begin **/ if (this.mode.isEdit && !this.mode.isOffline && this.mode.canCoAuthoring) { value = Common.localStorage.getItem("pe-settings-coauthmode"); diff --git a/apps/presentationeditor/main/app/controller/Main.js b/apps/presentationeditor/main/app/controller/Main.js index c8f5ec0b8..1e97025ea 100644 --- a/apps/presentationeditor/main/app/controller/Main.js +++ b/apps/presentationeditor/main/app/controller/Main.js @@ -99,6 +99,7 @@ define([ var me = this; this._state = {isDisconnected: false, usersCount: 1, fastCoauth: true, lostEditingRights: false, licenseWarning: false}; + this.languages = null; window.storagename = 'presentation'; @@ -136,6 +137,7 @@ define([ this.api.asc_registerCallback('asc_onPrintUrl', _.bind(this.onPrintUrl, this)); this.api.asc_registerCallback('asc_onMeta', _.bind(this.onMeta, this)); this.api.asc_registerCallback('asc_onAdvancedOptions', _.bind(this.onAdvancedOptions, this)); + this.api.asc_registerCallback('asc_onSpellCheckInit', _.bind(this.loadLanguages, this)); Common.NotificationCenter.on('api:disconnect', _.bind(this.onCoAuthoringDisconnect, this)); Common.NotificationCenter.on('goback', _.bind(this.goBack, this)); @@ -192,13 +194,13 @@ define([ me.api.asc_enableKeyEvents(false); }, 'modal:close': function(dlg) { - if (dlg && dlg.$lastmodal && dlg.$lastmodal.size() < 1) { + if (dlg && dlg.$lastmodal && dlg.$lastmodal.length < 1) { me.isModalShowed = false; me.api.asc_enableKeyEvents(true); } }, 'modal:hide': function(dlg) { - if (dlg && dlg.$lastmodal && dlg.$lastmodal.size() < 1) { + if (dlg && dlg.$lastmodal && dlg.$lastmodal.length < 1) { me.isModalShowed = false; me.api.asc_enableKeyEvents(true); } @@ -221,6 +223,14 @@ define([ }); this.initNames(); + Common.util.Shortcuts.delegateShortcuts({ + shortcuts: { + 'command+s,ctrl+s': _.bind(function (e) { + e.preventDefault(); + e.stopPropagation(); + }, this) + } + }); } }, @@ -537,6 +547,9 @@ define([ var zf = (value!==null) ? parseInt(value) : (this.appOptions.customization && this.appOptions.customization.zoom ? parseInt(this.appOptions.customization.zoom) : -1); (zf == -1) ? this.api.zoomFitToPage() : ((zf == -2) ? this.api.zoomFitToWidth() : this.api.zoom(zf>0 ? zf : 100)); + value = Common.localStorage.getItem("pe-settings-spellcheck"); + me.api.asc_setSpellCheck(value===null || parseInt(value) == 1); + function checkWarns() { if (!window['AscDesktopEditor']) { var tips = []; @@ -636,6 +649,7 @@ define([ toolbarController.createDelayedElements(); documentHolderController.getView('DocumentHolder').createDelayedElements(); + me.setLanguages(); me.api.asc_registerCallback('asc_onUpdateLayout', _.bind(me.fillLayoutsStore, me)); // slide layouts loading me.updateThemeColors(); @@ -656,9 +670,11 @@ define([ Common.NotificationCenter.trigger('document:ready', 'main'); } }, 50); - } else if (me.appOptions.canBrandingExt) - Common.NotificationCenter.trigger('document:ready', 'main'); - + } else { + documentHolderController.getView('DocumentHolder').createDelayedElementsViewer(); + if (me.appOptions.canBrandingExt) + Common.NotificationCenter.trigger('document:ready', 'main'); + } if (this.appOptions.canAnalytics && false) Common.component.Analytics.initialize('UA-12442749-13', 'Presentation Editor'); @@ -891,7 +907,7 @@ define([ msg.msg = (msg.msg).toString(); this.showTips([msg.msg.charAt(0).toUpperCase() + msg.msg.substring(1)]); - Common.component.Analytics.trackEvent('External Error', msg.title); + Common.component.Analytics.trackEvent('External Error'); } }, @@ -1471,6 +1487,35 @@ define([ }, + loadLanguages: function(apiLangs) { + var langs = [], info; + _.each(apiLangs, function(lang, index, list){ + lang = parseInt(lang); + info = Common.util.LanguageInfo.getLocalLanguageName(lang); + langs.push({ + title: info[1], + tip: info[0], + code: lang + }); + }, this); + + langs.sort(function(a, b){ + if (a.tip < b.tip) return -1; + if (a.tip > b.tip) return 1; + return 0; + }); + + this.languages = langs; + window.styles_loaded && this.setLanguages(); + }, + + setLanguages: function() { + if (this.languages && this.languages.length>0) { + this.getApplication().getController('DocumentHolder').getView('DocumentHolder').setLanguages(this.languages); + this.getApplication().getController('Statusbar').setLanguages(this.languages); + } + }, + onTryUndoInFastCollaborative: function() { var val = window.localStorage.getItem("pe-hide-try-undoredo"); if (!(val && parseInt(val) == 1)) diff --git a/apps/presentationeditor/main/app/controller/Statusbar.js b/apps/presentationeditor/main/app/controller/Statusbar.js index ae5e6480a..1b903c601 100644 --- a/apps/presentationeditor/main/app/controller/Statusbar.js +++ b/apps/presentationeditor/main/app/controller/Statusbar.js @@ -42,7 +42,9 @@ define([ 'core', - 'presentationeditor/main/app/view/Statusbar' + 'presentationeditor/main/app/view/Statusbar', + 'common/main/lib/util/LanguageInfo', + 'common/main/lib/view/LanguageDialog' ], function () { 'use strict'; @@ -55,7 +57,11 @@ define([ initialize: function() { this.addListeners({ + 'FileMenu': { + 'settings:apply': _.bind(this.applySettings, this) + }, 'Statusbar': { + 'langchanged': this.onLangMenu } }); this._state = { @@ -67,7 +73,8 @@ define([ events: function() { return { 'click #btn-zoom-down': _.bind(this.zoomDocument,this,'down'), - 'click #btn-zoom-up': _.bind(this.zoomDocument,this,'up') + 'click #btn-zoom-up': _.bind(this.zoomDocument,this,'up'), + 'click #btn-doc-lang':_.bind(this.onBtnLanguage,this) }; }, @@ -85,11 +92,13 @@ define([ this.statusbar.btnZoomToWidth.on('click', _.bind(this.onBtnZoomTo, this, 'towidth')); this.statusbar.zoomMenu.on('item:click', _.bind(this.menuZoomClick, this)); this.statusbar.btnPreview.on('click', _.bind(this.onPreview, this)); + this.statusbar.btnSetSpelling.on('click', _.bind(this.onBtnSpelling, this)); }, setApi: function(api) { this.api = api; this.api.asc_registerCallback('asc_onZoomChange', _.bind(this._onZoomChange, this)); + this.api.asc_registerCallback('asc_onTextLanguage', _.bind(this._onTextLanguage, this)); this.statusbar.setApi(api); }, @@ -177,6 +186,20 @@ define([ } }, + _onTextLanguage: function(langId) { + var info = Common.util.LanguageInfo.getLocalLanguageName(langId); + this.statusbar.setLanguage({ + tip: info[0], + title: info[1], + code: langId + }); + }, + + setLanguages: function(langs) { + this.langs = langs; + this.statusbar.reloadLanguages(langs); + }, + setStatusCaption: function(text, force, delay) { if (this.timerCaption && ( ((new Date()) < this.timerCaption) || text.length==0 ) && !force ) return; @@ -191,9 +214,49 @@ define([ }, createDelayedElements: function() { + var value = Common.localStorage.getItem("pe-settings-spellcheck"); + this.statusbar.btnSetSpelling.toggle(value===null || parseInt(value) == 1, true); + this.statusbar.$el.css('z-index', ''); }, + onBtnLanguage: function() { + var langs = _.map(this.langs, function(item){ + return { + displayValue: item.title, + value: item.tip, + code: item.code + } + }); + + var me = this; + (new Common.Views.LanguageDialog({ + languages: langs, + current: me.api.asc_getDefaultLanguage(), + handler: function(result, tip) { + if (result=='ok') { + var record = _.findWhere(langs, {'value':tip}); + record && me.api.asc_setDefaultLanguage(record.code); + } + } + })).show(); + }, + + onLangMenu: function(obj, langid, title) { + this.api.put_TextPrLang(langid); + }, + + onBtnSpelling: function(d, b, e) { + Common.localStorage.setItem("pe-settings-spellcheck", d.pressed ? 1 : 0); + this.api.asc_setSpellCheck(d.pressed); + Common.NotificationCenter.trigger('edit:complete', this.statusbar); + }, + + applySettings: function(menu) { + var value = Common.localStorage.getItem("pe-settings-spellcheck"); + this.statusbar.btnSetSpelling.toggle(value===null || parseInt(value) == 1, true); + }, + zoomText : 'Zoom {0}%' }, PE.Controllers.Statusbar || {})); }); \ No newline at end of file diff --git a/apps/presentationeditor/main/app/controller/Toolbar.js b/apps/presentationeditor/main/app/controller/Toolbar.js index 8fc9a531a..44cb29368 100644 --- a/apps/presentationeditor/main/app/controller/Toolbar.js +++ b/apps/presentationeditor/main/app/controller/Toolbar.js @@ -1718,7 +1718,7 @@ define([ store: this.getApplication().getCollection('Common.Collections.TextArt'), parentMenu: this.toolbar.mnuInsertTextArt.menu, showLast: false, - itemTemplate: _.template('
    ') + itemTemplate: _.template('
    ') }); this.toolbar.mnuTextArtPicker.on('item:click', function(picker, item, record, e) { diff --git a/apps/presentationeditor/main/app/template/ShapeSettingsAdvanced.template b/apps/presentationeditor/main/app/template/ShapeSettingsAdvanced.template index 383731222..2b7149a8c 100644 --- a/apps/presentationeditor/main/app/template/ShapeSettingsAdvanced.template +++ b/apps/presentationeditor/main/app/template/ShapeSettingsAdvanced.template @@ -94,6 +94,24 @@
    +
    +
    + + + + + + + +
    + +
    +
    + +
    +
    +
    +
    diff --git a/apps/presentationeditor/main/app/template/StatusBar.template b/apps/presentationeditor/main/app/template/StatusBar.template index 362782ca5..7ccedcc5b 100644 --- a/apps/presentationeditor/main/app/template/StatusBar.template +++ b/apps/presentationeditor/main/app/template/StatusBar.template @@ -27,6 +27,16 @@
    +
    + + + +
    diff --git a/apps/presentationeditor/main/app/view/DocumentHolder.js b/apps/presentationeditor/main/app/view/DocumentHolder.js index 8d0a4054e..8704cd7d8 100644 --- a/apps/presentationeditor/main/app/view/DocumentHolder.js +++ b/apps/presentationeditor/main/app/view/DocumentHolder.js @@ -64,6 +64,8 @@ define([ me.fastcoauthtips = []; me._currentMathObj = undefined; me._currentParaObjDisabled = false; + me._currentSpellObj = undefined; + me._currLang = {}; /** coauthoring begin **/ var usersStore = PE.getCollection('Common.Collections.Users'); @@ -159,6 +161,10 @@ define([ if ( (menu_props.shapeProps && menu_props.shapeProps.value || menu_props.chartProps && menu_props.chartProps.value)&& // text in shape, need to show paragraph menu with vertical align _.isUndefined(menu_props.tableProps)) menu_to_show = me.textMenu; + } else if (Asc.c_oAscTypeSelectElement.SpellCheck == elType) { + menu_props.spellProps = {}; + menu_props.spellProps.value = elValue; + me._currentSpellObj = elValue; } else if (Asc.c_oAscTypeSelectElement.Math == elType) { menu_props.mathProps = {}; menu_props.mathProps.value = elValue; @@ -175,10 +181,34 @@ define([ return {menu_to_show: menu_to_show, menu_props: menu_props}; }; - + + var fillViewMenuProps = function(selectedElements) { + if (!selectedElements || !_.isArray(selectedElements)) return; + + var menu_props = {}, + menu_to_show = null; + _.each(selectedElements, function(element, index) { + var elType = element.get_ObjectType(), + elValue = element.get_ObjectValue(); + + if (Asc.c_oAscTypeSelectElement.Image == elType || Asc.c_oAscTypeSelectElement.Table == elType || Asc.c_oAscTypeSelectElement.Shape == elType || + Asc.c_oAscTypeSelectElement.Chart == elType || Asc.c_oAscTypeSelectElement.Paragraph == elType) { + menu_to_show = me.viewModeMenu; + menu_props.locked = menu_props.locked || ((elValue) ? elValue.get_Locked() : false); + if (Asc.c_oAscTypeSelectElement.Chart == elType) + menu_props.isChart = true; + } + else if (Asc.c_oAscTypeSelectElement.Slide == elType) { + menu_props.locked = menu_props.locked || ((elValue) ? elValue.get_LockDelete() : false); + } + }); + + return (menu_to_show) ? {menu_to_show: menu_to_show, menu_props: menu_props} : null; + }; + var showObjectMenu = function(event, docElement, eOpts){ - if (me.api && me.mode.isEdit){ - var obj = fillMenuProps(me.api.getSelectedElements()); + if (me.api){ + var obj = (me.mode.isEdit) ? fillMenuProps(me.api.getSelectedElements()) : fillViewMenuProps(me.api.getSelectedElements()); if (obj) showPopupMenu(obj.menu_to_show, obj.menu_props, event, docElement, eOpts); } }; @@ -194,14 +224,14 @@ define([ }; var onFocusObject = function(selectedElements) { - if (me.mode.isEdit && me.currentMenu && me.currentMenu.isVisible()){ + if (me.currentMenu && me.currentMenu.isVisible()){ if (me.api.asc_getCurrentFocusObject() === 0 ){ // thumbnails if (me.slideMenu===me.currentMenu) { me.currentMenu.options.initMenu({isSlideSelect: me.slideMenu.items[2].isVisible(), fromThumbs: true}); me.currentMenu.alignPosition(); } } else { - var obj = fillMenuProps(selectedElements); + var obj = (me.mode.isEdit) ? fillMenuProps(selectedElements) : fillViewMenuProps(selectedElements); if (obj) { if (obj.menu_to_show===me.currentMenu) { me.currentMenu.options.initMenu(obj.menu_props); @@ -639,6 +669,129 @@ define([ } }; + var onTextLanguage = function(langid) { + me._currLang.id = langid; + }; + + this.changeLanguageMenu = function(menu) { + var i; + if (me._currLang.id===null || me._currLang.id===undefined) { + for (i=0; i 0) { + moreMenu.setVisible(variants.length > 3); + moreMenu.setDisabled(me._currentParaObjDisabled); + + _.each(variants, function(variant, index) { + var mnu = new Common.UI.MenuItem({ + caption : variant, + spellword : true, + disabled : me._currentParaObjDisabled + }).on('click', function(item, e) { + if (me.api) { + me.api.asc_replaceMisspelledWord(item.caption, me._currentSpellObj); + me.fireEvent('editcomplete', me); + } + }); + + (index < 3) ? arr.push(mnu) : arrMore.push(mnu); + }); + + if (arr.length > 0) { + if (isParagraph) { + _.each(arr, function(variant){ + me.textMenu.insertItem(0, variant); + }) + } else { + _.each(arr, function(variant){ + me.menuSpellCheckTable.menu.insertItem(0, variant); + }) + } + } + + if (arrMore.length > 0) { + _.each(arrMore, function(variant){ + moreMenu.menu.insertItem(0, variant); + }); + } + + spellMenu.setVisible(false); + } else { + moreMenu.setVisible(false); + spellMenu.setVisible(true); + spellMenu.setCaption(me.noSpellVariantsText, true); + } + }; + + this.clearWordVariants = function(isParagraph) { + var spellMenu = (isParagraph) ? me.textMenu : me.menuSpellCheckTable.menu; + + for (var i = 0; i < spellMenu.items.length; i++) { + if (spellMenu.items[i].options.spellword) { + if (spellMenu.checkeditem == spellMenu.items[i]) { + spellMenu.checkeditem = undefined; + spellMenu.activeItem = undefined; + } + + spellMenu.removeItem(spellMenu.items[i]); + i--; + } + } + (isParagraph) ? me.menuSpellMorePara.menu.removeAll() : me.menuSpellMoreTable.menu.removeAll(); + + me.menuSpellMorePara.menu.checkeditem = undefined; + me.menuSpellMorePara.menu.activeItem = undefined; + me.menuSpellMoreTable.menu.checkeditem = undefined; + me.menuSpellMoreTable.menu.activeItem = undefined; + }; + this.initEquationMenu = function() { if (!me._currentMathObj) return; var type = me._currentMathObj.get_Type(), @@ -1349,9 +1502,11 @@ define([ if (me.mode.isEdit===true) { me.api.asc_registerCallback('asc_onDialogAddHyperlink', _.bind(onDialogAddHyperlink, me)); me.api.asc_registerCallback('asc_doubleClickOnChart', onDoubleClickOnChart); + me.api.asc_registerCallback('asc_onSpellCheckVariantsFound', _.bind(onSpellCheckVariantsFound, me)); } me.api.asc_registerCallback('asc_onCoAuthoringDisconnect', _.bind(onCoAuthoringDisconnect, me)); Common.NotificationCenter.on('api:disconnect', _.bind(onCoAuthoringDisconnect, me)); + me.api.asc_registerCallback('asc_onTextLanguage', _.bind(onTextLanguage, me)); me.api.asc_registerCallback('asc_onShowForeignCursorLabel', _.bind(onShowForeignCursorLabel, me)); me.api.asc_registerCallback('asc_onHideForeignCursorLabel', _.bind(onHideForeignCursorLabel, me)); @@ -1367,6 +1522,7 @@ define([ if (me.api && mode.isEdit) { me.api.asc_registerCallback('asc_onDialogAddHyperlink', _.bind(onDialogAddHyperlink, me)); me.api.asc_registerCallback('asc_doubleClickOnChart', onDoubleClickOnChart); + me.api.asc_registerCallback('asc_onSpellCheckVariantsFound', _.bind(onSpellCheckVariantsFound, me)); } me.mode = mode; @@ -1535,6 +1691,53 @@ define([ } }, + createDelayedElementsViewer: function() { + var me = this; + + var menuViewCopy = new Common.UI.MenuItem({ + caption: me.textCopy, + value: 'copy' + }).on('click', _.bind(me.onCutCopyPaste, me)); + + var menuViewUndo = new Common.UI.MenuItem({ + caption: me.textUndo + }).on('click', function () { + me.api.Undo(); + }); + + var menuViewCopySeparator = new Common.UI.MenuItem({ + caption: '--' + }); + + var menuViewAddComment = new Common.UI.MenuItem({ + caption: me.addCommentText + }).on('click', _.bind(me.addComment, me)); + + this.viewModeMenu = new Common.UI.Menu({ + initMenu: function (value) { + menuViewUndo.setVisible(me.mode.isEdit); + menuViewCopySeparator.setVisible(!value.isChart && me.api.can_AddQuotedComment() !== false && me.mode.canCoAuthoring && me.mode.canComments && me.mode.isEdit); + menuViewAddComment.setVisible(!value.isChart && me.api.can_AddQuotedComment() !== false && me.mode.canCoAuthoring && me.mode.canComments && me.mode.isEdit); + menuViewAddComment.setDisabled(value.locked); + }, + items: [ + menuViewCopy, + menuViewUndo, + menuViewCopySeparator, + menuViewAddComment + ] + }).on('hide:after', function (menu, e, isFromInputControl) { + if (me.suppressEditComplete) { + me.suppressEditComplete = false; + return; + } + + if (!isFromInputControl) me.fireEvent('editcomplete', me); + me.currentMenu = null; + }); + + }, + createDelayedElements: function(){ var me = this; @@ -1771,19 +1974,19 @@ define([ menuAlign: 'tl-tr', items: [ me.menuTableCellTop = new Common.UI.MenuItem({ - caption : me.topCellText, + caption : me.textShapeAlignTop, checkable : true, toggleGroup : 'popuptablecellalign', value : Asc.c_oAscVertAlignJc.Top }).on('click', _.bind(onItemClick, me)), me.menuTableCellCenter = new Common.UI.MenuItem({ - caption : me.centerCellText, + caption : me.textShapeAlignMiddle, checkable : true, toggleGroup : 'popuptablecellalign', value : Asc.c_oAscVertAlignJc.Center }).on('click', _.bind(onItemClick, me)), me.menuTableCellBottom = new Common.UI.MenuItem({ - caption : me.bottomCellText, + caption : me.textShapeAlignBottom, checkable : true, toggleGroup : 'popuptablecellalign', value : Asc.c_oAscVertAlignJc.Bottom @@ -1793,6 +1996,123 @@ define([ })() }); + me.menuSpellTable = new Common.UI.MenuItem({ + caption : me.loadSpellText, + disabled : true + }); + + me.menuSpellMoreTable = new Common.UI.MenuItem({ + caption : me.moreText, + menu : new Common.UI.Menu({ + menuAlign: 'tl-tr', + items : [ + ] + }) + }); + + me.langTableMenu = new Common.UI.MenuItem({ + caption : me.langText, + menu : new Common.UI.Menu({ + menuAlign: 'tl-tr', + maxHeight: 300, + items : [ + ] + }).on('show:after', function(menu) { + // TODO: scroll to checked item + }) + }); + + var menuIgnoreSpellTable = new Common.UI.MenuItem({ + caption : me.ignoreSpellText + }).on('click', function(item) { + if (me.api) { + me.api.asc_ignoreMisspelledWord(me._currentSpellObj, false); + me.fireEvent('editcomplete', me); + } + }); + + var menuIgnoreAllSpellTable = new Common.UI.MenuItem({ + caption : me.ignoreAllSpellText + }).on('click', function(menu) { + if (me.api) { + me.api.asc_ignoreMisspelledWord(me._currentSpellObj, true); + me.fireEvent('editcomplete', me); + } + }); + + var menuIgnoreSpellTableSeparator = new Common.UI.MenuItem({ + caption : '--' + }); + + var menuSpellcheckTableSeparator = new Common.UI.MenuItem({ + caption : '--' + }); + + me.menuSpellCheckTable = new Common.UI.MenuItem({ + caption : me.spellcheckText, + menu : new Common.UI.Menu({ + menuAlign: 'tl-tr', + items : [ + me.menuSpellTable, + me.menuSpellMoreTable, + menuIgnoreSpellTableSeparator, + menuIgnoreSpellTable, + menuIgnoreAllSpellTable, + { caption: '--' }, + me.langTableMenu + ] + }) + }); + + me.menuSpellPara = new Common.UI.MenuItem({ + caption : me.loadSpellText, + disabled : true + }); + + me.menuSpellMorePara = new Common.UI.MenuItem({ + caption : me.moreText, + menu : new Common.UI.Menu({ + menuAlign: 'tl-tr', + style : 'max-height: 300px;', + items: [ + ] + }) + }); + + me.langParaMenu = new Common.UI.MenuItem({ + caption : me.langText, + menu : new Common.UI.Menu({ + menuAlign: 'tl-tr', + maxHeight: 300, + items : [ + ] + }).on('show:after', function(menu) { + // TODO: scroll to checked item + }) + }); + + var menuIgnoreSpellPara = new Common.UI.MenuItem({ + caption : me.ignoreSpellText + }).on('click', function(item, e) { + me.api.asc_ignoreMisspelledWord(me._currentSpellObj, false); + me.fireEvent('editcomplete', me); + }); + + var menuIgnoreAllSpellPara = new Common.UI.MenuItem({ + caption : me.ignoreAllSpellText + }).on('click', function(item, e) { + me.api.asc_ignoreMisspelledWord(me._currentSpellObj, true); + me.fireEvent('editcomplete', me); + }); + + var menuIgnoreSpellParaSeparator = new Common.UI.MenuItem({ + caption : '--' + }); + + var menuSpellcheckParaSeparator = new Common.UI.MenuItem({ + caption : '--' + }); + var menuTableAdvanced = new Common.UI.MenuItem({ caption : me.advancedTableText }).on('click', function(item) { @@ -2177,19 +2497,19 @@ define([ menuAlign: 'tl-tr', items: [ me.menuParagraphTop = new Common.UI.MenuItem({ - caption : me.topCellText, + caption : me.textShapeAlignTop, checkable : true, toggleGroup : 'popupparagraphvalign', value : Asc.c_oAscVAlign.Top }).on('click', _.bind(onItemClick, me)), me.menuParagraphCenter = new Common.UI.MenuItem({ - caption : me.centerCellText, + caption : me.textShapeAlignMiddle, checkable : true, toggleGroup : 'popupparagraphvalign', value : Asc.c_oAscVAlign.Center }).on('click', _.bind(onItemClick, me)), me.menuParagraphBottom = new Common.UI.MenuItem({ - caption : me.bottomCellText, + caption : me.textShapeAlignBottom, checkable : true, toggleGroup : 'popupparagraphvalign', value : Asc.c_oAscVAlign.Bottom @@ -2401,15 +2721,43 @@ define([ menuParaCut.setDisabled(disabled); menuParaPaste.setDisabled(disabled); + // spellCheck + me.menuSpellPara.setVisible(value.spellProps!==undefined && value.spellProps.value.get_Checked()===false); + menuSpellcheckParaSeparator.setVisible(value.spellProps!==undefined && value.spellProps.value.get_Checked()===false); + menuIgnoreSpellPara.setVisible(value.spellProps!==undefined && value.spellProps.value.get_Checked()===false); + menuIgnoreAllSpellPara.setVisible(value.spellProps!==undefined && value.spellProps.value.get_Checked()===false); + me.langParaMenu.setVisible(value.spellProps!==undefined && value.spellProps.value.get_Checked()===false); + me.langParaMenu.setDisabled(disabled); + menuIgnoreSpellParaSeparator.setVisible(value.spellProps!==undefined && value.spellProps.value.get_Checked()===false); + + if (value.spellProps!==undefined && value.spellProps.value.get_Checked()===false && value.spellProps.value.get_Variants() !== null && value.spellProps.value.get_Variants() !== undefined) { + me.addWordVariants(true); + } else { + me.menuSpellPara.setCaption(me.loadSpellText, true); + me.clearWordVariants(true); + me.menuSpellMorePara.setVisible(false); + } + if (me.langParaMenu.isVisible() && me._currLang.id !== me._currLang.paraid) { + me.changeLanguageMenu(me.langParaMenu.menu); + me._currLang.paraid = me._currLang.id; + } + //equation menu var eqlen = 0; if (isEquation) { - eqlen = me.addEquationMenu(true, 4); + eqlen = me.addEquationMenu(true, 11); } else - me.clearEquationMenu(true, 4); + me.clearEquationMenu(true, 11); menuEquationSeparator.setVisible(isEquation && eqlen>0); }, items: [ + me.menuSpellPara, + me.menuSpellMorePara, + menuSpellcheckParaSeparator, + menuIgnoreSpellPara, + menuIgnoreAllSpellPara, + me.langParaMenu, + menuIgnoreSpellParaSeparator, menuParaCut, menuParaCopy, menuParaPaste, @@ -2442,7 +2790,7 @@ define([ return; var isEquation= (value.mathProps && value.mathProps.value); - for (var i = 4; i < 14; i++) { + for (var i = 6; i < 16; i++) { me.tableMenu.items[i].setVisible(!isEquation); } @@ -2457,8 +2805,8 @@ define([ mnuTableSplit.setDisabled(value.tableProps.locked || disabled || !me.api.CheckBeforeSplitCells()); } - me.tableMenu.items[5].setDisabled(value.tableProps.locked || disabled); - me.tableMenu.items[6].setDisabled(value.tableProps.locked || disabled); + me.tableMenu.items[7].setDisabled(value.tableProps.locked || disabled); + me.tableMenu.items[8].setDisabled(value.tableProps.locked || disabled); menuTableCellAlign.setDisabled(value.tableProps.locked || disabled); menuTableAdvanced.setDisabled(value.tableProps.locked || disabled); @@ -2494,15 +2842,34 @@ define([ /** coauthoring end **/ menuHyperlinkSeparator.setVisible(menuAddHyperlinkTable.isVisible() || menuHyperlinkTable.isVisible() /** coauthoring begin **/|| menuAddCommentTable.isVisible()/** coauthoring end **/); + me.menuSpellCheckTable.setVisible(value.spellProps!==undefined && value.spellProps.value.get_Checked()===false); + menuSpellcheckTableSeparator.setVisible(value.spellProps!==undefined && value.spellProps.value.get_Checked()===false); + + me.langTableMenu.setDisabled(disabled); + if (value.spellProps!==undefined && value.spellProps.value.get_Checked()===false && value.spellProps.value.get_Variants() !== null && value.spellProps.value.get_Variants() !== undefined) { + me.addWordVariants(false); + } else { + me.menuSpellTable.setCaption(me.loadSpellText, true); + me.clearWordVariants(false); + me.menuSpellMoreTable.setVisible(false); + } + + if (me.menuSpellCheckTable.isVisible() && me._currLang.id !== me._currLang.tableid) { + me.changeLanguageMenu(me.langTableMenu.menu); + me._currLang.tableid = me._currLang.id; + } + //equation menu var eqlen = 0; if (isEquation) { - eqlen = me.addEquationMenu(false, 4); + eqlen = me.addEquationMenu(false, 6); menuHyperlinkSeparator.setVisible(menuHyperlinkSeparator.isVisible() && eqlen>0); } else - me.clearEquationMenu(false, 4); + me.clearEquationMenu(false, 6); }, items: [ + me.menuSpellCheckTable, + menuSpellcheckTableSeparator, menuTableCut, menuTableCopy, menuTablePaste, @@ -2679,6 +3046,53 @@ define([ }); }, + setLanguages: function(langs){ + var me = this; + + if (langs && langs.length > 0 && me.langParaMenu && me.langTableMenu) { + me.langParaMenu.menu.removeAll(); + me.langTableMenu.menu.removeAll(); + _.each(langs, function(lang, index){ + me.langParaMenu.menu.addItem(new Common.UI.MenuItem({ + caption : lang.title, + checkable : true, + toggleGroup : 'popupparalang', + langid : lang.code + }).on('click', function(item, e){ + if (me.api){ + if (!_.isUndefined(item.options.langid)) + me.api.put_TextPrLang(item.options.langid); + + me._currLang.paraid = item.options.langid; + me.langParaMenu.menu.currentCheckedItem = item; + + me.fireEvent('editcomplete', me); + } + })); + + me.langTableMenu.menu.addItem(new Common.UI.MenuItem({ + caption : lang.title, + checkable : true, + toggleGroup : 'popuptablelang', + langid : lang.code + }).on('click', function(item, e){ + if (me.api){ + if (!_.isUndefined(item.options.langid)) + me.api.put_TextPrLang(item.options.langid); + + me._currLang.tableid = item.options.langid; + me.langTableMenu.menu.currentCheckedItem = item; + + me.fireEvent('editcomplete', me); + } + })); + }); + + me.langTableMenu.menu.doLayout(); + me.langParaMenu.menu.doLayout(); + } + }, + insertRowAboveText : 'Row Above', insertRowBelowText : 'Row Below', insertColumnLeftText : 'Column Left', @@ -2730,9 +3144,6 @@ define([ txtDistribHor : 'Distribute Horizontally', txtDistribVert : 'Distribute Vertically', txtSlide : 'Slide', - topCellText : 'Align Top', - centerCellText : 'Align Center', - bottomCellText : 'Align Bottom', cellAlignText : 'Cell Vertical Alignment', advancedShapeText : 'Shape Advanced Settings', /** coauthoring begin **/ @@ -2751,8 +3162,8 @@ define([ textSlideSettings: 'Slide Settings', directionText: 'Text Direction', directHText: 'Horizontal', - direct90Text: 'Rotate at 90°', - direct270Text: 'Rotate at 270°', + direct90Text: 'Rotate Text Down', + direct270Text: 'Rotate Text Up', txtRemoveAccentChar: 'Remove accent character', txtBorderProps: 'Borders property', txtHideTop: 'Hide top border', @@ -2826,7 +3237,15 @@ define([ alignmentText: 'Alignment', leftText: 'Left', rightText: 'Right', - centerText: 'Center' + centerText: 'Center', + loadSpellText: 'Loading variants...', + ignoreAllSpellText: 'Ignore All', + ignoreSpellText: 'Ignore', + noSpellVariantsText: 'No variants', + moreText: 'More variants...', + spellcheckText: 'Spellcheck', + langText: 'Select Language', + textUndo: 'Undo' }, PE.Views.DocumentHolder || {})); }); \ No newline at end of file diff --git a/apps/presentationeditor/main/app/view/DocumentPreview.js b/apps/presentationeditor/main/app/view/DocumentPreview.js index 39119c2e8..3db0f8d63 100644 --- a/apps/presentationeditor/main/app/view/DocumentPreview.js +++ b/apps/presentationeditor/main/app/view/DocumentPreview.js @@ -100,7 +100,7 @@ define([ render: function () { var el = $(this.el), me = this; - el.html(_.template(this.template, { + el.html(_.template(this.template)({ scope: this })); diff --git a/apps/presentationeditor/main/app/view/FileMenuPanels.js b/apps/presentationeditor/main/app/view/FileMenuPanels.js index 2bf939bce..99d9f8f65 100644 --- a/apps/presentationeditor/main/app/view/FileMenuPanels.js +++ b/apps/presentationeditor/main/app/view/FileMenuPanels.js @@ -54,7 +54,8 @@ define([ formats: [[ {name: 'PDF', imgCls: 'pdf', type: Asc.c_oAscFileType.PDF}, - {name: 'PPTX', imgCls: 'pptx', type: Asc.c_oAscFileType.PPTX} + {name: 'PPTX', imgCls: 'pptx', type: Asc.c_oAscFileType.PPTX}, + {name: 'ODP', imgCls: 'odp', type: Asc.c_oAscFileType.ODP} ]], @@ -110,6 +111,10 @@ define([ template: _.template([ '
    ', + '', + '', + '', + '','', '', '', '', @@ -158,6 +163,11 @@ define([ render: function() { $(this.el).html(this.template({scope: this})); + this.chSpell = new Common.UI.CheckBox({ + el: $('#fms-chb-spell-check'), + labelText: this.strSpellCheckMode + }); + this.chInputMode = new Common.UI.CheckBox({ el: $('#fms-chb-input-mode'), labelText: this.strInputMode @@ -278,6 +288,9 @@ define([ var value = Common.localStorage.getItem("pe-settings-inputmode"); this.chInputMode.setValue(value!==null && parseInt(value) == 1); + value = Common.localStorage.getItem("pe-settings-spellcheck"); + this.chSpell.setValue(value===null || parseInt(value) == 1); + value = Common.localStorage.getItem("pe-settings-zoom"); value = (value!==null) ? parseInt(value) : (this.mode.customization && this.mode.customization.zoom ? parseInt(this.mode.customization.zoom) : -1); var item = this.cmbZoom.store.findWhere({value: value}); @@ -316,6 +329,7 @@ define([ }, applySettings: function() { + Common.localStorage.setItem("pe-settings-spellcheck", this.chSpell.isChecked() ? 1 : 0); Common.localStorage.setItem("pe-settings-inputmode", this.chInputMode.isChecked() ? 1 : 0); Common.localStorage.setItem("pe-settings-zoom", this.cmbZoom.getValue()); /** coauthoring begin **/ @@ -365,7 +379,9 @@ define([ txtInch: 'Inch', txtFitWidth: 'Fit to Width', textForceSave: 'Save to Server', - strForcesave: 'Always save to server (otherwise save to server on document close)' + strForcesave: 'Always save to server (otherwise save to server on document close)', + txtSpellCheck: 'Spell Checking', + strSpellCheckMode: 'Turn on spell checking option' }, PE.Views.FileMenuPanels.Settings || {})); PE.Views.FileMenuPanels.RecentFiles = Common.UI.BaseView.extend({ diff --git a/apps/presentationeditor/main/app/view/HyperlinkSettingsDialog.js b/apps/presentationeditor/main/app/view/HyperlinkSettingsDialog.js index 6561093d6..4d79ef530 100644 --- a/apps/presentationeditor/main/app/view/HyperlinkSettingsDialog.js +++ b/apps/presentationeditor/main/app/view/HyperlinkSettingsDialog.js @@ -103,7 +103,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); this.slides = this.options.slides; this.api = this.options.api; diff --git a/apps/presentationeditor/main/app/view/ShapeSettings.js b/apps/presentationeditor/main/app/view/ShapeSettings.js index f06f575a6..dadf43a91 100644 --- a/apps/presentationeditor/main/app/view/ShapeSettings.js +++ b/apps/presentationeditor/main/app/view/ShapeSettings.js @@ -1234,6 +1234,18 @@ define([ this.sldrGradient.on('thumbdblclick', function(cmp){ me.btnGradColor.cmpEl.find('button').dropdown('toggle'); }); + this.sldrGradient.on('sortthumbs', function(cmp, recalc_indexes){ + var colors = [], + currentIdx; + _.each (recalc_indexes, function(recalc_index, index) { + colors.push(me.GradColor.colors[recalc_index]); + if (me.GradColor.currentIdx == recalc_index) + currentIdx = index; + }); + me.OriginalFillType = null; + me.GradColor.colors = colors; + me.GradColor.currentIdx = currentIdx; + }); this.fillControls.push(this.sldrGradient); this.cmbBorderSize = new Common.UI.ComboBorderSizeEditable({ diff --git a/apps/presentationeditor/main/app/view/ShapeSettingsAdvanced.js b/apps/presentationeditor/main/app/view/ShapeSettingsAdvanced.js index 23b932e68..5eefb5b7b 100644 --- a/apps/presentationeditor/main/app/view/ShapeSettingsAdvanced.js +++ b/apps/presentationeditor/main/app/view/ShapeSettingsAdvanced.js @@ -63,6 +63,7 @@ define([ 'text!presentationeditor/main/app/template/ShapeSettingsAdvanced.tem {panelId: 'id-adv-shape-width', panelCaption: this.textSize}, {panelId: 'id-adv-shape-shape', panelCaption: this.textWeightArrows}, {panelId: 'id-adv-shape-margins', panelCaption: this.strMargins}, + {panelId: 'id-adv-shape-columns', panelCaption: this.strColumns}, {panelId: 'id-adv-shape-alttext', panelCaption: this.textAlt} ], contentTemplate: _.template(contentTemplate)({ @@ -411,6 +412,37 @@ define([ 'text!presentationeditor/main/app/template/ShapeSettingsAdvanced.tem this.mnuEndSizePicker.on('item:click', _.bind(this.onSelectEndSize, this)); this._selectStyleItem(this.btnEndSize, null); + // Columns + + this.spnColumns = new Common.UI.MetricSpinner({ + el: $('#shape-columns-number'), + step: 1, + width: 100, + defaultUnit : "", + value: '1', + maxValue: 16, + minValue: 1 + }); + this.spnColumns.on('change', _.bind(function(field, newValue, oldValue, eOpts){ + if (this._changedProps) + this._changedProps.asc_putColumnNumber(field.getNumberValue()); + }, this)); + + this.spnSpacing = new Common.UI.MetricSpinner({ + el: $('#shape-columns-spacing'), + step: .1, + width: 100, + defaultUnit : "cm", + value: '0 cm', + maxValue: 40.64, + minValue: 0 + }); + this.spnSpacing.on('change', _.bind(function(field, newValue, oldValue, eOpts){ + if (this._changedProps) + this._changedProps.asc_putColumnSpace(Common.Utils.Metric.fnRecalcToMM(field.getNumberValue())); + }, this)); + this.spinners.push(this.spnSpacing); + // Alt Text this.inputAltTitle = new Common.UI.InputField({ @@ -468,6 +500,12 @@ define([ 'text!presentationeditor/main/app/template/ShapeSettingsAdvanced.tem } this.btnsCategory[2].setDisabled(null === margins); // Margins + value = props.asc_getColumnNumber(); + this.spnColumns.setValue((null !== value && undefined !== value) ? value : '', true); + + value = props.asc_getColumnSpace(); + this.spnSpacing.setValue((null !== value && undefined !== value) ? Common.Utils.Metric.fnRecalcFromMM(value) : '', true); + value = props.asc_getTitle(); this.inputAltTitle.setValue(value ? value : ''); @@ -681,7 +719,10 @@ define([ 'text!presentationeditor/main/app/template/ShapeSettingsAdvanced.tem textAlt: 'Alternative Text', textAltTitle: 'Title', textAltDescription: 'Description', - textAltTip: 'The alternative text-based representation of the visual object information, which will be read to the people with vision or cognitive impairments to help them better understand what information there is in the image, autoshape, chart or table.' + textAltTip: 'The alternative text-based representation of the visual object information, which will be read to the people with vision or cognitive impairments to help them better understand what information there is in the image, autoshape, chart or table.', + strColumns: 'Columns', + textSpacing: 'Spacing between columns', + textColNumber: 'Number of columns' }, PE.Views.ShapeSettingsAdvanced || {})); }); \ No newline at end of file diff --git a/apps/presentationeditor/main/app/view/SlideSettings.js b/apps/presentationeditor/main/app/view/SlideSettings.js index faf85e79a..a691fa1d4 100644 --- a/apps/presentationeditor/main/app/view/SlideSettings.js +++ b/apps/presentationeditor/main/app/view/SlideSettings.js @@ -755,6 +755,18 @@ define([ this.sldrGradient.on('thumbdblclick', function(cmp){ me.btnGradColor.cmpEl.find('button').dropdown('toggle'); }); + this.sldrGradient.on('sortthumbs', function(cmp, recalc_indexes){ + var colors = [], + currentIdx; + _.each (recalc_indexes, function(recalc_index, index) { + colors.push(me.GradColor.colors[recalc_index]); + if (me.GradColor.currentIdx == recalc_index) + currentIdx = index; + }); + me.OriginalFillType = null; + me.GradColor.colors = colors; + me.GradColor.currentIdx = currentIdx; + }); this.FillItems.push(this.sldrGradient); }, @@ -1430,7 +1442,7 @@ define([ }, strColor : 'Color', - strFill : 'Fill', + strFill : 'Background', textColor : 'Color Fill', textImageTexture : 'Picture or Texture', textTexture : 'From Texture', diff --git a/apps/presentationeditor/main/app/view/SlideSizeSettings.js b/apps/presentationeditor/main/app/view/SlideSizeSettings.js index 09a499c65..77ec2b563 100644 --- a/apps/presentationeditor/main/app/view/SlideSizeSettings.js +++ b/apps/presentationeditor/main/app/view/SlideSizeSettings.js @@ -87,7 +87,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); this.spinners = []; this._noApply = false; diff --git a/apps/presentationeditor/main/app/view/SlideshowSettings.js b/apps/presentationeditor/main/app/view/SlideshowSettings.js index d0ce309c2..41bc3ef22 100644 --- a/apps/presentationeditor/main/app/view/SlideshowSettings.js +++ b/apps/presentationeditor/main/app/view/SlideshowSettings.js @@ -68,7 +68,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); this.spinners = []; this._noApply = false; diff --git a/apps/presentationeditor/main/app/view/Statusbar.js b/apps/presentationeditor/main/app/view/Statusbar.js index 6723eae1f..3e295333e 100644 --- a/apps/presentationeditor/main/app/view/Statusbar.js +++ b/apps/presentationeditor/main/app/view/Statusbar.js @@ -66,6 +66,19 @@ define([ Common.Utils.String.format(this.pageIndexText, model.get('current'), model.get('count')) ); } + function _clickLanguage(menu, item, state) { + var $parent = menu.$el.parent(); + + $parent.find('#status-label-lang').text(item.caption); + $parent.find('.dropdown-toggle > .icon-lang-flag') + .removeClass(this.langMenu.prevTip) + .addClass(item.value.tip); + + this.langMenu.prevTip = item.value.tip; + + this.fireEvent('langchanged', [this, item.value.code, item.caption]); + } + PE.Views.Statusbar = Backbone.View.extend(_.extend({ el: '#statusbar', template: _.template(template), @@ -80,7 +93,7 @@ define([ templateUserList: _.template(''), @@ -271,6 +284,62 @@ define([ hintAnchor: 'top' }); + this.btnDocLanguage = new Common.UI.Button({ + el: $('#btn-doc-lang',this.el), + hint: this.tipSetDocLang, + hintAnchor: 'top', + disabled: true + }); + + this.btnSetSpelling = new Common.UI.Button({ + el: $('#btn-doc-spell',this.el), + enableToggle: true, + hint: this.tipSetSpelling, + hintAnchor: 'top' + }); + + var panelLang = $('.cnt-lang',this.el); + this.langMenu = new Common.UI.Menu({ + style: 'margin-top:-5px;', + maxHeight: 300, + itemTemplate: _.template([ + '', + '', + '<%= caption %>', + '' + ].join('')), + menuAlign: 'bl-tl' + }); + + this.btnLanguage = new Common.UI.Button({ + el: panelLang, + hint: this.tipSetLang, + hintAnchor: 'top-left', + disabled: true + }); + this.btnLanguage.cmpEl.on({ + 'show.bs.dropdown': function () { + _.defer(function(){ + me.btnLanguage.cmpEl.find('ul').focus(); + }, 100); + }, + 'hide.bs.dropdown': function () { + _.defer(function(){ + me.api.asc_enableKeyEvents(true); + }, 100); + }, + 'click': function (e) { + if (me.btnLanguage.isDisabled()) { + return false; + } + } + }); + + this.langMenu.render(panelLang); + this.langMenu.cmpEl.attr({tabindex: -1}); + this.langMenu.prevTip = 'en'; + this.langMenu.on('item:click', _.bind(_clickLanguage,this)); + return this; }, @@ -338,7 +407,7 @@ define([ _onAddUser: function(m, c, opts) { if (this.panelUsersList) { - this.panelUsersList.find('ul').append(_.template(this.tplUser, {user: m, scope: this})); + this.panelUsersList.find('ul').append(_.template(this.tplUser)({user: m, scope: this})); this.panelUsersList.scroller.update({minScrollbarLength : 40, alwaysVisibleY: true}); } }, @@ -375,6 +444,49 @@ define([ $('#status-label-action').text(''); }, + reloadLanguages: function(array) { + this.langMenu.removeAll(); + _.each(array, function(item) { + this.langMenu.addItem({ + iconCls : item['tip'], + caption : item['title'], + value : {tip: item['tip'], code: item['code']}, + checkable : true, + checked : this.langMenu.saved == item.title, + toggleGroup : 'language' + }); + }, this); + + this.langMenu.doLayout(); + if (this.langMenu.items.length>0) { + this.btnLanguage.setDisabled(false); + this.btnDocLanguage.setDisabled(false); + } + }, + + setLanguage: function(info) { + if (this.langMenu.prevTip != info.tip && info.code !== undefined) { + var $parent = $(this.langMenu.el.parentNode, this.$el); + $parent.find('.dropdown-toggle > .icon-lang-flag') + .removeClass(this.langMenu.prevTip) + .addClass(info.tip); + + this.langMenu.prevTip = info.tip; + + $parent.find('#status-label-lang').text(info.title); + + var index = $parent.find('ul li a:contains("'+info.title+'")').parent().index(); + index < 0 ? this.langMenu.saved = info.title : + this.langMenu.items[index-1].setChecked(true); + } + }, + + SetDisabled: function(disable) { + var langs = this.langMenu.items.length>0; + this.btnLanguage.setDisabled(disable || !langs); + this.btnDocLanguage.setDisabled(disable || !langs); + }, + pageIndexText : 'Slide {0} of {1}', goToPageText : 'Go to Slide', tipUsers : 'Document is currently being edited by several users.', @@ -389,7 +501,10 @@ define([ tipPreview : 'Start Slideshow', tipAccessRights : 'Manage document access rights', tipViewUsers : 'View users and manage document access rights', - txAccessRights : 'Change access rights' + txAccessRights : 'Change access rights', + tipSetLang : 'Set Text Language', + tipSetDocLang : 'Set Document Language', + tipSetSpelling : 'Spell checking' }, PE.Views.Statusbar || {})); } ); \ No newline at end of file diff --git a/apps/presentationeditor/main/app/view/TextArtSettings.js b/apps/presentationeditor/main/app/view/TextArtSettings.js index 7aee796d9..a51b3d261 100644 --- a/apps/presentationeditor/main/app/view/TextArtSettings.js +++ b/apps/presentationeditor/main/app/view/TextArtSettings.js @@ -1224,6 +1224,18 @@ define([ this.sldrGradient.on('thumbdblclick', function(cmp){ me.btnGradColor.cmpEl.find('button').dropdown('toggle'); }); + this.sldrGradient.on('sortthumbs', function(cmp, recalc_indexes){ + var colors = [], + currentIdx; + _.each (recalc_indexes, function(recalc_index, index) { + colors.push(me.GradColor.colors[recalc_index]); + if (me.GradColor.currentIdx == recalc_index) + currentIdx = index; + }); + me.OriginalFillType = null; + me.GradColor.colors = colors; + me.GradColor.currentIdx = currentIdx; + }); this.lockedControls.push(this.sldrGradient); this.cmbBorderSize = new Common.UI.ComboBorderSizeEditable({ diff --git a/apps/presentationeditor/main/app/view/Toolbar.js b/apps/presentationeditor/main/app/view/Toolbar.js index 56a3cb5dd..2e1980430 100644 --- a/apps/presentationeditor/main/app/view/Toolbar.js +++ b/apps/presentationeditor/main/app/view/Toolbar.js @@ -1182,7 +1182,7 @@ define([ this.btnNumbers.setMenu( new Common.UI.Menu({ items: [ - { template: _.template('') } + { template: _.template('') } ] }) ); @@ -1229,19 +1229,19 @@ define([ this.mnuNumbersPicker = new Common.UI.DataView({ el: $('#id-toolbar-menu-numbering'), parentMenu: this.btnNumbers.menu, - restoreHeight: 164, + restoreHeight: 92, allowScrollbar: false, store: new Common.UI.DataViewStore([ { offsety: 0, data:{type:1,subtype:-1} }, - { offsety: 296, data:{type:1,subtype:4} }, - { offsety: 370, data:{type:1,subtype:5} }, - { offsety: 444, data:{type:1,subtype:6} }, - { offsety: 74, data:{type:1,subtype:1} }, - { offsety: 148, data:{type:1,subtype:2} }, - { offsety: 222, data:{type:1,subtype:3} }, - { offsety: 518, data:{type:1,subtype:7} } + {offsety: 570, data: {type: 1, subtype: 4}}, + {offsety: 532, data: {type: 1, subtype: 5}}, + {offsety: 608, data: {type: 1, subtype: 6}}, + {offsety: 418, data: {type: 1, subtype: 1}}, + {offsety: 456, data: {type: 1, subtype: 2}}, + {offsety: 494, data: {type: 1, subtype: 3}}, + {offsety: 646, data: {type: 1, subtype: 7}} ]), - itemTemplate: _.template('
    ') + itemTemplate: _.template('
    ') }); _conf && this.mnuNumbersPicker.selectByIndex(_conf.index, true); diff --git a/apps/presentationeditor/main/app_dev.js b/apps/presentationeditor/main/app_dev.js index 56aea9616..bca5796fa 100644 --- a/apps/presentationeditor/main/app_dev.js +++ b/apps/presentationeditor/main/app_dev.js @@ -54,8 +54,6 @@ require.config({ jmousewheel : '../vendor/perfect-scrollbar/src/jquery.mousewheel', xregexp : '../vendor/xregexp/xregexp-all-min', sockjs : '../vendor/sockjs/sockjs.min', - jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', api : 'api/documents/api', core : 'common/main/lib/core/application', notification : 'common/main/lib/core/NotificationCenter', @@ -121,8 +119,6 @@ require([ 'analytics', 'gateway', 'locale', - 'jsziputils', - 'jsrsasign', 'sockjs', 'xregexp', 'underscore' diff --git a/apps/presentationeditor/main/locale/de.json b/apps/presentationeditor/main/locale/de.json index 52b389339..8c5675bf4 100644 --- a/apps/presentationeditor/main/locale/de.json +++ b/apps/presentationeditor/main/locale/de.json @@ -94,6 +94,9 @@ "Common.Views.InsertTableDialog.txtMinText": "Der minimale Wert für dieses Feld ist {0}.", "Common.Views.InsertTableDialog.txtRows": "Anzahl von Zeilen\t", "Common.Views.InsertTableDialog.txtTitle": "Größe der Tabelle", + "Common.Views.LanguageDialog.btnCancel": "Abbrechen", + "Common.Views.LanguageDialog.btnOk": "OK", + "Common.Views.LanguageDialog.labelSelect": "Sprache des Dokuments wählen", "Common.Views.OpenDialog.cancelButtonText": "Abbrechen", "Common.Views.OpenDialog.okButtonText": "OK", "Common.Views.OpenDialog.txtEncoding": "Verschlüsselung", @@ -621,13 +624,15 @@ "PE.Views.DocumentHolder.deleteRowText": "Zeile löschen", "PE.Views.DocumentHolder.deleteTableText": "Tabelle löschen", "PE.Views.DocumentHolder.deleteText": "Löschen", - "PE.Views.DocumentHolder.direct270Text": "Um 270° drehen", - "PE.Views.DocumentHolder.direct90Text": "Um 90° drehen ", + "PE.Views.DocumentHolder.direct270Text": "Text nach oben drehen", + "PE.Views.DocumentHolder.direct90Text": "Text nach unten drehen", "PE.Views.DocumentHolder.directHText": "Horizontal", "PE.Views.DocumentHolder.directionText": "Textausrichtung\t", "PE.Views.DocumentHolder.editChartText": "Daten ändern", "PE.Views.DocumentHolder.editHyperlinkText": "Hyperlink bearbeiten", "PE.Views.DocumentHolder.hyperlinkText": "Hyperlink", + "PE.Views.DocumentHolder.ignoreAllSpellText": "Alle auslassen", + "PE.Views.DocumentHolder.ignoreSpellText": "Auslassen", "PE.Views.DocumentHolder.insertColumnLeftText": "Spalte nach links", "PE.Views.DocumentHolder.insertColumnRightText": "Spalte nach rechts", "PE.Views.DocumentHolder.insertColumnText": "Spalte einfügen", @@ -635,13 +640,18 @@ "PE.Views.DocumentHolder.insertRowBelowText": "Zeile unterhalb", "PE.Views.DocumentHolder.insertRowText": "Zeile einfügen", "PE.Views.DocumentHolder.insertText": "Einfügen", + "PE.Views.DocumentHolder.langText": "Sprache wählen", "PE.Views.DocumentHolder.leftText": "Links", + "PE.Views.DocumentHolder.loadSpellText": "Varianten werden geladen...", "PE.Views.DocumentHolder.mergeCellsText": "Zellen verbinden", + "PE.Views.DocumentHolder.moreText": "Mehr Varianten...", + "PE.Views.DocumentHolder.noSpellVariantsText": "Keine Varianten", "PE.Views.DocumentHolder.originalSizeText": "Standardgröße", "PE.Views.DocumentHolder.removeHyperlinkText": "Hyperlink entfernen", "PE.Views.DocumentHolder.rightText": "Rechts", "PE.Views.DocumentHolder.rowText": "Zeile", "PE.Views.DocumentHolder.selectText": "Wählen", + "PE.Views.DocumentHolder.spellcheckText": "Rechtschreibprüfung", "PE.Views.DocumentHolder.splitCellsText": "Zelle teilen...", "PE.Views.DocumentHolder.splitCellTitleText": "Zelle teilen", "PE.Views.DocumentHolder.tableText": "Tabelle", @@ -800,6 +810,7 @@ "PE.Views.FileMenuPanels.Settings.strForcesave": "Immer auf dem Server speichern (ansonsten auf dem Server beim Schließen des Dokuments speichern)", "PE.Views.FileMenuPanels.Settings.strInputMode": "Hieroglyphen einschalten", "PE.Views.FileMenuPanels.Settings.strShowChanges": "Änderungen bei der Echtzeit-Zusammenarbeit zeigen", + "PE.Views.FileMenuPanels.Settings.strSpellCheckMode": "Rechtschreibprüfung einschalten", "PE.Views.FileMenuPanels.Settings.strStrict": "Formal", "PE.Views.FileMenuPanels.Settings.strUnit": "Maßeinheit", "PE.Views.FileMenuPanels.Settings.strZoom": "Standard-Zoom-Wert", @@ -821,6 +832,7 @@ "PE.Views.FileMenuPanels.Settings.txtInput": "Eingabe ändern", "PE.Views.FileMenuPanels.Settings.txtLast": "Letzte anzeigen", "PE.Views.FileMenuPanels.Settings.txtPt": "Punkt", + "PE.Views.FileMenuPanels.Settings.txtSpellCheck": "Rechtschreibprüfung", "PE.Views.HyperlinkSettingsDialog.cancelButtonText": "Abbrechen", "PE.Views.HyperlinkSettingsDialog.okButtonText": "OK", "PE.Views.HyperlinkSettingsDialog.strDisplay": "Anzeigen", @@ -964,6 +976,7 @@ "PE.Views.ShapeSettings.txtWood": "Holz", "PE.Views.ShapeSettingsAdvanced.cancelButtonText": "Abbrechen", "PE.Views.ShapeSettingsAdvanced.okButtonText": "OK", + "PE.Views.ShapeSettingsAdvanced.strColumns": "Spalten", "PE.Views.ShapeSettingsAdvanced.strMargins": "Ränder um den Text", "PE.Views.ShapeSettingsAdvanced.textAlt": "Der alternative Text", "PE.Views.ShapeSettingsAdvanced.textAltDescription": "Beschreibung", @@ -975,6 +988,7 @@ "PE.Views.ShapeSettingsAdvanced.textBevel": "Schräge Kante", "PE.Views.ShapeSettingsAdvanced.textBottom": "Unten", "PE.Views.ShapeSettingsAdvanced.textCapType": "Abschlusstyp", + "PE.Views.ShapeSettingsAdvanced.textColNumber": "Anzahl von Spalten\t", "PE.Views.ShapeSettingsAdvanced.textEndSize": "Endgröße", "PE.Views.ShapeSettingsAdvanced.textEndStyle": "Endlinienart", "PE.Views.ShapeSettingsAdvanced.textFlat": "Flach", @@ -987,6 +1001,7 @@ "PE.Views.ShapeSettingsAdvanced.textRight": "Rechts", "PE.Views.ShapeSettingsAdvanced.textRound": "Rund", "PE.Views.ShapeSettingsAdvanced.textSize": "Größe", + "PE.Views.ShapeSettingsAdvanced.textSpacing": "Abstand zwischen Spalten", "PE.Views.ShapeSettingsAdvanced.textSquare": "Eckig", "PE.Views.ShapeSettingsAdvanced.textTitle": "Form - Erweiterte Einstellungen", "PE.Views.ShapeSettingsAdvanced.textTop": "Oben", @@ -998,7 +1013,7 @@ "PE.Views.SlideSettings.strDelay": "Verzögern", "PE.Views.SlideSettings.strDuration": "Dauer", "PE.Views.SlideSettings.strEffect": "Effekt", - "PE.Views.SlideSettings.strFill": "Füllung", + "PE.Views.SlideSettings.strFill": "Hintergrund", "PE.Views.SlideSettings.strForeground": "Vordergrundfarbe", "PE.Views.SlideSettings.strPattern": "Muster", "PE.Views.SlideSettings.strStartOnClick": "Bei Klicken beginnen", @@ -1098,6 +1113,9 @@ "PE.Views.Statusbar.tipFitWidth": "Breite anpassen", "PE.Views.Statusbar.tipMoreUsers": "und %1 Benutzer.", "PE.Views.Statusbar.tipPreview": "Vorschau starten", + "PE.Views.Statusbar.tipSetDocLang": "Sprache des Dokumentes festlegen", + "PE.Views.Statusbar.tipSetLang": "Textsprache wählen", + "PE.Views.Statusbar.tipSetSpelling": "Rechtschreibprüfung", "PE.Views.Statusbar.tipShowUsers": "Um alle Benutzer zu sehen, klicken Sie auf dieses Symbol.", "PE.Views.Statusbar.tipUsers": "Das Dokument wird gerade von mehreren Benutzern bearbeitet.", "PE.Views.Statusbar.tipViewUsers": "Benutzer ansehen und Zugriffsrechte für das Dokument verwalten", diff --git a/apps/presentationeditor/main/locale/en.json b/apps/presentationeditor/main/locale/en.json index c123204d5..4bd9ac839 100644 --- a/apps/presentationeditor/main/locale/en.json +++ b/apps/presentationeditor/main/locale/en.json @@ -94,6 +94,9 @@ "Common.Views.InsertTableDialog.txtMinText": "The minimum value for this field is {0}.", "Common.Views.InsertTableDialog.txtRows": "Number of Rows", "Common.Views.InsertTableDialog.txtTitle": "Table Size", + "Common.Views.LanguageDialog.btnCancel": "Cancel", + "Common.Views.LanguageDialog.btnOk": "Ok", + "Common.Views.LanguageDialog.labelSelect": "Select document language", "Common.Views.OpenDialog.cancelButtonText": "Cancel", "Common.Views.OpenDialog.okButtonText": "OK", "Common.Views.OpenDialog.txtEncoding": "Encoding ", @@ -611,23 +614,25 @@ "PE.Views.DocumentHolder.advancedTableText": "Table Advanced Settings", "PE.Views.DocumentHolder.alignmentText": "Alignment", "PE.Views.DocumentHolder.belowText": "Below", - "PE.Views.DocumentHolder.bottomCellText": "Align Bottom", + "del_PE.Views.DocumentHolder.bottomCellText": "Align Bottom", "PE.Views.DocumentHolder.cellAlignText": "Cell Vertical Alignment", "PE.Views.DocumentHolder.cellText": "Cell", - "PE.Views.DocumentHolder.centerCellText": "Align Center", + "del_PE.Views.DocumentHolder.centerCellText": "Align Center", "PE.Views.DocumentHolder.centerText": "Center", "PE.Views.DocumentHolder.columnText": "Column", "PE.Views.DocumentHolder.deleteColumnText": "Delete Column", "PE.Views.DocumentHolder.deleteRowText": "Delete Row", "PE.Views.DocumentHolder.deleteTableText": "Delete Table", "PE.Views.DocumentHolder.deleteText": "Delete", - "PE.Views.DocumentHolder.direct270Text": "Rotate at 270°", - "PE.Views.DocumentHolder.direct90Text": "Rotate at 90°", + "PE.Views.DocumentHolder.direct270Text": "Rotate Text Up", + "PE.Views.DocumentHolder.direct90Text": "Rotate Text Down", "PE.Views.DocumentHolder.directHText": "Horizontal", "PE.Views.DocumentHolder.directionText": "Text Direction", "PE.Views.DocumentHolder.editChartText": "Edit Data", "PE.Views.DocumentHolder.editHyperlinkText": "Edit Hyperlink", "PE.Views.DocumentHolder.hyperlinkText": "Hyperlink", + "PE.Views.DocumentHolder.ignoreAllSpellText": "Ignore All", + "PE.Views.DocumentHolder.ignoreSpellText": "Ignore", "PE.Views.DocumentHolder.insertColumnLeftText": "Column Left", "PE.Views.DocumentHolder.insertColumnRightText": "Column Right", "PE.Views.DocumentHolder.insertColumnText": "Insert Column", @@ -635,13 +640,18 @@ "PE.Views.DocumentHolder.insertRowBelowText": "Row Below", "PE.Views.DocumentHolder.insertRowText": "Insert Row", "PE.Views.DocumentHolder.insertText": "Insert", + "PE.Views.DocumentHolder.langText": "Select Language", "PE.Views.DocumentHolder.leftText": "Left", + "PE.Views.DocumentHolder.loadSpellText": "Loading variants...", "PE.Views.DocumentHolder.mergeCellsText": "Merge Cells", + "PE.Views.DocumentHolder.moreText": "More variants...", + "PE.Views.DocumentHolder.noSpellVariantsText": "No variants", "PE.Views.DocumentHolder.originalSizeText": "Default Size", "PE.Views.DocumentHolder.removeHyperlinkText": "Remove Hyperlink", "PE.Views.DocumentHolder.rightText": "Right", "PE.Views.DocumentHolder.rowText": "Row", "PE.Views.DocumentHolder.selectText": "Select", + "PE.Views.DocumentHolder.spellcheckText": "Spellcheck", "PE.Views.DocumentHolder.splitCellsText": "Split Cell...", "PE.Views.DocumentHolder.splitCellTitleText": "Split Cell", "PE.Views.DocumentHolder.tableText": "Table", @@ -662,7 +672,7 @@ "PE.Views.DocumentHolder.textShapeAlignTop": "Align Top", "PE.Views.DocumentHolder.textSlideSettings": "Slide Settings", "PE.Views.DocumentHolder.tipIsLocked": "This element is currently being edited by another user.", - "PE.Views.DocumentHolder.topCellText": "Align Top", + "del_PE.Views.DocumentHolder.topCellText": "Align Top", "PE.Views.DocumentHolder.txtAddBottom": "Add bottom border", "PE.Views.DocumentHolder.txtAddFractionBar": "Add fraction bar", "PE.Views.DocumentHolder.txtAddHor": "Add horizontal line", @@ -749,6 +759,7 @@ "PE.Views.DocumentHolder.txtUnderbar": "Bar under text", "PE.Views.DocumentHolder.txtUngroup": "Ungroup", "PE.Views.DocumentHolder.vertAlignText": "Vertical Alignment", + "PE.Views.DocumentHolder.textUndo": "Undo", "PE.Views.DocumentPreview.goToSlideText": "Go to Slide", "PE.Views.DocumentPreview.slideIndexText": "Slide {0} of {1}", "PE.Views.DocumentPreview.txtClose": "Close Slideshow", @@ -800,6 +811,7 @@ "PE.Views.FileMenuPanels.Settings.strForcesave": "Always save to server (otherwise save to server on document close)", "PE.Views.FileMenuPanels.Settings.strInputMode": "Turn on hieroglyphs", "PE.Views.FileMenuPanels.Settings.strShowChanges": "Realtime Collaboration Changes", + "PE.Views.FileMenuPanels.Settings.strSpellCheckMode": "Turn on spell checking option", "PE.Views.FileMenuPanels.Settings.strStrict": "Strict", "PE.Views.FileMenuPanels.Settings.strUnit": "Unit of Measurement", "PE.Views.FileMenuPanels.Settings.strZoom": "Default Zoom Value", @@ -821,6 +833,7 @@ "PE.Views.FileMenuPanels.Settings.txtInput": "Alternate Input", "PE.Views.FileMenuPanels.Settings.txtLast": "View Last", "PE.Views.FileMenuPanels.Settings.txtPt": "Point", + "PE.Views.FileMenuPanels.Settings.txtSpellCheck": "Spell Checking", "PE.Views.HyperlinkSettingsDialog.cancelButtonText": "Cancel", "PE.Views.HyperlinkSettingsDialog.okButtonText": "OK", "PE.Views.HyperlinkSettingsDialog.strDisplay": "Display", @@ -964,6 +977,7 @@ "PE.Views.ShapeSettings.txtWood": "Wood", "PE.Views.ShapeSettingsAdvanced.cancelButtonText": "Cancel", "PE.Views.ShapeSettingsAdvanced.okButtonText": "OK", + "PE.Views.ShapeSettingsAdvanced.strColumns": "Columns", "PE.Views.ShapeSettingsAdvanced.strMargins": "Text Padding", "PE.Views.ShapeSettingsAdvanced.textAlt": "Alternative Text", "PE.Views.ShapeSettingsAdvanced.textAltDescription": "Description", @@ -975,6 +989,7 @@ "PE.Views.ShapeSettingsAdvanced.textBevel": "Bevel", "PE.Views.ShapeSettingsAdvanced.textBottom": "Bottom", "PE.Views.ShapeSettingsAdvanced.textCapType": "Cap Type", + "PE.Views.ShapeSettingsAdvanced.textColNumber": "Number of columns", "PE.Views.ShapeSettingsAdvanced.textEndSize": "End Size", "PE.Views.ShapeSettingsAdvanced.textEndStyle": "End Style", "PE.Views.ShapeSettingsAdvanced.textFlat": "Flat", @@ -987,6 +1002,7 @@ "PE.Views.ShapeSettingsAdvanced.textRight": "Right", "PE.Views.ShapeSettingsAdvanced.textRound": "Round", "PE.Views.ShapeSettingsAdvanced.textSize": "Size", + "PE.Views.ShapeSettingsAdvanced.textSpacing": "Spacing between columns", "PE.Views.ShapeSettingsAdvanced.textSquare": "Square", "PE.Views.ShapeSettingsAdvanced.textTitle": "Shape - Advanced Settings", "PE.Views.ShapeSettingsAdvanced.textTop": "Top", @@ -998,7 +1014,7 @@ "PE.Views.SlideSettings.strDelay": "Delay", "PE.Views.SlideSettings.strDuration": "Duration", "PE.Views.SlideSettings.strEffect": "Effect", - "PE.Views.SlideSettings.strFill": "Fill", + "PE.Views.SlideSettings.strFill": "Background", "PE.Views.SlideSettings.strForeground": "Foreground color", "PE.Views.SlideSettings.strPattern": "Pattern", "PE.Views.SlideSettings.strStartOnClick": "Start On Click", @@ -1098,6 +1114,9 @@ "PE.Views.Statusbar.tipFitWidth": "Fit to Width", "PE.Views.Statusbar.tipMoreUsers": "and %1 users.", "PE.Views.Statusbar.tipPreview": "Start Slideshow", + "PE.Views.Statusbar.tipSetDocLang": "Set Document Language", + "PE.Views.Statusbar.tipSetLang": "Set Text Language", + "PE.Views.Statusbar.tipSetSpelling": "Spell checking", "PE.Views.Statusbar.tipShowUsers": "To see all users click the icon below.", "PE.Views.Statusbar.tipUsers": "Document is currently being edited by several users.", "PE.Views.Statusbar.tipViewUsers": "View users and manage document access rights", diff --git a/apps/presentationeditor/main/locale/fr.json b/apps/presentationeditor/main/locale/fr.json index a0ca2a6d0..7acfb639f 100644 --- a/apps/presentationeditor/main/locale/fr.json +++ b/apps/presentationeditor/main/locale/fr.json @@ -94,6 +94,9 @@ "Common.Views.InsertTableDialog.txtMinText": "La valeur minimale pour ce champ est {0}.", "Common.Views.InsertTableDialog.txtRows": "Nombre de lignes", "Common.Views.InsertTableDialog.txtTitle": "Taille du tableau", + "Common.Views.LanguageDialog.btnCancel": "Annuler", + "Common.Views.LanguageDialog.btnOk": "Ok", + "Common.Views.LanguageDialog.labelSelect": "Sélectionner la langue du document", "Common.Views.OpenDialog.cancelButtonText": "Annuler", "Common.Views.OpenDialog.okButtonText": "OK", "Common.Views.OpenDialog.txtEncoding": "Codage ", @@ -113,7 +116,7 @@ "PE.Controllers.LeftMenu.textNoTextFound": "Votre recherche n'a donné aucun résultat.S'il vous plaît, modifiez vos critères de recherche.", "PE.Controllers.Main.applyChangesTextText": "Chargement des données...", "PE.Controllers.Main.applyChangesTitleText": "Chargement des données", - "PE.Controllers.Main.convertationTimeoutText": "Expiration du délai de conversion.", + "PE.Controllers.Main.convertationTimeoutText": "Délai de conversion expiré.", "PE.Controllers.Main.criticalErrorExtText": "Cliquez sur \"OK\" pour revenir à la liste des documents.", "PE.Controllers.Main.criticalErrorTitle": "Erreur", "PE.Controllers.Main.defaultTitleText": "ONLYOFFICE Presentation Editor", @@ -132,8 +135,8 @@ "PE.Controllers.Main.errorKeyExpire": "Descripteur de clés expiré", "PE.Controllers.Main.errorProcessSaveResult": "Échec de l'enregistrement", "PE.Controllers.Main.errorServerVersion": "La version de l'éditeur a été mise à jour. La page sera rechargée pour appliquer les modifications.", - "PE.Controllers.Main.errorSessionAbsolute": "La session de la modification de document a expiré.Veuillez recharger la page.", - "PE.Controllers.Main.errorSessionIdle": "Le document n'est pas modifié depuis longtemps. Veuillez recharger la page.", + "PE.Controllers.Main.errorSessionAbsolute": "Votre session a expiré. Veuillez recharger la page.", + "PE.Controllers.Main.errorSessionIdle": "Le document n'a pas été modifié depuis trop longtemps. Veuillez recharger la page.", "PE.Controllers.Main.errorSessionToken": "La connexion au serveur a été interrompue. Veuillez recharger la page.", "PE.Controllers.Main.errorStockChart": "L'ordre des lignes est incorrect. Pour créer un graphique boursier organisez vos données sur la feuille de calcul dans l'ordre suivant:
    cours à l'ouverture, cours maximal, cours minimal, cours à la clôture.", "PE.Controllers.Main.errorToken": "Le jeton de sécurité du document n’était pas formé correctement.
    Veuillez contacter l'administrateur de Document Server.", @@ -621,13 +624,15 @@ "PE.Views.DocumentHolder.deleteRowText": "Supprimer la ligne", "PE.Views.DocumentHolder.deleteTableText": "Supprimer le tableau", "PE.Views.DocumentHolder.deleteText": "Supprimer", - "PE.Views.DocumentHolder.direct270Text": "Rotate at 270°", - "PE.Views.DocumentHolder.direct90Text": "Rotate at 90°", + "PE.Views.DocumentHolder.direct270Text": "Rotation du texte vers le haut", + "PE.Views.DocumentHolder.direct90Text": "Rotation du texte vers le bas", "PE.Views.DocumentHolder.directHText": "Horizontal", "PE.Views.DocumentHolder.directionText": "Orientation du texte", "PE.Views.DocumentHolder.editChartText": "Modifier les données", "PE.Views.DocumentHolder.editHyperlinkText": "Modifier le lien hypertexte", "PE.Views.DocumentHolder.hyperlinkText": "Lien hypertexte", + "PE.Views.DocumentHolder.ignoreAllSpellText": "Ignorer tout", + "PE.Views.DocumentHolder.ignoreSpellText": "Ignorer", "PE.Views.DocumentHolder.insertColumnLeftText": "Colonne à gauche", "PE.Views.DocumentHolder.insertColumnRightText": "Colonne à droite", "PE.Views.DocumentHolder.insertColumnText": "Insérer une colonne", @@ -635,13 +640,18 @@ "PE.Views.DocumentHolder.insertRowBelowText": "Ligne en dessous", "PE.Views.DocumentHolder.insertRowText": "Insérer une ligne", "PE.Views.DocumentHolder.insertText": "Insérer", + "PE.Views.DocumentHolder.langText": "Sélectionner la langue", "PE.Views.DocumentHolder.leftText": "A gauche", + "PE.Views.DocumentHolder.loadSpellText": "Chargement des variantes en cours...", "PE.Views.DocumentHolder.mergeCellsText": "Fusionner les cellules", + "PE.Views.DocumentHolder.moreText": "Plus de variantes...", + "PE.Views.DocumentHolder.noSpellVariantsText": "Pas de variantes", "PE.Views.DocumentHolder.originalSizeText": "Taille par défaut", "PE.Views.DocumentHolder.removeHyperlinkText": "Supprimer le lien hypertexte", "PE.Views.DocumentHolder.rightText": "A droite", "PE.Views.DocumentHolder.rowText": "Ligne", "PE.Views.DocumentHolder.selectText": "Sélectionner", + "PE.Views.DocumentHolder.spellcheckText": "Vérification orthographique", "PE.Views.DocumentHolder.splitCellsText": "Fractionner la cellule...", "PE.Views.DocumentHolder.splitCellTitleText": "Fractionner la cellule", "PE.Views.DocumentHolder.tableText": "Tableau", @@ -799,7 +809,8 @@ "PE.Views.FileMenuPanels.Settings.strFast": "Rapide", "PE.Views.FileMenuPanels.Settings.strForcesave": "Toujours enregistrer sur le serveur ( sinon enregistrer sur le serveur lors de la fermeture du document )", "PE.Views.FileMenuPanels.Settings.strInputMode": "Activer les hiéroglyphes", - "PE.Views.FileMenuPanels.Settings.strShowChanges": "Changements de collaboration en temps réel", + "PE.Views.FileMenuPanels.Settings.strShowChanges": "Visibilité des modifications en co-édition", + "PE.Views.FileMenuPanels.Settings.strSpellCheckMode": "Activer l'option de vérification de l’orthographe", "PE.Views.FileMenuPanels.Settings.strStrict": "Strict", "PE.Views.FileMenuPanels.Settings.strUnit": "Unité de mesure", "PE.Views.FileMenuPanels.Settings.strZoom": "Valeur de zoom par défaut", @@ -813,7 +824,7 @@ "PE.Views.FileMenuPanels.Settings.textDisabled": "Désactivé", "PE.Views.FileMenuPanels.Settings.textForceSave": "Enregistrer sur le serveur", "PE.Views.FileMenuPanels.Settings.textMinute": "Chaque minute", - "PE.Views.FileMenuPanels.Settings.txtAll": "Tout", + "PE.Views.FileMenuPanels.Settings.txtAll": "Surligner toutes les modifications", "PE.Views.FileMenuPanels.Settings.txtCm": "Centimètre", "PE.Views.FileMenuPanels.Settings.txtFitSlide": "Ajuster à la diapositive", "PE.Views.FileMenuPanels.Settings.txtFitWidth": "Ajuster à la largeur", @@ -821,6 +832,7 @@ "PE.Views.FileMenuPanels.Settings.txtInput": "Entrée alternative", "PE.Views.FileMenuPanels.Settings.txtLast": "Derniers", "PE.Views.FileMenuPanels.Settings.txtPt": "Point", + "PE.Views.FileMenuPanels.Settings.txtSpellCheck": "Vérification de l'orthographe", "PE.Views.HyperlinkSettingsDialog.cancelButtonText": "Annuler", "PE.Views.HyperlinkSettingsDialog.okButtonText": "Ok", "PE.Views.HyperlinkSettingsDialog.strDisplay": "Afficher", @@ -890,7 +902,7 @@ "PE.Views.ParagraphSettingsAdvanced.noTabs": "The specified tabs will appear in this field", "PE.Views.ParagraphSettingsAdvanced.okButtonText": "OK", "PE.Views.ParagraphSettingsAdvanced.strAllCaps": "Majuscules", - "PE.Views.ParagraphSettingsAdvanced.strDoubleStrike": "Barré double", + "PE.Views.ParagraphSettingsAdvanced.strDoubleStrike": "Double barré", "PE.Views.ParagraphSettingsAdvanced.strIndentsFirstLine": "Première ligne", "PE.Views.ParagraphSettingsAdvanced.strIndentsLeftText": "A gauche", "PE.Views.ParagraphSettingsAdvanced.strIndentsRightText": "A droite", @@ -964,6 +976,7 @@ "PE.Views.ShapeSettings.txtWood": "Bois", "PE.Views.ShapeSettingsAdvanced.cancelButtonText": "Annuler", "PE.Views.ShapeSettingsAdvanced.okButtonText": "OK", + "PE.Views.ShapeSettingsAdvanced.strColumns": "Colonnes", "PE.Views.ShapeSettingsAdvanced.strMargins": "Marges intérieures", "PE.Views.ShapeSettingsAdvanced.textAlt": "Texte de remplacement", "PE.Views.ShapeSettingsAdvanced.textAltDescription": "Description", @@ -975,6 +988,7 @@ "PE.Views.ShapeSettingsAdvanced.textBevel": "Biseau", "PE.Views.ShapeSettingsAdvanced.textBottom": "En bas", "PE.Views.ShapeSettingsAdvanced.textCapType": "Type de lettrine", + "PE.Views.ShapeSettingsAdvanced.textColNumber": "Nombre de colonnes", "PE.Views.ShapeSettingsAdvanced.textEndSize": "Taille de fin", "PE.Views.ShapeSettingsAdvanced.textEndStyle": "Style de fin", "PE.Views.ShapeSettingsAdvanced.textFlat": "Plat", @@ -987,6 +1001,7 @@ "PE.Views.ShapeSettingsAdvanced.textRight": "A droite", "PE.Views.ShapeSettingsAdvanced.textRound": "Arrondi", "PE.Views.ShapeSettingsAdvanced.textSize": "Taille", + "PE.Views.ShapeSettingsAdvanced.textSpacing": "Espacement entre les colonnes", "PE.Views.ShapeSettingsAdvanced.textSquare": "Carré", "PE.Views.ShapeSettingsAdvanced.textTitle": "Forme - Paramètres avancés", "PE.Views.ShapeSettingsAdvanced.textTop": "En haut", @@ -998,7 +1013,7 @@ "PE.Views.SlideSettings.strDelay": "Retard", "PE.Views.SlideSettings.strDuration": "Durée", "PE.Views.SlideSettings.strEffect": "Effet", - "PE.Views.SlideSettings.strFill": "Remplissage", + "PE.Views.SlideSettings.strFill": "Arrière-plan", "PE.Views.SlideSettings.strForeground": "Couleur de premier plan", "PE.Views.SlideSettings.strPattern": "Modèle", "PE.Views.SlideSettings.strStartOnClick": "Démarrer en cliquant", @@ -1098,6 +1113,9 @@ "PE.Views.Statusbar.tipFitWidth": "Ajuster à la largeur", "PE.Views.Statusbar.tipMoreUsers": "et %1 utilisateurs.", "PE.Views.Statusbar.tipPreview": "Démarrer le diaporama", + "PE.Views.Statusbar.tipSetDocLang": "Définir la langue du document", + "PE.Views.Statusbar.tipSetLang": "Définir la langue du texte", + "PE.Views.Statusbar.tipSetSpelling": "Vérification de l'orthographe", "PE.Views.Statusbar.tipShowUsers": "Pour voir tous les utilisateurs cliquez sur l'icône au-dessous", "PE.Views.Statusbar.tipUsers": "Document est en cours d'édition par plusieurs utilisateurs.", "PE.Views.Statusbar.tipViewUsers": "Voyez les utilisateurs et gérez des droits d'accès aux documents ", diff --git a/apps/presentationeditor/main/locale/ru.json b/apps/presentationeditor/main/locale/ru.json index f21b58013..2e93a8334 100644 --- a/apps/presentationeditor/main/locale/ru.json +++ b/apps/presentationeditor/main/locale/ru.json @@ -94,6 +94,9 @@ "Common.Views.InsertTableDialog.txtMinText": "Минимальное значение для этого поля - {0}.", "Common.Views.InsertTableDialog.txtRows": "Количество строк", "Common.Views.InsertTableDialog.txtTitle": "Размер таблицы", + "Common.Views.LanguageDialog.btnCancel": "Отмена", + "Common.Views.LanguageDialog.btnOk": "Ок", + "Common.Views.LanguageDialog.labelSelect": "Выбрать язык документа", "Common.Views.OpenDialog.cancelButtonText": "Отмена", "Common.Views.OpenDialog.okButtonText": "OK", "Common.Views.OpenDialog.txtEncoding": "Кодировка", @@ -621,13 +624,15 @@ "PE.Views.DocumentHolder.deleteRowText": "Удалить строку", "PE.Views.DocumentHolder.deleteTableText": "Удалить таблицу", "PE.Views.DocumentHolder.deleteText": "Удалить", - "PE.Views.DocumentHolder.direct270Text": "Поворот на 270°", - "PE.Views.DocumentHolder.direct90Text": "Поворот на 90°", + "PE.Views.DocumentHolder.direct270Text": "Повернуть текст вверх", + "PE.Views.DocumentHolder.direct90Text": "Повернуть текст вниз", "PE.Views.DocumentHolder.directHText": "Горизонтальное", "PE.Views.DocumentHolder.directionText": "Направление текста", "PE.Views.DocumentHolder.editChartText": "Изменить данные", "PE.Views.DocumentHolder.editHyperlinkText": "Изменить гиперссылку", "PE.Views.DocumentHolder.hyperlinkText": "Гиперссылка", + "PE.Views.DocumentHolder.ignoreAllSpellText": "Пропустить все", + "PE.Views.DocumentHolder.ignoreSpellText": "Пропустить", "PE.Views.DocumentHolder.insertColumnLeftText": "Столбец слева", "PE.Views.DocumentHolder.insertColumnRightText": "Столбец справа", "PE.Views.DocumentHolder.insertColumnText": "Вставить столбец", @@ -635,13 +640,18 @@ "PE.Views.DocumentHolder.insertRowBelowText": "Строку ниже", "PE.Views.DocumentHolder.insertRowText": "Вставить строку", "PE.Views.DocumentHolder.insertText": "Добавить", + "PE.Views.DocumentHolder.langText": "Выбрать язык", "PE.Views.DocumentHolder.leftText": "По левому краю", + "PE.Views.DocumentHolder.loadSpellText": "Загрузка вариантов...", "PE.Views.DocumentHolder.mergeCellsText": "Объединить ячейки", + "PE.Views.DocumentHolder.moreText": "Больше вариантов...", + "PE.Views.DocumentHolder.noSpellVariantsText": "Нет вариантов", "PE.Views.DocumentHolder.originalSizeText": "Размер по умолчанию", "PE.Views.DocumentHolder.removeHyperlinkText": "Удалить гиперссылку", "PE.Views.DocumentHolder.rightText": "По правому краю", "PE.Views.DocumentHolder.rowText": "Строку", "PE.Views.DocumentHolder.selectText": "Выделить", + "PE.Views.DocumentHolder.spellcheckText": "Проверка орфографии", "PE.Views.DocumentHolder.splitCellsText": "Разделить ячейку...", "PE.Views.DocumentHolder.splitCellTitleText": "Разделить ячейку", "PE.Views.DocumentHolder.tableText": "Таблицу", @@ -800,6 +810,7 @@ "PE.Views.FileMenuPanels.Settings.strForcesave": "Всегда сохранять на сервере (в противном случае сохранять на сервере при закрытии документа)", "PE.Views.FileMenuPanels.Settings.strInputMode": "Включить иероглифы", "PE.Views.FileMenuPanels.Settings.strShowChanges": "Отображать изменения при совместной работе", + "PE.Views.FileMenuPanels.Settings.strSpellCheckMode": "Включить проверку орфографии", "PE.Views.FileMenuPanels.Settings.strStrict": "Строгий", "PE.Views.FileMenuPanels.Settings.strUnit": "Единица измерения", "PE.Views.FileMenuPanels.Settings.strZoom": "Стандартное значение масштаба", @@ -821,6 +832,7 @@ "PE.Views.FileMenuPanels.Settings.txtInput": "Альтернативный ввод", "PE.Views.FileMenuPanels.Settings.txtLast": "Последние", "PE.Views.FileMenuPanels.Settings.txtPt": "Пункт", + "PE.Views.FileMenuPanels.Settings.txtSpellCheck": "Проверка орфографии", "PE.Views.HyperlinkSettingsDialog.cancelButtonText": "Отмена", "PE.Views.HyperlinkSettingsDialog.okButtonText": "OK", "PE.Views.HyperlinkSettingsDialog.strDisplay": "Отображать", @@ -964,6 +976,7 @@ "PE.Views.ShapeSettings.txtWood": "Дерево", "PE.Views.ShapeSettingsAdvanced.cancelButtonText": "Отмена", "PE.Views.ShapeSettingsAdvanced.okButtonText": "OK", + "PE.Views.ShapeSettingsAdvanced.strColumns": "Столбцы", "PE.Views.ShapeSettingsAdvanced.strMargins": "Поля вокруг текста", "PE.Views.ShapeSettingsAdvanced.textAlt": "Альтернативный текст", "PE.Views.ShapeSettingsAdvanced.textAltDescription": "Описание", @@ -975,6 +988,7 @@ "PE.Views.ShapeSettingsAdvanced.textBevel": "Скошенный", "PE.Views.ShapeSettingsAdvanced.textBottom": "Снизу", "PE.Views.ShapeSettingsAdvanced.textCapType": "Тип окончания", + "PE.Views.ShapeSettingsAdvanced.textColNumber": "Количество столбцов", "PE.Views.ShapeSettingsAdvanced.textEndSize": "Конечный размер", "PE.Views.ShapeSettingsAdvanced.textEndStyle": "Конечный стиль", "PE.Views.ShapeSettingsAdvanced.textFlat": "Плоский", @@ -987,6 +1001,7 @@ "PE.Views.ShapeSettingsAdvanced.textRight": "Справа", "PE.Views.ShapeSettingsAdvanced.textRound": "Закругленный", "PE.Views.ShapeSettingsAdvanced.textSize": "Размер", + "PE.Views.ShapeSettingsAdvanced.textSpacing": "Интервал между столбцами", "PE.Views.ShapeSettingsAdvanced.textSquare": "Квадратный", "PE.Views.ShapeSettingsAdvanced.textTitle": "Фигура - Дополнительные параметры", "PE.Views.ShapeSettingsAdvanced.textTop": "Сверху", @@ -998,7 +1013,7 @@ "PE.Views.SlideSettings.strDelay": "Задержка", "PE.Views.SlideSettings.strDuration": "Длит.", "PE.Views.SlideSettings.strEffect": "Эффект", - "PE.Views.SlideSettings.strFill": "Заливка", + "PE.Views.SlideSettings.strFill": "Фон", "PE.Views.SlideSettings.strForeground": "Цвет переднего плана", "PE.Views.SlideSettings.strPattern": "Узор", "PE.Views.SlideSettings.strStartOnClick": "Запускать щелчком", @@ -1098,6 +1113,9 @@ "PE.Views.Statusbar.tipFitWidth": "По ширине", "PE.Views.Statusbar.tipMoreUsers": "и %1 пользователей.", "PE.Views.Statusbar.tipPreview": "Начать показ слайдов", + "PE.Views.Statusbar.tipSetDocLang": "Задать язык документа", + "PE.Views.Statusbar.tipSetLang": "Выбрать язык текста", + "PE.Views.Statusbar.tipSetSpelling": "Проверка орфографии", "PE.Views.Statusbar.tipShowUsers": "Чтобы увидеть всех пользователей, нажмите на значок ниже.", "PE.Views.Statusbar.tipUsers": "Документ редактируется несколькими пользователями.", "PE.Views.Statusbar.tipViewUsers": "Просмотр пользователей и управление правами доступа к документу", diff --git a/apps/presentationeditor/main/resources/help/en/HelpfulHints/KeyboardShortcuts.htm b/apps/presentationeditor/main/resources/help/en/HelpfulHints/KeyboardShortcuts.htm index b3d0339d5..c26920c68 100644 --- a/apps/presentationeditor/main/resources/help/en/HelpfulHints/KeyboardShortcuts.htm +++ b/apps/presentationeditor/main/resources/help/en/HelpfulHints/KeyboardShortcuts.htm @@ -199,16 +199,6 @@ - - - - - - - - - - diff --git a/apps/presentationeditor/main/resources/help/en/UsageInstructions/InsertAutoshapes.htm b/apps/presentationeditor/main/resources/help/en/UsageInstructions/InsertAutoshapes.htm index c8b4eb85f..341ae9f7c 100644 --- a/apps/presentationeditor/main/resources/help/en/UsageInstructions/InsertAutoshapes.htm +++ b/apps/presentationeditor/main/resources/help/en/UsageInstructions/InsertAutoshapes.htm @@ -78,6 +78,8 @@

    Shape Properties - Text Padding tab

    The Text Padding tab allows to change the autoshape Top, Bottom, Left and Right internal margins (i.e. the distance between the text within the shape and the autoshape borders).

    Note: this tab is only available if text is added within the autoshape, otherwise the tab is disabled.

    +

    Shape Properties - Alternative Text tab

    +

    The Alternative Text tab allows to specify a Title and Description which will be read to the people with vision or cognitive impairments to help them better understand what information there is in the shape.


    To replace the added autoshape, left-click it and use the Change Autoshape drop-down list at the Shape Settings tab of the right sidebar.

    To delete the added autoshape, left-click it and press the Delete key on the keyboard.

    diff --git a/apps/presentationeditor/main/resources/help/en/UsageInstructions/InsertCharts.htm b/apps/presentationeditor/main/resources/help/en/UsageInstructions/InsertCharts.htm index 5fde51e10..94879edc9 100644 --- a/apps/presentationeditor/main/resources/help/en/UsageInstructions/InsertCharts.htm +++ b/apps/presentationeditor/main/resources/help/en/UsageInstructions/InsertCharts.htm @@ -166,6 +166,8 @@ +

    Chart Settings window

    +

    The Alternative Text tab allows to specify a Title and Description which will be read to the people with vision or cognitive impairments to help them better understand what information there is in the chart.

  • once the chart is added you can also change its size and position.

    You can specify the chart position on the slide dragging it vertically or horizontally.

    diff --git a/apps/presentationeditor/main/resources/help/en/UsageInstructions/InsertImages.htm b/apps/presentationeditor/main/resources/help/en/UsageInstructions/InsertImages.htm index fe1194e22..70837ed6f 100644 --- a/apps/presentationeditor/main/resources/help/en/UsageInstructions/InsertImages.htm +++ b/apps/presentationeditor/main/resources/help/en/UsageInstructions/InsertImages.htm @@ -32,12 +32,14 @@

    Replace Image - is used to load another image instead of the current one selecting the desired source. You can select one of the options: From File or From URL.


    To change the advanced settings of the image, right-click the image and select the Image Advanced Settings option from the contextual menu or left-click the image and press the Show advanced settings link at the right sidebar. The image properties window will be opened:

    - Image Properties -

    Here you can set the following image properties:

    +

    Image Properties

    +

    The Placement tab allows you to set the following image properties:

    • Size - use this option to change the image width and/or height. If the Constant Proportions Constant Proportions icon button is clicked (in this case it looks like this Constant Proportions icon activated), the width and height will be changed together preserving the original image aspect ratio. To restore the default size of the added image, click the Default Size button.
    • Position - use this option to change the image position on the slide (the position is calculated from the top and the left side of the slide).
    • -
    + +

    Image Properties

    +

    The Alternative Text tab allows to specify a Title and Description which will be read to the people with vision or cognitive impairments to help them better understand what information there is in the image.


    To delete the inserted image, left-click it and press the Delete key on the keyboard.

    To learn how to align an image on the slide or arrange several images, refer to the Align and arrange objects on a slide section.

    diff --git a/apps/presentationeditor/main/resources/help/en/UsageInstructions/InsertTables.htm b/apps/presentationeditor/main/resources/help/en/UsageInstructions/InsertTables.htm index 8336bf153..5fd7d66fe 100644 --- a/apps/presentationeditor/main/resources/help/en/UsageInstructions/InsertTables.htm +++ b/apps/presentationeditor/main/resources/help/en/UsageInstructions/InsertTables.htm @@ -65,11 +65,13 @@

    To change the advanced table settings, click the table with the right mouse button and select the Table Advanced Settings option from the right-click menu or click the Show advanced settings link at the right sidebar. The table properties window will be opened:

    Table Properties

    -

    Here you can set the space between the text within the cells and the cell border:

    +

    The Margins tab allows to set the space between the text within the cells and the cell border:

    • enter necessary Cell Margins values manually, or
    • check the Use default margins box to apply the predefined values (if necessary, they can also be adjusted).
    +

    Table Properties

    +

    The Alternative Text tab allows to specify a Title and Description which will be read to the people with vision or cognitive impairments to help them better understand what information there is in the table.


    To format the entered text within the table cells, you can use icons at the top toolbar. The right-click menu that appears when you click the table with the right mouse button includes two additional options:

      diff --git a/apps/presentationeditor/main/resources/help/en/images/chartsettings.png b/apps/presentationeditor/main/resources/help/en/images/chartsettings.png index ab8d9d614..c66f2048e 100644 Binary files a/apps/presentationeditor/main/resources/help/en/images/chartsettings.png and b/apps/presentationeditor/main/resources/help/en/images/chartsettings.png differ diff --git a/apps/presentationeditor/main/resources/help/en/images/chartsettings2.png b/apps/presentationeditor/main/resources/help/en/images/chartsettings2.png index 8715b6bf6..d339be584 100644 Binary files a/apps/presentationeditor/main/resources/help/en/images/chartsettings2.png and b/apps/presentationeditor/main/resources/help/en/images/chartsettings2.png differ diff --git a/apps/presentationeditor/main/resources/help/en/images/chartsettings3.png b/apps/presentationeditor/main/resources/help/en/images/chartsettings3.png index b4ca9001a..bc85e0acf 100644 Binary files a/apps/presentationeditor/main/resources/help/en/images/chartsettings3.png and b/apps/presentationeditor/main/resources/help/en/images/chartsettings3.png differ diff --git a/apps/presentationeditor/main/resources/help/en/images/chartsettings4.png b/apps/presentationeditor/main/resources/help/en/images/chartsettings4.png index 4b3f83284..1ffbcc2a9 100644 Binary files a/apps/presentationeditor/main/resources/help/en/images/chartsettings4.png and b/apps/presentationeditor/main/resources/help/en/images/chartsettings4.png differ diff --git a/apps/presentationeditor/main/resources/help/en/images/chartsettings5.png b/apps/presentationeditor/main/resources/help/en/images/chartsettings5.png new file mode 100644 index 000000000..eeb6305e6 Binary files /dev/null and b/apps/presentationeditor/main/resources/help/en/images/chartsettings5.png differ diff --git a/apps/presentationeditor/main/resources/help/en/images/image_properties.png b/apps/presentationeditor/main/resources/help/en/images/image_properties.png index 283d284be..2e813179e 100644 Binary files a/apps/presentationeditor/main/resources/help/en/images/image_properties.png and b/apps/presentationeditor/main/resources/help/en/images/image_properties.png differ diff --git a/apps/presentationeditor/main/resources/help/en/images/image_properties1.png b/apps/presentationeditor/main/resources/help/en/images/image_properties1.png new file mode 100644 index 000000000..8b38b00f5 Binary files /dev/null and b/apps/presentationeditor/main/resources/help/en/images/image_properties1.png differ diff --git a/apps/presentationeditor/main/resources/help/en/images/shape_properties.png b/apps/presentationeditor/main/resources/help/en/images/shape_properties.png index 34193a362..d94a0525d 100644 Binary files a/apps/presentationeditor/main/resources/help/en/images/shape_properties.png and b/apps/presentationeditor/main/resources/help/en/images/shape_properties.png differ diff --git a/apps/presentationeditor/main/resources/help/en/images/shape_properties1.png b/apps/presentationeditor/main/resources/help/en/images/shape_properties1.png index 528189018..88e17172b 100644 Binary files a/apps/presentationeditor/main/resources/help/en/images/shape_properties1.png and b/apps/presentationeditor/main/resources/help/en/images/shape_properties1.png differ diff --git a/apps/presentationeditor/main/resources/help/en/images/shape_properties3.png b/apps/presentationeditor/main/resources/help/en/images/shape_properties3.png index 4813cc478..bbcd69fce 100644 Binary files a/apps/presentationeditor/main/resources/help/en/images/shape_properties3.png and b/apps/presentationeditor/main/resources/help/en/images/shape_properties3.png differ diff --git a/apps/presentationeditor/main/resources/help/en/images/shape_properties4.png b/apps/presentationeditor/main/resources/help/en/images/shape_properties4.png new file mode 100644 index 000000000..ea21a2310 Binary files /dev/null and b/apps/presentationeditor/main/resources/help/en/images/shape_properties4.png differ diff --git a/apps/presentationeditor/main/resources/help/en/images/table_properties.png b/apps/presentationeditor/main/resources/help/en/images/table_properties.png index c18f1bfe3..baca2c595 100644 Binary files a/apps/presentationeditor/main/resources/help/en/images/table_properties.png and b/apps/presentationeditor/main/resources/help/en/images/table_properties.png differ diff --git a/apps/presentationeditor/main/resources/help/en/images/table_properties1.png b/apps/presentationeditor/main/resources/help/en/images/table_properties1.png new file mode 100644 index 000000000..f7aef9824 Binary files /dev/null and b/apps/presentationeditor/main/resources/help/en/images/table_properties1.png differ diff --git a/apps/presentationeditor/main/resources/help/ru/HelpfulHints/KeyboardShortcuts.htm b/apps/presentationeditor/main/resources/help/ru/HelpfulHints/KeyboardShortcuts.htm index 6315dcf37..a0a7a5dd6 100644 --- a/apps/presentationeditor/main/resources/help/ru/HelpfulHints/KeyboardShortcuts.htm +++ b/apps/presentationeditor/main/resources/help/ru/HelpfulHints/KeyboardShortcuts.htm @@ -199,16 +199,6 @@
  • - - - - - - - - - - diff --git a/apps/presentationeditor/main/resources/help/ru/UsageInstructions/InsertAutoshapes.htm b/apps/presentationeditor/main/resources/help/ru/UsageInstructions/InsertAutoshapes.htm index fd5550656..5203d6165 100644 --- a/apps/presentationeditor/main/resources/help/ru/UsageInstructions/InsertAutoshapes.htm +++ b/apps/presentationeditor/main/resources/help/ru/UsageInstructions/InsertAutoshapes.htm @@ -78,6 +78,8 @@

    Свойства фигуры - вкладка Поля вокруг текста

    На вкладке Поля вокруг текста можно изменить внутренние поля автофигуры Сверху, Снизу, Слева и Справа (то есть расстояние между текстом внутри фигуры и границами автофигуры).

    Примечание: эта вкладка доступна, только если в автофигуру добавлен текст, в противном случае вкладка неактивна.

    +

    Свойства фигуры - вкладка Альтернативный текст

    +

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


    Чтобы заменить добавленную автофигуру, щелкните по ней левой кнопкой мыши и используйте выпадающий список Изменить автофигуру на вкладке Параметры фигуры правой боковой панели.

    Чтобы удалить добавленную автофигуру, щелкните по ней левой кнопкой мыши и нажмите клавишу Delete на клавиатуре.

    diff --git a/apps/presentationeditor/main/resources/help/ru/UsageInstructions/InsertCharts.htm b/apps/presentationeditor/main/resources/help/ru/UsageInstructions/InsertCharts.htm index 52ca08836..2c524d495 100644 --- a/apps/presentationeditor/main/resources/help/ru/UsageInstructions/InsertCharts.htm +++ b/apps/presentationeditor/main/resources/help/ru/UsageInstructions/InsertCharts.htm @@ -207,6 +207,8 @@ +

    Окно Параметры диаграммы

    +

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

  • После того, как диаграмма будет добавлена, можно также изменить ее размер и положение. diff --git a/apps/presentationeditor/main/resources/help/ru/UsageInstructions/InsertImages.htm b/apps/presentationeditor/main/resources/help/ru/UsageInstructions/InsertImages.htm index 276ad3218..c2e241167 100644 --- a/apps/presentationeditor/main/resources/help/ru/UsageInstructions/InsertImages.htm +++ b/apps/presentationeditor/main/resources/help/ru/UsageInstructions/InsertImages.htm @@ -32,12 +32,14 @@

    Заменить изображение - используется, чтобы загрузить другое изображение вместо текущего, выбрав нужный источник. Можно выбрать одну из опций: Из файла или По URL.


    Чтобы изменить дополнительные параметры изображения, щелкните по нему правой кнопкой мыши и выберите из контекстного меню опцию Дополнительные параметры изображения или щелкните по изображению левой кнопкой мыши и нажмите на ссылку Дополнительные параметры на правой боковой панели. Откроется окно свойств изображения:

    - Свойства изображения -

    Здесь вы можете задать следующие свойства изображения:

    +

    Свойства изображения

    +

    Вкладка Положение позволяет задать следующие свойства изображения:

    • Размер - используйте эту опцию, чтобы изменить ширину и/или высоту изображения. Если нажата кнопка Сохранять пропорции Значок Сохранять пропорции (в этом случае она выглядит так: Кнопка Сохранять пропорции нажата), ширина и высота будут изменены пропорционально, сохраняя исходное соотношение сторон изображения. Чтобы восстановить размер по умолчанию добавленного изображения, нажмите кнопку По умолчанию.
    • Положение - используйте эту опцию, чтобы изменить положение изображения на слайде (вычисляется относительно верхней и левой стороны слайда).
    +

    Свойства изображения

    +

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


    Чтобы удалить вставленное изображение, щелкните по нему левой кнопкой мыши и нажмите клавишу Delete на клавиатуре.

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

    diff --git a/apps/presentationeditor/main/resources/help/ru/UsageInstructions/InsertTables.htm b/apps/presentationeditor/main/resources/help/ru/UsageInstructions/InsertTables.htm index a3626c87c..dea7b3cb5 100644 --- a/apps/presentationeditor/main/resources/help/ru/UsageInstructions/InsertTables.htm +++ b/apps/presentationeditor/main/resources/help/ru/UsageInstructions/InsertTables.htm @@ -65,11 +65,13 @@

    Чтобы изменить дополнительные параметры таблицы, щелкните по таблице правой кнопкой мыши и выберите из контекстного меню опцию Дополнительные параметры таблицы или нажмите ссылку Дополнительные параметры на правой боковой панели. Откроется окно свойств таблицы:

    Свойства таблицы

    -

    Здесь можно задать расстояние между текстом внутри ячейки и границами ячейки:

    +

    Вкладка Поля позволяет задать расстояние между текстом внутри ячейки и границами ячейки:

    • введите нужные значения Полей ячейки вручную или
    • установите флажок Использовать поля по умолчанию, чтобы применить предустановленные значения (при необходимости их тоже можно изменить).
    +

    Свойства таблицы

    +

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


    Для форматирования введенного текста внутри ячеек таблицы можно использовать значки на верхней панели инструментов. Контекстное меню, вызываемое правым щелчком мыши по таблице, содержит две дополнительных опции:

      diff --git a/apps/presentationeditor/main/resources/help/ru/images/chartsettings.png b/apps/presentationeditor/main/resources/help/ru/images/chartsettings.png index 04380a003..ab31e96ba 100644 Binary files a/apps/presentationeditor/main/resources/help/ru/images/chartsettings.png and b/apps/presentationeditor/main/resources/help/ru/images/chartsettings.png differ diff --git a/apps/presentationeditor/main/resources/help/ru/images/chartsettings2.png b/apps/presentationeditor/main/resources/help/ru/images/chartsettings2.png index d81ffba8e..1e8f3df1d 100644 Binary files a/apps/presentationeditor/main/resources/help/ru/images/chartsettings2.png and b/apps/presentationeditor/main/resources/help/ru/images/chartsettings2.png differ diff --git a/apps/presentationeditor/main/resources/help/ru/images/chartsettings3.png b/apps/presentationeditor/main/resources/help/ru/images/chartsettings3.png index 01c590d90..65cef06db 100644 Binary files a/apps/presentationeditor/main/resources/help/ru/images/chartsettings3.png and b/apps/presentationeditor/main/resources/help/ru/images/chartsettings3.png differ diff --git a/apps/presentationeditor/main/resources/help/ru/images/chartsettings4.png b/apps/presentationeditor/main/resources/help/ru/images/chartsettings4.png index b058b1e7e..51a23dca1 100644 Binary files a/apps/presentationeditor/main/resources/help/ru/images/chartsettings4.png and b/apps/presentationeditor/main/resources/help/ru/images/chartsettings4.png differ diff --git a/apps/presentationeditor/main/resources/help/ru/images/chartsettings5.png b/apps/presentationeditor/main/resources/help/ru/images/chartsettings5.png new file mode 100644 index 000000000..a95a2456f Binary files /dev/null and b/apps/presentationeditor/main/resources/help/ru/images/chartsettings5.png differ diff --git a/apps/presentationeditor/main/resources/help/ru/images/image_properties.png b/apps/presentationeditor/main/resources/help/ru/images/image_properties.png index fd784a08d..e58729d3b 100644 Binary files a/apps/presentationeditor/main/resources/help/ru/images/image_properties.png and b/apps/presentationeditor/main/resources/help/ru/images/image_properties.png differ diff --git a/apps/presentationeditor/main/resources/help/ru/images/image_properties1.png b/apps/presentationeditor/main/resources/help/ru/images/image_properties1.png new file mode 100644 index 000000000..8e997c30d Binary files /dev/null and b/apps/presentationeditor/main/resources/help/ru/images/image_properties1.png differ diff --git a/apps/presentationeditor/main/resources/help/ru/images/shape_properties.png b/apps/presentationeditor/main/resources/help/ru/images/shape_properties.png index 33d670fbc..9ad8ede25 100644 Binary files a/apps/presentationeditor/main/resources/help/ru/images/shape_properties.png and b/apps/presentationeditor/main/resources/help/ru/images/shape_properties.png differ diff --git a/apps/presentationeditor/main/resources/help/ru/images/shape_properties1.png b/apps/presentationeditor/main/resources/help/ru/images/shape_properties1.png index a7cd4898a..6032fa659 100644 Binary files a/apps/presentationeditor/main/resources/help/ru/images/shape_properties1.png and b/apps/presentationeditor/main/resources/help/ru/images/shape_properties1.png differ diff --git a/apps/presentationeditor/main/resources/help/ru/images/shape_properties3.png b/apps/presentationeditor/main/resources/help/ru/images/shape_properties3.png index c13808089..05eafa13a 100644 Binary files a/apps/presentationeditor/main/resources/help/ru/images/shape_properties3.png and b/apps/presentationeditor/main/resources/help/ru/images/shape_properties3.png differ diff --git a/apps/presentationeditor/main/resources/help/ru/images/shape_properties4.png b/apps/presentationeditor/main/resources/help/ru/images/shape_properties4.png new file mode 100644 index 000000000..5d54fa106 Binary files /dev/null and b/apps/presentationeditor/main/resources/help/ru/images/shape_properties4.png differ diff --git a/apps/presentationeditor/main/resources/help/ru/images/table_properties.png b/apps/presentationeditor/main/resources/help/ru/images/table_properties.png index d60ca6bda..64eaf0b43 100644 Binary files a/apps/presentationeditor/main/resources/help/ru/images/table_properties.png and b/apps/presentationeditor/main/resources/help/ru/images/table_properties.png differ diff --git a/apps/presentationeditor/main/resources/help/ru/images/table_properties1.png b/apps/presentationeditor/main/resources/help/ru/images/table_properties1.png new file mode 100644 index 000000000..4fc502de1 Binary files /dev/null and b/apps/presentationeditor/main/resources/help/ru/images/table_properties1.png differ diff --git a/apps/presentationeditor/main/resources/img/docformat.png b/apps/presentationeditor/main/resources/img/docformat.png index 634b0ccbc..77528805a 100644 Binary files a/apps/presentationeditor/main/resources/img/docformat.png and b/apps/presentationeditor/main/resources/img/docformat.png differ diff --git a/apps/presentationeditor/main/resources/img/docformat@2x.png b/apps/presentationeditor/main/resources/img/docformat@2x.png index 4cc6f62ac..5cab80522 100644 Binary files a/apps/presentationeditor/main/resources/img/docformat@2x.png and b/apps/presentationeditor/main/resources/img/docformat@2x.png differ diff --git a/apps/presentationeditor/main/resources/img/toolbar-menu.png b/apps/presentationeditor/main/resources/img/toolbar-menu.png index b7fe0915b..2c5504c88 100644 Binary files a/apps/presentationeditor/main/resources/img/toolbar-menu.png and b/apps/presentationeditor/main/resources/img/toolbar-menu.png differ diff --git a/apps/presentationeditor/main/resources/img/toolbar-menu@2x.png b/apps/presentationeditor/main/resources/img/toolbar-menu@2x.png index f9ba80656..b379daadb 100644 Binary files a/apps/presentationeditor/main/resources/img/toolbar-menu@2x.png and b/apps/presentationeditor/main/resources/img/toolbar-menu@2x.png differ diff --git a/apps/presentationeditor/main/resources/img/toolbar/bullets-and-numbering.png b/apps/presentationeditor/main/resources/img/toolbar/bullets-and-numbering.png new file mode 100644 index 000000000..7831c5018 Binary files /dev/null and b/apps/presentationeditor/main/resources/img/toolbar/bullets-and-numbering.png differ diff --git a/apps/presentationeditor/main/resources/img/toolbar/bullets-and-numbering@2x.png b/apps/presentationeditor/main/resources/img/toolbar/bullets-and-numbering@2x.png new file mode 100644 index 000000000..2839461c1 Binary files /dev/null and b/apps/presentationeditor/main/resources/img/toolbar/bullets-and-numbering@2x.png differ diff --git a/apps/presentationeditor/main/resources/img/toolbar/bullets.png b/apps/presentationeditor/main/resources/img/toolbar/bullets.png deleted file mode 100644 index afafb2327..000000000 Binary files a/apps/presentationeditor/main/resources/img/toolbar/bullets.png and /dev/null differ diff --git a/apps/presentationeditor/main/resources/img/toolbar/bullets@2x.png b/apps/presentationeditor/main/resources/img/toolbar/bullets@2x.png deleted file mode 100644 index 328cd3fb8..000000000 Binary files a/apps/presentationeditor/main/resources/img/toolbar/bullets@2x.png and /dev/null differ diff --git a/apps/presentationeditor/main/resources/img/toolbar/numbering.png b/apps/presentationeditor/main/resources/img/toolbar/numbering.png deleted file mode 100644 index 2e481e695..000000000 Binary files a/apps/presentationeditor/main/resources/img/toolbar/numbering.png and /dev/null differ diff --git a/apps/presentationeditor/main/resources/img/toolbar/numbering@2x.png b/apps/presentationeditor/main/resources/img/toolbar/numbering@2x.png deleted file mode 100644 index 5e2196106..000000000 Binary files a/apps/presentationeditor/main/resources/img/toolbar/numbering@2x.png and /dev/null differ diff --git a/apps/presentationeditor/main/resources/less/app.less b/apps/presentationeditor/main/resources/less/app.less index 89589a777..54446155e 100644 --- a/apps/presentationeditor/main/resources/less/app.less +++ b/apps/presentationeditor/main/resources/less/app.less @@ -111,6 +111,7 @@ @import "../../../../common/main/resources/less/common.less"; @import "../../../../common/main/resources/less/opendialog.less"; @import "../../../../common/main/resources/less/plugins.less"; +@import "../../../../common/main/resources/less/language-dialog.less"; // App // -------------------------------------------------- diff --git a/apps/presentationeditor/main/resources/less/layout.less b/apps/presentationeditor/main/resources/less/layout.less index f9e3f5a12..de328fc7f 100644 --- a/apps/presentationeditor/main/resources/less/layout.less +++ b/apps/presentationeditor/main/resources/less/layout.less @@ -67,6 +67,10 @@ label { .cell { display: table-cell; } + + .layout-resizer { + background-color: transparent; + } } .tooltip.main-info { diff --git a/apps/presentationeditor/main/resources/less/leftmenu.less b/apps/presentationeditor/main/resources/less/leftmenu.less index 15678684c..5300f2365 100644 --- a/apps/presentationeditor/main/resources/less/leftmenu.less +++ b/apps/presentationeditor/main/resources/less/leftmenu.less @@ -189,7 +189,7 @@ background-repeat: no-repeat; background-position: 0 0; - .background-ximage('@{app-image-path}/docformat.png', '@{app-image-path}/docformat@2x.png', 714px); + .background-ximage('@{app-image-path}/docformat.png', '@{app-image-path}/docformat@2x.png', 918px); .icon-document-format(@shift-x, @shift-y: 0) { background-position: @shift-x @shift-y; @@ -201,6 +201,7 @@ &.pptx {.icon-document-format(-102px);} &.pdf {.icon-document-format(-306px);} + &.odp {.icon-document-format(-816px);} } } } diff --git a/apps/presentationeditor/main/resources/less/statusbar.less b/apps/presentationeditor/main/resources/less/statusbar.less index ce9f2f15a..72bca5143 100644 --- a/apps/presentationeditor/main/resources/less/statusbar.less +++ b/apps/presentationeditor/main/resources/less/statusbar.less @@ -41,6 +41,7 @@ #btn-zoom-topage { .btn-tpl(-1160px); margin-right: 9px; + margin-left: 6px; } #btn-zoom-towidth { @@ -56,6 +57,16 @@ .btn-tpl(-1220px); } + #btn-doc-lang { + .btn-tpl(-1500px); + margin-right: 9px; + } + + #btn-doc-spell { + .btn-tpl(-1520px); + margin-right: 5px; + } + #status-btn-preview { .btn-tpl(-160px); } @@ -78,6 +89,49 @@ } } + .cnt-lang { + display: inline-block; + cursor: pointer; + color: #000; + margin-left: 6px; + + .dropdown-toggle > .icon-lang-flag { + position: relative; + top: 3px; + margin-left: 3px; + margin-right: 2px; + display: inline-block; + } + + .caret.up { + background-position: @arrow-up-small-offset-x @arrow-up-small-offset-y; + + border: none; + width: 7px; + height: 7px; + } + + label { + cursor: pointer; + } + + .dropdown-menu { + li .lang-item-icon { + display: inline-block; + vertical-align: text-bottom; + margin: 1px 5px 0 2px; + } + } + + &.disabled { + cursor: default; + label, .icon-lang-flag { + cursor: default; + opacity: 0.4; + } + } + } + .cnt-zoom { display: inline-block; @@ -165,4 +219,3 @@ } } } - diff --git a/apps/presentationeditor/main/resources/less/toolbar.less b/apps/presentationeditor/main/resources/less/toolbar.less index ac9652adb..87c51fa4f 100644 --- a/apps/presentationeditor/main/resources/less/toolbar.less +++ b/apps/presentationeditor/main/resources/less/toolbar.less @@ -121,18 +121,11 @@ } .item-markerlist { - .background-ximage('@{app-image-path}/toolbar/bullets.png', '@{app-image-path}/toolbar/bullets@2x.png', 38px); + .background-ximage('@{app-image-path}/toolbar/bullets-and-numbering.png', '@{app-image-path}/toolbar/bullets-and-numbering@2x.png', 38px); width: 38px; height: 38px; } -.item-numberlist { - .background-ximage('@{app-image-path}/toolbar/numbering.png', '@{app-image-path}/toolbar/numbering@2x.png', 74px); - width: 74px; - height: 74px; -} - - .color-schemas-menu { span { &.colors { diff --git a/apps/presentationeditor/mobile/app-dev.js b/apps/presentationeditor/mobile/app-dev.js index 020c907f2..022594cbb 100644 --- a/apps/presentationeditor/mobile/app-dev.js +++ b/apps/presentationeditor/mobile/app-dev.js @@ -52,9 +52,6 @@ require.config({ text : '../vendor/requirejs-text/text', xregexp : '../vendor/xregexp/xregexp-all-min', sockjs : '../vendor/sockjs/sockjs.min', - jszip : '../vendor/jszip/jszip.min', - jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', api : 'api/documents/api', core : 'common/main/lib/core/application', extendes : 'common/mobile/utils/extendes', @@ -119,9 +116,6 @@ require([ 'analytics', 'gateway', 'locale', - 'jszip', - 'jsziputils', - 'jsrsasign', 'sockjs' ], function (Backbone, Framework7, Core) { Backbone.history.start(); diff --git a/apps/presentationeditor/mobile/app.js b/apps/presentationeditor/mobile/app.js index c4606d588..b7c7d32ee 100644 --- a/apps/presentationeditor/mobile/app.js +++ b/apps/presentationeditor/mobile/app.js @@ -52,9 +52,6 @@ require.config({ text : '../vendor/requirejs-text/text', xregexp : '../vendor/xregexp/xregexp-all-min', sockjs : '../vendor/sockjs/sockjs.min', - jszip : '../vendor/jszip/jszip.min', - jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', allfonts : '../../sdkjs/common/AllFonts', sdk : '../../sdkjs/slide/sdk-all-min', api : 'api/documents/api', @@ -104,10 +101,7 @@ require.config({ 'underscore', 'allfonts', 'xregexp', - 'sockjs', - 'jszip', - 'jsziputils', - 'jsrsasign' + 'sockjs' ] }, gateway: { diff --git a/apps/presentationeditor/mobile/app/controller/DocumentHolder.js b/apps/presentationeditor/mobile/app/controller/DocumentHolder.js index 865df8e42..0bfa294c7 100644 --- a/apps/presentationeditor/mobile/app/controller/DocumentHolder.js +++ b/apps/presentationeditor/mobile/app/controller/DocumentHolder.js @@ -84,7 +84,7 @@ define([ }, setMode: function (mode) { - _isEdit = ('edit' === mode); + _isEdit = mode.isEdit; }, // When our application is ready, lets get started diff --git a/apps/presentationeditor/mobile/app/controller/Main.js b/apps/presentationeditor/mobile/app/controller/Main.js index 23c75f241..ca109b2d8 100644 --- a/apps/presentationeditor/mobile/app/controller/Main.js +++ b/apps/presentationeditor/mobile/app/controller/Main.js @@ -226,11 +226,11 @@ define([ setMode: function(mode){ var me = this; - Common.SharedSettings.set('mode', mode); + Common.SharedSettings.set('mode', mode.isEdit ? 'edit' : 'view'); if (me.api) { - me.api.asc_enableKeyEvents(mode == 'edit'); - me.api.asc_setViewMode(mode != 'edit'); + me.api.asc_enableKeyEvents(mode.isEdit); + me.api.asc_setViewMode(!mode.isEdit); } }, @@ -437,6 +437,8 @@ define([ Common.localStorage.setItem("pe-settings-showsnaplines", me.api.get_ShowSnapLines() ? 1 : 0); + me.api.asc_setSpellCheck(false); // don't use spellcheck for mobile mode + me.api.asc_registerCallback('asc_onStartAction', _.bind(me.onLongActionBegin, me)); me.api.asc_registerCallback('asc_onEndAction', _.bind(me.onLongActionEnd, me)); me.api.asc_registerCallback('asc_onCoAuthoringDisconnect', _.bind(me.onCoAuthoringDisconnect, me)); @@ -594,7 +596,7 @@ define([ _.each(me.getApplication().controllers, function(controller) { if (controller && _.isFunction(controller.setMode)) { - controller.setMode(me.editorConfig.mode); + controller.setMode(me.appOptions); } }); @@ -659,7 +661,7 @@ define([ message: [msg.msg.charAt(0).toUpperCase() + msg.msg.substring(1)] }); - Common.component.Analytics.trackEvent('External Error', msg.title); + Common.component.Analytics.trackEvent('External Error'); } }, diff --git a/apps/presentationeditor/mobile/app/template/AddImage.template b/apps/presentationeditor/mobile/app/template/AddImage.template index 0ac3570e4..f5bbcb0c8 100644 --- a/apps/presentationeditor/mobile/app/template/AddImage.template +++ b/apps/presentationeditor/mobile/app/template/AddImage.template @@ -40,12 +40,13 @@
      -
      <%= scope.textAddress %>
      + <% if (!android) { %>
      <%= scope.textAddress %>
      <% } %>
      • - +
      • +
      • + +
        +
        + +
        +
        +
        ODP
        +
        +
        +
        +
      diff --git a/apps/presentationeditor/mobile/app/view/Search.js b/apps/presentationeditor/mobile/app/view/Search.js index 41155dd1b..9b9c89cdc 100644 --- a/apps/presentationeditor/mobile/app/view/Search.js +++ b/apps/presentationeditor/mobile/app/view/Search.js @@ -84,7 +84,7 @@ define([ }, setMode: function (mode) { - _isEdit = (mode === 'edit'); + _isEdit = mode.isEdit; this.render(); }, diff --git a/apps/presentationeditor/mobile/app/view/Settings.js b/apps/presentationeditor/mobile/app/view/Settings.js index 892dc6f4c..ec71b1ab7 100644 --- a/apps/presentationeditor/mobile/app/view/Settings.js +++ b/apps/presentationeditor/mobile/app/view/Settings.js @@ -50,7 +50,9 @@ define([ PE.Views.Settings = Backbone.View.extend(_.extend((function() { // private - var isEdit; + var isEdit, + canEdit = false, + canDownload = false; return { // el: '.view-main', @@ -69,7 +71,7 @@ define([ initEvents: function () { var me = this; - $('#settings-presentation-info').single('click', _.bind(me.showInfo, me)); + $('#settings-document-info').single('click', _.bind(me.showInfo, me)); $('#settings-download').single('click', _.bind(me.showDownload, me)); $('#settings-history').single('click', _.bind(me.showHistory, me)); $('#settings-help').single('click', _.bind(me.showHelp, me)); @@ -91,7 +93,9 @@ define([ }, setMode: function (mode) { - isEdit = (mode === 'edit') + isEdit = mode.isEdit; + canEdit = !mode.isEdit && mode.canEdit && mode.canRequestEditRights; + canDownload = mode.canDownload || mode.canDownloadOrigin; }, rootLayout: function () { @@ -104,11 +108,13 @@ define([ $layour.find('#settings-readermode').hide(); $layour.find('#settings-search .item-title').text(this.textFindAndReplace) } else { + if (!canEdit) $layour.find('#settings-edit-presentation').hide(); $layour.find('#settings-presentation-setup').hide(); $layour.find('#settings-readermode input:checkbox') .attr('checked', Common.SharedSettings.get('readerMode')) .prop('checked', Common.SharedSettings.get('readerMode')); } + if (!canDownload) $layour.find('#settings-download').hide(); return $layour.html(); } diff --git a/apps/presentationeditor/mobile/app/view/Toolbar.js b/apps/presentationeditor/mobile/app/view/Toolbar.js index f7f8d4fde..bc73e504a 100644 --- a/apps/presentationeditor/mobile/app/view/Toolbar.js +++ b/apps/presentationeditor/mobile/app/view/Toolbar.js @@ -98,9 +98,7 @@ define([ }, setMode: function (mode) { - var isEdit = (mode === 'edit'); - - if (isEdit) { + if (mode.isEdit) { $('#toolbar-edit, #toolbar-add, #toolbar-undo, #toolbar-redo').show(); } }, diff --git a/apps/presentationeditor/mobile/app/view/add/AddSlide.js b/apps/presentationeditor/mobile/app/view/add/AddSlide.js index 91b5bef04..b2984c9ed 100644 --- a/apps/presentationeditor/mobile/app/view/add/AddSlide.js +++ b/apps/presentationeditor/mobile/app/view/add/AddSlide.js @@ -123,7 +123,7 @@ define([ '<% }); %>', '
    ', '<% }); %>' - ].join(''), { + ].join(''))({ layouts: layouts }); diff --git a/apps/presentationeditor/mobile/app/view/edit/EditChart.js b/apps/presentationeditor/mobile/app/view/edit/EditChart.js index 63cee3905..7508662d9 100644 --- a/apps/presentationeditor/mobile/app/view/edit/EditChart.js +++ b/apps/presentationeditor/mobile/app/view/edit/EditChart.js @@ -203,7 +203,7 @@ define([ '<% }); %>', '', '<% }); %>' - ].join(''), { + ].join(''))({ styles: styles }); diff --git a/apps/presentationeditor/mobile/app/view/edit/EditSlide.js b/apps/presentationeditor/mobile/app/view/edit/EditSlide.js index 38ed167df..3acc66e2b 100644 --- a/apps/presentationeditor/mobile/app/view/edit/EditSlide.js +++ b/apps/presentationeditor/mobile/app/view/edit/EditSlide.js @@ -235,7 +235,7 @@ define([ '<% }); %>', '', '<% }); %>' - ].join(''), { + ].join(''))({ layouts: layouts }); @@ -268,7 +268,7 @@ define([ '<% }); %>', '', '<% }); %>' - ].join(''), { + ].join(''))({ themes: themes }); @@ -291,7 +291,7 @@ define([ '', '
  • ', '<% }); %>' - ].join(''), { + ].join(''))({ android : Common.SharedSettings.get('android'), types: _arrCurrentEffectTypes }); diff --git a/apps/presentationeditor/mobile/app/view/edit/EditTable.js b/apps/presentationeditor/mobile/app/view/edit/EditTable.js index aa922581b..d0cf8c92a 100644 --- a/apps/presentationeditor/mobile/app/view/edit/EditTable.js +++ b/apps/presentationeditor/mobile/app/view/edit/EditTable.js @@ -138,7 +138,7 @@ define([ '', '<% }); %>', '' - ].join(''), { + ].join(''))({ styles: styles }); diff --git a/apps/presentationeditor/mobile/resources/css/app-ios.css b/apps/presentationeditor/mobile/resources/css/app-ios.css index 9e36ca66d..69c5bfa43 100644 --- a/apps/presentationeditor/mobile/resources/css/app-ios.css +++ b/apps/presentationeditor/mobile/resources/css/app-ios.css @@ -6624,6 +6624,11 @@ i.icon.icon-format-pptx { height: 22px; background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20viewBox%3D%22-238%20240%2022%2022%22%20style%3D%22enable-background%3Anew%20-238%20240%2022%2022%3B%22%20xml%3Aspace%3D%22preserve%22%20fill%3D%22%23DF6737%22%3E%3Cg%3E%3Cpath%20id%3D%22XMLID_2_%22%20d%3D%22M-236%2C261h18v-17l-3.9791718-4H-236V261z%20M-219%2C248v12h-16v-19h12l4%2C4V248z%22%2F%3E%3C%2Fg%3E%3Cg%3E%3Cpath%20d%3D%22M-228.8226929%2C250.8646851c0.137085-0.060791%2C0.2341919-0.2302246%2C0.3131104-0.3647461%09c0.0792847-0.1351929%2C0.0861816-0.2935181%2C0.0861816-0.473938c0-0.2221069-0.0613403-0.4186401-0.1723633-0.5601807%09c-0.1102905-0.1405029-0.296875-0.2628784-0.4628906-0.2931519c-0.1210938-0.0233154-0.2396851-0.0012817-0.4535522%2C0.0090942%20l-0.3115234%2C0.010376v1.7925415h0.4523926C-228.9815063%2C250.9927368-228.9586182%2C250.9249878-228.8226929%2C250.8646851z%22%2F%3E%3Cpath%20d%3D%22M-233%2C256.1141357l7.333313%2C1.3553467V245L-233%2C246.3268433V256.1141357z%20M-230.8660889%2C248.2818604l1.4968872-0.0977783%20c0.6077881-0.0397339%2C0.9075317-0.0557251%2C1.1018066-0.0071411c0.3032227%2C0.0736084%2C0.637207%2C0.2349854%2C0.8483276%2C0.538147%09c0.2138672%2C0.3070679%2C0.3555908%2C0.7592163%2C0.3555908%2C1.262085c0%2C0.3878784-0.0623169%2C0.7130737-0.1862793%2C0.9741211%09c-0.1230469%2C0.2590942-0.2780151%2C0.4591064-0.4640503%2C0.6001587c-0.18396%2C0.1394653-0.3991089%2C0.2700195-0.5587769%2C0.3272705%20c-0.3145752%2C0.0774536-0.5286865%2C0.1747437-0.9802856%2C0.1508179h-0.5708618v1.9562378l-1.0423584-0.1081543V248.2818604z%22%2F%3E%3Cpath%20d%3D%22M-221.7266846%2C247H-225v9h3.2733154C-221.3253479%2C256-221%2C255.6746521-221%2C255.2733154v-7.5466309%09C-221%2C247.3253479-221.3253479%2C247-221.7266846%2C247z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); } +i.icon.icon-format-odp { + width: 22px; + height: 22px; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20viewBox%3D%22-286%20409.89%2022%2022%22%20style%3D%22enable-background%3Anew%20-286%20409.89%2022%2022%3B%22%20xml%3Aspace%3D%22preserve%22%20fill%3D%22%23DF6737%22%3E%3Cg%3E%3Cpath%20id%3D%22XMLID_2_%22%20d%3D%22M-284%2C430.89h18v-17l-3.979-4H-284V430.89z%20M-267%2C417.89v12h-16v-19h12l4%2C4V417.89z%22%2F%3E%3C%2Fg%3E%3Cpath%20d%3D%22M-281.655%2C419.661c0%2C0%2C1.036-1.266%2C3.529-1.381c2.493-0.115%2C3.107%2C0.499%2C3.107%2C0.499s1.072-0.873%2C2.634-0.984%20c1.473-0.106%2C2.244%2C0.134%2C3.657%2C0.639c-3.107-0.038-5.408%2C1.189-6.022%2C1.956C-276.17%2C419.163-278.817%2C418.817-281.655%2C419.661z%22%2F%3E%3Cpath%20d%3D%22M-278.663%2C415.979c1.458-0.767%2C2.864-0.857%2C5.063%2C0c1.189-0.652%2C3.414-0.307%2C4.68%2C0.269c-3.145-0.23-4.104%2C0.422-4.68%2C0.69%09C-274.367%2C416.056-276.86%2C415.595-278.663%2C415.979z%22%2F%3E%3Cg%3E%3Cpath%20d%3D%22M-281.721%2C425.011c0-0.465%2C0.07-0.855%2C0.209-1.172c0.104-0.232%2C0.246-0.441%2C0.425-0.626s0.376-0.322%2C0.59-0.411%20c0.285-0.121%2C0.613-0.181%2C0.985-0.181c0.673%2C0%2C1.212%2C0.208%2C1.616%2C0.626c0.404%2C0.418%2C0.606%2C0.998%2C0.606%2C1.742%20c0%2C0.737-0.2%2C1.314-0.601%2C1.731c-0.401%2C0.417-0.938%2C0.625-1.608%2C0.625c-0.679%2C0-1.22-0.207-1.621-0.622%09C-281.521%2C426.31-281.721%2C425.739-281.721%2C425.011z%20M-280.771%2C424.981c0%2C0.517%2C0.119%2C0.909%2C0.358%2C1.176%09c0.239%2C0.268%2C0.542%2C0.4%2C0.91%2C0.4c0.368%2C0%2C0.669-0.132%2C0.905-0.397c0.236-0.265%2C0.354-0.662%2C0.354-1.191%09c0-0.523-0.115-0.914-0.344-1.172s-0.535-0.387-0.915-0.387c-0.38%2C0-0.687%2C0.131-0.919%2C0.392%20C-280.654%2C424.062-280.771%2C424.455-280.771%2C424.981z%22%2F%3E%3Cpath%20d%3D%22M-276.573%2C422.699h1.686c0.38%2C0%2C0.67%2C0.029%2C0.87%2C0.088c0.267%2C0.079%2C0.498%2C0.219%2C0.689%2C0.421%20c0.191%2C0.201%2C0.336%2C0.448%2C0.436%2C0.74s0.15%2C0.651%2C0.15%2C1.079c0%2C0.377-0.047%2C0.7-0.141%2C0.973c-0.114%2C0.333-0.277%2C0.602-0.489%2C0.808%20c-0.16%2C0.155-0.376%2C0.277-0.648%2C0.364c-0.204%2C0.064-0.476%2C0.097-0.816%2C0.097h-1.736V422.699z%20M-275.65%2C423.472v3.026h0.689%20c0.257%2C0%2C0.443-0.015%2C0.558-0.044c0.149-0.037%2C0.274-0.101%2C0.373-0.19c0.099-0.089%2C0.18-0.236%2C0.241-0.44%20c0.062-0.205%2C0.094-0.483%2C0.094-0.837s-0.031-0.624-0.094-0.813c-0.062-0.189-0.149-0.337-0.262-0.442%20c-0.112-0.106-0.254-0.178-0.427-0.215c-0.129-0.029-0.381-0.044-0.757-0.044H-275.65z%22%2F%3E%3Cpath%20d%3D%22M-271.96%2C427.268v-4.569h1.479c0.562%2C0%2C0.927%2C0.023%2C1.098%2C0.069c0.262%2C0.068%2C0.48%2C0.218%2C0.657%2C0.447%20s0.265%2C0.525%2C0.265%2C0.89c0%2C0.28-0.051%2C0.516-0.152%2C0.707s-0.231%2C0.342-0.388%2C0.45c-0.157%2C0.109-0.316%2C0.182-0.479%2C0.217%09c-0.221%2C0.044-0.539%2C0.065-0.957%2C0.065h-0.602v1.724H-271.96z%20M-271.038%2C423.472v1.297h0.505c0.363%2C0%2C0.606-0.024%2C0.729-0.072%20c0.122-0.048%2C0.219-0.122%2C0.288-0.225c0.069-0.102%2C0.104-0.22%2C0.104-0.354c0-0.167-0.049-0.304-0.146-0.412%09c-0.098-0.107-0.222-0.176-0.371-0.202c-0.109-0.021-0.331-0.031-0.663-0.031H-271.038z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); +} #editor_sdk { position: absolute; left: 0; @@ -6734,4 +6739,3 @@ html.pixel-ratio-3 .numbers li { z-index: 10; -webkit-appearance: none; } -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL2ludHJvLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9ncmlkLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9fbWl4aW5zLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy92aWV3cy5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvcGFnZXMubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL3Rvb2xiYXJzLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy90b29sYmFycy1wYWdlcy5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3Mvc2VhcmNoYmFyLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9tZXNzYWdlYmFyLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9pY29ucy5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvY29udGVudC1ibG9jay5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvbGlzdHMubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL2Zvcm1zLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9jYXJkcy5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvbW9kYWxzLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9wYW5lbHMubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL3RhYnMubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL21lc3NhZ2VzLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9zdGF0dXNiYXIubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL3ByZWxvYWRlci5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvcHJvZ3Jlc3NiYXIubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL3N3aXBlci5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvcGlja2VyLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9ub3RpZmljYXRpb25zLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9kaXNhYmxlZC5sZXNzIiwiYXBwLWlvcy5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy9hcHBzL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvaW9zL19jb250YWluZXIubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvYXBwcy9jb21tb24vbW9iaWxlL3Jlc291cmNlcy9sZXNzL2lvcy9fZGF0YXZpZXcubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvYXBwcy9jb21tb24vbW9iaWxlL3Jlc291cmNlcy9sZXNzL2lvcy9fbGlzdHZpZXcubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvYXBwcy9jb21tb24vbW9iaWxlL3Jlc291cmNlcy9sZXNzL2lvcy9fYnV0dG9uLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL2FwcHMvY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9pb3MvX2NvbnRleHRtZW51Lmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL2FwcHMvY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9pb3MvX2NvbG9yLXBhbGV0dGUubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvYXBwcy9jb21tb24vbW9iaWxlL3Jlc291cmNlcy9sZXNzL2lvcy9fYWJvdXQubGVzcyIsImlvcy9fc2VhcmNoLmxlc3MiLCJpb3MvX2ljb25zLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL2FwcHMvY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9fbWl4aW5zLmxlc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBTTtBQUFNO0VBQ1Isa0JBQUE7RUFDQSxZQUFBO0VBQ0EsV0FBQTtFQUNBLGtCQUFBOztBQUVKO0VBQ0ksb0ZBQUE7RUFDQSxTQUFBO0VBQ0EsVUFBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0VBQ0EsZ0JBQUE7RUFDQSxXQUFBO0VBQ0EsOEJBQUE7RUFDQSxnQkFBQTtFQUNBLGdCQUFBOztBQUVKO0VBQ0ksZ0JBQUE7O0FBR0osZ0JBQThCLG9CQUFtQixvQkFBNEI7RUFDekU7RUFBTTtFQUFNO0lBQ1IsYUFBQTs7O0FBR1IsZ0JBQThCLG9CQUFtQixvQkFBNEI7RUFDekU7RUFBTTtFQUFNO0lBQ1IsYUFBQTs7O0FBSVI7RUFDSSw2Q0FBQTtFQUNBLDJCQUFBOztBQUVKO0FBQUc7QUFBTztBQUFVO0VBQ2hCLFVB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c291cmNlc0NvbnRlbnQiOlsiQGltZ0Jhc2VVcmw6IFwiLi4vaW1nXCI7XG5odG1sLCBib2R5LCAuZnJhbWV3b3JrNy1yb290IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbn1cbmJvZHkge1xuICAgIGZvbnQtZmFtaWx5OiAtYXBwbGUtc3lzdGVtLCBTRiBVSSBUZXh0LCBIZWx2ZXRpY2EgTmV1ZSwgSGVsdmV0aWNhLCBBcmlhbCwgc2Fucy1zZXJpZjtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMDtcbiAgICBjb2xvcjogIzAwMDtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6MTAwJTtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG4uZnJhbWV3b3JrNy1yb290IHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLy8gRml4IGZvciBpUGFkIGluIFNhZmFyaSBpbiBMYW5zY2FwZSBtb2RlXG5AbWVkaWEgYWxsIGFuZCAod2lkdGg6MTAyNHB4KSBhbmQgKGhlaWdodDo2OTFweCkgYW5kIChvcmllbnRhdGlvbjpsYW5kc2NhcGUpIHtcbiAgICBodG1sLCBib2R5LCAuZnJhbWV3b3JrNy1yb290IHtcbiAgICAgICAgaGVpZ2h0OiA2NzFweDtcbiAgICB9XG59XG5AbWVkaWEgYWxsIGFuZCAod2lkdGg6MTAyNHB4KSBhbmQgKGhlaWdodDo2OTJweCkgYW5kIChvcmllbnRhdGlvbjpsYW5kc2NhcGUpIHtcbiAgICBodG1sLCBib2R5LCAuZnJhbWV3b3JrNy1yb290ICB7XG4gICAgICAgIGhlaWdodDogNjcycHg7XG4gICAgfVxufVxuXG4qIHtcbiAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7XG4gICAgLXdlYmtpdC10b3VjaC1jYWxsb3V0Om5vbmU7XG59XG5hLCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCB7XG4gICAgb3V0bGluZTogMDtcbn1cblxuYSB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIGNvbG9yOiBAdGhlbWVDb2xvcjtcbn1cbnAge1xuICAgIG1hcmdpbjogMWVtIDA7XG59IiwiLyogPT09IEdyaWQgPT09ICovXG4ucm93IHtcbiAgICAuZmxleGJveCgpO1xuICAgIC5qdXN0aWZ5LWNvbnRlbnQoc3BhY2UtYmV0d2Vlbik7XG4gICAgLmZsZXgtd3JhcCh3cmFwKTtcbiAgICAuYWxpZ24taXRlbXMoZmxleC1zdGFydCk7XG4gICAgPiBbY2xhc3MqPVwiY29sLVwiXSB7XG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxufVxuQGNvbHM6IDUsIDEwLCAxNSwgMjAsIDI1LCAzMCwgMTAwLzMsIDM1LCA0MCwgNDUsIDUwLCA1NSwgNjAsIDY1LCAxMDAqKDIvMyksIDcwLCA3NSwgODAsIDg1LCA5MCwgOTUsIDEwMDtcbi5yb3cge1xuICAgIC5jb2wtYXV0byB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgICAuLShAaTogbGVuZ3RoKEBjb2xzKSkgd2hlbiAoQGkgPiAwKSB7XG4gICAgICAgIEBkaXZpZGVyOiBlKGV4dHJhY3QoQGNvbHMsIEBpKSk7XG4gICAgICAgIEBjbGFzc05hbWU6IGBNYXRoLmZsb29yKEB7ZGl2aWRlcn0pYDtcbiAgICAgICAgQG46IGAxMDAvcGFyc2VGbG9hdChAe2RpdmlkZXJ9KWA7XG4gICAgICAgIEBuLTE6IEBuIC0gMTtcbiAgICAgICAgLmNvbC1Ae2NsYXNzTmFtZX0ge1xuICAgICAgICAgICAgd2lkdGg6IH5cIkB7ZGl2aWRlcn0lXCI7XG4gICAgICAgICAgICB3aWR0aDogflwiLXdlYmtpdC1jYWxjKCgxMDAlIC0gMTVweCpAe24tMX0pIC8gQHtufSlcIjsgICBcbiAgICAgICAgICAgIHdpZHRoOiB+XCJjYWxjKCgxMDAlIC0gMTVweCpAe24tMX0pIC8gQHtufSlcIjsgICBcbiAgICAgICAgfVxuICAgICAgICAmLm5vLWd1dHRlciB7XG4gICAgICAgICAgICAuY29sLUB7Y2xhc3NOYW1lfSB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IH5cIkB7ZGl2aWRlcn0lXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLi0oKEBpIC0gMSkpO1xuICAgIH0gLi07XG4gICAgLi0tKEBqOiAxKSB3aGVuIChAaiA8IGxlbmd0aChAY29scykpIHtcbiAgICAgICAgQGRpdmlkZXI6IGUoZXh0cmFjdChAY29scywgQGopKTtcbiAgICAgICAgQGNsYXNzTmFtZTogYE1hdGguZmxvb3IoQHtkaXZpZGVyfSlgO1xuICAgICAgICAuY29sLWF1dG86bnRoLWxhc3QtY2hpbGQoQHtqfSksIC5jb2wtYXV0bzpudGgtbGFzdC1jaGlsZChAe2p9KSB+IC5jb2wtYXV0byB7XG4gICAgICAgICAgICBAai0xOiBAaiAtIDE7ICBcbiAgICAgICAgICAgIHdpZHRoOiAxMDAlIC8gQGo7XG4gICAgICAgICAgICB3aWR0aDogflwiLXdlYmtpdC1jYWxjKCgxMDAlIC0gMTVweCpAe2otMX0pIC8gQHtqfSlcIjsgICBcbiAgICAgICAgICAgIHdpZHRoOiB+XCJjYWxjKCgxMDAlIC0gMTVweCpAe2otMX0pIC8gQHtqfSlcIjsgICBcbiAgICAgICAgfVxuICAgICAgICAmLm5vLWd1dHRlciB7XG4gICAgICAgICAgICAuY29sLWF1dG86bnRoLWxhc3QtY2hpbGQoQHtqfSksIC5jb2wtYXV0bzpudGgtbGFzdC1jaGlsZChAe2p9KSB+IC5jb2wtYXV0byB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCUgLyBAajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAuLS0oKEBqICsgMSkpO1xuICAgIH0gLi0tO1xuICAgIFxufVxuXG5AbWVkaWEgYWxsIGFuZCAobWluLXdpZHRoOjc2OHB4KSB7XG4gICAgLnJvdyB7XG4gICAgICAgIC4tKEBpOiBsZW5ndGgoQGNvbHMpKSB3aGVuIChAaSA+IDApIHtcbiAgICAgICAgICAgIEBkaXZpZGVyOiBlKGV4dHJhY3QoQGNvbHMsIEBpKSk7XG4gICAgICAgICAgICBAY2xhc3NOYW1lOiBgTWF0aC5mbG9vcihAe2RpdmlkZXJ9KWA7XG4gICAgICAgICAgICBAbjogYDEwMC9wYXJzZUZsb2F0KEB7ZGl2aWRlcn0pYDtcbiAgICAgICAgICAgIEBuLTE6IEBuIC0gMTtcbiAgICAgICAgICAgIC50YWJsZXQtQHtjbGFzc05hbWV9IHtcbiAgICAgICAgICAgICAgICB3aWR0aDogflwiQHtkaXZpZGVyfSVcIjtcbiAgICAgICAgICAgICAgICB3aWR0aDogflwiLXdlYmtpdC1jYWxjKCgxMDAlIC0gMTVweCpAe24tMX0pIC8gQHtufSlcIjsgICBcbiAgICAgICAgICAgICAgICB3aWR0aDogflwiY2FsYygoMTAwJSAtIDE1cHgqQHtuLTF9KSAvIEB7bn0pXCI7ICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmLm5vLWd1dHRlciB7XG4gICAgICAgICAgICAgICAgLnRhYmxldC1Ae2NsYXNzTmFtZX0ge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogflwiQHtkaXZpZGVyfSVcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAuLSgoQGkgLSAxKSk7XG4gICAgICAgIH0gLi07XG4gICAgICAgIC4tLShAajogMSkgd2hlbiAoQGogPCBsZW5ndGgoQGNvbHMpKSB7XG4gICAgICAgICAgICAudGFibGV0LWF1dG86bnRoLWxhc3QtY2hpbGQoQHtqfSksIC50YWJsZXQtYXV0bzpudGgtbGFzdC1jaGlsZChAe2p9KSB+IC5jb2wtYXV0byB7XG4gICAgICAgICAgICAgICAgQGotMTogQGogLSAxOyAgXG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCUgLyBAajtcbiAgICAgICAgICAgICAgICB3aWR0aDogflwiLXdlYmtpdC1jYWxjKCgxMDAlIC0gMTVweCpAe2otMX0pIC8gQHtqfSlcIjsgICBcbiAgICAgICAgICAgICAgICB3aWR0aDogflwiY2FsYygoMTAwJSAtIDE1cHgqQHtqLTF9KSAvIEB7an0pXCI7ICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmLm5vLWd1dHRlciB7XG4gICAgICAgICAgICAgICAgLnRhYmxldC1hdXRvOm50aC1sYXN0LWNoaWxkKEB7an0pLCAudGFibGV0LWF1dG86bnRoLWxhc3QtY2hpbGQoQHtqfSkgfiAudGFibGV0LWF1dG8ge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJSAvIEBqO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC4tLSgoQGogKyAxKSk7XG4gICAgICAgIH0gLi0tO1xuICAgIH1cblxufVxuIiwiLnRyYW5zaXRpb24oQGQpIHtcbiAgICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IEBkO1xuICAgIHRyYW5zaXRpb24tZHVyYXRpb246IEBkO1xufVxuLmRlbGF5KEBkKSB7XG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLWRlbGF5OiBAZDtcbiAgICB0cmFuc2l0aW9uLWRlbGF5OiBAZDtcbn1cbi50cmFuc2Zvcm0oQHQpIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogQHQ7XG4gICAgdHJhbnNmb3JtOiBAdDtcbn1cbi50cmFuc2Zvcm0tb3JpZ2luKEB0bykge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogQHRvO1xuICAgIHRyYW5zZm9ybS1vcmlnaW46IEB0bztcbn1cbi50cmFuc2xhdGUzZChAeDowLCBAeTowLCBAejowKSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKEB4LEB5LEB6KTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKEB4LEB5LEB6KTtcbn1cbi5hbmltYXRpb24oQGEpIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogQGE7XG4gICAgYW5pbWF0aW9uOiBAYTtcbn1cbi5zY3JvbGxhYmxlKCl7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoO1xufVxuLmZsZXhib3goKSB7XG4gICAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gICAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gICAgZGlzcGxheTogLXdlYmtpdC1mbGV4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG4uZmxleGJveC1pbmxpbmUoKSB7XG4gICAgZGlzcGxheTogLXdlYmtpdC1pbmxpbmUtYm94O1xuICAgIGRpc3BsYXk6IC1tcy1pbmxpbmUtZmxleGJveDtcbiAgICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1mbGV4O1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxuLmZsZXgtd3JhcChAZncpIHdoZW4gKEBmdyA9IG5vd3JhcCkge1xuICAgIC13ZWJraXQtYm94LWxpbmVzOiBzaW5nbGU7XG4gICAgLW1vei1ib3gtbGluZXM6IHNpbmdsZTtcbiAgICAtd2Via2l0LWZsZXgtd3JhcDogbm93cmFwO1xuICAgIC1tcy1mbGV4LXdyYXA6IG5vbmU7XG4gICAgLW1zLWZsZXgtd3JhcDogbm93cmFwO1xuICAgIGZsZXgtd3JhcDogbm93cmFwO1xufVxuLmZsZXgtd3JhcChAZncpIHdoZW4gKEBmdyA9IHdyYXApIHtcbiAgICAtd2Via2l0LWJveC1saW5lczogbXVsdGlwbGU7XG4gICAgLW1vei1ib3gtbGluZXM6IG11bHRpcGxlO1xuICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwO1xuICAgIC1tcy1mbGV4LXdyYXA6IHdyYXA7XG4gICAgZmxleC13cmFwOiB3cmFwO1xufVxuLmZsZXgtd3JhcChAZncpIHdoZW4gbm90IChAZncgPSB3cmFwKSBhbmQgbm90IChAZncgPSBub3dyYXApIHtcbiAgICAtd2Via2l0LWZsZXgtd3JhcDogQGZ3O1xuICAgIC1tcy1mbGV4LXdyYXA6IEBmdztcbiAgICBmbGV4LXdyYXA6IEBmdztcbn1cbi5mbGV4LXNocmluayhAZnMpIHtcbiAgICAtd2Via2l0LWZsZXgtc2hyaW5rOiBAZnM7XG4gICAgLW1zLWZsZXg6IDAgQGZzIGF1dG87XG4gICAgZmxleC1zaHJpbms6IEBmcztcbn1cbi5qdXN0aWZ5LWNvbnRlbnQoQGpjKSB3aGVuIChAamMgPSBmbGV4LXN0YXJ0KSB7XG4gICAgLXdlYmtpdC1ib3gtcGFjazogc3RhcnQ7XG4gICAgLW1zLWZsZXgtcGFjazogc3RhcnQ7XG4gICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xufVxuLmp1c3RpZnktY29udGVudChAamMpIHdoZW4gKEBqYyA9IGZsZXgtZW5kKSB7XG4gICAgLXdlYmtpdC1ib3gtcGFjazogZW5kO1xuICAgIC1tcy1mbGV4LXBhY2s6IGVuZDtcbiAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDtcbn1cbi5qdXN0aWZ5LWNvbnRlbnQoQGpjKSB3aGVuIChAamMgPSBzcGFjZS1iZXR3ZWVuKSB7XG4gICAgLXdlYmtpdC1ib3gtcGFjazoganVzdGlmeTtcbiAgICAtbXMtZmxleC1wYWNrOiBqdXN0aWZ5O1xuICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbjtcbn1cbi5qdXN0aWZ5LWNvbnRlbnQoQGpjKSB3aGVuIG5vdCAoQGpjID0gZmxleC1zdGFydCkgYW5kIG5vdCAoQGpjID0gZmxleC1lbmQpIGFuZCBub3QgKEBqYyA9IHNwYWNlLWJldHdlZW4pIHtcbiAgICAtd2Via2l0LWJveC1wYWNrOiBAamM7XG4gICAgLW1zLWZsZXgtcGFjazogQGpjO1xuICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBAamM7XG4gICAganVzdGlmeS1jb250ZW50OiBAamM7XG59XG4uYWxpZ24taXRlbXMoQGFpKSB3aGVuIChAYWkgPSBmbGV4LXN0YXJ0KSB7XG4gICAgLXdlYmtpdC1ib3gtYWxpZ246IHN0YXJ0O1xuICAgIC1tcy1mbGV4LWFsaWduOiBzdGFydDtcbiAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xufVxuLmFsaWduLWl0ZW1zKEBhaSkgd2hlbiAoQGFpID0gZmxleC1lbmQpIHtcbiAgICAtd2Via2l0LWJveC1hbGlnbjogZW5kO1xuICAgIC1tcy1mbGV4LWFsaWduOiBlbmQ7XG4gICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1lbmQ7XG4gICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xufVxuLmFsaWduLWl0ZW1zKEBhaSkgd2hlbiBub3QgKEBhaSA9IGZsZXgtc3RhcnQpIGFuZCBub3QgKEBhaSA9IGZsZXgtZW5kKSB7XG4gICAgLXdlYmtpdC1ib3gtYWxpZ246IEBhaTtcbiAgICAtbXMtZmxleC1hbGlnbjogQGFpO1xuICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IEBhaTtcbiAgICBhbGlnbi1pdGVtczogQGFpO1xufVxuLmFsaWduLWNvbnRlbnQoQGFpKSB7XG4gICAgLW1zLWZsZXgtbGluZS1wYWNrOiBAYWk7XG4gICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBAYWk7XG4gICAgYWxpZ24tY29udGVudDogQGFpO1xufVxuLmFsaWduLXNlbGYoQGFzKSB7XG4gICAgLW1zLWZsZXgtaXRlbS1hbGlnbjogQGFzO1xuICAgIC13ZWJraXQtYWxpZ24tc2VsZjogQGFzO1xuICAgIGFsaWduLXNlbGY6IEBhcztcbn1cbi5jbGVhcmZpeCgpIHtcbiAgICAmOmJlZm9yZSxcbiAgICAmOmFmdGVyIHtcbiAgICAgICAgY29udGVudDogXCIgXCI7XG4gICAgICAgIGRpc3BsYXk6IHRhYmxlO1xuICAgIH1cbiAgICAmOmFmdGVyIHtcbiAgICAgICAgY2xlYXI6IGJvdGg7XG4gICAgfVxufVxuLmhhaXJsaW5lKEBwb3NpdGlvbiwgQGNvbG9yKSB3aGVuIChAcG9zaXRpb24gPSB0b3ApIHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgYm90dG9tOiBhdXRvO1xuICAgICAgICByaWdodDogYXV0bztcbiAgICAgICAgaGVpZ2h0OiAxcHg7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB6LWluZGV4OiAxNTtcbiAgICAgICAgLnRyYW5zZm9ybS1vcmlnaW4oNTAlIDAlKTtcbiAgICAgICAgaHRtbC5waXhlbC1yYXRpby0yICYge1xuICAgICAgICAgICAgLnRyYW5zZm9ybShzY2FsZVkoMC41KSk7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbC5waXhlbC1yYXRpby0zICYge1xuICAgICAgICAgICAgLnRyYW5zZm9ybShzY2FsZVkoMC4zMykpO1xuICAgICAgICB9XG4gICAgfVxufVxuLmhhaXJsaW5lKEBwb3NpdGlvbiwgQGNvbG9yKSB3aGVuIChAcG9zaXRpb24gPSBsZWZ0KSB7XG4gICAgJjpiZWZvcmUge1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIGJvdHRvbTogYXV0bztcbiAgICAgICAgcmlnaHQ6IGF1dG87XG4gICAgICAgIHdpZHRoOiAxcHg7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgei1pbmRleDogMTU7XG4gICAgICAgIC50cmFuc2Zvcm0tb3JpZ2luKDAlIDUwJSk7XG4gICAgICAgIGh0bWwucGl4ZWwtcmF0aW8tMiAmIHtcbiAgICAgICAgICAgIC50cmFuc2Zvcm0oc2NhbGVYKDAuNSkpO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwucGl4ZWwtcmF0aW8tMyAmIHtcbiAgICAgICAgICAgIC50cmFuc2Zvcm0oc2NhbGVYKDAuMzMpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi5oYWlybGluZShAcG9zaXRpb24sIEBjb2xvcikgd2hlbiAoQHBvc2l0aW9uID0gYm90dG9tKSB7XG4gICAgJjphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgcmlnaHQ6IGF1dG87XG4gICAgICAgIHRvcDogYXV0bztcbiAgICAgICAgaGVpZ2h0OiAxcHg7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB6LWluZGV4OiAxNTtcbiAgICAgICAgLnRyYW5zZm9ybS1vcmlnaW4oNTAlIDEwMCUpO1xuICAgICAgICBodG1sLnBpeGVsLXJhdGlvLTIgJiB7XG4gICAgICAgICAgICAudHJhbnNmb3JtKHNjYWxlWSgwLjUpKTtcbiAgICAgICAgfVxuICAgICAgICBodG1sLnBpeGVsLXJhdGlvLTMgJiB7XG4gICAgICAgICAgICAudHJhbnNmb3JtKHNjYWxlWSgwLjMzKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4uaGFpcmxpbmUoQHBvc2l0aW9uLCBAY29sb3IpIHdoZW4gKEBwb3NpdGlvbiA9IHJpZ2h0KSB7XG4gICAgJjphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIGxlZnQ6IGF1dG87XG4gICAgICAgIGJvdHRvbTogYXV0bztcbiAgICAgICAgd2lkdGg6IDFweDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB6LWluZGV4OiAxNTtcbiAgICAgICAgLnRyYW5zZm9ybS1vcmlnaW4oMTAwJSA1MCUpO1xuICAgICAgICBodG1sLnBpeGVsLXJhdGlvLTIgJiB7XG4gICAgICAgICAgICAudHJhbnNmb3JtKHNjYWxlWCgwLjUpKTtcbiAgICAgICAgfVxuICAgICAgICBodG1sLnBpeGVsLXJhdGlvLTMgJiB7XG4gICAgICAgICAgICAudHJhbnNmb3JtKHNjYWxlWCgwLjMzKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vLyBGb3IgcmlnaHQgYW5kIGJvdHRvbVxuLmhhaXJsaW5lLXJlbW92ZShAcG9zaXRpb24pIHdoZW4gbm90IChAcG9zaXRpb24gPSBsZWZ0KSBhbmQgbm90IChAcG9zaXRpb24gPSB0b3ApIHtcbiAgICAmOmFmdGVyIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG59XG4vLyBGb3IgbGVmdCBhbmQgdG9wXG4uaGFpcmxpbmUtcmVtb3ZlKEBwb3NpdGlvbikgd2hlbiBub3QgKEBwb3NpdGlvbiA9IHJpZ2h0KSBhbmQgbm90IChAcG9zaXRpb24gPSBib3R0b20pIHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxufVxuLy8gRm9yIHJpZ2h0IGFuZCBib3R0b21cbi5oYWlybGluZS1jb2xvcihAcG9zaXRpb24sIEBjb2xvcikgd2hlbiBub3QgKEBwb3NpdGlvbiA9IGxlZnQpIGFuZCBub3QgKEBwb3NpdGlvbiA9IHRvcCkge1xuICAgICY6YWZ0ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG4gICAgfVxufVxuLy8gRm9yIGxlZnQgYW5kIHRvcFxuLmhhaXJsaW5lLWNvbG9yKEBwb3NpdGlvbiwgQGNvbG9yKSB3aGVuIG5vdCAoQHBvc2l0aW9uID0gcmlnaHQpIGFuZCBub3QgKEBwb3NpdGlvbiA9IGJvdHRvbSkge1xuICAgICY6YmVmb3JlIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yO1xuICAgIH1cbn1cblxuLy8gRW5jb2RlZCBTVkcgQmFja2dyb3VuZFxuLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoQHN2Zykge1xuICAgIEB1cmw6IGBlbmNvZGVVUklDb21wb25lbnQoQHtzdmd9KWA7XG4gICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsQHt1cmx9XCIpO1xufVxuXG4vLyBCYWNrZHJvcCBCbHVyXG4uYmFja2Ryb3AtYmx1cihAYmx1cikge1xuICAgIC13ZWJraXQtYmFja2Ryb3AtZmlsdGVyOiBibHVyKEBibHVyKTtcbiAgICBiYWNrZHJvcC1maWx0ZXI6IGJsdXIoQGJsdXIpO1xufVxuXG4vLyBQcmVzZXJ2ZTNEXG4ucHJlc2VydmUzZCgpIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG4gICAgLW1vei10cmFuc2Zvcm0tc3R5bGU6IHByZXNlcnZlLTNkO1xuICAgIC1tcy10cmFuc2Zvcm0tc3R5bGU6IHByZXNlcnZlLTNkO1xuICAgIHRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG59XG5cbi8vIE5vIFNjcm9sbGJhclxuLm5vLXNjcm9sbGJhcigpIHtcbiAgICAmOjotd2Via2l0LXNjcm9sbGJhciB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgICAgd2lkdGg6IDAgIWltcG9ydGFudDtcbiAgICAgICAgaGVpZ2h0OiAwICFpbXBvcnRhbnQ7XG4gICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgb3BhY2l0eTogMCAhaW1wb3J0YW50O1xuICAgIH1cbn1cbi8vIEJhcnMgSW5wdXRcbi5iYXJzLWlucHV0KCkge1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xuICAgIC1tcy1hcHBlYXJhbmNlOiBub25lO1xuICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgYm9yZGVyLXJhZGl1czogNXB4O1xuICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAgIGNvbG9yOiMwMDA7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgcGFkZGluZzogMCA4cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbn1cbi5uby1oYWlybGluZXMoKSB7XG4gICAgJi5uby1oYWlybGluZXMsICYubm8taGFpcmxpbmVzIHVsLCAmLm5vLWhhaXJsaW5lcyAuY29udGVudC1ibG9jay1pbm5lciB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUodG9wKTtcbiAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgIH1cbn1cbi5uby1oYWlybGluZXMtYmV0d2VlbigpIHtcbiAgICAmLm5vLWhhaXJsaW5lcy1iZXR3ZWVuIHtcbiAgICAgICAgLml0ZW0taW5uZXIsIC5saXN0LWJ1dHRvbiwgLml0ZW0tZGl2aWRlciwgLmxpc3QtZ3JvdXAtdGl0bGUsIC5saXN0LWdyb3VwLXRpdGxlIHtcbiAgICAgICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKiA9PT0gVmlld3MgPT09ICovXG4udmlld3MsIC52aWV3IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHotaW5kZXg6IDUwMDA7XG59XG4udmlld3Mge1xuICAgIC5zY3JvbGxhYmxlKCk7XG59XG4udmlldyB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuIiwiLyogPT09IFBhZ2VzID09PSAqL1xuXG4vLyBQYWdlcyBhbmltYXRpb25zXG5AcGFnZUR1cmF0aW9uOiA0MDBtcztcblxuLnBhZ2VzIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYmFja2dyb3VuZDogIzAwMDtcbn1cbi5wYWdlIHtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYmFja2dyb3VuZDogI2VmZWZmNDtcbiAgICAudHJhbnNsYXRlM2QoMCwwLDApO1xuICAgICYuY2FjaGVkIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG59XG4ucGFnZS1vbi1sZWZ0IHtcbiAgICBvcGFjaXR5OiAwLjk7XG4gICAgLnRyYW5zbGF0ZTNkKC0yMCUpO1xufVxuLnBhZ2Utb24tY2VudGVyIHtcbiAgICAuc3dpcGViYWNrLXBhZ2Utc2hhZG93IHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG59XG4ucGFnZS1vbi1yaWdodCB7XG4gICAgLnRyYW5zbGF0ZTNkKDEwMCUpO1xuICAgIC5zd2lwZWJhY2stcGFnZS1zaGFkb3cge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgIH1cbn1cbi5wYWdlLWNvbnRlbnQge1xuICAgIC5zY3JvbGxhYmxlKCk7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHotaW5kZXg6IDE7XG59XG5cbi8vIFBhZ2UgU2hhZG93XG4ucGFnZS1mYWtlLXNoYWRvdygpIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IDEwMCU7XG4gICAgdG9wOiAwO1xuICAgIHdpZHRoOiAxNnB4O1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBiYWNrZ3JvdW5kOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDAsMCwwLDApIDAlLCByZ2JhKDAsMCwwLDApIDEwJSwgcmdiYSgwLDAsMCwwLjAxKSA1MCUsIHJnYmEoMCwwLDAsMC4yKSAxMDAlKTtcbiAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwwLDAsMCkgMCUsIHJnYmEoMCwwLDAsMCkgMTAlLCByZ2JhKDAsMCwwLDAuMDEpIDUwJSwgcmdiYSgwLDAsMCwwLjIpIDEwMCUpO1xuICAgIHotaW5kZXg6IC0xO1xuICAgIGNvbnRlbnQ6ICcnO1xuICAgIGh0bWwuYW5kcm9pZCAmIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgLmFuaW1hdGlvbihub25lKTtcbiAgICB9XG59XG4uc3dpcGViYWNrLXBhZ2Utc2hhZG93IHtcbiAgICAucGFnZS1mYWtlLXNoYWRvdygpO1xufVxuXG5cbi8vQ2xhc3MgdGhhdCB3aWxsIHRyaWdnZXIgdHJhbnNpdGlvbiBkdXJpbmcgcGFnZSBjdXN0b20gdHJhbnNpdGlvbnMgKGxpa2Ugc3dpcGUtYmFjaylcbi5wYWdlLXRyYW5zaXRpb25pbmcge1xuICAgICYsIC5zd2lwZWJhY2stcGFnZS1zaGFkb3cge1xuICAgICAgICAudHJhbnNpdGlvbihAcGFnZUR1cmF0aW9uKTtcbiAgICB9XG59XG4ucGFnZS1mcm9tLXJpZ2h0LXRvLWNlbnRlciwgLnBhZ2UtZnJvbS1jZW50ZXItdG8tcmlnaHQge1xuICAgICY6YmVmb3JlIHtcbiAgICAgICAgLnBhZ2UtZmFrZS1zaGFkb3coKTtcbiAgICB9XG59XG4vLyBGcm9tL3RvIFJpZ2h0IFRvL2Zyb20gQ2VudGVyIGFuaW1hdGlvbnNcbi5wYWdlLWZyb20tcmlnaHQtdG8tY2VudGVyIHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICAgIC5hbmltYXRpb24ocGFnZUZyb21SaWdodFRvQ2VudGVyU2hhZG93IEBwYWdlRHVyYXRpb24gZm9yd2FyZHMpO1xuICAgIH1cbiAgICAuYW5pbWF0aW9uKHBhZ2VGcm9tUmlnaHRUb0NlbnRlciBAcGFnZUR1cmF0aW9uIGZvcndhcmRzKTtcbn1cbi5wYWdlLWZyb20tY2VudGVyLXRvLXJpZ2h0IHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICAgIC5hbmltYXRpb24ocGFnZUZyb21DZW50ZXJUb1JpZ2h0U2hhZG93IEBwYWdlRHVyYXRpb24gZm9yd2FyZHMpO1xuICAgIH1cbiAgICAuYW5pbWF0aW9uKHBhZ2VGcm9tQ2VudGVyVG9SaWdodCBAcGFnZUR1cmF0aW9uIGZvcndhcmRzKTtcbn1cbkAtd2Via2l0LWtleWZyYW1lcyBwYWdlRnJvbVJpZ2h0VG9DZW50ZXIge1xuICAgIGZyb20ge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMTAwJSwwLDApO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgfVxufVxuQGtleWZyYW1lcyBwYWdlRnJvbVJpZ2h0VG9DZW50ZXIge1xuICAgIGZyb20ge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsMCwwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgcGFnZUZyb21SaWdodFRvQ2VudGVyU2hhZG93IHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcGFnZUZyb21SaWdodFRvQ2VudGVyU2hhZG93IHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbn1cbkAtd2Via2l0LWtleWZyYW1lcyBwYWdlRnJvbUNlbnRlclRvUmlnaHQge1xuICAgIGZyb20ge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwwLDApO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMDAlLDAsMCk7XG4gICAgfVxufVxuQGtleWZyYW1lcyBwYWdlRnJvbUNlbnRlclRvUmlnaHQge1xuICAgIGZyb20ge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsMCwwKTtcbiAgICB9XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgcGFnZUZyb21DZW50ZXJUb1JpZ2h0U2hhZG93IHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcGFnZUZyb21DZW50ZXJUb1JpZ2h0U2hhZG93IHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgIH1cbn1cblxuXG4vLyBGcm9tL3RvIENlbnRlciBUby9mcm9tIExlZnQgYW5pbWF0aW9uc1xuLnBhZ2UtZnJvbS1jZW50ZXItdG8tbGVmdCB7XG4gICAgLmFuaW1hdGlvbihwYWdlRnJvbUNlbnRlclRvTGVmdCBAcGFnZUR1cmF0aW9uIGZvcndhcmRzKTtcbn1cbi5wYWdlLWZyb20tbGVmdC10by1jZW50ZXIge1xuICAgIC5hbmltYXRpb24ocGFnZUZyb21MZWZ0VG9DZW50ZXIgQHBhZ2VEdXJhdGlvbiBmb3J3YXJkcyk7XG59XG5cbkAtd2Via2l0LWtleWZyYW1lcyBwYWdlRnJvbUNlbnRlclRvTGVmdCB7XG4gICAgZnJvbSB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgfVxuICAgIHRvIHtcbiAgICAgICAgb3BhY2l0eTogMC45O1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTIwJSwwLDApO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcGFnZUZyb21DZW50ZXJUb0xlZnQge1xuICAgIGZyb20ge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAwLjk7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTIwJSwwLDApO1xuICAgIH1cbn1cbkAtd2Via2l0LWtleWZyYW1lcyBwYWdlRnJvbUxlZnRUb0NlbnRlciB7XG4gICAgZnJvbSB7XG4gICAgICAgIG9wYWNpdHk6IDAuOTtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0yMCUsMCwwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwwLDApO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcGFnZUZyb21MZWZ0VG9DZW50ZXIge1xuICAgIGZyb20ge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKC0yMCUsMCwwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG59IiwiLyogPT09IFRvb2xiYXJzID09PSAqL1xuXG4vL1Rvb2xiYXIvTmF2YmFyXG5AdG9vbGJhckJnIDogI2Y3ZjdmODtcbkB0b29sYmFyQmdCbHVyZWQ6IHJnYmEoMjQ4LDI0OCwyNDksIDAuODUpO1xuQHRvb2xiYXJCb3JkZXJDb2xvcjogI2M0YzRjNDtcbkB0b29sYmFyTGlua3NDb2xvcjogQHRoZW1lQ29sb3I7XG5AdG9vbGJhclNpemU6IDQ0cHg7XG5cbi8vVGFiIGJhclxuQHRhYmJhckxhYmVsc1NpemU6IDUwcHg7XG5AdGFiYmFyTGlua3NDb2xvcjogIzkyOTI5MjtcbkB0YWJiYXJBY3RpdmVMaW5rc0NvbG9yOiBAdGhlbWVDb2xvcjtcbkB0YWJiYXJMYWJlbHNTaXplVGFibGV0OiA1NnB4O1xuXG4vLyBUb29sYmFycyBhbmltYXRpb25zXG5AdG9vbGJhckR1cmF0aW9uOiA0MDBtcztcblxuLm5hdmJhci1pbm5lciwgLnRvb2xiYXItaW5uZXIge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgcGFkZGluZzogMCA4cHg7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAuZmxleGJveCgpO1xuICAgIC5qdXN0aWZ5LWNvbnRlbnQoc3BhY2UtYmV0d2Vlbik7XG4gICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG59XG4ubmF2YmFyLWlubmVyLmNhY2hlZCB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbi5uYXZiYXIsIC50b29sYmFyIHtcbiAgICBoZWlnaHQ6IEB0b29sYmFyU2l6ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGZvbnQtc2l6ZTogMTdweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHotaW5kZXg6IDUwMDtcbiAgICAtd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgYiB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICAgIGh0bWwuaW9zLWd0LTggJiB7XG4gICAgICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICB9XG4gICAgfVxufVxuLm5hdmJhciwgLnRvb2xiYXIsIC5zdWJuYXZiYXIge1xuICAgIGJhY2tncm91bmQ6IEB0b29sYmFyQmc7XG4gICAgYS5saW5rIHtcbiAgICAgICAgbGluZS1oZWlnaHQ6IEB0b29sYmFyU2l6ZTtcbiAgICAgICAgaGVpZ2h0OiBAdG9vbGJhclNpemU7XG4gICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICAuanVzdGlmeS1jb250ZW50KGZsZXgtc3RhcnQpO1xuICAgICAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbiAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICAudHJhbnNmb3JtKHRyYW5zbGF0ZVooMHB4KSk7XG4gICAgICAgIGh0bWw6bm90KC53YXRjaC1hY3RpdmUtc3RhdGUpICY6YWN0aXZlLCAmLmFjdGl2ZS1zdGF0ZSB7XG4gICAgICAgICAgICBvcGFjaXR5OiAwLjM7XG4gICAgICAgICAgICAudHJhbnNpdGlvbigwbXMpO1xuICAgICAgICB9XG4gICAgICAgIGkrc3BhbiwgaStpLCBzcGFuK2ksIHNwYW4rc3BhbiB7XG4gICAgICAgICAgICBtYXJnaW4tbGVmdDogN3B4O1xuICAgICAgICB9XG4gICAgfVxuICAgIGEuaWNvbi1vbmx5IHtcbiAgICAgICAgbWluLXdpZHRoOiBAdG9vbGJhclNpemU7XG4gICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgIC5qdXN0aWZ5LWNvbnRlbnQoY2VudGVyKTtcbiAgICAgICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICB9XG4gICAgaS5pY29uIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxufVxuLm5hdmJhciB7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgLmhhaXJsaW5lKGJvdHRvbSwgQHRvb2xiYXJCb3JkZXJDb2xvcik7XG4gICAgJjphZnRlciB7XG4gICAgICAgIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICB9XG4gICAgJi5uby1ib3JkZXIge1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgfVxuICAgIC5jZW50ZXIge1xuICAgICAgICBmb250LXNpemU6IDE3cHg7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICAgIGh0bWwuaW9zLWd0LTggJiB7XG4gICAgICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICB9XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiBAdG9vbGJhclNpemU7XG4gICAgICAgIC5mbGV4LXNocmluaygxMCk7XG4gICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgIC5hbGlnbi1pdGVtcyhjZW50ZXIpO1xuICAgIH1cbiAgICAubGVmdCwgLnJpZ2h0IHtcbiAgICAgICAgLmZsZXgtc2hyaW5rKDApO1xuICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICAuanVzdGlmeS1jb250ZW50KGZsZXgtc3RhcnQpO1xuICAgICAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICAgICAgYSthIHtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4O1xuICAgICAgICB9XG4gICAgfVxuICAgIC5sZWZ0IHtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICAgIH1cbiAgICAucmlnaHQge1xuICAgICAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgICB9XG4gICAgLnJpZ2h0OmZpcnN0LWNoaWxkIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICByaWdodDogOHB4O1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgfVxuICAgIC5wb3B1cCAmIHtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG59XG4uc3VibmF2YmFyIHtcbiAgICBoZWlnaHQ6IEB0b29sYmFyU2l6ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDEwMCU7XG4gICAgbWFyZ2luLXRvcDogLTFweDtcbiAgICB6LWluZGV4OiAyMDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIHBhZGRpbmc6IDAgOHB4O1xuICAgIC5mbGV4Ym94KCk7XG4gICAgLmp1c3RpZnktY29udGVudChzcGFjZS1iZXR3ZWVuKTtcbiAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbiAgICAuaGFpcmxpbmUoYm90dG9tLCBAdG9vbGJhckJvcmRlckNvbG9yKTtcbiAgICAmLm5vLWJvcmRlciB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICB9XG4gICAgLm5hdmJhci5uby1ib3JkZXIgJiB7XG4gICAgICAgIG1hcmdpbi10b3A6IDA7XG4gICAgfVxuICAgIC5uYXZiYXItb24tbGVmdCAmLCAubmF2YmFyLW9uLXJpZ2h0ICZ7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIH1cbiAgICAubmF2YmFyICYsIC5wYWdlICYge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgfVxuICAgIC5wYWdlID4gJiB7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICB9XG4gICAgPiAuYnV0dG9ucy1yb3cge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG4gICAgLnNlYXJjaGJhciwgJi5zZWFyY2hiYXIge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgfVxuICAgICYuc2VhcmNoYmFyLCAuc2VhcmNoYmFyIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgICAuc2VhcmNoYmFyIHtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgdG9wOiAwO1xuICAgIH1cbn1cbi50b29sYmFyIHtcbiAgICBsZWZ0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICAuaGFpcmxpbmUodG9wLCBAdG9vbGJhckJvcmRlckNvbG9yKTtcbiAgICAmLm5vLWJvcmRlciB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUodG9wKTtcbiAgICB9XG4gICAgYSB7XG4gICAgICAgIC5mbGV4LXNocmluaygxKTtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICB0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIH1cbn1cblxuLy8gVGFiYmFyXG4udGFiYmFyIHtcbiAgICBjb2xvcjogQHRhYmJhckxpbmtzQ29sb3I7XG4gICAgei1pbmRleDogNTAwMTtcbiAgICBhIHtcbiAgICAgICAgY29sb3I6IEB0YWJiYXJMaW5rc0NvbG9yO1xuICAgIH1cbiAgICBhLmFjdGl2ZSB7XG4gICAgICAgIGNvbG9yOiBAdGFiYmFyQWN0aXZlTGlua3NDb2xvcjtcbiAgICB9XG4gICAgYS5saW5rIHtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICB9XG4gICAgYS50YWItbGluaywgYS5saW5rIHtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgLmZsZXhib3goKTtcbiAgICAgICAgLmp1c3RpZnktY29udGVudChjZW50ZXIpO1xuICAgICAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgICAgIC13ZWJraXQtYm94LWZsZXg6IDE7XG4gICAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgICAgICAtbW96LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIH1cbiAgICBpLmljb24ge1xuICAgICAgICBoZWlnaHQ6IDMwcHg7XG4gICAgfVxufVxuLnRhYmJhci1sYWJlbHMge1xuICAgIGhlaWdodDogQHRhYmJhckxhYmVsc1NpemU7XG4gICAgYS50YWItbGluaywgYS5saW5rIHtcbiAgICAgICAgcGFkZGluZy10b3A6IDRweDtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDRweDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAuanVzdGlmeS1jb250ZW50KHNwYWNlLWJldHdlZW4pO1xuICAgICAgICBpICsgc3BhbiB7XG4gICAgICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgc3Bhbi50YWJiYXItbGFiZWwge1xuICAgICAgICBsaW5lLWhlaWdodDogMTtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDFlbTtcbiAgICAgICAgZm9udC1zaXplOiAxMHB4O1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIH1cbn1cbi5zdWJuYXZiYXIsIC5uYXZiYXIge1xuICAgIGlucHV0W3R5cGU9XCJ0ZXh0XCJdLCBpbnB1dFt0eXBlPVwicGFzc3dvcmRcIl0sIGlucHV0W3R5cGU9XCJzZWFyY2hcIl0sIGlucHV0W3R5cGU9XCJlbWFpbFwiXSwgaW5wdXRbdHlwZT1cInRlbFwiXSwgaW5wdXRbdHlwZT1cInVybFwiXSB7XG4gICAgICAgIC5iYXJzLWlucHV0KCk7XG4gICAgfVxufVxuQG1lZGlhIGFsbCBhbmQgKG1pbi13aWR0aDo3NjhweCkge1xuICAgIC50YWJiYXIge1xuICAgICAgICAudG9vbGJhci1pbm5lciB7XG4gICAgICAgICAgICAuanVzdGlmeS1jb250ZW50KGNlbnRlcik7XG4gICAgICAgIH1cbiAgICAgICAgYS50YWItbGluaywgYS5saW5rIHtcbiAgICAgICAgICAgIHdpZHRoOiBhdXRvO1xuICAgICAgICAgICAgbWluLXdpZHRoOiAxMDVweDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAudGFiYmFyLWxhYmVscyB7XG4gICAgICAgIGhlaWdodDogQHRhYmJhckxhYmVsc1NpemVUYWJsZXQ7XG4gICAgICAgIHNwYW4udGFiYmFyLWxhYmVsIHtcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLm5hdmJhci1mcm9tLXJpZ2h0LXRvLWNlbnRlciB7XG4gICAgLmxlZnQsIC5yaWdodCwgLmNlbnRlciwgLnN1Ym5hdmJhciwgLmZhZGluZyB7XG4gICAgICAgIC5hbmltYXRpb24obmF2YmFyRWxlbWVudEZhZGVJbiBAdG9vbGJhckR1cmF0aW9uIGZvcndhcmRzKTtcbiAgICB9XG4gICAgLnNsaWRpbmcge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbiAgICBcbn1cbi5uYXZiYXItZnJvbS1jZW50ZXItdG8tcmlnaHQge1xuICAgIC5sZWZ0LCAucmlnaHQsIC5jZW50ZXIsIC5zdWJuYXZiYXIsIC5mYWRpbmcge1xuICAgICAgICAuYW5pbWF0aW9uKG5hdmJhckVsZW1lbnRGYWRlT3V0IEB0b29sYmFyRHVyYXRpb24gZm9yd2FyZHMpO1xuICAgIH1cbiAgICAuc2xpZGluZyB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgfVxuICAgIC5zdWJuYXZiYXIuc2xpZGluZyB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIG5hdmJhckVsZW1lbnRGYWRlSW4ge1xuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgfVxufVxuQGtleWZyYW1lcyBuYXZiYXJFbGVtZW50RmFkZUluIHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbn1cbi5uYXZiYXItZnJvbS1jZW50ZXItdG8tbGVmdCB7XG4gICAgLmxlZnQsIC5yaWdodCwgLmNlbnRlciwgLnN1Ym5hdmJhciwgLmZhZGluZyB7XG4gICAgICAgIC5hbmltYXRpb24obmF2YmFyRWxlbWVudEZhZGVPdXQgQHRvb2xiYXJEdXJhdGlvbiBmb3J3YXJkcyk7XG4gICAgfVxuICAgIC5zbGlkaW5nIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICB9XG4gICAgLnN1Ym5hdmJhci5zbGlkaW5nIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG59XG4ubmF2YmFyLWZyb20tbGVmdC10by1jZW50ZXIge1xuICAgIC5sZWZ0LCAucmlnaHQsIC5jZW50ZXIsIC5zdWJuYXZiYXIsIC5mYWRpbmcge1xuICAgICAgICAuYW5pbWF0aW9uKG5hdmJhckVsZW1lbnRGYWRlSW4gQHRvb2xiYXJEdXJhdGlvbiBmb3J3YXJkcyk7XG4gICAgfVxuICAgIC5zbGlkaW5nIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG59XG4ubmF2YmFyLW9uLWxlZnQge1xuICAgIC5sZWZ0LCAucmlnaHQsIC5jZW50ZXIsIC5zdWJuYXZiYXIsIC5mYWRpbmcge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgIH1cbiAgICAuc2xpZGluZyB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgfVxuICAgIC5zdWJuYXZiYXIuc2xpZGluZyB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIC50cmFuc2xhdGUzZCgtMTAwJSwwLDApO1xuICAgIH1cbn1cbi5uYXZiYXItb24tcmlnaHQge1xuICAgIC5sZWZ0LCAucmlnaHQsIC5jZW50ZXIsIC5zdWJuYXZiYXIsIC5mYWRpbmcge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgIH1cbiAgICAuc2xpZGluZyB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgfVxuICAgIC5zdWJuYXZiYXIuc2xpZGluZyB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgxMDAlLDAsMCk7XG4gICAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIG5hdmJhckVsZW1lbnRGYWRlT3V0IHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgbmF2YmFyRWxlbWVudEZhZGVPdXQge1xuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgfVxufVxuLm5hdmJhci1mcm9tLXJpZ2h0LXRvLWNlbnRlciwgLm5hdmJhci1mcm9tLWNlbnRlci10by1yaWdodCwgLm5hdmJhci1mcm9tLWNlbnRlci10by1sZWZ0LCAubmF2YmFyLWZyb20tbGVmdC10by1jZW50ZXIge1xuICAgIC5sZWZ0LnNsaWRpbmcgLmJhY2subGluayAuaWNvbiB7XG4gICAgICAgIC50cmFuc2l0aW9uKEB0b29sYmFyRHVyYXRpb24pO1xuICAgIH1cbiAgICAuc2xpZGluZyB7XG4gICAgICAgIC50cmFuc2l0aW9uKEB0b29sYmFyRHVyYXRpb24pO1xuICAgICAgICAuYW5pbWF0aW9uKG5vbmUpO1xuICAgIH1cbn0iLCIvKiA9PT0gUmVsYXRpb24gYmV0d2VlbiB0b29sYmFyL25hdmJhciB0eXBlcyBhbmQgcGFnZXMgPT09ICovXG4ucGFnZSwgLnZpZXcsIC52aWV3c3tcbiAgICA+Lm5hdmJhciwgPi50b29sYmFyIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbn1cbi5zdWJuYXZiYXIgfiAucGFnZS1jb250ZW50IHtcbiAgICBwYWRkaW5nLXRvcDogQHRvb2xiYXJTaXplO1xufVxuLm5hdmJhci10aHJvdWdoLCAubmF2YmFyLWZpeGVkIHtcbiAgICAucGFnZS1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZy10b3A6IEB0b29sYmFyU2l6ZTtcbiAgICB9XG4gICAgLndpdGgtc3VibmF2YmFyIC5wYWdlLWNvbnRlbnQsIC5wYWdlLWNvbnRlbnQud2l0aC1zdWJuYXZiYXIsIC5zdWJuYXZiYXIgfiAucGFnZS1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZy10b3A6IEB0b29sYmFyU2l6ZSAqIDI7XG4gICAgfVxuICAgIC5wYWdlIC5zdWJuYXZiYXIsICYucGFnZSAuc3VibmF2YmFyIHtcbiAgICAgICAgdG9wOiBAdG9vbGJhclNpemU7XG4gICAgfVxufVxuXG4udG9vbGJhci10aHJvdWdoLCAudG9vbGJhci1maXhlZCwgLnRhYmJhci10aHJvdWdoLCAudGFiYmFyLWZpeGVkIHtcbiAgICAucGFnZS1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IEB0b29sYmFyU2l6ZTtcbiAgICB9XG59XG4udGFiYmFyLWxhYmVscy1maXhlZCwgLnRhYmJhci1sYWJlbHMtdGhyb3VnaCB7XG4gICAgLnBhZ2UtY29udGVudCB7XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiBAdGFiYmFyTGFiZWxzU2l6ZTtcbiAgICAgICAgQG1lZGlhIGFsbCBhbmQgKG1pbi13aWR0aDo3NjhweCkge1xuICAgICAgICAgICAgcGFkZGluZy1ib3R0b206IEB0YWJiYXJMYWJlbHNTaXplVGFibGV0O1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gUGFnZSBIaWRkZW4gTmF2YmFyXG4ubmF2YmFyIHtcbiAgICAmLm5hdmJhci1oaWRpbmcge1xuICAgICAgICAudHJhbnNpdGlvbig0MDBtcyk7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgICAgICYgfiAucGFnZS1jb250ZW50LCAmIH4gLnBhZ2VzLCAmIH4gLnBhZ2Uge1xuICAgICAgICAgICAgLmxpc3QtZ3JvdXAtdGl0bGUge1xuICAgICAgICAgICAgICAgIC50cmFuc2l0aW9uKDQwMG1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC5zdWJuYXZiYXIge1xuICAgICAgICAgICAgICAgIC50cmFuc2l0aW9uKDQwMG1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAmLm5hdmJhci1oaWRkZW4ge1xuICAgICAgICAudHJhbnNpdGlvbig0MDBtcyk7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLC0xMDAlLDApO1xuICAgICAgICAmIH4gLnBhZ2UtY29udGVudCwgJiB+IC5wYWdlcywgJiB+IC5wYWdlIHtcbiAgICAgICAgICAgIC5saXN0LWdyb3VwLXRpdGxlIHtcbiAgICAgICAgICAgICAgICAudHJhbnNpdGlvbig0MDBtcyk7XG4gICAgICAgICAgICAgICAgdG9wOi1AdG9vbGJhclNpemU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAuc3VibmF2YmFyIHtcbiAgICAgICAgICAgICAgICAudHJhbnNsYXRlM2QoMCwtMTAwJSwwKTtcbiAgICAgICAgICAgICAgICAudHJhbnNpdGlvbig0MDBtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4ucGFnZS5uby1uYXZiYXIge1xuICAgIC5wYWdlLWNvbnRlbnQge1xuICAgICAgICBwYWRkaW5nLXRvcDogMDtcbiAgICB9XG4gICAgJi53aXRoLXN1Ym5hdmJhciAucGFnZS1jb250ZW50LCAud2l0aC1zdWJuYXZiYXIgJiAucGFnZS1jb250ZW50LCAucGFnZS1jb250ZW50LndpdGgtc3VibmF2YmFyIHtcbiAgICAgICAgcGFkZGluZy10b3A6IEB0b29sYmFyU2l6ZTtcbiAgICB9XG59XG4vLyBQYWdlIEhpZGRlbiBUb29sYmFyXG4udG9vbGJhciwgLnRhYmJhciB7XG4gICAgJi50b29sYmFyLWhpZGluZywgJi50YWJiYXItaGlkaW5nIHtcbiAgICAgICAgLnRyYW5zaXRpb24oNDAwbXMpO1xuICAgICAgICAudHJhbnNsYXRlM2QoMCwwLDApO1xuICAgIH1cbiAgICAmLnRvb2xiYXItaGlkZGVuLCAmLnRhYmJhci1oaWRkZW4ge1xuICAgICAgICAudHJhbnNpdGlvbig0MDBtcyk7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLDEwMCUsMCk7XG4gICAgfVxufVxuLnBhZ2Uubm8tdG9vbGJhciAucGFnZS1jb250ZW50LCAucGFnZS5uby10YWJiYXIgLnBhZ2UtY29udGVudCB7XG4gICAgcGFkZGluZy1ib3R0b206IDA7XG59XG4iLCIvKiA9PT0gU2VhcmNoIEJhciA9PT0gKi9cbkBzZWFyY2hiYXJCZzogI2M5YzljZTtcbkBzZWFyY2hiYXJCb3JkZXJDb2xvcjogI2I0YjRiNDtcbkBzZWFyY2hiYXJTaXplOiA0NHB4O1xuLnNlYXJjaGJhciB7XG4gICAgaGVpZ2h0OiBAc2VhcmNoYmFyU2l6ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBiYWNrZ3JvdW5kOiBAc2VhcmNoYmFyQmc7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAuaGFpcmxpbmUoYm90dG9tLCBAc2VhcmNoYmFyQm9yZGVyQ29sb3IpO1xuICAgIHBhZGRpbmc6IDAgOHB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIC5mbGV4Ym94KCk7XG4gICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgLnNlYXJjaGJhci1pbnB1dCB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDI4cHg7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgLmZsZXgtc2hyaW5rKDEpO1xuICAgIH1cbiAgICBpbnB1dFt0eXBlPVwic2VhcmNoXCJdIHtcbiAgICAgICAgLmJhcnMtaW5wdXQoKTtcbiAgICAgICAgcGFkZGluZzogMCAyOHB4O1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDhweCBjZW50ZXI7XG4gICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxMyAxMycgZW5hYmxlLWJhY2tncm91bmQ9J25ldyAwIDAgMTMgMTMnPjxnPjxwYXRoIGZpbGw9JyM5MzkzOTgnIGQ9J001LDFjMi4yLDAsNCwxLjgsNCw0UzcuMiw5LDUsOVMxLDcuMiwxLDVTMi44LDEsNSwxIE01LDBDMi4yLDAsMCwyLjIsMCw1czIuMiw1LDUsNXM1LTIuMiw1LTVTNy44LDAsNSwwIEw1LDB6Jy8+PC9nPjxsaW5lIHN0cm9rZT0nIzkzOTM5OCcgc3Ryb2tlLW1pdGVybGltaXQ9JzEwJyB4MT0nMTIuNicgeTE9JzEyLjYnIHgyPSc4LjInIHkyPSc4LjInLz48L3N2Zz5cIik7XG4gICAgICAgIC13ZWJraXQtYmFja2dyb3VuZC1zaXplOiAxM3B4IDEzcHg7XG4gICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTNweCAxM3B4O1xuICAgICAgICAmOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHtcbiAgICAgICAgICAgIGNvbG9yOiAjOTM5Mzk4O1xuICAgICAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgfVxuICAgICAgICAmOjotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uIHtcbiAgICAgICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTpub25lO1xuICAgICAgICB9XG4gICAgfVxuICAgIC5zZWFyY2hiYXItY2xlYXIge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHdpZHRoOiAyOHB4O1xuICAgICAgICBoZWlnaHQ6IDI4cHg7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOm5vbmU7XG4gICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcbiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoXCI8c3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDI4IDI4Jz48Y2lyY2xlIGN4PScxNCcgY3k9JzE0JyByPScxNCcgZmlsbD0nIzhlOGU5MycvPjxsaW5lIHN0cm9rZT0nI2ZmZmZmZicgc3Ryb2tlLXdpZHRoPScyJyBzdHJva2UtbWl0ZXJsaW1pdD0nMTAnIHgxPSc4JyB5MT0nOCcgeDI9JzIwJyB5Mj0nMjAnLz48bGluZSBmaWxsPSdub25lJyBzdHJva2U9JyNmZmZmZmYnIHN0cm9rZS13aWR0aD0nMicgc3Ryb2tlLW1pdGVybGltaXQ9JzEwJyB4MT0nMjAnIHkxPSc4JyB4Mj0nOCcgeTI9JzIwJy8+PC9zdmc+XCIpO1xuICAgICAgICAtd2Via2l0LWJhY2tncm91bmQtc2l6ZTogMTRweCAxNHB4O1xuICAgICAgICBiYWNrZ3JvdW5kLXNpemU6IDE0cHggMTRweDtcbiAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgfVxuICAgIC5zZWFyY2hiYXItY2FuY2VsIHtcbiAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICAudHJhbnNsYXRlM2QoMCwwLDApO1xuICAgICAgICBmb250LXNpemU6IDE3cHg7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgLmZsZXgtc2hyaW5rKDApO1xuICAgICAgICBtYXJnaW4tbGVmdDogMDtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6bm9uZTtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gICAgJi5zZWFyY2hiYXItYWN0aXZlIHtcbiAgICAgICAgLnNlYXJjaGJhci1jYW5jZWwge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgICAgICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICAgICAgICAgIGh0bWw6bm90KC53YXRjaC1hY3RpdmUtc3RhdGUpICY6YWN0aXZlLCAmLmFjdGl2ZS1zdGF0ZSB7XG4gICAgICAgICAgICAgICAgb3BhY2l0eTogMC4zO1xuICAgICAgICAgICAgICAgIC50cmFuc2l0aW9uKDBtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgJi5zZWFyY2hiYXItbm90LWVtcHR5IHtcbiAgICAgICAgLnNlYXJjaGJhci1jbGVhciB7XG4gICAgICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICAgICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIH1cbiAgICB9XG59XG4uc2VhcmNoYmFyLW92ZXJsYXkge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgei1pbmRleDogMTAwO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgcG9pbnRlci1ldmVudHM6bm9uZTtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNCk7XG4gICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgJi5zZWFyY2hiYXItb3ZlcmxheS1hY3RpdmUge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICB9XG59XG4uc2VhcmNoYmFyLW5vdC1mb3VuZCB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbi5oaWRkZW4tYnktc2VhcmNoYmFyLCAubGlzdC1ibG9jayAuaGlkZGVuLWJ5LXNlYXJjaGJhciwgLmxpc3QtYmxvY2sgbGkuaGlkZGVuLWJ5LXNlYXJjaGJhciB7XG4gICAgZGlzcGxheTogbm9uZTtcbn1cbi5wYWdlID4gLnNlYXJjaGJhciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGxlZnQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIHotaW5kZXg6IDIwMDtcbiAgICAmIH4gLnBhZ2UtY29udGVudCB7XG4gICAgICAgIHBhZGRpbmctdG9wOiBAc2VhcmNoYmFyU2l6ZTtcbiAgICB9XG59XG4ubmF2YmFyLWZpeGVkLCAubmF2YmFyLXRocm91Z2gge1xuICAgIC5wYWdlID4gLnNlYXJjaGJhciwgPiAuc2VhcmNoYmFyIHtcbiAgICAgICAgdG9wOiBAdG9vbGJhclNpemU7XG4gICAgICAgICYgfiAucGFnZS1jb250ZW50IHtcbiAgICAgICAgICAgIHBhZGRpbmctdG9wOiBAc2VhcmNoYmFyU2l6ZSArIEB0b29sYmFyU2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKiA9PT0gTWVzc2FnZSBCYXIgPT09ICovXG4ubWVzc2FnZWJhciB7XG4gICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICAudHJhbnNpdGlvbigwbXMpO1xuICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgLmhhaXJsaW5lLXJlbW92ZSh0b3ApO1xuICAgIHRleHRhcmVhIHtcbiAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIC1tcy1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2M4YzhjZDtcbiAgICAgICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTdweDtcbiAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBhZGRpbmc6IDZweCAxNXB4O1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDM0cHg7XG4gICAgICAgIGNvbG9yOiAjMDAwO1xuICAgICAgICBmb250LXNpemU6IDE3cHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICAgICAgcmVzaXplOm5vbmU7XG4gICAgICAgIC5mbGV4LXNocmluaygxKTtcbiAgICB9XG4gICAgLmxpbmsge1xuICAgICAgICAuYWxpZ24tc2VsZihmbGV4LWVuZCk7XG4gICAgfVxuICAgIC5saW5rLmljb24tb25seTpmaXJzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAtNnB4O1xuICAgIH1cbiAgICAubGluazpub3QoLmljb24tb25seSkgKyB0ZXh0YXJlYSB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiA4cHg7XG4gICAgfVxuICAgIHRleHRhcmVhICsgLmxpbmsge1xuICAgICAgICBtYXJnaW4tbGVmdDogOHB4O1xuICAgIH1cbiAgICAubGluayB7XG4gICAgICAgIC5mbGV4LXNocmluaygwKTtcbiAgICB9XG4gICAgfiAucGFnZS1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IEB0b29sYmFyU2l6ZTtcbiAgICB9XG4gICAgLnBhZ2Uubm8tdG9vbGJhciAmIH4ucGFnZS1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IEB0b29sYmFyU2l6ZTtcbiAgICB9XG4gICAgLmhpZGRlbi10b29sYmFyICYge1xuICAgICAgICAudHJhbnNsYXRlM2QoMCwwLDApO1xuICAgICAgICAudHJhbnNpdGlvbigwbXMpO1xuICAgIH1cbn1cbiIsIi8qID09PSBJY29ucyA9PT0gKi9cbmkuaWNvbiB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgYmFja2dyb3VuZC1zaXplOiAxMDAlIGF1dG87XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgZm9udC1zdHlsZTogbm9ybWFsO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAmLmljb24tYmFjayB7XG4gICAgICAgIHdpZHRoOiAxMnB4O1xuICAgICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxMiAyMCc+PHBhdGggZD0nTTEwLDBsMiwybC04LDhsOCw4bC0yLDJMMCwxMEwxMCwweicgZmlsbD0nQHt0aGVtZUNvbG9yfScvPjwvc3ZnPlwiKTtcbiAgICB9XG4gICAgJi5pY29uLWZvcndhcmQge1xuICAgICAgICB3aWR0aDogMTJweDtcbiAgICAgICAgaGVpZ2h0OiAyMHB4O1xuICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMTIgMjAnPjxwYXRoIGQ9J00yLDIwbC0yLTJsOC04TDAsMmwyLTJsMTAsMTBMMiwyMHonIGZpbGw9J0B7dGhlbWVDb2xvcn0nLz48L3N2Zz5cIik7XG4gICAgfVxuICAgICYuaWNvbi1iYXJzIHtcbiAgICAgICAgd2lkdGg6IDIxcHg7XG4gICAgICAgIGhlaWdodDogMTRweDtcbiAgICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoXCI8c3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDIxIDE0Jz48cGF0aCBmaWxsPSdAe3RoZW1lQ29sb3J9JyBkPSdNMCwwaDJ2MkgwVjB6IE00LDBoMTd2MUg0VjB6IE0wLDZoMnYySDBWNnogTTQsNmgxN3YxSDRWNnogTTAsMTJoMnYySDBWMTJ6IE00LDEyaDE3djFINFYxMnonLz48L3N2Zz5cIik7XG4gICAgICAgIEBtZWRpYSAoLXdlYmtpdC1taW4tZGV2aWNlLXBpeGVsLXJhdGlvOiAyKSwgKG1pbi1yZXNvbHV0aW9uOiAyZGRweCkge1xuICAgICAgICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoXCI8c3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDQyIDI2Jz48cGF0aCBmaWxsPSdAe3RoZW1lQ29sb3J9JyBkPSdNMCwwaDR2NEgwVjB6IE04LDFoMzR2Mkg4VjF6IE0wLDExaDR2NEgwVjExeiBNOCwxMmgzNHYySDhWMTJ6IE0wLDIyaDR2NEgwVjIyeiBNOCwyM2gzNHYySDhWMjN6Jy8+PC9zdmc+XCIpO1xuICAgICAgICAgICAgaGVpZ2h0OiAxM3B4O1xuICAgICAgICB9XG4gICAgfVxuICAgICYuaWNvbi1jYW1lcmEge1xuICAgICAgICB3aWR0aDogMjVweDtcbiAgICAgICAgaGVpZ2h0OiAyMHB4O1xuICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB4PScwcHgnIHk9JzBweCcgdmlld0JveD0nMCAwIDI1IDIwJz48cGF0aCBmaWxsPScjOEM4RDkyJyBkPSdNMTMuMyw1LjVjLTIuNywwLTUsMi4yLTUsNXMyLjIsNSw1LDVjMi43LDAsNS0yLjIsNS01UzE2LDUuNSwxMy4zLDUuNXonLz48cGF0aCBmaWxsPScjOEM4RDkyJyBkPSdNMjIuOCwxLjhoLTMuM2MtMC4yLTEuMy0xLTEuOC0yLTEuOEg4LjFjLTEsMC0xLjgsMC40LTIsMS44SDIuOEMxLjQsMS44LDAsMi44LDAsNC4ydjEyLjYgYzAsMS40LDEuNCwyLjUsMi44LDIuNWgyMGMxLjQsMCwyLjItMS4xLDIuMi0yLjVWNC4yQzI1LDIuOCwyNC4yLDEuOCwyMi44LDEuOHogTTMuNSw2LjRDMi42LDYuNCwyLDUuOCwyLDVjMC0wLjgsMC43LTEuNSwxLjUtMS41IFM1LDQuMSw1LDVDNSw1LjgsNC4zLDYuNCwzLjUsNi40eiBNMTMuMywxNi44Yy0zLjUsMC02LjMtMi43LTYuMy02LjJjMC0zLjMsMi41LTYuMiw1LjctNi4yaDEuMmMzLjIsMCw1LjcsMi45LDUuNyw2LjIgQzE5LjYsMTQuMSwxNi43LDE2LjgsMTMuMywxNi44eicvPjwvc3ZnPlwiKTtcbiAgICB9XG4gICAgJi5pY29uLWY3IHtcbiAgICAgICAgd2lkdGg6IDI5cHg7XG4gICAgICAgIGhlaWdodDogMjlweDtcbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiQHtpbWdCYXNlVXJsfS9pLWY3LWlvcy5wbmdcIik7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDZweDtcbiAgICB9XG4gICAgJi5pY29uLW5leHQsICYuaWNvbi1wcmV2IHtcbiAgICAgICAgd2lkdGg6IDE1cHg7XG4gICAgICAgIGhlaWdodDogMTVweDtcbiAgICB9XG4gICAgJi5pY29uLW5leHQge1xuICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMTUgMTUnPjxnPjxwYXRoIGZpbGw9J0B7dGhlbWVDb2xvcn0nIGQ9J00xLDEuNmwxMS44LDUuOEwxLDEzLjRWMS42IE0wLDB2MTVsMTUtNy42TDAsMEwwLDB6Jy8+PC9nPjwvc3ZnPlwiKTtcbiAgICB9XG4gICAgJi5pY29uLXByZXYge1xuICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMTUgMTUnPjxnPjxwYXRoIGZpbGw9J0B7dGhlbWVDb2xvcn0nIGQ9J00xNCwxLjZ2MTEuOEwyLjIsNy42TDE0LDEuNiBNMTUsMEwwLDcuNkwxNSwxNVYwTDE1LDB6Jy8+PC9nPjwvc3ZnPlwiKTtcbiAgICB9XG4gICAgJi5pY29uLXBsdXMge1xuICAgICAgICB3aWR0aDogMjVweDtcbiAgICAgICAgaGVpZ2h0OiAyNXB4O1xuICAgICAgICBmb250LXNpemU6IDMxcHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiAxMDA7XG4gICAgfVxufVxuLmZyYW1ld29yazctaWNvbnMsIC5mNy1pY29ucyB7XG4gICAgLm5hdmJhciAmLCAudG9vbGJhciAmIHtcbiAgICAgICAgZm9udC1zaXplOiAyMnB4O1xuICAgIH1cbiAgICAudGFiYmFyICYsIC50YWJiYXItbGFiZWxzICYge1xuICAgICAgICBmb250LXNpemU6IDI1cHg7XG4gICAgfVxufVxuIiwiLyogPT09IENvbnRlbnQgQmxvY2sgPT09ICovXG5AY29udGVudEJsb2NrQm9yZGVyQ29sb3I6ICNjOGM3Y2M7XG5AY29udGVudEJsb2NrQ29sb3I6ICM2ZDZkNzI7XG5AY29udGVudEJsb2NrVGl0bGU6IEBjb250ZW50QmxvY2tDb2xvcjtcbi5jb250ZW50LWJsb2NrIHtcbiAgICBtYXJnaW46IDM1cHggMDtcbiAgICBwYWRkaW5nOiAwIDE1cHg7XG4gICAgY29sb3I6IEBjb250ZW50QmxvY2tUaXRsZTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC5uby1oYWlybGluZXMoKTtcbn1cbi5jb250ZW50LWJsb2NrLXRpdGxlIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBtYXJnaW46IDA7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICBsaW5lLWhlaWdodDogMTtcbiAgICBjb2xvcjogQGNvbnRlbnRCbG9ja0NvbG9yO1xuICAgIG1hcmdpbjogMzVweCAxNXB4IDEwcHg7XG4gICAgKyAubGlzdC1ibG9jaywgKyAuY29udGVudC1ibG9jaywgKy5jYXJkIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMTBweDtcbiAgICB9XG59XG4uY29udGVudC1ibG9jay1pbm5lciB7XG4gICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICBwYWRkaW5nOiAxMHB4IDE1cHg7XG4gICAgbWFyZ2luLWxlZnQ6IC0xNXB4O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAuaGFpcmxpbmUodG9wLCBAY29udGVudEJsb2NrQm9yZGVyQ29sb3IpO1xuICAgIC5oYWlybGluZShib3R0b20sIEBjb250ZW50QmxvY2tCb3JkZXJDb2xvcik7XG4gICAgY29sb3I6ICMwMDA7XG59XG4uY29udGVudC1ibG9jay5pbnNldCB7XG4gICAgbWFyZ2luLWxlZnQ6IDE1cHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAxNXB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDdweDtcbiAgICAuY29udGVudC1ibG9jay1pbm5lciB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUodG9wKTtcbiAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA3cHg7XG4gICAgfVxufVxuQG1lZGlhIGFsbCBhbmQgKG1pbi13aWR0aDo3NjhweCkge1xuICAgIC5jb250ZW50LWJsb2NrLnRhYmxldC1pbnNldCB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4O1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDE1cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDdweFxuICAgIH1cbiAgICBcbiAgICAuY29udGVudC1ibG9jay50YWJsZXQtaW5zZXQgLmNvbnRlbnQtYmxvY2staW5uZXIge1xuICAgIFx0LmhhaXJsaW5lLXJlbW92ZSh0b3ApO1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgXHRib3JkZXItcmFkaXVzOiA3cHg7XG4gICAgfVxufVxuIiwiLyogPT09IExpc3RzID09PSAqL1xuQGxpc3RCbG9ja0JvcmRlckNvbG9yOiAjYzhjN2NjO1xuQGxpc3RCbG9ja0JnOiAjZmZmO1xuQGRpdmlkZXJCZzogI0Y3RjdGNztcbkBkaXZpZGVyQ29sb3I6ICM4ZThlOTM7XG4ubGlzdC1ibG9jayB7XG4gICAgbWFyZ2luOiAzNXB4IDA7XG4gICAgZm9udC1zaXplOiAxN3B4O1xuICAgIHVsIHtcbiAgICAgICAgYmFja2dyb3VuZDogQGxpc3RCbG9ja0JnO1xuICAgICAgICBsaXN0LXN0eWxlOiBub25lO1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgLmhhaXJsaW5lKHRvcCwgQGxpc3RCbG9ja0JvcmRlckNvbG9yKTtcbiAgICAgICAgLmhhaXJsaW5lKGJvdHRvbSwgQGxpc3RCbG9ja0JvcmRlckNvbG9yKTtcbiAgICAgICAgdWwge1xuICAgICAgICAgICAgLmhhaXJsaW5lLXJlbW92ZSh0b3ApO1xuICAgICAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgICAgICAgICAgcGFkZGluZy1sZWZ0OiA0NXB4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLmFsaWduLXRvcCwgLmFsaWduLXRvcCAuaXRlbS1jb250ZW50LCAuYWxpZ24tdG9wIC5pdGVtLWlubmVyIHtcbiAgICAgICAgLmFsaWduLWl0ZW1zKGZsZXgtc3RhcnQpO1xuICAgIH1cbiAgICBcbiAgICAuaW5zZXQoKSB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4O1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDE1cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDdweDtcbiAgICAgICAgLmNvbnRlbnQtYmxvY2stdGl0bGUge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gICAgICAgIH1cbiAgICAgICAgdWwge1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogN3B4O1xuICAgICAgICAgICAgLmhhaXJsaW5lLXJlbW92ZSh0b3ApO1xuICAgICAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgICAgICB9XG4gICAgICAgIGxpOmZpcnN0LWNoaWxkID4gYXtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDdweCA3cHggMCAwO1xuICAgICAgICB9XG4gICAgICAgIGxpOmxhc3QtY2hpbGQgPiBhe1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMCAwIDdweCA3cHg7XG4gICAgICAgIH1cbiAgICAgICAgbGk6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCA+IGEge1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogN3B4O1xuICAgICAgICB9XG4gICAgfVxuICAgICYuaW5zZXQge1xuICAgICAgICAuaW5zZXQoKVxuICAgIH1cbiAgICAmLnRhYmxldC1pbnNldCB7XG4gICAgICAgIEBtZWRpYSBhbGwgYW5kIChtaW4td2lkdGg6NzY4cHgpIHtcbiAgICAgICAgICAgIC5pbnNldCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTGlzdCBpdGVtc1xuICAgIGxpIHtcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIH1cbiAgICBcbiAgICAuaXRlbS1tZWRpYSB7XG4gICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgIC5mbGV4LXNocmluaygwKTtcbiAgICAgICAgLmZsZXgtd3JhcChub3dyYXApO1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbiAgICAgICAgcGFkZGluZy10b3A6IDdweDtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDhweDtcbiAgICAgICAgaSArIGkge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICAgICAgfVxuICAgICAgICBpICsgaW1nIHtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiA1cHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLml0ZW0tbWVkaWEgKyAuaXRlbS1pbm5lciB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAxNXB4O1xuICAgIH1cbiAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgIHBhZGRpbmctcmlnaHQ6IDE1cHg7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgLmhhaXJsaW5lKGJvdHRvbSwgQGxpc3RCbG9ja0JvcmRlckNvbG9yKTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIHBhZGRpbmctdG9wOiA4cHg7XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiA3cHg7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDQ0cHg7XG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgIC13ZWJraXQtYm94LWZsZXg6MTtcbiAgICAgICAgLW1zLWZsZXg6MTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgLmp1c3RpZnktY29udGVudChzcGFjZS1iZXR3ZWVuKTtcbiAgICAgICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgICAgIC5hbGlnbi1zZWxmKHN0cmV0Y2gpO1xuICAgIH1cbiAgICAuaXRlbS10aXRsZSB7XG4gICAgICAgIC5mbGV4LXNocmluaygxKTtcbiAgICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgfVxuICAgIC5pdGVtLWFmdGVyIHtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgY29sb3I6ICM4ZThlOTM7XG4gICAgICAgIC5mbGV4LXNocmluaygwKTtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDVweDtcbiAgICAgICAgLmZsZXhib3goKTtcbiAgICAgICAgbWF4LWhlaWdodDogMjhweDtcbiAgICB9XG4gICAgLnNtYXJ0LXNlbGVjdCAuaXRlbS1hZnRlciwgLmF1dG9jb21wbGV0ZS1vcGVuZXIgLml0ZW0tYWZ0ZXIge1xuICAgICAgICBtYXgtd2lkdGg6IDcwJTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIC5pdGVtLWxpbmsge1xuICAgICAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBjb2xvcjogaW5oZXJpdDtcblxuICAgICAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzNXB4O1xuICAgICAgICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoXCI8c3ZnIHZpZXdCb3g9JzAgMCA2MCAxMjAnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PHBhdGggZD0nbTYwIDYxLjUtMzguMjUgMzguMjUtOS43NS05Ljc1IDI5LjI1LTI4LjUtMjkuMjUtMjguNSA5Ljc1LTkuNzV6JyBmaWxsPScjYzdjN2NjJy8+PC9zdmc+XCIpO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1zaXplOiAxMHB4IDIwcHg7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgICAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogOTUlIGNlbnRlcjtcbiAgICAgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IC13ZWJraXQtY2FsYyh+XCIxMDAlIC0gMTVweFwiKSBjZW50ZXI7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjYWxjKH5cIjEwMCUgLSAxNXB4XCIpIGNlbnRlcjtcbiAgICAgICAgfVxuICAgICAgICBodG1sOm5vdCgud2F0Y2gtYWN0aXZlLXN0YXRlKSAmOmFjdGl2ZSwgJi5hY3RpdmUtc3RhdGUge1xuICAgICAgICAgICAgLnRyYW5zaXRpb24oMG1zKTtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNkOWQ5ZDk7XG4gICAgICAgICAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgICAgICAgLmhhaXJsaW5lLWNvbG9yKGJvdHRvbSwgdHJhbnNwYXJlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICYubGlzdC1idXR0b24ge1xuICAgICAgICAgICAgcGFkZGluZzogMCAxNXB4O1xuICAgICAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICAgICAgY29sb3I6IEBibHVlO1xuICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAuaGFpcmxpbmUoYm90dG9tLCBAbGlzdEJsb2NrQm9yZGVyQ29sb3IpO1xuICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDQzcHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLml0ZW0tY29udGVudCB7XG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgIHBhZGRpbmctbGVmdDogMTVweDtcbiAgICAgICAgbWluLWhlaWdodDogNDRweDtcbiAgICAgICAgLmZsZXhib3goKTtcbiAgICAgICAgLmp1c3RpZnktY29udGVudChzcGFjZS1iZXR3ZWVuKTtcbiAgICAgICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgfVxuICAgIC8vIExhYmVsIGFmdGVyIExpc3QgYmxvY2tcbiAgICAubGlzdC1ibG9jay1sYWJlbCB7XG4gICAgICAgIG1hcmdpbjogMTBweCAwIDM1cHg7XG4gICAgICAgIHBhZGRpbmc6IDAgMTVweDtcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICBjb2xvcjogIzhmOGY5NDtcbiAgICB9XG5cbiAgICAvLyBTd2lwZSBvdXRzXG4gICAgLnN3aXBlb3V0IHtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tc3R5bGU6IHByZXNlcnZlLTNkO1xuICAgICAgICB0cmFuc2Zvcm0tc3R5bGU6IHByZXNlcnZlLTNkO1xuICAgIH1cbiAgICAuc3dpcGVvdXQuZGVsZXRpbmcge1xuICAgICAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgICAgIC5zd2lwZW91dC1jb250ZW50IHtcbiAgICAgICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlWCgtMTAwJSkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC5zd2lwZW91dC50cmFuc2l0aW9uaW5nIHtcbiAgICAgICAgLnN3aXBlb3V0LWNvbnRlbnQsIC5zd2lwZW91dC1hY3Rpb25zLXJpZ2h0IGEsIC5zd2lwZW91dC1hY3Rpb25zLWxlZnQgYSwgLnN3aXBlb3V0LW92ZXJzd2lwZSB7XG4gICAgICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IDMwMG1zO1xuICAgICAgICAgICAgdHJhbnNpdGlvbjogMzAwbXM7XG4gICAgICAgIH0gICAgXG4gICAgfVxuICAgIC5zd2lwZW91dC1jb250ZW50IHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB6LWluZGV4OiAxMDtcbiAgICB9XG4gICAgLnN3aXBlb3V0LW92ZXJzd2lwZSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogMjAwbXMgbGVmdDtcbiAgICAgICAgdHJhbnNpdGlvbjogMjAwbXMgbGVmdDtcbiAgICB9XG4gICAgLnN3aXBlb3V0LWFjdGlvbnMtbGVmdCwgLnN3aXBlb3V0LWFjdGlvbnMtcmlnaHQge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICBhIHtcbiAgICAgICAgICAgIHBhZGRpbmc6IDAgMzBweDtcbiAgICAgICAgICAgIGNvbG9yOiNmZmY7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiAjYzdjN2NjO1xuICAgICAgICAgICAgLmZsZXhib3goKTtcbiAgICAgICAgICAgIC5hbGlnbi1pdGVtcyhjZW50ZXIpO1xuICAgICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAgICAgbGVmdDogMDtcbiAgICAgICAgICAgICY6YWZ0ZXIge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6Jyc7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgIHRvcDogMDtcbiAgICAgICAgICAgICAgICB3aWR0aDogNjAwJTtcbiAgICAgICAgICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZDogaW5oZXJpdDtcbiAgICAgICAgICAgICAgICB6LWluZGV4OiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBhLnN3aXBlb3V0LWRlbGV0ZSB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBAcmVkO1xuICAgICAgICB9XG4gICAgfVxuICAgIC5zd2lwZW91dC1hY3Rpb25zLXJpZ2h0IHtcbiAgICAgICAgcmlnaHQ6IDAlO1xuICAgICAgICAudHJhbnNmb3JtKHRyYW5zbGF0ZVgoMTAwJSkpO1xuICAgICAgICBhOmFmdGVyIHtcbiAgICAgICAgICAgIGxlZnQ6IDEwMCU7XG4gICAgICAgICAgICBtYXJnaW4tbGVmdDogLTFweDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAuc3dpcGVvdXQtYWN0aW9ucy1sZWZ0IHtcbiAgICAgICAgbGVmdDogMCU7XG4gICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlWCgtMTAwJSkpO1xuICAgICAgICBhOmFmdGVyIHtcbiAgICAgICAgICAgIHJpZ2h0OiAxMDAlO1xuICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiAtMXB4O1xuICAgICAgICB9XG4gICAgfVxuICAgIC5pdGVtLXN1YnRpdGxlIHtcbiAgICAgICAgZm9udC1zaXplOiAxNXB4O1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzplbGxpcHNpcztcbiAgICB9XG4gICAgLml0ZW0tdGV4dCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTVweDtcbiAgICAgICAgY29sb3I6ICM4ZThlOTM7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAyMXB4O1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIGhlaWdodDogNDJweDtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzplbGxpcHNpcztcbiAgICAgICAgLXdlYmtpdC1saW5lLWNsYW1wOiAyO1xuICAgICAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgICB9XG4gICAgJi5tZWRpYS1saXN0LCBsaS5tZWRpYS1pdGVtIHtcbiAgICAgICAgLml0ZW0tdGl0bGUge1xuICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgICAgIGh0bWwuaW9zLWd0LTggJiB7XG4gICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgIHBhZGRpbmctdG9wOiAxMHB4O1xuICAgICAgICAgICAgcGFkZGluZy1ib3R0b206IDlweDtcbiAgICAgICAgICAgIC5hbGlnbi1zZWxmKHN0cmV0Y2gpO1xuICAgICAgICB9XG4gICAgICAgIC5pdGVtLWxpbmsgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDE1cHg7XG4gICAgICAgIH1cbiAgICAgICAgLml0ZW0tbGluayAuaXRlbS10aXRsZS1yb3cge1xuICAgICAgICAgICAgcGFkZGluZy1yaWdodDogMjBweDtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IG5vLXJlcGVhdCByaWdodCBjZW50ZXI7XG4gICAgICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgdmlld0JveD0nMCAwIDYwIDEyMCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJz48cGF0aCBkPSdtNjAgNjEuNS0zOC4yNSAzOC4yNS05Ljc1LTkuNzUgMjkuMjUtMjguNS0yOS4yNS0yOC41IDkuNzUtOS43NXonIGZpbGw9JyNjN2M3Y2MnLz48L3N2Zz5cIik7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLXNpemU6IDEwcHggMjBweDtcbiAgICAgICAgfVxuICAgICAgICAuaXRlbS1tZWRpYSB7XG4gICAgICAgICAgICBwYWRkaW5nLXRvcDogOXB4O1xuICAgICAgICAgICAgcGFkZGluZy1ib3R0b206IDEwcHg7XG4gICAgICAgICAgICBpbWcge1xuICAgICAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC5pdGVtLXRpdGxlLXJvdyB7XG4gICAgICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICAgICAgLmp1c3RpZnktY29udGVudChzcGFjZS1iZXR3ZWVuKTtcbiAgICAgICAgfVxuICAgICAgICAuaXRlbS1jb250ZW50ID4gLml0ZW0tYWZ0ZXIge1xuICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiAxNXB4O1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDE1cHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLmxpc3QtZ3JvdXAge1xuICAgICAgICB1bCB7XG4gICAgICAgICAgICAmOmFmdGVyLCAmOmJlZm9yZSB7XG4gICAgICAgICAgICAgICAgei1pbmRleDogMjU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgKyAubGlzdC1ncm91cCB1bCB7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7ICAgXG4gICAgICAgIH1cbiAgICB9XG4gICAgLml0ZW0tZGl2aWRlciwgLmxpc3QtZ3JvdXAtdGl0bGUge1xuICAgICAgICBiYWNrZ3JvdW5kOiBAZGl2aWRlckJnO1xuICAgICAgICAuaGFpcmxpbmUodG9wLCBAbGlzdEJsb2NrQm9yZGVyQ29sb3IpO1xuICAgICAgICBtYXJnaW4tdG9wOiAtMXB4O1xuICAgICAgICBwYWRkaW5nOiA0cHggMTVweDtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICBjb2xvcjogQGRpdmlkZXJDb2xvcjtcbiAgICAgICAgei1pbmRleDogMTU7XG4gICAgfVxuICAgIC5saXN0LWdyb3VwLXRpdGxlIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBwb3NpdGlvbjogLXdlYmtpdC1zdGlja3k7XG4gICAgICAgIHBvc2l0aW9uOiAtbW96LXN0aWNreTtcbiAgICAgICAgcG9zaXRpb246IHN0aWNreTtcbiAgICAgICAgdG9wOiAwcHg7XG4gICAgICAgIHotaW5kZXg6IDIwO1xuICAgICAgICBtYXJnaW4tdG9wOiAwO1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7XG4gICAgfVxuICAgIC8vIFNvcnRhYmxlXG4gICAgLnNvcnRhYmxlLWhhbmRsZXIge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHJpZ2h0OiAwO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIGJvdHRvbTogMXB4O1xuICAgICAgICB6LWluZGV4OiAxMDtcbiAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICAgICAgYmFja2dyb3VuZC1zaXplOiAxOHB4IDEycHg7XG4gICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcbiAgICAgICAgd2lkdGg6IDM1cHg7XG4gICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxOCAxMicgZmlsbD0nI2M3YzdjYyc+PHBhdGggZD0nTTAsMlYwaDIydjJIMHonLz48cGF0aCBkPSdNMCw3VjVoMjJ2MkgweicvPjxwYXRoIGQ9J00wLDEydi0yaDIydjJIMHonLz48L3N2Zz5cIik7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgfVxuICAgICYuc29ydGFibGUge1xuICAgICAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgICAudHJhbnNpdGlvbigzMDBtcyk7ICAgICAgIFxuICAgICAgICB9XG4gICAgfVxuICAgICYuc29ydGFibGUtb3BlbmVkIHtcbiAgICAgICAgLnNvcnRhYmxlLWhhbmRsZXIge1xuICAgICAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICAgICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIH1cbiAgICAgICAgLml0ZW0taW5uZXIsIC5pdGVtLWxpbmsgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgcGFkZGluZy1yaWdodDogMzVweDtcbiAgICAgICAgfVxuICAgICAgICAuaXRlbS1saW5rIC5pdGVtLWlubmVyLCAuaXRlbS1saW5rIC5pdGVtLXRpdGxlLXJvdyB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICAgICAgICB9XG4gICAgfVxuICAgICYuc29ydGFibGUtc29ydGluZyB7XG4gICAgICAgIGxpIHtcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsaS5zb3J0aW5nIHtcbiAgICAgICAgei1pbmRleDogNTA7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsMC44KTtcbiAgICAgICAgYm94LXNoYWRvdzogMHB4IDJweCA4cHggcmdiYSgwLDAsMCwwLjYpO1xuICAgICAgICAudHJhbnNpdGlvbigwbXMpO1xuICAgICAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMYXN0LWNoaWxkc1xuICAgIGxpIHtcbiAgICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgICAgIC5saXN0LWJ1dHRvbiB7XG4gICAgICAgICAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICY6bGFzdC1jaGlsZCwgJjpsYXN0LWNoaWxkIGxpOmxhc3QtY2hpbGQge1xuICAgICAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsaTpsYXN0LWNoaWxkLCAmOmxhc3QtY2hpbGQgbGkge1xuICAgICAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgICAgIC5oYWlybGluZShib3R0b20sIEBsaXN0QmxvY2tCb3JkZXJDb2xvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgLm5vLWhhaXJsaW5lcygpO1xuICAgIC5uby1oYWlybGluZXMtYmV0d2VlbigpXG59XG4iLCIvKiA9PT0gRm9ybXMgPT09ICovXG4vLyBJbnB1dHNcbi5saXN0LWJsb2NrIHtcbiAgICBpbnB1dFt0eXBlPVwidGV4dFwiXSwgaW5wdXRbdHlwZT1cInBhc3N3b3JkXCJdLCBpbnB1dFt0eXBlPVwic2VhcmNoXCJdLCBpbnB1dFt0eXBlPVwiZW1haWxcIl0sIGlucHV0W3R5cGU9XCJ0ZWxcIl0sIGlucHV0W3R5cGU9XCJ1cmxcIl0sIGlucHV0W3R5cGU9XCJkYXRlXCJdLCBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0sIGlucHV0W3R5cGU9XCJ0aW1lXCJdLCBpbnB1dFt0eXBlPVwibnVtYmVyXCJdLCBzZWxlY3QsIHRleHRhcmVhIHtcbiAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIC1tcy1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAgMCAwIDA7XG4gICAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBwYWRkaW5nOiAwcHg7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogNDNweDtcbiAgICAgICAgY29sb3I6ICMwMDA7XG4gICAgICAgIGZvbnQtc2l6ZTogMTdweDtcbiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG5cbiAgICB9XG4gICAgLml0ZW0tdGl0bGUubGFiZWwge1xuICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xuICAgICAgICArIC5pdGVtLWlucHV0IHtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiA1cHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5wdXRbdHlwZT1cImRhdGVcIl0sIGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXSB7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiA0NHB4O1xuICAgIH1cbiAgICBzZWxlY3Qge1xuICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgLW1zLWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgfVxuICAgIHRleHRhcmVhIHtcbiAgICAgICAgaGVpZ2h0OiAxMDBweDtcbiAgICAgICAgcmVzaXplOm5vbmU7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAxLjQ7XG4gICAgICAgIHBhZGRpbmctdG9wOiA4cHg7XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiA3cHg7XG4gICAgICAgICYucmVzaXphYmxlIHtcbiAgICAgICAgICAgIGhlaWdodDogNDNweDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAuaXRlbS1pbnB1dCB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBtYXJnaW4tdG9wOiAtOHB4O1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAtN3B4O1xuICAgICAgICAtd2Via2l0LWJveC1mbGV4OjE7XG4gICAgICAgIC1tcy1mbGV4OjE7XG4gICAgICAgIC5mbGV4LXNocmluaygxKTtcbiAgICB9XG4gICAgLml0ZW0tdGl0bGUubGFiZWwge1xuICAgICAgICB3aWR0aDogMzUlO1xuICAgICAgICAuZmxleC1zaHJpbmsoMCk7XG4gICAgfVxufVxuXG4vL1N3aXRjaFxuLmxhYmVsLXN3aXRjaCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gICAgd2lkdGg6IDUycHg7XG4gICAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGhlaWdodDogMzJweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIC5hbGlnbi1zZWxmKGNlbnRlcik7XG4gICAgLmNoZWNrYm94IHtcbiAgICAgICAgd2lkdGg6IDUycHg7IFxuICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4O1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICBoZWlnaHQ6IDMycHg7XG4gICAgICAgIGJhY2tncm91bmQ6ICNlNWU1ZTU7XG4gICAgICAgIHotaW5kZXg6IDA7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIC1tcy1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgICAgICBib3JkZXI6bm9uZTtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgJjpiZWZvcmUge1xuICAgICAgICAgICAgY29udGVudDonICc7XG4gICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICBsZWZ0OiAycHg7XG4gICAgICAgICAgICB0b3A6IDJweDtcbiAgICAgICAgICAgIHdpZHRoOiA0OHB4O1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgICAgICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgICAgICBoZWlnaHQ6IDI4cHg7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgICAgICAgICAgei1pbmRleDogMTtcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgICAgIC50cmFuc2Zvcm0oc2NhbGUoMSkpO1xuICAgICAgICB9XG4gICAgICAgICY6YWZ0ZXIge1xuICAgICAgICAgICAgY29udGVudDonICc7XG4gICAgICAgICAgICBoZWlnaHQ6IDI4cHg7XG4gICAgICAgICAgICB3aWR0aDogMjhweDtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDI4cHg7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgei1pbmRleDogMjtcbiAgICAgICAgICAgIHRvcDogMnB4O1xuICAgICAgICAgICAgbGVmdDogMnB4O1xuICAgICAgICAgICAgYm94LXNoYWRvdzogMCAycHggNXB4IHJnYmEoMCwwLDAsMC40KTtcbiAgICAgICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlWCgwcHgpKTtcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgICAmOmNoZWNrZWQge1xuICAgICAgICAgICAgJisgLmNoZWNrYm94IHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAjNGNkOTY0O1xuICAgICAgICAgICAgICAgICY6YmVmb3JlIHtcbiAgICAgICAgICAgICAgICAgICAgLnRyYW5zZm9ybShzY2FsZSgwKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICY6YWZ0ZXIge1xuICAgICAgICAgICAgICAgICAgICAudHJhbnNmb3JtKHRyYW5zbGF0ZVgoMjBweCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmh0bWwuYW5kcm9pZCB7XG4gICAgLmxhYmVsLXN3aXRjaCBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0ge1xuICAgICAgICAmKyAuY2hlY2tib3gge1xuICAgICAgICAgICAgLnRyYW5zaXRpb24oMCk7XG4gICAgICAgICAgICAmOmFmdGVyLCAmOmJlZm9yZSB7XG4gICAgICAgICAgICAgICAgLnRyYW5zaXRpb24oMCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4vL0J1dHRvbnNcbi5idXR0b24ge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkIEB0aGVtZUNvbG9yO1xuICAgIGNvbG9yOiBAdGhlbWVDb2xvcjtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICBsaW5lLWhlaWdodDogMjdweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgLW1zLWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIHBhZGRpbmc6IDAgMTBweDtcbiAgICBtYXJnaW46IDA7XG4gICAgaGVpZ2h0OiAyOXB4O1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dC1vdmVyZmxvdzplbGxpcHNpcztcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIG91dGxpbmU6IDA7XG4gICAgaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSYsIGlucHV0W3R5cGU9XCJidXR0b25cIl0me1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICBodG1sOm5vdCgud2F0Y2gtYWN0aXZlLXN0YXRlKSAmOmFjdGl2ZSwgJi5hY3RpdmUtc3RhdGUge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKHJlZChAdGhlbWVDb2xvciksIGdyZWVuKEB0aGVtZUNvbG9yKSwgYmx1ZShAdGhlbWVDb2xvciksIC4xNSk7XG4gICAgfVxuICAgICYuYnV0dG9uLXJvdW5kIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMjdweDtcbiAgICB9XG4gICAgJi5hY3RpdmUge1xuICAgICAgICBiYWNrZ3JvdW5kOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgY29sb3I6ICNmZmY7XG4gICAgfVxuICAgICYuYnV0dG9uLWJpZyB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTdweDtcbiAgICAgICAgaGVpZ2h0OiA0NHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogNDJweDtcbiAgICB9XG4gICAgJi5idXR0b24tZmlsbCB7XG4gICAgICAgIGNvbG9yOiNmZmY7XG4gICAgICAgIGJhY2tncm91bmQ6IEB0aGVtZUNvbG9yO1xuICAgICAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgICBodG1sOm5vdCgud2F0Y2gtYWN0aXZlLXN0YXRlKSAmOmFjdGl2ZSwgJi5hY3RpdmUtc3RhdGUge1xuICAgICAgICAgICAgb3BhY2l0eTogMC44O1xuICAgICAgICB9XG4gICAgfVxuICAgIGkuaWNvbiB7XG4gICAgICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICAgICAgICB9XG4gICAgICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgICAgICAgfVxuICAgICAgICAmOmZpcnN0LWNoaWxkOmxhc3QtY2hpbGQge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDA7XG4gICAgICAgIH1cbiAgICB9XG59XG4uYnV0dG9ucy1yb3cge1xuICAgIC5hbGlnbi1zZWxmKGNlbnRlcik7XG4gICAgLmZsZXhib3goKTtcbiAgICAuZmxleC13cmFwKG5vd3JhcCk7XG4gICAgLmJ1dHRvbiB7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAgMCAwIDA7XG4gICAgICAgIGJvcmRlci1sZWZ0LXdpZHRoOiAwO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgLXdlYmtpdC1ib3gtZmxleDoxO1xuICAgICAgICAtbXMtZmxleDoxO1xuICAgIH1cbiAgICAuYnV0dG9uOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNXB4IDAgMCA1cHg7XG4gICAgICAgIGJvcmRlci1sZWZ0LXdpZHRoOiAxcHg7XG4gICAgICAgIGJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDtcbiAgICB9XG4gICAgLmJ1dHRvbjpsYXN0LWNoaWxkIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMCA1cHggNXB4IDA7XG4gICAgfVxuICAgIC5idXR0b246Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCB7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgICB9XG4gICAgLmJ1dHRvbi5idXR0b24tcm91bmQ6Zmlyc3QtY2hpbGQge1xuICAgICAgICBib3JkZXItcmFkaXVzOiAyN3B4IDAgMCAyN3B4O1xuICAgIH1cbiAgICAuYnV0dG9uLmJ1dHRvbi1yb3VuZDpsYXN0LWNoaWxkIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAyN3B4IDI3cHggMDtcbiAgICB9XG59XG5cblxuLy8gU2xpZGVyXG4ucmFuZ2Utc2xpZGVyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBwYWRkaW5nLWxlZnQ6IDNweDtcbiAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7XG4gICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gICAgLmFsaWduLXNlbGYoY2VudGVyKTtcbiAgICBpbnB1dFt0eXBlPVwicmFuZ2VcIl0ge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIGhlaWdodDogMjhweDtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIG1hcmdpbjogNHB4IDAgNXB4IDA7XG4gICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAtbXMtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDUwJSAwLCA1MCUgMTAwJSwgY29sb3Itc3RvcCgwLCAjYjdiOGI3KSwgY29sb3Itc3RvcCgxMDAlLCAjYjdiOGI3KSk7XG4gICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgI2I3YjhiNyAwLCAjYjdiOGI3IDEwMCUpO1xuICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSAycHg7XG4gICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgICAgIG91dGxpbmU6IDA7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgICAgIC1tcy1iYWNrZ3JvdW5kLXBvc2l0aW9uLXk6IDUwMHB4O1xuICAgICAgICAmOmZvY3VzLCAmOmFjdGl2ZSB7XG4gICAgICAgICAgICBib3JkZXI6IDA7XG4gICAgICAgICAgICBvdXRsaW5lOiAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuXG4gICAgXG4gICAgLy8gUmFuZ2UgdGh1bWIgbWl4aW5cbiAgICAucmFuZ2UtdGh1bWIoKSB7XG4gICAgICAgIGhlaWdodDogMjhweDtcbiAgICAgICAgd2lkdGg6IDI4cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDI4cHg7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgICAgIHotaW5kZXg6IDEwO1xuICAgICAgICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLDAsMCwwLjQpO1xuICAgICAgICBib3JkZXI6IDA7XG4gICAgICAgIG91dGxpbmU6IDA7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgY29udGVudDogJyAnO1xuICAgIH1cbiAgICBcbiAgICAvLyA9PT09PT09IFdlYktpdC9CbGluayA9PT09PT09PVxuXG4gICAgLy8gQmVmb3JlIFRyYWNrXG4gICAgaW5wdXRbdHlwZT1cInJhbmdlXCJdOmFmdGVyIHtcbiAgICAgICAgaGVpZ2h0OiAycHg7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgICAgIGNvbnRlbnQ6JyAnO1xuICAgICAgICB3aWR0aDogNXB4O1xuICAgICAgICB0b3A6IDUwJTtcbiAgICAgICAgbWFyZ2luLXRvcDogLTFweDtcbiAgICAgICAgbGVmdDogLTVweDtcbiAgICAgICAgei1pbmRleDogMTtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgICAvLyBUaHVtYlxuICAgIGlucHV0W3R5cGU9XCJyYW5nZVwiXTo6LXdlYmtpdC1zbGlkZXItdGh1bWIge1xuICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgLW1zLWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgaGVpZ2h0OiAyOHB4O1xuICAgICAgICB3aWR0aDogMjhweDtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIH1cbiAgICBpbnB1dFt0eXBlPVwicmFuZ2VcIl06Oi13ZWJraXQtc2xpZGVyLXRodW1iOmFmdGVyIHtcbiAgICAgICAgLnJhbmdlLXRodW1iKCk7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHRvcDogMDtcbiAgICB9XG4gICAgLy8gVHJhY2sgQWN0aXZlIEhpZ2hsaWdodFxuICAgIGlucHV0W3R5cGU9XCJyYW5nZVwiXTo6LXdlYmtpdC1zbGlkZXItdGh1bWI6YmVmb3JlIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDUwJTtcbiAgICAgICAgcmlnaHQ6IDEwMCU7XG4gICAgICAgIHdpZHRoOiAyMDAwcHg7XG4gICAgICAgIGhlaWdodDogMnB4O1xuICAgICAgICBtYXJnaW4tdG9wOiAtMXB4O1xuICAgICAgICB6LWluZGV4OiAxO1xuICAgICAgICBiYWNrZ3JvdW5kOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgY29udGVudDogJyAnO1xuICAgIH1cblxuICAgIC8vID09PT09PT0gRmlyZUZveCA9PT09PT09PVxuICAgIGlucHV0W3R5cGU9XCJyYW5nZVwiXTo6LW1vei1yYW5nZS10cmFjayB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDJweDtcbiAgICAgICAgYmFja2dyb3VuZDogI2I3YjhiNztcbiAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICBvdXRsaW5lOiAwO1xuICAgIH1cbiAgICBpbnB1dFt0eXBlPVwicmFuZ2VcIl06Oi1tb3otcmFuZ2UtdGh1bWIge1xuICAgICAgICAucmFuZ2UtdGh1bWIoKTtcbiAgICB9XG4gICAgXG4gICAgLy8gPT09PT09PSBJRSA9PT09PT09PVxuICAgIGlucHV0W3R5cGU9XCJyYW5nZVwiXTo6LW1zLXRyYWNrIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogMnB4O1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgICBib3JkZXItY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgICBjb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgfVxuICAgIGlucHV0W3R5cGU9XCJyYW5nZVwiXTo6LW1zLXRodW1iIHtcbiAgICAgICAgLnJhbmdlLXRodW1iKCk7XG4gICAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYmEoMCwwLDAsMC4yKTtcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICAgICAgdG9wOiA1MCU7XG4gICAgfVxuXG4gICAgaW5wdXRbdHlwZT1cInJhbmdlXCJdOjotbXMtZmlsbC1sb3dlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IEB0aGVtZUNvbG9yO1xuICAgIH1cbiAgICBpbnB1dFt0eXBlPVwicmFuZ2VcIl06Oi1tcy1maWxsLXVwcGVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogI2I3YjhiNztcbiAgICB9XG59XG5cbi8vIENoZWNrYm94ZXNcbmxhYmVsLmxhYmVsLWNoZWNrYm94IHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgaS5pY29uLWZvcm0tY2hlY2tib3gge1xuICAgICAgICB3aWR0aDogMjJweDtcbiAgICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDIycHg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjN2M3Y2M7XG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG5cbiAgICAgICAgJjphZnRlciB7XG4gICAgICAgICAgICBjb250ZW50OicgJztcbiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgIGxlZnQ6IDUwJTtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAtNnB4O1xuICAgICAgICAgICAgdG9wOiA1MCU7XG4gICAgICAgICAgICBtYXJnaW4tdG9wOiAtNHB4O1xuICAgICAgICAgICAgd2lkdGg6IDEycHg7XG4gICAgICAgICAgICBoZWlnaHQ6IDlweDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0sIGlucHV0W3R5cGU9XCJyYWRpb1wiXSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICAgICY6Y2hlY2tlZCArIC5pdGVtLW1lZGlhe1xuICAgICAgICAgICAgaS5pY29uLWZvcm0tY2hlY2tib3gge1xuICAgICAgICAgICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkuaWNvbi1mb3JtLWNoZWNrYm94OmFmdGVyIHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBuby1yZXBlYXQgY2VudGVyO1xuICAgICAgICAgICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHg9JzBweCcgeT0nMHB4JyB2aWV3Qm94PScwIDAgMTIgOScgeG1sOnNwYWNlPSdwcmVzZXJ2ZSc+PHBvbHlnb24gZmlsbD0nI2ZmZmZmZicgcG9pbnRzPScxMiwwLjcgMTEuMywwIDMuOSw3LjQgMC43LDQuMiAwLDQuOSAzLjksOC44IDMuOSw4LjggMy45LDguOCAnLz48L3N2Zz5cIik7XG4gICAgICAgICAgICAgICAgLXdlYmtpdC1iYWNrZ3JvdW5kLXNpemU6IDEycHggOXB4O1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTJweCA5cHg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5sYWJlbC5sYWJlbC1yYWRpbyB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSwgaW5wdXRbdHlwZT1cInJhZGlvXCJdIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgfiAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzNXB4O1xuICAgICAgICB9XG4gICAgICAgICY6Y2hlY2tlZCB+IC5pdGVtLWlubmVye1xuICAgICAgICAgICAgYmFja2dyb3VuZDogbm8tcmVwZWF0IGNlbnRlcjtcbiAgICAgICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAxMyAxMCc+PHBvbHlnb24gZmlsbD0nQHt0aGVtZUNvbG9yfScgcG9pbnRzPScxMS42LDAgNC40LDcuMiAxLjQsNC4yIDAsNS42IDQuNCwxMCA0LjQsMTAgNC40LDEwIDEzLDEuNCAnLz48L3N2Zz5cIik7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA5MCUgY2VudGVyO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogflwiLXdlYmtpdC1jYWxjKDEwMCUgLSAxNXB4KVwiIGNlbnRlcjtcbiAgICAgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IH5cImNhbGMoMTAwJSAtIDE1cHgpXCIgY2VudGVyO1xuICAgICAgICAgICAgLXdlYmtpdC1iYWNrZ3JvdW5kLXNpemU6IDEzcHggMTBweDtcbiAgICAgICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTNweCAxMHB4O1xuICAgICAgICB9XG4gICAgfVxufVxubGFiZWwubGFiZWwtY2hlY2tib3gsIGxhYmVsLmxhYmVsLXJhZGlvIHtcbiAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgaHRtbDpub3QoLndhdGNoLWFjdGl2ZS1zdGF0ZSkgJjphY3RpdmUsICYuYWN0aXZlLXN0YXRlIHtcbiAgICAgICAgLnRyYW5zaXRpb24oMG1zKTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZDlkOTtcbiAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgLmhhaXJsaW5lLWNvbG9yKGJvdHRvbSwgdHJhbnNwYXJlbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBTbWFydCBzZWxlY3RzXG4uc21hcnQtc2VsZWN0IHtcbiAgICBzZWxlY3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbn1cbiIsIi8qID09PSBDYXJkcyA9PT0gKi9cbi5jYXJkcy1saXN0LCAuY2FyZCAubGlzdC1ibG9jayB7XG4gICAgdWwge1xuICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIH1cbiAgICA+IHVsIHtcbiAgICAgICAgLmhhaXJsaW5lLXJlbW92ZSh0b3ApO1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgfVxufVxuLmNhcmQge1xuICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgYm94LXNoYWRvdzogMHB4IDFweCAycHggcmdiYSgwLDAsMCwwLjMpO1xuICAgIG1hcmdpbjogMTBweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAubGlzdC1ibG9jaywgLmNvbnRlbnQtYmxvY2sge1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgfVxuICAgIC5yb3c6bm90KC5uby1ndXR0ZXIpIC5jb2wgPiAmIHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICB9XG59XG4uY2FyZC1jb250ZW50IHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4uY2FyZC1jb250ZW50LWlubmVyIHtcbiAgICBwYWRkaW5nOiAxNXB4O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICA+IHA6Zmlyc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tdG9wOiAwO1xuICAgIH1cbiAgICA+IHA6bGFzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgfVxuICAgID4gLmxpc3QtYmxvY2ssID4uY29udGVudC1ibG9jayB7XG4gICAgICAgIG1hcmdpbjogLTE1cHg7XG4gICAgfVxufVxuLmNhcmQtaGVhZGVyLCAuY2FyZC1mb290ZXIge1xuICAgIG1pbi1oZWlnaHQ6IDQ0cHg7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHBhZGRpbmc6IDEwcHggMTVweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC5mbGV4Ym94KCk7XG4gICAgLmp1c3RpZnktY29udGVudChzcGFjZS1iZXR3ZWVuKTtcbiAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbiAgICAmW3ZhbGlnbj1cInRvcFwiXSB7XG4gICAgICAgIC5hbGlnbi1pdGVtcyhmbGV4LXN0YXJ0KTtcbiAgICB9XG4gICAgJlt2YWxpZ249XCJib3R0b21cIl0ge1xuICAgICAgICAuYWxpZ24taXRlbXMoZmxleC1lbmQpO1xuICAgIH1cbiAgICBhLmxpbmsge1xuICAgICAgICBsaW5lLWhlaWdodDogNDRweDtcbiAgICAgICAgaGVpZ2h0OiA0NHB4O1xuICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgbWFyZ2luLXRvcDogLTEwcHg7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IC0xMHB4O1xuICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICAuanVzdGlmeS1jb250ZW50KGZsZXgtc3RhcnQpO1xuICAgICAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbiAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICBodG1sOm5vdCgud2F0Y2gtYWN0aXZlLXN0YXRlKSAmOmFjdGl2ZSwgJi5hY3RpdmUtc3RhdGUge1xuICAgICAgICAgICAgb3BhY2l0eTogMC4zO1xuICAgICAgICAgICAgLnRyYW5zaXRpb24oMG1zKTtcbiAgICAgICAgfVxuICAgICAgICBpK3NwYW4sIGkraSwgc3BhbitpLCBzcGFuK3NwYW4ge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDdweDtcbiAgICAgICAgfVxuICAgICAgICBpLmljb24ge1xuICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYS5pY29uLW9ubHkge1xuICAgICAgICBtaW4td2lkdGg6IDQ0cHg7XG4gICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgIC5qdXN0aWZ5LWNvbnRlbnQoY2VudGVyKTtcbiAgICAgICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICB9XG59XG4uY2FyZC1oZWFkZXIge1xuICAgIGJvcmRlci1yYWRpdXM6IDJweCAycHggMCAwO1xuICAgIGZvbnQtc2l6ZTogMTdweDtcbiAgICAuaGFpcmxpbmUoYm90dG9tLCAjZTFlMWUxKTtcbiAgICAmLm5vLWJvcmRlciB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICB9XG59XG4uY2FyZC1mb290ZXIge1xuICAgIGJvcmRlci1yYWRpdXM6IDAgMCAycHggMnB4O1xuICAgIGNvbG9yOiM2ZDZkNzI7XG4gICAgLmhhaXJsaW5lKHRvcCwgI2UxZTFlMSk7XG4gICAgJi5uby1ib3JkZXIge1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7XG4gICAgfVxuXG59IiwiLyogPT09IE1vZGFscyA9PT0gKi9cbkBtb2RhbEJnOiByZ2JhKDI1NSwyNTUsMjU1LDAuOTUpO1xuQG1vZGFsQnV0b25Db2xvciA6IEB0aGVtZUNvbG9yO1xuQG1vZGFsQnV0b25BY3RpdmVCZzogcmdiYSgyMzAsMjMwLDIzMCwwLjk1KTtcbkBtb2RhbEhhaXJsaW5lQ29sb3I6IHJnYmEoMCwwLDAsMC4yKTtcbkBtb2RhbER1cmF0aW9uOiA0MDBtcztcblxuQGFjdGlvbnNNb2RhbEJnOiByZ2JhKDI1NSwyNTUsMjU1LDAuOTUpO1xuQGFjdGlvbnNNb2RhbEJ1dHRvbkFjdGl2ZUJnOiByZ2JhKDIzMCwyMzAsMjMwLDAuOSk7XG5AYWN0aW9uc01vZGFsSGFpcmxpbmVDb2xvcjogcmdiYSgwLDAsMCwwLjIpO1xuQGFjdGlvbnNNb2RhbER1cmF0aW9uOiAzMDBtcztcblxuQHBvcG92ZXJCZzogcmdiYSgyNTUsMjU1LDI1NSwwLjk1KTtcblxuQHBvcHVwRHVyYXRpb246IDQwMG1zO1xuXG5AYWN0aW9uc1BvcG92ZXJIYWlybGluZTogcmdiYSgwLDAsMCwwLjIpO1xuLm1vZGFsLW92ZXJsYXksIC5wcmVsb2FkZXItaW5kaWNhdG9yLW92ZXJsYXksIC5wb3B1cC1vdmVybGF5IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC40KTtcbiAgICB6LWluZGV4OiAxMzAwMDtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgb3BhY2l0eTogMDtcbiAgICAudHJhbnNpdGlvbihAbW9kYWxEdXJhdGlvbik7XG4gICAgJi5tb2RhbC1vdmVybGF5LXZpc2libGUge1xuICAgICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbn1cbi5wb3B1cC1vdmVybGF5IHtcbiAgICB6LWluZGV4OiAxMDUwMDtcbn1cbi5tb2RhbCB7XG4gICAgd2lkdGg6IDI3MHB4O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB6LWluZGV4OiAxMzUwMDtcbiAgICBsZWZ0OiA1MCU7XG4gICAgbWFyZ2luLWxlZnQ6IC0xMzVweDtcbiAgICBtYXJnaW4tdG9wOiAwO1xuICAgIHRvcDogNTAlO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBib3JkZXItcmFkaXVzOiAxM3B4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgb3BhY2l0eTogMDtcbiAgICAudHJhbnNmb3JtKHRyYW5zbGF0ZTNkKDAsMCwwKSBzY2FsZSgxLjE4NSkpO1xuICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm0sIG9wYWNpdHk7XG4gICAgLW1vei10cmFuc2l0aW9uLXByb3BlcnR5OiAtbW96LXRyYW5zZm9ybSwgb3BhY2l0eTtcbiAgICAtbXMtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLW1zLXRyYW5zZm9ybSwgb3BhY2l0eTtcbiAgICAtby10cmFuc2l0aW9uLXByb3BlcnR5OiAtby10cmFuc2Zvcm0sIG9wYWNpdHk7XG4gICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtLCBvcGFjaXR5O1xuICAgIGNvbG9yOiMwMDA7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBcbiAgICAmLm1vZGFsLWluIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgLnRyYW5zaXRpb24oQG1vZGFsRHVyYXRpb24pO1xuICAgICAgICAudHJhbnNmb3JtKHRyYW5zbGF0ZTNkKDAsMCwwKSBzY2FsZSgxKSk7XG4gICAgfVxuICAgICYubW9kYWwtb3V0IHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgei1pbmRleDogMTM1MDAtMTtcbiAgICAgICAgLnRyYW5zaXRpb24oQG1vZGFsRHVyYXRpb24pO1xuICAgICAgICAudHJhbnNmb3JtKHRyYW5zbGF0ZTNkKDAsMCwwKSBzY2FsZSgxKSk7XG4gICAgfVxufVxuLm1vZGFsLWlubmVyIHtcbiAgICBwYWRkaW5nOiAxNXB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDEzcHggMTNweCAwIDA7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGJhY2tncm91bmQ6IEBtb2RhbEJnO1xuICAgIC5oYWlybGluZShib3R0b20sIEBtb2RhbEhhaXJsaW5lQ29sb3IpO1xuICAgICAgICBcbn1cbi5tb2RhbC10aXRsZSB7XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICBmb250LXNpemU6IDE4cHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGh0bWwuaW9zLWd0LTggJiB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgfVxuICAgICsubW9kYWwtdGV4dCB7XG4gICAgICAgIG1hcmdpbi10b3A6IDVweDtcbiAgICB9XG59XG4ubW9kYWwtYnV0dG9ucyB7XG4gICAgaGVpZ2h0OiA0NHB4O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAuZmxleGJveCgpO1xuICAgIC5qdXN0aWZ5LWNvbnRlbnQoY2VudGVyKTtcbiAgICAmLm1vZGFsLWJ1dHRvbnMtdmVydGljYWwge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgaGVpZ2h0OiBhdXRvO1xuICAgIH1cbn1cbi5tb2RhbC1idXR0b24ge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBhZGRpbmc6IDAgNXB4O1xuICAgIGhlaWdodDogNDRweDtcbiAgICBmb250LXNpemU6IDE3cHg7XG4gICAgbGluZS1oZWlnaHQ6IDQ0cHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGNvbG9yOiBAbW9kYWxCdXRvbkNvbG9yO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHRleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAtd2Via2l0LWJveC1mbGV4OjE7XG4gICAgLW1zLWZsZXg6MTtcbiAgICBiYWNrZ3JvdW5kOiBAbW9kYWxCZztcbiAgICAuaGFpcmxpbmUocmlnaHQsIEBtb2RhbEhhaXJsaW5lQ29sb3IpO1xuICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwIDAgMCAxM3B4O1xuICAgIH1cbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHJpZ2h0KTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAwIDEzcHggMDtcbiAgICB9XG4gICAgJjpmaXJzdC1jaGlsZDpsYXN0LWNoaWxkIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAwIDEzcHggMTNweDtcbiAgICB9XG4gICAgJi5tb2RhbC1idXR0b24tYm9sZCB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgICAgIGh0bWwuaW9zLWd0LTggJiB7XG4gICAgICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIGh0bWw6bm90KC53YXRjaC1hY3RpdmUtc3RhdGUpICY6YWN0aXZlLCAmLmFjdGl2ZS1zdGF0ZSB7XG4gICAgICAgIGJhY2tncm91bmQ6IEBtb2RhbEJ1dG9uQWN0aXZlQmc7XG4gICAgfVxuICAgIC5tb2RhbC1idXR0b25zLXZlcnRpY2FsICYge1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHJpZ2h0KTtcbiAgICAgICAgLmhhaXJsaW5lLXJlbW92ZSh0b3ApO1xuICAgICAgICAuaGFpcmxpbmUoYm90dG9tLCBAbW9kYWxIYWlybGluZUNvbG9yKTtcbiAgICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDAgMCAxM3B4IDEzcHg7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4ubW9kYWwtbm8tYnV0dG9ucyB7XG4gICAgLm1vZGFsLWlubmVyIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTNweDtcbiAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgIH1cbiAgICAubW9kYWwtYnV0dG9ucyB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxufVxuLy8gQWN0aW9uIHNoZWV0XG4uYWN0aW9ucy1tb2RhbCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgYm90dG9tOiAwO1xuICAgIHotaW5kZXg6IDEzNTAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMCwxMDAlLDApKTtcbiAgICBtYXgtaGVpZ2h0OiAxMDAlO1xuICAgIC5zY3JvbGxhYmxlKCk7XG4gICAgQG1lZGlhIChtaW4td2lkdGg6NDk2cHgpIHtcbiAgICAgICAgd2lkdGg6IDQ4MHB4O1xuICAgICAgICBsZWZ0OiA1MCU7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAtMjQwcHg7XG4gICAgfVxuICAgICYubW9kYWwtaW4ge1xuICAgICAgICAudHJhbnNpdGlvbihAYWN0aW9uc01vZGFsRHVyYXRpb24pO1xuICAgICAgICAudHJhbnNmb3JtKHRyYW5zbGF0ZTNkKDAsMCwwKSk7XG4gICAgfVxuICAgICYubW9kYWwtb3V0IHtcbiAgICAgICAgei1pbmRleDogMTM1MDAtMTtcbiAgICAgICAgLnRyYW5zaXRpb24oQGFjdGlvbnNNb2RhbER1cmF0aW9uKTtcbiAgICAgICAgLnRyYW5zZm9ybSh0cmFuc2xhdGUzZCgwLDEwMCUsMCkpO1xuICAgIH1cbn1cbi5hY3Rpb25zLW1vZGFsLWdyb3VwIHtcbiAgICBtYXJnaW46IDhweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgYm9yZGVyLXJhZGl1czogMTNweDtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMCwwLDApKTtcbn1cbi5hY3Rpb25zLW1vZGFsLWJ1dHRvbiwgLmFjdGlvbnMtbW9kYWwtbGFiZWwge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgIG1hcmdpbjogMDtcbiAgICBiYWNrZ3JvdW5kOiBAYWN0aW9uc01vZGFsQmc7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAuaGFpcmxpbmUoYm90dG9tLCBAYWN0aW9uc01vZGFsSGFpcmxpbmVDb2xvcik7XG4gICAgYSB7XG4gICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTtcbiAgICAgICAgY29sb3I6IGluaGVyaXQ7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICBiIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgaHRtbC5pb3MtZ3QtOCAmIHtcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgJi5hY3Rpb25zLW1vZGFsLWJ1dHRvbi1ib2xkIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgaHRtbC5pb3MtZ3QtOCAmIHtcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgJi5hY3Rpb25zLW1vZGFsLWJ1dHRvbi1yZWQge1xuICAgICAgICBjb2xvcjogQHJlZDtcbiAgICB9XG4gICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEzcHggMTNweCAwIDA7XG4gICAgfVxuICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAwIDEzcHggMTNweDtcbiAgICB9XG4gICAgJjpmaXJzdC1jaGlsZDpsYXN0LWNoaWxkIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTNweDtcbiAgICB9XG4gICAgJi5kaXNhYmxlZCB7XG4gICAgICAgIG9wYWNpdHk6IDAuOTtcbiAgICAgICAgY29sb3I6QGdyYXk7XG4gICAgfVxufVxuLmFjdGlvbnMtbW9kYWwtYnV0dG9uIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgaGVpZ2h0OiA1N3B4O1xuICAgIGxpbmUtaGVpZ2h0OiA1N3B4O1xuICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgICBjb2xvcjogQHRoZW1lQ29sb3I7XG4gICAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBodG1sOm5vdCgud2F0Y2gtYWN0aXZlLXN0YXRlKSAmOmFjdGl2ZSwgJi5hY3RpdmUtc3RhdGUge1xuICAgICAgICBiYWNrZ3JvdW5kOiBAYWN0aW9uc01vZGFsQnV0dG9uQWN0aXZlQmc7XG4gICAgfVxufVxuLmFjdGlvbnMtbW9kYWwtbGFiZWwge1xuICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICBsaW5lLWhlaWdodDogMS4zO1xuICAgIG1pbi1oZWlnaHQ6IDU3cHg7XG4gICAgcGFkZGluZzogOHB4IDEwcHg7XG4gICAgY29sb3I6ICM4YThhOGE7XG4gICAgLmZsZXhib3goKTtcbiAgICAuanVzdGlmeS1jb250ZW50KGNlbnRlcik7XG4gICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG59XG5AbWVkaWEgKG9yaWVudGF0aW9uOmxhbmRzY2FwZSkge1xuICAgIC5hY3Rpb25zLW1vZGFsLWxhYmVsIHtcbiAgICAgICAgbWluLWhlaWdodDogNDRweDtcbiAgICB9XG4gICAgLmFjdGlvbnMtbW9kYWwtYnV0dG9uIHtcbiAgICAgICAgaGVpZ2h0OiA0NHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogNDRweDtcbiAgICB9XG59XG4vLyBQcm9tcHRcbmlucHV0Lm1vZGFsLXRleHQtaW5wdXQge1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgaGVpZ2h0OiAyNnB4O1xuICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgbWFyZ2luOiAwO1xuICAgIG1hcmdpbi10b3A6IDE1cHg7XG4gICAgcGFkZGluZzogMCA1cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgcmdiYSgwLDAsMCwwLjMpO1xuICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIHJnYmEoMCwwLDAsMCk7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgICAtbXMtYXBwZWFyYW5jZTogbm9uZTtcbiAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgICsgaW5wdXQubW9kYWwtdGV4dC1pbnB1dCB7XG4gICAgICAgIG1hcmdpbi10b3A6IDVweDtcbiAgICB9XG59XG4ubW9kYWwtaW5wdXQtZG91YmxlIHtcbiAgICBpbnB1dC5tb2RhbC10ZXh0LWlucHV0IHtcbiAgICB9XG4gICAgLm1vZGFsLWlucHV0LWRvdWJsZSArICYge1xuICAgICAgICBpbnB1dC5tb2RhbC10ZXh0LWlucHV0IHtcbiAgICAgICAgICAgIGJvcmRlci10b3A6IDA7XG4gICAgICAgICAgICBtYXJnaW4tdG9wOiAwO1xuICAgICAgICB9XG4gICAgfVxufVxuLy8gUG9wb3ZlclxuLnBvcG92ZXIge1xuICAgIHdpZHRoOiAzMjBweDtcbiAgICBiYWNrZ3JvdW5kOkBwb3BvdmVyQmc7XG4gICAgei1pbmRleDogMTM1MDA7XG4gICAgbWFyZ2luOiAwO1xuICAgIHRvcDogMDtcbiAgICBvcGFjaXR5OiAwO1xuICAgIGxlZnQ6IDA7XG4gICAgYm9yZGVyLXJhZGl1czogMTNweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICAudHJhbnNmb3JtKG5vbmUpO1xuICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eTtcbiAgICAtbW96LXRyYW5zaXRpb24tcHJvcGVydHk6IG9wYWNpdHk7XG4gICAgLW1zLXRyYW5zaXRpb24tcHJvcGVydHk6IG9wYWNpdHk7XG4gICAgLW8tdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eTtcbiAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5O1xuICAgICYubW9kYWwtaW4ge1xuICAgICAgICAudHJhbnNpdGlvbihAYWN0aW9uc01vZGFsRHVyYXRpb24pO1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbiAgICAubGlzdC1ibG9jayB7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgdWwge1xuICAgICAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgfVxuICAgICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICAgIHVsIHtcbiAgICAgICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7XG4gICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTNweCAxM3B4IDAgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpOmZpcnN0LWNoaWxkIGF7XG4gICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTNweCAxM3B4IDAgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICAgICAgdWwge1xuICAgICAgICAgICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwIDAgMTNweCAxM3B4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGk6bGFzdC1jaGlsZCBhe1xuICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDAgMCAxM3B4IDEzcHg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgJjpmaXJzdC1jaGlsZDpsYXN0LWNoaWxkIHtcbiAgICAgICAgICAgIGxpOmZpcnN0LWNoaWxkOmxhc3QtY2hpbGQgYSwgdWw6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTNweDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICArIC5saXN0LWJsb2NrIHtcbiAgICAgICAgICAgIG1hcmdpbi10b3A6IDM1cHg7XG4gICAgICAgIH1cbiAgICB9XG59XG4ucG9wb3Zlci1hbmdsZSB7XG4gICAgd2lkdGg6IDI2cHg7XG4gICAgaGVpZ2h0OiAyNnB4O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAtMjZweDtcbiAgICB0b3A6IDA7XG4gICAgei1pbmRleDogMTAwO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgJjphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6JyAnO1xuICAgICAgICBiYWNrZ3JvdW5kOiBAcG9wb3ZlckJnO1xuICAgICAgICB3aWR0aDogMjZweDtcbiAgICAgICAgaGVpZ2h0OiAyNnB4O1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgICAgICAudHJhbnNmb3JtKHJvdGF0ZSg0NWRlZykpO1xuICAgIH1cbiAgICAmLm9uLWxlZnQge1xuICAgICAgICBsZWZ0OiAtMjZweDtcbiAgICAgICAgJjphZnRlciB7XG4gICAgICAgICAgICBsZWZ0OiAxOXB4O1xuICAgICAgICAgICAgdG9wOiAwO1xuICAgICAgICB9XG4gICAgfVxuICAgICYub24tcmlnaHQge1xuICAgICAgICBsZWZ0OiAxMDAlO1xuICAgICAgICAmOmFmdGVyIHtcbiAgICAgICAgICAgIGxlZnQ6IC0xOXB4O1xuICAgICAgICAgICAgdG9wOiAwO1xuICAgICAgICB9XG4gICAgfVxuICAgICYub24tdG9wIHtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgdG9wOiAtMjZweDtcbiAgICAgICAgJjphZnRlciB7XG4gICAgICAgICAgICBsZWZ0OiAwO1xuICAgICAgICAgICAgdG9wOiAxOXB4O1xuICAgICAgICB9XG4gICAgfVxuICAgICYub24tYm90dG9tIHtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgdG9wOiAxMDAlO1xuICAgICAgICAmOmFmdGVyIHtcbiAgICAgICAgICAgIGxlZnQ6IDA7XG4gICAgICAgICAgICB0b3A6IC0xOXB4O1xuICAgICAgICB9XG4gICAgfVxufVxuLnBvcG92ZXItaW5uZXIge1xuICAgIC5zY3JvbGxhYmxlKCk7ICAgIFxufVxuLmFjdGlvbnMtcG9wb3ZlciB7XG4gICAgLmxpc3QtYmxvY2sgKyAubGlzdC1ibG9jayB7XG4gICAgICAgIG1hcmdpbi10b3A6IDIwcHg7XG4gICAgfVxuICAgIC5saXN0LWJsb2NrIHVsIHtcbiAgICAgICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICB9XG59XG4uYWN0aW9ucy1wb3BvdmVyLWxhYmVsIHtcbiAgICBwYWRkaW5nOiA4cHggMTBweDtcbiAgICBjb2xvcjojOGE4YThhO1xuICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICBsaW5lLWhlaWdodDogMS4zO1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgLmhhaXJsaW5lKGJvdHRvbSwgQGFjdGlvbnNQb3BvdmVySGFpcmxpbmUpO1xuICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICB9XG59XG4vLyBQb3B1cFxuLnBvcHVwLCAubG9naW4tc2NyZWVuIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHotaW5kZXg6IDExMDAwO1xuICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIC5zY3JvbGxhYmxlKCk7XG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybTtcbiAgICAtbW96LXRyYW5zaXRpb24tcHJvcGVydHk6IC1tb3otdHJhbnNmb3JtO1xuICAgIC1tcy10cmFuc2l0aW9uLXByb3BlcnR5OiAtbXMtdHJhbnNmb3JtO1xuICAgIC1vLXRyYW5zaXRpb24tcHJvcGVydHk6IC1vLXRyYW5zZm9ybTtcbiAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm07XG4gICAgLnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTtcbiAgICAmLm1vZGFsLWluLCAmLm1vZGFsLW91dCB7XG4gICAgICAgIC50cmFuc2l0aW9uKEBwb3B1cER1cmF0aW9uKTtcbiAgICB9XG4gICAgJi5tb2RhbC1pbiB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgfVxuICAgICYubW9kYWwtb3V0IHtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTtcbiAgICB9XG59XG4ubG9naW4tc2NyZWVuLm1vZGFsLWluLCAubG9naW4tc2NyZWVuLm1vZGFsLW91dCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG4vLyBpUGFkIFBvcHVwXG5AbWVkaWEgYWxsIGFuZCAobWluLXdpZHRoOjYzMHB4KSBhbmQgKG1pbi1oZWlnaHQ6NjMwcHgpIHtcbiAgICAucG9wdXA6bm90KC50YWJsZXQtZnVsbHNjcmVlbikge1xuICAgICAgICB3aWR0aDogNjMwcHg7XG4gICAgICAgIGhlaWdodDogNjMwcHg7XG4gICAgICAgIGxlZnQ6IDUwJTtcbiAgICAgICAgdG9wOiA1MCU7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAtMzE1cHg7XG4gICAgICAgIG1hcmdpbi10b3A6IC0zMTVweDtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMTAyNHB4LDApO1xuICAgICAgICAmLm1vZGFsLWluIHtcbiAgICAgICAgICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgICAgIH1cbiAgICAgICAgJi5tb2RhbC1vdXQge1xuICAgICAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMTAyNHB4LDApO1xuICAgICAgICB9XG4gICAgfVxufVxuaHRtbC53aXRoLXN0YXR1c2Jhci1vdmVybGF5IHtcbiAgICAvLyBpUGhvbmUgd2l0aCBzdGF0dXNiYXIgb3ZlcmxheVxuICAgIEBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6NjI5cHgpLCAobWF4LWhlaWdodDo2MjlweCkge1xuICAgICAgICAucG9wdXAge1xuICAgICAgICAgICAgaGVpZ2h0OiB+XCItd2Via2l0LWNhbGMoMTAwJSAtIDIwcHgpXCI7XG4gICAgICAgICAgICBoZWlnaHQ6IH5cImNhbGMoMTAwJSAtIDIwcHgpXCI7XG4gICAgICAgICAgICB0b3A6IDIwcHg7XG4gICAgICAgIH1cbiAgICAgICAgLnBvcHVwLW92ZXJsYXkge1xuICAgICAgICAgICAgei1pbmRleDogOTUwMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAubG9naW4tc2NyZWVuLCAucG9wdXAudGFibGV0LWZ1bGxzY3JlZW4ge1xuICAgICAgICBoZWlnaHQ6IH5cIi13ZWJraXQtY2FsYygxMDAlIC0gMjBweClcIjtcbiAgICAgICAgaGVpZ2h0OiB+XCJjYWxjKDEwMCUgLSAyMHB4KVwiO1xuICAgICAgICB0b3A6IDIwcHg7XG4gICAgfVxufVxuXG4vL1ByZWxvYWRlcnMgbW9kYWxzXG4ubW9kYWwgLnByZWxvYWRlciB7XG4gICAgd2lkdGg6IDM0cHg7XG4gICAgaGVpZ2h0OiAzNHB4O1xufVxuLnByZWxvYWRlci1pbmRpY2F0b3Itb3ZlcmxheSB7XG4gICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICBvcGFjaXR5OiAwO1xuICAgIGJhY2tncm91bmQ6IG5vbmU7XG59XG4ucHJlbG9hZGVyLWluZGljYXRvci1tb2RhbCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDUwJTtcbiAgICB0b3A6IDUwJTtcbiAgICBwYWRkaW5nOiA4cHg7XG4gICAgbWFyZ2luLWxlZnQ6IC0yNXB4O1xuICAgIG1hcmdpbi10b3A6IC0yNXB4O1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC44KTtcbiAgICB6LWluZGV4OiAxMzUwMDtcbiAgICBib3JkZXItcmFkaXVzOiA1cHg7XG4gICAgLnByZWxvYWRlciB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB3aWR0aDogMzRweDtcbiAgICAgICAgaGVpZ2h0OiAzNHB4O1xuICAgIH1cbn1cblxuLy8gUGlja2VyIE1vZGFsXG4ucGlja2VyLW1vZGFsIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICBib3R0b206IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAyNjBweDtcbiAgICB6LWluZGV4OiAxMjUwMDtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm07XG4gICAgLW1vei10cmFuc2l0aW9uLXByb3BlcnR5OiAtbW96LXRyYW5zZm9ybTtcbiAgICAtbXMtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLW1zLXRyYW5zZm9ybTtcbiAgICAtby10cmFuc2l0aW9uLXByb3BlcnR5OiAtby10cmFuc2Zvcm07XG4gICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtO1xuICAgIGJhY2tncm91bmQ6ICNjZmQ1ZGE7XG4gICAgLnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTtcbiAgICAmLm1vZGFsLWluLCAmLm1vZGFsLW91dCB7XG4gICAgICAgIC50cmFuc2l0aW9uKDQwMG1zKTtcbiAgICB9XG4gICAgJi5tb2RhbC1pbiB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgfVxuICAgICYubW9kYWwtb3V0IHtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTtcbiAgICB9XG4gICAgLnBpY2tlci1tb2RhbC1pbm5lciB7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIH1cbiAgICAudG9vbGJhciB7XG4gICAgICAgIC5oYWlybGluZSh0b3AsICM5Mjk0OTkpO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZjdmN2Y4O1xuICAgICAgICArIC5waWNrZXItbW9kYWwtaW5uZXIge1xuICAgICAgICAgICAgaGVpZ2h0OiB+XCItd2Via2l0LWNhbGMoMTAwJSAtIEB7dG9vbGJhclNpemV9KVwiO1xuICAgICAgICAgICAgaGVpZ2h0OiB+XCItbW96LWNhbGMoMTAwJSAtIEB7dG9vbGJhclNpemV9KVwiO1xuICAgICAgICAgICAgaGVpZ2h0OiB+XCJjYWxjKDEwMCUgLSBAe3Rvb2xiYXJTaXplfSlcIjsgICAgXG4gICAgICAgIH1cbiAgICB9XG4gICAgJi5waWNrZXItbW9kYWwtaW5saW5lLCAucG9wb3ZlciAmIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgei1pbmRleDogaW5oZXJpdDtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICAgICAgLnRvb2xiYXIge1xuICAgICAgICAgICAgLmhhaXJsaW5lLXJlbW92ZSh0b3ApO1xuICAgICAgICAgICAgLmhhaXJsaW5lKGJvdHRvbSwgIzkyOTQ5OSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnBvcG92ZXIgJiB7XG4gICAgICAgIHdpZHRoOiBhdXRvO1xuICAgICAgICAudG9vbGJhciB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgICB9XG4gICAgfVxuICAgICYuc21hcnQtc2VsZWN0LXBpY2tlciB7XG4gICAgICAgIC5wYWdlIHtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgICAgIH1cbiAgICAgICAgLnRvb2xiYXIge1xuICAgICAgICAgICAgLmhhaXJsaW5lKGJvdHRvbSwgI2M0YzRjNCk7XG4gICAgICAgIH1cbiAgICAgICAgLmxpc3QtYmxvY2sge1xuICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgdWwge1xuICAgICAgICAgICAgICAgIC5oYWlybGluZS1yZW1vdmUodG9wKTtcbiAgICAgICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyogPT09IFBhbmVscyA9PT0gKi9cbkBwYW5lbFdpZHRoOjI2MHB4O1xuQHBhbmVsc0R1cmF0aW9uOiA0MDBtcztcbi5wYW5lbC1vdmVybGF5IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMCk7XG4gICAgb3BhY2l0eTogMDtcbiAgICB6LWluZGV4OiA1OTk5O1xuICAgIGRpc3BsYXk6IG5vbmU7XG59XG4ucGFuZWwge1xuICAgIHotaW5kZXg6IDEwMDA7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiAjMTExO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgLnNjcm9sbGFibGUoKTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IEBwYW5lbFdpZHRoO1xuICAgIHRvcDogMDtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgLnRyYW5zbGF0ZTNkKDApO1xuICAgIC50cmFuc2l0aW9uKEBwYW5lbHNEdXJhdGlvbik7XG5cbiAgICAmLnBhbmVsLWxlZnQge1xuICAgICAgICAmLnBhbmVsLWNvdmVyIHtcbiAgICAgICAgICAgIHotaW5kZXg6IDYwMDA7XG4gICAgICAgICAgICBsZWZ0OiAtQHBhbmVsV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgJi5wYW5lbC1yZXZlYWwge1xuICAgICAgICAgICAgbGVmdDogMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAmLnBhbmVsLXJpZ2h0IHtcbiAgICAgICAgJi5wYW5lbC1jb3ZlciB7XG4gICAgICAgICAgICB6LWluZGV4OiA2MDAwO1xuICAgICAgICAgICAgcmlnaHQ6IC1AcGFuZWxXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICAmLnBhbmVsLXJldmVhbCB7XG4gICAgICAgICAgICByaWdodDogMDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmJvZHkud2l0aC1wYW5lbC1sZWZ0LWNvdmVyLCBib2R5LndpdGgtcGFuZWwtcmlnaHQtY292ZXIge1xuICAgIC52aWV3cyB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwKTtcbiAgICB9XG4gICAgLnBhbmVsLW92ZXJsYXkge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG59XG5ib2R5LndpdGgtcGFuZWwtbGVmdC1yZXZlYWwsIGJvZHkud2l0aC1wYW5lbC1yaWdodC1yZXZlYWwge1xuICAgIC52aWV3cyB7XG4gICAgICAgIC50cmFuc2l0aW9uKEBwYW5lbHNEdXJhdGlvbik7XG4gICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm07XG4gICAgICAgIC1tb3otdHJhbnNpdGlvbi1wcm9wZXJ0eTogLW1vei10cmFuc2Zvcm07XG4gICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybTtcbiAgICB9XG4gICAgLnBhbmVsLW92ZXJsYXkge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG59XG5ib2R5LndpdGgtcGFuZWwtbGVmdC1yZXZlYWwge1xuICAgIC52aWV3cyB7XG4gICAgICAgIC50cmFuc2xhdGUzZChAcGFuZWxXaWR0aCk7XG4gICAgfVxuICAgIC5wYW5lbC1vdmVybGF5IHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IEBwYW5lbFdpZHRoO1xuICAgIH1cbn1cbmJvZHkud2l0aC1wYW5lbC1sZWZ0LWNvdmVyIHtcbiAgICAucGFuZWwtbGVmdCB7XG4gICAgICAgIC50cmFuc2xhdGUzZChAcGFuZWxXaWR0aCk7XG4gICAgfVxufVxuYm9keS53aXRoLXBhbmVsLXJpZ2h0LXJldmVhbCB7XG4gICAgLnZpZXdzIHtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKC1AcGFuZWxXaWR0aCk7XG4gICAgfVxuICAgIC5wYW5lbC1vdmVybGF5IHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IC1AcGFuZWxXaWR0aDtcbiAgICB9XG59XG5ib2R5LndpdGgtcGFuZWwtcmlnaHQtY292ZXIge1xuICAgIC5wYW5lbC1yaWdodCB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgtQHBhbmVsV2lkdGgpO1xuICAgIH1cbn1cbmJvZHkucGFuZWwtY2xvc2luZyB7XG4gICAgLnZpZXdzIHtcbiAgICAgICAgLnRyYW5zaXRpb24oQHBhbmVsc0R1cmF0aW9uKTtcbiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybTtcbiAgICAgICAgLW1vei10cmFuc2l0aW9uLXByb3BlcnR5OiAtbW96LXRyYW5zZm9ybTtcbiAgICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtO1xuICAgIH1cbn0iLCIvKiA9PT0gVGFicyA9PT0gKi9cbi50YWJzIHtcbiAgICAudGFiIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gICAgLnRhYi5hY3RpdmUge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG59XG4udGFicy1hbmltYXRlZC13cmFwIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgPi50YWJzIHtcbiAgICAgICAgLmZsZXhib3goKTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgICAgID4udGFiIHtcbiAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICAuZmxleC1zaHJpbmsoMCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4udGFicy1zd2lwZWFibGUtd3JhcCB7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgID4gLnRhYnMgPiAudGFiIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxufSIsIi8qID09PSBNZXNzYWdlcyA9PT0gKi9cbi5tZXNzYWdlcy1jb250ZW50IHtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmO1xufVxuLm1lc3NhZ2VzIHtcbiAgICAuZmxleGJveCgpO1xuICAgIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XG4gICAgLW1vei1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbn1cbi5tZXNzYWdlcy1kYXRlIHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICBmb250LXNpemU6IDExcHg7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgbWFyZ2luOiAxMHB4IDE1cHg7XG4gICAgY29sb3I6ICM4ZThlOTM7XG4gICAgaHRtbC5pb3MtZ3QtOCAmIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDtcbiAgICB9XG4gICAgc3BhbiB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7XG4gICAgfVxufVxuLm1lc3NhZ2Uge1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgbWFyZ2luOiAxcHggMTBweCAwO1xuICAgIG1heC13aWR0aDogNzAlO1xuICAgIC5mbGV4Ym94KCk7XG4gICAgLXdlYmtpdC1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgICAtbW96LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tdG9wOiAxMHB4O1xuICAgIH1cbiAgICAubWVzc2FnZS10ZXh0IHtcbiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTZweDtcbiAgICAgICAgcGFkZGluZzogNnB4IDE2cHggOXB4O1xuICAgICAgICBtaW4td2lkdGg6IDQ4cHg7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDM1cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTdweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDEuMjtcbiAgICAgICAgd29yZC1icmVhazogYnJlYWstd29yZDtcbiAgICAgICAgaW1nIHtcbiAgICAgICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgfVxuICAgIH1cbiAgICAmLm1lc3NhZ2UtcGljIHtcbiAgICAgICAgLm1lc3NhZ2UtdGV4dCB7XG4gICAgICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgfVxuICAgICAgICBpbWcge1xuICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4O1xuICAgICAgICB9XG4gICAgfVxufVxuLm1lc3NhZ2UtbmFtZSB7XG4gICAgZm9udC1zaXplOiAxMnB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIGNvbG9yOiAjOGU4ZTkzO1xuICAgIG1hcmdpbi1ib3R0b206IDJweDtcbiAgICBtYXJnaW4tdG9wOiA3cHg7XG4gICAgLm1lc3NhZ2UtaGlkZS1uYW1lICYge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbn1cbi5tZXNzYWdlLWxhYmVsIHtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgY29sb3I6ICM4ZThlOTM7XG4gICAgbWFyZ2luLXRvcDogNHB4O1xuICAgIC5tZXNzYWdlLWhpZGUtbGFiZWwgJiB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxufVxuLm1lc3NhZ2UtYXZhdGFyIHtcbiAgICB3aWR0aDogMjlweDtcbiAgICBoZWlnaHQ6IDI5cHg7XG4gICAgYm9yZGVyLXJhZGl1czogMTAwJTtcbiAgICBtYXJnaW4tdG9wOiAtMjlweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgdG9wOiAxcHg7XG4gICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjtcbiAgICBvcGFjaXR5OiAxO1xuICAgIC50cmFuc2l0aW9uKDQwMG1zKTtcbiAgICAubWVzc2FnZS1oaWRlLWF2YXRhciAmIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICB9XG59XG4ubWVzc2FnZS1kYXRlIHtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgbWFyZ2luLXRvcDogNHB4O1xuICAgIG9wYWNpdHk6IDAuODtcbiAgICAubWVzc2FnZS1waWMgaW1nICsgJiB7XG4gICAgICAgIG1hcmdpbi10b3A6IDhweDtcbiAgICB9XG4gICAgLm1lc3NhZ2Utc2VudCAmIHtcbiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgfVxufVxuLm1lc3NhZ2Utc2VudCB7XG4gICAgLW1zLWZsZXgtaXRlbS1hbGlnbjogZW5kO1xuICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1lbmQ7XG4gICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7XG4gICAgLmFsaWduLWl0ZW1zKGZsZXgtZW5kKTtcbiAgICAubWVzc2FnZS1uYW1lIHtcbiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxNnB4O1xuICAgIH1cbiAgICAubWVzc2FnZS1sYWJlbCB7XG4gICAgICAgIG1hcmdpbi1yaWdodDogNnB4O1xuICAgIH1cbiAgICAmLm1lc3NhZ2Utd2l0aC1hdmF0YXIge1xuICAgICAgICAubWVzc2FnZS10ZXh0IHtcbiAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMjlweDtcbiAgICAgICAgfVxuICAgICAgICAubWVzc2FnZS1uYW1lIHtcbiAgICAgICAgICAgIG1hcmdpbi1yaWdodDogNDVweDtcbiAgICAgICAgfVxuICAgICAgICAubWVzc2FnZS1sYWJlbCB7XG4gICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IDM0cHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLm1lc3NhZ2UtdGV4dCB7XG4gICAgICAgIHBhZGRpbmctcmlnaHQ6IDIycHg7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMwMGQ0NDk7XG4gICAgICAgIGNvbG9yOiB3aGl0ZTtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgICAgIC13ZWJraXQtbWFzay1ib3gtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LDxzdmcgaGVpZ2h0PSczNScgdmlld0JveD0nMCAwIDk2IDcwJyB3aWR0aD0nNDgnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PHBhdGggZD0nbTg0IDM1YzEgNy01IDM3LTQyIDM1LTM3IDItNDMtMjgtNDItMzUtMS03IDUtMzcgNDItMzUgMzctMiA0MyAyOCA0MiAzNXonLz48L3N2Zz5cIikgNTAlIDU2JSA0NiUgNDIlO1xuICAgIH1cbiAgICAmLm1lc3NhZ2UtbGFzdCwgJi5tZXNzYWdlLXdpdGgtdGFpbCB7XG4gICAgICAgIC5tZXNzYWdlLXRleHQge1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTZweCAxNnB4IDAgMTZweDtcbiAgICAgICAgICAgIC13ZWJraXQtbWFzay1ib3gtaW1hZ2U6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LDxzdmcgaGVpZ2h0PSczNScgdmlld0JveD0nMCAwIDk2IDcwJyB3aWR0aD0nNDgnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PHBhdGggZD0nbTg0IDM1YzEgNy01IDM3LTQyIDM1LTM3IDItNDMtMjgtNDItMzUtMS03IDUtMzcgNDItMzUgMzctMiA0MyAyOCA0MiAzNXonLz48cGF0aCBkPSdtOTYgNzBjLTYtMi0xMi0xMC0xMi0xOXYtMTZsLTE0IDI3czggOCAyNiA4eicvPjwvc3ZnPlwiKSA1MCUgNTYlIDQ2JSA0MiU7XG4gICAgICAgIH1cbiAgICAgICAgJi5tZXNzYWdlLXBpYyBpbWd7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4IDE2cHggMCAxNnB4O1xuICAgICAgICB9XG4gICAgfVxufVxuLm1lc3NhZ2UtcmVjZWl2ZWQge1xuICAgIC1tcy1mbGV4LWl0ZW0tYWxpZ246IHN0YXJ0O1xuICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1zdGFydDtcbiAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0O1xuICAgIC5hbGlnbi1pdGVtcyhmbGV4LXN0YXJ0KTtcbiAgICAubWVzc2FnZS10ZXh0IHtcbiAgICAgICAgcGFkZGluZy1sZWZ0OiAyMnB4O1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTVlNWVhO1xuICAgICAgICBjb2xvcjogIzAwMDtcbiAgICAgICAgLXdlYmtpdC1tYXNrLWJveC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsPHN2ZyBoZWlnaHQ9JzM1JyB2aWV3Qm94PScwIDAgOTYgNzAnIHdpZHRoPSc0OCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJz48cGF0aCBkPSdtOTYgMzVjMSA3LTUgMzctNDIgMzUtMzcgMi00My0yOC00Mi0zNS0xLTcgNS0zNyA0Mi0zNSAzNy0yIDQzIDI4IDQyIDM1eicvPjwvc3ZnPlwiKSA1MCUgNDIlIDQ2JSA1NiU7XG4gICAgfVxuICAgIC5tZXNzYWdlLW5hbWUge1xuICAgICAgICBtYXJnaW4tbGVmdDogMTZweDtcbiAgICB9XG4gICAgLm1lc3NhZ2UtbGFiZWwge1xuICAgICAgICBtYXJnaW4tbGVmdDogNnB4O1xuICAgIH1cbiAgICAmLm1lc3NhZ2Utd2l0aC1hdmF0YXIge1xuICAgICAgICAubWVzc2FnZS10ZXh0IHtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAyOXB4O1xuICAgICAgICB9XG4gICAgICAgIC5tZXNzYWdlLW5hbWUge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDQ1cHg7XG4gICAgICAgIH1cbiAgICAgICAgLm1lc3NhZ2UtbGFiZWwge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDM0cHg7XG4gICAgICAgIH1cbiAgICB9ICAgIFxuICAgICYubWVzc2FnZS1sYXN0LCAmLm1lc3NhZ2Utd2l0aC10YWlsIHtcbiAgICAgICAgLm1lc3NhZ2UtdGV4dCB7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4IDE2cHggMTZweCAwO1xuICAgICAgICAgICAgLXdlYmtpdC1tYXNrLWJveC1pbWFnZTogdXJsKFwiZGF0YTppbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgsPHN2ZyBoZWlnaHQ9JzM1JyB2aWV3Qm94PScwIDAgOTYgNzAnIHdpZHRoPSc0OCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJz48cGF0aCBkPSdtOTYgMzVjMSA3LTUgMzctNDIgMzUtMzcgMi00My0yOC00Mi0zNS0xLTcgNS0zNyA0Mi0zNSAzNy0yIDQzIDI4IDQyIDM1eicvPjxwYXRoIGQ9J20wIDcwYzYtMiAxMi0xMCAxMi0xOXYtMTZsMTQgMjdzLTggOC0yNiA4eicvPjwvc3ZnPlwiKSA1MCUgNDIlIDQ2JSA1NiU7XG4gICAgICAgIH1cbiAgICAgICAgJi5tZXNzYWdlLXBpYyBpbWd7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4IDE2cHggMTZweCAwO1xuICAgICAgICB9XG4gICAgfVxufVxuLm1lc3NhZ2UtbGFzdCB7XG4gICAgbWFyZ2luLWJvdHRvbTogOHB4O1xufVxuLm1lc3NhZ2UtYXBwZWFyLWZyb20tYm90dG9tIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogbWVzc2FnZUFwcGVhckZyb21Cb3R0b20gNDAwbXM7XG4gICAgYW5pbWF0aW9uOiBtZXNzYWdlQXBwZWFyRnJvbUJvdHRvbSA0MDBtcztcbn1cbi5tZXNzYWdlLWFwcGVhci1mcm9tLXRvcCB7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IG1lc3NhZ2VBcHBlYXJGcm9tVG9wIDQwMG1zO1xuICAgIGFuaW1hdGlvbjogbWVzc2FnZUFwcGVhckZyb21Ub3AgNDAwbXM7ICAgXG59XG4ubWVzc2FnZXMtYXV0by1sYXlvdXQge1xuICAgIC5tZXNzYWdlLW5hbWUsIC5tZXNzYWdlLWxhYmVsIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gICAgLm1lc3NhZ2UtYXZhdGFyIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICB9XG4gICAgLm1lc3NhZ2UtZmlyc3Qge1xuICAgICAgICAubWVzc2FnZS1uYW1lIHtcbiAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB9XG4gICAgfVxuICAgIC5tZXNzYWdlLWxhc3Qge1xuICAgICAgICAubWVzc2FnZS1hdmF0YXIge1xuICAgICAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgfVxuICAgICAgICAubWVzc2FnZS1sYWJlbCB7XG4gICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgfVxuICAgIH1cbn1cbmh0bWwucmV0aW5hLmlvcy02IHtcbiAgICAubWVzc2FnZSwgLm1lc3NhZ2UubWVzc2FnZS1waWMgaW1nIHtcbiAgICAgICAgLXdlYmtpdC1tYXNrLWJveC1pbWFnZTpub25lO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxNnB4O1xuICAgIH1cbn1cbkAtd2Via2l0LWtleWZyYW1lcyBtZXNzYWdlQXBwZWFyRnJvbUJvdHRvbSB7XG4gICAgZnJvbSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLDEwMCUsMCk7XG4gICAgfVxuICAgIHRvIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG59XG5Aa2V5ZnJhbWVzIG1lc3NhZ2VBcHBlYXJGcm9tQm90dG9tIHtcbiAgICBmcm9tIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLDEwMCUsMCk7XG4gICAgfVxuICAgIHRvIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIG1lc3NhZ2VBcHBlYXJGcm9tVG9wIHtcbiAgICBmcm9tIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsLTEwMCUsMCk7XG4gICAgfVxuICAgIHRvIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG59XG5Aa2V5ZnJhbWVzIG1lc3NhZ2VBcHBlYXJGcm9tVG9wIHtcbiAgICBmcm9tIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLC0xMDAlLDApO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwwLDApO1xuICAgIH1cbn1cbiIsIi8qID09PSBTdGF0dXNiYXIgb3ZlcmxheSA9PT0gKi9cbmh0bWwud2l0aC1zdGF0dXNiYXItb3ZlcmxheSBib2R5e1xuICAgIHBhZGRpbmctdG9wOiAyMHB4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgLnN0YXR1c2Jhci1vdmVybGF5IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxuICAgIC5wYW5lbCB7XG4gICAgICAgIHBhZGRpbmctdG9wOiAyMHB4O1xuICAgIH1cbn1cbi5zdGF0dXNiYXItb3ZlcmxheSB7XG4gICAgYmFja2dyb3VuZDogQHRvb2xiYXJCZztcbiAgICB6LWluZGV4OiAxMDAwMDsgLy8gQSBiaXQgbG93ZXIgdGhhbiAubW9kYWxzLW92ZXJsYXlcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgaGVpZ2h0OiAyMHB4O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgLnRyYW5zaXRpb24oQHBhbmVsc0R1cmF0aW9uKTtcbn0iLCIvKiA9PT0gUHJlbG9hZGVyID09PSAqL1xuLnByZWxvYWRlciB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAyMHB4O1xuICAgIGhlaWdodDogMjBweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgdmlld0JveD0nMCAwIDEyMCAxMjAnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycgeG1sbnM6eGxpbms9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnPjxkZWZzPjxsaW5lIGlkPSdsJyB4MT0nNjAnIHgyPSc2MCcgeTE9JzcnIHkyPScyNycgc3Ryb2tlPScjNmM2YzZjJyBzdHJva2Utd2lkdGg9JzExJyBzdHJva2UtbGluZWNhcD0ncm91bmQnLz48L2RlZnM+PGc+PHVzZSB4bGluazpocmVmPScjbCcgb3BhY2l0eT0nLjI3Jy8+PHVzZSB4bGluazpocmVmPScjbCcgb3BhY2l0eT0nLjI3JyB0cmFuc2Zvcm09J3JvdGF0ZSgzMCA2MCw2MCknLz48dXNlIHhsaW5rOmhyZWY9JyNsJyBvcGFjaXR5PScuMjcnIHRyYW5zZm9ybT0ncm90YXRlKDYwIDYwLDYwKScvPjx1c2UgeGxpbms6aHJlZj0nI2wnIG9wYWNpdHk9Jy4yNycgdHJhbnNmb3JtPSdyb3RhdGUoOTAgNjAsNjApJy8+PHVzZSB4bGluazpocmVmPScjbCcgb3BhY2l0eT0nLjI3JyB0cmFuc2Zvcm09J3JvdGF0ZSgxMjAgNjAsNjApJy8+PHVzZSB4bGluazpocmVmPScjbCcgb3BhY2l0eT0nLjI3JyB0cmFuc2Zvcm09J3JvdGF0ZSgxNTAgNjAsNjApJy8+PHVzZSB4bGluazpocmVmPScjbCcgb3BhY2l0eT0nLjM3JyB0cmFuc2Zvcm09J3JvdGF0ZSgxODAgNjAsNjApJy8+PHVzZSB4bGluazpocmVmPScjbCcgb3BhY2l0eT0nLjQ2JyB0cmFuc2Zvcm09J3JvdGF0ZSgyMTAgNjAsNjApJy8+PHVzZSB4bGluazpocmVmPScjbCcgb3BhY2l0eT0nLjU2JyB0cmFuc2Zvcm09J3JvdGF0ZSgyNDAgNjAsNjApJy8+PHVzZSB4bGluazpocmVmPScjbCcgb3BhY2l0eT0nLjY2JyB0cmFuc2Zvcm09J3JvdGF0ZSgyNzAgNjAsNjApJy8+PHVzZSB4bGluazpocmVmPScjbCcgb3BhY2l0eT0nLjc1JyB0cmFuc2Zvcm09J3JvdGF0ZSgzMDAgNjAsNjApJy8+PHVzZSB4bGluazpocmVmPScjbCcgb3BhY2l0eT0nLjg1JyB0cmFuc2Zvcm09J3JvdGF0ZSgzMzAgNjAsNjApJy8+PC9nPjwvc3ZnPlwiKTtcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiA1MCU7XG4gICAgYmFja2dyb3VuZC1zaXplOiAxMDAlO1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IHByZWxvYWRlci1zcGluIDFzIHN0ZXBzKDEyLCBlbmQpIGluZmluaXRlO1xuICAgIGFuaW1hdGlvbjogcHJlbG9hZGVyLXNwaW4gMXMgc3RlcHMoMTIsIGVuZCkgaW5maW5pdGU7XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgcHJlbG9hZGVyLXNwaW4ge1xuICAgIDEwMCUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gICAgfVxufVxuQGtleWZyYW1lcyBwcmVsb2FkZXItc3BpbiB7XG4gICAgMTAwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7XG4gICAgfVxufVxuIiwiLyogPT09IFByb2dyZXNzIEJhciA9PT0gKi9cbi5wcm9ncmVzc2JhciwgLnByb2dyZXNzYmFyLWluZmluaXRlIHtcbiAgICBoZWlnaHQ6IDJweDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBiYWNrZ3JvdW5kOiAjYjZiNmI2O1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICAudHJhbnNmb3JtLW9yaWdpbihjZW50ZXIgdG9wKTtcbiAgICAtd2Via2l0LXRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG4gICAgdHJhbnNmb3JtLXN0eWxlOiBwcmVzZXJ2ZS0zZDtcbn1cbi8vIERldGVybWluZWRcbi5wcm9ncmVzc2JhciB7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICBzcGFuIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGJhY2tncm91bmQ6IEB0aGVtZUNvbG9yO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICAudHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApO1xuICAgICAgICAudHJhbnNpdGlvbigxNTBtcyk7XG4gICAgfVxufVxuLy8gSW5maW5pdGVcbi5wcm9ncmVzc2Jhci1pbmZpbml0ZSB7XG4gICAgJjpiZWZvcmUge1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIGJhY2tncm91bmQ6IEB0aGVtZUNvbG9yO1xuICAgICAgICAudHJhbnNsYXRlM2QoMCwgMCwgMCk7XG4gICAgICAgIC50cmFuc2Zvcm0tb3JpZ2luKGxlZnQgY2VudGVyKTtcbiAgICAgICAgLmFuaW1hdGlvbihwcm9ncmVzc2Jhci1pbmZpbml0ZSAxcyBsaW5lYXIgaW5maW5pdGUpO1xuICAgIH1cbiAgICBodG1sLndpdGgtc3RhdHVzYmFyLW92ZXJsYXkgYm9keSA+ICYsIGh0bWwud2l0aC1zdGF0dXNiYXItb3ZlcmxheSAuZnJhbWV3b3JrNy1yb290ID4gJiB7XG4gICAgICAgIHRvcDogMjBweDtcbiAgICB9XG59XG4vLyBNdWx0aWNvbG9yXG4ucHJvZ3Jlc3NiYXItaW5maW5pdGUuY29sb3ItbXVsdGkge1xuICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgJjpiZWZvcmUge1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIHdpZHRoOiA0MDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGxlZnQsICM0Y2Q5NjQsICM1YWM4ZmEsICMwMDdhZmYsICMzNGFhZGMsICM1ODU2ZDYsICNmZjJkNTUsICM1ODU2ZDYsICMzNGFhZGMsICMwMDdhZmYsICM1YWM4ZmEsICM0Y2Q5NjQpO1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsICM0Y2Q5NjQsICM1YWM4ZmEsICMwMDdhZmYsICMzNGFhZGMsICM1ODU2ZDYsICNmZjJkNTUsICM1ODU2ZDYsICMzNGFhZGMsICMwMDdhZmYsICM1YWM4ZmEsICM0Y2Q5NjQpO1xuICAgICAgICBiYWNrZ3JvdW5kLXNpemU6IDI1JSAxMDAlO1xuICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLCAwLCAwKTtcbiAgICAgICAgLmFuaW1hdGlvbihwcm9ncmVzc2Jhci1pbmZpbml0ZS1tdWx0aWNvbG9yIDNzIGxpbmVhciBpbmZpbml0ZSk7XG4gICAgfVxuICAgIGh0bWwud2l0aC1zdGF0dXNiYXItb3ZlcmxheSBib2R5ID4gJiAsIGh0bWwud2l0aC1zdGF0dXNiYXItb3ZlcmxheSAuZnJhbWV3b3JrNy1yb290ID4gJiB7XG4gICAgICAgIHRvcDogMjBweDtcbiAgICB9XG59XG5ib2R5LCAudmlldywgLnZpZXdzLCAucGFnZSwgLnBhbmVsLCAucG9wdXAsIC5mcmFtZXdvcms3LXJvb3Qge1xuICAgID4gLnByb2dyZXNzYmFyLCA+IC5wcm9ncmVzc2Jhci1pbmZpbml0ZSB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICB6LWluZGV4OiAxNTAwMDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICB9XG59XG4vLyBBbmltYXRpb25zXG4ucHJvZ3Jlc3NiYXItaW4ge1xuICAgIC5hbmltYXRpb24ocHJvZ3Jlc3NiYXItaW4gMzAwbXMgZm9yd2FyZHMpO1xufVxuLnByb2dyZXNzYmFyLW91dCB7XG4gICAgLmFuaW1hdGlvbihwcm9ncmVzc2Jhci1vdXQgMzAwbXMgZm9yd2FyZHMpO1xufVxuXG5odG1sLndpdGgtc3RhdHVzYmFyLW92ZXJsYXkgYm9keSA+IC5wcm9ncmVzc2JhciB7XG4gICAgdG9wOiAyMHB4O1xufVxuQC13ZWJraXQta2V5ZnJhbWVzIHByb2dyZXNzYmFyLWluIHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWSgwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVZKDEpO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcHJvZ3Jlc3NiYXItaW4ge1xuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWSgwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWSgxKTtcbiAgICB9XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgcHJvZ3Jlc3NiYXItb3V0IHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWSgxKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVZKDApO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcHJvZ3Jlc3NiYXItb3V0IHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVkoMSk7XG4gICAgfVxuICAgIHRvIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVkoMCk7XG4gICAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIHByb2dyZXNzYmFyLWluZmluaXRlIHtcbiAgICAwJSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtNTAlLCAwLCAwKSBzY2FsZVgoMC41KTtcbiAgICB9XG4gICAgMTAwJSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKSBzY2FsZVgoMC41KTtcbiAgICB9XG59XG5Aa2V5ZnJhbWVzIHByb2dyZXNzYmFyLWluZmluaXRlIHtcbiAgICAwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTUwJSwgMCwgMCkgc2NhbGVYKDAuNSk7XG4gICAgfVxuICAgIDEwMCUge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDEwMCUsIDAsIDApIHNjYWxlWCgwLjUpO1xuICAgIH1cbn1cbkAtd2Via2l0LWtleWZyYW1lcyBwcm9ncmVzc2Jhci1pbmZpbml0ZS1tdWx0aWNvbG9yIHtcbiAgICBmcm9tIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAlLCAwLCAwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoLTUwJSwgMCwgMCk7XG4gICAgfVxufVxuQGtleWZyYW1lcyBwcm9ncmVzc2Jhci1pbmZpbml0ZS1tdWx0aWNvbG9yIHtcbiAgICBmcm9tIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwJSwgMCwgMCk7XG4gICAgfVxuICAgIHRvIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgtNTAlLCAwLCAwKTtcbiAgICB9XG59IiwiLyogPT09IFN3aXBlciA9PT0gKi9cbi5zd2lwZXItY29udGFpbmVyIHtcbiAgICBtYXJnaW4tbGVmdDogYXV0bztcbiAgICBtYXJnaW4tcmlnaHQ6IGF1dG87XG4gICAgcG9zaXRpb246cmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6aGlkZGVuO1xuICAgIC8qIEZpeCBvZiBXZWJraXQgZmxpY2tlcmluZyAqL1xuICAgIHotaW5kZXg6MTtcbn1cbi5zd2lwZXItY29udGFpbmVyLW5vLWZsZXhib3gge1xuICAgIC5zd2lwZXItc2xpZGUge1xuICAgICAgICBmbG9hdDogbGVmdDtcbiAgICB9XG59XG4uc3dpcGVyLWNvbnRhaW5lci12ZXJ0aWNhbCA+IC5zd2lwZXItd3JhcHBlcntcbiAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgIC1tb3otYm94LW9yaWVudDogdmVydGljYWw7XG4gICAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG59XG4uc3dpcGVyLXdyYXBwZXIge1xuICAgIHBvc2l0aW9uOnJlbGF0aXZlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB6LWluZGV4OiAxO1xuICAgIGRpc3BsYXk6IC13ZWJraXQtYm94O1xuICAgIGRpc3BsYXk6IC1tb3otYm94O1xuICAgIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICAgIGRpc3BsYXk6IC13ZWJraXQtZmxleDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuXG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5Oi13ZWJraXQtdHJhbnNmb3JtO1xuICAgIC1tb3otdHJhbnNpdGlvbi1wcm9wZXJ0eTotbW96LXRyYW5zZm9ybTtcbiAgICAtby10cmFuc2l0aW9uLXByb3BlcnR5Oi1vLXRyYW5zZm9ybTtcbiAgICAtbXMtdHJhbnNpdGlvbi1wcm9wZXJ0eTotbXMtdHJhbnNmb3JtO1xuICAgIHRyYW5zaXRpb24tcHJvcGVydHk6dHJhbnNmb3JtO1xuICAgIFxuICAgIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7XG4gICAgLW1vei1ib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbiAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDtcbn1cbi5zd2lwZXItY29udGFpbmVyLWFuZHJvaWQgLnN3aXBlci1zbGlkZSwgLnN3aXBlci13cmFwcGVyIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwcHgsMCwwKTtcbiAgICAtbW96LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwcHgsMCwwKTtcbiAgICAtby10cmFuc2Zvcm06dHJhbnNsYXRlKDBweCwwcHgpO1xuICAgIC1tcy10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMHB4LDAsMCk7XG4gICAgdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDBweCwwLDApO1xufVxuLnN3aXBlci1jb250YWluZXItbXVsdGlyb3cgPiAuc3dpcGVyLXdyYXBwZXIge1xuICAgIC13ZWJraXQtYm94LWxpbmVzOiBtdWx0aXBsZTtcbiAgICAtbW96LWJveC1saW5lczogbXVsdGlwbGU7XG4gICAgLW1zLWZsZXgtd3JhcDogd3JhcDtcbiAgICAtd2Via2l0LWZsZXgtd3JhcDogd3JhcDtcbiAgICBmbGV4LXdyYXA6IHdyYXA7XG59XG4uc3dpcGVyLWNvbnRhaW5lci1mcmVlLW1vZGUgPiAuc3dpcGVyLXdyYXBwZXIge1xuICAgIC13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0O1xuICAgIC1tb3otdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0O1xuICAgIC1tcy10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1vdXQ7XG4gICAgLW8tdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0O1xuICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcbiAgICBtYXJnaW46IDAgYXV0bztcbn1cbi5zd2lwZXItc2xpZGUge1xuICAgIC13ZWJraXQtZmxleC1zaHJpbms6IDA7XG4gICAgLW1zLWZsZXg6IDAgMCBhdXRvO1xuICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4vKiBBdXRvIEhlaWdodCAqL1xuLnN3aXBlci1jb250YWluZXItYXV0b2hlaWdodCwgLnN3aXBlci1jb250YWluZXItYXV0b2hlaWdodCAuc3dpcGVyLXNsaWRlIHtcbiAgICBoZWlnaHQ6IGF1dG87XG59XG4uc3dpcGVyLWNvbnRhaW5lci1hdXRvaGVpZ2h0IC5zd2lwZXItd3JhcHBlciB7XG4gICAgLXdlYmtpdC1ib3gtYWxpZ246IHN0YXJ0O1xuICAgIC1tcy1mbGV4LWFsaWduOiBzdGFydDtcbiAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm0sIGhlaWdodDtcbiAgICAtbW96LXRyYW5zaXRpb24tcHJvcGVydHk6IC1tb3otdHJhbnNmb3JtO1xuICAgIC1vLXRyYW5zaXRpb24tcHJvcGVydHk6IC1vLXRyYW5zZm9ybTtcbiAgICAtbXMtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLW1zLXRyYW5zZm9ybTtcbiAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIGhlaWdodDtcbn1cbi8qIGExMXkgKi9cbi5zd2lwZXItY29udGFpbmVyIC5zd2lwZXItbm90aWZpY2F0aW9uIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgb3BhY2l0eTogMDtcbiAgICB6LWluZGV4OiAtMTAwMDtcbn1cblxuLyogSUUxMCBXaW5kb3dzIFBob25lIDggRml4ZXMgKi9cbi5zd2lwZXItd3A4LWhvcml6b250YWwge1xuICAgIC1tcy10b3VjaC1hY3Rpb246IHBhbi15O1xuICAgIHRvdWNoLWFjdGlvbjogcGFuLXk7XG59XG4uc3dpcGVyLXdwOC12ZXJ0aWNhbCB7XG4gICAgLW1zLXRvdWNoLWFjdGlvbjogcGFuLXg7XG4gICAgdG91Y2gtYWN0aW9uOiBwYW4teDtcbn1cbi8qIEFycm93cyAqL1xuLnN3aXBlci1idXR0b24tcHJldiwgLnN3aXBlci1idXR0b24tbmV4dCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogNTAlO1xuICAgIHdpZHRoOiAyN3B4O1xuICAgIGhlaWdodDogNDRweDtcbiAgICBtYXJnaW4tdG9wOiAtMjJweDtcbiAgICB6LWluZGV4OiAxMDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgLW1vei1iYWNrZ3JvdW5kLXNpemU6IDI3cHggNDRweDtcbiAgICAtd2Via2l0LWJhY2tncm91bmQtc2l6ZTogMjdweCA0NHB4O1xuICAgIGJhY2tncm91bmQtc2l6ZTogMjdweCA0NHB4O1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcbiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgICYuc3dpcGVyLWJ1dHRvbi1kaXNhYmxlZCB7XG4gICAgICAgIG9wYWNpdHk6IDAuMzU7XG4gICAgICAgIGN1cnNvcjogYXV0bztcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgfVxufVxuLnN3aXBlci1idXR0b24tcHJldiwgLnN3aXBlci1jb250YWluZXItcnRsIC5zd2lwZXItYnV0dG9uLW5leHQge1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCAyNyA0NCc+PHBhdGggZD0nTTAsMjJMMjIsMGwyLjEsMi4xTDQuMiwyMmwxOS45LDE5LjlMMjIsNDRMMCwyMkwwLDIyTDAsMjJ6JyBmaWxsPScjMDA3YWZmJy8+PC9zdmc+XCIpO1xuICAgIGxlZnQ6IDEwcHg7XG4gICAgcmlnaHQ6IGF1dG87XG59XG4uc3dpcGVyLWJ1dHRvbi1uZXh0LCAuc3dpcGVyLWNvbnRhaW5lci1ydGwgLnN3aXBlci1idXR0b24tcHJldiB7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoXCI8c3ZnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zycgdmlld0JveD0nMCAwIDI3IDQ0Jz48cGF0aCBkPSdNMjcsMjJMMjcsMjJMNSw0NGwtMi4xLTIuMUwyMi44LDIyTDIuOSwyLjFMNSwwTDI3LDIyTDI3LDIyeicgZmlsbD0nIzAwN2FmZicvPjwvc3ZnPlwiKTtcbiAgICByaWdodDogMTBweDtcbiAgICBsZWZ0OiBhdXRvO1xufVxuXG4vKiBQYWdpbmF0aW9uIFN0eWxlcyAqL1xuLnN3aXBlci1wYWdpbmF0aW9uIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIC13ZWJraXQtdHJhbnNpdGlvbjogMzAwbXM7XG4gICAgLW1vei10cmFuc2l0aW9uOiAzMDBtcztcbiAgICAtby10cmFuc2l0aW9uOiAzMDBtcztcbiAgICB0cmFuc2l0aW9uOiAzMDBtcztcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwwLDApO1xuICAgIC1tcy10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICAtby10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB6LWluZGV4OiAxMDtcbiAgICAmLnN3aXBlci1wYWdpbmF0aW9uLWhpZGRlbiB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgfVxufVxuLyogQ29tbW9uIFN0eWxlcyAqL1xuLnN3aXBlci1wYWdpbmF0aW9uLWZyYWN0aW9uLCAuc3dpcGVyLXBhZ2luYXRpb24tY3VzdG9tLCAuc3dpcGVyLWNvbnRhaW5lci1ob3Jpem9udGFsID4gLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldHN7XG4gICAgYm90dG9tOiAxMHB4O1xuICAgIGxlZnQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG59XG4vKiBCdWxsZXRzICovXG4uc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0IHtcbiAgICB3aWR0aDogOHB4O1xuICAgIGhlaWdodDogOHB4O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBib3JkZXItcmFkaXVzOiAxMDAlO1xuICAgIGJhY2tncm91bmQ6ICMwMDA7XG4gICAgb3BhY2l0eTogMC4yO1xuICAgIGJ1dHRvbiYge1xuICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAtbXMtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgIH1cbiAgICAuc3dpcGVyLXBhZ2luYXRpb24tY2xpY2thYmxlICYge1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgfVxufVxuLnN3aXBlci1wYWdpbmF0aW9uLWJ1bGxldC1hY3RpdmUge1xuICAgIG9wYWNpdHk6IDE7XG4gICAgYmFja2dyb3VuZDogIzAwN2FmZjtcbn1cbi5zd2lwZXItY29udGFpbmVyLXZlcnRpY2FsIHtcbiAgICA+IC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXRzIHtcbiAgICAgICAgcmlnaHQ6IDEwcHg7XG4gICAgICAgIHRvcDogNTAlO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTp0cmFuc2xhdGUzZCgwcHgsLTUwJSwwKTtcbiAgICAgICAgLW1vei10cmFuc2Zvcm06dHJhbnNsYXRlM2QoMHB4LC01MCUsMCk7XG4gICAgICAgIC1vLXRyYW5zZm9ybTp0cmFuc2xhdGUoMHB4LC01MCUpO1xuICAgICAgICAtbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDBweCwtNTAlLDApO1xuICAgICAgICB0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMHB4LC01MCUsMCk7XG4gICAgICAgIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQge1xuICAgICAgICAgICAgbWFyZ2luOiA1cHggMDtcbiAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB9XG4gICAgfVxufVxuLnN3aXBlci1jb250YWluZXItaG9yaXpvbnRhbCB7XG4gICAgPiAuc3dpcGVyLXBhZ2luYXRpb24tYnVsbGV0cyB7XG4gICAgICAgIC5zd2lwZXItcGFnaW5hdGlvbi1idWxsZXQge1xuICAgICAgICAgICAgbWFyZ2luOiAwIDVweDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qIFByb2dyZXNzICovXG4uc3dpcGVyLXBhZ2luYXRpb24tcHJvZ3Jlc3Mge1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC4yNSk7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIC5zd2lwZXItcGFnaW5hdGlvbi1wcm9ncmVzc2JhciB7XG4gICAgICAgIGJhY2tncm91bmQ6ICMwMDdhZmY7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCk7XG4gICAgICAgIC1tcy10cmFuc2Zvcm06IHNjYWxlKDApO1xuICAgICAgICAtby10cmFuc2Zvcm06IHNjYWxlKDApO1xuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgdG9wO1xuICAgICAgICAtbW96LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgdG9wO1xuICAgICAgICAtbXMtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7XG4gICAgICAgIC1vLXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgdG9wO1xuICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IHRvcDtcbiAgICB9XG4gICAgLnN3aXBlci1jb250YWluZXItcnRsICYgLnN3aXBlci1wYWdpbmF0aW9uLXByb2dyZXNzYmFyIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCB0b3A7XG4gICAgICAgIC1tb3otdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wO1xuICAgICAgICAtbXMtdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wO1xuICAgICAgICAtby10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCB0b3A7XG4gICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IHRvcDtcbiAgICB9XG4gICAgLnN3aXBlci1jb250YWluZXItaG9yaXpvbnRhbCA+ICYge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiA0cHg7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHRvcDogMDtcbiAgICB9XG4gICAgLnN3aXBlci1jb250YWluZXItdmVydGljYWwgPiAmIHtcbiAgICAgICAgd2lkdGg6IDRweDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICB0b3A6IDA7XG4gICAgfVxufVxuLyogM0QgQ29udGFpbmVyICovXG4uc3dpcGVyLWNvbnRhaW5lci0zZCB7XG4gICAgLXdlYmtpdC1wZXJzcGVjdGl2ZTogMTIwMHB4O1xuICAgIC1tb3otcGVyc3BlY3RpdmU6IDEyMDBweDtcbiAgICAtby1wZXJzcGVjdGl2ZTogMTIwMHB4O1xuICAgIHBlcnNwZWN0aXZlOiAxMjAwcHg7XG4gICAgLnN3aXBlci13cmFwcGVyLCAuc3dpcGVyLXNsaWRlLCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1sZWZ0LCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1yaWdodCwgLnN3aXBlci1zbGlkZS1zaGFkb3ctdG9wLCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1ib3R0b20sIC5zd2lwZXItY3ViZS1zaGFkb3cge1xuICAgICAgICAucHJlc2VydmUzZCgpO1xuICAgIH1cbiAgICAuc3dpcGVyLXNsaWRlLXNoYWRvdy1sZWZ0LCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1yaWdodCwgLnN3aXBlci1zbGlkZS1zaGFkb3ctdG9wLCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1ib3R0b20ge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIHotaW5kZXg6IDEwO1xuICAgIH1cbiAgICAuc3dpcGVyLXNsaWRlLXNoYWRvdy1sZWZ0IHsgXG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IHRvcCwgcmlnaHQgdG9wLCBmcm9tKHJnYmEoMCwwLDAsMC41KSksIHRvKHJnYmEoMCwwLDAsMCkpKTsgLyogU2FmYXJpIDQrLCBDaHJvbWUgKi9cbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQocmlnaHQsIHJnYmEoMCwwLDAsMC41KSwgcmdiYSgwLDAsMCwwKSk7IC8qIENocm9tZSAxMCssIFNhZmFyaSA1LjErLCBpT1MgNSsgKi9cbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogICAgLW1vei1saW5lYXItZ3JhZGllbnQocmlnaHQsIHJnYmEoMCwwLDAsMC41KSwgcmdiYSgwLDAsMCwwKSk7IC8qIEZpcmVmb3ggMy42LTE1ICovXG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6ICAgICAgLW8tbGluZWFyLWdyYWRpZW50KHJpZ2h0LCByZ2JhKDAsMCwwLDAuNSksIHJnYmEoMCwwLDAsMCkpOyAvKiBPcGVyYSAxMS4xMC0xMi4wMCAqL1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAgICAgICAgIGxpbmVhci1ncmFkaWVudCh0byBsZWZ0LCByZ2JhKDAsMCwwLDAuNSksIHJnYmEoMCwwLDAsMCkpOyAvKiBGaXJlZm94IDE2KywgSUUxMCwgT3BlcmEgMTIuNTArICovXG4gICAgfVxuICAgIC5zd2lwZXItc2xpZGUtc2hhZG93LXJpZ2h0IHsgICAgXG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCByaWdodCB0b3AsIGxlZnQgdG9wLCBmcm9tKHJnYmEoMCwwLDAsMC41KSksIHRvKHJnYmEoMCwwLDAsMCkpKTsgLyogU2FmYXJpIDQrLCBDaHJvbWUgKi9cbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1saW5lYXItZ3JhZGllbnQobGVmdCwgcmdiYSgwLDAsMCwwLjUpLCByZ2JhKDAsMCwwLDApKTsgLyogQ2hyb21lIDEwKywgU2FmYXJpIDUuMSssIGlPUyA1KyAqL1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAgICAtbW96LWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDAsMCwwLDAuNSksIHJnYmEoMCwwLDAsMCkpOyAvKiBGaXJlZm94IDMuNi0xNSAqL1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAgICAgIC1vLWxpbmVhci1ncmFkaWVudChsZWZ0LCByZ2JhKDAsMCwwLDAuNSksIHJnYmEoMCwwLDAsMCkpOyAvKiBPcGVyYSAxMS4xMC0xMi4wMCAqL1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAgICAgICAgIGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLDAsMCwwLjUpLCByZ2JhKDAsMCwwLDApKTsgLyogRmlyZWZveCAxNissIElFMTAsIE9wZXJhIDEyLjUwKyAqLyAgXG4gICAgfVxuICAgIC5zd2lwZXItc2xpZGUtc2hhZG93LXRvcCB7ICBcbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIGxlZnQgdG9wLCBsZWZ0IGJvdHRvbSwgZnJvbShyZ2JhKDAsMCwwLDAuNSkpLCB0byhyZ2JhKDAsMCwwLDApKSk7IC8qIFNhZmFyaSA0KywgQ2hyb21lICovXG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGJvdHRvbSwgcmdiYSgwLDAsMCwwLjUpLCByZ2JhKDAsMCwwLDApKTsgLyogQ2hyb21lIDEwKywgU2FmYXJpIDUuMSssIGlPUyA1KyAqL1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAgICAtbW96LWxpbmVhci1ncmFkaWVudChib3R0b20sIHJnYmEoMCwwLDAsMC41KSwgcmdiYSgwLDAsMCwwKSk7IC8qIEZpcmVmb3ggMy42LTE1ICovXG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6ICAgICAgLW8tbGluZWFyLWdyYWRpZW50KGJvdHRvbSwgcmdiYSgwLDAsMCwwLjUpLCByZ2JhKDAsMCwwLDApKTsgLyogT3BlcmEgMTEuMTAtMTIuMDAgKi9cbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogICAgICAgICBsaW5lYXItZ3JhZGllbnQodG8gdG9wLCByZ2JhKDAsMCwwLDAuNSksIHJnYmEoMCwwLDAsMCkpOyAvKiBGaXJlZm94IDE2KywgSUUxMCwgT3BlcmEgMTIuNTArICovXG4gICAgfVxuICAgIC5zd2lwZXItc2xpZGUtc2hhZG93LWJvdHRvbSB7ICAgXG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtZ3JhZGllbnQobGluZWFyLCBsZWZ0IGJvdHRvbSwgbGVmdCB0b3AsIGZyb20ocmdiYSgwLDAsMCwwLjUpKSwgdG8ocmdiYSgwLDAsMCwwKSkpOyAvKiBTYWZhcmkgNCssIENocm9tZSAqL1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LWxpbmVhci1ncmFkaWVudCh0b3AsIHJnYmEoMCwwLDAsMC41KSwgcmdiYSgwLDAsMCwwKSk7IC8qIENocm9tZSAxMCssIFNhZmFyaSA1LjErLCBpT1MgNSsgKi9cbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogICAgLW1vei1saW5lYXItZ3JhZGllbnQodG9wLCByZ2JhKDAsMCwwLDAuNSksIHJnYmEoMCwwLDAsMCkpOyAvKiBGaXJlZm94IDMuNi0xNSAqL1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAgICAgIC1vLWxpbmVhci1ncmFkaWVudCh0b3AsIHJnYmEoMCwwLDAsMC41KSwgcmdiYSgwLDAsMCwwKSk7IC8qIE9wZXJhIDExLjEwLTEyLjAwICovXG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6ICAgICAgICAgbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLDAsMCwwLjUpLCByZ2JhKDAsMCwwLDApKTsgLyogRmlyZWZveCAxNissIElFMTAsIE9wZXJhIDEyLjUwKyAqL1xuICAgIH1cbn1cbi8qIENvdmVyZmxvdyAqL1xuLnN3aXBlci1jb250YWluZXItY292ZXJmbG93LCAuc3dpcGVyLWNvbnRhaW5lci1mbGlwIHtcbiAgICAuc3dpcGVyLXdyYXBwZXIge1xuICAgICAgICAvKiBXaW5kb3dzIDggSUUgMTAgZml4ICovXG4gICAgICAgIC1tcy1wZXJzcGVjdGl2ZToxMjAwcHg7XG4gICAgfVxufVxuLyogQ3ViZSArIEZsaXAgKi9cbi5zd2lwZXItY29udGFpbmVyLWN1YmUsIC5zd2lwZXItY29udGFpbmVyLWZsaXAge1xuICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICAgIC5zd2lwZXItc2xpZGUge1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICAgIC1tb3otYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgICAtbXMtYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgICBiYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICAgIHotaW5kZXg6IDE7XG4gICAgICAgIC5zd2lwZXItc2xpZGUge1xuICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnN3aXBlci1zbGlkZS1hY3RpdmUge1xuICAgICAgICAmLCAmIC5zd2lwZXItc2xpZGUtYWN0aXZlIHtcbiAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgICAgICB9XG4gICAgfVxuICAgIC5zd2lwZXItc2xpZGUtc2hhZG93LXRvcCwgLnN3aXBlci1zbGlkZS1zaGFkb3ctYm90dG9tLCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1sZWZ0LCAuc3dpcGVyLXNsaWRlLXNoYWRvdy1yaWdodCB7XG4gICAgICAgIHotaW5kZXg6IDA7XG4gICAgICAgIC13ZWJraXQtYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgICAtbW96LWJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgICAgLW1zLWJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIH1cbn1cbi8qIEN1YmUgKi9cbi5zd2lwZXItY29udGFpbmVyLWN1YmUge1xuICAgIC5zd2lwZXItc2xpZGUge1xuICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogMCAwO1xuICAgICAgICAtbW96LXRyYW5zZm9ybS1vcmlnaW46IDAgMDtcbiAgICAgICAgLW1zLXRyYW5zZm9ybS1vcmlnaW46IDAgMDtcbiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogMCAwO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgIH1cbiAgICAmLnN3aXBlci1jb250YWluZXItcnRsIC5zd2lwZXItc2xpZGV7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogMTAwJSAwO1xuICAgICAgICAtbW96LXRyYW5zZm9ybS1vcmlnaW46IDEwMCUgMDtcbiAgICAgICAgLW1zLXRyYW5zZm9ybS1vcmlnaW46IDEwMCUgMDtcbiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogMTAwJSAwO1xuICAgIH1cbiAgICAuc3dpcGVyLXNsaWRlLWFjdGl2ZSwgLnN3aXBlci1zbGlkZS1uZXh0LCAuc3dpcGVyLXNsaWRlLXByZXYsIC5zd2lwZXItc2xpZGUtbmV4dCArIC5zd2lwZXItc2xpZGUge1xuICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICB9XG4gICAgLnN3aXBlci1jdWJlLXNoYWRvdyB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgYm90dG9tOiAwcHg7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIGJhY2tncm91bmQ6ICMwMDA7XG4gICAgICAgIG9wYWNpdHk6IDAuNjtcbiAgICAgICAgLXdlYmtpdC1maWx0ZXI6IGJsdXIoNTBweCk7XG4gICAgICAgIGZpbHRlcjogYmx1cig1MHB4KTtcbiAgICAgICAgei1pbmRleDogMDtcbiAgICB9XG59XG4vKiBGYWRlICovXG4uc3dpcGVyLWNvbnRhaW5lci1mYWRlIHtcbiAgICAmLnN3aXBlci1jb250YWluZXItZnJlZS1tb2RlIHtcbiAgICAgICAgLnN3aXBlci1zbGlkZSB7XG4gICAgICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcbiAgICAgICAgICAgIC1tb3otdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0O1xuICAgICAgICAgICAgLW1zLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcbiAgICAgICAgICAgIC1vLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcbiAgICAgICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAuc3dpcGVyLXNsaWRlIHtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eTtcbiAgICAgICAgLW1vei10cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5O1xuICAgICAgICAtby10cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5O1xuICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiBvcGFjaXR5O1xuICAgICAgICAuc3dpcGVyLXNsaWRlIHtcbiAgICAgICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgICAgICB9XG4gICAgfVxuICAgIC5zd2lwZXItc2xpZGUtYWN0aXZlIHtcbiAgICAgICAgJiwgJiAuc3dpcGVyLXNsaWRlLWFjdGl2ZSB7XG4gICAgICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bztcbiAgICAgICAgfVxuICAgIH1cbn1cbi5zd2lwZXItem9vbS1jb250YWluZXIge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcblxuICAgIGRpc3BsYXk6IC13ZWJraXQtYm94O1xuICAgIGRpc3BsYXk6IC1tb3otYm94O1xuICAgIGRpc3BsYXk6IC1tcy1mbGV4Ym94O1xuICAgIGRpc3BsYXk6IC13ZWJraXQtZmxleDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuXG4gICAgLXdlYmtpdC1ib3gtcGFjazogY2VudGVyO1xuICAgIC1tb3otYm94LXBhY2s6IGNlbnRlcjtcbiAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7XG4gICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcblxuICAgIC13ZWJraXQtYm94LWFsaWduOiBjZW50ZXI7XG4gICAgLW1vei1ib3gtYWxpZ246IGNlbnRlcjtcbiAgICAtbXMtZmxleC1hbGlnbjogY2VudGVyO1xuICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuXG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgID4gaW1nLCA+IHN2ZywgPiBjYW52YXMge1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgICAgIG1heC1oZWlnaHQ6IDEwMCU7XG4gICAgICAgIG9iamVjdC1maXQ6IGNvbnRhaW47XG4gICAgfVxufVxuLyogU2Nyb2xsYmFyICovXG4uc3dpcGVyLXNjcm9sbGJhciB7XG4gICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgLW1zLXRvdWNoLWFjdGlvbjogbm9uZTtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuMSk7XG4gICAgLnN3aXBlci1jb250YWluZXItaG9yaXpvbnRhbCA+ICYge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDElO1xuICAgICAgICBib3R0b206IDNweDtcbiAgICAgICAgei1pbmRleDogNTA7XG4gICAgICAgIGhlaWdodDogNXB4O1xuICAgICAgICB3aWR0aDogOTglO1xuICAgIH1cbiAgICAuc3dpcGVyLWNvbnRhaW5lci12ZXJ0aWNhbCA+ICYge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHJpZ2h0OiAzcHg7XG4gICAgICAgIHRvcDogMSU7XG4gICAgICAgIHotaW5kZXg6IDUwO1xuICAgICAgICB3aWR0aDogNXB4O1xuICAgICAgICBoZWlnaHQ6IDk4JTtcbiAgICB9XG59XG4uc3dpcGVyLXNjcm9sbGJhci1kcmFnIHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGJhY2tncm91bmQ6IHJnYmEoMCwwLDAsMC41KTtcbiAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgIGxlZnQ6IDA7XG4gICAgdG9wOiAwO1xufVxuLnN3aXBlci1zY3JvbGxiYXItY3Vyc29yLWRyYWcge1xuICAgIGN1cnNvcjogbW92ZTtcbn1cbi8qIFByZWxvYWRlciAqL1xuLnN3aXBlci1zbGlkZSAucHJlbG9hZGVyIHtcbiAgICB3aWR0aDogNDJweDtcbiAgICBoZWlnaHQ6IDQycHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDUwJTtcbiAgICB0b3A6IDUwJTtcbiAgICBtYXJnaW4tbGVmdDogLTIxcHg7XG4gICAgbWFyZ2luLXRvcDogLTIxcHg7XG4gICAgei1pbmRleDogMTA7XG59IiwiLyogPT09IENvbHVtbnMgUGlja2VyID09PSAqL1xuLnBpY2tlci1jb2x1bW5zIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDI2MHB4O1xuICAgIHotaW5kZXg6IDExNTAwO1xuICAgICYucGlja2VyLW1vZGFsLWlubGluZSwgLnBvcG92ZXIgJiB7XG4gICAgICAgIGhlaWdodDogMjAwcHg7XG4gICAgfVxuICAgIEBtZWRpYSAob3JpZW50YXRpb246IGxhbmRzY2FwZSkgYW5kIChtYXgtaGVpZ2h0OiA0MTVweCkge1xuICAgICAgICAmOm5vdCgucGlja2VyLW1vZGFsLWlubGluZSkge1xuICAgICAgICAgICAgaGVpZ2h0OiAyMDBweDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi5wb3BvdmVyLnBvcG92ZXItcGlja2VyLWNvbHVtbnMge1xuICAgIHdpZHRoOiAyODBweDtcbn1cbi5waWNrZXItaXRlbXMge1xuICAgIC5mbGV4Ym94KCk7XG4gICAgLmp1c3RpZnktY29udGVudChjZW50ZXIpO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgZm9udC1zaXplOiAyNHB4O1xuICAgIC13ZWJraXQtbWFzay1ib3gtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGJvdHRvbSwgdHJhbnNwYXJlbnQsIHRyYW5zcGFyZW50IDUlLCB3aGl0ZSAyMCUsIHdoaXRlIDgwJSwgdHJhbnNwYXJlbnQgOTUlLCB0cmFuc3BhcmVudCk7XG4gICAgLXdlYmtpdC1tYXNrLWJveC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHRvcCwgdHJhbnNwYXJlbnQsIHRyYW5zcGFyZW50IDUlLCB3aGl0ZSAyMCUsIHdoaXRlIDgwJSwgdHJhbnNwYXJlbnQgOTUlLCB0cmFuc3BhcmVudCk7XG59XG4ucGlja2VyLWl0ZW1zLWNvbCB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWF4LWhlaWdodDogMTAwJTtcblxuICAgICYucGlja2VyLWl0ZW1zLWNvbC1sZWZ0IHtcbiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICB9XG4gICAgJi5waWNrZXItaXRlbXMtY29sLWNlbnRlciB7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICB9XG4gICAgJi5waWNrZXItaXRlbXMtY29sLXJpZ2h0IHtcbiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgfVxuICAgICYucGlja2VyLWl0ZW1zLWNvbC1kaXZpZGVyIHtcbiAgICAgICAgY29sb3I6IzAwMDtcbiAgICAgICAgLmZsZXhib3goKTtcbiAgICAgICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgfVxufVxuLnBpY2tlci1pdGVtcy1jb2wtd3JhcHBlciB7XG4gICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgIFxuICAgIC13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0O1xuICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcbn1cbi5waWNrZXItaXRlbSB7XG4gICAgaGVpZ2h0OiAzNnB4O1xuICAgIGxpbmUtaGVpZ2h0OiAzNnB4O1xuICAgIHBhZGRpbmc6IDAgMTBweDtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIGNvbG9yOiM3MDcyNzQ7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgLnBpY2tlci1pdGVtcy1jb2wtYWJzb2x1dGUgJntcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgICAmLnBpY2tlci1pdGVtLWZhciB7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIH1cbiAgICAmLnBpY2tlci1zZWxlY3RlZCB7XG4gICAgICAgIGNvbG9yOiAjMDAwO1xuICAgICAgICAudHJhbnNmb3JtKHRyYW5zbGF0ZTNkKDAsMCwwKSByb3RhdGVYKDBkZWcpKTtcbiAgICB9XG59XG4ucGlja2VyLWNlbnRlci1oaWdobGlnaHQge1xuICAgIGhlaWdodDogMzZweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHRvcDogNTAlO1xuICAgIG1hcmdpbi10b3A6IC0xOHB4O1xuICAgIC5oYWlybGluZSh0b3AsICNhOGFiYjApO1xuICAgIC5oYWlybGluZShib3R0b20sICNhOGFiYjApO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuLy8gM0QgUGlja2VyXG4ucGlja2VyLTNkIHtcbiAgICAucGlja2VyLWl0ZW1zIHtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgLXdlYmtpdC1wZXJzcGVjdGl2ZTogMTIwMHB4O1xuICAgICAgICBwZXJzcGVjdGl2ZTogMTIwMHB4O1xuICAgIH1cbiAgICAucGlja2VyLWl0ZW1zLWNvbCwgLnBpY2tlci1pdGVtcy1jb2wtd3JhcHBlciwgLnBpY2tlci1pdGVtIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tc3R5bGU6IHByZXNlcnZlLTNkO1xuICAgICAgICB0cmFuc2Zvcm0tc3R5bGU6IHByZXNlcnZlLTNkO1xuICAgIH1cbiAgICAucGlja2VyLWl0ZW1zLWNvbCB7XG4gICAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICAgIH1cbiAgICAucGlja2VyLWl0ZW0ge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXIgLTExMHB4O1xuICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyIC0xMTBweDtcbiAgICAgICAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICAgIGJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1vdXQ7XG4gICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcbiAgICB9XG59IiwiLyogPT09IE5vdGlmaWNhdGlvbnMgPT09ICovXG5Abm90aWZpY2F0aW9uc0R1cmF0aW9uOiA0NTBtcztcbi5ub3RpZmljYXRpb25zIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgei1pbmRleDogMjAwMDA7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIG1hcmdpbjogMDtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIG1heC1oZWlnaHQ6IDEwMCU7XG4gICAgLnRyYW5zaXRpb24oQG5vdGlmaWNhdGlvbnNEdXJhdGlvbik7XG4gICAgLXdlYmtpdC1wZXJzcGVjdGl2ZTogMTIwMHB4O1xuICAgIHBlcnNwZWN0aXZlOiAxMjAwcHg7XG4gICAgcGFkZGluZy10b3A6IDhweDtcbiAgICBwYWRkaW5nLWJvdHRvbTogOHB4O1xuICAgICYubGlzdC1ibG9jayA+IHVsIHtcbiAgICAgICAgLmhhaXJsaW5lLXJlbW92ZSh0b3ApO1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICAgIG1hcmdpbjogMCBhdXRvO1xuICAgICAgICBtYXgtd2lkdGg6IDU2OHB4ICsgMTZweDtcbiAgICB9XG4gICAgLndpdGgtc3RhdHVzYmFyLW92ZXJsYXkgJiB7XG4gICAgICAgIHBhZGRpbmctdG9wOiAyMHB4O1xuICAgICAgICAudHJhbnNsYXRlM2QoMCwgLTIwcHgsIDApO1xuICAgIH1cbiAgICAuaXRlbS1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZy1sZWZ0OiA4cHg7XG4gICAgICAgIC5hbGlnbi1pdGVtcyhmbGV4LXN0YXJ0KTtcbiAgICB9XG4gICAgLml0ZW0tdGl0bGUtcm93IHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICAgICAgICAmOmJlZm9yZSB7XG4gICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICBsZWZ0OiAwO1xuICAgICAgICAgICAgdG9wOiAwO1xuICAgICAgICAgICAgaGVpZ2h0OiAzNnB4O1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweCAxMnB4IDAgMDtcbiAgICAgICAgICAgIHotaW5kZXg6IC0xO1xuICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICAgICAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLml0ZW0tdGl0bGUge1xuICAgICAgICBmb250LXdlaWdodDogNDAwICFpbXBvcnRhbnQ7XG4gICAgICAgIGhlaWdodDogMzZweDtcbiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDM1cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMTNweDtcbiAgICAgICAgaHRtbC5pb3MtZ3QtOCAmIHtcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA0MDAgIWltcG9ydGFudDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAuaXRlbS1zdWJ0aXRsZSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTVweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICAgICAgaHRtbC5pb3MtZ3QtOCAmIHtcbiAgICAgICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLml0ZW0tdGV4dCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgY29sb3I6IGluaGVyaXQ7XG4gICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7XG4gICAgfVxuICAgIC5pdGVtLXN1YnRpdGxlLCAuaXRlbS10ZXh0IHtcbiAgICAgICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLml0ZW0tY29udGVudCwgLml0ZW0taW5uZXIge1xuICAgICAgICBtaW4taGVpZ2h0OiAwO1xuICAgIH1cbiAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgIHBvc2l0aW9uOiBzdGF0aWM7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICB9XG4gICAgLml0ZW0tbWVkaWEge1xuICAgICAgICB3aWR0aDogMjBweDtcbiAgICAgICAgaW1nIHtcbiAgICAgICAgICAgIG1heC13aWR0aDogMjBweDtcbiAgICAgICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7XG4gICAgICAgIH1cbiAgICAgICAgaS5pY29uIHtcbiAgICAgICAgICAgIHdpZHRoOiAyMHB4O1xuICAgICAgICAgICAgaGVpZ2h0OiAyMHB4O1xuICAgICAgICAgICAgLXdlYmtpdC1iYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjtcbiAgICAgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcbiAgICAgICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgICAgIH1cbiAgICAgICAgKyAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgICBtYXJnaW4tbGVmdDogOHB4O1xuICAgICAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGkubm90aWZpY2F0aW9uLWl0ZW0ge1xuICAgICAgICBib3gtc2hhZG93OiAwcHggMHB4IDEwcHggcmdiYSgwLDAsMCwwLjE1KTtcbiAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgcGFkZGluZy10b3A6IDA7XG4gICAgICAgIH1cbiAgICAgICAgLml0ZW0tbWVkaWEge1xuICAgICAgICAgICAgcGFkZGluZy10b3A6IDhweDtcbiAgICAgICAgfVxuXG4gICAgfVxuICAgIC5pdGVtLWFmdGVyIHtcbiAgICAgICAgbWFyZ2luLXRvcDogYXV0bztcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogYXV0bztcbiAgICB9XG4gICAgLmNsb3NlLW5vdGlmaWNhdGlvbiB7XG4gICAgICAgIHdpZHRoOiAyMnB4O1xuICAgICAgICBoZWlnaHQ6IDIycHg7XG4gICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB2aWV3Qm94PScwIDAgNDQgNDQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PGcgc3Ryb2tlPSdub25lJyBzdHJva2Utd2lkdGg9JzEnIGZpbGw9J25vbmUnIGZpbGwtcnVsZT0nZXZlbm9kZCc+PHBhdGggZD0nTTIyLjUsMjAuMzc4Njc5NyBMMTQuNzIxODI1NCwxMi42MDA1MDUxIEwxMi42MDA1MDUxLDE0LjcyMTgyNTQgTDIwLjM3ODY3OTcsMjIuNSBMMTIuNjAwNTA1MSwzMC4yNzgxNzQ2IEwxNC43MjE4MjU0LDMyLjM5OTQ5NDkgTDIyLjUsMjQuNjIxMzIwMyBMMzAuMjc4MTc0NiwzMi4zOTk0OTQ5IEwzMi4zOTk0OTQ5LDMwLjI3ODE3NDYgTDI0LjYyMTMyMDMsMjIuNSBMMzIuMzk5NDk0OSwxNC43MjE4MjU0IEwzMC4yNzgxNzQ2LDEyLjYwMDUwNTEgTDIyLjUsMjAuMzc4Njc5NyBaIE0yMiw0NCBDMzQuMTUwMjY0NSw0NCA0NCwzNC4xNTAyNjQ1IDQ0LDIyIEM0NCw5Ljg0OTczNTUgMzQuMTUwMjY0NSwwIDIyLDAgQzkuODQ5NzM1NSwwIDAsOS44NDk3MzU1IDAsMjIgQzAsMzQuMTUwMjY0NSA5Ljg0OTczNTUsNDQgMjIsNDQgWicgZmlsbD0nIzAwMDAwMCc+PC9wYXRoPjwvZz48L3N2Zz5cIik7XG4gICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciB0b3A7XG4gICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgICAgIC13ZWJraXQtYmFja2dyb3VuZC1zaXplOiAxMDAlIGF1dG87XG4gICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSBhdXRvO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG9wYWNpdHk6IDAuMjtcbiAgICAgICAgc3BhbiB7XG4gICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICB3aWR0aDogNDRweDtcbiAgICAgICAgICAgIGhlaWdodDogNDRweDtcbiAgICAgICAgICAgIGxlZnQ6IDUwJTtcbiAgICAgICAgICAgIHRvcDogNTAlO1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IC0yMnB4O1xuICAgICAgICAgICAgbWFyZ2luLXRvcDogLTIycHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLm5vdGlmaWNhdGlvbi1pdGVtIHtcbiAgICAgICAgbWF4LXdpZHRoOiA1NjhweDtcbiAgICAgICAgbWFyZ2luOiAwIGF1dG8gOHB4O1xuICAgICAgICAudHJhbnNpdGlvbihAbm90aWZpY2F0aW9uc0R1cmF0aW9uKTtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTAsMjUwLDI1MCwwLjk1KTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgICAgICAgd2lkdGg6IH5cIi13ZWJraXQtY2FsYygxMDAlIC0gMTZweClcIjtcbiAgICAgICAgd2lkdGg6IH5cIi1tb3otY2FsYygxMDAlIC0gMTZweClcIjtcbiAgICAgICAgd2lkdGg6IH5cImNhbGMoMTAwJSAtIDE2cHgpXCI7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgbGVmdDogOHB4O1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIC5ub3RpZmljYXRpb24taGlkZGVuIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG59IiwiLyogPT09IERpc2FibGVkIGVsZW1lbnRzID09PSAqL1xuLmRpc2FibGVkLCBbZGlzYWJsZWRdIHtcbiAgICBvcGFjaXR5OiAwLjU1O1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIC5kaXNhYmxlZCAmLCBbZGlzYWJsZWRdICYge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbn0iLCJAaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL19taXhpbnMubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9fY29sb3JzLXZhcnMubGVzcycpO1xuXG4vLyBDb2xvcnNcbkB0aGVtZUNvbG9yOiAjREY2NzM3OyAvLyAoMjIzLDEwMyw1NSlcblxuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9pbnRyby5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL2dyaWQubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy92aWV3cy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL3BhZ2VzLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvdG9vbGJhcnMubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy90b29sYmFycy1wYWdlcy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL3NlYXJjaGJhci5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL21lc3NhZ2ViYXIubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9pY29ucy5sZXNzJyk7XG4vL0BpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvYmFkZ2VzLmxlc3MnKTtcbi8vQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9jaGlwcy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL2NvbnRlbnQtYmxvY2subGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9saXN0cy5sZXNzJyk7XG4vL0BpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvY29udGFjdHMubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9mb3Jtcy5sZXNzJyk7XG4vL0BpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvZmxvYXRpbmctYnV0dG9uLmxlc3MnKTtcbi8vQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9hY2NvcmRpb24ubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9jYXJkcy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL21vZGFscy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL3BhbmVscy5sZXNzJyk7XG4vL0BpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvbGF6eS1sb2FkLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvdGFicy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL21lc3NhZ2VzLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3Mvc3RhdHVzYmFyLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvcHJlbG9hZGVyLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvcHJvZ3Jlc3NiYXIubGVzcycpO1xuLy9AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL3B1bGwtdG8tcmVmcmVzaC5sZXNzJyk7XG4vL0BpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvaW5maW5pdGUtc2Nyb2xsLmxlc3MnKTtcbi8vQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9hdXRvY29tcGxldGUubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9zd2lwZXIubGVzcycpO1xuLy9AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL3Bob3RvLWJyb3dzZXIubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL2lvcy9waWNrZXIubGVzcycpO1xuLy9AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvaW9zL2NhbGVuZGFyLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3Mvbm90aWZpY2F0aW9ucy5sZXNzJyk7XG4vL0BpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvbG9naW4tc2NyZWVuLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9pb3MvZGlzYWJsZWQubGVzcycpO1xuXG4vLyBEaXNhYmxlIHRleHQgc2VsZWN0XG4qIHtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbmlucHV0LCB0ZXh0YXJlYSB7XG4gIC13ZWJraXQtdG91Y2gtY2FsbG91dDpkZWZhdWx0O1xuICAtd2Via2l0LXVzZXItc2VsZWN0OnRleHQ7XG4gIHVzZXItc2VsZWN0OnRleHQ7XG59XG5cbi8vIE1haW4gVG9vbGJhclxuI2VkaXRvci1uYXZiYXIubmF2YmFyIC5yaWdodCBhICsgYSxcbiNlZGl0b3ItbmF2YmFyLm5hdmJhciAubGVmdCBhICsgYSB7XG4gIG1hcmdpbi1sZWZ0OiAwO1xuXG4gIGh0bWw6bm90KC5waG9uZSkgJiB7XG4gICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gIH1cbn1cblxuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvX21peGlucy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9pb3MvX2NvbnRhaW5lci5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9pb3MvX2RhdGF2aWV3Lmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi9jb21tb24vbW9iaWxlL3Jlc291cmNlcy9sZXNzL2lvcy9fbGlzdHZpZXcubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvaW9zL19idXR0b24ubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvaW9zL19jb250ZXh0bWVudS5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9pb3MvX2NvbG9yLXBhbGV0dGUubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvaW9zL19hYm91dC5sZXNzJyk7XG5cbkBpbXBvcnQgdXJsKCdpb3MvX3NlYXJjaC5sZXNzJyk7XG5AaW1wb3J0IHVybCgnaW9zL19pY29ucy5sZXNzJyk7XG5cbi8vIFRvcCBvZmZzZXRcblxuI2VkaXRvcl9zZGsge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IDA7XG4gIHJpZ2h0OiAwO1xuICB0b3A6IEB0b29sYmFyU2l6ZTtcbiAgYm90dG9tOiAwO1xuICBoZWlnaHQ6IGF1dG87XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIC50cmFuc2l0aW9uKDMwMG1zKTtcbn1cblxuLy8gQWRkIENvbnRhaW5lclxuXG4jYWRkLXRhYmxlLFxuI2FkZC1zaGFwZSB7XG4gIC5wYWdlIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmO1xuICB9XG59XG5cbi8vIFRhYmxlIHN0eWxlc1xuXG4udGFibGUtc3R5bGVzIHtcbiAgLnJvdyB7XG4gICAgJiwgbGkge1xuICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDtcbiAgICB9XG4gIH1cblxuICBsaSB7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDFweDtcblxuICAgIGltZyB7XG4gICAgICB3aWR0aDogNzBweDtcbiAgICAgIGhlaWdodDogNTBweDtcbiAgICB9XG4gIH1cbn1cblxuLy8gU2hhcGVzXG5cbi5zaGFwZXMge1xuICBsaSB7XG4gICAgd2lkdGg6IDcwcHg7XG4gICAgaGVpZ2h0OiA3MHB4O1xuICAgIG1hcmdpbjogMCAxcHg7XG5cbiAgICAudGh1bWIge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAdGhlbWVDb2xvcjtcbiAgICB9XG4gIH1cbn1cblxuLy8gQnVsbGV0cyBhbmQgbnVtYmVyc1xuXG4uYnVsbGV0cyxcbi5udW1iZXJzIHtcbiAgdWwge1xuICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gIH1cblxuICBsaSB7XG4gICAgd2lkdGg6IDcwcHg7XG4gICAgaGVpZ2h0OiA3MHB4O1xuICAgIG1hcmdpbi1yaWdodDogMXB4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjNGM0YzQ7XG4gICAgaHRtbC5waXhlbC1yYXRpby0yICYge1xuICAgICAgYm9yZGVyOiAwLjVweCBzb2xpZCAjYzRjNGM0O1xuICAgIH1cbiAgICBodG1sLnBpeGVsLXJhdGlvLTMgJiB7XG4gICAgICBib3JkZXI6IDAuMzNweCBzb2xpZCAjYzRjNGM0O1xuICAgIH1cblxuICAgICYuYWN0aXZlIHtcbiAgICAgIC8vXG4gICAgfVxuXG4gICAgLnRodW1iIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHdoaXRlO1xuICAgICAgYmFja2dyb3VuZC1zaXplOiBjb3ZlcjtcblxuICAgICAgbGFiZWwge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMzQlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vLyBTbGlkZSBsYXlvdXRcblxuLnNsaWRlLWxheW91dCB7XG4gIC5yb3cge1xuICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDtcbiAgfVxuXG4gIGxpIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMXB4O1xuXG4gICAgaW1nIHtcbiAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDAsMCwwLDAuMTUpO1xuICAgIH1cbiAgfVxufVxuXG4vLyBTbGlkZSB0aGVtZVxuXG4uc2xpZGUtdGhlbWUge1xuICAucm93IHtcbiAgICBtYXJnaW4tdG9wOiAxNHB4O1xuICAgIG1hcmdpbi1ib3R0b206IDEycHg7XG5cbiAgICBkaXYge1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgcGFkZGluZzogM3B4O1xuICAgICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwwLDAsMC4xNSk7XG4gICAgICB3aWR0aDogODVweDtcbiAgICAgIGhlaWdodDogMzhweDtcbiAgICB9XG4gIH1cbn1cblxuLy8gQ2hhcnRzXG5cbi5jaGFydC10eXBlcyB7XG4gIGxpIHtcbiAgICB3aWR0aDogNjBweDtcbiAgICBoZWlnaHQ6IDYwcHg7XG4gICAgbWFyZ2luOiA2cHg7XG5cbiAgICAudGh1bWIge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XG4gICAgfVxuICB9XG59XG5cbi8vIFdvcmthcm91bmQgaW9zIDEwLjNcblxuLnJhbmdlLXNsaWRlciBpbnB1dFt0eXBlPXJhbmdlXTo6LXdlYmtpdC1zbGlkZXItdGh1bWIge1xuICBoZWlnaHQ6IDI4cHg7XG4gIHdpZHRoOiAyOHB4O1xuICBib3JkZXItcmFkaXVzOiAyOHB4O1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuICBib3gtc2hhZG93OiAwIDJweCA0cHggcmdiYSgwLDAsMCwwLjQpO1xuICB6LWluZGV4OiAxMDtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xufSIsIi8vIENvbnRhaW5lclxuLnBob25lLmlvcyB7XG4gIC5jb250YWluZXItZWRpdCB7XG4gICAgLm5hdmJhciB7XG4gICAgICAuaGFpcmxpbmUodG9wLCBAdG9vbGJhckJvcmRlckNvbG9yKTtcbiAgICB9XG5cbiAgICAucGFnZS1jb250ZW50IHtcbiAgICAgIC5saXN0LWJsb2NrOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLXRvcDogLTFweDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLmNvbnRhaW5lci1lZGl0LFxuLmNvbnRhaW5lci1hZGQsXG4uY29udGFpbmVyLXNldHRpbmdzIHtcbiAgJi5wb3BvdmVyIHtcbiAgICB3aWR0aDogMzYwcHg7XG4gIH1cbn1cblxuLnNldHRpbmdzIHtcbiAgJi5wb3B1cCxcbiAgJi5wb3BvdmVyIHtcbiAgICAubGlzdC1ibG9jayB7XG5cbiAgICAgIHVsIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAhaW1wb3J0YW50O1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuXG4gICAgICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgLmhhaXJsaW5lKGJvdHRvbSwgQGxpc3RCbG9ja0JvcmRlckNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICAgIH1cblxuICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMzBweDtcbiAgICAgIH1cblxuICAgICAgbGk6Zmlyc3QtY2hpbGQgYSxcbiAgICAgIGxpOmxhc3QtY2hpbGQgYSB7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDAgIWltcG9ydGFudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLFxuICAgIC5wb3BvdmVyLWlubmVyIHtcbiAgICAgID4gLmNvbnRlbnQtYmxvY2sge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIGNvbG9yOiAjMDAwO1xuICAgICAgfVxuICAgIH1cblxuICAgIC5wb3BvdmVyLXZpZXcge1xuICAgICAgYm9yZGVyLXJhZGl1czogMTNweDtcblxuICAgICAgPiAucGFnZXMge1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxM3B4O1xuICAgICAgfVxuICAgIH1cblxuICAgIC5jb250ZW50LWJsb2NrOmZpcnN0LWNoaWxkIHtcbiAgICAgIG1hcmdpbi10b3A6IDA7XG4gICAgICAuY29udGVudC1ibG9jay1pbm5lciB7XG4gICAgICAgICY6YmVmb3JlIHtcbiAgICAgICAgICBoZWlnaHQ6IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAuY2F0ZWdvcmllcyB7XG4gICAgd2lkdGg6IDEwMCU7XG5cbiAgICA+IC5idXR0b25zLXJvdyB7XG4gICAgICB3aWR0aDogMTAwJTtcblxuICAgICAgLmJ1dHRvbiB7XG4gICAgICAgIHBhZGRpbmc6IDAgMXB4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5wb3BvdmVyLWlubmVyIHtcbiAgICBoZWlnaHQ6IDQwMHB4O1xuICB9XG59IiwiLy8gRGF0YSB2aWV3XG5cbi5kYXRhdmlldyB7XG4gICYucGFnZS1jb250ZW50IHtcbiAgICBiYWNrZ3JvdW5kOiBAd2hpdGU7XG4gIH1cblxuICAucm93IHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDtcbiAgfVxuXG4gIHVsIHtcbiAgICBwYWRkaW5nOiAwIDEwcHg7XG4gICAgbGlzdC1zdHlsZTogbm9uZTtcblxuICAgIGxpIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB9XG4gIH1cblxuICAuYWN0aXZlIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgei1pbmRleDogMTtcblxuICAgICY6OmFmdGVyIHtcbiAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgd2lkdGg6IDIycHg7XG4gICAgICBoZWlnaHQ6IDIycHg7XG4gICAgICByaWdodDogLTVweDtcbiAgICAgIGJvdHRvbTogLTVweDtcbiAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PGNpcmNsZSBmaWxsPVwiI2ZmZlwiIGN4PVwiMTFcIiBjeT1cIjExXCIgcj1cIjExXCIvPjxwYXRoIGQ9XCJNMTEsMjFBMTAsMTAsMCwxLDEsMjEsMTEsMTAsMTAsMCwwLDEsMTEsMjFoMFpNMTcuNCw3LjMyTDE3LjA2LDdhMC40OCwwLjQ4LDAsMCwwLS42NywwbC03LDYuODRMNi45NSwxMS4yNGEwLjUxLDAuNTEsMCwwLDAtLjU5LjA4TDYsMTEuNjZhMC41OCwwLjU4LDAsMCwwLDAsLjY1bDMuMTksMy4zNWEwLjM4LDAuMzgsMCwwLDAsLjM5LDBMMTcuNCw4YTAuNDgsMC40OCwwLDAsMCwwLS42N2gwWlwiLz48L2c+PC9zdmc+Jyk7XG4gICAgfVxuICB9XG59IiwiLy8gTGlzdCBleHRlbmRcblxuLml0ZW0tY29udGVudCB7XG4gIC5pdGVtLWFmdGVyIHtcbiAgICAmLnNwbGl0dGVyIHtcbiAgICAgIGNvbG9yOiAjMDAwO1xuXG4gICAgICBsYWJlbCB7XG4gICAgICAgIG1hcmdpbjogMCA1cHg7XG4gICAgICB9XG5cbiAgICAgIC5idXR0b25zLXJvdyB7XG4gICAgICAgIG1pbi13aWR0aDogOTBweDtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJi52YWx1ZSB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIG1pbi13aWR0aDogNjBweDtcbiAgICAgIGNvbG9yOiBAYmxhY2s7XG4gICAgICBtYXJnaW4tbGVmdDogMTBweDtcbiAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIH1cblxuICAgIGlucHV0LmZpZWxkIHtcbiAgICAgIGNvbG9yOiBAdGhlbWVDb2xvcjtcblxuICAgICAgJi5wbGFjZWhvbGRlci1jb2xvcjo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XG4gICAgICAgIGNvbG9yOiBAdGhlbWVDb2xvcjtcbiAgICAgIH1cblxuICAgICAgJi5yaWdodCB7XG4gICAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICYuYnV0dG9ucyB7XG4gICAgLml0ZW0taW5uZXIge1xuICAgICAgcGFkZGluZy10b3A6IDA7XG4gICAgICBwYWRkaW5nLWJvdHRvbTogMDtcbiAgICAgIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xuXG4gICAgICA+IC5yb3cge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG5cbiAgICAgICAgLmJ1dHRvbiB7XG4gICAgICAgICAgZmxleDogMTtcbiAgICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgICAgaGVpZ2h0OiBpbmhlcml0O1xuICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xuICAgICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5pdGVtLWFmdGVyIC5jb2xvci1wcmV2aWV3IHtcbiAgICB3aWR0aDogNzVweDtcbiAgICBoZWlnaHQ6IDMwcHg7XG4gICAgbWFyZ2luLXRvcDogLTNweDtcbiAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgwLDAsMCwwLjE1KSBpbnNldDtcbiAgfVxuXG4gIGkgLmNvbG9yLXByZXZpZXcge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogOHB4O1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW4tdG9wOiAyMXB4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwwLDAsMC4xNSkgaW5zZXQ7XG4gIH1cbn1cblxuLml0ZW0tbGluayB7XG4gICYubm8taW5kaWNhdG9yIHtcbiAgICAuaXRlbS1pbm5lciB7XG4gICAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICAgICAgcGFkZGluZy1yaWdodDogMTVweDtcbiAgICB9XG4gIH1cbn1cblxuLmxpc3QtYmxvY2sge1xuICAuaXRlbS1saW5rLmxpc3QtYnV0dG9uIHtcbiAgICBjb2xvcjogQHRoZW1lQ29sb3I7XG4gIH1cbn0iLCIvLyBBY3RpdmUgYnV0dG9uIGljb24gY29sb3Jcbi5idXR0b24ge1xuICAmLmFjdGl2ZSB7XG4gICAgaS5pY29uIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgfVxuICB9XG59IiwiLy8gQ29udGV4dCBtZW51XG5cbi5kb2N1bWVudC1tZW51IHtcbiAgQGNvbnRleHRNZW51Qmc6IHJnYmEoMCwwLDAsMC45KTtcbiAgQG1vZGFsSGFpcmxpbmVDb2xvcjogcmdiYSgyMzAsMjMwLDIzMCwwLjkpO1xuICBAbW9kYWxCdXR0b25Db2xvciA6IHJnYmEoMjAwLDIwMCwyMDAsMC45KTtcblxuICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29udGV4dE1lbnVCZztcbiAgd2lkdGg6IGF1dG87XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgei1pbmRleDogMTI1MDA7XG5cbiAgLnBvcG92ZXItYW5nbGUge1xuICAgICY6YWZ0ZXIge1xuICAgICAgYmFja2dyb3VuZDogQGNvbnRleHRNZW51Qmc7XG4gICAgfVxuICB9XG5cbiAgLmxpc3QtYmxvY2sge1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICB3aGl0ZS1zcGFjZTogcHJlO1xuXG4gICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICB1bCB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUobGVmdCk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDdweCAwIDAgN3B4O1xuICAgICAgfVxuICAgICAgbGk6Zmlyc3QtY2hpbGQgYXtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogN3B4IDAgMCA3cHg7XG4gICAgICB9XG4gICAgfVxuICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICB1bCB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUocmlnaHQpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwIDdweCA3cHggMDtcbiAgICAgIH1cbiAgICAgIGxpOmxhc3QtY2hpbGQgYXtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMCA3cHggN3B4IDA7XG4gICAgICB9XG4gICAgfVxuICAgICY6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCB7XG4gICAgICBsaTpmaXJzdC1jaGlsZDpsYXN0LWNoaWxkIGEsIHVsOmZpcnN0LWNoaWxkOmxhc3QtY2hpbGQge1xuICAgICAgICBib3JkZXItcmFkaXVzOiA3cHg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLml0ZW0tbGluayB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG5cbiAgICAgIGh0bWw6bm90KC53YXRjaC1hY3RpdmUtc3RhdGUpICY6YWN0aXZlLCAmLmFjdGl2ZS1zdGF0ZSB7XG4gICAgICAgIC8vLnRyYW5zaXRpb24oMG1zKTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2Q5ZDlkOTtcbiAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgIC5oYWlybGluZS1jb2xvcihyaWdodCwgdHJhbnNwYXJlbnQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGh0bWwucGhvbmUgJiB7XG4gICAgICAgIHBhZGRpbmc6IDAgMTBweDtcbiAgICAgIH1cblxuICAgICAgJi5saXN0LWJ1dHRvbiB7XG4gICAgICAgIGNvbG9yOiBAd2hpdGU7XG4gICAgICAgIC5oYWlybGluZShyaWdodCwgQG1vZGFsSGFpcmxpbmVDb2xvcik7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAzNnB4O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExpc3QgaXRlbXNcbiAgICBsaSB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuXG4gICAgLy8gTGFzdC1jaGlsZHNcbiAgICBsaSB7XG4gICAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICAubGlzdC1idXR0b24ge1xuICAgICAgICAgIC5oYWlybGluZS1yZW1vdmUocmlnaHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAmOmxhc3QtY2hpbGQsICY6bGFzdC1jaGlsZCBsaTpsYXN0LWNoaWxkIHtcbiAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgIC5oYWlybGluZS1yZW1vdmUocmlnaHQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsaTpsYXN0LWNoaWxkLCAmOmxhc3QtY2hpbGQgbGkge1xuICAgICAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgLmhhaXJsaW5lKHJpZ2h0LCBAbW9kYWxIYWlybGluZUNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICAubm8taGFpcmxpbmVzKCk7XG4gICAgLm5vLWhhaXJsaW5lcy1iZXR3ZWVuKClcbiAgfVxufSIsIi8vIENvbG9yIHBhbGV0dGVcblxuLmNvbG9yLXBhbGV0dGUge1xuICBhIHtcbiAgICBmbGV4LWdyb3c6IDE7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG1pbi13aWR0aDogMTBweDtcbiAgICBtaW4taGVpZ2h0OiAyNnB4O1xuICAgIG1hcmdpbjogMXB4IDFweCAwIDA7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwwLDAsMC4xNSkgaW5zZXQ7XG5cbiAgICAmLmFjdGl2ZSB7XG4gICAgICAmOmFmdGVyIHtcbiAgICAgICAgY29udGVudDonICc7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHdoaXRlLCAwIDAgMCA0cHggQHRoZW1lQ29sb3I7XG4gICAgICAgIHotaW5kZXg6IDE7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDFweDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLnRyYW5zcGFyZW50IHtcbiAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgMTAwJTtcbiAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHg9JzBweCcgeT0nMHB4JyB2aWV3Qm94PScwIDAgMjIgMjInIHhtbDpzcGFjZT0ncHJlc2VydmUnPjxsaW5lIHN0cm9rZT0nI2ZmMDAwMCcgc3Ryb2tlLWxpbmVjYXA9J3VuZGVmaW5lZCcgc3Ryb2tlLWxpbmVqb2luPSd1bmRlZmluZWQnIGlkPSdzdmdfMScgeTI9JzAnIHgyPScyMicgeTE9JzIyJyB4MT0nMCcgc3Ryb2tlLXdpZHRoPScyJyBmaWxsPSdub25lJy8+PC9zdmc+XCIpO1xuICAgIH1cbiAgfVxuXG4gIC50aGVtZS1jb2xvcnMge1xuICAgIC5pdGVtLWlubmVyIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICAgIH1cbiAgfVxuXG4gIC5zdGFuZGFydC1jb2xvcnMge1xuICAgIC5pdGVtLWlubmVyIHtcbiAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICAgIH1cbiAgfVxufSIsIi8vIEFib3V0XG4uYWJvdXQge1xuICAucGFnZS1jb250ZW50IHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIH1cblxuICAuY29udGVudC1ibG9jazpmaXJzdC1jaGlsZCB7XG4gICAgbWFyZ2luOiAxNXB4IDA7XG4gIH1cblxuICAuY29udGVudC1ibG9jayB7XG4gICAgbWFyZ2luOiAwIGF1dG8gMTVweDtcblxuICAgIGEge1xuICAgICAgY29sb3I6ICMwMDA7XG4gICAgfVxuICB9XG5cbiAgaDMge1xuICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgbWFyZ2luOiAwO1xuXG4gICAgJi52ZW5kb3Ige1xuICAgICAgY29sb3I6ICMwMDA7XG4gICAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICAgIG1hcmdpbi10b3A6IDE1cHg7XG4gICAgfVxuICB9XG5cbiAgcCA+IGxhYmVsIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDVweDtcbiAgfVxuXG4gIC5sb2dvIHtcbiAgICBiYWNrZ3JvdW5kOiB1cmwoJy4uLy4uLy4uLy4uL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2ltZy9hYm91dC9vbmx5b2ZmaWNlLnN2ZycpIG5vLXJlcGVhdCBjZW50ZXI7XG4gICAgbWFyZ2luLXRvcDogMjBweDtcbiAgfVxufSIsIi8vIFNlYXJjaFxuXG4udGFibGV0IHtcbiAgLnNlYXJjaGJhci5kb2N1bWVudCB7XG4gICAgLmNlbnRlciB7XG4gICAgICB3aWR0aDogMTAwJTtcblxuICAgICAgLnNlYXJjaGJhciB7XG4gICAgICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLnJpZ2h0IHtcbiAgICAgIC5wcmV2IHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi5waG9uZSB7XG4gIC5zZWFyY2hiYXIuZG9jdW1lbnQge1xuICAgIC5sZWZ0LFxuICAgIC5jZW50ZXIsXG4gICAgLnJpZ2h0IHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgfVxuXG4gICAgLmNlbnRlciB7XG4gICAgICB3aWR0aDogMTAwJTtcblxuICAgICAgLnNlYXJjaGJhciB7XG4gICAgICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7XG4gICAgICAgIHBhZGRpbmc6IDA7XG5cbiAgICAgICAgJjphZnRlciB7XG4gICAgICAgICAgY29udGVudDogbm9uZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC5yaWdodCB7XG4gICAgICA+IHAge1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi5zZWFyY2hiYXIuZG9jdW1lbnQge1xuICBiYWNrZ3JvdW5kOiBsaWdodGVuKEBzZWFyY2hiYXJCZywgMTAlKTtcbn0iLCIvLyBJY29uc1xuaS5pY29uIHtcbiAgJi5pY29uLXNlYXJjaCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTE1LjgsMTVjMS40LTEuNiwyLjItMy43LDIuMi01LjljMC01LTQtOS05LTlDNCwwLDAsNCwwLDljMCw1LDQsOSw5LDljMi4zLDAsNC40LTAuOSw1LjktMi4ybDUuOCw1LjhsMC4yLTAuNmwwLjctMC4yTDE1LjgsMTV6IE05LDE3Yy00LjQsMC04LTMuNi04LThjMC00LjQsMy42LTgsOC04YzQuNCwwLDgsMy42LDgsOEMxNywxMy41LDEzLjUsMTcsOSwxN3pcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1idXJnZXIge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHJlY3QgeD1cIjJcIiB5PVwiMTdcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMVwiLz48cmVjdCB4PVwiMlwiIHk9XCIxM1wiIHdpZHRoPVwiMThcIiBoZWlnaHQ9XCIxXCIvPjxyZWN0IHg9XCIyXCIgeT1cIjlcIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMVwiLz48cmVjdCB4PVwiMlwiIHk9XCI1XCIgd2lkdGg9XCIxOFwiIGhlaWdodD1cIjFcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1lZGl0IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMCwyMGgyMnYxSDBWMjB6XCIvPjxwb2x5Z29uIHBvaW50cz1cIjE5LjMsNS4zIDYuMSwxOC40IDQuNiwxNi45IDE3LjgsMy44IDE3LjEsMy4xIDMuNSwxNi43IDMsMjAgNi4zLDE5LjUgMTkuOSw1LjkgXHRcIi8+PHBhdGggZD1cIk0yMC41LDUuM0wyMiwzLjhjMCwwLTAuMi0xLjItMC45LTEuOUMyMC40LDEuMSwxOS4yLDEsMTkuMiwxbC0xLjUsMS41TDIwLjUsNS4zelwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXBsYXkge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk00LjA0NjQzNjMsMi45ODg0NTUzYzAuMDA2NTI2LDAuMDAyOTYsMC4wMTQyMzQ1LDAuMDA2ODM1LDAuMDIzMTQzOCwwLjAxMTkwMjEgYzAuNTkwODYwNCwwLjMzNTc2MzcsMTIuNzExODM5Nyw3LjI5MjQ0MzMsMTMuODk3NzQ4OSw4LjAyNjg0MDJjLTAuNTgzMTU4NSwwLjM0MTc3NTktMTMuMDEzNzU4Nyw3LjQ4NzkyNzQtMTMuOTM0NjU5LDcuOTgyNjcyNyBMNC4wNDY0MzYzLDIuOTg4NDU1MyBNMy45ODg5MzU3LDJDMy40NDI3Nzk1LDIuMDAwMDU3NywzLjAwMDUyNSwyLjQ1MzM1NzUsMy4wMDA1MjUsMy4wMTUzNDhcdGMwLDAuNTczNDg3LDAsMTUuMTYzMjk1NywwLDE1Ljk5NDUyMjFDMy4wMDA1MjUsMTkuNjIyOTYzLDMuNDc5NjEwNCwyMCwzLjk5NDA1ODgsMjAgYzAuMTcyOTM3MiwwLDAuMzQ5OTE5MS0wLjA0MjYzMTEsMC41MTM5NzYzLTAuMTMzMjIyNmMwLjg5MDU2MDItMC40OTEwNDUsMTMuMTg4MDg5NC03LjU1ODMzNzIsMTMuOTQwNzM4Ny03Ljk5OTQ0NTkgYzAuNjc1MTIxMy0wLjM5NTUyMDIsMC42ODY3MzEzLTEuMzM3NTEyLDAtMS43MzI2NjAzQzE3LjQwMzE3NTQsOS41MzMzMjcxLDUuMTUyMzg1MiwyLjUwMTg1Miw0LjUzOTM5NTMsMi4xNTM1MTY1IEM0LjM1MjYyMDEsMi4wNDcyNzk0LDQuMTY1NDAxLDEuOTk5OTgxMywzLjk4ODkzNTcsMkwzLjk4ODkzNTcsMnpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi11bmRvIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMjIsMTZ2MmgtMXYtMmwwLDBjMC0yLjktMi4xLTUtNS01bDAsMEgxLjlMNSwxNGMwLjEsMC4xLDAuMSwwLjIsMCwwLjNsLTAuNCwwLjRjLTAuMSwwLjEtMC4yLDAuMS0wLjMsMGwtNC4yLTQuMmMtMC4xLTAuMS0wLjEtMC4yLDAtMC4zbDAuNC0wLjRoMC4xTDQuNCw2YzAuMS0wLjEsMC4yLTAuMSwwLjMsMGwwLjUsMC40YzAuMSwwLjEsMC4xLDAuMiwwLDAuM0wxLjksMTBIMTZsMCwwQzE5LjMsMTAsMjIsMTIuNywyMiwxNkwyMiwxNnpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1yZWRvIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMCwxNmMwLTMuMywyLjctNiw2LTZ2MGgxNC4xbC0zLjMtMy4zYy0wLjEtMC4xLTAuMS0wLjIsMC0wLjNMMTcuMyw2YzAuMS0wLjEsMC4yLTAuMSwwLjMsMGwzLjgsMy44YzAsMCwwLjEsMCwwLjEsMGwwLjQsMC40YzAuMSwwLjEsMC4xLDAuMiwwLDAuM2wtNC4yLDQuMmMtMC4xLDAuMS0wLjIsMC4xLTAuMywwbC0wLjQtMC40Yy0wLjEtMC4xLTAuMS0wLjIsMC0wLjNsMy4xLTNINnYwYy0yLjksMC01LDIuMS01LDVoMHYySDBMMCwxNkwwLDE2elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXJlYWRlciB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTE3LDIxSDFWOWg2VjJsMCwwaDEwdjVoMVYxSDYuMkwwLDcuNlYyMmgxOHYtM2gtMVYyMXogTTYsMi44VjhIMS4xTDYsMi44eiBNMTMsOGMtNS4xLDAtOSw1LTksNXM0LjEsNSw5LDVjNSwwLDktNSw5LTVTMTgsOCwxMyw4eiBNOC43LDE1LjVDNi44LDE0LjQsNi40LDEzLDYuNCwxM3MwLjQtMS41LDIuNC0yLjZDOC4zLDExLjIsOCwxMiw4LDEzQzgsMTMuOSw4LjMsMTQuOCw4LjcsMTUuNXogTTEzLDE2LjdjLTIuMSwwLTMuNy0xLjctMy43LTMuN2MwLTIuMSwxLjctMy43LDMuNy0zLjdjMi4xLDAsMy43LDEuNywzLjcsMy43QzE2LjcsMTUuMSwxNS4xLDE2LjcsMTMsMTYuN3ogTTE3LjMsMTUuNWMwLjQtMC43LDAuNy0xLjYsMC43LTIuNWMwLTEtMC4zLTEuOC0wLjctMi42YzIsMS4xLDMuNCwyLjYsMy40LDIuNlMxOS4yLDE0LjQsMTcuMywxNS41eiBNMTMsMTEuN2MtMC43LDAtMS4zLDAuNi0xLjMsMS4zczAuNiwxLjMsMS4zLDEuM3MxLjMtMC42LDEuMy0xLjNTMTMuNywxMS43LDEzLDExLjd6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tZG93bmxvYWQge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIi0xIDMgMjIgMjhcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwb2x5Z29uIHBvaW50cz1cIjEwLDUuNiAxMCwyMS4yIDExLDIxLjIgMTEsNS42IDE0LjYsOS4zIDE1LjMsOC41IDEwLjUsMy42IDUuNyw4LjUgNi40LDkuMyBcdFwiLz48cG9seWdvbiBwb2ludHM9XCIxMywxMiAxMywxMyAxOSwxMyAxOSwzMCAyLDMwIDIsMTMgOCwxMyA4LDEyIDEsMTIgMSwxMyAxLDMwIDEsMzEgMjAsMzEgMjAsMzAgMjAsMTMgMjAsMTIgXHRcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1pbmZvIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMTAsMTdoMlY4aC0yVjE3eiBNMTEsMUM1LjUsMSwxLDUuNSwxLDExczQuNSwxMCwxMCwxMHMxMC00LjUsMTAtMTBTMTYuNSwxLDExLDF6IE0xMSwyMGMtNSwwLTktNC05LTlzNC05LDktOXM5LDQsOSw5UzE2LDIwLDExLDIweiBNMTAsN2gyVjVoLTJWN3pcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1wbHVzIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMjIsMTJIMTJ2MTBoLTFWMTJIMXYtMWgxMFYxaDF2MTBoMTBWMTJ6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tc2V0dGluZ3Mge1xuICAgIHdpZHRoOiAyNHB4O1xuICAgIGhlaWdodDogMjRweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xMS44LDNsMC40LDJjMC4xLDAuNywwLjYsMS4xLDEuMywxLjFjMC4zLDAsMC41LTAuMSwwLjctMC4ybDEuOS0xLjJsMS4xLDEuMWwtMS4xLDEuOEMxNS44LDgsMTUuOCw4LjUsMTYsOC45YzAuMiwwLjQsMC41LDAuNywxLDAuOGwyLjEsMC41djEuNkwxNywxMi4yYy0wLjUsMC4xLTAuOCwwLjQtMSwwLjhjLTAuMiwwLjQtMC4xLDAuOSwwLjEsMS4ybDEuMiwxLjlsLTEuMSwxLjFsLTEuOC0xLjFjLTAuMi0wLjItMC41LTAuMi0wLjgtMC4yYy0wLjYsMC0xLjIsMC41LTEuMywxLjFsLTAuNSwyLjFoLTEuNmwtMC40LTJDOS43LDE2LjQsOS4yLDE2LDguNSwxNmMtMC4zLDAtMC41LDAuMS0wLjcsMC4ybC0xLjksMS4ybC0xLjEtMS4xbDEuMS0xLjhjMC4zLTAuNCwwLjMtMC45LDAuMS0xLjNjLTAuMi0wLjQtMC41LTAuNy0xLTAuOGwtMi4xLTAuNXYtMS42bDItMC40YzAuNS0wLjEsMC44LTAuNCwxLTAuOEM2LjEsOC43LDYsOC4yLDUuOCw3LjlsLTEtMmwxLjEtMS4xbDEuOCwxLjFDOCw2LjEsOC4yLDYuMiw4LjUsNi4yYzAuNiwwLDEuMi0wLjUsMS4zLTEuMUwxMC4zLDNIMTEuOCBNMTEsMTUuNWMyLjUsMCw0LjUtMiw0LjUtNC41cy0yLTQuNS00LjUtNC41cy00LjUsMi00LjUsNC41UzguNSwxNS41LDExLDE1LjUgTTEyLjEsMkg5LjlDOS42LDIsOS40LDIuMiw5LjMsMi41TDguOCw0LjljMCwwLjItMC4yLDAuMy0wLjMsMC4zcy0wLjEsMC0wLjItMC4xTDYuMiwzLjhDNi4xLDMuNyw2LDMuNyw1LjgsMy43Yy0wLjEsMC0wLjMsMC0wLjQsMC4xTDMuOCw1LjRjLTAuMSwwLjItMC4yLDAuNSwwLDAuOGwxLjMsMi4xYzAuMSwwLjIsMC4xLDAuNC0wLjIsMC41TDIuNSw5LjNDMi4yLDkuNCwyLDkuNiwyLDkuOXYyLjJjMCwwLjMsMC4yLDAuNSwwLjUsMC42bDIuNCwwLjVjMC4zLDAuMSwwLjQsMC4zLDAuMiwwLjVsLTEuMywyLjFjLTAuMiwwLjItMC4xLDAuNiwwLjEsMC44bDEuNiwxLjZjMC4xLDAuMSwwLjMsMC4yLDAuNCwwLjJzMC4yLDAsMC4zLTAuMUw4LjMsMTdjMC4xLTAuMSwwLjEtMC4xLDAuMi0wLjFzMC4zLDAuMSwwLjMsMC4zbDAuNSwyLjNDOS40LDE5LjgsOS42LDIwLDkuOSwyMGgyLjJjMC4zLDAsMC41LTAuMiwwLjYtMC41bDAuNS0yLjRjMC0wLjIsMC4xLTAuMywwLjMtMC4zYzAuMSwwLDAuMSwwLDAuMiwwLjFsMi4xLDEuM2MwLjEsMC4xLDAuMiwwLjEsMC4zLDAuMWMwLjIsMCwwLjMtMC4xLDAuNC0wLjJsMS42LTEuNmMwLjItMC4yLDAuMi0wLjUsMC4xLTAuOGwtMS4zLTIuMWMtMC4yLTAuMi0wLjEtMC41LDAuMi0wLjVsMi40LTAuNWMwLjMtMC4xLDAuNS0wLjMsMC41LTAuNlY5LjhjMC0wLjMtMC4yLTAuNS0wLjUtMC42bC0yLjQtMC41Yy0wLjMtMC4xLTAuNC0wLjMtMC4yLTAuNWwxLjMtMi4xYzAuMi0wLjIsMC4xLTAuNi0wLjEtMC44bC0xLjYtMS42Yy0wLjEtMC4xLTAuMy0wLjItMC40LTAuMmMtMC4xLDAtMC4yLDAtMC4zLDAuMWwtMi4xLDEuM0MxMy42LDUsMTMuNiw1LDEzLjUsNWMtMC4xLDAtMC4zLTAuMS0wLjMtMC4zbC0wLjUtMi4yQzEyLjYsMi4yLDEyLjQsMiwxMi4xLDJMMTIuMSwyeiBNMTEsMTQuNWMtMS45LDAtMy41LTEuNi0zLjUtMy41UzkuMSw3LjUsMTEsNy41czMuNSwxLjYsMy41LDMuNVMxMi45LDE0LjUsMTEsMTQuNUwxMSwxNC41elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLWFib3V0IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCItMSA3IDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTIxLDE4LjVjMC0wLjMtMC4xLTAuNi0wLjctMC45bC0yLjYtMS4ybDIuNi0xLjJjMC42LTAuMywwLjctMC42LDAuNy0wLjljMC0wLjMtMC4xLTAuNi0wLjctMC45bC04LjktNC4xYy0wLjctMC40LTEuOS0wLjQtMi44LDBsLTguOSw0LjFDLTAuOSwxMy44LTEsMTQuMS0xLDE0LjNzMC4xLDAuNiwwLjcsMC45bDIuNiwxLjJsLTIuNiwxLjJDLTAuOSwxOC0xLDE4LjQtMSwxOC41YzAsMC4yLDAuMSwwLjYsMC43LDAuOWwyLjUsMS4ybC0yLjUsMS4yQy0wLjksMjIuMS0xLDIyLjUtMSwyMi43YzAsMC4zLDAuMSwwLjYsMC43LDAuOWw4LjksNC4xYzAuNSwwLjIsMC44LDAuMywxLjQsMC4zczEtMC4xLDEuNC0wLjNsOC45LTQuMWMwLjYtMC40LDAuNy0wLjYsMC43LTAuOWMwLTAuMy0wLjEtMC42LTAuNy0wLjlsLTIuNS0xLjJsMi41LTEuMkMyMC45LDE5LjIsMjEsMTguOCwyMSwxOC41eiBNLTAuMiwxNC4zTC0wLjIsMTQuM2MwLDAsMC4xLTAuMSwwLjMtMC4yTDksMTBjMC42LTAuMywxLjUtMC4zLDIsMGw4LjksNC4xYzAuMiwwLjEsMC4zLDAuMiwwLjMsMC4ybDAsMGMwLDAtMC4xLDAuMS0wLjMsMC4yTDExLDE4LjZjLTAuNiwwLjMtMS41LDAuMy0yLDBsLTguOS00LjFDLTAuMSwxNC40LTAuMiwxNC4zLTAuMiwxNC4zeiBNMjAuMiwyMi43TDIwLjIsMjIuN2MwLDAtMC4xLDAuMS0wLjMsMC4yTDExLDI3LjFjLTAuNiwwLjMtMS41LDAuMy0yLDBsLTguOS00LjFjLTAuMi0wLjEtMC4zLTAuMi0wLjMtMC4ybDAsMGMwLDAsMC4xLTAuMSwwLjMtMC4ybDMtMS41bDUuNSwyLjZjMC43LDAuNCwxLjksMC40LDIuOCwwbDUuNS0yLjZsMywxLjVDMjAuMSwyMi43LDIwLjIsMjIuNywyMC4yLDIyLjd6IE0xOS45LDE4LjdMMTEsMjIuOGMtMC42LDAuMy0xLjUsMC4zLTIsMGwtOC45LTQuMWMtMC4yLTAuMS0wLjMtMC4yLTAuMy0wLjJsMCwwYzAsMCwwLjEtMC4xLDAuMy0wLjJsMy0xLjVsNS41LDIuNmMwLjcsMC40LDEuOSwwLjQsMi44LDBsNS41LTIuNmwzLDEuNWMwLjIsMC4xLDAuMywwLjIsMC4zLDAuMmwwLDBDMjAuMiwxOC41LDIwLjEsMTguNiwxOS45LDE4Ljd6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24taGVscCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTExLjYsMS4zYy0zLjMsMC02LDIuOC02LDYuMmMwLjMsMCwwLjcsMCwwLjksMGMwLTIuOSwyLjMtNS4yLDUuMS01LjJzNS4xLDIuMyw1LjEsNS4yYzAsMS43LTEuOSwzLjItMyw0LjNDMTIuOSwxMi42LDExLDE0LjIsMTEsMTZjMCwxLjIsMCwyLjIsMCwyLjdjMC4zLDAsMC42LDAsMC45LDBjMC0wLjYsMC0xLjYsMC0yLjVjMC0xLjQsMS4xLTIuNCwyLjItMy41YzEuNy0xLjUsMy41LTMuMSwzLjUtNS4yQzE3LjYsNC4xLDE0LjksMS4zLDExLjYsMS4zeiBNMTEuNSwyMC4yYy0wLjMsMC0wLjUsMC4yLTAuNSwwLjV2MC44YzAsMC4zLDAuMiwwLjUsMC41LDAuNXMwLjUtMC4yLDAuNS0wLjV2LTAuOEMxMS45LDIwLjQsMTEuNywyMC4yLDExLjUsMjAuMnpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1zZXR1cCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTAsM3YxNmgyMlYzSDB6IE0yMSwxN0gxVjVoMjBWMTd6IE0xNi41LDUuOWwtNy4yLDcuMkw4LjgsMTVINHYxYzAsMCwzLjIsMCw1LDBjMC40LDAsMC4yLDAsMC4yLTAuMmwyLjItMC42TDE4LjcsOEwxNi41LDUuOXogTTkuOSwxMy4xbDYuNS02LjRMMTgsOGwtNi41LDYuNEw5LjksMTMuMXpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi12ZXJzaW9ucyB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiLTEgNyAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xOSwxMmMwLTEuMS0wLjktMi0yLTJjMC0xLjEtMC45LTItMi0ySDVjLTEuMSwwLTIsMC45LTIsMmMtMS4xLDAtMiwwLjktMiwyYy0xLjEsMC0yLDAuOS0yLDJ2MTJjMCwxLjEsMC45LDIsMiwyaDE4YzEuMSwwLDItMC45LDItMlYxNEMyMSwxMi45LDIwLjEsMTIsMTksMTJ6IE01LDloMTBjMC42LDAsMSwwLjQsMSwxSDRDNCw5LjQsNC40LDksNSw5eiBNMywxMWgxNGMwLjYsMCwxLDAuNCwxLDFIMkMyLDExLjQsMi40LDExLDMsMTF6IE0yMCwyNmMwLDAuNi0wLjQsMS0xLDFIMWMtMC42LDAtMS0wLjQtMS0xVjE0YzAtMC42LDAuNC0xLDEtMWgxOGMwLjYsMCwxLDAuNCwxLDFWMjZ6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGV4dC1hZGRpdGlvbmFsIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMTguNSwxNS41Yy0xLjEsMC0yLDAuOS0yLDJzMC45LDIsMiwyczItMC45LDItMlMxOS42LDE1LjUsMTguNSwxNS41eiBNMTguNSwxOC41Yy0wLjYsMC0xLTAuNC0xLTFjMC0wLjYsMC40LTEsMS0xczEsMC40LDEsMUMxOS41LDE4LjEsMTkuMSwxOC41LDE4LjUsMTguNXogTTE4LjUsNy41YzEuMSwwLDItMC45LDItMmMwLTEuMS0wLjktMi0yLTJzLTIsMC45LTIsMkMxNi41LDYuNiwxNy40LDcuNSwxOC41LDcuNXogTTE4LjUsNC41YzAuNiwwLDEsMC40LDEsMXMtMC40LDEtMSwxcy0xLTAuNC0xLTFTMTcuOSw0LjUsMTguNSw0LjV6IE0xOC41LDkuNWMtMS4xLDAtMiwwLjktMiwyczAuOSwyLDIsMnMyLTAuOSwyLTJTMTkuNiw5LjUsMTguNSw5LjV6IE0xOC41LDEyLjVjLTAuNiwwLTEtMC40LTEtMWMwLTAuNiwwLjQtMSwxLTFzMSwwLjQsMSwxQzE5LjUsMTIuMSwxOS4xLDEyLjUsMTguNSwxMi41eiBNNi45LDMuOEwxLDE4LjloMS41bDEuOC00LjdoNi45bDEuNyw0LjdoMS41TDguNiwzLjhINi45eiBNNC43LDEyLjlsMy03LjlsMyw3LjlINC43elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRleHQtY29sb3Ige1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk04LjksMTJsMi4zLTYuM2wyLjIsNi4zSDguOXogTTQuNywxNy44aDJsMS42LTQuM2g1LjZsMS41LDQuM2gyLjFMMTIuMywzLjVoLTIuMkw0LjcsMTcuOHpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10ZXh0LXNlbGVjdGlvbiB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTcuNiwxMC4zYzAuMiwwLjMsMC40LDAuNCwwLjUsMC41YzAuMywwLjIsMC42LDAuMywxLDAuM2MwLjcsMCwxLjMtMC4zLDEuNy0wLjhjMC40LTAuNSwwLjYtMS4yLDAuNi0yLjFjMC0wLjktMC4yLTEuNS0wLjYtMmMtMC40LTAuNC0wLjktMC43LTEuNi0wLjdjLTAuMywwLTAuNiwwLjEtMC45LDAuMkM4LDYsNy44LDYuMiw3LjYsNi40VjMuOEg2LjhWMTFoMC44VjEwLjN6IE04LDYuOWMwLjMtMC4zLDAuNy0wLjQsMS4xLTAuNGMwLjUsMCwwLjgsMC4yLDEsMC41YzAuMiwwLjQsMC40LDAuOCwwLjQsMS40YzAsMC42LTAuMSwxLjEtMC40LDEuNWMtMC4yLDAuNC0wLjYsMC42LTEuMSwwLjZjLTAuNiwwLTEuMS0wLjMtMS4zLTAuOUM3LjYsOS4yLDcuNiw4LjgsNy42LDguM0M3LjYsNy43LDcuNyw3LjIsOCw2Ljl6IE01LjcsMTAuNGMtMC4xLDAtMC4yLDAtMC4yLTAuMWMwLTAuMS0wLjEtMC4xLTAuMS0wLjJ2LTNjMC0wLjUtMC4yLTAuOS0wLjYtMS4xQzQuNCw1LjgsNCw1LjYsMy4zLDUuNmMtMC41LDAtMSwwLjEtMS40LDAuNEMxLjUsNi4zLDEuMyw2LjcsMS4zLDcuNGgwLjhjMC0wLjMsMC4xLTAuNSwwLjItMC42YzAuMi0wLjIsMC41LTAuNCwxLTAuNGMwLjQsMCwwLjcsMC4xLDAuOSwwLjJjMC4yLDAuMSwwLjMsMC40LDAuMywwLjdjMCwwLjEsMCwwLjMtMC4xLDAuM0M0LjQsNy43LDQuMyw3LjgsNC4xLDcuOEwyLjcsOEMyLjIsOC4xLDEuOCw4LjIsMS41LDguNUMxLjIsOC44LDEsOS4xLDEsOS42YzAsMC40LDAuMiwwLjgsMC41LDEuMWMwLjMsMC4zLDAuNywwLjQsMS4yLDAuNGMwLjQsMCwwLjgtMC4xLDEuMS0wLjNjMC4zLTAuMiwwLjYtMC40LDAuOC0wLjZjMCwwLjIsMC4xLDAuNCwwLjIsMC41YzAuMSwwLjIsMC40LDAuMywwLjcsMC4zYzAuMSwwLDAuMiwwLDAuMywwYzAuMSwwLDAuMiwwLDAuMy0wLjF2LTAuNmMtMC4xLDAtMC4xLDAtMC4yLDBDNS44LDEwLjQsNS43LDEwLjQsNS43LDEwLjR6IE00LjUsOS4xYzAsMC41LTAuMiwwLjktMC43LDEuMmMtMC4zLDAuMS0wLjYsMC4yLTAuOSwwLjJjLTAuMywwLTAuNS0wLjEtMC43LTAuMkMyLDEwLjEsMiw5LjksMiw5LjZDMiw5LjMsMi4xLDksMi40LDguOWMwLjItMC4xLDAuNC0wLjIsMC43LTAuMmwwLjUtMC4xYzAuMiwwLDAuMy0wLjEsMC41LTAuMWMwLjIsMCwwLjMtMC4xLDAuNC0wLjJWOS4xeiBNMTguNSw1TDguMywxNS4zbC0wLjUsMmMtMC42LDAuNC0xLjMsMC4zLTEuNSwwLjZjLTAuMywwLjQsMC45LDAuNCwxLjUsMC4zYzAuNCwwLDAuNSwwLDAuNS0wLjJsMi4yLTAuNkwyMC43LDcuMUwxOC41LDV6IE05LDE1LjNsOS41LTkuNUwyMCw3LjFsLTkuNSw5LjVMOSwxNS4zelwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLWJ1bGxldHMge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk03LDR2MWgxNVY0SDd6IE0xLDZoM1YzSDFWNnogTTcsMTJoMTV2LTFIN1YxMnogTTEsMTNoM3YtM0gxVjEzeiBNNywxOWgxNXYtMUg3VjE5eiBNMSwyMGgzdi0zSDFWMjB6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tbnVtYmVycyB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTcsMy44djFoMTV2LTFIN3ogTTcsMTEuOGgxNXYtMUg3VjExLjh6IE03LDE4LjhoMTV2LTFIN1YxOC44eiBNMy4xLDYuOWgwLjdWMkgzLjNDMy4yLDIuNCwzLjEsMi42LDIuOSwyLjdDMi43LDIuOCwyLjQsMi45LDIsMi45djAuNWgxLjJWNi45eiBNMy4zLDlDMi42LDksMi4xLDkuMiwxLjksOS43Yy0wLjIsMC4zLTAuMiwwLjYtMC4yLDFoMC42YzAtMC4zLDAuMS0wLjUsMC4xLTAuN2MwLjItMC4zLDAuNS0wLjUsMC45LTAuNWMwLjMsMCwwLjUsMC4xLDAuNywwLjNzMC4zLDAuNCwwLjMsMC43YzAsMC4yLTAuMSwwLjUtMC4zLDAuN2MtMC4xLDAuMS0wLjMsMC4zLTAuNiwwLjRsLTAuNywwLjRjLTAuNCwwLjMtMC43LDAuNS0wLjksMC45Yy0wLjIsMC4zLTAuMiwwLjctMC4zLDEuMWgzLjR2LTAuNkgyLjJjMC4xLTAuMiwwLjItMC41LDAuNC0wLjdjMC4xLTAuMSwwLjMtMC4yLDAuNS0wLjRMMy42LDEyYzAuNC0wLjIsMC43LTAuNCwwLjktMC42YzAuMy0wLjMsMC40LTAuNiwwLjQtMWMwLTAuNC0wLjEtMC43LTAuNC0xQzQuMyw5LjEsMy45LDksMy4zLDl6IE00LjEsMTguM2MwLjItMC4xLDAuMy0wLjIsMC40LTAuM2MwLjItMC4yLDAuMi0wLjQsMC4yLTAuN2MwLTAuNC0wLjEtMC43LTAuNC0xQzQsMTYuMSwzLjYsMTYsMy4xLDE2Yy0wLjYsMC0xLjEsMC4yLTEuMywwLjdjLTAuMSwwLjMtMC4yLDAuNi0wLjIsMC45aDAuNmMwLTAuMywwLjEtMC41LDAuMS0wLjZjMC4yLTAuMywwLjQtMC40LDAuOS0wLjRjMC4yLDAsMC40LDAuMSwwLjYsMC4yQzQsMTYuOSw0LjEsMTcsNC4xLDE3LjNjMCwwLjMtMC4xLDAuNi0wLjQsMC43Yy0wLjEsMC4xLTAuMywwLjEtMC42LDAuMWMtMC4xLDAtMC4xLDAtMC4xLDBjMCwwLTAuMSwwLTAuMiwwdjAuNWMwLDAsMC4xLDAsMC4xLDBjMCwwLDAuMSwwLDAuMSwwYzAuNCwwLDAuNywwLjEsMC45LDAuMmMwLjIsMC4xLDAuMywwLjQsMC4zLDAuN2MwLDAuMy0wLjEsMC41LTAuMywwLjdjLTAuMiwwLjItMC41LDAuMy0wLjgsMC4zYy0wLjQsMC0wLjctMC4xLTAuOS0wLjRjLTAuMS0wLjEtMC4yLTAuNC0wLjItMC43SDEuNWMwLDAuNSwwLjEsMC44LDAuNCwxLjJDMi4xLDIwLjgsMi41LDIxLDMuMSwyMWMwLjYsMCwxLTAuMSwxLjMtMC40YzAuMy0wLjMsMC41LTAuNywwLjUtMS4xYzAtMC4zLTAuMS0wLjUtMC4yLTAuN0M0LjUsMTguNSw0LjMsMTguMyw0LjEsMTguM3pcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1saW5lc3BhY2luZyB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cG9seWdvbiBpZD1cIlhNTElEXzdfXCIgcG9pbnRzPVwiMjIsNCAyMiwzIDEyLDMgMTEsMyAxLDMgMSw0IDExLDQgMTEsNC4zIDgsNy40IDguNyw4LjEgMTEsNS43IDExLDE3LjMgOC43LDE0LjkgOCwxNS42IDExLDE4LjcgMTEsMTkgMSwxOSAxLDIwIDExLDIwIDEyLDIwIDIyLDIwIDIyLDE5IDEyLDE5IDEyLDE4LjYgMTUsMTUuNiAxNC4zLDE0LjkgMTIsMTcuMiAxMiw1LjggMTQuMyw4LjEgMTUsNy40IDEyLDQuNCAxMiw0IFx0XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGV4dC1hbGlnbi1jZW50ZXIge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctbWFzaygnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xLDN2MWgyMVYzSDF6IE00LDd2MWgxNFY3SDR6IE0xLDEyaDIxdi0xSDFWMTJ6IE00LDE1djFoMTR2LTFINHogTTEsMjBoMjF2LTFIMVYyMHpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10ZXh0LWFsaWduLWphc3Qge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctbWFzaygnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xLDN2MWgyMVYzSDF6IE0xLDhoMjFWN0gxVjh6IE0xLDEyaDIxdi0xSDFWMTJ6IE0xLDE2aDIxdi0xSDFWMTZ6IE0xLDIwaDIxdi0xSDFWMjB6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGV4dC1hbGlnbi1sZWZ0IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLW1hc2soJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMSwzdjFoMjFWM0gxeiBNMTUsN0gxdjFoMTRWN3ogTTEsMTJoMjF2LTFIMVYxMnogTTE1LDE1SDF2MWgxNFYxNXogTTEsMjBoMjF2LTFIMVYyMHpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10ZXh0LWFsaWduLXJpZ2h0IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLW1hc2soJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMSwzdjFoMjFWM0gxeiBNOCw4aDE0VjdIOFY4eiBNMjIsMTFIMXYxaDIxVjExeiBNOCwxNmgxNHYtMUg4VjE2eiBNMjIsMTlIMXYxaDIxVjE5elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLWRlLWluZGVudCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1tYXNrKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTEsMjB2LTFoMjF2MUgxeiBNMTEsMTVoMTF2MUgxMVYxNXogTTExLDExaDExdjFIMTFWMTF6IE0xMSw3aDExdjFIMTFWN3ogTTYuMyw3TDcsNy43bC0zLjgsMy44TDcsMTUuM0w2LjMsMTZMMiwxMS44bC0wLjItMC4zTDIsMTEuMkw2LjMsN3ogTTEsM2gyMXYxSDFWM3pcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1pbi1pbmRlbnQge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctbWFzaygnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xLDIwdi0xaDIxdjFIMXogTTEyLDE2SDF2LTFoMTFWMTZ6IE0xMiwxMkgxdi0xaDExVjEyeiBNMTIsOEgxVjdoMTFWOHogTTIxLDExLjJsMC4yLDAuM0wyMSwxMS44TDE2LjcsMTZMMTYsMTUuM2wzLjgtMy44TDE2LDcuN0wxNi43LDdMMjEsMTEuMnogTTIyLDRIMVYzaDIxVjR6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tcHJldiB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTE2LDIwLjVMMTUsMjEuNUw0LjUsMTFsMCwwbDAsMEwxNSwwLjVMMTYsMS41TDYuNiwxMUwxNiwyMC41elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLW5leHQge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xNS41LDExTDYsMS41bDEuMS0xLjFMMTcuNSwxMWwwLDBsMCwwTDcuMSwyMS41TDYsMjAuNUwxNS41LDExelwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLWFkZC1jb2x1bW4tbGVmdCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTE1LDE5aC0xSDhIN3YtMXYtM0gwVjJoN2gxaDE0djR2MXYzdjF2M3YxdjN2MUgxNXogTTE1LDE4aDZ2LTNoLTZWMTh6IE0xNSwxNGg2di0zaC02VjE0eiBNOCwxOGg2di0zSDhWMTh6IE04LDE0aDZ2LTNIOFYxNHogTTE0LDEwVjdIOHYzSDE0eiBNOCwzdjNoNlYzSDh6IE0yMSwzaC02djNoNlYzeiBNMTUsN3YzaDZWN0gxNXogTTMsMTZoMXYyaDJ2MUg0djJIM3YtMkgxdi0xaDJWMTZ6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGFibGUtYWRkLWNvbHVtbi1yaWdodCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTAsMTlsMC0xbDAtM2wwLTFsMC0zbDAtMWwwLTNsMC0xbDAtNGgxNGgxaDd2MTNoLTd2M3YxaC0xSDhIN0gweiBNNywxNUgxdjNoNlYxNXogTTcsMTFIMXYzaDZWMTF6IE0xNCwxNUg4djNoNlYxNXogTTE0LDExSDh2M2g2VjExeiBNMTQsMTBWN0g4djNIMTR6IE04LDN2M2g2VjNIOHogTTEsNmg2VjNIMVY2eiBNMSw3djNoNlY3SDF6IE0xOSwxOGgydjFoLTJ2MmgtMXYtMmgtMnYtMWgydi0yaDFWMTh6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGFibGUtYWRkLXJvdy1hYm92ZSB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTIxLDIwaC02aC0xSDhIN0gwdi0xdi0zdi0xdi0zdi0xVjhWN1YxaDE1djZoNmgxdjF2M3YxdjN2MXYzdjFIMjF6IE03LDhIMXYzaDZWOHogTTcsMTJIMXYzaDZWMTJ6IE03LDE2SDF2M2g2VjE2eiBNOCwxOWg2di0zSDhWMTl6IE04LDE1aDZ2LTNIOFYxNXogTTgsMTFoNlY4SDhWMTF6IE0yMSw4aC02djNoNlY4eiBNMjEsMTJoLTZ2M2g2VjEyeiBNMjEsMTZoLTZ2M2g2VjE2eiBNMTksNmgtMVY0aC0yVjNoMlYxaDF2MmgydjFoLTJWNnpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1hZGQtcm93LWJlbG93IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMjIsMXYxdjN2MXYzdjF2M3YxaC0xaC02djZIMHYtNnYtMXYtM1Y5VjZWNVYyVjFoN2gxaDZoMWg2SDIyeiBNNywxMEgxdjNoNlYxMHogTTcsNkgxdjNoNlY2eiBNNywySDF2M2g2VjJ6IE04LDVoNlYySDhWNXogTTgsOWg2VjZIOFY5eiBNOCwxM2g2di0zSDhWMTN6IE0yMSwxMGgtNnYzaDZWMTB6IE0yMSw2aC02djNoNlY2eiBNMjEsMmgtNnYzaDZWMnogTTE5LDE3aDJ2MWgtMnYyaC0xdi0yaC0ydi0xaDJ2LTJoMVYxN3pcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1yZW1vdmUtY29sdW1uIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMjEsMTloLTZoLTFoLTEuNmMtMC45LDEuOC0yLjcsMy00LjksM3MtNC0xLjItNC45LTNIMUgwdi0xdi0zdi0xdi0zdi0xVjdWNlYzVjJoN2gxaDZoMWg2aDF2MXYzdjF2M3YxdjN2MXYzdjFIMjF6IE03LjUsMTJDNSwxMiwzLDE0LDMsMTYuNVM1LDIxLDcuNSwyMXM0LjUtMiw0LjUtNC41UzEwLDEyLDcuNSwxMnogTTE0LDNIOHYzaDZWM3ogTTE0LDdIOHYzaDZWN3ogTTE0LDExSDh2MC4xYzEuOSwwLjIsMy41LDEuMyw0LjQsMi45SDE0VjExeiBNMTQsMTVoLTEuMmMwLjEsMC41LDAuMiwxLDAuMiwxLjVjMCwwLjUtMC4xLDEtMC4yLDEuNUgxNFYxNXogTTIxLDNoLTZ2M2g2VjN6IE0yMSw3aC02djNoNlY3eiBNMjEsMTFoLTZ2M2g2VjExeiBNMjEsMTVoLTZ2M2g2VjE1eiBNOS42LDE5LjNsLTIuMS0yLjFsLTIuMSwyLjFsLTAuNy0wLjdsMi4xLTIuMWwtMi4xLTIuMWwwLjctMC43bDIuMSwyLjFsMi4xLTIuMWwwLjcsMC43bC0yLjEsMi4xbDIuMSwyLjFMOS42LDE5LjN6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGFibGUtcmVtb3ZlLXJvdyB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTIxLDE5aC02aC0xaC0xLjZjLTAuOSwxLjgtMi43LDMtNC45LDNzLTQtMS4yLTQuOS0zSDFIMHYtMXYtM3YtMXYtM3YtMVY3VjZWM1YyaDdoMWg2aDFoNmgxdjF2M3YxdjN2MXYzdjF2M3YxSDIxeiBNMSwxOGgxLjJDMi4xLDE3LjUsMiwxNywyLDE2LjVjMC0wLjUsMC4xLTEsMC4yLTEuNUgxVjE4eiBNNywzSDF2M2g2VjN6IE03LDdIMXYzaDZWN3ogTTcuNSwxMkM1LDEyLDMsMTQsMywxNi41UzUsMjEsNy41LDIxczQuNS0yLDQuNS00LjVTMTAsMTIsNy41LDEyeiBNMTQsM0g4djNoNlYzeiBNMTQsN0g4djNoNlY3eiBNMTQsMTVoLTEuMmMwLjEsMC41LDAuMiwxLDAuMiwxLjVjMCwwLjUtMC4xLDEtMC4yLDEuNUgxNFYxNXogTTIxLDNoLTZ2M2g2VjN6IE0yMSw3aC02djNoNlY3eiBNMjEsMTVoLTZ2M2g2VjE1eiBNOS42LDE5LjNsLTIuMS0yLjFsLTIuMSwyLjFsLTAuNy0wLjdsMi4xLTIuMWwtMi4xLTIuMWwwLjctMC43bDIuMSwyLjFsMi4xLTIuMWwwLjcsMC43bC0yLjEsMi4xbDIuMSwyLjFMOS42LDE5LjN6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tZXhwYW5kLWRvd24ge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0yMC41LDYuNWwxLjEsMS4xTDExLDE4bDAsMGwwLDBMMC41LDcuNWwxLjEtMS4xbDkuNSw5LjVMMjAuNSw2LjV6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tcGFnZWJyZWFrIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNOCwxNHYxaDF2LTFIOHogTTYsMTR2MWgxdi0xSDZ6IE0xOCwyMUgzdi02SDJ2N2gxN3YtN2gtMVYyMXogTTQsMTR2MWgxdi0xSDR6IE0xNCwxNHYxaDF2LTFIMTR6IE0xMCwxNHYxaDF2LTFIMTB6IE04LjIsMUwyLDcuNlYxNGgxVjloNlYybDAsMGg5djEyaDFWMUg4LjJ6IE04LDhIMy4xTDgsMi44Vjh6IE0xMiwxNHYxaDF2LTFIMTJ6IE0xNiwxNHYxaDF2LTFIMTZ6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tc2VjdGlvbmJyZWFrIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMjAsMTRWMkgzdjEySDJWMWgxOXYxM0gyMHogTTUsMTR2MUg0di0xSDV6IE03LDE0djFINnYtMUg3eiBNOSwxNHYxSDh2LTFIOXogTTExLDE0djFoLTF2LTFIMTF6IE0xMywxNHYxaC0xdi0xSDEzeiBNMTUsMTR2MWgtMXYtMUgxNXogTTE3LDE0djFoLTF2LTFIMTd6IE0xOCwxNGgxdjFoLTFWMTR6IE0zLDIxaDE3di02aDF2N0gydi03aDFWMjF6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tc3RyaW5nYnJlYWsge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xOCwxMkg1LjFMOSwxNS45bC0wLjcsMC43bC00LjUtNC41bC0wLjYtMC42bDAuNi0wLjZsNC41LTQuNUw5LDcuMUw1LjEsMTFIMThWNWgxdjZ2MUgxOHpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1wYWdlbnVtYmVyIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNOC4yLDFMMiw3LjZWMjJoMTdWMUg4LjJ6IE04LDIuOFY4SDMuMUw4LDIuOHogTTE4LDIxSDNWOWg2VjJsMCwwaDlWMjF6IE0xMiwxOWgxdi00aC0wLjdjMCwwLjItMC4xLTAuMS0wLjEsMGMtMC4xLDAuMS0wLjIsMC0wLjMsMGMtMC4xLDAuMS0wLjIsMC4xLTAuNCwwLjFjLTAuMSwwLTAuMywwLTAuNCwwVjE2SDEyVjE5eiBNMTUuMywxNy4zQzE1LDE3LjksMTUuMSwxOC40LDE1LDE5aDAuOWMwLTAuMywwLTAuNiwwLjEtMC45YzAuMS0wLjMsMC4xLTAuNiwwLjMtMC45YzAuMS0wLjMsMC4zLTAuNiwwLjQtMC45YzAuMi0wLjMsMC4xLTAuMywwLjMtMC41VjE1aC0zdjFoMS45QzE1LjYsMTYuNCwxNS41LDE2LjcsMTUuMywxNy4zelwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLWxpbmsge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xMi40LDkuOGMwLDAtMi4xLTAuMS0zLjgsMS4yYy0yLjgsMi0zLjMsNC4zLTMuMyw0LjNzMS42LTEuNywzLjUtMi41YzEuNy0wLjcsMy43LTAuNCwzLjctMC40djEuOWw0LjgtMy4zVjExbC00LjgtMy4zVjkuOHogTTExLDFDNS41LDEsMSw1LjUsMSwxMWMwLDUuNSw0LjUsMTAsMTAsMTBzMTAtNC41LDEwLTEwQzIxLDUuNSwxNi41LDEsMTEsMXogTTExLDIwYy01LDAtOS00LjEtOS05QzIsNiw2LDIsMTEsMnM5LDQuMSw5LDlDMjAsMTYsMTYsMjAsMTEsMjB6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24taW1hZ2UtbGlicmFyeSB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCI+PGRlZnM+PHN0eWxlPi5jbHMtMXtpc29sYXRpb246aXNvbGF0ZTt9LmNscy0ye29wYWNpdHk6MC4yO30uY2xzLTN7ZmlsbDojZmZmO30uY2xzLTEwLC5jbHMtMTEsLmNscy00LC5jbHMtNiwuY2xzLTcsLmNscy04LC5jbHMtOXttaXgtYmxlbmQtbW9kZTptdWx0aXBseTt9LmNscy00e2ZpbGw6dXJsKCNncmFkXzgpO30uY2xzLTV7ZmlsbDp1cmwoI2dyYWRfMTApO30uY2xzLTZ7ZmlsbDp1cmwoI2dyYWRfMTIpO30uY2xzLTd7ZmlsbDp1cmwoI2dyYWRfMTQpO30uY2xzLTh7ZmlsbDp1cmwoI2dyYWRfNzkpO30uY2xzLTl7ZmlsbDp1cmwoI2dyYWRfNzcpO30uY2xzLTEwe2ZpbGw6dXJsKCNncmFkXzc1KTt9LmNscy0xMXtmaWxsOnVybCgjZ3JhZF84MSk7fTwvc3R5bGU+PGxpbmVhckdyYWRpZW50IGlkPVwiZ3JhZF84XCIgeDE9XCIxMS4wOFwiIHkxPVwiMTAuMjZcIiB4Mj1cIjExLjA4XCIgeTI9XCIxLjI2XCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+PHN0b3Agb2Zmc2V0PVwiMFwiIHN0b3AtY29sb3I9XCIjZjNlOTE2XCIvPjxzdG9wIG9mZnNldD1cIjFcIiBzdG9wLWNvbG9yPVwiI2Y4OWQzNFwiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD1cImdyYWRfMTBcIiB4MT1cIjExLjA4XCIgeTE9XCIyMC40NFwiIHgyPVwiMTEuMDhcIiB5Mj1cIjExLjg4XCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+PHN0b3Agb2Zmc2V0PVwiMFwiIHN0b3AtY29sb3I9XCIjNWViNmU4XCIvPjxzdG9wIG9mZnNldD1cIjFcIiBzdG9wLWNvbG9yPVwiIzk1OGNjM1wiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD1cImdyYWRfMTJcIiB4MT1cIjEuNDZcIiB5MT1cIjExLjA1XCIgeDI9XCIxMC40NlwiIHkyPVwiMTEuMDVcIiBncmFkaWVudFRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxNyA1LjA5KSByb3RhdGUoOTApXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+PHN0b3Agb2Zmc2V0PVwiMFwiIHN0b3AtY29sb3I9XCIjY2M4ZGJhXCIvPjxzdG9wIG9mZnNldD1cIjFcIiBzdG9wLWNvbG9yPVwiI2Y4Njg2N1wiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD1cImdyYWRfMTRcIiB4MT1cIjExLjczXCIgeTE9XCIxMS4wNVwiIHgyPVwiMjAuNzNcIiB5Mj1cIjExLjA1XCIgZ3JhZGllbnRUcmFuc2Zvcm09XCJ0cmFuc2xhdGUoMjcuMjggLTUuMTgpIHJvdGF0ZSg5MClcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj48c3RvcCBvZmZzZXQ9XCIwXCIgc3RvcC1jb2xvcj1cIiM2YWMwN2ZcIi8+PHN0b3Agb2Zmc2V0PVwiMVwiIHN0b3AtY29sb3I9XCIjYzVkYTNkXCIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPVwiZ3JhZF83OVwiIHgxPVwiMTEuNzRcIiB5MT1cIjEwLjQyXCIgeDI9XCIxNy41MlwiIHkyPVwiNC42M1wiIGdyYWRpZW50VHJhbnNmb3JtPVwidHJhbnNsYXRlKDMwLjI5IDIuNTEpIHJvdGF0ZSgxMzUpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+PHN0b3Agb2Zmc2V0PVwiMFwiIHN0b3AtY29sb3I9XCIjYzVkYTNkXCIvPjxzdG9wIG9mZnNldD1cIjFcIiBzdG9wLWNvbG9yPVwiI2YzZTkxNlwiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD1cImdyYWRfNzdcIiB4MT1cIjQuN1wiIHkxPVwiMTcuNDlcIiB4Mj1cIjEwLjQ4XCIgeTI9XCIxMS43MVwiIGdyYWRpZW50VHJhbnNmb3JtPVwidHJhbnNsYXRlKDIzLjI0IDE5LjY1KSByb3RhdGUoMTM1KVwiIGdyYWRpZW50VW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPjxzdG9wIG9mZnNldD1cIjBcIiBzdG9wLWNvbG9yPVwiIzk1OTVjM1wiLz48c3RvcCBvZmZzZXQ9XCIxXCIgc3RvcC1jb2xvcj1cIiNjYzhkYmFcIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9XCJncmFkXzc1XCIgeDE9XCI0LjY5XCIgeTE9XCI0LjY0XCIgeDI9XCIxMC40N1wiIHkyPVwiMTAuNDJcIiBncmFkaWVudFRyYW5zZm9ybT1cInRyYW5zbGF0ZSg3LjU0IC0zLjE1KSByb3RhdGUoNDUpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+PHN0b3Agb2Zmc2V0PVwiMFwiIHN0b3AtY29sb3I9XCIjZjg2ODY3XCIvPjxzdG9wIG9mZnNldD1cIjFcIiBzdG9wLWNvbG9yPVwiI2Y4OWQzNFwiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD1cImdyYWRfODFcIiB4MT1cIjExLjc3XCIgeTE9XCIxMS43OFwiIHgyPVwiMTcuNTVcIiB5Mj1cIjE3LjU2XCIgZ3JhZGllbnRUcmFuc2Zvcm09XCJ0cmFuc2xhdGUoMTQuNjMgLTYuMDUpIHJvdGF0ZSg0NSlcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj48c3RvcCBvZmZzZXQ9XCIwXCIgc3RvcC1jb2xvcj1cIiM1ZWMwZThcIi8+PHN0b3Agb2Zmc2V0PVwiMVwiIHN0b3AtY29sb3I9XCIjNmFjMDdmXCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjx0aXRsZT5pY29uc19mb3Jfc3ZnPC90aXRsZT48ZyBjbGFzcz1cImNscy0xXCI+PGcgaWQ9XCLQodC70L7QuV8xXCIgZGF0YS1uYW1lPVwi0KHQu9C+0LkgMVwiPjxyZWN0IGNsYXNzPVwiY2xzLTJcIiB4PVwiMC4wOVwiIHk9XCIwLjAxXCIgd2lkdGg9XCIyMlwiIGhlaWdodD1cIjIyXCIgcng9XCI0XCIgcnk9XCI0XCIvPjxyZWN0IGNsYXNzPVwiY2xzLTNcIiB4PVwiMC41N1wiIHk9XCIwLjQ5XCIgd2lkdGg9XCIyMS4wNFwiIGhlaWdodD1cIjIxLjA0XCIgcng9XCIzLjZcIiByeT1cIjMuNlwiLz48cmVjdCBjbGFzcz1cImNscy00XCIgeD1cIjguMzNcIiB5PVwiMS4yNlwiIHdpZHRoPVwiNS41XCIgaGVpZ2h0PVwiOVwiIHJ4PVwiMi41XCIgcnk9XCIyLjVcIi8+PHJlY3QgY2xhc3M9XCJjbHMtNVwiIHg9XCI4LjMzXCIgeT1cIjExLjc2XCIgd2lkdGg9XCI1LjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIyLjVcIiByeT1cIjIuNVwiLz48cmVjdCBjbGFzcz1cImNscy02XCIgeD1cIjMuMjFcIiB5PVwiNi41NVwiIHdpZHRoPVwiNS41XCIgaGVpZ2h0PVwiOVwiIHJ4PVwiMi41XCIgcnk9XCIyLjVcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoLTUuMDkgMTcpIHJvdGF0ZSgtOTApXCIvPjxyZWN0IGNsYXNzPVwiY2xzLTdcIiB4PVwiMTMuNDhcIiB5PVwiNi41NVwiIHdpZHRoPVwiNS41XCIgaGVpZ2h0PVwiOVwiIHJ4PVwiMi41XCIgcnk9XCIyLjVcIiB0cmFuc2Zvcm09XCJ0cmFuc2xhdGUoNS4xOCAyNy4yOCkgcm90YXRlKC05MClcIi8+PHJlY3QgY2xhc3M9XCJjbHMtOFwiIHg9XCIxMS44N1wiIHk9XCIzLjAzXCIgd2lkdGg9XCI1LjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIyLjVcIiByeT1cIjIuNVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxOS42NCAyMy4xOSkgcm90YXRlKC0xMzUpXCIvPjxyZWN0IGNsYXNzPVwiY2xzLTlcIiB4PVwiNC44XCIgeT1cIjEwLjE0XCIgd2lkdGg9XCI1LjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIyLjVcIiByeT1cIjIuNVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgyLjU0IDMwLjMzKSByb3RhdGUoLTEzNSlcIi8+PHJlY3QgY2xhc3M9XCJjbHMtMTBcIiB4PVwiNC44M1wiIHk9XCIzLjAzXCIgd2lkdGg9XCI1LjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIyLjVcIiByeT1cIjIuNVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtMy4xIDcuNTYpIHJvdGF0ZSgtNDUpXCIvPjxyZWN0IGNsYXNzPVwiY2xzLTExXCIgeD1cIjExLjg3XCIgeT1cIjEwLjE0XCIgd2lkdGg9XCI1LjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIyLjVcIiByeT1cIjIuNVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNi4wNyAxNC42Mykgcm90YXRlKC00NSlcIi8+PC9nPjwvZz48L3N2Zz4nKTtcbiAgfVxuXG4gICYuaWNvbi10ZXh0LXZhbGlnbi10b3Age1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctbWFzaygnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHJlY3QgY2xhc3M9XCJjbHMtMVwiIHg9XCIyXCIgeT1cIjJcIiB3aWR0aD1cIjE5XCIgaGVpZ2h0PVwiMVwiLz48cmVjdCBjbGFzcz1cImNscy0xXCIgeD1cIjJcIiB5PVwiNFwiIHdpZHRoPVwiMTlcIiBoZWlnaHQ9XCIxXCIvPjxwb2x5Z29uIGNsYXNzPVwiY2xzLTFcIiBwb2ludHM9XCIxMiAxOCAxMSAxOCAxMSA3LjgzIDguNjUgOS44IDggOC45NCAxMS41IDYgMTUgOSAxNC4zNSA5LjggMTIgNy44MyAxMiAxOFwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRleHQtdmFsaWduLW1pZGRsZSB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1tYXNrKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cmVjdCBjbGFzcz1cImNscy0xXCIgeD1cIjJcIiB5PVwiMTBcIiB3aWR0aD1cIjE5XCIgaGVpZ2h0PVwiMVwiLz48cmVjdCBjbGFzcz1cImNscy0xXCIgeD1cIjJcIiB5PVwiMTJcIiB3aWR0aD1cIjE5XCIgaGVpZ2h0PVwiMVwiLz48cG9seWdvbiBjbGFzcz1cImNscy0xXCIgcG9pbnRzPVwiMTEgMiAxMiAyIDEyIDcuMTcgMTQuMzUgNS4yIDE1IDYuMDYgMTEuNSA5IDggNiA4LjY1IDUuMiAxMSA3LjE3IDExIDJcIi8+PHBvbHlnb24gY2xhc3M9XCJjbHMtMVwiIHBvaW50cz1cIjEyIDIxIDExIDIxIDExIDE1LjgzIDguNjUgMTcuOCA4IDE2Ljk0IDExLjUgMTQgMTUgMTcgMTQuMzUgMTcuOCAxMiAxNS44MyAxMiAyMVwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRleHQtdmFsaWduLWJvdHRvbSB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1tYXNrKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cmVjdCBjbGFzcz1cImNscy0xXCIgeD1cIjJcIiB5PVwiMThcIiB3aWR0aD1cIjE5XCIgaGVpZ2h0PVwiMVwiLz48cmVjdCBjbGFzcz1cImNscy0xXCIgeD1cIjJcIiB5PVwiMjBcIiB3aWR0aD1cIjE5XCIgaGVpZ2h0PVwiMVwiLz48cG9seWdvbiBjbGFzcz1cImNscy0xXCIgcG9pbnRzPVwiMTEgNCAxMiA0IDEyIDE1LjE3IDE0LjM1IDEzLjIgMTUgMTQuMDYgMTEuNSAxNyA4IDE0IDguNjUgMTMuMiAxMSAxNS4xNyAxMSA0XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuXG4gIC8vIFByZXNldHMgb2YgdGFibGUgYm9yZGVyc1xuXG4gICYuaWNvbi10YWJsZS1ib3JkZXJzLWFsbCB7XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyOCAyOFwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0yNi45LDBIMFYyN0gyN1YwSDI2LjlaTTEzLDI2SDFWMTRIMTNWMjZabTAtMTNIMVYxSDEzVjEzWk0yNiwyNkgxNFYxNEgyNlYyNlptMC0xM0gxNFYxSDI2VjEzWlwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLWJvcmRlcnMtbm9uZSB7XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyOCAyOFwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggb3BhY2l0eT1cIjAuM1wiIGQ9XCJNMjYuOSwwSDBWMjdIMjdWMEgyNi45Wk0xMywyNkgxVjE0SDEzVjI2Wm0wLTEzSDFWMUgxM1YxM1pNMjYsMjZIMTRWMTRIMjZWMjZabTAtMTNIMTRWMUgyNlYxM1pcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1ib3JkZXJzLWlubmVyIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDI4IDI4XCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cG9seWdvbiBwb2ludHM9XCIyNiAxMyAxNCAxMyAxNCAxIDEzIDEgMTMgMTMgMSAxMyAxIDE0IDEzIDE0IDEzIDI2IDE0IDI2IDE0IDE0IDI2IDE0IDI2IDEzXCIvPjxwYXRoIG9wYWNpdHk9XCIwLjNcIiBkPVwiTTI3LDBIMFYyN0gyN1YwWk0xLDI2VjFIMjZWMjZIMVpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1ib3JkZXJzLW91dGVyIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDI4IDI4XCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTI3LDBIMFYyN0gyN1YwWk0xLDI2VjFIMjZWMjZIMVpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1ib3JkZXJzLWxlZnQge1xuICAgIHdpZHRoOiAyOHB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHZpZXdCb3g9XCIwIDAgMjggMjhcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIG9wYWNpdHk9XCIwLjNcIiBkPVwiTTI3LDBIMFYyN0gyN1YwWk0xLDI2VjFIMjZWMjZIMVpcIi8+PHJlY3Qgd2lkdGg9XCIxXCIgaGVpZ2h0PVwiMjdcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1ib3JkZXJzLWNlbnRlciB7XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyOCAyOFwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggb3BhY2l0eT1cIjAuM1wiIGQ9XCJNMjcsMEgwVjI3SDI3VjBaTTEsMjZWMUgyNlYyNkgxWlwiLz48cmVjdCB4PVwiMTNcIiB3aWR0aD1cIjFcIiBoZWlnaHQ9XCIyN1wiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLWJvcmRlcnMtcmlnaHQge1xuICAgIHdpZHRoOiAyOHB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHZpZXdCb3g9XCIwIDAgMjggMjhcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIG9wYWNpdHk9XCIwLjNcIiBkPVwiTTI3LDBIMFYyN0gyN1YwWk0xLDI2VjFIMjZWMjZIMVpcIi8+PHJlY3QgeD1cIjI2XCIgd2lkdGg9XCIxXCIgaGVpZ2h0PVwiMjdcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1ib3JkZXJzLXRvcCB7XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyOCAyOFwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggb3BhY2l0eT1cIjAuM1wiIGQ9XCJNMjcsMEgwVjI3SDI3VjBaTTEsMjZWMUgyNlYyNkgxWlwiLz48cmVjdCB3aWR0aD1cIjI3XCIgaGVpZ2h0PVwiMVwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLWJvcmRlcnMtbWlkZGxlIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDI4IDI4XCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBvcGFjaXR5PVwiMC4zXCIgZD1cIk0yNywwSDBWMjdIMjdWMFpNMSwyNlYxSDI2VjI2SDFaXCIvPjxyZWN0IHk9XCIxM1wiIHdpZHRoPVwiMjdcIiBoZWlnaHQ9XCIxXCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGFibGUtYm9yZGVycy1ib3R0b20ge1xuICAgIHdpZHRoOiAyOHB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHZpZXdCb3g9XCIwIDAgMjggMjhcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIG9wYWNpdHk9XCIwLjNcIiBkPVwiTTI3LDBIMFYyN0gyN1YwWk0xLDI2VjFIMjZWMjZIMVpcIi8+PHJlY3QgeT1cIjI2XCIgd2lkdGg9XCIyN1wiIGhlaWdodD1cIjFcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG5cbiAgLy8gUmVvcmRlclxuXG4gICYuaWNvbi1tb3ZlLWJhY2t3YXJkIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDI4IDI4XCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cmVjdCBvcGFjaXR5PVwiMC4zXCIgeD1cIjFcIiB5PVwiMVwiIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxN1wiLz48cGF0aCBkPVwiTTEwLDEwVjI3SDI3VjEwSDEwWk0yNiwyNkgxMVYxMUgyNlYyNlpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1tb3ZlLWZvcndhcmQge1xuICAgIHdpZHRoOiAyOHB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHZpZXdCb3g9XCIwIDAgMjggMjhcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIG9wYWNpdHk9XCIwLjNcIiBkPVwiTTEwLDEwVjI3SDI3VjEwSDEwWk0yNiwyNkgxMVYxMUgyNlYyNlpcIi8+PHJlY3QgeD1cIjFcIiB5PVwiMVwiIHdpZHRoPVwiMTdcIiBoZWlnaHQ9XCIxN1wiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLW1vdmUtYmFja2dyb3VuZCB7XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyOCAyOFwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHJlY3Qgb3BhY2l0eT1cIjAuM1wiIHg9XCI4XCIgeT1cIjhcIiB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIi8+PHBhdGggZD1cIk0xLDFWMTNIMTNWMUgxWk0xMiwxMkgyVjJIMTJWMTJaXCIvPjxwYXRoIGQ9XCJNMTUsMTVWMjdIMjdWMTVIMTVaTTI2LDI2SDE2VjE2SDI2VjI2WlwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLW1vdmUtZm9yZWdyb3VuZCB7XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyOCAyOFwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggb3BhY2l0eT1cIjAuM1wiIGQ9XCJNMSwxVjEzSDEzVjFIMVpNMTIsMTJIMlYySDEyVjEyWlwiLz48cGF0aCBvcGFjaXR5PVwiMC4zXCIgZD1cIk0xNSwxNVYyN0gyN1YxNUgxNVpNMjYsMjZIMTZWMTZIMjZWMjZaXCIvPjxyZWN0IHg9XCI4XCIgeT1cIjhcIiB3aWR0aD1cIjEzXCIgaGVpZ2h0PVwiMTNcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG5cbiAgJi5pY29uLWFsaWduLWxlZnQge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIHN0eWxlPVwiZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMiAyMjtcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPi5zdDB7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7fTwvc3R5bGU+PGc+PGcgaWQ9XCJYTUxJRF8zNV9cIj48cGF0aCBpZD1cIlhNTElEXzM2X1wiIGNsYXNzPVwic3QwXCIgZD1cIk0xLDIxaDFWMUgxVjIxeiBNNCwxM3Y0aDE2di00SDR6IE0xMiw1SDR2NGg4VjV6XCIvPjwvZz48L2c+PC9zdmc+Jyk7XG4gIH1cblxuICAmLmljb24tYWxpZ24tY2VudGVyIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBzdHlsZT1cImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjIgMjI7XCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj4uc3Qwe2ZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO308L3N0eWxlPjxnIGlkPVwiWE1MSURfNV9cIj48ZyBpZD1cIlhNTElEXzI0X1wiPjxwb2x5Z29uIGlkPVwiWE1MSURfMjVfXCIgY2xhc3M9XCJzdDBcIiBwb2ludHM9XCIxOSwxMyAxMSwxMyAxMSw5IDE1LDkgMTUsNSAxMSw1IDExLDEgMTAsMSAxMCw1IDYsNSA2LDkgMTAsOSAxMCwxMyAyLDEzIDIsMTcgMTAsMTcgMTAsMjEgMTEsMjEgMTEsMTcgMTksMTcgXHRcdFwiLz48L2c+PC9nPjwvc3ZnPicpO1xuICB9XG5cbiAgJi5pY29uLWFsaWduLXJpZ2h0IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBzdHlsZT1cImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjIgMjI7XCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj4uc3Qwe2ZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO308L3N0eWxlPjxnIGlkPVwiWE1MSURfNV9cIj48ZyBpZD1cIlhNTElEXzQyX1wiPjxwYXRoIGlkPVwiWE1MSURfNDRfXCIgY2xhc3M9XCJzdDBcIiBkPVwiTTIwLDF2MjBoMVYxSDIweiBNMiwxN2gxNnYtNEgyVjE3eiBNMTAsOWg4VjVoLThWOXpcIi8+PC9nPjwvZz48L3N2Zz4nKTtcbiAgfVxuXG4gICYuaWNvbi1hbGlnbi10b3Age1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIHN0eWxlPVwiZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMiAyMjtcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PGcgaWQ9XCJYTUxJRF8zNV9cIj48cGF0aCBpZD1cIlhNTElEXzM2X1wiIGQ9XCJNMSwxdjFoMjBWMUgxeiBNOSw0SDV2MTZoNFY0eiBNMTcsMTJWNGgtNHY4SDE3elwiLz48L2c+PC9nPjwvc3ZnPicpO1xuICB9XG5cbiAgJi5pY29uLWFsaWduLW1pZGRsZSB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgc3R5bGU9XCJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDIyIDIyO1wiIHhtbDpzcGFjZT1cInByZXNlcnZlXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+LnN0MHtmaWxsLXJ1bGU6ZXZlbm9kZDtjbGlwLXJ1bGU6ZXZlbm9kZDt9PC9zdHlsZT48ZyBpZD1cIlhNTElEXzVfXCI+PGcgaWQ9XCJYTUxJRF8yNF9cIj48cG9seWdvbiBpZD1cIlhNTElEXzI1X1wiIGNsYXNzPVwic3QwXCIgcG9pbnRzPVwiMTMsMiAxMywxMCA5LDEwIDksNiA1LDYgNSwxMCAxLDEwIDEsMTEgNSwxMSA1LDE1IDksMTUgOSwxMSAxMywxMSAxMywxOSAxNywxOSAxNywxMSAyMSwxMSAyMSwxMCAxNywxMCAxNywyIFx0XHRcIi8+PC9nPjwvZz48L3N2Zz4nKTtcbiAgfVxuXG4gICYuaWNvbi1hbGlnbi1ib3R0b20ge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIHN0eWxlPVwiZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMiAyMjtcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PGcgaWQ9XCJYTUxJRF8zNV9cIj48cGF0aCBpZD1cIlhNTElEXzM2X1wiIGQ9XCJNMjEsMjB2LTFIMXYxSDIxeiBNOSwxSDV2MTZoNFYxeiBNMTMsOXY4aDRWOUgxM3pcIi8+PC9nPjwvZz48L3N2Zz4nKTtcbiAgfVxuXG4gICYuaWNvbi1hbGlnbi1ob3Jpem9udGFsIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBzdHlsZT1cImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjIgMjI7XCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxnIGlkPVwiWE1MSURfMzVfXCI+PHBhdGggaWQ9XCJYTUxJRF8zNl9cIiBkPVwiTTEsMXYxaDIwVjFIMXogTTAuOTk5OTk5LDE5LjAwMDAwNzZWMjBoMjB2LTAuOTk5OTkyNEgwLjk5OTk5OXogTTkuMDAwMDAxLDIuOTk5OTk5NWgtNHYxNWg0VjIuOTk5OTk5NXogTTE3LDEzLjk5OTk5OVY2Ljk5OTk5ODZoLTMuOTk5OTk5djcuMDAwMDAwNUgxN3pcIi8+PC9nPjwvZz48L3N2Zz4nKTtcbiAgfVxuXG4gICYuaWNvbi1hbGlnbi12ZXJ0aWNhbCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgc3R5bGU9XCJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDIyIDIyO1wiIHhtbDpzcGFjZT1cInByZXNlcnZlXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48ZyBpZD1cIlhNTElEXzM1X1wiPjxwYXRoIGlkPVwiWE1MSURfMzZfXCIgZD1cIk0wLjk5OTk5OTgsMjFoMXYtMjBoLTFWMjF6IE0xOS4wMDAwMDc2LDIxSDIwdi0yMGgtMC45OTk5OTI0VjIxeiBNMi45OTk5OTk1LDEyLjk5OTk5OXYzLjk5OTk5OWgxNSB2LTMuOTk5OTk5SDIuOTk5OTk5NXogTTEzLjk5OTk5OSw0Ljk5OTk5OUg2Ljk5OTk5ODZ2NGg3LjAwMDAwMDVWNC45OTk5OTl6XCIvPjwvZz48L2c+PC9zdmc+Jyk7XG4gIH1cblxuICAvLyBGb3JtYXRzXG5cbiAgJi5pY29uLWZvcm1hdC1wZGYge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIHN0eWxlPVwiZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMiAyMjtcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggaWQ9XCJYTUxJRF8yX1wiIGQ9XCJNMiwyMWgxOFY0bC0zLjk3OTE2Ni00TDIsMFYyMXogTTE5LDh2MTJIM1YxaDEybDQsNFY4elwiLz48L2c+PGc+PHBhdGggZD1cIk05Ljk5OTYzMjgsNy4yOTk0MTIzTDkuOTk5NjMyOCw3LjI5OTQxMjNDMTAuMDk4ODI0NSw3LjI5OTQxMjMsMTAuMDk4ODI0NSw3LjI5OTQxMjMsOS45OTk2MzI4LDcuMjk5NDEyM1x0YzAuMDk5MTkxNy0wLjQwMDQ0MDcsMC4yMDAyMjAxLTAuNjAwNjYxOCwwLjIwMDIyMDEtMC45MDAwNzM1VjYuMTk5MTE4MWMwLjA5OTE5MTctMC40OTk2MzI0LDAuMDk5MTkxNy0wLjkwMDA3MzUsMC0wLjk5OTI2NTIgYzAsMCwwLDAsMC0wLjA5OTE5MTdsLTAuMDk5MTkxNy0wLjA5OTE5MTdsMCwwbDAsMGMwLDAsMCwwLjA5OTE5MTctMC4wOTkxOTE3LDAuMDk5MTkxNyBDOS43OTk0MTE4LDUuNjk5NDg1OCw5Ljc5OTQxMTgsNi4zOTkzMzg3LDkuOTk5NjMyOCw3LjI5OTQxMjNMOS45OTk2MzI4LDcuMjk5NDEyM3ogTTcsMTQuMjAwNTg3M1x0Yy0wLjIwMDIyMDEsMC4wOTkxOTI2LTAuNDAwNDQwNywwLjIwMDIyMTEtMC40OTk2MzI4LDAuMjk5NDExOGMtMC42OTk4NTI5LDAuNjAwNjYxMy0xLjE5OTQ4NTgsMS4zMDA1MTQyLTEuMzAwNTE0MiwxLjU5OTkyNjlsMCwwIGwwLDBsMCwwQzUuNzk4Njc3NCwxNi4wMDA3MzQzLDYuMzk5MzM4NywxNS40MDAwNzQsNywxNC4yMDA1ODczQzcuMDk5MTkxNywxNC4yMDA1ODczLDcuMDk5MTkxNywxNC4yMDA1ODczLDcsMTQuMjAwNTg3MyBDNy4wOTkxOTE3LDE0LjIwMDU4NzMsNywxNC4yMDA1ODczLDcsMTQuMjAwNTg3M3ogTTE2LjE5OTExOTYsMTIuNjk5ODUzOVx0Yy0wLjA5OTE5MzYtMC4wOTkxOTI2LTAuNDk5NjMzOC0wLjQwMDQ0MTItMS44OTkzMzk3LTAuNDAwNDQxMmMtMC4wOTkxOTI2LDAtMC4wOTkxOTI2LDAtMC4yMDAyMjExLDBsMCwwYzAsMCwwLDAsMCwwLjA5OTE5MjYgYzAuNjk5ODUyOSwwLjI5OTQxMTgsMS4zOTk3MDU5LDAuNDk5NjMyOCwxLjg5OTMzODcsMC40OTk2MzI4YzAuMDk5MTkxNywwLDAuMDk5MTkxNywwLDAuMjAwMjIyLDBsMCwwaDAuMDk5MTkxNyBjMCwwLDAsMCwwLTAuMDk5MTkyNmwwLDBDMTYuMzAwMTQ4LDEyLjc5OTA0NDYsMTYuMTk5MTE5NiwxMi43OTkwNDQ2LDE2LjE5OTExOTYsMTIuNjk5ODUzOXogTTE2LjU5OTU1OTgsMTMuNDk4ODk4NSBjLTAuMjAwMjIyLDAuMDk5MTkxNy0wLjQ5OTYzMzgsMC4yMDAyMjExLTAuOTAwMDc0LDAuMjAwMjIxMWMtMC44MDA4ODE0LDAtMi4wMDAzNjgxLTAuMjAwMjIxMS0yLjk5OTYzMTktMC42OTk4NTI5IGMtMS43MDA5NTU0LDAuMjAwMjIxMS0yLjk5OTYzMjgsMC40MDA0NDAyLTQuMDAwNzM1MywwLjgwMDg4MTRjLTAuMDk5MTkxNywwLTAuMDk5MTkxNywwLTAuMjAwMjIwMSwwLjA5OTE5MTcgQzcuMjk5NDEyMywxNi4wMDA3MzQzLDYuMjk4MzA5OCwxNyw1LjQ5OTI2NTIsMTdjLTAuMjAwMjIwNiwwLTAuMjk5NDEyMywwLTAuNDAwNDQxMi0wLjA5OTE5MTdsLTAuNDk5NjMyNC0wLjI5OTQxMThWMTYuNTAyMjAzXHRDNC41LDE2LjMwMTk4MjksNC41LDE2LjIwMjc5MTIsNC41LDE2LjAwMjU3MTFjMC4wOTkxOTE3LTAuNDk5NjMyOCwwLjY5OTg1MjktMS4zOTk3MDY4LDEuODk5MzM4Ny0yLjA5OTU1OTggYzAuMjAwMjIwMS0wLjA5OTE5MTcsMC40OTk2MzI4LTAuMjk5NDExOCwwLjkwMDA3MzUtMC40OTk2MzI4YzAuMjk5NDExOC0wLjQ5OTYzMjgsMC42MDA2NjEzLTEuMTAwMjk0MSwwLjk5OTI2NTItMS44MDAxNDYxIGMwLjQ5OTYzMjgtMC45OTkyNjU3LDAuODAwODgxNC0yLjAwMDM2ODEsMS4xMDAyOTMyLTIuOTAwNDQxMmwwLDBDOC45OTg1MzA0LDcuNTAzMzA1NCw4Ljc5ODMwOTMsNi44MDM0NTI1LDkuMTk4NzUwNSw1LjQwMTkwOTRDOS4yOTc5NDIyLDUuMDAxNDY4Nyw5LjU5OTE5MTcsNC42MDEwMjgsOS45OTk2MzI4LDQuNjAxMDI4aDAuMjAwMjIwMWMwLjIwMDIyMDEsMCwwLjQwMDQ0MDIsMC4wOTkxOTE3LDAuNjAwNjYxMywwLjIwMDIyMDYgYzAuNjk5ODUyOSwwLjY5OTg1MjksMC40MDA0NDEyLDIuMjk5Nzc5NCwwLDMuNjAwMjk0MWMwLDAuMDk5MTkxNywwLDAuMDk5MTkxNywwLDAuMDk5MTkxNyBjMC40MDA0NDEyLDEuMTAwMjkzMiwwLjk5OTI2NTcsMi4wMDAzNjcyLDEuNTk5OTI2LDIuNjAxMDI4NGMwLjI5OTQxMTgsMC4yMDAyMjExLDAuNDk5NjMyOCwwLjQwMDQ0MDIsMC45MDAwNzQsMC42MDA2NjEzIGMwLjQ5OTYzMjgsMCwwLjkwMDA3MzEtMC4wOTkxOTE3LDEuMzAwNTE0Mi0wLjA5OTE5MTdjMS4xOTk0ODQ4LDAsMi4wMDAzNjgxLDAuMjAwMjIwMSwyLjI5OTc3OTksMC42OTk4NTJcdEMxNywxMi41MDMzMDU0LDE3LDEyLjcwMzUyNTUsMTcsMTIuOTAzNzQ1N0MxNi45MDA4MDgzLDEyLjk5OTI2NTcsMTYuNzk5Nzc5OSwxMy4zMDA1MTQyLDE2LjU5OTU1OTgsMTMuNDk4ODk4NXogTTEwLjA5ODgyNDUsOS41OTkxOTE3QzkuODk4NjAzNCwxMC4yOTkwNDQ2LDkuNDk4MTYyMywxMS4wOTk5MjYsOS4wOTk1NTg4LDEyIGMtMC4yMDAyMjAxLDAuNDAwNDQwMi0wLjQwMDQ0MDIsMC42OTk4NTItMC42MDA2NjEzLDEuMTAwMjk0MWgwLjA5OTE5MTdoMC4wOTkxOTE3bDAsMCBjMS4zMDA1MTQyLTAuNDk5NjMyOCwyLjUtMC44MDA4ODE0LDMuMzAwODgxNC0wLjkwMDA3MzFDMTEuNzk3OTQxMiwxMi4xMDEwMjg0LDExLjY5ODc1MDUsMTIsMTEuNTk3NzIyMSwxMS45MDA4MDgzIEMxMS4wOTk5MjYsMTEuMzAwMTQ3MSwxMC40OTkyNjU3LDEwLjQ5OTI2NTcsMTAuMDk4ODI0NSw5LjU5OTE5MTd6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tZm9ybWF0LXBwdHgge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIi0yMzggMjQwIDIyIDIyXCIgc3R5bGU9XCJlbmFibGUtYmFja2dyb3VuZDpuZXcgLTIzOCAyNDAgMjIgMjI7XCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGlkPVwiWE1MSURfMl9cIiBkPVwiTS0yMzYsMjYxaDE4di0xN2wtMy45NzkxNzE4LTRILTIzNlYyNjF6IE0tMjE5LDI0OHYxMmgtMTZ2LTE5aDEybDQsNFYyNDh6XCIvPjwvZz48Zz48cGF0aCBkPVwiTS0yMjguODIyNjkyOSwyNTAuODY0Njg1MWMwLjEzNzA4NS0wLjA2MDc5MSwwLjIzNDE5MTktMC4yMzAyMjQ2LDAuMzEzMTEwNC0wLjM2NDc0NjFcdGMwLjA3OTI4NDctMC4xMzUxOTI5LDAuMDg2MTgxNi0wLjI5MzUxODEsMC4wODYxODE2LTAuNDczOTM4YzAtMC4yMjIxMDY5LTAuMDYxMzQwMy0wLjQxODY0MDEtMC4xNzIzNjMzLTAuNTYwMTgwN1x0Yy0wLjExMDI5MDUtMC4xNDA1MDI5LTAuMjk2ODc1LTAuMjYyODc4NC0wLjQ2Mjg5MDYtMC4yOTMxNTE5Yy0wLjEyMTA5MzgtMC4wMjMzMTU0LTAuMjM5Njg1MS0wLjAwMTI4MTctMC40NTM1NTIyLDAuMDA5MDk0MiBsLTAuMzExNTIzNCwwLjAxMDM3NnYxLjc5MjU0MTVoMC40NTIzOTI2Qy0yMjguOTgxNTA2MywyNTAuOTkyNzM2OC0yMjguOTU4NjE4MiwyNTAuOTI0OTg3OC0yMjguODIyNjkyOSwyNTAuODY0Njg1MXpcIi8+PHBhdGggZD1cIk0tMjMzLDI1Ni4xMTQxMzU3bDcuMzMzMzEzLDEuMzU1MzQ2N1YyNDVMLTIzMywyNDYuMzI2ODQzM1YyNTYuMTE0MTM1N3ogTS0yMzAuODY2MDg4OSwyNDguMjgxODYwNGwxLjQ5Njg4NzItMC4wOTc3NzgzIGMwLjYwNzc4ODEtMC4wMzk3MzM5LDAuOTA3NTMxNy0wLjA1NTcyNTEsMS4xMDE4MDY2LTAuMDA3MTQxMWMwLjMwMzIyMjcsMC4wNzM2MDg0LDAuNjM3MjA3LDAuMjM0OTg1NCwwLjg0ODMyNzYsMC41MzgxNDdcdGMwLjIxMzg2NzIsMC4zMDcwNjc5LDAuMzU1NTkwOCwwLjc1OTIxNjMsMC4zNTU1OTA4LDEuMjYyMDg1YzAsMC4zODc4Nzg0LTAuMDYyMzE2OSwwLjcxMzA3MzctMC4xODYyNzkzLDAuOTc0MTIxMVx0Yy0wLjEyMzA0NjksMC4yNTkwOTQyLTAuMjc4MDE1MSwwLjQ1OTEwNjQtMC40NjQwNTAzLDAuNjAwMTU4N2MtMC4xODM5NiwwLjEzOTQ2NTMtMC4zOTkxMDg5LDAuMjcwMDE5NS0wLjU1ODc3NjksMC4zMjcyNzA1IGMtMC4zMTQ1NzUyLDAuMDc3NDUzNi0wLjUyODY4NjUsMC4xNzQ3NDM3LTAuOTgwMjg1NiwwLjE1MDgxNzloLTAuNTcwODYxOHYxLjk1NjIzNzhsLTEuMDQyMzU4NC0wLjEwODE1NDNWMjQ4LjI4MTg2MDR6XCIvPjxwYXRoIGQ9XCJNLTIyMS43MjY2ODQ2LDI0N0gtMjI1djloMy4yNzMzMTU0Qy0yMjEuMzI1MzQ3OSwyNTYtMjIxLDI1NS42NzQ2NTIxLTIyMSwyNTUuMjczMzE1NHYtNy41NDY2MzA5XHRDLTIyMSwyNDcuMzI1MzQ3OS0yMjEuMzI1MzQ3OSwyNDctMjIxLjcyNjY4NDYsMjQ3elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbn0iLCIvLyBFbmNvZGVkIFNWRyBCYWNrZ3JvdW5kXG4uZW5jb2RlZC1zdmctbWFzayhAc3ZnKSB7XG4gIEB1cmw6IGBlbmNvZGVVUklDb21wb25lbnQoQHtzdmd9KWA7XG4gIGJhY2tncm91bmQtY29sb3I6IEB0aGVtZUNvbG9yO1xuICAtd2Via2l0LW1hc2staW1hZ2U6IHVybChcImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LEB7dXJsfVwiKTtcbn0iXX0= */ \ No newline at end of file diff --git a/apps/presentationeditor/mobile/resources/css/app-material.css b/apps/presentationeditor/mobile/resources/css/app-material.css index 12b592435..cb5208d7d 100644 --- a/apps/presentationeditor/mobile/resources/css/app-material.css +++ b/apps/presentationeditor/mobile/resources/css/app-material.css @@ -6169,6 +6169,11 @@ i.icon.icon-format-pptx { height: 22px; background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20version%3D%221.1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20viewBox%3D%22-238%20240%2022%2022%22%20style%3D%22enable-background%3Anew%20-238%20240%2022%2022%3B%22%20xml%3Aspace%3D%22preserve%22%20fill%3D%22%23DF6737%22%3E%3Cg%3E%3Cpath%20id%3D%22XMLID_2_%22%20d%3D%22M-236%2C261h18v-17l-3.9791718-4H-236V261z%20M-219%2C248v12h-16v-19h12l4%2C4V248z%22%2F%3E%3C%2Fg%3E%3Cg%3E%3Cpath%20d%3D%22M-228.8226929%2C250.8646851c0.137085-0.060791%2C0.2341919-0.2302246%2C0.3131104-0.3647461%09c0.0792847-0.1351929%2C0.0861816-0.2935181%2C0.0861816-0.473938c0-0.2221069-0.0613403-0.4186401-0.1723633-0.5601807%09c-0.1102905-0.1405029-0.296875-0.2628784-0.4628906-0.2931519c-0.1210938-0.0233154-0.2396851-0.0012817-0.4535522%2C0.0090942%20l-0.3115234%2C0.010376v1.7925415h0.4523926C-228.9815063%2C250.9927368-228.9586182%2C250.9249878-228.8226929%2C250.8646851z%22%2F%3E%3Cpath%20d%3D%22M-233%2C256.1141357l7.333313%2C1.3553467V245L-233%2C246.3268433V256.1141357z%20M-230.8660889%2C248.2818604l1.4968872-0.0977783%20c0.6077881-0.0397339%2C0.9075317-0.0557251%2C1.1018066-0.0071411c0.3032227%2C0.0736084%2C0.637207%2C0.2349854%2C0.8483276%2C0.538147%09c0.2138672%2C0.3070679%2C0.3555908%2C0.7592163%2C0.3555908%2C1.262085c0%2C0.3878784-0.0623169%2C0.7130737-0.1862793%2C0.9741211%09c-0.1230469%2C0.2590942-0.2780151%2C0.4591064-0.4640503%2C0.6001587c-0.18396%2C0.1394653-0.3991089%2C0.2700195-0.5587769%2C0.3272705%20c-0.3145752%2C0.0774536-0.5286865%2C0.1747437-0.9802856%2C0.1508179h-0.5708618v1.9562378l-1.0423584-0.1081543V248.2818604z%22%2F%3E%3Cpath%20d%3D%22M-221.7266846%2C247H-225v9h3.2733154C-221.3253479%2C256-221%2C255.6746521-221%2C255.2733154v-7.5466309%09C-221%2C247.3253479-221.3253479%2C247-221.7266846%2C247z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); } +i.icon.icon-format-odp { + width: 22px; + height: 22px; + background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg%20version%3D%221.1%22%20id%3D%22Layer_1%22%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20xmlns%3Axlink%3D%22http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink%22%20x%3D%220px%22%20y%3D%220px%22%20viewBox%3D%22-286%20409.89%2022%2022%22%20style%3D%22enable-background%3Anew%20-286%20409.89%2022%2022%3B%22%20xml%3Aspace%3D%22preserve%22%20fill%3D%22%23DF6737%22%3E%3Cg%3E%3Cpath%20id%3D%22XMLID_2_%22%20d%3D%22M-284%2C430.89h18v-17l-3.979-4H-284V430.89z%20M-267%2C417.89v12h-16v-19h12l4%2C4V417.89z%22%2F%3E%3C%2Fg%3E%3Cpath%20d%3D%22M-281.655%2C419.661c0%2C0%2C1.036-1.266%2C3.529-1.381c2.493-0.115%2C3.107%2C0.499%2C3.107%2C0.499s1.072-0.873%2C2.634-0.984%20c1.473-0.106%2C2.244%2C0.134%2C3.657%2C0.639c-3.107-0.038-5.408%2C1.189-6.022%2C1.956C-276.17%2C419.163-278.817%2C418.817-281.655%2C419.661z%22%2F%3E%3Cpath%20d%3D%22M-278.663%2C415.979c1.458-0.767%2C2.864-0.857%2C5.063%2C0c1.189-0.652%2C3.414-0.307%2C4.68%2C0.269c-3.145-0.23-4.104%2C0.422-4.68%2C0.69%09C-274.367%2C416.056-276.86%2C415.595-278.663%2C415.979z%22%2F%3E%3Cg%3E%3Cpath%20d%3D%22M-281.721%2C425.011c0-0.465%2C0.07-0.855%2C0.209-1.172c0.104-0.232%2C0.246-0.441%2C0.425-0.626s0.376-0.322%2C0.59-0.411%20c0.285-0.121%2C0.613-0.181%2C0.985-0.181c0.673%2C0%2C1.212%2C0.208%2C1.616%2C0.626c0.404%2C0.418%2C0.606%2C0.998%2C0.606%2C1.742%20c0%2C0.737-0.2%2C1.314-0.601%2C1.731c-0.401%2C0.417-0.938%2C0.625-1.608%2C0.625c-0.679%2C0-1.22-0.207-1.621-0.622%09C-281.521%2C426.31-281.721%2C425.739-281.721%2C425.011z%20M-280.771%2C424.981c0%2C0.517%2C0.119%2C0.909%2C0.358%2C1.176%09c0.239%2C0.268%2C0.542%2C0.4%2C0.91%2C0.4c0.368%2C0%2C0.669-0.132%2C0.905-0.397c0.236-0.265%2C0.354-0.662%2C0.354-1.191%09c0-0.523-0.115-0.914-0.344-1.172s-0.535-0.387-0.915-0.387c-0.38%2C0-0.687%2C0.131-0.919%2C0.392%20C-280.654%2C424.062-280.771%2C424.455-280.771%2C424.981z%22%2F%3E%3Cpath%20d%3D%22M-276.573%2C422.699h1.686c0.38%2C0%2C0.67%2C0.029%2C0.87%2C0.088c0.267%2C0.079%2C0.498%2C0.219%2C0.689%2C0.421%20c0.191%2C0.201%2C0.336%2C0.448%2C0.436%2C0.74s0.15%2C0.651%2C0.15%2C1.079c0%2C0.377-0.047%2C0.7-0.141%2C0.973c-0.114%2C0.333-0.277%2C0.602-0.489%2C0.808%20c-0.16%2C0.155-0.376%2C0.277-0.648%2C0.364c-0.204%2C0.064-0.476%2C0.097-0.816%2C0.097h-1.736V422.699z%20M-275.65%2C423.472v3.026h0.689%20c0.257%2C0%2C0.443-0.015%2C0.558-0.044c0.149-0.037%2C0.274-0.101%2C0.373-0.19c0.099-0.089%2C0.18-0.236%2C0.241-0.44%20c0.062-0.205%2C0.094-0.483%2C0.094-0.837s-0.031-0.624-0.094-0.813c-0.062-0.189-0.149-0.337-0.262-0.442%20c-0.112-0.106-0.254-0.178-0.427-0.215c-0.129-0.029-0.381-0.044-0.757-0.044H-275.65z%22%2F%3E%3Cpath%20d%3D%22M-271.96%2C427.268v-4.569h1.479c0.562%2C0%2C0.927%2C0.023%2C1.098%2C0.069c0.262%2C0.068%2C0.48%2C0.218%2C0.657%2C0.447%20s0.265%2C0.525%2C0.265%2C0.89c0%2C0.28-0.051%2C0.516-0.152%2C0.707s-0.231%2C0.342-0.388%2C0.45c-0.157%2C0.109-0.316%2C0.182-0.479%2C0.217%09c-0.221%2C0.044-0.539%2C0.065-0.957%2C0.065h-0.602v1.724H-271.96z%20M-271.038%2C423.472v1.297h0.505c0.363%2C0%2C0.606-0.024%2C0.729-0.072%20c0.122-0.048%2C0.219-0.122%2C0.288-0.225c0.069-0.102%2C0.104-0.22%2C0.104-0.354c0-0.167-0.049-0.304-0.146-0.412%09c-0.098-0.107-0.222-0.176-0.371-0.202c-0.109-0.021-0.331-0.031-0.663-0.031H-271.038z%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"); +} .navbar i.icon.icon-undo { width: 22px; height: 22px; @@ -6335,4 +6340,3 @@ html.pixel-ratio-3 .numbers li { height: 100%; background-size: contain; } -/*# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvaW50cm8ubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvZ3JpZC5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9fbWl4aW5zLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL3ZpZXdzLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL3BhZ2VzLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL3Rvb2xiYXJzLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL3Rvb2xiYXJzLXBhZ2VzLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL3NlYXJjaGJhci5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9tZXNzYWdlYmFyLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2ljb25zLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2JhZGdlcy5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9jb250ZW50LWJsb2NrLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2xpc3RzLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2Zvcm1zLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2Zsb2F0aW5nLWJ1dHRvbi5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9tb2RhbHMubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvcmlwcGxlLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL2FwcHMvY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9tYXRlcmlhbC9fYnV0dG9uLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL3BhbmVscy5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC90YWJzLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL21lc3NhZ2VzLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL3N0YXR1c2Jhci5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9wcmVsb2FkZXIubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvcHJvZ3Jlc3NiYXIubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvcGlja2VyLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL25vdGlmaWNhdGlvbnMubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvZGlzYWJsZWQubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvYXBwcy9jb21tb24vbW9iaWxlL3Jlc291cmNlcy9sZXNzL21hdGVyaWFsL19jb250YWluZXIubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvYXBwcy9jb21tb24vbW9iaWxlL3Jlc291cmNlcy9sZXNzL21hdGVyaWFsL19kYXRhdmlldy5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy9hcHBzL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvbWF0ZXJpYWwvX2xpc3R2aWV3Lmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL2FwcHMvY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9tYXRlcmlhbC9fY29udGV4dG1lbnUubGVzcyIsIi9Wb2x1bWVzL1N0b3JhZ2UvRGV2ZWxvcC9SZXBvc2l0b3JpZXMvd2ViLWFwcHMvYXBwcy9jb21tb24vbW9iaWxlL3Jlc291cmNlcy9sZXNzL21hdGVyaWFsL19jb2xvci1wYWxldHRlLmxlc3MiLCIvVm9sdW1lcy9TdG9yYWdlL0RldmVsb3AvUmVwb3NpdG9yaWVzL3dlYi1hcHBzL2FwcHMvY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9tYXRlcmlhbC9fYWJvdXQubGVzcyIsIm1hdGVyaWFsL19zZWFyY2gubGVzcyIsIm1hdGVyaWFsL19pY29ucy5sZXNzIiwiL1ZvbHVtZXMvU3RvcmFnZS9EZXZlbG9wL1JlcG9zaXRvcmllcy93ZWItYXBwcy9hcHBzL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvX21peGlucy5sZXNzIiwiYXBwLW1hdGVyaWFsLmxlc3MiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7QUFBTTtBQUFNO0VBQ1Isa0JBQUE7RUFDQSxZQUFBO0VBQ0EsV0FBQTtFQUNBLGtCQUFBOztBQUVKO0VBQ0ks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RTtBQXJCSixRQUtFLEdBZ0JFO0VBQ0UsV0FBQTtFQUNBLFlBQUE7RUFDQSx5QkFBQTtFQUNBLHNCQUFBOztBQTFCTixRQU1FLEdBZ0JFLE9BTUU7QUEzQk4sUUFLRSxHQWdCRSxPQU1FO0VBQ0UsV0FBQTtFQUNBLGtCQUFBO0VBQ0Esa0JBQUE7RUFDQSxRQUFBOztBQVFSLGFBQ0U7RUFDSSxtQkFBQTs7QUFGTixhQUtFO0VBQ0UsU0FBQTtFQUNBLFlBQUE7O0FBUEosYUFLRSxHQUlFO0VBQ0UseUNBQUE7O0FBT04sWUFDRTtFQUNFLGdCQUFBO0VBQ0EsbUJBQUE7O0FBSEosWUFDRSxLQUlFO0VBQ0UsU0FBQTtFQUNBLFlBQUE7RUFDQSx5Q0FBQTtFQUNBLFdBQUE7RUFDQSxZQUFBOztBQU9OLFlBQ0U7RUFDRSxXQUFBO0VBQ0EsWUFBQTtFQUNBLFdBQUE7O0FBSkosWUFDRSxHQUtFO0VBQ0UsV0FBQTtFQUNBLFlBQUE7RUFDQSx3QkFBQSIsInNvdXJjZXNDb250ZW50IjpbIkBpbWdCYXNlVXJsOiBcIi4uL2ltZ1wiO1xuaHRtbCwgYm9keSwgLmZyYW1ld29yazctcm9vdCB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG59XG5ib2R5IHtcbiAgICBmb250LWZhbWlseTogUm9ib3RvLCBOb3RvLCBIZWx2ZXRpY2EsIEFyaWFsLCBzYW5zLXNlcmlmO1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGNvbG9yOiAjMjEyMTIxO1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBsaW5lLWhlaWdodDogMS41O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDoxMDAlO1xuICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cbi5mcmFtZXdvcms3LXJvb3Qge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG4qIHtcbiAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7XG4gICAgLXdlYmtpdC10b3VjaC1jYWxsb3V0Om5vbmU7XG59XG5hLCBpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCB7XG4gICAgb3V0bGluZTogMDtcbn1cblxuYSB7XG4gICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgIGNvbG9yOiBAdGhlbWVDb2xvcjtcbn1cbnAge1xuICAgIG1hcmdpbjogMWVtIDA7XG59IiwiLyogPT09IEdyaWQgPT09ICovXG4ucm93IHtcbiAgICAuZmxleGJveCgpO1xuICAgIC5qdXN0aWZ5LWNvbnRlbnQoc3BhY2UtYmV0d2Vlbik7XG4gICAgLmZsZXgtd3JhcCh3cmFwKTtcbiAgICAuYWxpZ24taXRlbXMoZmxleC1zdGFydCk7XG4gICAgPiBbY2xhc3MqPVwiY29sLVwiXSB7XG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxufVxuQGNvbHM6IDUsIDEwLCAxNSwgMjAsIDI1LCAzMCwgMTAwLzMsIDM1LCA0MCwgNDUsIDUwLCA1NSwgNjAsIDY1LCAxMDAqKDIvMyksIDcwLCA3NSwgODAsIDg1LCA5MCwgOTUsIDEwMDtcbi5yb3cge1xuICAgIC5jb2wtYXV0byB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cbiAgICAuLShAaTogbGVuZ3RoKEBjb2xzKSkgd2hlbiAoQGkgPiAwKSB7XG4gICAgICAgIEBkaXZpZGVyOiBlKGV4dHJhY3QoQGNvbHMsIEBpKSk7XG4gICAgICAgIEBjbGFzc05hbWU6IGBNYXRoLmZsb29yKEB7ZGl2aWRlcn0pYDtcbiAgICAgICAgQG46IGAxMDAvcGFyc2VGbG9hdChAe2RpdmlkZXJ9KWA7XG4gICAgICAgIEBuLTE6IEBuIC0gMTtcbiAgICAgICAgLmNvbC1Ae2NsYXNzTmFtZX0ge1xuICAgICAgICAgICAgd2lkdGg6IH5cIkB7ZGl2aWRlcn0lXCI7XG4gICAgICAgICAgICB3aWR0aDogflwiLXdlYmtpdC1jYWxjKCgxMDAlIC0gMTZweCpAe24tMX0pIC8gQHtufSlcIjsgICBcbiAgICAgICAgICAgIHdpZHRoOiB+XCJjYWxjKCgxMDAlIC0gMTZweCpAe24tMX0pIC8gQHtufSlcIjsgICBcbiAgICAgICAgfVxuICAgICAgICAmLm5vLWd1dHRlciB7XG4gICAgICAgICAgICAuY29sLUB7Y2xhc3NOYW1lfSB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IH5cIkB7ZGl2aWRlcn0lXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLi0oKEBpIC0gMSkpO1xuICAgIH0gLi07XG4gICAgLi0tKEBqOiAxKSB3aGVuIChAaiA8IGxlbmd0aChAY29scykpIHtcbiAgICAgICAgQGRpdmlkZXI6IGUoZXh0cmFjdChAY29scywgQGopKTtcbiAgICAgICAgQGNsYXNzTmFtZTogYE1hdGguZmxvb3IoQHtkaXZpZGVyfSlgO1xuICAgICAgICAuY29sLWF1dG86bnRoLWxhc3QtY2hpbGQoQHtqfSksIC5jb2wtYXV0bzpudGgtbGFzdC1jaGlsZChAe2p9KSB+IC5jb2wtYXV0byB7XG4gICAgICAgICAgICBAai0xOiBAaiAtIDE7ICBcbiAgICAgICAgICAgIHdpZHRoOiAxMDAlIC8gQGo7XG4gICAgICAgICAgICB3aWR0aDogflwiLXdlYmtpdC1jYWxjKCgxMDAlIC0gMTZweCpAe2otMX0pIC8gQHtqfSlcIjsgICBcbiAgICAgICAgICAgIHdpZHRoOiB+XCJjYWxjKCgxMDAlIC0gMTZweCpAe2otMX0pIC8gQHtqfSlcIjsgICBcbiAgICAgICAgfVxuICAgICAgICAmLm5vLWd1dHRlciB7XG4gICAgICAgICAgICAuY29sLWF1dG86bnRoLWxhc3QtY2hpbGQoQHtqfSksIC5jb2wtYXV0bzpudGgtbGFzdC1jaGlsZChAe2p9KSB+IC5jb2wtYXV0byB7XG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCUgLyBAajtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAuLS0oKEBqICsgMSkpO1xuICAgIH0gLi0tO1xuICAgIFxufVxuXG5AbWVkaWEgYWxsIGFuZCAobWluLXdpZHRoOjc2OHB4KSB7XG4gICAgLnJvdyB7XG4gICAgICAgIC4tKEBpOiBsZW5ndGgoQGNvbHMpKSB3aGVuIChAaSA+IDApIHtcbiAgICAgICAgICAgIEBkaXZpZGVyOiBlKGV4dHJhY3QoQGNvbHMsIEBpKSk7XG4gICAgICAgICAgICBAY2xhc3NOYW1lOiBgTWF0aC5mbG9vcihAe2RpdmlkZXJ9KWA7XG4gICAgICAgICAgICBAbjogYDEwMC9wYXJzZUZsb2F0KEB7ZGl2aWRlcn0pYDtcbiAgICAgICAgICAgIEBuLTE6IEBuIC0gMTtcbiAgICAgICAgICAgIC50YWJsZXQtQHtjbGFzc05hbWV9IHtcbiAgICAgICAgICAgICAgICB3aWR0aDogflwiQHtkaXZpZGVyfSVcIjtcbiAgICAgICAgICAgICAgICB3aWR0aDogflwiLXdlYmtpdC1jYWxjKCgxMDAlIC0gMTZweCpAe24tMX0pIC8gQHtufSlcIjsgICBcbiAgICAgICAgICAgICAgICB3aWR0aDogflwiY2FsYygoMTAwJSAtIDE2cHgqQHtuLTF9KSAvIEB7bn0pXCI7ICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmLm5vLWd1dHRlciB7XG4gICAgICAgICAgICAgICAgLnRhYmxldC1Ae2NsYXNzTmFtZX0ge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogflwiQHtkaXZpZGVyfSVcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAuLSgoQGkgLSAxKSk7XG4gICAgICAgIH0gLi07XG4gICAgICAgIC4tLShAajogMSkgd2hlbiAoQGogPCBsZW5ndGgoQGNvbHMpKSB7XG4gICAgICAgICAgICAudGFibGV0LWF1dG86bnRoLWxhc3QtY2hpbGQoQHtqfSksIC50YWJsZXQtYXV0bzpudGgtbGFzdC1jaGlsZChAe2p9KSB+IC5jb2wtYXV0byB7XG4gICAgICAgICAgICAgICAgQGotMTogQGogLSAxOyAgXG4gICAgICAgICAgICAgICAgd2lkdGg6IDEwMCUgLyBAajtcbiAgICAgICAgICAgICAgICB3aWR0aDogflwiLXdlYmtpdC1jYWxjKCgxMDAlIC0gMTZweCpAe2otMX0pIC8gQHtqfSlcIjsgICBcbiAgICAgICAgICAgICAgICB3aWR0aDogflwiY2FsYygoMTAwJSAtIDE2cHgqQHtqLTF9KSAvIEB7an0pXCI7ICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmLm5vLWd1dHRlciB7XG4gICAgICAgICAgICAgICAgLnRhYmxldC1hdXRvOm50aC1sYXN0LWNoaWxkKEB7an0pLCAudGFibGV0LWF1dG86bnRoLWxhc3QtY2hpbGQoQHtqfSkgfiAudGFibGV0LWF1dG8ge1xuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTAwJSAvIEBqO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC4tLSgoQGogKyAxKSk7XG4gICAgICAgIH0gLi0tO1xuICAgIH1cblxufVxuIiwiLnRyYW5zaXRpb24oQGQpIHtcbiAgICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IEBkO1xuICAgIHRyYW5zaXRpb24tZHVyYXRpb246IEBkO1xufVxuLmRlbGF5KEBkKSB7XG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLWRlbGF5OiBAZDtcbiAgICB0cmFuc2l0aW9uLWRlbGF5OiBAZDtcbn1cbi50cmFuc2Zvcm0oQHQpIHtcbiAgICAtd2Via2l0LXRyYW5zZm9ybTogQHQ7XG4gICAgdHJhbnNmb3JtOiBAdDtcbn1cbi50cmFuc2Zvcm0tb3JpZ2luKEB0bykge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogQHRvO1xuICAgIHRyYW5zZm9ybS1vcmlnaW46IEB0bztcbn1cbi50cmFuc2xhdGUzZChAeDowLCBAeTowLCBAejowKSB7XG4gICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKEB4LEB5LEB6KTtcbiAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKEB4LEB5LEB6KTtcbn1cbi5hbmltYXRpb24oQGEpIHtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogQGE7XG4gICAgYW5pbWF0aW9uOiBAYTtcbn1cbi5zY3JvbGxhYmxlKCl7XG4gICAgb3ZlcmZsb3c6IGF1dG87XG4gICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoO1xufVxuLmZsZXhib3goKSB7XG4gICAgZGlzcGxheTogLXdlYmtpdC1ib3g7XG4gICAgZGlzcGxheTogLW1zLWZsZXhib3g7XG4gICAgZGlzcGxheTogLXdlYmtpdC1mbGV4O1xuICAgIGRpc3BsYXk6IGZsZXg7XG59XG4uZmxleGJveC1pbmxpbmUoKSB7XG4gICAgZGlzcGxheTogLXdlYmtpdC1pbmxpbmUtYm94O1xuICAgIGRpc3BsYXk6IC1tcy1pbmxpbmUtZmxleGJveDtcbiAgICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1mbGV4O1xuICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xufVxuLmZsZXgtd3JhcChAZncpIHdoZW4gKEBmdyA9IG5vd3JhcCkge1xuICAgIC13ZWJraXQtYm94LWxpbmVzOiBzaW5nbGU7XG4gICAgLW1vei1ib3gtbGluZXM6IHNpbmdsZTtcbiAgICAtd2Via2l0LWZsZXgtd3JhcDogbm93cmFwO1xuICAgIC1tcy1mbGV4LXdyYXA6IG5vbmU7XG4gICAgLW1zLWZsZXgtd3JhcDogbm93cmFwO1xuICAgIGZsZXgtd3JhcDogbm93cmFwO1xufVxuLmZsZXgtd3JhcChAZncpIHdoZW4gKEBmdyA9IHdyYXApIHtcbiAgICAtd2Via2l0LWJveC1saW5lczogbXVsdGlwbGU7XG4gICAgLW1vei1ib3gtbGluZXM6IG11bHRpcGxlO1xuICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwO1xuICAgIC1tcy1mbGV4LXdyYXA6IHdyYXA7XG4gICAgZmxleC13cmFwOiB3cmFwO1xufVxuLmZsZXgtd3JhcChAZncpIHdoZW4gbm90IChAZncgPSB3cmFwKSBhbmQgbm90IChAZncgPSBub3dyYXApIHtcbiAgICAtd2Via2l0LWZsZXgtd3JhcDogQGZ3O1xuICAgIC1tcy1mbGV4LXdyYXA6IEBmdztcbiAgICBmbGV4LXdyYXA6IEBmdztcbn1cbi5mbGV4LXNocmluayhAZnMpIHtcbiAgICAtd2Via2l0LWJveC1mbGV4OiBAZnM7XG4gICAgLXdlYmtpdC1mbGV4LXNocmluazogQGZzO1xuICAgIC1tcy1mbGV4OiAwIEBmcyBhdXRvO1xuICAgIGZsZXgtc2hyaW5rOiBAZnM7XG59XG4uanVzdGlmeS1jb250ZW50KEBqYykgd2hlbiAoQGpjID0gZmxleC1zdGFydCkge1xuICAgIC13ZWJraXQtYm94LXBhY2s6IHN0YXJ0O1xuICAgIC1tcy1mbGV4LXBhY2s6IHN0YXJ0O1xuICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbn1cbi5qdXN0aWZ5LWNvbnRlbnQoQGpjKSB3aGVuIChAamMgPSBmbGV4LWVuZCkge1xuICAgIC13ZWJraXQtYm94LXBhY2s6IGVuZDtcbiAgICAtbXMtZmxleC1wYWNrOiBlbmQ7XG4gICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG59XG4uanVzdGlmeS1jb250ZW50KEBqYykgd2hlbiAoQGpjID0gc3BhY2UtYmV0d2Vlbikge1xuICAgIC13ZWJraXQtYm94LXBhY2s6IGp1c3RpZnk7XG4gICAgLW1zLWZsZXgtcGFjazoganVzdGlmeTtcbiAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG59XG4uanVzdGlmeS1jb250ZW50KEBqYykgd2hlbiBub3QgKEBqYyA9IGZsZXgtc3RhcnQpIGFuZCBub3QgKEBqYyA9IGZsZXgtZW5kKSBhbmQgbm90IChAamMgPSBzcGFjZS1iZXR3ZWVuKSB7XG4gICAgLXdlYmtpdC1ib3gtcGFjazogQGpjO1xuICAgIC1tcy1mbGV4LXBhY2s6IEBqYztcbiAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogQGpjO1xuICAgIGp1c3RpZnktY29udGVudDogQGpjO1xufVxuLmFsaWduLWl0ZW1zKEBhaSkgd2hlbiAoQGFpID0gZmxleC1zdGFydCkge1xuICAgIC13ZWJraXQtYm94LWFsaWduOiBzdGFydDtcbiAgICAtbXMtZmxleC1hbGlnbjogc3RhcnQ7XG4gICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbn1cbi5hbGlnbi1pdGVtcyhAYWkpIHdoZW4gKEBhaSA9IGZsZXgtZW5kKSB7XG4gICAgLXdlYmtpdC1ib3gtYWxpZ246IGVuZDtcbiAgICAtbXMtZmxleC1hbGlnbjogZW5kO1xuICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDtcbn1cbi5hbGlnbi1pdGVtcyhAYWkpIHdoZW4gbm90IChAYWkgPSBmbGV4LXN0YXJ0KSBhbmQgbm90IChAYWkgPSBmbGV4LWVuZCkge1xuICAgIC13ZWJraXQtYm94LWFsaWduOiBAYWk7XG4gICAgLW1zLWZsZXgtYWxpZ246IEBhaTtcbiAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBAYWk7XG4gICAgYWxpZ24taXRlbXM6IEBhaTtcbn1cbi5hbGlnbi1jb250ZW50KEBhaSkge1xuICAgIC1tcy1mbGV4LWxpbmUtcGFjazogQGFpO1xuICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogQGFpO1xuICAgIGFsaWduLWNvbnRlbnQ6IEBhaTtcbn1cbi5hbGlnbi1zZWxmKEBhcykge1xuICAgIC1tcy1mbGV4LWl0ZW0tYWxpZ246IEBhcztcbiAgICAtd2Via2l0LWFsaWduLXNlbGY6IEBhcztcbiAgICBhbGlnbi1zZWxmOiBAYXM7XG59XG4uY2xlYXJmaXgoKSB7XG4gICAgJjpiZWZvcmUsXG4gICAgJjphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6IFwiIFwiO1xuICAgICAgICBkaXNwbGF5OiB0YWJsZTtcbiAgICB9XG4gICAgJjphZnRlciB7XG4gICAgICAgIGNsZWFyOiBib3RoO1xuICAgIH1cbn1cbi5oYWlybGluZShAcG9zaXRpb24sIEBjb2xvcikgd2hlbiAoQHBvc2l0aW9uID0gdG9wKSB7XG4gICAgJjpiZWZvcmUge1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBsZWZ0OiAwO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIGJvdHRvbTogYXV0bztcbiAgICAgICAgcmlnaHQ6IGF1dG87XG4gICAgICAgIGhlaWdodDogMXB4O1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgei1pbmRleDogMTU7XG4gICAgICAgIC50cmFuc2Zvcm0tb3JpZ2luKDUwJSAwJSk7XG4gICAgICAgIGh0bWwucGl4ZWwtcmF0aW8tMiAme1xuICAgICAgICAgICAgLnRyYW5zZm9ybShzY2FsZVkoMC41KSk7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbC5waXhlbC1yYXRpby0zICZ7XG4gICAgICAgICAgICAudHJhbnNmb3JtKHNjYWxlWSgwLjMzKSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4uaGFpcmxpbmUoQHBvc2l0aW9uLCBAY29sb3IpIHdoZW4gKEBwb3NpdGlvbiA9IGxlZnQpIHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgYm90dG9tOiBhdXRvO1xuICAgICAgICByaWdodDogYXV0bztcbiAgICAgICAgd2lkdGg6IDFweDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB6LWluZGV4OiAxNTtcbiAgICAgICAgLnRyYW5zZm9ybS1vcmlnaW4oMCUgNTAlKTtcbiAgICAgICAgaHRtbC5waXhlbC1yYXRpby0yICZ7XG4gICAgICAgICAgICAudHJhbnNmb3JtKHNjYWxlWCgwLjUpKTtcbiAgICAgICAgfVxuICAgICAgICBodG1sLnBpeGVsLXJhdGlvLTMgJntcbiAgICAgICAgICAgIC50cmFuc2Zvcm0oc2NhbGVYKDAuMzMpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi5oYWlybGluZShAcG9zaXRpb24sIEBjb2xvcikgd2hlbiAoQHBvc2l0aW9uID0gYm90dG9tKSB7XG4gICAgJjphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgcmlnaHQ6IGF1dG87XG4gICAgICAgIHRvcDogYXV0bztcbiAgICAgICAgaGVpZ2h0OiAxcHg7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICB6LWluZGV4OiAxNTtcbiAgICAgICAgLnRyYW5zZm9ybS1vcmlnaW4oNTAlIDEwMCUpO1xuICAgICAgICBodG1sLnBpeGVsLXJhdGlvLTIgJntcbiAgICAgICAgICAgIC50cmFuc2Zvcm0oc2NhbGVZKDAuNSkpO1xuICAgICAgICB9XG4gICAgICAgIGh0bWwucGl4ZWwtcmF0aW8tMyAme1xuICAgICAgICAgICAgLnRyYW5zZm9ybShzY2FsZVkoMC4zMykpO1xuICAgICAgICB9XG4gICAgfVxufVxuLmhhaXJsaW5lKEBwb3NpdGlvbiwgQGNvbG9yKSB3aGVuIChAcG9zaXRpb24gPSByaWdodCkge1xuICAgICY6YWZ0ZXIge1xuICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBsZWZ0OiBhdXRvO1xuICAgICAgICBib3R0b206IGF1dG87XG4gICAgICAgIHdpZHRoOiAxcHg7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGNvbG9yO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgei1pbmRleDogMTU7XG4gICAgICAgIC50cmFuc2Zvcm0tb3JpZ2luKDEwMCUgNTAlKTtcbiAgICAgICAgaHRtbC5waXhlbC1yYXRpby0yICZ7XG4gICAgICAgICAgICAudHJhbnNmb3JtKHNjYWxlWCgwLjUpKTtcbiAgICAgICAgfVxuICAgICAgICBodG1sLnBpeGVsLXJhdGlvLTMgJntcbiAgICAgICAgICAgIC50cmFuc2Zvcm0oc2NhbGVYKDAuMzMpKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8vIEZvciByaWdodCBhbmQgYm90dG9tXG4uaGFpcmxpbmUtcmVtb3ZlKEBwb3NpdGlvbikgd2hlbiBub3QgKEBwb3NpdGlvbiA9IGxlZnQpIGFuZCBub3QgKEBwb3NpdGlvbiA9IHRvcCkge1xuICAgICY6YWZ0ZXIge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbn1cbi8vIEZvciBsZWZ0IGFuZCB0b3Bcbi5oYWlybGluZS1yZW1vdmUoQHBvc2l0aW9uKSB3aGVuIG5vdCAoQHBvc2l0aW9uID0gcmlnaHQpIGFuZCBub3QgKEBwb3NpdGlvbiA9IGJvdHRvbSkge1xuICAgICY6YmVmb3JlIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG59XG4vLyBGb3IgcmlnaHQgYW5kIGJvdHRvbVxuLmhhaXJsaW5lLWNvbG9yKEBwb3NpdGlvbiwgQGNvbG9yKSB3aGVuIG5vdCAoQHBvc2l0aW9uID0gbGVmdCkgYW5kIG5vdCAoQHBvc2l0aW9uID0gdG9wKSB7XG4gICAgJjphZnRlciB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBjb2xvcjtcbiAgICB9XG59XG4vLyBGb3IgbGVmdCBhbmQgdG9wXG4uaGFpcmxpbmUtY29sb3IoQHBvc2l0aW9uLCBAY29sb3IpIHdoZW4gbm90IChAcG9zaXRpb24gPSByaWdodCkgYW5kIG5vdCAoQHBvc2l0aW9uID0gYm90dG9tKSB7XG4gICAgJjpiZWZvcmUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAY29sb3I7XG4gICAgfVxufVxuXG4vLyBFbmNvZGVkIFNWRyBCYWNrZ3JvdW5kXG4uZW5jb2RlZC1zdmctYmFja2dyb3VuZChAc3ZnKSB7XG4gICAgQHVybDogYGVuY29kZVVSSUNvbXBvbmVudChAe3N2Z30pYDtcbiAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCxAe3VybH1cIik7XG59XG5cbi8vIFByZXNlcnZlM0Rcbi5wcmVzZXJ2ZTNkKCkge1xuICAgIC13ZWJraXQtdHJhbnNmb3JtLXN0eWxlOiBwcmVzZXJ2ZS0zZDtcbiAgICAtbW96LXRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG4gICAgLW1zLXRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG4gICAgdHJhbnNmb3JtLXN0eWxlOiBwcmVzZXJ2ZS0zZDtcbn1cblxuLy8gU2hhZG93XG4uZGVwdGgoQGxldmVsOjEpIHtcbiAgICAmIHdoZW4gKEBsZXZlbCA9IDEpIHtcbiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggM3B4IHJnYmEoMCwwLDAsMC4xMiksIDAgMXB4IDJweCByZ2JhKDAsMCwwLDAuMjQpO1xuICAgIH1cbiAgICAmIHdoZW4gKEBsZXZlbCA9IDIpIHtcbiAgICAgICAgYm94LXNoYWRvdzogMCAzcHggNnB4IHJnYmEoMCwwLDAsMC4xNiksIDAgM3B4IDZweCByZ2JhKDAsMCwwLDAuMjMpO1xuICAgIH1cbiAgICAmIHdoZW4gKEBsZXZlbCA9IDMpIHtcbiAgICAgICAgYm94LXNoYWRvdzogMCAxMHB4IDIwcHggcmdiYSgwLDAsMCwwLjE5KSwgMCA2cHggNnB4IHJnYmEoMCwwLDAsMC4yMyk7XG4gICAgfVxuICAgICYgd2hlbiAoQGxldmVsID0gNCkge1xuICAgICAgICBib3gtc2hhZG93OiAwIDE0cHggMjhweCByZ2JhKDAsMCwwLDAuMjUpLCAwIDEwcHggMTBweCByZ2JhKDAsMCwwLDAuMjIpO1xuICAgIH1cbiAgICAmIHdoZW4gKEBsZXZlbCA9IDUpIHtcbiAgICAgICAgYm94LXNoYWRvdzogMCAxOXB4IDM4cHggcmdiYSgwLDAsMCwwLjMwKSwgMCAxNXB4IDEycHggcmdiYSgwLDAsMCwwLjIyKTtcbiAgICB9XG59XG5cbi8vIEhpZ2hsaWdodGVkIExpbmtzXG4uYWN0aXZlLWhpZ2hsaWdodChAY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwwLjE1KSkge1xuICAgICY6YmVmb3JlIHtcbiAgICAgICAgY29udGVudDogJyc7XG4gICAgICAgIHdpZHRoOiAxNTIlO1xuICAgICAgICBoZWlnaHQ6IDE1MiU7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgbGVmdDogLTI2JTtcbiAgICAgICAgdG9wOiAtMjYlO1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiAtd2Via2l0LXJhZGlhbC1ncmFkaWVudChjZW50ZXIsIGNpcmNsZSBjb3ZlciwgQGNvbG9yIDY2JSwgcmdiYShyZWQoQGNvbG9yKSxncmVlbihAY29sb3IpLGJsdWUoQGNvbG9yKSwwKSA2NiUpO1xuICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiByYWRpYWwtZ3JhZGllbnQoY2lyY2xlIGF0IGNlbnRlciwgQGNvbG9yIDY2JSwgcmdiYShyZWQoQGNvbG9yKSxncmVlbihAY29sb3IpLGJsdWUoQGNvbG9yKSwwKSA2NiUpO1xuICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSAxMDAlO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgICAgLnRyYW5zaXRpb24oNjAwbXMpO1xuICAgIH1cbiAgICBodG1sOm5vdCgud2F0Y2gtYWN0aXZlLXN0YXRlKSAmOmFjdGl2ZTpiZWZvcmUsICYuYWN0aXZlLXN0YXRlOmJlZm9yZSB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIC50cmFuc2l0aW9uKDE1MG1zKTtcbiAgICB9XG59XG4uYWN0aXZlLWhpZ2hsaWdodC1jb2xvcihAY29sb3IpIHtcbiAgICAmOmJlZm9yZSB7XG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IC13ZWJraXQtcmFkaWFsLWdyYWRpZW50KGNlbnRlciwgY2lyY2xlIGNvdmVyLCBAY29sb3IgNjYlLCByZ2JhKHJlZChAY29sb3IpLGdyZWVuKEBjb2xvciksYmx1ZShAY29sb3IpLDApIDY2JSk7XG4gICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IHJhZGlhbC1ncmFkaWVudChjaXJjbGUgYXQgY2VudGVyLCBAY29sb3IgNjYlLCByZ2JhKHJlZChAY29sb3IpLGdyZWVuKEBjb2xvciksYmx1ZShAY29sb3IpLDApIDY2JSk7XG4gICAgfVxufVxuXG4vLyBObyBTY3JvbGxiYXJcbi5uby1zY3JvbGxiYXIoKSB7XG4gICAgJjo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7XG4gICAgICAgIHdpZHRoOiAwICFpbXBvcnRhbnQ7XG4gICAgICAgIGhlaWdodDogMCAhaW1wb3J0YW50O1xuICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIG9wYWNpdHk6IDAgIWltcG9ydGFudDtcbiAgICB9XG59XG5cbi8vIEJhcnMgSW5wdXRcbi5iYXJzLWlucHV0KCkge1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAzMnB4O1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xuICAgIC1tcy1hcHBlYXJhbmNlOiBub25lO1xuICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICBjb2xvcjogI2ZmZjtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gICAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBwYWRkaW5nOiAwO1xuICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZmZmO1xuICAgICY6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIge1xuICAgICAgICBjb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwxKTtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG59XG4ubm8taGFpcmxpbmVzKCkge1xuICAgICYubm8taGFpcmxpbmVzLCAmLm5vLWhhaXJsaW5lcyB1bCwgJi5uby1oYWlybGluZXMgLmNvbnRlbnQtYmxvY2staW5uZXIge1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICB9XG59XG4ubm8taGFpcmxpbmVzLWJldHdlZW4oKSB7XG4gICAgJi5uby1oYWlybGluZXMtYmV0d2VlbiB7XG4gICAgICAgIC5pdGVtLWlubmVyLCAubGlzdC1idXR0b24sIC5pdGVtLWRpdmlkZXIsIC5saXN0LWdyb3VwLXRpdGxlLCAubGlzdC1ncm91cC10aXRsZSB7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyogPT09IFZpZXdzID09PSAqL1xuLnZpZXdzLCAudmlldyB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB6LWluZGV4OiA1MDAwO1xufVxuLnZpZXdzIHtcbiAgICAuc2Nyb2xsYWJsZSgpO1xufVxuLnZpZXcge1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbn1cbiIsIi8qID09PSBQYWdlcyA9PT0gKi9cblxuLy8gUGFnZXMgYW5pbWF0aW9uc1xuQHBhZ2VEdXJhdGlvbjogMzAwbXM7XG5AbmV3UGFnZU9mZnNldDogNTZweDtcblxuLnBhZ2VzIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG59XG4ucGFnZSB7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICAmLmNhY2hlZCB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxufVxuLnBhZ2Utb24tbGVmdCB7XG4gICAgb3BhY2l0eTogMTtcbiAgICAudHJhbnNsYXRlM2QoMCwwLDApO1xufVxuLnBhZ2Utb24tcmlnaHQge1xuICAgIG9wYWNpdHk6IDA7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgLnRyYW5zbGF0ZTNkKDAsIEBuZXdQYWdlT2Zmc2V0LCAwKTtcbn1cbi5wYWdlLWNvbnRlbnQge1xuICAgIC5zY3JvbGxhYmxlKCk7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHotaW5kZXg6IDE7XG59XG5cbi8vQ2xhc3MgdGhhdCB3aWxsIHRyaWdnZXIgdHJhbnNpdGlvbiBkdXJpbmcgcGFnZSBjdXN0b20gdHJhbnNpdGlvbnMgKGxpa2Ugc3dpcGUtYmFjaylcbi5wYWdlLXRyYW5zaXRpb25pbmcge1xuICAgIC50cmFuc2l0aW9uKEBwYWdlRHVyYXRpb24pO1xufVxuLy8gRnJvbS90byBSaWdodCBUby9mcm9tIENlbnRlciBhbmltYXRpb25zXG4ucGFnZS1mcm9tLXJpZ2h0LXRvLWNlbnRlciB7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgLmFuaW1hdGlvbihwYWdlRnJvbVJpZ2h0VG9DZW50ZXIgQHBhZ2VEdXJhdGlvbiBmb3J3YXJkcyk7XG59XG4ucGFnZS1mcm9tLWNlbnRlci10by1yaWdodCB7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgLmFuaW1hdGlvbihwYWdlRnJvbUNlbnRlclRvUmlnaHQgQHBhZ2VEdXJhdGlvbiBmb3J3YXJkcyk7XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgcGFnZUZyb21SaWdodFRvQ2VudGVyIHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIEBuZXdQYWdlT2Zmc2V0LDApO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgfVxufVxuQGtleWZyYW1lcyBwYWdlRnJvbVJpZ2h0VG9DZW50ZXIge1xuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIEBuZXdQYWdlT2Zmc2V0LDApO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwwLDApO1xuICAgIH1cbn1cbkAtd2Via2l0LWtleWZyYW1lcyBwYWdlRnJvbUNlbnRlclRvUmlnaHQge1xuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwwLDApO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCBAbmV3UGFnZU9mZnNldCwwKTtcbiAgICB9XG59XG5Aa2V5ZnJhbWVzIHBhZ2VGcm9tQ2VudGVyVG9SaWdodCB7XG4gICAgZnJvbSB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwwLDApO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgQG5ld1BhZ2VPZmZzZXQsMCk7XG4gICAgfVxufVxuXG5cbi8vIEZyb20vdG8gQ2VudGVyIFRvL2Zyb20gTGVmdCBhbmltYXRpb25zXG4ucGFnZS1mcm9tLWNlbnRlci10by1sZWZ0IHtcbiAgICAuYW5pbWF0aW9uKHBhZ2VGcm9tQ2VudGVyVG9MZWZ0IEBwYWdlRHVyYXRpb24gZm9yd2FyZHMpO1xufVxuLnBhZ2UtZnJvbS1sZWZ0LXRvLWNlbnRlciB7XG4gICAgLmFuaW1hdGlvbihwYWdlRnJvbUxlZnRUb0NlbnRlciBAcGFnZUR1cmF0aW9uIGZvcndhcmRzKTtcbn1cblxuQC13ZWJraXQta2V5ZnJhbWVzIHBhZ2VGcm9tQ2VudGVyVG9MZWZ0IHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcGFnZUZyb21DZW50ZXJUb0xlZnQge1xuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIHBhZ2VGcm9tTGVmdFRvQ2VudGVyIHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcGFnZUZyb21MZWZ0VG9DZW50ZXIge1xuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgfVxufSIsIi8qID09PSBUb29sYmFycyA9PT0gKi9cblxuLy9Ub29sYmFyL05hdmJhclxuQHRvb2xiYXJCZyA6IEB0aGVtZUNvbG9yO1xuQHRvb2xiYXJDb2xvcjogI2ZmZjtcbkB0b29sYmFyTGlua3NDb2xvcjogI2ZmZjtcbkBuYXZiYXJTaXplOiA1NnB4O1xuQHRvb2xiYXJTaXplOiA0OHB4O1xuXG4vL1RhYiBiYXJcbkB0YWJiYXJTaXplOiA0OHB4O1xuQHRhYmJhckxhYmVsc1NpemU6IDcycHg7XG5AdGFiYmFyTGlua3NDb2xvcjogcmdiYSgyNTUsMjU1LDI1NSwwLjcpO1xuQHRhYmJhckFjdGl2ZUxpbmtzQ29sb3I6IHJnYmEoMjU1LDI1NSwyNTUsMSk7XG5cbi8vIFRvb2xiYXJzIGFuaW1hdGlvbnNcbkB0b29sYmFyRHVyYXRpb246IDMwMG1zO1xuXG4ubmF2YmFyLWlubmVyLCAudG9vbGJhci1pbm5lciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgLmZsZXhib3goKTtcbiAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbn1cbi5uYXZiYXItaW5uZXIge1xuICAgIC5qdXN0aWZ5LWNvbnRlbnQoZmxleC1zdGFydCk7XG59XG4udG9vbGJhci1pbm5lciB7XG4gICAgLmp1c3RpZnktY29udGVudChzcGFjZS1iZXR3ZWVuKTsgICBcbn1cbi5uYXZiYXItaW5uZXIuY2FjaGVkIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuLm5hdmJhciwgLnRvb2xiYXIge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG1hcmdpbjogMDtcbiAgICB6LWluZGV4OiA1MDA7XG4gICAgLXdlYmtpdC1iYWNrZmFjZS12aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIGNvbG9yOiBAdG9vbGJhckNvbG9yO1xuICAgIGIge1xuICAgICAgICBmb250LXdlaWdodDogNTAwO1xuICAgIH1cbn1cbi5uYXZiYXIgfiAudG9vbGJhciB7XG4gICAgei1pbmRleDogNDk5O1xufVxuLm5hdmJhciwgLnRvb2xiYXIsIC5zdWJuYXZiYXIge1xuICAgIGJhY2tncm91bmQ6IEB0b29sYmFyQmc7XG4gICAgYS5saW5rIHtcbiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIGNvbG9yOiBAdG9vbGJhckxpbmtzQ29sb3I7XG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgIC5qdXN0aWZ5LWNvbnRlbnQoY2VudGVyKTtcbiAgICAgICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgICAgIHBhZGRpbmc6IDAgMTZweDtcbiAgICAgICAgbWluLXdpZHRoOiA0OHB4O1xuICAgICAgICAuYWN0aXZlLWhpZ2hsaWdodCgpO1xuICAgICAgICBpK3NwYW4sIGkraSwgc3BhbitpLCBzcGFuK3NwYW4ge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhLmljb24tb25seSB7XG4gICAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgICAgLmZsZXgtc2hyaW5rKDApO1xuICAgIH1cbiAgICBpLmljb24ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG59XG4ubmF2YmFyLCAuc3VibmF2YmFyIHtcbiAgICAuY2VudGVyIHtcbiAgICAgICAgZm9udC1zaXplOiAyMHB4O1xuICAgICAgICBmb250LXdlaWdodDogNTAwO1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgIG1hcmdpbjogMCAxNnB4O1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiBAbmF2YmFyU2l6ZTtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuICAgIH1cbiAgICAubGVmdCwgLnJpZ2h0IHtcbiAgICAgICAgLmZsZXgtc2hyaW5rKDApO1xuICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICAuanVzdGlmeS1jb250ZW50KGZsZXgtc3RhcnQpO1xuICAgICAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG4gICAgLnJpZ2h0IHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgfVxuICAgIC5yaWdodDpmaXJzdC1jaGlsZCB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgcmlnaHQ6IDE2cHg7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICB9XG59XG4ubmF2YmFyIHtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbiAgICBoZWlnaHQ6IEBuYXZiYXJTaXplO1xuICAgIGZvbnQtc2l6ZTogMjBweDtcbiAgICBhLmxpbmsge1xuICAgICAgICBsaW5lLWhlaWdodDogQG5hdmJhclNpemU7XG4gICAgICAgIGhlaWdodDogQG5hdmJhclNpemU7XG4gICAgfVxuICAgIC5wb3B1cCAmIHtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG59XG4uc3VibmF2YmFyIHtcbiAgICBoZWlnaHQ6IEB0b29sYmFyU2l6ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDEwMCU7XG4gICAgei1pbmRleDogMjA7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBwYWRkaW5nOiAwIDE2cHg7XG4gICAgLmZsZXhib3goKTtcbiAgICAuanVzdGlmeS1jb250ZW50KHNwYWNlLWJldHdlZW4pO1xuICAgIC5hbGlnbi1pdGVtcyhjZW50ZXIpO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYS5saW5rIHtcbiAgICAgICAgbGluZS1oZWlnaHQ6IEB0b29sYmFyU2l6ZTtcbiAgICAgICAgaGVpZ2h0OiBAdG9vbGJhclNpemU7XG4gICAgfVxuICAgIC5jZW50ZXIge1xuICAgICAgICBsaW5lLWhlaWdodDogQHRvb2xiYXJTaXplO1xuICAgICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiA1NnB4O1xuICAgICAgICB9XG4gICAgfVxuICAgIC5uYXZiYXIubm8tYm9yZGVyICYge1xuICAgICAgICBtYXJnaW4tdG9wOiAwO1xuICAgIH1cbiAgICAubmF2YmFyLW9uLWxlZnQgJiwgLm5hdmJhci1vbi1yaWdodCAme1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICB9XG4gICAgLm5hdmJhciAmLCAucGFnZSAmIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgICAucGFnZSA+ICYge1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIG1hcmdpbi10b3A6IDA7XG4gICAgfVxuICAgID4gLmJ1dHRvbnMtcm93IHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuICAgIC5zZWFyY2hiYXIsICYuc2VhcmNoYmFyIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIH1cbiAgICAmLnNlYXJjaGJhciwgLnNlYXJjaGJhciB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB9XG4gICAgLnNlYXJjaGJhciB7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHRvcDogMDtcbiAgICB9XG4gICAgLmNlbnRlciB7XG5cbiAgICB9XG59XG4udG9vbGJhciB7XG4gICAgbGVmdDogMDtcbiAgICBib3R0b206IDA7XG4gICAgaGVpZ2h0OiBAdG9vbGJhclNpemU7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGEubGluayB7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiBAdG9vbGJhclNpemU7XG4gICAgICAgIGhlaWdodDogQHRvb2xiYXJTaXplO1xuICAgIH1cbiAgICBhIHtcbiAgICAgICAgLmZsZXgtc2hyaW5rKDEpO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7XG4gICAgfVxufVxuXG4vLyBUYWJiYXJcbi50YWJiYXIge1xuICAgIHotaW5kZXg6IDUwMDE7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBib3R0b206IGF1dG87XG4gICAgdG9wOiAwO1xuICAgIC50b29sYmFyLWlubmVyIHtcbiAgICAgICAgcGFkZGluZy1sZWZ0OiAwO1xuICAgICAgICBwYWRkaW5nLXJpZ2h0OiAwO1xuICAgIH1cbiAgICBhLmxpbmsge1xuICAgICAgICBsaW5lLWhlaWdodDogMS40O1xuICAgIH1cbiAgICBhLnRhYi1saW5rLCBhLmxpbmsge1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7XG4gICAgICAgIHBhZGRpbmctcmlnaHQ6IDA7XG4gICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgIC5qdXN0aWZ5LWNvbnRlbnQoY2VudGVyKTtcbiAgICAgICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgICAgIC1tcy1mbGV4OiAxO1xuICAgICAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgICAgICAtbW96LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgfVxuICAgIGkuaWNvbiB7XG4gICAgICAgIGhlaWdodDogMjRweDtcbiAgICB9XG4gICAgYS50YWItbGluayB7XG4gICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgY29sb3I6IEB0YWJiYXJMaW5rc0NvbG9yO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICYuYWN0aXZlLCBodG1sOm5vdCgud2F0Y2gtYWN0aXZlLXN0YXRlKSAmOmFjdGl2ZSwgJi5hY3RpdmUtc3RhdGUge1xuICAgICAgICAgICAgY29sb3I6IEB0YWJiYXJBY3RpdmVMaW5rc0NvbG9yO1xuICAgICAgICB9XG4gICAgfVxuICAgIC50YWItbGluay1oaWdobGlnaHQge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgaGVpZ2h0OiAzcHg7XG4gICAgICAgIGJhY2tncm91bmQ6IGRhcmtlbihAdGhlbWVDb2xvciwgMTUlKTtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgyNTUsMjU1LDI1NSwwLjUpO1xuICAgICAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgfVxufVxuLnRhYmJhci1sYWJlbHMge1xuICAgIGhlaWdodDogQHRhYmJhckxhYmVsc1NpemU7XG4gICAgYS50YWItbGluaywgYS5saW5rIHtcbiAgICAgICAgcGFkZGluZy10b3A6IDEycHg7XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiAxMnB4O1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIC5qdXN0aWZ5LWNvbnRlbnQoc3BhY2UtYmV0d2Vlbik7XG4gICAgfVxuICAgIHNwYW4udGFiYmFyLWxhYmVsIHtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICB9XG59XG4udGFiYmFyLXNjcm9sbGFibGUge1xuICAgIC50b29sYmFyLWlubmVyIHtcbiAgICAgICAgLmp1c3RpZnktY29udGVudChmbGV4LXN0YXJ0KTtcbiAgICAgICAgLm5vLXNjcm9sbGJhcigpO1xuICAgICAgICBvdmVyZmxvdzogYXV0bztcbiAgICB9XG4gICAgYS50YWItbGluaywgYS5saW5rIHtcbiAgICAgICAgd2lkdGg6IGF1dG87XG4gICAgICAgIC5mbGV4LXNocmluaygwKTtcbiAgICAgICAgLW1zLWZsZXg6IDA7XG4gICAgICAgIHBhZGRpbmc6IDAgMTZweDtcbiAgICB9XG59XG4udG9vbGJhci1ib3R0b20ge1xuICAgIGJvdHRvbTogMDtcbiAgICB0b3A6IGF1dG87XG4gICAgLnRhYi1saW5rLWhpZ2hsaWdodCB7XG4gICAgICAgIGJvdHRvbTogYXV0bztcbiAgICAgICAgdG9wOiAwO1xuICAgIH1cbn1cbi5zdWJuYXZiYXIsIC5uYXZiYXIge1xuICAgIGlucHV0W3R5cGU9XCJ0ZXh0XCJdLCBpbnB1dFt0eXBlPVwicGFzc3dvcmRcIl0sIGlucHV0W3R5cGU9XCJzZWFyY2hcIl0sIGlucHV0W3R5cGU9XCJlbWFpbFwiXSwgaW5wdXRbdHlwZT1cInRlbFwiXSwgaW5wdXRbdHlwZT1cInVybFwiXSB7XG4gICAgICAgIC5iYXJzLWlucHV0KCk7XG4gICAgfVxufSIsIi8qID09PSBSZWxhdGlvbiBiZXR3ZWVuIHRvb2xiYXIvbmF2YmFyIHR5cGVzIGFuZCBwYWdlcyA9PT0gKi9cbi5wYWdlLCAudmlldywgLnZpZXdze1xuICAgID4ubmF2YmFyLCA+LnRvb2xiYXIge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgfVxufVxuLnN1Ym5hdmJhciB+IC5wYWdlLWNvbnRlbnQge1xuICAgIHBhZGRpbmctdG9wOiBAdG9vbGJhclNpemU7XG59XG4udG9vbGJhci1maXhlZCwgLnRhYmJhci1maXhlZCB7XG4gICAgLnBhZ2UtY29udGVudCB7XG4gICAgICAgIHBhZGRpbmctdG9wOiBAdG9vbGJhclNpemU7XG4gICAgfVxufVxuLnRhYmJhci1sYWJlbHMtZml4ZWQge1xuICAgIC5wYWdlLWNvbnRlbnQge1xuICAgICAgICBwYWRkaW5nLXRvcDogQHRhYmJhckxhYmVsc1NpemU7XG4gICAgfVxufVxuXG4udG9vbGJhciB+IC5wYWdlLWNvbnRlbnQge1xuICAgIHBhZGRpbmctdG9wOiBAdG9vbGJhclNpemU7XG59XG4udGFiYmFyLWxhYmVscyB+IC5wYWdlLWNvbnRlbnQge1xuICAgIHBhZGRpbmctdG9wOiBAdGFiYmFyTGFiZWxzU2l6ZTtcbn1cbi50b29sYmFyLWJvdHRvbSwgLm1lc3NhZ2ViYXIge1xuICAgIH4gLnBhZ2UtY29udGVudCB7XG4gICAgICAgIHBhZGRpbmctdG9wOiAwO1xuICAgICAgICBwYWRkaW5nLWJvdHRvbTogQHRvb2xiYXJTaXplO1xuICAgIH1cbn1cbi50YWJiYXItbGFiZWxzLnRvb2xiYXItYm90dG9tIH4gLnBhZ2UtY29udGVudCB7XG4gICAgcGFkZGluZy1ib3R0b206IEB0YWJiYXJMYWJlbHNTaXplO1xufVxuLm5hdmJhci1maXhlZCB7XG4gICAgLnBhZ2UtY29udGVudCB7XG4gICAgICAgIHBhZGRpbmctdG9wOiBAbmF2YmFyU2l6ZTtcbiAgICB9XG5cbiAgICAmLnRvb2xiYXItZml4ZWQsICYudGFiYmFyLWZpeGVkLCAudG9vbGJhci1maXhlZCwgLnRhYmJhci1maXhlZCwgLnRvb2xiYXItZml4ZWQgJiwgLnRhYmJhci1maXhlZCAmIHtcbiAgICAgICAgLnBhZ2UtY29udGVudCB7XG4gICAgICAgICAgICBwYWRkaW5nLXRvcDogQG5hdmJhclNpemUgKyBAdG9vbGJhclNpemU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgJi50YWJiYXItbGFiZWxzLWZpeGVkLCAudGFiYmFyLWxhYmVscy1maXhlZCwgLnRhYmJhci1sYWJlbHMtZml4ZWQgJiB7XG4gICAgICAgIC5wYWdlLWNvbnRlbnQge1xuICAgICAgICAgICAgcGFkZGluZy10b3A6IEBuYXZiYXJTaXplICsgQHRhYmJhckxhYmVsc1NpemU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnRvb2xiYXIgfiAucGFnZS1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZy10b3A6IEBuYXZiYXJTaXplICsgQHRvb2xiYXJTaXplO1xuICAgIH1cbiAgICAubWVzc2FnZWJhciB+IC5wYWdlLWNvbnRlbnQsIC50b29sYmFyLWJvdHRvbSB+IC5wYWdlLWNvbnRlbnQge1xuICAgICAgICBwYWRkaW5nLXRvcDogQG5hdmJhclNpemU7XG4gICAgfVxuXG4gICAgLnRhYmJhci1sYWJlbHMgfiAucGFnZS1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZy10b3A6IEBuYXZiYXJTaXplICsgQHRhYmJhckxhYmVsc1NpemU7XG4gICAgfVxuICAgIC50YWJiYXItbGFiZWxzLnRvb2xiYXItYm90dG9tIH4gLnBhZ2UtY29udGVudCB7XG4gICAgICAgIHBhZGRpbmctdG9wOiBAbmF2YmFyU2l6ZTtcbiAgICB9XG5cbiAgICAud2l0aC1zdWJuYXZiYXIgLnBhZ2UtY29udGVudCwgLnBhZ2UtY29udGVudC53aXRoLXN1Ym5hdmJhciwgLnN1Ym5hdmJhciB+IC5wYWdlLWNvbnRlbnQge1xuICAgICAgICBwYWRkaW5nLXRvcDogQG5hdmJhclNpemUgKyBAdG9vbGJhclNpemU7XG4gICAgfVxuXG4gICAgLnBhZ2UgLnN1Ym5hdmJhciwgJi5wYWdlIC5zdWJuYXZiYXIge1xuICAgICAgICB0b3A6IEBuYXZiYXJTaXplO1xuICAgIH1cblxuICAgIC50b29sYmFyIHtcbiAgICAgICAgdG9wOiBAbmF2YmFyU2l6ZTtcbiAgICB9XG4gICAgLm1lc3NhZ2ViYXIsIC50b29sYmFyLWJvdHRvbSB7XG4gICAgICAgIHRvcDogYXV0bztcbiAgICB9XG59XG4vLyBQYWdlIEhpZGRlbiBOYXZiYXJcbi5uYXZiYXIge1xuICAgICYubmF2YmFyLWhpZGluZyB7XG4gICAgICAgIC50cmFuc2l0aW9uKDQwMG1zKTtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICAgICAgJiB+IC5wYWdlLWNvbnRlbnQsICYgfiAucGFnZXMsICYgfiAucGFnZSB7XG4gICAgICAgICAgICAubGlzdC1ncm91cC10aXRsZSB7XG4gICAgICAgICAgICAgICAgLnRyYW5zaXRpb24oNDAwbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLnN1Ym5hdmJhciB7XG4gICAgICAgICAgICAgICAgLnRyYW5zaXRpb24oNDAwbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICYgfiAuc3VibmF2YmFyLCAmIH4gLnRvb2xiYXIge1xuICAgICAgICAgICAgLnRyYW5zaXRpb24oNDAwbXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgICYubmF2YmFyLWhpZGRlbiB7XG4gICAgICAgIC50cmFuc2l0aW9uKDQwMG1zKTtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsLTEwMCUsMCk7XG4gICAgICAgICYgfiAucGFnZS1jb250ZW50LCAmIH4gLnBhZ2VzLCAmIH4gLnBhZ2Uge1xuICAgICAgICAgICAgLmxpc3QtZ3JvdXAtdGl0bGUge1xuICAgICAgICAgICAgICAgIC50cmFuc2l0aW9uKDQwMG1zKTtcbiAgICAgICAgICAgICAgICB0b3A6LUBuYXZiYXJTaXplO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLnN1Ym5hdmJhciB7XG4gICAgICAgICAgICAgICAgLnRyYW5zbGF0ZTNkKDAsLUBuYXZiYXJTaXplLDApO1xuICAgICAgICAgICAgICAgIC50cmFuc2l0aW9uKDQwMG1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAmIH4gLnN1Ym5hdmJhciwgJiB+IC50b29sYmFyOm5vdCgubWVzc2FnZWJhcik6bm90KC50b29sYmFyLWJvdHRvbSkge1xuICAgICAgICAgICAgLnRyYW5zbGF0ZTNkKDAsLUBuYXZiYXJTaXplLDApO1xuICAgICAgICAgICAgLnRyYW5zaXRpb24oNDAwbXMpO1xuICAgICAgICB9XG4gICAgfVxufVxuLnBhZ2Uubm8tbmF2YmFyIHtcbiAgICAucGFnZS1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZy10b3A6IDA7XG4gICAgfVxuICAgICYud2l0aC1zdWJuYXZiYXIgLnBhZ2UtY29udGVudCwgLndpdGgtc3VibmF2YmFyICYgLnBhZ2UtY29udGVudCwgLnBhZ2UtY29udGVudC53aXRoLXN1Ym5hdmJhciB7XG4gICAgICAgIHBhZGRpbmctdG9wOiBAdG9vbGJhclNpemU7XG4gICAgfVxufVxuLy8gUGFnZSBIaWRkZW4gVG9vbGJhclxuLnRvb2xiYXIsIC50YWJiYXIge1xuICAgICYudG9vbGJhci1oaWRpbmcsICYudGFiYmFyLWhpZGluZyB7XG4gICAgICAgIC50cmFuc2l0aW9uKDQwMG1zKTtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG4gICAgJi50b29sYmFyLWhpZGRlbiwgJi50YWJiYXItaGlkZGVuIHtcbiAgICAgICAgLnRyYW5zaXRpb24oNDAwbXMpO1xuICAgIH1cblxuICAgICYudG9vbGJhci1oaWRkZW4sICYudGFiYmFyLWhpZGRlbiB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLC0xMDAlLDApO1xuICAgIH1cbiAgICAubmF2YmFyIH4gJi50b29sYmFyLWhpZGRlbiwgLm5hdmJhciB+ICYudGFiYmFyLWhpZGRlbiB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLC0xMDRweCwwKTtcbiAgICB9XG4gICAgLm5hdmJhciB+ICYudGFiYmFyLWxhYmVscy50b29sYmFyLWhpZGRlbiB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLC0xMjhweCwwKTtcbiAgICB9XG4gICAgJi50b29sYmFyLWhpZGRlbi5tZXNzYWdlYmFyLCAmLnRvb2xiYXItaGlkZGVuLnRvb2xiYXItYm90dG9tIHtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsIDEwMCUsMCk7XG4gICAgfVxufVxuLnBhZ2Uubm8tdG9vbGJhciAucGFnZS1jb250ZW50LCAucGFnZS5uby10YWJiYXIgLnBhZ2UtY29udGVudCB7XG4gICAgcGFkZGluZy1ib3R0b206IDA7XG59XG4iLCIvKiA9PT0gU2VhcmNoIEJhciA9PT0gKi9cbkBzZWFyY2hiYXJCb3JkZXJDb2xvcjogI2I0YjRiNDtcbkBzZWFyY2hiYXJTaXplOiBAdG9vbGJhclNpemU7XG4uc2VhcmNoYmFyIHtcbiAgICBoZWlnaHQ6IEBzZWFyY2hiYXJTaXplO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJhY2tncm91bmQ6IEB0aGVtZUNvbG9yO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgcGFkZGluZzogMCAxNnB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIC5mbGV4Ym94KCk7XG4gICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgY29sb3I6I2ZmZjtcbiAgICBhIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBjb2xvcjojZmZmO1xuICAgICAgICAuYWN0aXZlLWhpZ2hsaWdodCgpO1xuICAgIH1cbiAgICAuc2VhcmNoYmFyLWlucHV0IHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogMzJweDtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAuZmxleC1zaHJpbmsoMSk7XG4gICAgfVxuICAgIGlucHV0W3R5cGU9XCJzZWFyY2hcIl0ge1xuICAgICAgICAuYmFycy1pbnB1dCgpO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIHBhZGRpbmc6IDAgMzZweCAwIDI0cHg7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAwIGNlbnRlcjtcbiAgICAgICAgb3BhY2l0eTogMC42O1xuICAgICAgICAtd2Via2l0LWJhY2tncm91bmQtc2l6ZTogMjRweCAyNHB4O1xuICAgICAgICBiYWNrZ3JvdW5kLXNpemU6IDI0cHggMjRweDtcbiAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgZmlsbD0nI0ZGRkZGRicgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyB3aWR0aD0nMjQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PHBhdGggZD0nTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6Jy8+PHBhdGggZD0nTTAgMGgyNHYyNEgweicgZmlsbD0nbm9uZScvPjwvc3ZnPlwiKTtcbiAgICAgICAgJjo6LXdlYmtpdC1zZWFyY2gtY2FuY2VsLWJ1dHRvbiB7XG4gICAgICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6bm9uZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAuc2VhcmNoYmFyLWNsZWFyIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB3aWR0aDogNTZweDtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICByaWdodDogLTE2cHg7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6bm9uZTtcbiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xuICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0O1xuICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgZmlsbD0nI2ZmZicgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyB3aWR0aD0nMjQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PHBhdGggZD0nTTE5IDYuNDFMMTcuNTkgNSAxMiAxMC41OSA2LjQxIDUgNSA2LjQxIDEwLjU5IDEyIDUgMTcuNTkgNi40MSAxOSAxMiAxMy40MSAxNy41OSAxOSAxOSAxNy41OSAxMy40MSAxMnonLz48cGF0aCBkPSdNMCAwaDI0djI0SDB6JyBmaWxsPSdub25lJy8+PC9zdmc+XCIpO1xuICAgICAgICAtd2Via2l0LWJhY2tncm91bmQtc2l6ZTogMjRweCAyNHB4O1xuICAgICAgICBiYWNrZ3JvdW5kLXNpemU6IDI0cHggMjRweDtcbiAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgfVxuICAgIC5zZWFyY2hiYXItY2FuY2VsIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG4gICAgJi5zZWFyY2hiYXItYWN0aXZlIHtcbiAgICAgICAgaW5wdXRbdHlwZT1cInNlYXJjaFwiXSB7XG4gICAgICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICB9XG4gICAgICAgIC5zZWFyY2hiYXItY2xlYXIge1xuICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICB9XG4gICAgfVxuICAgICYuc2VhcmNoYmFyLW5vdC1lbXB0eSB7XG4gICAgICAgIC5zZWFyY2hiYXItY2xlYXIge1xuICAgICAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICB9XG4gICAgfVxufVxuLnNlYXJjaGJhci1vdmVybGF5IHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHotaW5kZXg6IDEwMDtcbiAgICBvcGFjaXR5OiAwO1xuICAgIHBvaW50ZXItZXZlbnRzOm5vbmU7XG4gICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjI1KTtcbiAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICAmLnNlYXJjaGJhci1vdmVybGF5LWFjdGl2ZSB7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvO1xuICAgIH1cbn1cbi5zZWFyY2hiYXItbm90LWZvdW5kIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuLmhpZGRlbi1ieS1zZWFyY2hiYXIsIC5saXN0LWJsb2NrIC5oaWRkZW4tYnktc2VhcmNoYmFyLCAubGlzdC1ibG9jayBsaS5oaWRkZW4tYnktc2VhcmNoYmFyIHtcbiAgICBkaXNwbGF5OiBub25lO1xufVxuLnBhZ2UgPiAuc2VhcmNoYmFyIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgei1pbmRleDogMjAwO1xuICAgICYgfiAucGFnZS1jb250ZW50IHtcbiAgICAgICAgcGFkZGluZy10b3A6IEBzZWFyY2hiYXJTaXplO1xuICAgIH1cbn1cbi5uYXZiYXItZml4ZWQsIC5uYXZiYXItdGhyb3VnaCB7XG4gICAgLnBhZ2UgPiAuc2VhcmNoYmFyLCA+IC5zZWFyY2hiYXIge1xuICAgICAgICB0b3A6IEBuYXZiYXJTaXplO1xuICAgICAgICAmIH4gLnBhZ2UtY29udGVudCB7XG4gICAgICAgICAgICBwYWRkaW5nLXRvcDogQHNlYXJjaGJhclNpemUgKyBAbmF2YmFyU2l6ZTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKiA9PT0gTWVzc2FnZSBCYXIgPT09ICovXG4udG9vbGJhci5tZXNzYWdlYmFyIHtcbiAgICAudHJhbnNsYXRlM2QoMCwwLDApO1xuICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgLmhhaXJsaW5lKHRvcCwgI2QxZDFkMSk7XG4gICAgaGVpZ2h0OiA0OHB4O1xuICAgIHRvcDogYXV0bztcbiAgICBib3R0b206IDA7XG4gICAgZm9udC1zaXplOiAxNnB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgdGV4dGFyZWEge1xuICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgLW1zLWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIC13ZWJraXQtYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICAgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBwYWRkaW5nOiAzcHggOHB4IDNweDtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAyOHB4O1xuICAgICAgICBjb2xvcjogIzMzMztcbiAgICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMjJweDtcbiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7XG4gICAgICAgIHJlc2l6ZTpub25lO1xuICAgICAgICAuZmxleC1zaHJpbmsoMSk7XG4gICAgfVxuICAgIGEubGluayB7XG4gICAgICAgIGNvbG9yOiAjMzMzO1xuICAgICAgICAuYWxpZ24tc2VsZihmbGV4LWVuZCk7XG4gICAgICAgIGhlaWdodDogQHRvb2xiYXJTaXplO1xuICAgICAgICBsaW5lLWhlaWdodDogQHRvb2xiYXJTaXplO1xuICAgICAgICAuYWN0aXZlLWhpZ2hsaWdodC1jb2xvcihyZ2JhKDAsMCwwLDAuMSkpO1xuXG4gICAgfVxuICAgIC5saW5rIHtcbiAgICAgICAgLmZsZXgtc2hyaW5rKDApO1xuICAgIH1cbiAgICB+IC5wYWdlLWNvbnRlbnQge1xuICAgICAgICBwYWRkaW5nLWJvdHRvbTogQHRvb2xiYXJTaXplO1xuICAgIH1cbiAgICAucGFnZS5uby10b29sYmFyICYgfi5wYWdlLWNvbnRlbnQge1xuICAgICAgICBwYWRkaW5nLWJvdHRvbTogQHRvb2xiYXJTaXplO1xuICAgIH1cbiAgICAuaGlkZGVuLXRvb2xiYXIgJiB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgICAgIC50cmFuc2l0aW9uKDBtcyk7XG4gICAgfVxufVxuIiwiLyogPT09IEljb25zID09PSAqL1xuaS5pY29uIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgYXV0bztcbiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICBmb250LXN0eWxlOiBub3JtYWw7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIC8qIE1hdGVyaWFsIEljb25zIGh0dHA6Ly9nb29nbGUuZ2l0aHViLmlvL21hdGVyaWFsLWRlc2lnbi1pY29ucy8gKi9cbiAgICAmLmljb24tYmFjayB7XG4gICAgICAgIHdpZHRoOiAyNHB4O1xuICAgICAgICBoZWlnaHQ6IDI0cHg7XG4gICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0Jz48cGF0aCBkPSdNMjAgMTFINy44M2w1LjU5LTUuNTlMMTIgNGwtOCA4IDggOCAxLjQxLTEuNDFMNy44MyAxM0gyMHYtMnonIGZpbGw9JyNmZmZmZmYnLz48L3N2Zz5cIilcbiAgICB9XG4gICAgJi5pY29uLWZvcndhcmQge1xuICAgICAgICB3aWR0aDogMjRweDtcbiAgICAgICAgaGVpZ2h0OiAyNHB4O1xuICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCc+PHBhdGggZD0nTTEyIDRsLTEuNDEgMS40MUwxNi4xNyAxMUg0djJoMTIuMTdsLTUuNTggNS41OUwxMiAyMGw4LTh6JyBmaWxsPScjZmZmZmZmJy8+PC9zdmc+XCIpO1xuICAgIH1cbiAgICAmLmljb24tYmFycyB7XG4gICAgICAgIHdpZHRoOiAyNHB4O1xuICAgICAgICBoZWlnaHQ6IDI0cHg7XG4gICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0Jz48cGF0aCBkPSdNMyAxOGgxOHYtMkgzdjJ6bTAtNWgxOHYtMkgzdjJ6bTAtN3YyaDE4VjZIM3onIGZpbGw9JyNmZmZmZmYnLz48L3N2Zz5cIik7XG4gICAgfVxuICAgICYuaWNvbi1jYW1lcmEge1xuICAgICAgICB3aWR0aDogMjRweDtcbiAgICAgICAgaGVpZ2h0OiAyNHB4O1xuICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgZmlsbD0nIzMzMycgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0JyB3aWR0aD0nMjQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PGNpcmNsZSBjeD0nMTInIGN5PScxMicgcj0nMy4yJy8+PHBhdGggZD0nTTkgMkw3LjE3IDRINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yaC0zLjE3TDE1IDJIOXptMyAxNWMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1LTIuMjQgNS01IDV6Jy8+PHBhdGggZD0nTTAgMGgyNHYyNEgweicgZmlsbD0nbm9uZScvPjwvc3ZnPlwiKTtcbiAgICB9XG4gICAgJi5pY29uLWY3IHtcbiAgICAgICAgd2lkdGg6IDI0cHg7XG4gICAgICAgIGhlaWdodDogMjRweDtcbiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKFwiQHtpbWdCYXNlVXJsfS9pLWY3LW1hdGVyaWFsLnBuZ1wiKTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgIH1cbiAgICAmLmljb24tbmV4dCwgJi5pY29uLXByZXYge1xuICAgICAgICB3aWR0aDogMjRweDtcbiAgICAgICAgaGVpZ2h0OiAyNHB4O1xuICAgIH1cbiAgICAmLmljb24tbmV4dCB7XG4gICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIGZpbGw9JyNmZmZmZmYnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0Jz48cGF0aCBkPSdNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6Jy8+PHBhdGggZD0nTTAgMGgyNHYyNEgweicgZmlsbD0nbm9uZScvPjwvc3ZnPlwiKTtcbiAgICB9XG4gICAgJi5pY29uLXByZXYge1xuICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyBmaWxsPScjZmZmZmZmJyB3aWR0aD0nMjQnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCc+PHBhdGggZD0nTTE1LjQxIDcuNDFMMTQgNmwtNiA2IDYgNiAxLjQxLTEuNDFMMTAuODMgMTJ6Jy8+PHBhdGggZD0nTTAgMGgyNHYyNEgweicgZmlsbD0nbm9uZScvPjwvc3ZnPlwiKTtcbiAgICB9XG4gICAgJi5pY29uLXBsdXMge1xuICAgICAgICB3aWR0aDogMjRweDtcbiAgICAgICAgaGVpZ2h0OiAyNHB4O1xuICAgICAgICBmb250LXNpemU6IDA7XG4gICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyBmaWxsPScjRkZGRkZGJyBoZWlnaHQ9JzI0JyB2aWV3Qm94PScwIDAgMjQgMjQnIHdpZHRoPScyNCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJz48cGF0aCBkPSdNMTkgMTNoLTZ2NmgtMnYtNkg1di0yaDZWNWgydjZoNnYyeicvPjxwYXRoIGQ9J00wIDBoMjR2MjRIMHonIGZpbGw9J25vbmUnLz48L3N2Zz5cIik7XG4gICAgfVxuICAgICYuaWNvbi1jbG9zZSB7XG4gICAgICAgIHdpZHRoOiAyNHB4O1xuICAgICAgICBoZWlnaHQ6IDI0cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMDtcbiAgICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoXCI8c3ZnIGZpbGw9JyNGRkZGRkYnIGhlaWdodD0nMjQnIHZpZXdCb3g9JzAgMCAyNCAyNCcgd2lkdGg9JzI0JyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnPjxwYXRoIGQ9J00xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6Jy8+PHBhdGggZD0nTTAgMGgyNHYyNEgweicgZmlsbD0nbm9uZScvPjwvc3ZnPlwiKTtcbiAgICB9XG59XG4iLCIuYmFkZ2Uge1xuICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgY29sb3I6I2ZmZjtcbiAgICBiYWNrZ3JvdW5kOiAjOGU4ZTkzO1xuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICBwYWRkaW5nOiAxcHggNnB4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cbi5pY29uIC5iYWRnZSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDEwMCU7XG4gICAgbWFyZ2luLWxlZnQ6IC0xMHB4O1xuICAgIHRvcDogLTJweDtcbiAgICBmb250LXNpemU6IDEwcHg7XG4gICAgbGluZS1oZWlnaHQ6IDEuNDtcbiAgICBwYWRkaW5nOiAxcHggNXB4O1xufSIsIi8qID09PSBDb250ZW50IEJsb2NrID09PSAqL1xuQGNvbnRlbnRCbG9ja0JvcmRlckNvbG9yOiByZ2JhKDAsMCwwLDAuMTIpO1xuLmNvbnRlbnQtYmxvY2sge1xuICAgIG1hcmdpbjogMzJweCAwO1xuICAgIHBhZGRpbmc6IDAgMTZweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC5uby1oYWlybGluZXMoKTtcbn1cbi5jb250ZW50LWJsb2NrLXRpdGxlIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBtYXJnaW46IDA7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgbWFyZ2luOiAxNnB4IDE2cHggMTZweDtcbiAgICBwYWRkaW5nLXRvcDogMTZweDtcbiAgICBsaW5lLWhlaWdodDogMTZweDtcbiAgICBmb250LXdlaWdodDogNTAwO1xuICAgIGNvbG9yOiByZ2JhKDAsMCwwLDAuNTQpO1xuICAgICsgLmxpc3QtYmxvY2ssICsgLmNvbnRlbnQtYmxvY2ssICsuY2FyZCB7XG4gICAgICAgIG1hcmdpbi10b3A6IDBweDtcbiAgICB9XG5cbn1cbi5jb250ZW50LWJsb2NrLWlubmVyIHtcbiAgICBwYWRkaW5nOiAxNnB4IDE2cHg7XG4gICAgbWFyZ2luLWxlZnQ6IC0xNnB4O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAuaGFpcmxpbmUodG9wLCBAY29udGVudEJsb2NrQm9yZGVyQ29sb3IpO1xuICAgIC5oYWlybGluZShib3R0b20sIEBjb250ZW50QmxvY2tCb3JkZXJDb2xvcik7XG4gICAgPnA6Zmlyc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tdG9wOiAwO1xuICAgIH1cbiAgICA+cDpsYXN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDtcbiAgICB9XG59XG4uY29udGVudC1ibG9jay5pbnNldCB7XG4gICAgbWFyZ2luLWxlZnQ6IDE2cHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAxNnB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDdweDtcbiAgICAuY29udGVudC1ibG9jay1pbm5lciB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUodG9wKTtcbiAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgfVxufVxuQG1lZGlhIGFsbCBhbmQgKG1pbi13aWR0aDo3NjhweCkge1xuICAgIC5jb250ZW50LWJsb2NrLnRhYmxldC1pbnNldCB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAxNnB4O1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDE2cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweFxuICAgIH1cbiAgICBcbiAgICAuY29udGVudC1ibG9jay50YWJsZXQtaW5zZXQgLmNvbnRlbnQtYmxvY2staW5uZXIge1xuICAgIFx0LmhhaXJsaW5lLXJlbW92ZSh0b3ApO1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgXHRib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgfVxufVxuIiwiLyogPT09IExpc3RzID09PSAqL1xuQGxpc3RCbG9ja0JvcmRlckNvbG9yOiByZ2JhKDAsMCwwLDAuMTIpO1xuLmxpc3QtYmxvY2sge1xuICAgIG1hcmdpbjogMzJweCAwO1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICB1bCB7XG4gICAgICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAuaGFpcmxpbmUodG9wLCBAbGlzdEJsb2NrQm9yZGVyQ29sb3IpO1xuICAgICAgICAuaGFpcmxpbmUoYm90dG9tLCBAbGlzdEJsb2NrQm9yZGVyQ29sb3IpO1xuICAgICAgICB1bCB7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDU2cHg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAuYWxpZ24tdG9wLCAuYWxpZ24tdG9wIC5pdGVtLWNvbnRlbnQsIC5hbGlnbi10b3AgLml0ZW0taW5uZXIge1xuICAgICAgICAuYWxpZ24taXRlbXMoZmxleC1zdGFydCk7XG4gICAgfVxuICAgIFxuICAgIC5pbnNldCgpIHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDE2cHg7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMTZweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgICAuY29udGVudC1ibG9jay10aXRsZSB7XG4gICAgICAgICAgICBtYXJnaW4tbGVmdDogMDtcbiAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMDtcbiAgICAgICAgfVxuICAgICAgICB1bCB7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgbGk6Zmlyc3QtY2hpbGQgPiBhe1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4IDRweCAwIDA7XG4gICAgICAgIH1cbiAgICAgICAgbGk6bGFzdC1jaGlsZCA+IGF7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwIDAgNHB4IDRweDtcbiAgICAgICAgfVxuICAgICAgICBsaTpmaXJzdC1jaGlsZDpsYXN0LWNoaWxkID4gYSB7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgJi5pbnNldCB7XG4gICAgICAgIC5pbnNldCgpXG4gICAgfVxuICAgICYudGFibGV0LWluc2V0IHtcbiAgICAgICAgQG1lZGlhIGFsbCBhbmQgKG1pbi13aWR0aDo3NjhweCkge1xuICAgICAgICAgICAgLmluc2V0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMaXN0IGl0ZW1zXG4gICAgbGkge1xuICAgICAgICBib3gtc2l6aW5nOmJvcmRlci1ib3g7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB9XG4gICAgXG4gICAgLml0ZW0tbWVkaWEge1xuICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICAuZmxleC1zaHJpbmsoMCk7XG4gICAgICAgIC5mbGV4LXdyYXAobm93cmFwKTtcbiAgICAgICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgICAgIGJveC1zaXppbmc6Ym9yZGVyLWJveDtcbiAgICAgICAgcGFkZGluZy10b3A6IDhweDtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDhweDtcbiAgICAgICAgbWluLXdpZHRoOiA0MHB4O1xuICAgICAgICBpICsgaSB7XG4gICAgICAgICAgICBtYXJnaW4tbGVmdDogOHB4O1xuICAgICAgICB9XG4gICAgICAgIGkgKyBpbWcge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAuaXRlbS1tZWRpYSArIC5pdGVtLWlubmVyIHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDE2cHg7XG4gICAgfVxuICAgIC5pdGVtLWlubmVyIHtcbiAgICAgICAgcGFkZGluZy1yaWdodDogMTZweDtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICAuaGFpcmxpbmUoYm90dG9tLCBAbGlzdEJsb2NrQm9yZGVyQ29sb3IpO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgcGFkZGluZy10b3A6IDhweDtcbiAgICAgICAgcGFkZGluZy1ib3R0b206IDhweDtcbiAgICAgICAgbWluLWhlaWdodDogNDhweDtcbiAgICAgICAgYm94LXNpemluZzpib3JkZXItYm94O1xuICAgICAgICAtd2Via2l0LWJveC1mbGV4OjE7XG4gICAgICAgIC1tcy1mbGV4OjE7XG4gICAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgICAgLmZsZXhib3goKTtcbiAgICAgICAgLmp1c3RpZnktY29udGVudChzcGFjZS1iZXR3ZWVuKTtcbiAgICAgICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgICAgIC5hbGlnbi1zZWxmKHN0cmV0Y2gpO1xuICAgIH1cbiAgICAuaXRlbS10aXRsZSB7XG4gICAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgICAgLmZsZXgtc2hyaW5rKDEpO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgLml0ZW0tYWZ0ZXIge1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICBjb2xvcjogIzc1NzU3NTtcbiAgICAgICAgLmZsZXgtc2hyaW5rKDApO1xuICAgICAgICBtYXJnaW4tbGVmdDogOHB4O1xuICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICBtYXgtaGVpZ2h0OiAyOHB4O1xuICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgfVxuICAgIC5zbWFydC1zZWxlY3QgLml0ZW0tYWZ0ZXIsIC5hdXRvY29tcGxldGUtb3BlbmVyIC5pdGVtLWFmdGVyIHtcbiAgICAgICAgbWF4LXdpZHRoOiA3MCU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICAuaXRlbS1saW5rIHtcbiAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgY29sb3I6IGluaGVyaXQ7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgei1pbmRleDogMDtcbiAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgcGFkZGluZy1yaWdodDogNDJweDtcbiAgICAgICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB2aWV3Qm94PScwIDAgNjAgMTIwJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnPjxwYXRoIGQ9J202MCA2MS41LTM4LjI1IDM4LjI1LTkuNzUtOS43NSAyOS4yNS0yOC41LTI5LjI1LTI4LjUgOS43NS05Ljc1eicgZmlsbD0nI2M3YzdjYycvPjwvc3ZnPlwiKTtcbiAgICAgICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTBweCAyMHB4O1xuICAgICAgICAgICAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgICAgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IDk1JSBjZW50ZXI7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiAtd2Via2l0LWNhbGMoflwiMTAwJSAtIDE2cHhcIikgY2VudGVyO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2FsYyh+XCIxMDAlIC0gMTZweFwiKSBjZW50ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaHRtbDpub3QoLndhdGNoLWFjdGl2ZS1zdGF0ZSkgJjphY3RpdmUsICYuYWN0aXZlLXN0YXRlIHtcbiAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwwLDAsMC4xKTtcbiAgICAgICAgfVxuICAgICAgICAmLmxpc3QtYnV0dG9uIHtcbiAgICAgICAgICAgIHBhZGRpbmc6IDAgMTZweDtcbiAgICAgICAgICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAgICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICAgICAgbGluZS1oZWlnaHQ6IDQ4cHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLml0ZW0tY29udGVudCB7XG4gICAgICAgIGJveC1zaXppbmc6Ym9yZGVyLWJveDtcbiAgICAgICAgcGFkZGluZy1sZWZ0OiAxNnB4O1xuICAgICAgICBtaW4taGVpZ2h0OiA0OHB4O1xuICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICAuanVzdGlmeS1jb250ZW50KHNwYWNlLWJldHdlZW4pO1xuICAgICAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbiAgICB9XG4gICAgLy8gTGFiZWwgYWZ0ZXIgTGlzdCBibG9ja1xuICAgIC5saXN0LWJsb2NrLWxhYmVsIHtcbiAgICAgICAgbWFyZ2luOiAxMHB4IDAgMzVweDtcbiAgICAgICAgcGFkZGluZzogMCAxNnB4O1xuICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICAgIGNvbG9yOiByZ2JhKDAsMCwwLDAuNTQpO1xuICAgIH1cblxuICAgIC8vIFN3aXBlIG91dHNcbiAgICAuc3dpcGVvdXQge1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG4gICAgICAgIHRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG4gICAgfVxuICAgIC5zd2lwZW91dC5kZWxldGluZyB7XG4gICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgLnN3aXBlb3V0LWNvbnRlbnQge1xuICAgICAgICAgICAgLnRyYW5zZm9ybSh0cmFuc2xhdGVYKC0xMDAlKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnN3aXBlb3V0LnRyYW5zaXRpb25pbmcge1xuICAgICAgICAuc3dpcGVvdXQtY29udGVudCwgLnN3aXBlb3V0LWFjdGlvbnMtcmlnaHQgYSwgLnN3aXBlb3V0LWFjdGlvbnMtbGVmdCBhLCAuc3dpcGVvdXQtb3ZlcnN3aXBlIHtcbiAgICAgICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogMzAwbXM7XG4gICAgICAgICAgICB0cmFuc2l0aW9uOiAzMDBtcztcbiAgICAgICAgfSAgICBcbiAgICB9XG4gICAgLnN3aXBlb3V0LWNvbnRlbnQge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIHotaW5kZXg6IDEwO1xuICAgIH1cbiAgICAuc3dpcGVvdXQtb3ZlcnN3aXBlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAyMDBtcyBsZWZ0O1xuICAgICAgICB0cmFuc2l0aW9uOiAyMDBtcyBsZWZ0O1xuICAgIH1cbiAgICAuc3dpcGVvdXQtYWN0aW9ucy1sZWZ0LCAuc3dpcGVvdXQtYWN0aW9ucy1yaWdodCB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgIGEge1xuICAgICAgICAgICAgcGFkZGluZzogMCAyNHB4O1xuICAgICAgICAgICAgY29sb3I6I2ZmZjtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6ICNjN2M3Y2M7XG4gICAgICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICAgICAgLmFsaWduLWl0ZW1zKGNlbnRlcik7XG4gICAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgICAgICBsZWZ0OiAwO1xuICAgICAgICAgICAgJjphZnRlciB7XG4gICAgICAgICAgICAgICAgY29udGVudDonJztcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICAgICAgdG9wOiAwO1xuICAgICAgICAgICAgICAgIHdpZHRoOiA2MDAlO1xuICAgICAgICAgICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiBpbmhlcml0O1xuICAgICAgICAgICAgICAgIHotaW5kZXg6IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGEuc3dpcGVvdXQtZGVsZXRlIHtcbiAgICAgICAgICAgIGJhY2tncm91bmQ6IEByZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnN3aXBlb3V0LWFjdGlvbnMtcmlnaHQge1xuICAgICAgICByaWdodDogMCU7XG4gICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlWCgxMDAlKSk7XG4gICAgICAgIGE6YWZ0ZXIge1xuICAgICAgICAgICAgbGVmdDogMTAwJTtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4O1xuICAgICAgICB9XG4gICAgfVxuICAgIC5zd2lwZW91dC1hY3Rpb25zLWxlZnQge1xuICAgICAgICBsZWZ0OiAwJTtcbiAgICAgICAgLnRyYW5zZm9ybSh0cmFuc2xhdGVYKC0xMDAlKSk7XG4gICAgICAgIGE6YWZ0ZXIge1xuICAgICAgICAgICAgcmlnaHQ6IDEwMCU7XG4gICAgICAgICAgICBtYXJnaW4tcmlnaHQ6IC0xcHg7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLml0ZW0tc3VidGl0bGUge1xuICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgICB0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO1xuICAgIH1cbiAgICAuaXRlbS10ZXh0IHtcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICBjb2xvcjogIzc1NzU3NTtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgbWF4LWhlaWdodDogNDBweDtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzplbGxpcHNpcztcbiAgICAgICAgLXdlYmtpdC1saW5lLWNsYW1wOiAyO1xuICAgICAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWJveDtcbiAgICB9XG4gICAgJi5tZWRpYS1saXN0LCBsaS5tZWRpYS1pdGVtIHtcbiAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICBwYWRkaW5nLXRvcDogMTRweDtcbiAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOiAxNHB4O1xuICAgICAgICAgICAgLmFsaWduLXNlbGYoc3RyZXRjaCk7XG4gICAgICAgIH1cbiAgICAgICAgLml0ZW0tbGluayAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgICAgICAgcGFkZGluZy1yaWdodDogMTZweDtcbiAgICAgICAgfVxuICAgICAgICAuaXRlbS1saW5rIC5pdGVtLXRpdGxlLXJvdyB7XG4gICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAyNnB4O1xuICAgICAgICAgICAgYmFja2dyb3VuZDogbm8tcmVwZWF0IHJpZ2h0IHRvcDtcbiAgICAgICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB2aWV3Qm94PScwIDAgNjAgMTIwJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnPjxwYXRoIGQ9J202MCA2MS41LTM4LjI1IDM4LjI1LTkuNzUtOS43NSAyOS4yNS0yOC41LTI5LjI1LTI4LjUgOS43NS05Ljc1eicgZmlsbD0nI2M3YzdjYycvPjwvc3ZnPlwiKTtcbiAgICAgICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTBweCAyMHB4O1xuICAgICAgICB9XG4gICAgICAgIC5pdGVtLW1lZGlhIHtcbiAgICAgICAgICAgIHBhZGRpbmctdG9wOiAxNHB4O1xuICAgICAgICAgICAgcGFkZGluZy1ib3R0b206IDE0cHg7XG4gICAgICAgICAgICAuYWxpZ24tc2VsZihmbGV4LXN0YXJ0KTtcbiAgICAgICAgICAgIGltZyB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLml0ZW0tdGl0bGUtcm93IHtcbiAgICAgICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgICAgICAuanVzdGlmeS1jb250ZW50KHNwYWNlLWJldHdlZW4pO1xuICAgICAgICB9XG4gICAgICAgIC5pdGVtLWNvbnRlbnQgPiAuaXRlbS1hZnRlciB7XG4gICAgICAgICAgICBwYWRkaW5nLXRvcDogMTRweDtcbiAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOiAxNHB4O1xuICAgICAgICAgICAgLmFsaWduLXNlbGYoZmxleC1zdGFydCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLmxpc3QtZ3JvdXAge1xuICAgICAgICB1bCB7XG4gICAgICAgICAgICAmOmFmdGVyLCAmOmJlZm9yZSB7XG4gICAgICAgICAgICAgICAgei1pbmRleDogMTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgKyAubGlzdC1ncm91cCB1bCB7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7ICAgXG4gICAgICAgIH1cbiAgICB9XG4gICAgLml0ZW0tZGl2aWRlciwgLmxpc3QtZ3JvdXAtdGl0bGUge1xuICAgICAgICBiYWNrZ3JvdW5kOiAjZjRmNGY0O1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7XG4gICAgICAgIHBhZGRpbmc6IDBweCAxNnB4O1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIGNvbG9yOiByZ2JhKDAsMCwwLDAuNTQpO1xuICAgICAgICBoZWlnaHQ6IDQ4cHg7XG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiA0OHB4O1xuICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgfVxuICAgIC5saXN0LWdyb3VwLXRpdGxlIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBwb3NpdGlvbjogLXdlYmtpdC1zdGlja3k7XG4gICAgICAgIHBvc2l0aW9uOiAtbW96LXN0aWNreTtcbiAgICAgICAgcG9zaXRpb246IHN0aWNreTtcbiAgICAgICAgdG9wOiAwcHg7XG4gICAgICAgIHotaW5kZXg6IDEwO1xuICAgICAgICBtYXJnaW4tdG9wOiAwO1xuICAgIH1cbiAgICAvLyBTb3J0YWJsZVxuICAgIC5zb3J0YWJsZS1oYW5kbGVyIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBib3R0b206IDFweDtcbiAgICAgICAgei1pbmRleDogMTA7XG4gICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgICAgIGJhY2tncm91bmQtc2l6ZTogMThweCAxMnB4O1xuICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgICAgIHdpZHRoOiA1MHB4O1xuICAgICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZChcIjxzdmcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJyB2aWV3Qm94PScwIDAgMTggMTInIGZpbGw9JyNjN2M3Y2MnPjxwYXRoIGQ9J00wLDJWMGgyMnYySDB6Jy8+PHBhdGggZD0nTTAsN1Y1aDIydjJIMHonLz48cGF0aCBkPSdNMCwxMnYtMmgyMnYySDB6Jy8+PC9zdmc+XCIpO1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgIH1cbiAgICAmLnNvcnRhYmxlIHtcbiAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpOyAgICAgICBcbiAgICAgICAgfVxuICAgIH1cbiAgICAmLnNvcnRhYmxlLW9wZW5lZCB7XG4gICAgICAgIC5zb3J0YWJsZS1oYW5kbGVyIHtcbiAgICAgICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7XG4gICAgICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICB9XG4gICAgICAgIC5pdGVtLWlubmVyLCAuaXRlbS1saW5rIC5pdGVtLWlubmVyIHtcbiAgICAgICAgICAgIHBhZGRpbmctcmlnaHQ6IDE2cHggKyAxOHB4ICsgMTZweDtcbiAgICAgICAgfVxuICAgICAgICAuaXRlbS1saW5rIC5pdGVtLWlubmVyLCAuaXRlbS1saW5rIC5pdGVtLXRpdGxlLXJvdyB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICAgICAgICB9XG4gICAgfVxuICAgICYuc29ydGFibGUtc29ydGluZyB7XG4gICAgICAgIGxpIHtcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBsaS5zb3J0aW5nIHtcbiAgICAgICAgei1pbmRleDogNTA7XG4gICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMjU1LDI1NSwyNTUsMC44KTtcbiAgICAgICAgLmRlcHRoKDIpO1xuICAgICAgICAudHJhbnNpdGlvbigwbXMpO1xuICAgICAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMYXN0LWNoaWxkc1xuICAgIGxpIHtcbiAgICAgICAgJjpsYXN0LWNoaWxkIHtcbiAgICAgICAgICAgIC5saXN0LWJ1dHRvbiB7XG4gICAgICAgICAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICY6bGFzdC1jaGlsZCwgJjpsYXN0LWNoaWxkIGxpOmxhc3QtY2hpbGQge1xuICAgICAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsaTpsYXN0LWNoaWxkLCAmOmxhc3QtY2hpbGQgbGkge1xuICAgICAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgICAgIC5oYWlybGluZShib3R0b20sIEBsaXN0QmxvY2tCb3JkZXJDb2xvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAubm8taGFpcmxpbmVzKCk7XG4gICAgLm5vLWhhaXJsaW5lcy1iZXR3ZWVuKClcbn1cbiIsIi8qID09PSBGb3JtcyA9PT0gKi9cbi8vIElucHV0c1xuLmxpc3QtYmxvY2sge1xuICAgIGlucHV0W3R5cGU9XCJ0ZXh0XCJdLCBpbnB1dFt0eXBlPVwicGFzc3dvcmRcIl0sIGlucHV0W3R5cGU9XCJzZWFyY2hcIl0sIGlucHV0W3R5cGU9XCJlbWFpbFwiXSwgaW5wdXRbdHlwZT1cInRlbFwiXSwgaW5wdXRbdHlwZT1cInVybFwiXSwgaW5wdXRbdHlwZT1cImRhdGVcIl0sIGlucHV0W3R5cGU9XCJkYXRldGltZS1sb2NhbFwiXSwgaW5wdXRbdHlwZT1cInRpbWVcIl0sIGlucHV0W3R5cGU9XCJudW1iZXJcIl0sIHNlbGVjdCwgdGV4dGFyZWEge1xuICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgLW1zLWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIGJveC1zaXppbmc6Ym9yZGVyLWJveDtcbiAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAwIDAgMCAwO1xuICAgICAgICBib3gtc2hhZG93OiBub25lO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAzNnB4O1xuICAgICAgICBjb2xvcjogIzIxMjEyMTtcbiAgICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICAgICAgJjo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XG4gICAgICAgICAgIGNvbG9yOiByZ2JhKDAsMCwwLDAuMzUpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC5sYWJlbCwgLmZsb2F0aW5nLWxhYmVsIHtcbiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDtcbiAgICAgICAgY29sb3I6cmdiYSgwLDAsMCwwLjY1KTtcbiAgICAgICAgLnRyYW5zaXRpb24oMjAwbXMpO1xuICAgICAgICB3aWR0aDogMzUlO1xuICAgICAgICAuZmxleC1zaHJpbmsoMCk7XG4gICAgfVxuICAgIFxuICAgIGlucHV0W3R5cGU9XCJkYXRlXCJdLCBpbnB1dFt0eXBlPVwiZGF0ZXRpbWUtbG9jYWxcIl0ge1xuICAgICAgICBsaW5lLWhlaWdodDogNDRweDtcbiAgICB9XG4gICAgc2VsZWN0IHtcbiAgICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIC1tcy1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgIH1cbiAgICB0ZXh0YXJlYSB7XG4gICAgICAgIHJlc2l6ZTpub25lO1xuICAgICAgICBsaW5lLWhlaWdodDogMS40O1xuICAgICAgICBwYWRkaW5nLXRvcDogOHB4O1xuICAgICAgICBwYWRkaW5nLWJvdHRvbTogN3B4O1xuICAgICAgICBoZWlnaHQ6IDEwMHB4O1xuICAgICAgICAmLnJlc2l6YWJsZSB7XG4gICAgICAgICAgICBoZWlnaHQ6IDM2cHg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAuaXRlbS1pbnB1dCB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAtbXMtZmxleDoxO1xuICAgICAgICAuZmxleC1zaHJpbmsoMSk7XG4gICAgICAgIGZvbnQtc2l6ZTogMDtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBtYXJnaW4tYm90dG9tOiA0cHg7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDM2cHg7XG4gICAgfVxuXG4gICAgLy8gSW5wdXRzIExpc3RcbiAgICAuaW5wdXQtaXRlbSwgJi5pbnB1dHMtbGlzdCB7XG4gICAgICAgIHVsIHtcbiAgICAgICAgICAgIC5oYWlybGluZS1yZW1vdmUoYm90dG9tKTtcbiAgICAgICAgfVxuICAgICAgICAuaXRlbS1tZWRpYSB7XG4gICAgICAgICAgICAuYWxpZ24tc2VsZihmbGV4LWVuZCk7XG4gICAgICAgICAgICBtaW4taGVpZ2h0OiAzNnB4O1xuICAgICAgICAgICAgbWFyZ2luLWJvdHRvbTogOHB4O1xuICAgICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgfVxuICAgICAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDRweDtcbiAgICAgICAgICAgIHBhZGRpbmctYm90dG9tOiAwO1xuICAgICAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgICAgICB9XG4gICAgICAgIC5sYWJlbCwgLmZsb2F0aW5nLWxhYmVsIHtcbiAgICAgICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICAgICAgZm9udC1zaXplOiAxMnB4O1xuICAgICAgICB9XG4gICAgICAgIC5mbG9hdGluZy1sYWJlbCB7XG4gICAgICAgICAgICAudHJhbnNmb3JtLW9yaWdpbihsZWZ0KTtcbiAgICAgICAgICAgIC50cmFuc2Zvcm0oc2NhbGUoMTYvMTIpIHRyYW5zbGF0ZVkoMjFweCkpO1xuICAgICAgICAgICAgY29sb3I6IHJnYmEoMCwwLDAsMC4zNSk7XG4gICAgICAgICAgICB3aWR0aDogYXV0bztcbiAgICAgICAgICAgIG1heC13aWR0aDogNzUlO1xuICAgICAgICAgICAgfi5pdGVtLWlucHV0IGlucHV0Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHtcbiAgICAgICAgICAgICAgIGNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICAuZm9jdXMtc3RhdGUsIC5ub3QtZW1wdHktc3RhdGUge1xuICAgICAgICAuZmxvYXRpbmctbGFiZWwge1xuICAgICAgICAgICAgY29sb3I6cmdiYSgwLDAsMCwwLjY1KTtcbiAgICAgICAgICAgIC50cmFuc2Zvcm0oc2NhbGUoMSkgdHJhbnNsYXRlWSgwKSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLmZvY3VzLXN0YXRlIHtcbiAgICAgICAgLmxhYmVsLCAuZmxvYXRpbmctbGFiZWwge1xuICAgICAgICAgICAgY29sb3I6IEB0aGVtZUNvbG9yO1xuICAgICAgICB9XG4gICAgfVxufVxuLml0ZW0taW5wdXQtZmllbGQsIC5pbnB1dC1maWVsZCB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIC5oYWlybGluZShib3R0b20sIHJnYmEoMCwgMCwgMCwgMC4xMikpO1xuICAgICY6YWZ0ZXIge1xuICAgICAgICAudHJhbnNpdGlvbigyMDBtcyk7XG4gICAgfVxuICAgICYuZm9jdXMtc3RhdGU6YWZ0ZXIsICYubm90LWVtcHR5LXN0YXRlOmFmdGVyLCAuZm9jdXMtc3RhdGUgJjphZnRlciwgLm5vdC1lbXB0eS1zdGF0ZSAmOmFmdGVye1xuICAgICAgICBiYWNrZ3JvdW5kOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgLnRyYW5zZm9ybShzY2FsZVkoMikpICFpbXBvcnRhbnQ7XG4gICAgfVxufVxudGV4dGFyZWEucmVzaXphYmxlIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xufVxuLy9Td2l0Y2hcbi5sYWJlbC1zd2l0Y2gge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICAgIHdpZHRoOiAzNnB4O1xuICAgIGhlaWdodDogMTRweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIC5hbGlnbi1zZWxmKGNlbnRlcik7XG4gICAgLmNoZWNrYm94IHtcbiAgICAgICAgd2lkdGg6IDM2cHg7IFxuICAgICAgICBib3JkZXItcmFkaXVzOiAzNnB4O1xuICAgICAgICBib3gtc2l6aW5nOmJvcmRlci1ib3g7XG4gICAgICAgIGhlaWdodDogMTRweDtcbiAgICAgICAgYmFja2dyb3VuZDogI2IwYWZhZjtcbiAgICAgICAgei1pbmRleDogMDtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgLW1zLWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7XG4gICAgICAgIGJvcmRlcjpub25lO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICAmOmFmdGVyIHtcbiAgICAgICAgICAgIGNvbnRlbnQ6JyAnO1xuICAgICAgICAgICAgaGVpZ2h0OiAyMHB4O1xuICAgICAgICAgICAgd2lkdGg6IDIwcHg7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiAyMHB4O1xuICAgICAgICAgICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgIHotaW5kZXg6IDI7XG4gICAgICAgICAgICB0b3A6IC0zcHg7XG4gICAgICAgICAgICBsZWZ0OiAwcHg7XG4gICAgICAgICAgICBib3gtc2hhZG93OiAwIDJweCA1cHggcmdiYSgwLDAsMCwwLjQpO1xuICAgICAgICAgICAgLnRyYW5zZm9ybSh0cmFuc2xhdGVYKDBweCkpO1xuICAgICAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICAgICY6Y2hlY2tlZCB7XG4gICAgICAgICAgICAmKyAuY2hlY2tib3gge1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6IHJnYmEocmVkKEB0aGVtZUNvbG9yKSwgZ3JlZW4oQHRoZW1lQ29sb3IpLCBibHVlKEB0aGVtZUNvbG9yKSwgMC41KTtcbiAgICAgICAgICAgICAgICAmOmFmdGVyIHtcbiAgICAgICAgICAgICAgICAgICAgLnRyYW5zZm9ybSh0cmFuc2xhdGVYKDE2cHgpKTtcbiAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogQHRoZW1lQ29sb3I7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIC5pdGVtLWlucHV0ICYge1xuICAgICAgICB0b3A6ICgzNnB4IC0gMTRweCkgLyAyO1xuICAgIH1cbn1cblxuLy9CdXR0b25zXG4uYnV0dG9uIHtcbiAgICBjb2xvcjpAdGhlbWVDb2xvcjtcbiAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICBsaW5lLWhlaWdodDogMzZweDtcbiAgICBib3gtc2l6aW5nOmJvcmRlci1ib3g7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgIC1tb3otYXBwZWFyYW5jZTogbm9uZTtcbiAgICAtbXMtYXBwZWFyYW5jZTogbm9uZTtcbiAgICBhcHBlYXJhbmNlOiBub25lO1xuICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgcGFkZGluZzogMCAxMHB4O1xuICAgIG1hcmdpbjogMDtcbiAgICBoZWlnaHQ6IDM2cHg7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0O1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBtaW4td2lkdGg6IDY0cHg7XG4gICAgcGFkZGluZzogMCA4cHg7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgb3V0bGluZTogMDtcbiAgICBib3JkZXI6IG5vbmU7XG4gICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgaW5wdXRbdHlwZT1cInN1Ym1pdFwiXSYsIGlucHV0W3R5cGU9XCJidXR0b25cIl0me1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG4gICAgaHRtbDpub3QoLndhdGNoLWFjdGl2ZS1zdGF0ZSkgJjphY3RpdmUsICYuYWN0aXZlLXN0YXRlIHtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjEpO1xuICAgIH1cbiAgICAmLmJ1dHRvbi1maWxsIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHRoZW1lQ29sb3I7XG4gICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgICBodG1sOm5vdCgud2F0Y2gtYWN0aXZlLXN0YXRlKSAmOmFjdGl2ZSwgJi5hY3RpdmUtc3RhdGUge1xuICAgICAgICAgICAgYmFja2dyb3VuZDogZGFya2VuKEB0aGVtZUNvbG9yLCA4JSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgJi5idXR0b24tYmlnIHtcbiAgICAgICAgaGVpZ2h0OiA0OHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogNDhweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgIH1cblxuICAgIGkuaWNvbiArIHNwYW4sXG4gICAgc3Bhbjpub3QoLnJpcHBsZS13YXZlKSArIHNwYW4sXG4gICAgc3Bhbjpub3QoLnJpcHBsZS13YXZlKSArIGkuaWNvbixcbiAgICBpLmljb24gKyBpLmljb24ge1xuICAgICAgICBtYXJnaW4tbGVmdDogOHB4O1xuICAgIH1cblxuICAgIC5uYXZiYXIgJiwgLnRvb2xiYXIgJiwgLnN1Ym5hdmJhciAmLCAubm90aWZpY2F0aW9ucyAmIHtcbiAgICAgICAgJjpub3QoLmJ1dHRvbi1maWxsKSB7XG4gICAgICAgICAgICBjb2xvcjojZmZmO1xuICAgICAgICAgICAgaHRtbDpub3QoLndhdGNoLWFjdGl2ZS1zdGF0ZSkgJjphY3RpdmUsICYuYWN0aXZlLXN0YXRlIHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMTUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLmJ1dHRvbi1yYWlzZWQge1xuICAgIC5kZXB0aCgxKTtcbiAgICBodG1sOm5vdCgud2F0Y2gtYWN0aXZlLXN0YXRlKSAmOmFjdGl2ZSwgJi5hY3RpdmUtc3RhdGUge1xuICAgICAgICAuZGVwdGgoMik7XG4gICAgfVxufVxuLmJ1dHRvbnMtcm93IHtcbiAgICAuYWxpZ24tc2VsZihjZW50ZXIpO1xuICAgIC5mbGV4Ym94KCk7XG4gICAgLmZsZXgtd3JhcChub3dyYXApO1xuICAgIC5idXR0b24ge1xuICAgICAgICBtYXJnaW4tbGVmdDogMTZweDtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIC13ZWJraXQtYm94LWZsZXg6MTtcbiAgICAgICAgLW1zLWZsZXg6MTtcbiAgICB9XG4gICAgLmJ1dHRvbjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgIH1cbn1cblxuXG4vLyBTbGlkZXJcbi5yYW5nZS1zbGlkZXIge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIC5hbGlnbi1zZWxmKGNlbnRlcik7XG4gICAgaW5wdXRbdHlwZT1cInJhbmdlXCJdIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAtbXMtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgYmFja2dyb3VuZDogLXdlYmtpdC1ncmFkaWVudChsaW5lYXIsIDUwJSAwLCA1MCUgMTAwJSwgY29sb3Itc3RvcCgwLCAjYjliOWI5KSwgY29sb3Itc3RvcCgxMDAlLCAjYjliOWI5KSk7XG4gICAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh0byByaWdodCwgI2I5YjliOSAwLCAjYjliOWI5IDEwMCUpO1xuICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBjZW50ZXI7XG4gICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSAycHg7XG4gICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgICAgIG91dGxpbmU6IDA7XG4gICAgICAgIC1tcy1iYWNrZ3JvdW5kLXBvc2l0aW9uLXk6IDUwMHB4O1xuICAgICAgICAmOmZvY3VzLCAmOmFjdGl2ZSB7XG4gICAgICAgICAgICBib3JkZXI6IDA7XG4gICAgICAgICAgICBvdXRsaW5lOiAwIG5vbmU7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLy8gUmFuZ2UgdGh1bWIgbWl4aW5cbiAgICAucmFuZ2UtdGh1bWIoKSB7XG4gICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgLW1vei1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgICAtbXMtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICBvdXRsaW5lOiAwO1xuICAgICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAgIHdpZHRoOiAyMHB4O1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIGJhY2tncm91bmQ6IEB0aGVtZUNvbG9yO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAyMHB4O1xuICAgIH1cblxuICAgIC8vID09PT09PT0gV2Via2l0ID09PT09PT09XG4gICAgaW5wdXRbdHlwZT1cInJhbmdlXCJdOjotd2Via2l0LXNsaWRlci10aHVtYiB7XG4gICAgICAgIC5yYW5nZS10aHVtYigpO1xuICAgIH1cblxuICAgIGlucHV0W3R5cGU9XCJyYW5nZVwiXTo6LXdlYmtpdC1zbGlkZXItdGh1bWI6YmVmb3JlIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDUwJTtcbiAgICAgICAgcmlnaHQ6IDEwMCU7XG4gICAgICAgIHdpZHRoOiAyMDAwcHg7XG4gICAgICAgIGhlaWdodDogMnB4O1xuICAgICAgICBtYXJnaW4tdG9wOiAtMXB4O1xuICAgICAgICB6LWluZGV4OiAxO1xuICAgICAgICBiYWNrZ3JvdW5kOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgY29udGVudDogJyAnO1xuICAgIH1cblxuICAgIC8vID09PT09PT0gRmlyZUZveCA9PT09PT09PVxuICAgIGlucHV0W3R5cGU9XCJyYW5nZVwiXTo6LW1vei1yYW5nZS10cmFjayB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDJweDtcbiAgICAgICAgYmFja2dyb3VuZDogI2I3YjhiNztcbiAgICAgICAgYm9yZGVyOiBub25lO1xuICAgICAgICBvdXRsaW5lOiAwO1xuICAgIH1cbiAgICBpbnB1dFt0eXBlPVwicmFuZ2VcIl06Oi1tb3otcmFuZ2UtdGh1bWIge1xuICAgICAgICAucmFuZ2UtdGh1bWIoKTtcbiAgICB9XG5cbiAgICAvLyA9PT09PT09IElFID09PT09PT09XG4gICAgaW5wdXRbdHlwZT1cInJhbmdlXCJdOjotbXMtdHJhY2sge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAycHg7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGJvcmRlci1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICB9XG4gICAgaW5wdXRbdHlwZT1cInJhbmdlXCJdOjotbXMtdGh1bWIge1xuICAgICAgICAucmFuZ2UtdGh1bWIoKTtcbiAgICB9XG5cbiAgICBpbnB1dFt0eXBlPVwicmFuZ2VcIl06Oi1tcy1maWxsLWxvd2VyIHtcbiAgICAgICAgYmFja2dyb3VuZDogQHRoZW1lQ29sb3I7XG4gICAgfVxuICAgIGlucHV0W3R5cGU9XCJyYW5nZVwiXTo6LW1zLWZpbGwtdXBwZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiAjYjdiOGI3O1xuICAgIH1cblxuICAgIC5pdGVtLWlucHV0ICYge1xuICAgICAgICB0b3A6ICgzNnB4IC0gMjBweCkgLyAyO1xuICAgIH1cbn1cblxuLy8gQ2hlY2tib3hlc1xubGFiZWwubGFiZWwtY2hlY2tib3gge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBpLmljb24tZm9ybS1jaGVja2JveCB7XG4gICAgICAgIHdpZHRoOiAxOHB4O1xuICAgICAgICBoZWlnaHQ6IDE4cHg7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgICAgICBib3JkZXI6IDJweCBzb2xpZCAjNmQ2ZDZkO1xuICAgICAgICBib3gtc2l6aW5nOmJvcmRlci1ib3g7XG4gICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICAgICY6YWZ0ZXIge1xuICAgICAgICAgICAgY29udGVudDonICc7XG4gICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICB3aWR0aDogMThweDtcbiAgICAgICAgICAgIGhlaWdodDogMThweDtcbiAgICAgICAgICAgIGxlZnQ6IC0ycHg7XG4gICAgICAgICAgICB0b3A6IC0ycHg7XG4gICAgICAgICAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICAgICAgYmFja2dyb3VuZDogbm8tcmVwZWF0IGNlbnRlcjtcbiAgICAgICAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIGZpbGw9JyNmZmZmZmYnIHdpZHRoPScyNCcgaGVpZ2h0PScyNCcgdmlld0JveD0nMCAwIDI0IDI0Jz48cGF0aCBkPSdNOSAxNi4xN0w0LjgzIDEybC0xLjQyIDEuNDFMOSAxOSAyMSA3bC0xLjQxLTEuNDF6Jy8+PC9zdmc+XCIpO1xuICAgICAgICAgICAgLXdlYmtpdC1iYWNrZ3JvdW5kLXNpemU6IDEwMCUgYXV0bztcbiAgICAgICAgICAgIGJhY2tncm91bmQtc2l6ZTogMTAwJSBhdXRvO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXSwgaW5wdXRbdHlwZT1cInJhZGlvXCJdIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICAgICAgJjpjaGVja2VkICsgLml0ZW0tbWVkaWEsICY6Y2hlY2tlZCB+IC5pdGVtLWFmdGVyLCAmOmNoZWNrZWQgfiAuaXRlbS1pbm5lcntcbiAgICAgICAgICAgIGkuaWNvbi1mb3JtLWNoZWNrYm94IHtcbiAgICAgICAgICAgICAgICBib3JkZXItY29sb3I6IEB0aGVtZUNvbG9yO1xuICAgICAgICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IEB0aGVtZUNvbG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaS5pY29uLWZvcm0tY2hlY2tib3g6YWZ0ZXIge1xuICAgICAgICAgICAgICAgIG9wYWNpdHk6IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5sYWJlbC5sYWJlbC1yYWRpbyB7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGkuaWNvbi1mb3JtLXJhZGlvIHtcbiAgICAgICAgd2lkdGg6IDIwcHg7XG4gICAgICAgIGhlaWdodDogMjBweDtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAyMHB4O1xuICAgICAgICBib3JkZXI6IDJweCBzb2xpZCAjNmQ2ZDZkO1xuICAgICAgICBib3gtc2l6aW5nOmJvcmRlci1ib3g7XG4gICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgJjphZnRlciB7XG4gICAgICAgICAgICBjb250ZW50OicgJztcbiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgIHdpZHRoOiAxMHB4O1xuICAgICAgICAgICAgaGVpZ2h0OiAxMHB4O1xuICAgICAgICAgICAgbGVmdDogNTAlO1xuICAgICAgICAgICAgdG9wOiA1MCU7XG4gICAgICAgICAgICBtYXJnaW4tbGVmdDogLTVweDtcbiAgICAgICAgICAgIG1hcmdpbi10b3A6IC01cHg7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgICAgICAgICAudHJhbnNmb3JtKHNjYWxlKDApKTtcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbnB1dFt0eXBlPVwiY2hlY2tib3hcIl0sIGlucHV0W3R5cGU9XCJyYWRpb1wiXSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICAgICY6Y2hlY2tlZCArIC5pdGVtLW1lZGlhLCAmOmNoZWNrZWQgfiAuaXRlbS1hZnRlciwgJjpjaGVja2VkIH4gLml0ZW0taW5uZXJ7XG4gICAgICAgICAgICBpLmljb24tZm9ybS1yYWRpbyB7XG4gICAgICAgICAgICAgICAgYm9yZGVyLWNvbG9yOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGkuaWNvbi1mb3JtLXJhZGlvOmFmdGVyIHtcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgICAgICAgICAudHJhbnNmb3JtKHNjYWxlKDEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbmxhYmVsLmxhYmVsLWNoZWNrYm94LCBsYWJlbC5sYWJlbC1yYWRpbyB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgei1pbmRleDogMDtcbiAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgLml0ZW0tYWZ0ZXIge1xuICAgICAgICBpLmljb24tZm9ybS1jaGVja2JveCwgaS5pY29uLWZvcm0tcmFkaW8ge1xuICAgICAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgICAgICAgICAgIG1hcmdpbi1yaWdodDogMTZweDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAubWVkaWEtbGlzdCAmLCAubWVkaWEtaXRlbSAmIHtcbiAgICAgICAgLml0ZW0tbWVkaWEge1xuICAgICAgICAgICAgaS5pY29uLWZvcm0tY2hlY2tib3gsIGkuaWNvbi1mb3JtLXJhZGlvIHtcbiAgICAgICAgICAgICAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgICAgICAgICB9ICAgICAgIFxuICAgICAgICB9XG4gICAgfVxuICAgIGh0bWw6bm90KC53YXRjaC1hY3RpdmUtc3RhdGUpICY6YWN0aXZlLCAmLmFjdGl2ZS1zdGF0ZSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwwLDAsMC4xKTtcbiAgICAgICAgLml0ZW0taW5uZXIge1xuICAgICAgICAgICAgLmhhaXJsaW5lLWNvbG9yKGJvdHRvbSwgdHJhbnNwYXJlbnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBTbWFydCBzZWxlY3RzXG4uc21hcnQtc2VsZWN0IHtcbiAgICBzZWxlY3Qge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbn1cbiIsIi8qID09PSBGbG9hdGluZyBBY3Rpb24gQnV0dG9uID09PSAqL1xuLmZsb2F0aW5nLWJ1dHRvbiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAxNnB4O1xuICAgIGJvdHRvbTogMTZweDtcbiAgICB3aWR0aDogNTZweDtcbiAgICBoZWlnaHQ6IDU2cHg7XG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgIHotaW5kZXg6IDE1MDA7XG4gICAgLmRlcHRoKDMpO1xuICAgIGJhY2tncm91bmQtY29sb3I6IEB0aGVtZUNvbG9yO1xuICAgIGNvbG9yOiNmZmY7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgLmZsZXhib3goKTtcbiAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbiAgICAuanVzdGlmeS1jb250ZW50KGNlbnRlcik7XG4gICAgaHRtbDpub3QoLndhdGNoLWFjdGl2ZS1zdGF0ZSkgJjphY3RpdmUsICYuYWN0aXZlLXN0YXRlIHtcbiAgICAgICAgYmFja2dyb3VuZDogZGFya2VuKEB0aGVtZUNvbG9yLCA4JSk7XG4gICAgfVxufVxuLmZsb2F0aW5nLWJ1dHRvbi10b29sYmFyLCAuc3BlZWQtZGlhbCB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAxNnB4O1xuICAgIGJvdHRvbTogMTZweDtcbiAgICB6LWluZGV4OiAxNTAwO1xuICAgIC5mbG9hdGluZy1idXR0b24ge1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgYm90dG9tOiAwO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgfVxufVxuLy8gU3BlZWQgRGlhbFxuLnNwZWVkLWRpYWwge1xuICAgIC5mbG9hdGluZy1idXR0b24ge1xuICAgICAgICBpIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgICAgIGxlZnQ6IDUwJTtcbiAgICAgICAgICAgIHRvcDogNTAlO1xuICAgICAgICAgICAgLnRyYW5zZm9ybSh0cmFuc2xhdGUzZCgtNTAlLCAtNTAlLCAwKSByb3RhdGUoMGRlZykgc2NhbGUoMSkpO1xuICAgICAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICB9XG4gICAgICAgIGkgKyBpIHtcbiAgICAgICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoLTUwJSwgLTUwJSwgMCkgcm90YXRlKC05MGRlZykgc2NhbGUoMC41KSk7XG4gICAgICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB9XG4gICAgfVxuICAgICYuc3BlZWQtZGlhbC1vcGVuZWQge1xuICAgICAgICAuZmxvYXRpbmctYnV0dG9uIHtcbiAgICAgICAgICAgIGkge1xuICAgICAgICAgICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoLTUwJSwgLTUwJSwgMCkgcm90YXRlKDkwZGVnKSBzY2FsZSgwLjUpKTtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaSArIGkge1xuICAgICAgICAgICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoLTUwJSwgLTUwJSwgMCkgcm90YXRlKDBkZWcpIHNjYWxlKDEpKTtcbiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLnNwZWVkLWRpYWwtYnV0dG9ucyB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiA0MHB4O1xuICAgIGxlZnQ6IDUwJTtcbiAgICBtYXJnaW4tbGVmdDogLTIwcHg7XG4gICAgYm90dG9tOiAxMDAlO1xuICAgIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gICAgLmZsZXhib3goKTtcbiAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgIC13ZWJraXQtYm94LWRpcmVjdGlvbjogcmV2ZXJzZTtcbiAgICAtbW96LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgIC1tb3otYm94LWRpcmVjdGlvbjogcmV2ZXJzZTtcbiAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlO1xuICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlO1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgYSB7XG4gICAgICAgIHdpZHRoOiA0MHB4O1xuICAgICAgICBoZWlnaHQ6IDQwcHg7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgei1pbmRleDogMTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHRoZW1lQ29sb3I7XG4gICAgICAgIGh0bWw6bm90KC53YXRjaC1hY3RpdmUtc3RhdGUpICY6YWN0aXZlLCAmLmFjdGl2ZS1zdGF0ZSB7XG4gICAgICAgICAgICBiYWNrZ3JvdW5kOiBkYXJrZW4oQHRoZW1lQ29sb3IsIDglKTtcbiAgICAgICAgfVxuICAgICAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgIC5hbGlnbi1pdGVtcyhjZW50ZXIpO1xuICAgICAgICAuanVzdGlmeS1jb250ZW50KGNlbnRlcik7XG4gICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMCwgOHB4LCAwKSBzY2FsZSgwLjMpKTtcbiAgICAgICAgLnRyYW5zZm9ybS1vcmlnaW4oY2VudGVyIGJvdHRvbSk7XG4gICAgICAgICsgYSB7XG4gICAgICAgICAgICBtYXJnaW4tYm90dG9tOiAxNnB4O1xuICAgICAgICB9XG4gICAgfVxuICAgIC5zcGVlZC1kaWFsLW9wZW5lZCAmIHtcbiAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87XG4gICAgICAgIGEge1xuICAgICAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMCwgMCwgMCkgc2NhbGVZKDEpKTtcbiAgICAgICAgICAgIC5kZXB0aCgzKTtcbiAgICAgICAgICAgICY6bnRoLWNoaWxkKDIpIHtcbiAgICAgICAgICAgICAgICAuZGVsYXkoNTBtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmOm50aC1jaGlsZCgzKSB7XG4gICAgICAgICAgICAgICAgLmRlbGF5KDEwMG1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICY6bnRoLWNoaWxkKDQpIHtcbiAgICAgICAgICAgICAgICAuZGVsYXkoMTUwbXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJjpudGgtY2hpbGQoNSkge1xuICAgICAgICAgICAgICAgIC5kZWxheSgyMDBtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmOm50aC1jaGlsZCg2KSB7XG4gICAgICAgICAgICAgICAgLmRlbGF5KDI1MG1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuLy8gUG9wb3ZlIE1vcnBoXG4uZmxvYXRpbmctYnV0dG9uLXRvLXBvcG92ZXIge1xuICAgICYuZmxvYXRpbmctYnV0dG9uLXRvLXBvcG92ZXIge1xuICAgICAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgfVxuICAgICYuZmxvYXRpbmctYnV0dG9uLXRvLXBvcG92ZXItaW4ge1xuICAgICAgICAudHJhbnNpdGlvbigxMDBtcyk7XG4gICAgICAgIGkge1xuICAgICAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKDEwMG1zKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAmLmZsb2F0aW5nLWJ1dHRvbi10by1wb3BvdmVyLXNjYWxlIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICAgICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgICAgICBib3gtc2hhZG93OiBub25lO1xuICAgIH1cbiAgICAmLmZsb2F0aW5nLWJ1dHRvbi10by1wb3BvdmVyLW91dCB7XG4gICAgICAgIC5kZWxheSgwbXMpO1xuICAgICAgICAudHJhbnNpdGlvbigzMDBtcyk7XG4gICAgICAgIGkge1xuICAgICAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKDEwMG1zKTtcbiAgICAgICAgICAgIC5kZWxheSgyMDBtcyk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyogPT09IE1vZGFscyA9PT0gKi9cbkBtb2RhbEJnQ29sb3I6I2ZmZjtcbkBtb2RhbEJ1dG9uQ29sb3IgOiAjNDI4NWY0O1xuQG1vZGFsQnV0b25CZzogQG1vZGFsQmdDb2xvcjtcbkBtb2RhbER1cmF0aW9uOjQwMG1zO1xuQGFjdGlvbnNNb2RhbER1cmF0aW9uOjMwMG1zO1xuQHBvcG92ZXJEdXJhdGlvbjogMzAwbXM7XG5AcG9wdXBEdXJhdGlvbjogNDAwbXM7XG4ubW9kYWwtb3ZlcmxheSwgLnByZWxvYWRlci1pbmRpY2F0b3Itb3ZlcmxheSwgLnBvcHVwLW92ZXJsYXksIC5waWNrZXItbW9kYWwtb3ZlcmxheSB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDAuNCk7XG4gICAgei1pbmRleDogMTMwMDA7XG4gICAgdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgLnRyYW5zaXRpb24oQG1vZGFsRHVyYXRpb24pO1xuICAgICYubW9kYWwtb3ZlcmxheS12aXNpYmxlIHtcbiAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG59XG4ucG9wdXAtb3ZlcmxheSB7XG4gICAgei1pbmRleDogMTA1MDA7XG59XG4ucGlja2VyLW1vZGFsLW92ZXJsYXkge1xuICAgIHotaW5kZXg6IDEyMDAwO1xufVxuLm1vZGFsIHtcbiAgICB3aWR0aDogMjgwcHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHotaW5kZXg6IDEzNTAwO1xuICAgIGxlZnQ6IDUwJTtcbiAgICBtYXJnaW4tbGVmdDogLTE0MHB4O1xuICAgIG1hcmdpbi10b3A6IDA7XG4gICAgdG9wOiA1MCU7XG4gICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgIG9wYWNpdHk6IDA7XG4gICAgLnRyYW5zZm9ybSh0cmFuc2xhdGUzZCgwLDAsMCkgc2NhbGUoMS4xODUpKTtcbiAgICAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IC13ZWJraXQtdHJhbnNmb3JtLCBvcGFjaXR5O1xuICAgIC1tb3otdHJhbnNpdGlvbi1wcm9wZXJ0eTogLW1vei10cmFuc2Zvcm0sIG9wYWNpdHk7XG4gICAgLW1zLXRyYW5zaXRpb24tcHJvcGVydHk6IC1tcy10cmFuc2Zvcm0sIG9wYWNpdHk7XG4gICAgLW8tdHJhbnNpdGlvbi1wcm9wZXJ0eTogLW8tdHJhbnNmb3JtLCBvcGFjaXR5O1xuICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgb3BhY2l0eTtcbiAgICBjb2xvcjojNzU3NTc1O1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gICAgLmRlcHRoKDUpO1xuICAgICYubW9kYWwtaW4ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAudHJhbnNpdGlvbihAbW9kYWxEdXJhdGlvbik7XG4gICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMCwwLDApIHNjYWxlKDEpKTtcbiAgICB9XG4gICAgJi5tb2RhbC1vdXQge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB6LWluZGV4OiAxMzUwMC0xO1xuICAgICAgICAudHJhbnNpdGlvbihAbW9kYWxEdXJhdGlvbik7XG4gICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMCwwLDApIHNjYWxlKDAuODE1KSk7XG4gICAgfVxufVxuLm1vZGFsLWlubmVyIHtcbiAgICBwYWRkaW5nOiAyNHB4IDI0cHggMjBweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG4ubW9kYWwtdGl0bGUge1xuICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgZm9udC1zaXplOiAyMHB4O1xuICAgIGNvbG9yOiMyMTIxMjE7XG4gICAgbGluZS1oZWlnaHQ6IDEuMztcbiAgICArLm1vZGFsLXRleHQge1xuICAgICAgICBtYXJnaW4tdG9wOiAyMHB4O1xuICAgIH1cbn1cbi5tb2RhbC10ZXh0IHtcbiAgICBsaW5lLWhlaWdodDogMS41O1xufVxuLm1vZGFsLWJ1dHRvbnMge1xuICAgIGhlaWdodDogNDhweDtcbiAgICBwYWRkaW5nOiA2cHggOHB4O1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgYm94LXNpemluZzpib3JkZXItYm94O1xuICAgIC5mbGV4Ym94KCk7XG4gICAgLmp1c3RpZnktY29udGVudChmbGV4LWVuZCk7XG4gICAgJi5tb2RhbC1idXR0b25zLXZlcnRpY2FsIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGhlaWdodDogYXV0bztcbiAgICAgICAgcGFkZGluZzogMCAwIDhweCAwO1xuICAgICAgICAubW9kYWwtYnV0dG9uIHtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgICAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgICAgICAgICBoZWlnaHQ6IDQ4cHg7XG4gICAgICAgICAgICBsaW5lLWhlaWdodDogNDhweDtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgICAgICAgICBwYWRkaW5nLWxlZnQ6IDE2cHg7XG4gICAgICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxNnB4O1xuICAgICAgICB9XG4gICAgfVxufVxuLm1vZGFsLWJ1dHRvbiwgLm1vZGFsLWJ1dHRvbnMgLmJ1dHRvbiB7XG4gICAgLmJ1dHRvbjtcbiAgICAmLm1vZGFsLWJ1dHRvbi1ib2xkIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgICB9XG4gICAgKyAubW9kYWwtYnV0dG9uIHtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDRweDtcbiAgICB9XG59XG4ubW9kYWwtbm8tYnV0dG9ucyB7XG4gICAgLm1vZGFsLWJ1dHRvbnMge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbn1cbi8vIEFjdGlvbiBzaGVldFxuLmFjdGlvbnMtbW9kYWwge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICB6LWluZGV4OiAxMzUwMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMCwxMDAlLDApKTtcbiAgICBtYXgtaGVpZ2h0OiAxMDAlO1xuICAgIC5zY3JvbGxhYmxlKCk7XG4gICAgJi5tb2RhbC1pbiB7XG4gICAgICAgIC50cmFuc2l0aW9uKEBhY3Rpb25zTW9kYWxEdXJhdGlvbik7XG4gICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMCwwLDApKTtcbiAgICB9XG4gICAgJi5tb2RhbC1vdXQge1xuICAgICAgICB6LWluZGV4OiAxMzUwMC0xO1xuICAgICAgICAudHJhbnNpdGlvbihAYWN0aW9uc01vZGFsRHVyYXRpb24pO1xuICAgICAgICAudHJhbnNmb3JtKHRyYW5zbGF0ZTNkKDAsMTAwJSwwKSk7XG4gICAgfVxufVxuLmFjdGlvbnMtbW9kYWwtZ3JvdXAge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAuaGFpcmxpbmUoYm90dG9tLCAjZDJkMmQ2KTtcbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgfVxufVxuLmFjdGlvbnMtbW9kYWwtYnV0dG9uLCAuYWN0aW9ucy1tb2RhbC1sYWJlbCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICBtYXJnaW46IDA7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgcGFkZGluZzogMCAxNnB4O1xuICAgIGEge1xuICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gICAgICAgIGNvbG9yOiBpbmhlcml0O1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG4gICAgYiB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgfVxuICAgICYuYWN0aW9ucy1tb2RhbC1idXR0b24tYm9sZCB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7XG4gICAgfVxuICAgICYuYWN0aW9ucy1tb2RhbC1idXR0b24tcmVkIHtcbiAgICAgICAgY29sb3I6IEByZWQ7XG4gICAgfVxuICAgICYuZGlzYWJsZWQge1xuICAgICAgICBvcGFjaXR5OiAwLjk1O1xuICAgICAgICBjb2xvcjpAZ3JheTtcbiAgICB9XG59XG4uYWN0aW9ucy1tb2RhbC1idXR0b24ge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICBsaW5lLWhlaWdodDogNDhweDtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gICAgY29sb3I6IHJnYmEoMCwwLDAsMC44Nyk7XG4gICAgLnRyYW5zaXRpb24oMzAwbXMpO1xuICAgIGEsICYge1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOyAgICBcbiAgICB9XG4gICAgaHRtbDpub3QoLndhdGNoLWFjdGl2ZS1zdGF0ZSkgJjphY3RpdmUsICYuYWN0aXZlLXN0YXRlIHtcbiAgICAgICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjEpO1xuICAgIH1cbn1cbi5hY3Rpb25zLW1vZGFsLWxhYmVsIHtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gICAgY29sb3I6IHJnYmEoMCwwLDAsMC41NCk7XG4gICAgbWluLWhlaWdodDogNTZweDtcbiAgICBsaW5lLWhlaWdodDogMS4zO1xuICAgIHBhZGRpbmctdG9wOiAxMnB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAxMnB4O1xuICAgIC5mbGV4Ym94KCk7XG4gICAgLmp1c3RpZnktY29udGVudChmbGV4LXN0YXJ0KTtcbiAgICAuYWxpZ24taXRlbXMoY2VudGVyKTtcbn1cbi8vIFByb21wdFxuaW5wdXQubW9kYWwtdGV4dC1pbnB1dCB7XG4gICAgYm94LXNpemluZzpib3JkZXItYm94O1xuICAgIGhlaWdodDogMzZweDtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgIG1hcmdpbjogMDtcbiAgICBtYXJnaW4tdG9wOiAxNXB4O1xuICAgIHBhZGRpbmc6IDA7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICBmb250LWZhbWlseTogaW5oZXJpdDtcbiAgICBkaXNwbGF5OiBibG9jaztcbiAgICBib3gtc2hhZG93OiBub25lO1xuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAtbW96LWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgLW1zLWFwcGVhcmFuY2U6IG5vbmU7XG4gICAgYXBwZWFyYW5jZTogbm9uZTtcbiAgICAudHJhbnNpdGlvbigyMDBtcyk7XG4gICAgJjo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XG4gICAgICAgY29sb3I6IHJnYmEoMCwwLDAsMC4zNSk7XG4gICAgfVxuICAgICsgaW5wdXQubW9kYWwtdGV4dC1pbnB1dCB7XG4gICAgICAgIG1hcmdpbi10b3A6IDE2cHg7XG4gICAgfVxufVxuLy8gUG9wb3ZlclxuLnBvcG92ZXIge1xuICAgIHdpZHRoOiAzMjBweDtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgIHotaW5kZXg6IDEzNTAwO1xuICAgIG1hcmdpbjogMDtcbiAgICB0b3A6IDA7XG4gICAgb3BhY2l0eTogMDtcbiAgICBsZWZ0OiAwO1xuICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICAuZGVwdGgoMik7XG4gICAgLnRyYW5zZm9ybShzY2FsZSgwLjg1LCAwLjYpKTtcbiAgICAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IG9wYWNpdHksIC13ZWJraXQtdHJhbnNmb3JtLCBib3JkZXItcmFkaXVzO1xuICAgIC1tb3otdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eSwgLW1vei10cmFuc2Zvcm0sIGJvcmRlci1yYWRpdXM7XG4gICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogb3BhY2l0eSwgdHJhbnNmb3JtLCBib3JkZXItcmFkaXVzO1xuICAgICYucG9wb3Zlci1vbi10b3Age1xuICAgICAgICAudHJhbnNmb3JtLW9yaWdpbihjZW50ZXIgYm90dG9tKTtcbiAgICB9XG4gICAgJi5wb3BvdmVyLW9uLWJvdHRvbSB7XG4gICAgICAgIC50cmFuc2Zvcm0tb3JpZ2luKGNlbnRlciB0b3ApO1xuICAgIH1cbiAgICAmLm1vZGFsLWluIHtcbiAgICAgICAgLnRyYW5zZm9ybShzY2FsZSgxKSk7XG4gICAgICAgIC50cmFuc2l0aW9uKEBwb3BvdmVyRHVyYXRpb24pO1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgIH1cbiAgICAmLm1vZGFsLW91dCB7XG4gICAgICAgIC50cmFuc2Zvcm0oc2NhbGUoMSkpO1xuICAgICAgICAudHJhbnNpdGlvbihAcG9wb3ZlckR1cmF0aW9uKTtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICB9XG4gICAgLmxpc3QtYmxvY2sge1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgICY6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCB1bCB7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7XG4gICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgICAgIH1cbiAgICAgICAgdWwge1xuICAgICAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgICAgIC5oYWlybGluZS1yZW1vdmUodG9wKTtcbiAgICAgICAgfVxuICAgICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICAgIHVsIHtcbiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAzcHggM3B4IDAgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxpOmZpcnN0LWNoaWxkIGEge1xuICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDNweCAzcHggMCAwO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgICY6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgICB1bCB7XG4gICAgICAgICAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDAgMCAzcHggM3B4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGk6bGFzdC1jaGlsZCBhIHtcbiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwIDAgM3B4IDNweDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAmOmZpcnN0LWNoaWxkOmxhc3QtY2hpbGQge1xuICAgICAgICAgICAgbGk6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCBhLCB1bDpmaXJzdC1jaGlsZDpsYXN0LWNoaWxkIHtcbiAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgJi5wb3BvdmVyLWZsb2F0aW5nLWJ1dHRvbiB7XG4gICAgICAgIC50cmFuc2Zvcm0tb3JpZ2luKGNlbnRlciBjZW50ZXIpO1xuICAgICAgICAudHJhbnNmb3JtKHNjYWxlKDAuNykpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICAgIC5kZXB0aCgzKTtcbiAgICAgICAgJi5tb2RhbC1pbiB7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwJTtcbiAgICAgICAgICAgIC50cmFuc2Zvcm0oc2NhbGUoMSkpO1xuICAgICAgICAgICAgLmRlbGF5KDIwMG1zKTtcbiAgICAgICAgICAgIC50cmFuc2l0aW9uKDIwMG1zKTtcbiAgICAgICAgfVxuICAgICAgICAmLm1vZGFsLW91dCB7XG4gICAgICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICAgICAgICAudHJhbnNmb3JtKHNjYWxlKDAuNykpO1xuICAgICAgICAgICAgLmRlbGF5KDBtcyk7XG4gICAgICAgICAgICAudHJhbnNpdGlvbigxMDBtcyk7XG4gICAgICAgIH1cbiAgICAgICAgLmxpc3QtYmxvY2sge1xuICAgICAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICAgICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgICAgICAgICAgdWwge1xuICAgICAgICAgICAgICAgICAgICBib3JkZXItcmFkaXVzOiAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsaTpmaXJzdC1jaGlsZCBhIHtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICAgICAgICAgIHVsIHtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGk6bGFzdC1jaGlsZCBhIHtcbiAgICAgICAgICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAmOmZpcnN0LWNoaWxkOmxhc3QtY2hpbGQge1xuICAgICAgICAgICAgICAgIGxpOmZpcnN0LWNoaWxkOmxhc3QtY2hpbGQgYSwgdWw6Zmlyc3QtY2hpbGQ6bGFzdC1jaGlsZCB7XG4gICAgICAgICAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuLnBvcG92ZXItaW5uZXIge1xuICAgIC5zY3JvbGxhYmxlKCk7XG59XG4uYWN0aW9ucy1wb3BvdmVyIHtcbiAgICAubGlzdC1ibG9jayB7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICB9XG59XG4uYWN0aW9ucy1wb3BvdmVyLWxhYmVsIHtcbiAgICBwYWRkaW5nOiA4cHggMTZweDtcbiAgICBjb2xvcjpyZ2JhKDAsMCwwLDAuNTQpO1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICBsaW5lLWhlaWdodDogMS4zO1xuICAgIHBhZGRpbmctdG9wOiAxMnB4O1xuICAgIHBhZGRpbmctYm90dG9tOiAxMnB4O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAuaGFpcmxpbmUoYm90dG9tLCAjZDJkMmQ2KTtcbiAgICAmOmxhc3QtY2hpbGQge1xuICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKGJvdHRvbSk7XG4gICAgfVxufVxuLy8gUG9wdXBcbi5wb3B1cCwgLmxvZ2luLXNjcmVlbiB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgdG9wOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICB6LWluZGV4OiAxMTAwMDtcbiAgICBiYWNrZ3JvdW5kOiAjZmZmO1xuICAgIGJveC1zaXppbmc6Ym9yZGVyLWJveDtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIC5zY3JvbGxhYmxlKCk7XG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybTtcbiAgICAtbW96LXRyYW5zaXRpb24tcHJvcGVydHk6IC1tb3otdHJhbnNmb3JtO1xuICAgIC1tcy10cmFuc2l0aW9uLXByb3BlcnR5OiAtbXMtdHJhbnNmb3JtO1xuICAgIC1vLXRyYW5zaXRpb24tcHJvcGVydHk6IC1vLXRyYW5zZm9ybTtcbiAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm07XG4gICAgLnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTtcbiAgICAmLm1vZGFsLWluLCAmLm1vZGFsLW91dCB7XG4gICAgICAgIC50cmFuc2l0aW9uKEBwb3B1cER1cmF0aW9uKTtcbiAgICB9XG4gICAgJi5tb2RhbC1pbiB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgfVxuICAgICYubW9kYWwtb3V0IHtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMTAwJSwwKTtcbiAgICB9XG59XG4ubG9naW4tc2NyZWVuLm1vZGFsLWluLCAubG9naW4tc2NyZWVuLm1vZGFsLW91dCB7XG4gICAgZGlzcGxheTogYmxvY2s7XG59XG4vLyBpUGFkIFBvcHVwXG5AbWVkaWEgYWxsIGFuZCAobWluLXdpZHRoOjYzMHB4KSBhbmQgKG1pbi1oZWlnaHQ6NjMwcHgpIHtcbiAgICAucG9wdXA6bm90KC50YWJsZXQtZnVsbHNjcmVlbikge1xuICAgICAgICB3aWR0aDogNjMwcHg7XG4gICAgICAgIGhlaWdodDogNjMwcHg7XG4gICAgICAgIGxlZnQ6IDUwJTtcbiAgICAgICAgdG9wOiA1MCU7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAtMzE1cHg7XG4gICAgICAgIG1hcmdpbi10b3A6IC0zMTVweDtcbiAgICAgICAgYm94LXNoYWRvdzogMHB4IDIwcHggNDRweCByZ2JhKDAsMCwwLDAuNSk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMTAyNHB4LDApO1xuICAgICAgICAmLm1vZGFsLWluIHtcbiAgICAgICAgICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgICAgIH1cbiAgICAgICAgJi5tb2RhbC1vdXQge1xuICAgICAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMTAyNHB4LDApO1xuICAgICAgICB9XG4gICAgfVxufVxuaHRtbC53aXRoLXN0YXR1c2Jhci1vdmVybGF5IHtcbiAgICAvLyBpUGhvbmUgd2l0aCBzdGF0dXNiYXIgb3ZlcmxheVxuICAgIEBtZWRpYSBhbGwgYW5kIChtYXgtd2lkdGg6NjI5cHgpLCAobWF4LWhlaWdodDo2MjlweCkge1xuICAgICAgICAucG9wdXAge1xuICAgICAgICAgICAgaGVpZ2h0OiB+XCItd2Via2l0LWNhbGMoMTAwJSAtIDIwcHgpXCI7XG4gICAgICAgICAgICBoZWlnaHQ6IH5cImNhbGMoMTAwJSAtIDIwcHgpXCI7XG4gICAgICAgICAgICB0b3A6IDIwcHg7XG4gICAgICAgIH1cbiAgICAgICAgLnBvcHVwLW92ZXJsYXkge1xuICAgICAgICAgICAgei1pbmRleDogOTUwMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAubG9naW4tc2NyZWVuLCAucG9wdXAudGFibGV0LWZ1bGxzY3JlZW4ge1xuICAgICAgICBoZWlnaHQ6IH5cIi13ZWJraXQtY2FsYygxMDAlIC0gMjBweClcIjtcbiAgICAgICAgaGVpZ2h0OiB+XCJjYWxjKDEwMCUgLSAyMHB4KVwiO1xuICAgICAgICB0b3A6IDIwcHg7XG4gICAgfVxufVxuXG4vL1ByZWxvYWRlcnMgbW9kYWxzXG4ubW9kYWwtcHJlbG9hZGVyIHtcbiAgICAubW9kYWwtdGl0bGUsIC5tb2RhbC1pbm5lciB7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICB9XG59XG4ucHJlbG9hZGVyLWluZGljYXRvci1vdmVybGF5IHtcbiAgICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgYmFja2dyb3VuZDogbm9uZTtcbn1cbi5wcmVsb2FkZXItaW5kaWNhdG9yLW1vZGFsIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgbGVmdDogNTAlO1xuICAgIHRvcDogNTAlO1xuICAgIHBhZGRpbmc6IDhweDtcbiAgICBtYXJnaW4tbGVmdDogLTI0cHg7XG4gICAgbWFyZ2luLXRvcDogLTI0cHg7XG4gICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjgpO1xuICAgIHotaW5kZXg6IDEzNTAwO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAucHJlbG9hZGVyIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgfVxufVxuXG4vLyBQaWNrZXIgTW9kYWxcbi5waWNrZXItbW9kYWwge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDI2MHB4O1xuICAgIHotaW5kZXg6IDEyMDAwO1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybTtcbiAgICAtbW96LXRyYW5zaXRpb24tcHJvcGVydHk6IC1tb3otdHJhbnNmb3JtO1xuICAgIC1tcy10cmFuc2l0aW9uLXByb3BlcnR5OiAtbXMtdHJhbnNmb3JtO1xuICAgIC1vLXRyYW5zaXRpb24tcHJvcGVydHk6IC1vLXRyYW5zZm9ybTtcbiAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm07XG4gICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICAudHJhbnNsYXRlM2QoMCwxMDAlLDApO1xuICAgICYubW9kYWwtaW4sICYubW9kYWwtb3V0IHtcbiAgICAgICAgLnRyYW5zaXRpb24oNDAwbXMpO1xuICAgIH1cbiAgICAmLm1vZGFsLWluIHtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG4gICAgJi5tb2RhbC1vdXQge1xuICAgICAgICAudHJhbnNsYXRlM2QoMCwxMDAlLDApO1xuICAgIH1cbiAgICAucGlja2VyLW1vZGFsLWlubmVyIHtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgfVxuICAgIC50b29sYmFyIHtcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICArIC5waWNrZXItbW9kYWwtaW5uZXIge1xuICAgICAgICAgICAgaGVpZ2h0OiB+XCItd2Via2l0LWNhbGMoMTAwJSAtIEB7dG9vbGJhclNpemV9KVwiO1xuICAgICAgICAgICAgaGVpZ2h0OiB+XCItbW96LWNhbGMoMTAwJSAtIEB7dG9vbGJhclNpemV9KVwiO1xuICAgICAgICAgICAgaGVpZ2h0OiB+XCJjYWxjKDEwMCUgLSBAe3Rvb2xiYXJTaXplfSlcIjsgICAgXG4gICAgICAgIH1cbiAgICAgICAgYS5saW5rIHtcbiAgICAgICAgICAgIC5mbGV4LXNocmluaygwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAucGlja2VyLWhlYWRlciwgLnBpY2tlci1mb290ZXIge1xuICAgICAgICBoZWlnaHQ6IEB0b29sYmFyU2l6ZTtcbiAgICB9XG4gICAgLnBpY2tlci1oZWFkZXIge1xuICAgICAgICBiYWNrZ3JvdW5kOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgKyAudG9vbGJhciAudG9vbGJhci1pbm5lciB7XG4gICAgICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTtcbiAgICAgICAgfVxuICAgICAgICArIC5waWNrZXItZm9vdGVyICsgLnRvb2xiYXIgKyAucGlja2VyLW1vZGFsLWlubmVyIHtcbiAgICAgICAgICAgIGhlaWdodDogflwiLXdlYmtpdC1jYWxjKDEwMCUgLSBAe3Rvb2xiYXJTaXplfSAqIDMpXCI7XG4gICAgICAgICAgICBoZWlnaHQ6IH5cIi1tb3otY2FsYygxMDAlIC0gQHt0b29sYmFyU2l6ZX0gKiAzKVwiO1xuICAgICAgICAgICAgaGVpZ2h0OiB+XCJjYWxjKDEwMCUgLSBAe3Rvb2xiYXJTaXplfSAqIDMpXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnBpY2tlci1mb290ZXIge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIC5tb2RhbC1idXR0b25zO1xuICAgICAgICBcbiAgICB9XG4gICAgLnBpY2tlci1oZWFkZXIsIC5waWNrZXItZm9vdGVyIHtcbiAgICAgICAgKyAucGlja2VyLW1vZGFsLWlubmVyIHtcbiAgICAgICAgICAgIGhlaWdodDogflwiLXdlYmtpdC1jYWxjKDEwMCUgLSBAe3Rvb2xiYXJTaXplfSlcIjtcbiAgICAgICAgICAgIGhlaWdodDogflwiLW1vei1jYWxjKDEwMCUgLSBAe3Rvb2xiYXJTaXplfSlcIjtcbiAgICAgICAgICAgIGhlaWdodDogflwiY2FsYygxMDAlIC0gQHt0b29sYmFyU2l6ZX0pXCI7ICAgIFxuICAgICAgICB9XG4gICAgICAgICsgLnRvb2xiYXIgKyAucGlja2VyLW1vZGFsLWlubmVyIHtcbiAgICAgICAgICAgIGhlaWdodDogflwiLXdlYmtpdC1jYWxjKDEwMCUgLSBAe3Rvb2xiYXJTaXplfSAqIDIpXCI7XG4gICAgICAgICAgICBoZWlnaHQ6IH5cIi1tb3otY2FsYygxMDAlIC0gQHt0b29sYmFyU2l6ZX0gKiAyKVwiO1xuICAgICAgICAgICAgaGVpZ2h0OiB+XCJjYWxjKDEwMCUgLSBAe3Rvb2xiYXJTaXplfSAqIDIpXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgJi5waWNrZXItbW9kYWwtaW5saW5lLCAucG9wb3ZlciAmIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgei1pbmRleDogaW5oZXJpdDtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICAgICAgLnRvb2xiYXIge1xuICAgICAgICAgICAgdG9wOiAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIC5wb3BvdmVyICYge1xuICAgICAgICB3aWR0aDogYXV0bztcbiAgICAgICAgLnRvb2xiYXI6Zmlyc3QtY2hpbGQsIC5waWNrZXItaGVhZGVyOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDJweCAycHggMCAwO1xuICAgICAgICB9XG4gICAgfVxuICAgICYuc21hcnQtc2VsZWN0LXBpY2tlciB7XG4gICAgICAgIC5saXN0LWJsb2NrIHtcbiAgICAgICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgICAgIHVsIHtcbiAgICAgICAgICAgICAgICAuaGFpcmxpbmUtcmVtb3ZlKHRvcCk7XG4gICAgICAgICAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qID09PSBUb3VjaCByaXBwbGUgPT09ICovXG4vLyBSaXBwbGUgRWxlbWVudHNcbi5yaXBwbGUsIGEuZmxvYXRpbmctYnV0dG9uLCAuZmxvYXRpbmctYnV0dG9uID4gYSwgYS5saW5rLCBhLml0ZW0tbGluaywgLmJ1dHRvbiwgLm1vZGFsLWJ1dHRvbiwgLnRhYi1saW5rLCAubGFiZWwtcmFkaW8sIC5sYWJlbC1jaGVja2JveCwgLmFjdGlvbnMtbW9kYWwtYnV0dG9uLCAuc3BlZWQtZGlhbC1idXR0b25zIGEge1xuICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gICAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG4vLyBSaXBwbGVcbi5yaXBwbGUtd2F2ZSB7XG4gICAgbGVmdDogMDtcbiAgICB0b3A6IDA7XG4gICAgcG9zaXRpb246IGFic29sdXRlICFpbXBvcnRhbnQ7XG4gICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIHotaW5kZXg6LTE7XG4gICAgYmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuMSk7XG4gICAgcGFkZGluZzogMDtcbiAgICBtYXJnaW46IDA7XG4gICAgZm9udC1zaXplOiAwO1xuICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMHB4LCAwcHgsIDApIHNjYWxlKDApKTtcbiAgICAudHJhbnNpdGlvbigxNDAwbXMpO1xuICAgICYucmlwcGxlLXdhdmUtZmlsbCB7XG4gICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgb3BhY2l0eTogMC4zNTtcbiAgICB9XG4gICAgJi5yaXBwbGUtd2F2ZS1vdXQge1xuICAgICAgICAudHJhbnNpdGlvbig2MDBtcyk7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgfVxuICAgIC5idXR0b24tZmlsbCAmLCAgLnBpY2tlci1jYWxlbmRhci1kYXkgJntcbiAgICAgICAgei1pbmRleDogMTtcbiAgICB9XG59XG4uYnV0dG9uLWZpbGwsIC5uYXZiYXIsIC50b29sYmFyLCAuc3VibmF2YmFyLCAuc2VhcmNoYmFyLCAubm90aWZpY2F0aW9ucywgLmZsb2F0aW5nLWJ1dHRvbiwgLnNwZWVkLWRpYWwtYnV0dG9ucyBhIHtcbiAgICAucmlwcGxlLXdhdmUge1xuICAgICAgICBiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsMC4zKTtcbiAgICB9XG59XG4ubWVzc2FnZWJhciB7XG4gICAgLnJpcHBsZS13YXZlIHtcbiAgICAgICAgYmFja2dyb3VuZDpyZ2JhKDAsMCwwLDAuMSk7XG4gICAgfVxufVxuIiwiLy8gQWN0aXZlIGJ1dHRvbiBpY29uIGNvbG9yXG5cbi5idXR0b24ge1xuICAmLmFjdGl2ZSB7XG4gICAgaS5pY29uIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgfVxuICB9XG59XG4iLCIvKiA9PT0gUGFuZWxzID09PSAqL1xuQHBhbmVsV2lkdGg6MjYwcHg7XG5AcGFuZWxzRHVyYXRpb246IDMwMG1zO1xuLnBhbmVsLW92ZXJsYXkge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYmFja2dyb3VuZDogcmdiYSgwLDAsMCwwLjIpO1xuICAgIG9wYWNpdHk6IDA7XG4gICAgei1pbmRleDogNTk5OTtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMCwwLDApKTtcbiAgICAudHJhbnNpdGlvbihAcGFuZWxzRHVyYXRpb24pO1xufVxuLnBhbmVsIHtcbiAgICB6LWluZGV4OiAxMDAwO1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgYmFja2dyb3VuZDogI2ZmZjtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC5zY3JvbGxhYmxlKCk7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHdpZHRoOiBAcGFuZWxXaWR0aDtcbiAgICB0b3A6IDA7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIC50cmFuc2xhdGUzZCgwKTtcbiAgICAudHJhbnNpdGlvbihAcGFuZWxzRHVyYXRpb24pO1xuXG4gICAgJi5wYW5lbC1sZWZ0IHtcblxuICAgICAgICAmLnBhbmVsLWNvdmVyIHtcbiAgICAgICAgICAgIHotaW5kZXg6IDYwMDA7XG4gICAgICAgICAgICBsZWZ0OiAtQHBhbmVsV2lkdGg7XG4gICAgICAgIH1cbiAgICAgICAgJi5wYW5lbC1yZXZlYWwge1xuICAgICAgICAgICAgbGVmdDogMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAmLnBhbmVsLXJpZ2h0IHtcbiAgICAgICAgJi5wYW5lbC1jb3ZlciB7XG4gICAgICAgICAgICB6LWluZGV4OiA2MDAwO1xuICAgICAgICAgICAgcmlnaHQ6IC1AcGFuZWxXaWR0aDtcbiAgICAgICAgfVxuICAgICAgICAmLnBhbmVsLXJldmVhbCB7XG4gICAgICAgICAgICByaWdodDogMDtcbiAgICAgICAgfVxuICAgIH1cbn1cbmJvZHkud2l0aC1wYW5lbC1sZWZ0LWNvdmVyLCBib2R5LndpdGgtcGFuZWwtcmlnaHQtY292ZXIge1xuICAgIC5wYW5lbCB7XG4gICAgICAgIGJveC1zaGFkb3c6IDBweCAwcHggMjBweCByZ2JhKDAsMCwwLDAuNSk7XG4gICAgfVxuICAgIC52aWV3cyB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwKTtcbiAgICB9XG4gICAgLnBhbmVsLW92ZXJsYXkge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG59XG5ib2R5LndpdGgtcGFuZWwtbGVmdC1yZXZlYWwsIGJvZHkud2l0aC1wYW5lbC1yaWdodC1yZXZlYWwge1xuICAgIC52aWV3cyB7XG4gICAgICAgIGJveC1zaGFkb3c6IDBweCAwcHggMjBweCByZ2JhKDAsMCwwLDAuNSk7XG4gICAgICAgIC50cmFuc2l0aW9uKEBwYW5lbHNEdXJhdGlvbik7XG4gICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm0sIGJveC1zaGFkb3c7XG4gICAgICAgIC1tb3otdHJhbnNpdGlvbi1wcm9wZXJ0eTogLW1vei10cmFuc2Zvcm0sIGJveC1zaGFkb3c7XG4gICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgYm94LXNoYWRvdztcbiAgICB9XG4gICAgLnBhbmVsLW92ZXJsYXkge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsMCwwLDApO1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICB9XG59XG5ib2R5LndpdGgtcGFuZWwtbGVmdC1yZXZlYWwge1xuICAgIC52aWV3cyB7XG4gICAgICAgIC50cmFuc2xhdGUzZChAcGFuZWxXaWR0aCk7XG4gICAgfVxuICAgIC5wYW5lbC1vdmVybGF5IHtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKEBwYW5lbFdpZHRoKTtcbiAgICB9XG59XG5ib2R5LndpdGgtcGFuZWwtbGVmdC1jb3ZlciB7XG4gICAgLnBhbmVsLWxlZnQge1xuICAgICAgICAudHJhbnNsYXRlM2QoQHBhbmVsV2lkdGgpO1xuICAgIH1cbn1cbmJvZHkud2l0aC1wYW5lbC1yaWdodC1yZXZlYWwge1xuICAgIC52aWV3cyB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgtQHBhbmVsV2lkdGgpO1xuICAgIH1cbiAgICAucGFuZWwtb3ZlcmxheSB7XG4gICAgICAgIC50cmFuc2xhdGUzZCgtQHBhbmVsV2lkdGgpO1xuICAgIH1cbn1cbmJvZHkud2l0aC1wYW5lbC1yaWdodC1jb3ZlciB7XG4gICAgLnBhbmVsLXJpZ2h0IHtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKC1AcGFuZWxXaWR0aCk7XG4gICAgfVxufVxuYm9keS5wYW5lbC1jbG9zaW5nIHtcbiAgICAucGFuZWwtb3ZlcmxheSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICAudmlld3Mge1xuICAgICAgICAudHJhbnNpdGlvbihAcGFuZWxzRHVyYXRpb24pO1xuICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IC13ZWJraXQtdHJhbnNmb3JtLCBib3gtc2hhZG93O1xuICAgICAgICAtbW96LXRyYW5zaXRpb24tcHJvcGVydHk6IC1tb3otdHJhbnNmb3JtLCBib3gtc2hhZG93O1xuICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIGJveC1zaGFkb3c7XG4gICAgfVxufSIsIi8qID09PSBUYWJzID09PSAqL1xuLnRhYnMge1xuICAgIC50YWIge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgICAudGFiLmFjdGl2ZSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbn1cbi50YWJzLWFuaW1hdGVkLXdyYXAge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICA+LnRhYnMge1xuICAgICAgICAuZmxleGJveCgpO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAgICAgPi50YWIge1xuICAgICAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgICAgIC5mbGV4LXNocmluaygwKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi50YWJzLXN3aXBlYWJsZS13cmFwIHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgPiAudGFicyA+IC50YWIge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICB9XG59IiwiLyogPT09IE1lc3NhZ2VzID09PSAqL1xuQG1lc3NhZ2VzQXZhdGFyU2l6ZTogNDhweDtcbi5tZXNzYWdlcy1jb250ZW50IHtcbiAgICBiYWNrZ3JvdW5kOiAjZWVlO1xufVxuLm1lc3NhZ2VzIHtcbiAgICAuZmxleGJveCgpO1xuICAgIC13ZWJraXQtYm94LW9yaWVudDogdmVydGljYWw7XG4gICAgLW1vei1ib3gtb3JpZW50OiB2ZXJ0aWNhbDtcbiAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbn1cbi5tZXNzYWdlcy1kYXRlIHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgZm9udC13ZWlnaHQ6IDUwMDtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgbGluZS1oZWlnaHQ6IDE7XG4gICAgbWFyZ2luOiAxMHB4IDE1cHg7XG4gICAgc3BhbiB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7XG4gICAgfVxufVxuLm1lc3NhZ2Uge1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgbWFyZ2luOiAwcHggOHB4IDhweCA4cHg7XG4gICAgbWF4LXdpZHRoOiA4MCU7XG4gICAgLmZsZXhib3goKTtcbiAgICAtd2Via2l0LWJveC1vcmllbnQ6IHZlcnRpY2FsO1xuICAgIC1tb3otYm94LW9yaWVudDogdmVydGljYWw7XG4gICAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgJjpmaXJzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi10b3A6IDhweDtcbiAgICB9XG4gICAgJi5tZXNzYWdlLXBpYyB7XG4gICAgICAgIGltZyB7XG4gICAgICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgfVxuICAgIH1cbn1cbi5tZXNzYWdlLW5hbWUsIC5tZXNzYWdlLWxhYmVsLCAubWVzc2FnZS1kYXRlLCAubWVzc2FnZXMtZGF0ZSB7XG4gICAgY29sb3I6cmdiYSgwLDAsMCwwLjUxKTtcbn1cbi5tZXNzYWdlLW5hbWUge1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICBsaW5lLWhlaWdodDogMTtcbiAgICBtYXJnaW4tYm90dG9tOiAycHg7XG4gICAgbWFyZ2luLXRvcDogN3B4O1xuICAgIC5tZXNzYWdlLWhpZGUtbmFtZSAmIHtcbiAgICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG59XG4ubWVzc2FnZS1sYWJlbCB7XG4gICAgZm9udC1zaXplOiAxMnB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxO1xuICAgIG1hcmdpbi10b3A6IDRweDtcbiAgICAubWVzc2FnZS1oaWRlLWxhYmVsICYge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbn1cbi5tZXNzYWdlLWF2YXRhciB7XG4gICAgd2lkdGg6IEBtZXNzYWdlc0F2YXRhclNpemU7XG4gICAgaGVpZ2h0OiBAbWVzc2FnZXNBdmF0YXJTaXplO1xuICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgbWFyZ2luLXRvcDogLUBtZXNzYWdlc0F2YXRhclNpemU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHRvcDogMXB4O1xuICAgIGJhY2tncm91bmQtc2l6ZTogY292ZXI7XG4gICAgb3BhY2l0eTogMTtcbiAgICAudHJhbnNpdGlvbig0MDBtcyk7XG4gICAgLm1lc3NhZ2UtaGlkZS1hdmF0YXIgJiB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgfVxufVxuLm1lc3NhZ2UtdGV4dCB7XG4gICAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgcGFkZGluZzogNnB4IDhweDtcbiAgICBtaW4td2lkdGg6IDQ4cHg7XG4gICAgZm9udC1zaXplOiAxNnB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxLjI7XG4gICAgd29yZC1icmVhazogYnJlYWstd29yZDtcbiAgICBjb2xvcjojMzMzO1xuICAgIG1pbi1oZWlnaHQ6IEBtZXNzYWdlc0F2YXRhclNpemU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgaW1nIHtcbiAgICAgICAgbWF4LXdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IGF1dG87XG4gICAgfVxuICAgIC5tZXNzYWdlLXBpYyAmIHtcbiAgICAgICAgcGFkZGluZzogOHB4O1xuICAgIH1cbn1cbi5tZXNzYWdlLWRhdGUge1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgLm1lc3NhZ2UtcGljIGltZyArICYge1xuICAgICAgICBtYXJnaW4tdG9wOiA4cHg7XG4gICAgfVxufVxuLm1lc3NhZ2Utc2VudCB7XG4gICAgLW1zLWZsZXgtaXRlbS1hbGlnbjogZW5kO1xuICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1lbmQ7XG4gICAgYWxpZ24tc2VsZjogZmxleC1lbmQ7XG4gICAgLmFsaWduLWl0ZW1zKGZsZXgtZW5kKTtcbiAgICAubWVzc2FnZS1uYW1lLCAubWVzc2FnZS1sYWJlbCB7XG4gICAgICAgIG1hcmdpbi1yaWdodDogOHB4O1xuICAgIH1cbiAgICAubWVzc2FnZS10ZXh0IHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI0M4RTZDOTtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IGF1dG87XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDJweCAycHggMCAycHg7XG4gICAgICAgIG1hcmdpbi1yaWdodDogOHB4O1xuICAgICAgICAmOmJlZm9yZSB7XG4gICAgICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgICAgICBjb250ZW50OiAnJztcbiAgICAgICAgICAgIGJvcmRlci1sZWZ0OiAwcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICAgICAgICBib3JkZXItcmlnaHQ6IDhweCBzb2xpZCB0cmFuc3BhcmVudDtcbiAgICAgICAgICAgIGJvcmRlci1ib3R0b206IDhweCBzb2xpZCAjQzhFNkM5O1xuICAgICAgICAgICAgbGVmdDogMTAwJTtcbiAgICAgICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgICAgIHdpZHRoOiAwO1xuICAgICAgICAgICAgaGVpZ2h0OiAwO1xuICAgICAgICB9XG4gICAgfVxuICAgICYubWVzc2FnZS13aXRoLWF2YXRhciB7XG4gICAgICAgIC5tZXNzYWdlLXRleHQsIC5tZXNzYWdlLW5hbWUsIC5tZXNzYWdlLWxhYmVsIHtcbiAgICAgICAgICAgIG1hcmdpbi1yaWdodDogQG1lc3NhZ2VzQXZhdGFyU2l6ZSArIDhweDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi5tZXNzYWdlLXJlY2VpdmVkIHtcbiAgICAtbXMtZmxleC1pdGVtLWFsaWduOiBzdGFydDtcbiAgICAtd2Via2l0LWFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7XG4gICAgYWxpZ24tc2VsZjogZmxleC1zdGFydDtcbiAgICAuYWxpZ24taXRlbXMoZmxleC1zdGFydCk7XG4gICAgLm1lc3NhZ2UtdGV4dCB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDJweCAycHggMnB4IDBweDtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgICAgICAgJjpiZWZvcmUge1xuICAgICAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgY29udGVudDogJyc7XG4gICAgICAgICAgICBib3JkZXItbGVmdDogOHB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgICAgICAgICAgYm9yZGVyLXJpZ2h0OiAwcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gICAgICAgICAgICBib3JkZXItYm90dG9tOiA4cHggc29saWQgI2ZmZjtcbiAgICAgICAgICAgIHJpZ2h0OiAxMDAlO1xuICAgICAgICAgICAgYm90dG9tOiAwO1xuICAgICAgICAgICAgd2lkdGg6IDA7XG4gICAgICAgICAgICBoZWlnaHQ6IDA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLm1lc3NhZ2UtbmFtZSwgLm1lc3NhZ2UtbGFiZWwge1xuICAgICAgICBtYXJnaW4tbGVmdDogOHB4O1xuICAgIH1cbiAgICAmLm1lc3NhZ2Utd2l0aC1hdmF0YXIge1xuICAgICAgICAubWVzc2FnZS10ZXh0LCAubWVzc2FnZS1uYW1lLCAubWVzc2FnZS1sYWJlbCB7XG4gICAgICAgICAgICBtYXJnaW4tbGVmdDogQG1lc3NhZ2VzQXZhdGFyU2l6ZSArIDhweDtcbiAgICAgICAgfVxuICAgIH0gICAgXG59XG5cbi5tZXNzYWdlLWFwcGVhci1mcm9tLWJvdHRvbSB7XG4gICAgLXdlYmtpdC1hbmltYXRpb246IG1lc3NhZ2VBcHBlYXJGcm9tQm90dG9tIDQwMG1zO1xuICAgIGFuaW1hdGlvbjogbWVzc2FnZUFwcGVhckZyb21Cb3R0b20gNDAwbXM7XG59XG4ubWVzc2FnZS1hcHBlYXItZnJvbS10b3Age1xuICAgIC13ZWJraXQtYW5pbWF0aW9uOiBtZXNzYWdlQXBwZWFyRnJvbVRvcCA0MDBtcztcbiAgICBhbmltYXRpb246IG1lc3NhZ2VBcHBlYXJGcm9tVG9wIDQwMG1zOyAgIFxufVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgbWVzc2FnZUFwcGVhckZyb21Cb3R0b20ge1xuICAgIGZyb20ge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwxMDAlLDApO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgfVxufVxuQGtleWZyYW1lcyBtZXNzYWdlQXBwZWFyRnJvbUJvdHRvbSB7XG4gICAgZnJvbSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwxMDAlLDApO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwwLDApO1xuICAgIH1cbn1cbkAtd2Via2l0LWtleWZyYW1lcyBtZXNzYWdlQXBwZWFyRnJvbVRvcCB7XG4gICAgZnJvbSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLC0xMDAlLDApO1xuICAgIH1cbiAgICB0byB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgfVxufVxuQGtleWZyYW1lcyBtZXNzYWdlQXBwZWFyRnJvbVRvcCB7XG4gICAgZnJvbSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwtMTAwJSwwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsMCwwKTtcbiAgICB9XG59XG4iLCIvKiA9PT0gU3RhdHVzYmFyIG92ZXJsYXkgPT09ICovXG5odG1sLndpdGgtc3RhdHVzYmFyLW92ZXJsYXkgYm9keXtcbiAgICBwYWRkaW5nLXRvcDogMjBweDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC5zdGF0dXNiYXItb3ZlcmxheSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIH1cbiAgICAucGFuZWwge1xuICAgICAgICBwYWRkaW5nLXRvcDogMjBweDtcbiAgICB9XG59XG4uc3RhdHVzYmFyLW92ZXJsYXkge1xuICAgIGJhY2tncm91bmQ6IEB0aGVtZUNvbG9yO1xuICAgIHotaW5kZXg6IDEwMDAwOyAvLyBBIGJpdCBsb3dlciB0aGFuIC5tb2RhbHMtb3ZlcmxheVxuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbiAgICBoZWlnaHQ6IDIwcHg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgICAudHJhbnNpdGlvbihAcGFuZWxzRHVyYXRpb24pO1xufSIsIi8qID09PVxuICAgIFByZWxvYWRlclxuICAgIEJ5IFJ1ZGkgVGhldW5pc3NlbiAoaHR0cHM6Ly9naXRodWIuY29tL3J0aGV1bmlzc2VuL21kLXByZWxvYWRlcilcbj09PSAqL1xuLnByZWxvYWRlciB7XG4gICAgQGVhc2luZzogICAgICBjdWJpYy1iZXppZXIoLjgsLjAsLjQsLjgpO1xuXG4gICAgQHNwZWVkOiAgICAgIDEzMjBtczsgICAgICAgLy8gYW5pbWF0aW9uIHRpbWUgZm9yIGVhY2ggbG9vcFxuICAgIEBjb2xvcjogICAgICAjNzU3NTc1OyAgICAgIC8vIEJsdWUgQTIwMCBpbiB0aGUgTWF0ZXJpYWwgRGVzaWduIGNvbG9yIHBhbGV0dGVcbiAgICBAbGluZWNhcDogICAgc3F1YXJlOyAgICAgICAvLyBjb3VsZCBiZSAncm91bmQnLCBidXQgdGhlIG9mZmljaWFsIG9uZSBpcyBzcXVhcmVcbiAgICBAbG9vcHM6ICAgICAgNTsgICAgICAgICAgICAvLyBudW1iZXIgb2YgcG9pbnRzIHdoZXJlIHRoZSBhcmMgbWVldHNcbiAgICBAYXJjOiAgICAgICAgMC43MjsgICAgICAgICAvLyBmcmFjdGlvbiBvZiB0aGUgY2lyY3VtZmVyZW5jZSB0aGF0IHRoZSBhcmMgZ3Jvd3MgdG9cbiAgICBAcGVyaW1ldGVyOiAgNjdweCAqIHBpKCk7ICAvLyBjaXJjdW1mZXJlbmNlIG9mIHRoZSByYXcgc3ZnIGlubmVyIGNyaWNsZVxuXG4gICAgZm9udC1zaXplOiAwO1xuXG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIHdpZHRoOiAzMnB4O1xuICAgIGhlaWdodDogMzJweDtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogcHJlbG9hZGVyLW91dGVyIEBzcGVlZCAqIEBsb29wcyAvIDIgbGluZWFyIGluZmluaXRlO1xuICAgIGFuaW1hdGlvbjogcHJlbG9hZGVyLW91dGVyIEBzcGVlZCAqIEBsb29wcyAvIDIgbGluZWFyIGluZmluaXRlO1xuXG4gICAgc3ZnIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IHByZWxvYWRlci1pbm5lciBAc3BlZWQgbGluZWFyIGluZmluaXRlO1xuICAgICAgICBhbmltYXRpb246IHByZWxvYWRlci1pbm5lciBAc3BlZWQgbGluZWFyIGluZmluaXRlO1xuXG4gICAgICAgIGNpcmNsZSB7XG4gICAgICAgICAgICBmaWxsOiBub25lO1xuICAgICAgICAgICAgc3Ryb2tlOiBAY29sb3I7XG4gICAgICAgICAgICBzdHJva2UtbGluZWNhcDogQGxpbmVjYXA7XG4gICAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogcHJlbG9hZGVyLWFyYyBAc3BlZWQgQGVhc2luZyBpbmZpbml0ZTtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogcHJlbG9hZGVyLWFyYyBAc3BlZWQgQGVhc2luZyBpbmZpbml0ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBALXdlYmtpdC1rZXlmcmFtZXMgcHJlbG9hZGVyLW91dGVyIHtcbiAgICAgICAgMCUge1xuICAgICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgwKTtcbiAgICAgICAgfVxuICAgICAgICAxMDAlIHtcbiAgICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBAa2V5ZnJhbWVzIHByZWxvYWRlci1vdXRlciB7XG4gICAgICAgIDAlIHtcbiAgICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDApO1xuICAgICAgICB9XG4gICAgICAgIDEwMCUge1xuICAgICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIEAtd2Via2l0LWtleWZyYW1lcyBwcmVsb2FkZXItaW5uZXIge1xuICAgICAgICAwJSB7XG4gICAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC0zNjBkZWcgKiAoMSAtIEBhcmMpKTtcbiAgICAgICAgfVxuICAgICAgICAxMDAlIHtcbiAgICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgQGtleWZyYW1lcyBwcmVsb2FkZXItaW5uZXIge1xuICAgICAgICAwJSB7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtMzYwZGVnICogKDEgLSBAYXJjKSk7XG4gICAgICAgIH1cbiAgICAgICAgMTAwJSB7XG4gICAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBALXdlYmtpdC1rZXlmcmFtZXMgcHJlbG9hZGVyLWFyYyB7XG4gICAgICAgIDAlIHtcbiAgICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDEgQHBlcmltZXRlcjtcbiAgICAgICAgICAgIHN0cm9rZS1kYXNob2Zmc2V0OiAwO1xuICAgICAgICB9XG4gICAgICAgIDQwJSB7XG4gICAgICAgICAgICBzdHJva2UtZGFzaGFycmF5OiBAYXJjICogQHBlcmltZXRlciwgQHBlcmltZXRlcjtcbiAgICAgICAgICAgIHN0cm9rZS1kYXNob2Zmc2V0OiAwO1xuICAgICAgICB9XG4gICAgICAgIDEwMCUge1xuICAgICAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMSBAcGVyaW1ldGVyO1xuICAgICAgICAgICAgc3Ryb2tlLWRhc2hvZmZzZXQ6IC1AYXJjICogQHBlcmltZXRlcjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBAa2V5ZnJhbWVzIHByZWxvYWRlci1hcmMge1xuICAgICAgICAwJSB7XG4gICAgICAgICAgICBzdHJva2UtZGFzaGFycmF5OiAxIEBwZXJpbWV0ZXI7XG4gICAgICAgICAgICBzdHJva2UtZGFzaG9mZnNldDogMDtcbiAgICAgICAgfVxuICAgICAgICA0MCUge1xuICAgICAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogQGFyYyAqIEBwZXJpbWV0ZXIsIEBwZXJpbWV0ZXI7XG4gICAgICAgICAgICBzdHJva2UtZGFzaG9mZnNldDogMDtcbiAgICAgICAgfVxuICAgICAgICAxMDAlIHtcbiAgICAgICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDEgQHBlcmltZXRlcjtcbiAgICAgICAgICAgIHN0cm9rZS1kYXNob2Zmc2V0OiAtQGFyYyAqIEBwZXJpbWV0ZXI7XG4gICAgICAgIH1cbiAgICB9XG59XG4ucHJlbG9hZGVyLWlubmVyIHtcbiAgICBAcHJlbG9hZGVyLWlubmVyLWVhc2U6IGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKTtcbiAgICBAcHJlbG9hZGVyLWlubmVyLWR1cmF0aW9uOiA1LjI1cztcbiAgICBAcHJlbG9hZGVyLWlubmVyLWNpcmNsZS1kdXJhdGlvbjogQHByZWxvYWRlci1pbm5lci1kdXJhdGlvbiAqIDAuMjU7XG4gICAgQHByZWxvYWRlci1pbm5lci1vdXRlci1kdXJhdGlvbjogQHByZWxvYWRlci1pbm5lci1kdXJhdGlvbiAqICg1LzkpO1xuXG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgICAtd2Via2l0LWFuaW1hdGlvbjogcHJlbG9hZGVyLWlubmVyLXJvdGF0ZSBAcHJlbG9hZGVyLWlubmVyLWR1cmF0aW9uIEBwcmVsb2FkZXItaW5uZXItZWFzZSBpbmZpbml0ZTtcbiAgICBhbmltYXRpb246IHByZWxvYWRlci1pbm5lci1yb3RhdGUgQHByZWxvYWRlci1pbm5lci1kdXJhdGlvbiBAcHJlbG9hZGVyLWlubmVyLWVhc2UgaW5maW5pdGU7XG4gICAgLnByZWxvYWRlci1pbm5lci1nYXAge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHdpZHRoOiAycHg7XG4gICAgICAgIGxlZnQ6IDUwJTtcbiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgYm90dG9tOiAwO1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICBib3JkZXItdG9wOiA0cHggc29saWQgIzc1NzU3NTtcbiAgICB9XG4gICAgLnByZWxvYWRlci1pbm5lci1sZWZ0LCAucHJlbG9hZGVyLWlubmVyLXJpZ2h0IHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDA7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgd2lkdGg6IDUwJTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB9XG4gICAgLnByZWxvYWRlci1pbm5lci1oYWxmLWNpcmNsZSB7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIHdpZHRoOiAyMDAlO1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICBib3JkZXI6IDRweCBzb2xpZCAjNzU3NTc1O1xuICAgICAgICBib3JkZXItYm90dG9tLWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiAoQHByZWxvYWRlci1pbm5lci1kdXJhdGlvbiAqIDAuMjUpO1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IEBwcmVsb2FkZXItaW5uZXItZWFzZTtcbiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG4gICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogKEBwcmVsb2FkZXItaW5uZXItZHVyYXRpb24gKiAwLjI1KTtcbiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogQHByZWxvYWRlci1pbm5lci1lYXNlO1xuICAgIH1cbiAgICAucHJlbG9hZGVyLXdoaXRlICYge1xuICAgICAgICAucHJlbG9hZGVyLWlubmVyLWdhcCwgLnByZWxvYWRlci1pbm5lci1oYWxmLWNpcmNsZSB7XG4gICAgICAgICAgICBib3JkZXItY29sb3I6ICNmZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLnByZWxvYWRlci1pbm5lci1sZWZ0IHtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgLnByZWxvYWRlci1pbm5lci1oYWxmLWNpcmNsZSB7XG4gICAgICAgICAgICBsZWZ0OiAwO1xuICAgICAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50O1xuICAgICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogcHJlbG9hZGVyLWxlZnQtcm90YXRlO1xuICAgICAgICAgICAgYW5pbWF0aW9uLW5hbWU6IHByZWxvYWRlci1sZWZ0LXJvdGF0ZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAucHJlbG9hZGVyLWlubmVyLXJpZ2h0IHtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIC5wcmVsb2FkZXItaW5uZXItaGFsZi1jaXJjbGUge1xuICAgICAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgICAgICBib3JkZXItbGVmdC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHByZWxvYWRlci1yaWdodC1yb3RhdGU7XG4gICAgICAgICAgICBhbmltYXRpb24tbmFtZTogcHJlbG9hZGVyLXJpZ2h0LXJvdGF0ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLmNvbG9yLW11bHRpICYge1xuICAgICAgICAucHJlbG9hZGVyLWlubmVyLWxlZnQge1xuICAgICAgICAgICAgLnByZWxvYWRlci1pbm5lci1oYWxmLWNpcmNsZSB7XG4gICAgICAgICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogcHJlbG9hZGVyLWxlZnQtcm90YXRlLW11bHRpY29sb3I7XG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uLW5hbWU6IHByZWxvYWRlci1sZWZ0LXJvdGF0ZS1tdWx0aWNvbG9yO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC5wcmVsb2FkZXItaW5uZXItcmlnaHQge1xuICAgICAgICAgICAgLnByZWxvYWRlci1pbm5lci1oYWxmLWNpcmNsZSB7XG4gICAgICAgICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogcHJlbG9hZGVyLXJpZ2h0LXJvdGF0ZS1tdWx0aWNvbG9yO1xuICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1uYW1lOiBwcmVsb2FkZXItcmlnaHQtcm90YXRlLW11bHRpY29sb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIHByZWxvYWRlci1sZWZ0LXJvdGF0ZSB7XG4gICAgMCUsIDEwMCUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzMGRlZyk7XG4gICAgfVxuICAgIDUwJSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTVkZWcpO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcHJlbG9hZGVyLWxlZnQtcm90YXRlIHtcbiAgICAwJSwgMTAwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDEzMGRlZyk7XG4gICAgfVxuICAgIDUwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC01ZGVnKTtcbiAgICB9XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgcHJlbG9hZGVyLXJpZ2h0LXJvdGF0ZSB7XG4gICAgMCUsIDEwMCUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC0xMzBkZWcpO1xuICAgIH1cbiAgICA1MCUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDVkZWcpO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcHJlbG9hZGVyLXJpZ2h0LXJvdGF0ZSB7XG4gICAgMCUsIDEwMCUge1xuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKTtcbiAgICB9XG4gICAgNTAlIHtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoNWRlZyk7XG4gICAgfVxufVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgcHJlbG9hZGVyLWlubmVyLXJvdGF0ZSB7XG4gICAgMTIuNSUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzNWRlZyk7XG4gICAgfVxuICAgIDI1JSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTtcbiAgICB9XG4gICAgMzcuNSUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDQwNWRlZyk7XG4gICAgfVxuICAgIDUwJSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoNTQwZGVnKTtcbiAgICB9XG4gICAgNjIuNSUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDY3NWRlZyk7XG4gICAgfVxuICAgIDc1JSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoODEwZGVnKTtcbiAgICB9XG4gICAgODcuNSUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDk0NWRlZyk7XG4gICAgfVxuICAgIDEwMCUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEwODBkZWcpO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcHJlbG9hZGVyLWlubmVyLXJvdGF0ZSB7XG4gICAgMTIuNSUge1xuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpO1xuICAgIH1cbiAgICAyNSUge1xuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpO1xuICAgIH1cbiAgICAzNy41JSB7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDQwNWRlZyk7XG4gICAgfVxuICAgIDUwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDU0MGRlZyk7XG4gICAgfVxuICAgIDYyLjUlIHtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoNjc1ZGVnKTtcbiAgICB9XG4gICAgNzUlIHtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoODEwZGVnKTtcbiAgICB9XG4gICAgODcuNSUge1xuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSg5NDVkZWcpO1xuICAgIH1cbiAgICAxMDAlIHtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMTA4MGRlZyk7XG4gICAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIHByZWxvYWRlci1sZWZ0LXJvdGF0ZS1tdWx0aWNvbG9yIHtcbiAgICAwJSxcbiAgICAxMDAlIHtcbiAgICAgICAgYm9yZGVyLWxlZnQtY29sb3I6ICM0Mjg1RjQ7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKTtcbiAgICB9XG4gICAgNzUlIHtcbiAgICAgICAgYm9yZGVyLWxlZnQtY29sb3I6ICMxQjlBNTk7XG4gICAgICAgIGJvcmRlci10b3AtY29sb3I6ICMxQjlBNTk7XG4gICAgfVxuICAgIDUwJSB7XG4gICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiAjRjdDMjIzO1xuICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAjRjdDMjIzO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC01ZGVnKTtcbiAgICB9XG4gICAgMjUlIHtcbiAgICAgICAgYm9yZGVyLWxlZnQtY29sb3I6ICNERTNFMzU7XG4gICAgICAgIGJvcmRlci10b3AtY29sb3I6ICNERTNFMzU7XG4gICAgfVxufVxuQGtleWZyYW1lcyBwcmVsb2FkZXItbGVmdC1yb3RhdGUtbXVsdGljb2xvciB7XG4gICAgMCUsXG4gICAgMTAwJSB7XG4gICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiAjNDI4NUY0O1xuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpO1xuICAgIH1cbiAgICA3NSUge1xuICAgICAgICBib3JkZXItbGVmdC1jb2xvcjogIzFCOUE1OTtcbiAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogIzFCOUE1OTtcbiAgICB9XG4gICAgNTAlIHtcbiAgICAgICAgYm9yZGVyLWxlZnQtY29sb3I6ICNGN0MyMjM7XG4gICAgICAgIGJvcmRlci10b3AtY29sb3I6ICNGN0MyMjM7XG4gICAgICAgIHRyYW5zZm9ybTogcm90YXRlKC01ZGVnKTtcbiAgICB9XG4gICAgMjUlIHtcbiAgICAgICAgYm9yZGVyLWxlZnQtY29sb3I6ICNERTNFMzU7XG4gICAgICAgIGJvcmRlci10b3AtY29sb3I6ICNERTNFMzU7XG4gICAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIHByZWxvYWRlci1yaWdodC1yb3RhdGUtbXVsdGljb2xvciB7XG4gICAgMCUsXG4gICAgMTAwJSB7XG4gICAgICAgIGJvcmRlci1yaWdodC1jb2xvcjogIzQyODVGNDtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKTtcbiAgICB9XG4gICAgNzUlIHtcbiAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjMUI5QTU5O1xuICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAjMUI5QTU5O1xuICAgIH1cbiAgICA1MCUge1xuICAgICAgICBib3JkZXItcmlnaHQtY29sb3I6ICNGN0MyMjM7XG4gICAgICAgIGJvcmRlci10b3AtY29sb3I6ICNGN0MyMjM7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoNWRlZyk7XG4gICAgfVxuICAgIDI1JSB7XG4gICAgICAgIGJvcmRlci10b3AtY29sb3I6ICNERTNFMzU7XG4gICAgICAgIGJvcmRlci1yaWdodC1jb2xvcjogI0RFM0UzNTtcbiAgICB9XG59XG5Aa2V5ZnJhbWVzIHByZWxvYWRlci1yaWdodC1yb3RhdGUtbXVsdGljb2xvciB7XG4gICAgMCUsXG4gICAgMTAwJSB7XG4gICAgICAgIGJvcmRlci1yaWdodC1jb2xvcjogIzQyODVGNDtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZyk7XG4gICAgfVxuICAgIDc1JSB7XG4gICAgICAgIGJvcmRlci1yaWdodC1jb2xvcjogIzFCOUE1OTtcbiAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogIzFCOUE1OTtcbiAgICB9XG4gICAgNTAlIHtcbiAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjRjdDMjIzO1xuICAgICAgICBib3JkZXItdG9wLWNvbG9yOiAjRjdDMjIzO1xuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSg1ZGVnKTtcbiAgICB9XG4gICAgMjUlIHtcbiAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogI0RFM0UzNTtcbiAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiAjREUzRTM1O1xuICAgIH1cbn0iLCIvKiA9PT0gUHJvZ3Jlc3MgQmFyID09PSAqL1xuLnByb2dyZXNzYmFyLCAucHJvZ3Jlc3NiYXItaW5maW5pdGUge1xuICAgIGhlaWdodDogNHB4O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIC50cmFuc2Zvcm0tb3JpZ2luKGNlbnRlciBib3R0b20pO1xuICAgIGJhY2tncm91bmQ6IHJnYmEocmVkKEB0aGVtZUNvbG9yKSwgZ3JlZW4oQHRoZW1lQ29sb3IpLCBibHVlKEB0aGVtZUNvbG9yKSwgMC41KTtcbn1cbi8vIERldGVybWluZWRcbi5wcm9ncmVzc2JhciB7XG4gICAgZGlzcGxheTogYmxvY2s7XG4gICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICAtd2Via2l0LXRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG4gICAgdHJhbnNmb3JtLXN0eWxlOiBwcmVzZXJ2ZS0zZDtcbiAgICBzcGFuIHtcbiAgICAgICAgY29udGVudDogJyc7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBiYWNrZ3JvdW5kOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgLnRyYW5zbGF0ZTNkKC0xMDAlLCAwLCAwKTtcbiAgICAgICAgLnRyYW5zaXRpb24oMTUwbXMpO1xuICAgIH1cbn1cbi8vIEluZmluaXRlXG4ucHJvZ3Jlc3NiYXItaW5maW5pdGUge1xuICAgIHotaW5kZXg6IDE1MDAwO1xuICAgICY6YmVmb3JlLCAmOmFmdGVyIHtcbiAgICAgICAgY29udGVudDogJyc7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBiYWNrZ3JvdW5kOiBAdGhlbWVDb2xvcjtcbiAgICAgICAgLnRyYW5zZm9ybS1vcmlnaW4obGVmdCBjZW50ZXIpO1xuICAgIH1cbiAgICAmOmJlZm9yZSB7XG4gICAgICAgIC5hbmltYXRpb24ocHJvZ3Jlc3NiYXItaW5maW5pdGUtMSAycyBsaW5lYXIgaW5maW5pdGUpO1xuICAgIH1cbiAgICAmOmFmdGVyIHtcbiAgICAgICAgLmFuaW1hdGlvbihwcm9ncmVzc2Jhci1pbmZpbml0ZS0yIDJzIGxpbmVhciBpbmZpbml0ZSk7XG4gICAgfVxuICAgIGh0bWwud2l0aC1zdGF0dXNiYXItb3ZlcmxheSBib2R5ID4gJiwgaHRtbC53aXRoLXN0YXR1c2Jhci1vdmVybGF5IC5mcmFtZXdvcms3LXJvb3QgPiAmIHtcbiAgICAgICAgdG9wOiAyMHB4O1xuICAgIH1cbn1cblxuXG4vLyBNdWx0aWNvbG9yXG4ucHJvZ3Jlc3NiYXItaW5maW5pdGUuY29sb3ItbXVsdGkge1xuICAgIGJhY2tncm91bmQ6IG5vbmUgIWltcG9ydGFudDtcbiAgICAmOmJlZm9yZSwgJjphZnRlciB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBhbmltYXRpb246IG5vbmU7XG4gICAgfVxuICAgICY6YmVmb3JlIHtcbiAgICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgICAgLmFuaW1hdGlvbihwcm9ncmVzc2Jhci1pbmZpbml0ZS1tdWx0aWNvbG9yLWJnIDNzIHN0ZXAtZW5kIGluZmluaXRlKTtcbiAgICB9XG4gICAgJjphZnRlciB7XG4gICAgICAgIGJhY2tncm91bmQ6IG5vbmU7XG4gICAgICAgIC5hbmltYXRpb24ocHJvZ3Jlc3NiYXItaW5maW5pdGUtbXVsdGljb2xvci1maWxsIDNzIGxpbmVhciBpbmZpbml0ZSk7XG4gICAgICAgIC50cmFuc2Zvcm0tb3JpZ2luKGNlbnRlciBjZW50ZXIpO1xuICAgIH1cbn1cblxuYm9keSwgLnZpZXcsIC52aWV3cywgLnBhZ2UsIC5wYW5lbCwgLnBvcHVwLCAuZnJhbWV3b3JrNy1yb290IHtcbiAgICA+IC5wcm9ncmVzc2JhciwgPiAucHJvZ3Jlc3NiYXItaW5maW5pdGUge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgei1pbmRleDogMTUwMDA7XG4gICAgICAgIC50cmFuc2Zvcm0tb3JpZ2luKGNlbnRlciB0b3ApO1xuICAgIH1cbn1cbi8vIEFuaW1hdGlvbnNcbi5wcm9ncmVzc2Jhci1pbiB7XG4gICAgLmFuaW1hdGlvbihwcm9ncmVzc2Jhci1pbiAzMDBtcyBmb3J3YXJkcyk7XG59XG4ucHJvZ3Jlc3NiYXItb3V0IHtcbiAgICAuYW5pbWF0aW9uKHByb2dyZXNzYmFyLW91dCAzMDBtcyBmb3J3YXJkcyk7XG59XG5cbmh0bWwud2l0aC1zdGF0dXNiYXItb3ZlcmxheSBib2R5ID4gLnByb2dyZXNzYmFyLCBodG1sLndpdGgtc3RhdHVzYmFyLW92ZXJsYXkgLmZyYW1ld29yazctcm9vdCA+IC5wcm9ncmVzc2JhciB7XG4gICAgdG9wOiAyMHB4O1xufVxuQC13ZWJraXQta2V5ZnJhbWVzIHByb2dyZXNzYmFyLWluIHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWSgwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVZKDEpO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcHJvZ3Jlc3NiYXItaW4ge1xuICAgIGZyb20ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWSgwKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWSgxKTtcbiAgICB9XG59XG5ALXdlYmtpdC1rZXlmcmFtZXMgcHJvZ3Jlc3NiYXItb3V0IHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWSgxKTtcbiAgICB9XG4gICAgdG8ge1xuICAgICAgICBvcGFjaXR5OiAwO1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVZKDApO1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcHJvZ3Jlc3NiYXItb3V0IHtcbiAgICBmcm9tIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVkoMSk7XG4gICAgfVxuICAgIHRvIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVkoMCk7XG4gICAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIHByb2dyZXNzYmFyLWluZmluaXRlLTEge1xuICAgIDAlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwJSkgc2NhbGVYKDAuMSk7XG4gICAgfVxuICAgIDI1JSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDMwJSkgc2NhbGVYKDAuNik7XG4gICAgfVxuICAgIDUwJSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpIHNjYWxlWCgxKTtcbiAgICB9XG4gICAgMTAwJSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpIHNjYWxlWCgxKTtcbiAgICB9XG59XG5Aa2V5ZnJhbWVzIHByb2dyZXNzYmFyLWluZmluaXRlLTEge1xuICAgIDAlIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMCUpIHNjYWxlWCgwLjEpO1xuICAgIH1cbiAgICAyNSUge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMzAlKSBzY2FsZVgoMC42KTtcbiAgICB9XG4gICAgNTAlIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpIHNjYWxlWCgxKTtcbiAgICB9XG4gICAgMTAwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgxMDAlKSBzY2FsZVgoMSk7XG4gICAgfVxufVxuQC13ZWJraXQta2V5ZnJhbWVzIHByb2dyZXNzYmFyLWluZmluaXRlLTIge1xuICAgIDAlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpIHNjYWxlWCgxKTtcbiAgICB9XG4gICAgNDAlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpIHNjYWxlWCgxKTtcbiAgICB9XG4gICAgNzUlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoNjAlKSBzY2FsZVgoMC4zNSk7XG4gICAgfVxuICAgIDkwJSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDEwMCUpIHNjYWxlWCgwLjEpO1xuICAgIH1cbiAgICAxMDAlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSkgc2NhbGVYKDAuMSk7XG4gICAgfVxufVxuQGtleWZyYW1lcyBwcm9ncmVzc2Jhci1pbmZpbml0ZS0yIHtcbiAgICAwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMTAwJSkgc2NhbGVYKDEpO1xuICAgIH1cbiAgICA0MCUge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTEwMCUpIHNjYWxlWCgxKTtcbiAgICB9XG4gICAgNzUlIHtcbiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDYwJSkgc2NhbGVYKDAuMzUpO1xuICAgIH1cbiAgICA5MCUge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSkgc2NhbGVYKDAuMSk7XG4gICAgfVxuICAgIDEwMCUge1xuICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMTAwJSkgc2NhbGVYKDAuMSk7XG4gICAgfVxufVxuXG5ALXdlYmtpdC1rZXlmcmFtZXMgcHJvZ3Jlc3NiYXItaW5maW5pdGUtbXVsdGljb2xvci1iZyB7XG4gICAgMCUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JlZW47XG4gICAgfVxuICAgIDI1JSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEByZWQ7XG4gICAgfVxuICAgIDUwJSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBibHVlO1xuICAgIH1cbiAgICA3NSUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAeWVsbG93O1xuICAgIH1cbn1cbkBrZXlmcmFtZXMgcHJvZ3Jlc3NiYXItaW5maW5pdGUtbXVsdGljb2xvci1iZyB7XG4gICAgMCUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JlZW47XG4gICAgfVxuICAgIDI1JSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEByZWQ7XG4gICAgfVxuICAgIDUwJSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBibHVlO1xuICAgIH1cbiAgICA3NSUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAeWVsbG93O1xuICAgIH1cbn1cbkAtd2Via2l0LWtleWZyYW1lcyBwcm9ncmVzc2Jhci1pbmZpbml0ZS1tdWx0aWNvbG9yLWZpbGwge1xuICAgIDAlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgwKTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHJlZDtcbiAgICB9XG4gICAgMjQuOSUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAcmVkO1xuICAgIH1cbiAgICAyNSUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDApO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmx1ZTtcbiAgICB9XG4gICAgNDkuOSUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmx1ZTtcbiAgICB9XG4gICAgNTAlIHtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgwKTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHllbGxvdztcbiAgICB9XG4gICAgNzQuOSUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAeWVsbG93O1xuICAgIH1cbiAgICA3NSUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDApO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JlZW47XG4gICAgfVxuICAgIDEwMCUge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAZ3JlZW47XG4gICAgfVxufVxuQGtleWZyYW1lcyBwcm9ncmVzc2Jhci1pbmZpbml0ZS1tdWx0aWNvbG9yLWZpbGwge1xuICAgIDAlIHtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMCk7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEByZWQ7XG4gICAgfVxuICAgIDI0LjklIHtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSk7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEByZWQ7XG4gICAgfVxuICAgIDI1JSB7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDApO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmx1ZTtcbiAgICB9XG4gICAgNDkuOSUge1xuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGJsdWU7XG4gICAgfVxuICAgIDUwJSB7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDApO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAeWVsbG93O1xuICAgIH1cbiAgICA3NC45JSB7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpO1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAeWVsbG93O1xuICAgIH1cbiAgICA3NSUge1xuICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgwKTtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQGdyZWVuO1xuICAgIH1cbiAgICAxMDAlIHtcbiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSk7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6IEBncmVlbjtcbiAgICB9XG59IiwiLyogPT09IENvbHVtbnMgUGlja2VyID09PSAqL1xuLnBpY2tlci1jb2x1bW5zIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDI2MHB4O1xuICAgIHotaW5kZXg6IDExNTAwO1xuICAgICYucGlja2VyLW1vZGFsLWlubGluZSB7XG4gICAgICAgIGhlaWdodDogMjAwcHg7XG4gICAgfVxuICAgIEBtZWRpYSAob3JpZW50YXRpb246IGxhbmRzY2FwZSkgYW5kIChtYXgtaGVpZ2h0OiA0MTVweCkge1xuICAgICAgICAmOm5vdCgucGlja2VyLW1vZGFsLWlubGluZSkge1xuICAgICAgICAgICAgaGVpZ2h0OiAyMDBweDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi5wb3BvdmVyLnBvcG92ZXItcGlja2VyLWNvbHVtbnMge1xuICAgIHdpZHRoOiAyODBweDtcbiAgICAudG9vbGJhciB7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDJweCAycHggMCAwO1xuICAgIH1cbn1cbi5waWNrZXItaXRlbXMge1xuICAgIC5mbGV4Ym94KCk7XG4gICAgLmp1c3RpZnktY29udGVudChjZW50ZXIpO1xuICAgIHBhZGRpbmc6IDA7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgZm9udC1zaXplOiAyMHB4O1xuICAgIC13ZWJraXQtbWFzay1ib3gtaW1hZ2U6IC13ZWJraXQtbGluZWFyLWdyYWRpZW50KGJvdHRvbSwgdHJhbnNwYXJlbnQsIHRyYW5zcGFyZW50IDUlLCB3aGl0ZSAyMCUsIHdoaXRlIDgwJSwgdHJhbnNwYXJlbnQgOTUlLCB0cmFuc3BhcmVudCk7XG4gICAgLXdlYmtpdC1tYXNrLWJveC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvIHRvcCwgdHJhbnNwYXJlbnQsIHRyYW5zcGFyZW50IDUlLCB3aGl0ZSAyMCUsIHdoaXRlIDgwJSwgdHJhbnNwYXJlbnQgOTUlLCB0cmFuc3BhcmVudCk7XG59XG4ucGlja2VyLWl0ZW1zLWNvbCB7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgbWF4LWhlaWdodDogMTAwJTtcblxuICAgICYucGlja2VyLWl0ZW1zLWNvbC1sZWZ0IHtcbiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDtcbiAgICB9XG4gICAgJi5waWNrZXItaXRlbXMtY29sLWNlbnRlciB7XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICB9XG4gICAgJi5waWNrZXItaXRlbXMtY29sLXJpZ2h0IHtcbiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgfVxuICAgICYucGlja2VyLWl0ZW1zLWNvbC1kaXZpZGVyIHtcbiAgICAgICAgY29sb3I6IHJnYmEoMCwwLDAsMC44Nyk7XG4gICAgICAgIC5mbGV4Ym94KCk7XG4gICAgICAgIC5hbGlnbi1pdGVtcyhjZW50ZXIpO1xuICAgIH1cbn1cbi5waWNrZXItaXRlbXMtY29sLXdyYXBwZXIge1xuICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICBcbiAgICAtd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcbiAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1vdXQ7XG59XG4ucGlja2VyLWl0ZW0ge1xuICAgIGhlaWdodDogMzZweDtcbiAgICBsaW5lLWhlaWdodDogMzZweDtcbiAgICBwYWRkaW5nOiAwIDEwcHg7XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBjb2xvcjogcmdiYSgwLDAsMCwwLjU0KTtcbiAgICBsZWZ0OiAwO1xuICAgIHRvcDogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC50cmFuc2l0aW9uKDMwMG1zKTtcbiAgICAucGlja2VyLWl0ZW1zLWNvbC1hYnNvbHV0ZSAme1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgfVxuICAgICYucGlja2VyLWl0ZW0tZmFyIHtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgfVxuICAgICYucGlja2VyLXNlbGVjdGVkIHtcbiAgICAgICAgY29sb3I6IHJnYmEoMCwwLDAsMC44Nyk7XG4gICAgICAgIC50cmFuc2Zvcm0odHJhbnNsYXRlM2QoMCwwLDApIHJvdGF0ZVgoMGRlZykpO1xuICAgIH1cbn1cbi5waWNrZXItY2VudGVyLWhpZ2hsaWdodCB7XG4gICAgaGVpZ2h0OiAzNnB4O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGxlZnQ6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgdG9wOiA1MCU7XG4gICAgbWFyZ2luLXRvcDogLTE4cHg7XG4gICAgLmhhaXJsaW5lKHRvcCwgcmdiYSgwLDAsMCwwLjE1KSk7XG4gICAgLmhhaXJsaW5lKGJvdHRvbSwgcmdiYSgwLDAsMCwwLjE1KSk7XG4gICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG4vLyAzRCBQaWNrZXJcbi5waWNrZXItM2Qge1xuICAgIC5waWNrZXItaXRlbXMge1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICAtd2Via2l0LXBlcnNwZWN0aXZlOiAxMjAwcHg7XG4gICAgICAgIHBlcnNwZWN0aXZlOiAxMjAwcHg7XG4gICAgfVxuICAgIC5waWNrZXItaXRlbXMtY29sLCAucGlja2VyLWl0ZW1zLWNvbC13cmFwcGVyLCAucGlja2VyLWl0ZW0ge1xuICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG4gICAgICAgIHRyYW5zZm9ybS1zdHlsZTogcHJlc2VydmUtM2Q7XG4gICAgfVxuICAgIC5waWNrZXItaXRlbXMtY29sIHtcbiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7XG4gICAgfVxuICAgIC5waWNrZXItaXRlbSB7XG4gICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlciAtMTEwcHg7XG4gICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXIgLTExMHB4O1xuICAgICAgICAtd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6IGhpZGRlbjtcbiAgICAgICAgYmFja2ZhY2UtdmlzaWJpbGl0eTogaGlkZGVuO1xuICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLW91dDtcbiAgICAgICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2Utb3V0O1xuICAgIH1cbn0iLCIvKiA9PT0gTm90aWZpY2F0aW9ucyA9PT0gKi9cbkBub3RpZmljYXRpb25zRHVyYXRpb246IDQ1MG1zO1xuLm5vdGlmaWNhdGlvbnMge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBsZWZ0OiAwO1xuICAgIGJvdHRvbTogMDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICB6LWluZGV4OiAxMDkwMDtcbiAgICBjb2xvcjogI2ZmZjtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgbWFyZ2luOiAwO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBkaXNwbGF5OiBub25lO1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgbWF4LWhlaWdodDogMTAwJTtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDtcbiAgICAudHJhbnNpdGlvbihAbm90aWZpY2F0aW9uc0R1cmF0aW9uKTtcbiAgICAtd2Via2l0LXBlcnNwZWN0aXZlOjEyMDBweDtcbiAgICBwZXJzcGVjdGl2ZToxMjAwcHg7XG5cbiAgICAmLmxpc3QtYmxvY2sgPiB1bCB7XG4gICAgICAgIC5oYWlybGluZS1yZW1vdmUodG9wKTtcbiAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgICAgICBtYXgtd2lkdGg6IDU2OHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiAjMzIzMjMyO1xuICAgICAgICBtYXJnaW46IDAgYXV0bztcbiAgICB9XG4gICAgLml0ZW0tY29udGVudCB7XG4gICAgICAgIC5hbGlnbi1pdGVtcyhmbGV4LXN0YXJ0KTtcbiAgICAgICAgcGFkZGluZy1sZWZ0OiAyNHB4O1xuICAgIH1cbiAgICAuaXRlbS10aXRsZSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbiAgICAgICAgcGFkZGluZy10b3A6IDE0cHg7XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiAxNHB4O1xuICAgIH1cbiAgICAuaXRlbS1pbm5lciB7XG4gICAgICAgIHBhZGRpbmctcmlnaHQ6IDI0cHg7XG4gICAgICAgIHBhZGRpbmctdG9wOiAwO1xuICAgICAgICBwYWRkaW5nLWJvdHRvbTogMDtcbiAgICAgICAgLmhhaXJsaW5lLXJlbW92ZShib3R0b20pO1xuICAgIH1cbiAgICAuaXRlbS1hZnRlciB7XG4gICAgICAgIG1heC1oZWlnaHQ6IG5vbmU7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAxNnB4O1xuICAgIH1cbiAgICAuYnV0dG9uLmNsb3NlLW5vdGlmaWNhdGlvbiB7XG4gICAgICAgIGNvbG9yOiBsaWdodGVuKHNhdHVyYXRlKEB0aGVtZUNvbG9yLCAxMCUpLCAxMCUpO1xuICAgIH1cbiAgICAubm90aWZpY2F0aW9uLWl0ZW0ge1xuICAgICAgICBtYXJnaW46IDAgYXV0bztcbiAgICAgICAgLnRyYW5zaXRpb24oQG5vdGlmaWNhdGlvbnNEdXJhdGlvbik7XG4gICAgICAgIC5kZWxheSgxMDBtcyk7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgICAgIG9wYWNpdHk6IDE7XG4gICAgfVxuICAgIC5ub3RpZmljYXRpb24taGlkZGVuIHtcbiAgICAgICAgb3BhY2l0eTogMDtcbiAgICAgICAgLmRlbGF5KDBtcyk7XG4gICAgICAgIC50cmFuc2xhdGUzZCgwLDAsMCk7XG4gICAgfVxuICAgIC5ub3RpZmljYXRpb24taXRlbS1yZW1vdmluZyB7XG4gICAgICAgIC5kZWxheSgwbXMpO1xuICAgIH1cbiAgICBAbWVkaWEgKG1pbi13aWR0aDogNTY5cHgpIHtcbiAgICAgICAgJi5saXN0LWJsb2NrID4gdWwge1xuICAgICAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4O1xuICAgICAgICAgICAgd2lkdGg6IGF1dG87XG4gICAgICAgICAgICBtaW4td2lkdGg6IDI4OHB4O1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qID09PSBEaXNhYmxlZCBlbGVtZW50cyA9PT0gKi9cbi5kaXNhYmxlZCwgW2Rpc2FibGVkXSB7XG4gICAgb3BhY2l0eTogMC41NTtcbiAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAuZGlzYWJsZWQgJiwgW2Rpc2FibGVkXSAmIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICB9XG59IiwiLy8gQ29udGFpbmVyXG5cbi5waG9uZS5hbmRyb2lkIHtcbiAgLmNvbnRhaW5lci1lZGl0IHtcblxuICAgIC5wYWdlLWNvbnRlbnQge1xuICAgICAgLmxpc3QtYmxvY2s6Zmlyc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tdG9wOiAtMXB4O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4uY29udGFpbmVyLWVkaXQsXG4uY29udGFpbmVyLWFkZCxcbi5jb250YWluZXItc2V0dGluZ3Mge1xuICAmLnBvcG92ZXIge1xuICAgIHdpZHRoOiAzNjBweDtcbiAgfVxufVxuXG4uc2V0dGluZ3Mge1xuICAmLnBvcHVwLFxuICAmLnBvcG92ZXIge1xuICAgIC5saXN0LWJsb2NrIHtcbiAgICAgIG1hcmdpbjogMzJweCAwO1xuXG4gICAgICB1bCB7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgICAgIGJhY2tncm91bmQ6ICNmZmY7XG4gICAgICB9XG5cbiAgICAgICY6Zmlyc3QtY2hpbGQge1xuICAgICAgICBtYXJnaW4tdG9wOiAwO1xuXG4gICAgICAgIGxpOmZpcnN0LWNoaWxkIGEge1xuICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLFxuICAgIC5wb3BvdmVyLWlubmVyIHtcbiAgICAgID4gLmNvbnRlbnQtYmxvY2sge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBtYXJnaW46IDA7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLnBvcG92ZXItdmlldyB7XG4gICAgICBib3JkZXItcmFkaXVzOiAzcHg7XG5cbiAgICAgID4gLnBhZ2VzIHtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5jYXRlZ29yaWVzIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgbWFyZ2luOiAwO1xuICAgIHBhZGRpbmc6IDA7XG5cbiAgICA+IC50b29sYmFyIHtcbiAgICAgIHRvcDogMDtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICB9XG4gIH1cbiAgLnBvcG92ZXItaW5uZXIge1xuICAgIGhlaWdodDogNDAwcHg7XG4gIH1cbn0iLCIvLyBEYXRhIHZpZXdcblxuLmRhdGF2aWV3IHtcbiAgLnJvdyB7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7XG4gIH1cblxuICB1bCB7XG4gICAgcGFkZGluZzogMCAxMHB4O1xuICAgIGxpc3Qtc3R5bGU6IG5vbmU7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7XG5cbiAgICBsaSB7XG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgfVxuICB9XG5cbiAgLmFjdGl2ZSB7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHotaW5kZXg6IDE7XG5cbiAgICAmOjphZnRlciB7XG4gICAgICBjb250ZW50OiAnJztcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHdpZHRoOiAyMnB4O1xuICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgcmlnaHQ6IC01cHg7XG4gICAgICBib3R0b206IC01cHg7XG4gICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxjaXJjbGUgZmlsbD1cIiNmZmZcIiBjeD1cIjExXCIgY3k9XCIxMVwiIHI9XCIxMVwiLz48cGF0aCBkPVwiTTExLDIxQTEwLDEwLDAsMSwxLDIxLDExLDEwLDEwLDAsMCwxLDExLDIxaDBaTTE3LjQsNy4zMkwxNy4wNiw3YTAuNDgsMC40OCwwLDAsMC0uNjcsMGwtNyw2Ljg0TDYuOTUsMTEuMjRhMC41MSwwLjUxLDAsMCwwLS41OS4wOEw2LDExLjY2YTAuNTgsMC41OCwwLDAsMCwwLC42NWwzLjE5LDMuMzVhMC4zOCwwLjM4LDAsMCwwLC4zOSwwTDE3LjQsOGEwLjQ4LDAuNDgsMCwwLDAsMC0uNjdoMFpcIi8+PC9nPjwvc3ZnPicpO1xuICAgIH1cbiAgfVxufSIsIi8vIExpc3QgZXh0ZW5kXG5cbi5pdGVtLWNvbnRlbnR7XG4gIC5pdGVtLWFmdGVyIHtcbiAgICAmLnNwbGl0dGVyIHtcbiAgICAgIGxhYmVsIHtcbiAgICAgICAgY29sb3I6ICMwMDA7XG4gICAgICAgIG1hcmdpbjowIDVweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDM2cHg7XG4gICAgICB9XG5cbiAgICAgIC5idXR0b24ge1xuICAgICAgICBtaW4td2lkdGg6IDQwcHg7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgICAgfVxuICAgIH1cblxuICAgICYudmFsdWUge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBtaW4td2lkdGg6IDUwcHg7XG4gICAgICBjb2xvcjogQGJsYWNrO1xuICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7XG4gICAgICB0ZXh0LWFsaWduOiByaWdodDtcbiAgICB9XG4gIH1cblxuICAmLmJ1dHRvbnMge1xuICAgIC5pdGVtLWlubmVyIHtcbiAgICAgIHBhZGRpbmctdG9wOiAwO1xuICAgICAgcGFkZGluZy1ib3R0b206IDA7XG5cbiAgICAgID4gLnJvdyB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuXG4gICAgICAgIC5idXR0b24ge1xuICAgICAgICAgIGZsZXg6IDE7XG4gICAgICAgICAgZm9udC1zaXplOiAxN3B4O1xuICAgICAgICAgIG1hcmdpbi1sZWZ0OiA1cHg7XG5cbiAgICAgICAgICAmOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgICAgIG1hcmdpbi1sZWZ0OiAwO1xuICAgICAgICAgIH1cblxuICAgICAgICAgICYuYWN0aXZlIHtcbiAgICAgICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogQHRoZW1lQ29sb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLmNvbG9yLXByZXZpZXcge1xuICAgIHdpZHRoOiAzMHB4O1xuICAgIGhlaWdodDogMzBweDtcbiAgICBib3JkZXItcmFkaXVzOiAxNnB4O1xuICAgIG1hcmdpbi10b3A6IC0zcHg7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwwLDAsMC4xNSkgaW5zZXQ7XG4gIH1cbn1cblxuLml0ZW0tbGluayB7XG4gICYubm8taW5kaWNhdG9yIHtcbiAgICAuaXRlbS1pbm5lciB7XG4gICAgICBiYWNrZ3JvdW5kLWltYWdlOiBub25lO1xuICAgICAgcGFkZGluZy1yaWdodDogMTZweDtcbiAgICB9XG4gIH1cbn1cblxuLnBvcG92ZXIgLmxpc3QtYmxvY2s6bGFzdC1jaGlsZCBsaTpsYXN0LWNoaWxkIC5idXR0b25zIGEge1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG59IiwiLy8gQ29udGV4dCBtZW51XG5cbi5kb2N1bWVudC1tZW51IHtcbiAgd2lkdGg6IGF1dG87XG4gIGxpbmUtaGVpZ2h0OiAxICFpbXBvcnRhbnQ7XG4gIHotaW5kZXg6IDEyNTAwO1xuXG4gIC5wb3BvdmVyLWlubmVyIHtcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICB9XG5cbiAgLmxpc3QtYmxvY2sge1xuICAgIHdoaXRlLXNwYWNlOiBwcmU7XG5cbiAgICB1bCB7XG4gICAgICBoZWlnaHQ6IDQ4cHg7XG4gICAgfVxuXG4gICAgbGkge1xuICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgIH1cblxuICAgIC5pdGVtLWxpbmsge1xuICAgICAgaHRtbC5waG9uZSAmIHtcbiAgICAgICAgcGFkZGluZzogMCAxMHB4O1xuICAgICAgfVxuICAgIH1cbiAgfVxufSIsIi8vIENvbG9yIHBhbGV0dGVcblxuLmNvbG9yLXBhbGV0dGUge1xuICBhIHtcbiAgICBmbGV4LWdyb3c6IDE7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIG1pbi13aWR0aDogMTBweDtcbiAgICBtaW4taGVpZ2h0OiAyNnB4O1xuICAgIG1hcmdpbjogMXB4IDFweCAwIDA7XG4gICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwwLDAsMC4xNSkgaW5zZXQ7XG5cbiAgICAmLmFjdGl2ZSB7XG4gICAgICAmOmFmdGVyIHtcbiAgICAgICAgY29udGVudDonICc7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHdoaXRlLCAwIDAgMCA0cHggQHRoZW1lQ29sb3I7XG4gICAgICAgIHotaW5kZXg6IDE7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDFweDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAmLnRyYW5zcGFyZW50IHtcbiAgICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgICBiYWNrZ3JvdW5kLXNpemU6IDEwMCUgMTAwJTtcbiAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKFwiPHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHg9JzBweCcgeT0nMHB4JyB2aWV3Qm94PScwIDAgMjIgMjInIHhtbDpzcGFjZT0ncHJlc2VydmUnPjxsaW5lIHN0cm9rZT0nI2ZmMDAwMCcgc3Ryb2tlLWxpbmVjYXA9J3VuZGVmaW5lZCcgc3Ryb2tlLWxpbmVqb2luPSd1bmRlZmluZWQnIGlkPSdzdmdfMScgeTI9JzAnIHgyPScyMicgeTE9JzIyJyB4MT0nMCcgc3Ryb2tlLXdpZHRoPScyJyBmaWxsPSdub25lJy8+PC9zdmc+XCIpO1xuICAgIH1cbiAgfVxuXG4gIC50aGVtZS1jb2xvcnMge1xuICAgIC5pdGVtLWlubmVyIHtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICAgIH1cbiAgfVxuXG4gIC5zdGFuZGFydC1jb2xvcnMge1xuICAgIC5pdGVtLWlubmVyIHtcbiAgICAgIG92ZXJmbG93OiB2aXNpYmxlO1xuICAgIH1cbiAgfVxuXG4gICYubGlzdC1ibG9jazpsYXN0LWNoaWxkIGxpOmxhc3QtY2hpbGQgYSB7XG4gICAgYm9yZGVyLXJhZGl1czogMDtcbiAgfVxufSIsIi8vIEFib3V0XG5cbi5hYm91dCB7XG4gIC5wYWdlLWNvbnRlbnQge1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgfVxuXG4gIC5jb250ZW50LWJsb2NrOmZpcnN0LWNoaWxkIHtcbiAgICBtYXJnaW46IDE1cHggMDtcbiAgfVxuXG4gIC5jb250ZW50LWJsb2NrIHtcbiAgICBtYXJnaW46IDAgYXV0byAxNXB4O1xuXG4gICAgYSB7XG4gICAgICBjb2xvcjogIzAwMDtcbiAgICB9XG4gIH1cblxuICBoMyB7XG4gICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICBtYXJnaW46IDA7XG5cbiAgICAmLnZlbmRvciB7XG4gICAgICBjb2xvcjogIzAwMDtcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgICAgbWFyZ2luLXRvcDogMTVweDtcbiAgICB9XG4gIH1cblxuICBwID4gbGFiZWwge1xuICAgIG1hcmdpbi1yaWdodDogNXB4O1xuICB9XG5cbiAgLmxvZ28ge1xuICAgIGJhY2tncm91bmQ6IHVybCgnLi4vLi4vLi4vLi4vY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvaW1nL2Fib3V0L29ubHlvZmZpY2Uuc3ZnJykgbm8tcmVwZWF0IGNlbnRlcjtcbiAgfVxufSIsIi8vIFNlYXJjaFxuXG4udGFibGV0IHtcbiAgLnNlYXJjaGJhci5kb2N1bWVudCB7XG4gICAgLmxlZnQge1xuICAgICAgbWluLXdpZHRoOiAxNXB4O1xuICAgIH1cblxuICAgIC5jZW50ZXIge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgbWFyZ2luOiAwO1xuICAgICAgb3ZlcmZsb3c6IHZpc2libGU7XG5cbiAgICAgIC5zZWFyY2hiYXIge1xuICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTtcblxuICAgICAgICAmLnNlYXJjaCB7XG4gICAgICAgICAgcGFkZGluZzogMDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5AcGhvbmVTZWFyY2hIZWlnaHQ6IDQ4cHg7XG5cbi5waG9uZSB7XG4gIC5zZWFyY2hiYXIuZG9jdW1lbnQge1xuICAgIC5sZWZ0LFxuICAgIC5jZW50ZXIsXG4gICAgLnJpZ2h0IHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgfVxuXG4gICAgLmxlZnQge1xuICAgICAgbWluLXdpZHRoOiAxNXB4O1xuICAgIH1cblxuICAgIC5jZW50ZXIge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBvdmVyZmxvdzogdmlzaWJsZTtcblxuICAgICAgLnNlYXJjaGJhciB7XG4gICAgICAgIHBhZGRpbmc6IDA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLnJpZ2h0IHtcbiAgICAgID4gcCB7XG4gICAgICAgIG1hcmdpbjogMDtcblxuICAgICAgICBhLmxpbmsge1xuICAgICAgICAgIGhlaWdodDogQHBob25lU2VhcmNoSGVpZ2h0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59IiwiLy8gSWNvbnNcbmkuaWNvbiB7XG4gICYuaWNvbi1leHBhbmQtdXAge1xuICAgIHdpZHRoOiAxN3B4O1xuICAgIGhlaWdodDogMTdweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe2JsYWNrfVwiPjxnPjxwb2x5Z29uIHBvaW50cz1cIjEwLjksNS4xIDIsMTMuOSA0LjEsMTYgMTEuMSw5LjIgMTcuOSwxNiAyMCwxMy45IDExLjIsNS4xIDExLjEsNSBcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1leHBhbmQtZG93biB7XG4gICAgd2lkdGg6IDE3cHg7XG4gICAgaGVpZ2h0OiAxN3B4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7YmxhY2t9XCI+PGc+PHBvbHlnb24gcG9pbnRzPVwiMTAuOSwxNi45IDIsOC4xIDQuMSw2IDExLjEsMTIuOCAxNy45LDYgMjAsOC4xIDExLjIsMTYuOSAxMS4xLDE3IFwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXNlYXJjaCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTE5LjUsMTYuOEwxNiwxMy4zYzAuNy0xLjEsMS4xLTIuNCwxLjEtMy44QzE3LDUuNCwxMy42LDIsOS41LDJTMiw1LjQsMiw5LjVTNS40LDE3LDkuNSwxN2MxLjQsMCwyLjctMC40LDMuOC0xLjFsMy41LDMuNWMwLjcsMC43LDEuOSwwLjcsMi42LDBDMjAuMiwxOC43LDIwLjIsMTcuNiwxOS41LDE2Ljh6IE05LjUsMTUuM2MtMy4yLDAtNS44LTIuNi01LjgtNS44czIuNi01LjgsNS44LTUuOHM1LjgsMi42LDUuOCw1LjhTMTIuNywxNS4zLDkuNSwxNS4zelwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLWVkaXQge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0wLDIwaDIydjFIMFYyMHpcIi8+PHBvbHlnb24gcG9pbnRzPVwiMTcuMSwzLjEgMy41LDE2LjcgMywyMCA2LjMsMTkuNSAxOS45LDUuOSBcdFwiLz48cGF0aCBkPVwiTTIwLjUsNS4zTDIyLDMuOGMwLDAtMC4yLTEuMi0wLjktMS45QzIwLjQsMS4xLDE5LjIsMSwxOS4yLDFsLTEuNSwxLjVMMjAuNSw1LjN6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tcGxheSB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTQuMDQ2NDM2MywyLjk4ODQ1NTNjMC4wMDY1MjYsMC4wMDI5NiwwLjAxNDIzNDUsMC4wMDY4MzUsMC4wMjMxNDM4LDAuMDExOTAyMSBjMC41OTA4NjA0LDAuMzM1NzYzNywxMi43MTE4Mzk3LDcuMjkyNDQzMywxMy44OTc3NDg5LDguMDI2ODQwMmMtMC41ODMxNTg1LDAuMzQxNzc1OS0xMy4wMTM3NTg3LDcuNDg3OTI3NC0xMy45MzQ2NTksNy45ODI2NzI3IEw0LjA0NjQzNjMsMi45ODg0NTUzIE0zLjk4ODkzNTcsMkMzLjQ0Mjc3OTUsMi4wMDAwNTc3LDMuMDAwNTI1LDIuNDUzMzU3NSwzLjAwMDUyNSwzLjAxNTM0OFx0YzAsMC41NzM0ODcsMCwxNS4xNjMyOTU3LDAsMTUuOTk0NTIyMUMzLjAwMDUyNSwxOS42MjI5NjMsMy40Nzk2MTA0LDIwLDMuOTk0MDU4OCwyMCBjMC4xNzI5MzcyLDAsMC4zNDk5MTkxLTAuMDQyNjMxMSwwLjUxMzk3NjMtMC4xMzMyMjI2YzAuODkwNTYwMi0wLjQ5MTA0NSwxMy4xODgwODk0LTcuNTU4MzM3MiwxMy45NDA3Mzg3LTcuOTk5NDQ1OSBjMC42NzUxMjEzLTAuMzk1NTIwMiwwLjY4NjczMTMtMS4zMzc1MTIsMC0xLjczMjY2MDNDMTcuNDAzMTc1NCw5LjUzMzMyNzEsNS4xNTIzODUyLDIuNTAxODUyLDQuNTM5Mzk1MywyLjE1MzUxNjUgQzQuMzUyNjIwMSwyLjA0NzI3OTQsNC4xNjU0MDEsMS45OTk5ODEzLDMuOTg4OTM1NywyTDMuOTg4OTM1NywyelwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXJlYWRlciB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTE3LDIxSDFWOWg2VjJsMCwwaDEwdjVoMVYxSDYuMkwwLDcuNlYyMmgxOHYtM2gtMVYyMXogTTYsMi44VjhIMS4xTDYsMi44eiBNMTMsOGMtNS4xLDAtOSw1LTksNXM0LjEsNSw5LDVjNSwwLDktNSw5LTVTMTgsOCwxMyw4eiBNOC43LDE1LjVDNi44LDE0LjQsNi40LDEzLDYuNCwxM3MwLjQtMS41LDIuNC0yLjZDOC4zLDExLjIsOCwxMiw4LDEzQzgsMTMuOSw4LjMsMTQuOCw4LjcsMTUuNXogTTEzLDE2LjdjLTIuMSwwLTMuNy0xLjctMy43LTMuN2MwLTIuMSwxLjctMy43LDMuNy0zLjdjMi4xLDAsMy43LDEuNywzLjcsMy43QzE2LjcsMTUuMSwxNS4xLDE2LjcsMTMsMTYuN3ogTTE3LjMsMTUuNWMwLjQtMC43LDAuNy0xLjYsMC43LTIuNWMwLTEtMC4zLTEuOC0wLjctMi42YzIsMS4xLDMuNCwyLjYsMy40LDIuNlMxOS4yLDE0LjQsMTcuMywxNS41eiBNMTMsMTEuN2MtMC43LDAtMS4zLDAuNi0xLjMsMS4zczAuNiwxLjMsMS4zLDEuM3MxLjMtMC42LDEuMy0xLjNTMTMuNywxMS43LDEzLDExLjd6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tZG93bmxvYWQge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIi0xIDMgMjIgMjhcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwb2x5Z29uIGlkPVwiWE1MSURfM19cIiBwb2ludHM9XCIxMCw1LjYgMTAsMjEuMiAxMSwyMS4yIDExLDUuNiAxNC42LDkuMyAxNS4zLDguNSAxMC41LDMuNiA1LjcsOC41IDYuNCw5LjMgXHRcIi8+PHBvbHlnb24gaWQ9XCJYTUxJRF82X1wiIHBvaW50cz1cIjEzLDEyIDEzLDEzIDE5LDEzIDE5LDMwIDIsMzAgMiwxMyA4LDEzIDgsMTIgMSwxMiAxLDEzIDEsMzAgMSwzMSAyMCwzMSAyMCwzMCAyMCwxMyAyMCwxMiBcdFwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLWluZm8ge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xMCwxN2gyVjhoLTJWMTd6IE0xMSwxQzUuNSwxLDEsNS41LDEsMTFzNC41LDEwLDEwLDEwczEwLTQuNSwxMC0xMFMxNi41LDEsMTEsMXogTTExLDIwYy01LDAtOS00LTktOXM0LTksOS05czksNCw5LDlTMTYsMjAsMTEsMjB6IE0xMCw3aDJWNWgtMlY3elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLWFib3V0IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCItMSA3IDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTIxLDE4LjVjMC0wLjMtMC4xLTAuNi0wLjctMC45bC0yLjYtMS4ybDIuNi0xLjJjMC42LTAuMywwLjctMC42LDAuNy0wLjljMC0wLjMtMC4xLTAuNi0wLjctMC45bC04LjktNC4xYy0wLjctMC40LTEuOS0wLjQtMi44LDBsLTguOSw0LjFDLTAuOSwxMy44LTEsMTQuMS0xLDE0LjNzMC4xLDAuNiwwLjcsMC45bDIuNiwxLjJsLTIuNiwxLjJDLTAuOSwxOC0xLDE4LjQtMSwxOC41YzAsMC4yLDAuMSwwLjYsMC43LDAuOWwyLjUsMS4ybC0yLjUsMS4yQy0wLjksMjIuMS0xLDIyLjUtMSwyMi43YzAsMC4zLDAuMSwwLjYsMC43LDAuOWw4LjksNC4xYzAuNSwwLjIsMC44LDAuMywxLjQsMC4zczEtMC4xLDEuNC0wLjNsOC45LTQuMWMwLjYtMC40LDAuNy0wLjYsMC43LTAuOWMwLTAuMy0wLjEtMC42LTAuNy0wLjlsLTIuNS0xLjJsMi41LTEuMkMyMC45LDE5LjIsMjEsMTguOCwyMSwxOC41eiBNLTAuMiwxNC4zTC0wLjIsMTQuM2MwLDAsMC4xLTAuMSwwLjMtMC4yTDksMTBjMC42LTAuMywxLjUtMC4zLDIsMGw4LjksNC4xYzAuMiwwLjEsMC4zLDAuMiwwLjMsMC4ybDAsMGMwLDAtMC4xLDAuMS0wLjMsMC4yTDExLDE4LjZjLTAuNiwwLjMtMS41LDAuMy0yLDBsLTguOS00LjFDLTAuMSwxNC40LTAuMiwxNC4zLTAuMiwxNC4zeiBNMjAuMiwyMi43TDIwLjIsMjIuN2MwLDAtMC4xLDAuMS0wLjMsMC4yTDExLDI3LjFjLTAuNiwwLjMtMS41LDAuMy0yLDBsLTguOS00LjFjLTAuMi0wLjEtMC4zLTAuMi0wLjMtMC4ybDAsMGMwLDAsMC4xLTAuMSwwLjMtMC4ybDMtMS41bDUuNSwyLjZjMC43LDAuNCwxLjksMC40LDIuOCwwbDUuNS0yLjZsMywxLjVDMjAuMSwyMi43LDIwLjIsMjIuNywyMC4yLDIyLjd6IE0xOS45LDE4LjdMMTEsMjIuOGMtMC42LDAuMy0xLjUsMC4zLTIsMGwtOC45LTQuMWMtMC4yLTAuMS0wLjMtMC4yLTAuMy0wLjJsMCwwYzAsMCwwLjEtMC4xLDAuMy0wLjJsMy0xLjVsNS41LDIuNmMwLjcsMC40LDEuOSwwLjQsMi44LDBsNS41LTIuNmwzLDEuNWMwLjIsMC4xLDAuMywwLjIsMC4zLDAuMmwwLDBDMjAuMiwxOC41LDIwLjEsMTguNiwxOS45LDE4Ljd6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24taGVscCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTExLjYsMS4zYy0zLjMsMC02LDIuOC02LDYuMmMwLjMsMCwwLjcsMCwwLjksMGMwLTIuOSwyLjMtNS4yLDUuMS01LjJzNS4xLDIuMyw1LjEsNS4yYzAsMS43LTEuOSwzLjItMyw0LjNDMTIuOSwxMi42LDExLDE0LjIsMTEsMTZjMCwxLjIsMCwyLjIsMCwyLjdjMC4zLDAsMC42LDAsMC45LDBjMC0wLjYsMC0xLjYsMC0yLjVjMC0xLjQsMS4xLTIuNCwyLjItMy41YzEuNy0xLjUsMy41LTMuMSwzLjUtNS4yQzE3LjYsNC4xLDE0LjksMS4zLDExLjYsMS4zeiBNMTEuNSwyMC4yYy0wLjMsMC0wLjUsMC4yLTAuNSwwLjV2MC44YzAsMC4zLDAuMiwwLjUsMC41LDAuNXMwLjUtMC4yLDAuNS0wLjV2LTAuOEMxMS45LDIwLjQsMTEuNywyMC4yLDExLjUsMjAuMnpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1zZXR1cCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTAsM3YxNmgyMlYzSDB6IE0yMSwxN0gxVjVoMjBWMTd6IE0xNi41LDUuOWwtNy4yLDcuMkw4LjgsMTVINHYxYzAsMCwzLjIsMCw1LDBjMC40LDAsMC4yLDAsMC4yLTAuMmwyLjItMC42TDE4LjcsOEwxNi41LDUuOXogTTkuOSwxMy4xbDYuNS02LjRMMTgsOGwtNi41LDYuNEw5LjksMTMuMXpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi12ZXJzaW9ucyB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiLTEgNyAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xOSwxMmMwLTEuMS0wLjktMi0yLTJjMC0xLjEtMC45LTItMi0ySDVjLTEuMSwwLTIsMC45LTIsMmMtMS4xLDAtMiwwLjktMiwyYy0xLjEsMC0yLDAuOS0yLDJ2MTJjMCwxLjEsMC45LDIsMiwyaDE4YzEuMSwwLDItMC45LDItMlYxNEMyMSwxMi45LDIwLjEsMTIsMTksMTJ6IE01LDloMTBjMC42LDAsMSwwLjQsMSwxSDRDNCw5LjQsNC40LDksNSw5eiBNMywxMWgxNGMwLjYsMCwxLDAuNCwxLDFIMkMyLDExLjQsMi40LDExLDMsMTF6IE0yMCwyNmMwLDAuNi0wLjQsMS0xLDFIMWMtMC42LDAtMS0wLjQtMS0xVjE0YzAtMC42LDAuNC0xLDEtMWgxOGMwLjYsMCwxLDAuNCwxLDFWMjZ6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAvLyYuaWNvbi10ZXh0LWFkZGl0aW9uYWwge1xuICAvLyAgd2lkdGg6IDIycHg7XG4gIC8vICBoZWlnaHQ6IDIycHg7XG4gIC8vICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xOC41LDE1LjVjLTEuMSwwLTIsMC45LTIsMnMwLjksMiwyLDJzMi0wLjksMi0yUzE5LjYsMTUuNSwxOC41LDE1LjV6IE0xOC41LDE4LjVjLTAuNiwwLTEtMC40LTEtMWMwLTAuNiwwLjQtMSwxLTFzMSwwLjQsMSwxQzE5LjUsMTguMSwxOS4xLDE4LjUsMTguNSwxOC41eiBNMTguNSw3LjVjMS4xLDAsMi0wLjksMi0yYzAtMS4xLTAuOS0yLTItMnMtMiwwLjktMiwyQzE2LjUsNi42LDE3LjQsNy41LDE4LjUsNy41eiBNMTguNSw0LjVjMC42LDAsMSwwLjQsMSwxcy0wLjQsMS0xLDFzLTEtMC40LTEtMVMxNy45LDQuNSwxOC41LDQuNXogTTE4LjUsOS41Yy0xLjEsMC0yLDAuOS0yLDJzMC45LDIsMiwyczItMC45LDItMlMxOS42LDkuNSwxOC41LDkuNXogTTE4LjUsMTIuNWMtMC42LDAtMS0wLjQtMS0xYzAtMC42LDAuNC0xLDEtMXMxLDAuNCwxLDFDMTkuNSwxMi4xLDE5LjEsMTIuNSwxOC41LDEyLjV6IE02LjksMy44TDEsMTguOWgxLjVsMS44LTQuN2g2LjlsMS43LDQuN2gxLjVMOC42LDMuOEg2Ljl6IE00LjcsMTIuOWwzLTcuOWwzLDcuOUg0Ljd6XCIvPjwvZz48L3N2Zz4nKTtcbiAgLy99XG4gIC8vJi5pY29uLXRleHQtY29sb3Ige1xuICAvLyAgd2lkdGg6IDIycHg7XG4gIC8vICBoZWlnaHQ6IDIycHg7XG4gIC8vICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk04LjksMTJsMi4zLTYuM2wyLjIsNi4zSDguOXogTTQuNywxNy44aDJsMS42LTQuM2g1LjZsMS41LDQuM2gyLjFMMTIuMywzLjVoLTIuMkw0LjcsMTcuOHpcIi8+PC9nPjwvc3ZnPicpO1xuICAvL31cbiAgLy8mLmljb24tdGV4dC1zZWxlY3Rpb24ge1xuICAvLyAgd2lkdGg6IDIycHg7XG4gIC8vICBoZWlnaHQ6IDIycHg7XG4gIC8vICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk03LjYsMTAuM2MwLjIsMC4zLDAuNCwwLjQsMC41LDAuNWMwLjMsMC4yLDAuNiwwLjMsMSwwLjNjMC43LDAsMS4zLTAuMywxLjctMC44YzAuNC0wLjUsMC42LTEuMiwwLjYtMi4xYzAtMC45LTAuMi0xLjUtMC42LTJjLTAuNC0wLjQtMC45LTAuNy0xLjYtMC43Yy0wLjMsMC0wLjYsMC4xLTAuOSwwLjJDOCw2LDcuOCw2LjIsNy42LDYuNFYzLjhINi44VjExaDAuOFYxMC4zeiBNOCw2LjljMC4zLTAuMywwLjctMC40LDEuMS0wLjRjMC41LDAsMC44LDAuMiwxLDAuNWMwLjIsMC40LDAuNCwwLjgsMC40LDEuNGMwLDAuNi0wLjEsMS4xLTAuNCwxLjVjLTAuMiwwLjQtMC42LDAuNi0xLjEsMC42Yy0wLjYsMC0xLjEtMC4zLTEuMy0wLjlDNy42LDkuMiw3LjYsOC44LDcuNiw4LjNDNy42LDcuNyw3LjcsNy4yLDgsNi45eiBNNS43LDEwLjRjLTAuMSwwLTAuMiwwLTAuMi0wLjFjMC0wLjEtMC4xLTAuMS0wLjEtMC4ydi0zYzAtMC41LTAuMi0wLjktMC42LTEuMUM0LjQsNS44LDQsNS42LDMuMyw1LjZjLTAuNSwwLTEsMC4xLTEuNCwwLjRDMS41LDYuMywxLjMsNi43LDEuMyw3LjRoMC44YzAtMC4zLDAuMS0wLjUsMC4yLTAuNmMwLjItMC4yLDAuNS0wLjQsMS0wLjRjMC40LDAsMC43LDAuMSwwLjksMC4yYzAuMiwwLjEsMC4zLDAuNCwwLjMsMC43YzAsMC4xLDAsMC4zLTAuMSwwLjNDNC40LDcuNyw0LjMsNy44LDQuMSw3LjhMMi43LDhDMi4yLDguMSwxLjgsOC4yLDEuNSw4LjVDMS4yLDguOCwxLDkuMSwxLDkuNmMwLDAuNCwwLjIsMC44LDAuNSwxLjFjMC4zLDAuMywwLjcsMC40LDEuMiwwLjRjMC40LDAsMC44LTAuMSwxLjEtMC4zYzAuMy0wLjIsMC42LTAuNCwwLjgtMC42YzAsMC4yLDAuMSwwLjQsMC4yLDAuNWMwLjEsMC4yLDAuNCwwLjMsMC43LDAuM2MwLjEsMCwwLjIsMCwwLjMsMGMwLjEsMCwwLjIsMCwwLjMtMC4xdi0wLjZjLTAuMSwwLTAuMSwwLTAuMiwwQzUuOCwxMC40LDUuNywxMC40LDUuNywxMC40eiBNNC41LDkuMWMwLDAuNS0wLjIsMC45LTAuNywxLjJjLTAuMywwLjEtMC42LDAuMi0wLjksMC4yYy0wLjMsMC0wLjUtMC4xLTAuNy0wLjJDMiwxMC4xLDIsOS45LDIsOS42QzIsOS4zLDIuMSw5LDIuNCw4LjljMC4yLTAuMSwwLjQtMC4yLDAuNy0wLjJsMC41LTAuMWMwLjIsMCwwLjMtMC4xLDAuNS0wLjFjMC4yLDAsMC4zLTAuMSwwLjQtMC4yVjkuMXogTTE4LjUsNUw4LjMsMTUuM2wtMC41LDJjLTAuNiwwLjQtMS4zLDAuMy0xLjUsMC42Yy0wLjMsMC40LDAuOSwwLjQsMS41LDAuM2MwLjQsMCwwLjUsMCwwLjUtMC4ybDIuMi0wLjZMMjAuNyw3LjFMMTguNSw1eiBNOSwxNS4zbDkuNS05LjVMMjAsNy4xbC05LjUsOS41TDksMTUuM3pcIi8+PC9nPjwvc3ZnPicpO1xuICAvL31cbiAgLy8mLmljb24tYnVsbGV0cyB7XG4gIC8vICB3aWR0aDogMjJweDtcbiAgLy8gIGhlaWdodDogMjJweDtcbiAgLy8gIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTcsNHYxaDE1VjRIN3ogTTEsNmgzVjNIMVY2eiBNNywxMmgxNXYtMUg3VjEyeiBNMSwxM2gzdi0zSDFWMTN6IE03LDE5aDE1di0xSDdWMTl6IE0xLDIwaDN2LTNIMVYyMHpcIi8+PC9nPjwvc3ZnPicpO1xuICAvL31cbiAgLy8mLmljb24tbnVtYmVycyB7XG4gIC8vICB3aWR0aDogMjJweDtcbiAgLy8gIGhlaWdodDogMjJweDtcbiAgLy8gIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTcsMy44djFoMTV2LTFIN3ogTTcsMTEuOGgxNXYtMUg3VjExLjh6IE03LDE4LjhoMTV2LTFIN1YxOC44eiBNMy4xLDYuOWgwLjdWMkgzLjNDMy4yLDIuNCwzLjEsMi42LDIuOSwyLjdDMi43LDIuOCwyLjQsMi45LDIsMi45djAuNWgxLjJWNi45eiBNMy4zLDlDMi42LDksMi4xLDkuMiwxLjksOS43Yy0wLjIsMC4zLTAuMiwwLjYtMC4yLDFoMC42YzAtMC4zLDAuMS0wLjUsMC4xLTAuN2MwLjItMC4zLDAuNS0wLjUsMC45LTAuNWMwLjMsMCwwLjUsMC4xLDAuNywwLjNzMC4zLDAuNCwwLjMsMC43YzAsMC4yLTAuMSwwLjUtMC4zLDAuN2MtMC4xLDAuMS0wLjMsMC4zLTAuNiwwLjRsLTAuNywwLjRjLTAuNCwwLjMtMC43LDAuNS0wLjksMC45Yy0wLjIsMC4zLTAuMiwwLjctMC4zLDEuMWgzLjR2LTAuNkgyLjJjMC4xLTAuMiwwLjItMC41LDAuNC0wLjdjMC4xLTAuMSwwLjMtMC4yLDAuNS0wLjRMMy42LDEyYzAuNC0wLjIsMC43LTAuNCwwLjktMC42YzAuMy0wLjMsMC40LTAuNiwwLjQtMWMwLTAuNC0wLjEtMC43LTAuNC0xQzQuMyw5LjEsMy45LDksMy4zLDl6IE00LjEsMTguM2MwLjItMC4xLDAuMy0wLjIsMC40LTAuM2MwLjItMC4yLDAuMi0wLjQsMC4yLTAuN2MwLTAuNC0wLjEtMC43LTAuNC0xQzQsMTYuMSwzLjYsMTYsMy4xLDE2Yy0wLjYsMC0xLjEsMC4yLTEuMywwLjdjLTAuMSwwLjMtMC4yLDAuNi0wLjIsMC45aDAuNmMwLTAuMywwLjEtMC41LDAuMS0wLjZjMC4yLTAuMywwLjQtMC40LDAuOS0wLjRjMC4yLDAsMC40LDAuMSwwLjYsMC4yQzQsMTYuOSw0LjEsMTcsNC4xLDE3LjNjMCwwLjMtMC4xLDAuNi0wLjQsMC43Yy0wLjEsMC4xLTAuMywwLjEtMC42LDAuMWMtMC4xLDAtMC4xLDAtMC4xLDBjMCwwLTAuMSwwLTAuMiwwdjAuNWMwLDAsMC4xLDAsMC4xLDBjMCwwLDAuMSwwLDAuMSwwYzAuNCwwLDAuNywwLjEsMC45LDAuMmMwLjIsMC4xLDAuMywwLjQsMC4zLDAuN2MwLDAuMy0wLjEsMC41LTAuMywwLjdjLTAuMiwwLjItMC41LDAuMy0wLjgsMC4zYy0wLjQsMC0wLjctMC4xLTAuOS0wLjRjLTAuMS0wLjEtMC4yLTAuNC0wLjItMC43SDEuNWMwLDAuNSwwLjEsMC44LDAuNCwxLjJDMi4xLDIwLjgsMi41LDIxLDMuMSwyMWMwLjYsMCwxLTAuMSwxLjMtMC40YzAuMy0wLjMsMC41LTAuNywwLjUtMS4xYzAtMC4zLTAuMS0wLjUtMC4yLTAuN0M0LjUsMTguNSw0LjMsMTguMyw0LjEsMTguM3pcIi8+PC9nPjwvc3ZnPicpO1xuICAvL31cbiAgLy8mLmljb24tbGluZXNwYWNpbmcge1xuICAvLyAgd2lkdGg6IDIycHg7XG4gIC8vICBoZWlnaHQ6IDIycHg7XG4gIC8vICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBvbHlnb24gaWQ9XCJYTUxJRF83X1wiIHBvaW50cz1cIjIyLDQgMjIsMyAxMiwzIDExLDMgMSwzIDEsNCAxMSw0IDExLDQuMyA4LDcuNCA4LjcsOC4xIDExLDUuNyAxMSwxNy4zIDguNywxNC45IDgsMTUuNiAxMSwxOC43IDExLDE5IDEsMTkgMSwyMCAxMSwyMCAxMiwyMCAyMiwyMCAyMiwxOSAxMiwxOSAxMiwxOC42IDE1LDE1LjYgMTQuMywxNC45IDEyLDE3LjIgMTIsNS44IDE0LjMsOC4xIDE1LDcuNCAxMiw0LjQgMTIsNCBcdFwiLz48L2c+PC9zdmc+Jyk7XG4gIC8vfVxuICAmLmljb24tdGV4dC1hbGlnbi1jZW50ZXIge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctbWFzaygnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xLDN2MWgyMVYzSDF6IE00LDd2MWgxNFY3SDR6IE0xLDEyaDIxdi0xSDFWMTJ6IE00LDE1djFoMTR2LTFINHogTTEsMjBoMjF2LTFIMVYyMHpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10ZXh0LWFsaWduLWphc3Qge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctbWFzaygnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xLDN2MWgyMVYzSDF6IE0xLDhoMjFWN0gxVjh6IE0xLDEyaDIxdi0xSDFWMTJ6IE0xLDE2aDIxdi0xSDFWMTZ6IE0xLDIwaDIxdi0xSDFWMjB6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGV4dC1hbGlnbi1sZWZ0IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLW1hc2soJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMSwzdjFoMjFWM0gxeiBNMTUsN0gxdjFoMTRWN3ogTTEsMTJoMjF2LTFIMVYxMnogTTE1LDE1SDF2MWgxNFYxNXogTTEsMjBoMjF2LTFIMVYyMHpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10ZXh0LWFsaWduLXJpZ2h0IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLW1hc2soJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMSwzdjFoMjFWM0gxeiBNOCw4aDE0VjdIOFY4eiBNMjIsMTFIMXYxaDIxVjExeiBNOCwxNmgxNHYtMUg4VjE2eiBNMjIsMTlIMXYxaDIxVjE5elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLWRlLWluZGVudCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1tYXNrKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTEsMjB2LTFoMjF2MUgxeiBNMTEsMTVoMTF2MUgxMVYxNXogTTExLDExaDExdjFIMTFWMTF6IE0xMSw3aDExdjFIMTFWN3ogTTYuMyw3TDcsNy43bC0zLjgsMy44TDcsMTUuM0w2LjMsMTZMMiwxMS44bC0wLjItMC4zTDIsMTEuMkw2LjMsN3ogTTEsM2gyMXYxSDFWM3pcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1pbi1pbmRlbnQge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctbWFzaygnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xLDIwdi0xaDIxdjFIMXogTTEyLDE2SDF2LTFoMTFWMTZ6IE0xMiwxMkgxdi0xaDExVjEyeiBNMTIsOEgxVjdoMTFWOHogTTIxLDExLjJsMC4yLDAuM0wyMSwxMS44TDE2LjcsMTZMMTYsMTUuM2wzLjgtMy44TDE2LDcuN0wxNi43LDdMMjEsMTEuMnogTTIyLDRIMVYzaDIxVjR6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGFibGUtYWRkLWNvbHVtbi1sZWZ0IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMTUsMTloLTFIOEg3di0xdi0zSDBWMmg3aDFoMTR2NHYxdjN2MXYzdjF2M3YxSDE1eiBNMTUsMThoNnYtM2gtNlYxOHogTTE1LDE0aDZ2LTNoLTZWMTR6IE04LDE4aDZ2LTNIOFYxOHogTTgsMTRoNnYtM0g4VjE0eiBNMTQsMTBWN0g4djNIMTR6IE04LDN2M2g2VjNIOHogTTIxLDNoLTZ2M2g2VjN6IE0xNSw3djNoNlY3SDE1eiBNMywxNmgxdjJoMnYxSDR2Mkgzdi0ySDF2LTFoMlYxNnpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1hZGQtY29sdW1uLXJpZ2h0IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMCwxOWwwLTFsMC0zbDAtMWwwLTNsMC0xbDAtM2wwLTFsMC00aDE0aDFoN3YxM2gtN3YzdjFoLTFIOEg3SDB6IE03LDE1SDF2M2g2VjE1eiBNNywxMUgxdjNoNlYxMXogTTE0LDE1SDh2M2g2VjE1eiBNMTQsMTFIOHYzaDZWMTF6IE0xNCwxMFY3SDh2M0gxNHogTTgsM3YzaDZWM0g4eiBNMSw2aDZWM0gxVjZ6IE0xLDd2M2g2VjdIMXogTTE5LDE4aDJ2MWgtMnYyaC0xdi0yaC0ydi0xaDJ2LTJoMVYxOHpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1hZGQtcm93LWFib3ZlIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMjEsMjBoLTZoLTFIOEg3SDB2LTF2LTN2LTF2LTN2LTFWOFY3VjFoMTV2Nmg2aDF2MXYzdjF2M3YxdjN2MUgyMXogTTcsOEgxdjNoNlY4eiBNNywxMkgxdjNoNlYxMnogTTcsMTZIMXYzaDZWMTZ6IE04LDE5aDZ2LTNIOFYxOXogTTgsMTVoNnYtM0g4VjE1eiBNOCwxMWg2VjhIOFYxMXogTTIxLDhoLTZ2M2g2Vjh6IE0yMSwxMmgtNnYzaDZWMTJ6IE0yMSwxNmgtNnYzaDZWMTZ6IE0xOSw2aC0xVjRoLTJWM2gyVjFoMXYyaDJ2MWgtMlY2elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLWFkZC1yb3ctYmVsb3cge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0yMiwxdjF2M3YxdjN2MXYzdjFoLTFoLTZ2Nkgwdi02di0xdi0zVjlWNlY1VjJWMWg3aDFoNmgxaDZIMjJ6IE03LDEwSDF2M2g2VjEweiBNNyw2SDF2M2g2VjZ6IE03LDJIMXYzaDZWMnogTTgsNWg2VjJIOFY1eiBNOCw5aDZWNkg4Vjl6IE04LDEzaDZ2LTNIOFYxM3ogTTIxLDEwaC02djNoNlYxMHogTTIxLDZoLTZ2M2g2VjZ6IE0yMSwyaC02djNoNlYyeiBNMTksMTdoMnYxaC0ydjJoLTF2LTJoLTJ2LTFoMnYtMmgxVjE3elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLXJlbW92ZS1jb2x1bW4ge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0yMSwxOWgtNmgtMWgtMS42Yy0wLjksMS44LTIuNywzLTQuOSwzcy00LTEuMi00LjktM0gxSDB2LTF2LTN2LTF2LTN2LTFWN1Y2VjNWMmg3aDFoNmgxaDZoMXYxdjN2MXYzdjF2M3YxdjN2MUgyMXogTTcuNSwxMkM1LDEyLDMsMTQsMywxNi41UzUsMjEsNy41LDIxczQuNS0yLDQuNS00LjVTMTAsMTIsNy41LDEyeiBNMTQsM0g4djNoNlYzeiBNMTQsN0g4djNoNlY3eiBNMTQsMTFIOHYwLjFjMS45LDAuMiwzLjUsMS4zLDQuNCwyLjlIMTRWMTF6IE0xNCwxNWgtMS4yYzAuMSwwLjUsMC4yLDEsMC4yLDEuNWMwLDAuNS0wLjEsMS0wLjIsMS41SDE0VjE1eiBNMjEsM2gtNnYzaDZWM3ogTTIxLDdoLTZ2M2g2Vjd6IE0yMSwxMWgtNnYzaDZWMTF6IE0yMSwxNWgtNnYzaDZWMTV6IE05LjYsMTkuM2wtMi4xLTIuMWwtMi4xLDIuMWwtMC43LTAuN2wyLjEtMi4xbC0yLjEtMi4xbDAuNy0wLjdsMi4xLDIuMWwyLjEtMi4xbDAuNywwLjdsLTIuMSwyLjFsMi4xLDIuMUw5LjYsMTkuM3pcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1yZW1vdmUtcm93IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMjEsMTloLTZoLTFoLTEuNmMtMC45LDEuOC0yLjcsMy00LjksM3MtNC0xLjItNC45LTNIMUgwdi0xdi0zdi0xdi0zdi0xVjdWNlYzVjJoN2gxaDZoMWg2aDF2MXYzdjF2M3YxdjN2MXYzdjFIMjF6IE0xLDE4aDEuMkMyLjEsMTcuNSwyLDE3LDIsMTYuNWMwLTAuNSwwLjEtMSwwLjItMS41SDFWMTh6IE03LDNIMXYzaDZWM3ogTTcsN0gxdjNoNlY3eiBNNy41LDEyQzUsMTIsMywxNCwzLDE2LjVTNSwyMSw3LjUsMjFzNC41LTIsNC41LTQuNVMxMCwxMiw3LjUsMTJ6IE0xNCwzSDh2M2g2VjN6IE0xNCw3SDh2M2g2Vjd6IE0xNCwxNWgtMS4yYzAuMSwwLjUsMC4yLDEsMC4yLDEuNWMwLDAuNS0wLjEsMS0wLjIsMS41SDE0VjE1eiBNMjEsM2gtNnYzaDZWM3ogTTIxLDdoLTZ2M2g2Vjd6IE0yMSwxNWgtNnYzaDZWMTV6IE05LjYsMTkuM2wtMi4xLTIuMWwtMi4xLDIuMWwtMC43LTAuN2wyLjEtMi4xbC0yLjEtMi4xbDAuNy0wLjdsMi4xLDIuMWwyLjEtMi4xbDAuNywwLjdsLTIuMSwyLjFsMi4xLDIuMUw5LjYsMTkuM3pcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1wYWdlYnJlYWsge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk04LDE0djFoMXYtMUg4eiBNNiwxNHYxaDF2LTFINnogTTE4LDIxSDN2LTZIMnY3aDE3di03aC0xVjIxeiBNNCwxNHYxaDF2LTFINHogTTE0LDE0djFoMXYtMUgxNHogTTEwLDE0djFoMXYtMUgxMHogTTguMiwxTDIsNy42VjE0aDFWOWg2VjJsMCwwaDl2MTJoMVYxSDguMnogTTgsOEgzLjFMOCwyLjhWOHogTTEyLDE0djFoMXYtMUgxMnogTTE2LDE0djFoMXYtMUgxNnpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1zZWN0aW9uYnJlYWsge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0yMCwxNFYySDN2MTJIMlYxaDE5djEzSDIweiBNNSwxNHYxSDR2LTFINXogTTcsMTR2MUg2di0xSDd6IE05LDE0djFIOHYtMUg5eiBNMTEsMTR2MWgtMXYtMUgxMXogTTEzLDE0djFoLTF2LTFIMTN6IE0xNSwxNHYxaC0xdi0xSDE1eiBNMTcsMTR2MWgtMXYtMUgxN3ogTTE4LDE0aDF2MWgtMVYxNHogTTMsMjFoMTd2LTZoMXY3SDJ2LTdoMVYyMXpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1zdHJpbmdicmVhayB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTE4LDEySDUuMUw5LDE1LjlsLTAuNywwLjdsLTQuNS00LjVsLTAuNi0wLjZsMC42LTAuNmw0LjUtNC41TDksNy4xTDUuMSwxMUgxOFY1aDF2NnYxSDE4elwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXBhZ2VudW1iZXIge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggZD1cIk04LjIsMUwyLDcuNlYyMmgxN1YxSDguMnogTTgsMi44VjhIMy4xTDgsMi44eiBNMTgsMjFIM1Y5aDZWMmwwLDBoOVYyMXogTTEyLDE5aDF2LTRoLTAuN2MwLDAuMi0wLjEtMC4xLTAuMSwwYy0wLjEsMC4xLTAuMiwwLTAuMywwYy0wLjEsMC4xLTAuMiwwLjEtMC40LDAuMWMtMC4xLDAtMC4zLDAtMC40LDBWMTZIMTJWMTl6IE0xNS4zLDE3LjNDMTUsMTcuOSwxNS4xLDE4LjQsMTUsMTloMC45YzAtMC4zLDAtMC42LDAuMS0wLjljMC4xLTAuMywwLjEtMC42LDAuMy0wLjljMC4xLTAuMywwLjMtMC42LDAuNC0wLjljMC4yLTAuMywwLjEtMC4zLDAuMy0wLjVWMTVoLTN2MWgxLjlDMTUuNiwxNi40LDE1LjUsMTYuNywxNS4zLDE3LjN6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tbGluayB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTEyLjQsOS44YzAsMC0yLjEtMC4xLTMuOCwxLjJjLTIuOCwyLTMuMyw0LjMtMy4zLDQuM3MxLjYtMS43LDMuNS0yLjVjMS43LTAuNywzLjctMC40LDMuNy0wLjR2MS45bDQuOC0zLjNWMTFsLTQuOC0zLjNWOS44eiBNMTEsMUM1LjUsMSwxLDUuNSwxLDExYzAsNS41LDQuNSwxMCwxMCwxMHMxMC00LjUsMTAtMTBDMjEsNS41LDE2LjUsMSwxMSwxeiBNMTEsMjBjLTUsMC05LTQuMS05LTlDMiw2LDYsMiwxMSwyczksNC4xLDksOUMyMCwxNiwxNiwyMCwxMSwyMHpcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1pbWFnZS1saWJyYXJ5IHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIj48ZGVmcz48c3R5bGU+LmNscy0xe2lzb2xhdGlvbjppc29sYXRlO30uY2xzLTJ7b3BhY2l0eTowLjI7fS5jbHMtM3tmaWxsOiNmZmY7fS5jbHMtMTAsLmNscy0xMSwuY2xzLTQsLmNscy02LC5jbHMtNywuY2xzLTgsLmNscy05e21peC1ibGVuZC1tb2RlOm11bHRpcGx5O30uY2xzLTR7ZmlsbDp1cmwoI2dyYWRfOCk7fS5jbHMtNXtmaWxsOnVybCgjZ3JhZF8xMCk7fS5jbHMtNntmaWxsOnVybCgjZ3JhZF8xMik7fS5jbHMtN3tmaWxsOnVybCgjZ3JhZF8xNCk7fS5jbHMtOHtmaWxsOnVybCgjZ3JhZF83OSk7fS5jbHMtOXtmaWxsOnVybCgjZ3JhZF83Nyk7fS5jbHMtMTB7ZmlsbDp1cmwoI2dyYWRfNzUpO30uY2xzLTExe2ZpbGw6dXJsKCNncmFkXzgxKTt9PC9zdHlsZT48bGluZWFyR3JhZGllbnQgaWQ9XCJncmFkXzhcIiB4MT1cIjExLjA4XCIgeTE9XCIxMC4yNlwiIHgyPVwiMTEuMDhcIiB5Mj1cIjEuMjZcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj48c3RvcCBvZmZzZXQ9XCIwXCIgc3RvcC1jb2xvcj1cIiNmM2U5MTZcIi8+PHN0b3Agb2Zmc2V0PVwiMVwiIHN0b3AtY29sb3I9XCIjZjg5ZDM0XCIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPVwiZ3JhZF8xMFwiIHgxPVwiMTEuMDhcIiB5MT1cIjIwLjQ0XCIgeDI9XCIxMS4wOFwiIHkyPVwiMTEuODhcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj48c3RvcCBvZmZzZXQ9XCIwXCIgc3RvcC1jb2xvcj1cIiM1ZWI2ZThcIi8+PHN0b3Agb2Zmc2V0PVwiMVwiIHN0b3AtY29sb3I9XCIjOTU4Y2MzXCIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPVwiZ3JhZF8xMlwiIHgxPVwiMS40NlwiIHkxPVwiMTEuMDVcIiB4Mj1cIjEwLjQ2XCIgeTI9XCIxMS4wNVwiIGdyYWRpZW50VHJhbnNmb3JtPVwidHJhbnNsYXRlKDE3IDUuMDkpIHJvdGF0ZSg5MClcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj48c3RvcCBvZmZzZXQ9XCIwXCIgc3RvcC1jb2xvcj1cIiNjYzhkYmFcIi8+PHN0b3Agb2Zmc2V0PVwiMVwiIHN0b3AtY29sb3I9XCIjZjg2ODY3XCIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPVwiZ3JhZF8xNFwiIHgxPVwiMTEuNzNcIiB5MT1cIjExLjA1XCIgeDI9XCIyMC43M1wiIHkyPVwiMTEuMDVcIiBncmFkaWVudFRyYW5zZm9ybT1cInRyYW5zbGF0ZSgyNy4yOCAtNS4xOCkgcm90YXRlKDkwKVwiIGdyYWRpZW50VW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPjxzdG9wIG9mZnNldD1cIjBcIiBzdG9wLWNvbG9yPVwiIzZhYzA3ZlwiLz48c3RvcCBvZmZzZXQ9XCIxXCIgc3RvcC1jb2xvcj1cIiNjNWRhM2RcIi8+PC9saW5lYXJHcmFkaWVudD48bGluZWFyR3JhZGllbnQgaWQ9XCJncmFkXzc5XCIgeDE9XCIxMS43NFwiIHkxPVwiMTAuNDJcIiB4Mj1cIjE3LjUyXCIgeTI9XCI0LjYzXCIgZ3JhZGllbnRUcmFuc2Zvcm09XCJ0cmFuc2xhdGUoMzAuMjkgMi41MSkgcm90YXRlKDEzNSlcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj48c3RvcCBvZmZzZXQ9XCIwXCIgc3RvcC1jb2xvcj1cIiNjNWRhM2RcIi8+PHN0b3Agb2Zmc2V0PVwiMVwiIHN0b3AtY29sb3I9XCIjZjNlOTE2XCIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPVwiZ3JhZF83N1wiIHgxPVwiNC43XCIgeTE9XCIxNy40OVwiIHgyPVwiMTAuNDhcIiB5Mj1cIjExLjcxXCIgZ3JhZGllbnRUcmFuc2Zvcm09XCJ0cmFuc2xhdGUoMjMuMjQgMTkuNjUpIHJvdGF0ZSgxMzUpXCIgZ3JhZGllbnRVbml0cz1cInVzZXJTcGFjZU9uVXNlXCI+PHN0b3Agb2Zmc2V0PVwiMFwiIHN0b3AtY29sb3I9XCIjOTU5NWMzXCIvPjxzdG9wIG9mZnNldD1cIjFcIiBzdG9wLWNvbG9yPVwiI2NjOGRiYVwiLz48L2xpbmVhckdyYWRpZW50PjxsaW5lYXJHcmFkaWVudCBpZD1cImdyYWRfNzVcIiB4MT1cIjQuNjlcIiB5MT1cIjQuNjRcIiB4Mj1cIjEwLjQ3XCIgeTI9XCIxMC40MlwiIGdyYWRpZW50VHJhbnNmb3JtPVwidHJhbnNsYXRlKDcuNTQgLTMuMTUpIHJvdGF0ZSg0NSlcIiBncmFkaWVudFVuaXRzPVwidXNlclNwYWNlT25Vc2VcIj48c3RvcCBvZmZzZXQ9XCIwXCIgc3RvcC1jb2xvcj1cIiNmODY4NjdcIi8+PHN0b3Agb2Zmc2V0PVwiMVwiIHN0b3AtY29sb3I9XCIjZjg5ZDM0XCIvPjwvbGluZWFyR3JhZGllbnQ+PGxpbmVhckdyYWRpZW50IGlkPVwiZ3JhZF84MVwiIHgxPVwiMTEuNzdcIiB5MT1cIjExLjc4XCIgeDI9XCIxNy41NVwiIHkyPVwiMTcuNTZcIiBncmFkaWVudFRyYW5zZm9ybT1cInRyYW5zbGF0ZSgxNC42MyAtNi4wNSkgcm90YXRlKDQ1KVwiIGdyYWRpZW50VW5pdHM9XCJ1c2VyU3BhY2VPblVzZVwiPjxzdG9wIG9mZnNldD1cIjBcIiBzdG9wLWNvbG9yPVwiIzVlYzBlOFwiLz48c3RvcCBvZmZzZXQ9XCIxXCIgc3RvcC1jb2xvcj1cIiM2YWMwN2ZcIi8+PC9saW5lYXJHcmFkaWVudD48L2RlZnM+PHRpdGxlPmljb25zX2Zvcl9zdmc8L3RpdGxlPjxnIGNsYXNzPVwiY2xzLTFcIj48ZyBpZD1cItCh0LvQvtC5XzFcIiBkYXRhLW5hbWU9XCLQodC70L7QuSAxXCI+PHJlY3QgY2xhc3M9XCJjbHMtMlwiIHg9XCIwLjA5XCIgeT1cIjAuMDFcIiB3aWR0aD1cIjIyXCIgaGVpZ2h0PVwiMjJcIiByeD1cIjRcIiByeT1cIjRcIi8+PHJlY3QgY2xhc3M9XCJjbHMtM1wiIHg9XCIwLjU3XCIgeT1cIjAuNDlcIiB3aWR0aD1cIjIxLjA0XCIgaGVpZ2h0PVwiMjEuMDRcIiByeD1cIjMuNlwiIHJ5PVwiMy42XCIvPjxyZWN0IGNsYXNzPVwiY2xzLTRcIiB4PVwiOC4zM1wiIHk9XCIxLjI2XCIgd2lkdGg9XCI1LjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIyLjVcIiByeT1cIjIuNVwiLz48cmVjdCBjbGFzcz1cImNscy01XCIgeD1cIjguMzNcIiB5PVwiMTEuNzZcIiB3aWR0aD1cIjUuNVwiIGhlaWdodD1cIjlcIiByeD1cIjIuNVwiIHJ5PVwiMi41XCIvPjxyZWN0IGNsYXNzPVwiY2xzLTZcIiB4PVwiMy4yMVwiIHk9XCI2LjU1XCIgd2lkdGg9XCI1LjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIyLjVcIiByeT1cIjIuNVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSgtNS4wOSAxNykgcm90YXRlKC05MClcIi8+PHJlY3QgY2xhc3M9XCJjbHMtN1wiIHg9XCIxMy40OFwiIHk9XCI2LjU1XCIgd2lkdGg9XCI1LjVcIiBoZWlnaHQ9XCI5XCIgcng9XCIyLjVcIiByeT1cIjIuNVwiIHRyYW5zZm9ybT1cInRyYW5zbGF0ZSg1LjE4IDI3LjI4KSByb3RhdGUoLTkwKVwiLz48cmVjdCBjbGFzcz1cImNscy04XCIgeD1cIjExLjg3XCIgeT1cIjMuMDNcIiB3aWR0aD1cIjUuNVwiIGhlaWdodD1cIjlcIiByeD1cIjIuNVwiIHJ5PVwiMi41XCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDE5LjY0IDIzLjE5KSByb3RhdGUoLTEzNSlcIi8+PHJlY3QgY2xhc3M9XCJjbHMtOVwiIHg9XCI0LjhcIiB5PVwiMTAuMTRcIiB3aWR0aD1cIjUuNVwiIGhlaWdodD1cIjlcIiByeD1cIjIuNVwiIHJ5PVwiMi41XCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKDIuNTQgMzAuMzMpIHJvdGF0ZSgtMTM1KVwiLz48cmVjdCBjbGFzcz1cImNscy0xMFwiIHg9XCI0LjgzXCIgeT1cIjMuMDNcIiB3aWR0aD1cIjUuNVwiIGhlaWdodD1cIjlcIiByeD1cIjIuNVwiIHJ5PVwiMi41XCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC0zLjEgNy41Nikgcm90YXRlKC00NSlcIi8+PHJlY3QgY2xhc3M9XCJjbHMtMTFcIiB4PVwiMTEuODdcIiB5PVwiMTAuMTRcIiB3aWR0aD1cIjUuNVwiIGhlaWdodD1cIjlcIiByeD1cIjIuNVwiIHJ5PVwiMi41XCIgdHJhbnNmb3JtPVwidHJhbnNsYXRlKC02LjA3IDE0LjYzKSByb3RhdGUoLTQ1KVwiLz48L2c+PC9nPjwvc3ZnPicpO1xuICB9XG5cbiAgJi5pY29uLXRleHQtdmFsaWduLXRvcCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1tYXNrKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cmVjdCBjbGFzcz1cImNscy0xXCIgeD1cIjJcIiB5PVwiMlwiIHdpZHRoPVwiMTlcIiBoZWlnaHQ9XCIxXCIvPjxyZWN0IGNsYXNzPVwiY2xzLTFcIiB4PVwiMlwiIHk9XCI0XCIgd2lkdGg9XCIxOVwiIGhlaWdodD1cIjFcIi8+PHBvbHlnb24gY2xhc3M9XCJjbHMtMVwiIHBvaW50cz1cIjEyIDE4IDExIDE4IDExIDcuODMgOC42NSA5LjggOCA4Ljk0IDExLjUgNiAxNSA5IDE0LjM1IDkuOCAxMiA3LjgzIDEyIDE4XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGV4dC12YWxpZ24tbWlkZGxlIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLW1hc2soJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxyZWN0IGNsYXNzPVwiY2xzLTFcIiB4PVwiMlwiIHk9XCIxMFwiIHdpZHRoPVwiMTlcIiBoZWlnaHQ9XCIxXCIvPjxyZWN0IGNsYXNzPVwiY2xzLTFcIiB4PVwiMlwiIHk9XCIxMlwiIHdpZHRoPVwiMTlcIiBoZWlnaHQ9XCIxXCIvPjxwb2x5Z29uIGNsYXNzPVwiY2xzLTFcIiBwb2ludHM9XCIxMSAyIDEyIDIgMTIgNy4xNyAxNC4zNSA1LjIgMTUgNi4wNiAxMS41IDkgOCA2IDguNjUgNS4yIDExIDcuMTcgMTEgMlwiLz48cG9seWdvbiBjbGFzcz1cImNscy0xXCIgcG9pbnRzPVwiMTIgMjEgMTEgMjEgMTEgMTUuODMgOC42NSAxNy44IDggMTYuOTQgMTEuNSAxNCAxNSAxNyAxNC4zNSAxNy44IDEyIDE1LjgzIDEyIDIxXCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGV4dC12YWxpZ24tYm90dG9tIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLW1hc2soJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxyZWN0IGNsYXNzPVwiY2xzLTFcIiB4PVwiMlwiIHk9XCIxOFwiIHdpZHRoPVwiMTlcIiBoZWlnaHQ9XCIxXCIvPjxyZWN0IGNsYXNzPVwiY2xzLTFcIiB4PVwiMlwiIHk9XCIyMFwiIHdpZHRoPVwiMTlcIiBoZWlnaHQ9XCIxXCIvPjxwb2x5Z29uIGNsYXNzPVwiY2xzLTFcIiBwb2ludHM9XCIxMSA0IDEyIDQgMTIgMTUuMTcgMTQuMzUgMTMuMiAxNSAxNC4wNiAxMS41IDE3IDggMTQgOC42NSAxMy4yIDExIDE1LjE3IDExIDRcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG5cbiAgLy8gUHJlc2V0cyBvZiB0YWJsZSBib3JkZXJzXG5cbiAgJi5pY29uLXRhYmxlLWJvcmRlcnMtYWxsIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDI4IDI4XCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBkPVwiTTI2LjksMEgwVjI3SDI3VjBIMjYuOVpNMTMsMjZIMVYxNEgxM1YyNlptMC0xM0gxVjFIMTNWMTNaTTI2LDI2SDE0VjE0SDI2VjI2Wm0wLTEzSDE0VjFIMjZWMTNaXCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGFibGUtYm9yZGVycy1ub25lIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDI4IDI4XCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBvcGFjaXR5PVwiMC4zXCIgZD1cIk0yNi45LDBIMFYyN0gyN1YwSDI2LjlaTTEzLDI2SDFWMTRIMTNWMjZabTAtMTNIMVYxSDEzVjEzWk0yNiwyNkgxNFYxNEgyNlYyNlptMC0xM0gxNFYxSDI2VjEzWlwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLWJvcmRlcnMtaW5uZXIge1xuICAgIHdpZHRoOiAyOHB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHZpZXdCb3g9XCIwIDAgMjggMjhcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwb2x5Z29uIHBvaW50cz1cIjI2IDEzIDE0IDEzIDE0IDEgMTMgMSAxMyAxMyAxIDEzIDEgMTQgMTMgMTQgMTMgMjYgMTQgMjYgMTQgMTQgMjYgMTQgMjYgMTNcIi8+PHBhdGggb3BhY2l0eT1cIjAuM1wiIGQ9XCJNMjcsMEgwVjI3SDI3VjBaTTEsMjZWMUgyNlYyNkgxWlwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLWJvcmRlcnMtb3V0ZXIge1xuICAgIHdpZHRoOiAyOHB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHZpZXdCb3g9XCIwIDAgMjggMjhcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMjcsMEgwVjI3SDI3VjBaTTEsMjZWMUgyNlYyNkgxWlwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLWJvcmRlcnMtbGVmdCB7XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyOCAyOFwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggb3BhY2l0eT1cIjAuM1wiIGQ9XCJNMjcsMEgwVjI3SDI3VjBaTTEsMjZWMUgyNlYyNkgxWlwiLz48cmVjdCB3aWR0aD1cIjFcIiBoZWlnaHQ9XCIyN1wiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLWJvcmRlcnMtY2VudGVyIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDI4IDI4XCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBvcGFjaXR5PVwiMC4zXCIgZD1cIk0yNywwSDBWMjdIMjdWMFpNMSwyNlYxSDI2VjI2SDFaXCIvPjxyZWN0IHg9XCIxM1wiIHdpZHRoPVwiMVwiIGhlaWdodD1cIjI3XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGFibGUtYm9yZGVycy1yaWdodCB7XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyOCAyOFwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggb3BhY2l0eT1cIjAuM1wiIGQ9XCJNMjcsMEgwVjI3SDI3VjBaTTEsMjZWMUgyNlYyNkgxWlwiLz48cmVjdCB4PVwiMjZcIiB3aWR0aD1cIjFcIiBoZWlnaHQ9XCIyN1wiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLXRhYmxlLWJvcmRlcnMtdG9wIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDI4IDI4XCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBvcGFjaXR5PVwiMC4zXCIgZD1cIk0yNywwSDBWMjdIMjdWMFpNMSwyNlYxSDI2VjI2SDFaXCIvPjxyZWN0IHdpZHRoPVwiMjdcIiBoZWlnaHQ9XCIxXCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tdGFibGUtYm9yZGVycy1taWRkbGUge1xuICAgIHdpZHRoOiAyOHB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHZpZXdCb3g9XCIwIDAgMjggMjhcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxwYXRoIG9wYWNpdHk9XCIwLjNcIiBkPVwiTTI3LDBIMFYyN0gyN1YwWk0xLDI2VjFIMjZWMjZIMVpcIi8+PHJlY3QgeT1cIjEzXCIgd2lkdGg9XCIyN1wiIGhlaWdodD1cIjFcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi10YWJsZS1ib3JkZXJzLWJvdHRvbSB7XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyOCAyOFwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggb3BhY2l0eT1cIjAuM1wiIGQ9XCJNMjcsMEgwVjI3SDI3VjBaTTEsMjZWMUgyNlYyNkgxWlwiLz48cmVjdCB5PVwiMjZcIiB3aWR0aD1cIjI3XCIgaGVpZ2h0PVwiMVwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cblxuICAvLyBSZW9yZGVyXG5cbiAgJi5pY29uLW1vdmUtYmFja3dhcmQge1xuICAgIHdpZHRoOiAyOHB4O1xuICAgIGhlaWdodDogMjhweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHZpZXdCb3g9XCIwIDAgMjggMjhcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxyZWN0IG9wYWNpdHk9XCIwLjNcIiB4PVwiMVwiIHk9XCIxXCIgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE3XCIvPjxwYXRoIGQ9XCJNMTAsMTBWMjdIMjdWMTBIMTBaTTI2LDI2SDExVjExSDI2VjI2WlwiLz48L2c+PC9zdmc+Jyk7XG4gIH1cbiAgJi5pY29uLW1vdmUtZm9yd2FyZCB7XG4gICAgd2lkdGg6IDI4cHg7XG4gICAgaGVpZ2h0OiAyOHB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmlld0JveD1cIjAgMCAyOCAyOFwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggb3BhY2l0eT1cIjAuM1wiIGQ9XCJNMTAsMTBWMjdIMjdWMTBIMTBaTTI2LDI2SDExVjExSDI2VjI2WlwiLz48cmVjdCB4PVwiMVwiIHk9XCIxXCIgd2lkdGg9XCIxN1wiIGhlaWdodD1cIjE3XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tbW92ZS1iYWNrZ3JvdW5kIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDI4IDI4XCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cmVjdCBvcGFjaXR5PVwiMC4zXCIgeD1cIjhcIiB5PVwiOFwiIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiLz48cGF0aCBkPVwiTTEsMVYxM0gxM1YxSDFaTTEyLDEySDJWMkgxMlYxMlpcIi8+PHBhdGggZD1cIk0xNSwxNVYyN0gyN1YxNUgxNVpNMjYsMjZIMTZWMTZIMjZWMjZaXCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxuICAmLmljb24tbW92ZS1mb3JlZ3JvdW5kIHtcbiAgICB3aWR0aDogMjhweDtcbiAgICBoZWlnaHQ6IDI4cHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2aWV3Qm94PVwiMCAwIDI4IDI4XCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBvcGFjaXR5PVwiMC4zXCIgZD1cIk0xLDFWMTNIMTNWMUgxWk0xMiwxMkgyVjJIMTJWMTJaXCIvPjxwYXRoIG9wYWNpdHk9XCIwLjNcIiBkPVwiTTE1LDE1VjI3SDI3VjE1SDE1Wk0yNiwyNkgxNlYxNkgyNlYyNlpcIi8+PHJlY3QgeD1cIjhcIiB5PVwiOFwiIHdpZHRoPVwiMTNcIiBoZWlnaHQ9XCIxM1wiLz48L2c+PC9zdmc+Jyk7XG4gIH1cblxuICAmLmljb24tYWxpZ24tbGVmdCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgc3R5bGU9XCJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDIyIDIyO1wiIHhtbDpzcGFjZT1cInByZXNlcnZlXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48c3R5bGUgdHlwZT1cInRleHQvY3NzXCI+LnN0MHtmaWxsLXJ1bGU6ZXZlbm9kZDtjbGlwLXJ1bGU6ZXZlbm9kZDt9PC9zdHlsZT48Zz48ZyBpZD1cIlhNTElEXzM1X1wiPjxwYXRoIGlkPVwiWE1MSURfMzZfXCIgY2xhc3M9XCJzdDBcIiBkPVwiTTEsMjFoMVYxSDFWMjF6IE00LDEzdjRoMTZ2LTRINHogTTEyLDVINHY0aDhWNXpcIi8+PC9nPjwvZz48L3N2Zz4nKTtcbiAgfVxuXG4gICYuaWNvbi1hbGlnbi1jZW50ZXIge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIHN0eWxlPVwiZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMiAyMjtcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPi5zdDB7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7fTwvc3R5bGU+PGcgaWQ9XCJYTUxJRF81X1wiPjxnIGlkPVwiWE1MSURfMjRfXCI+PHBvbHlnb24gaWQ9XCJYTUxJRF8yNV9cIiBjbGFzcz1cInN0MFwiIHBvaW50cz1cIjE5LDEzIDExLDEzIDExLDkgMTUsOSAxNSw1IDExLDUgMTEsMSAxMCwxIDEwLDUgNiw1IDYsOSAxMCw5IDEwLDEzIDIsMTMgMiwxNyAxMCwxNyAxMCwyMSAxMSwyMSAxMSwxNyAxOSwxNyBcdFx0XCIvPjwvZz48L2c+PC9zdmc+Jyk7XG4gIH1cblxuICAmLmljb24tYWxpZ24tcmlnaHQge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIHN0eWxlPVwiZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMiAyMjtcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PHN0eWxlIHR5cGU9XCJ0ZXh0L2Nzc1wiPi5zdDB7ZmlsbC1ydWxlOmV2ZW5vZGQ7Y2xpcC1ydWxlOmV2ZW5vZGQ7fTwvc3R5bGU+PGcgaWQ9XCJYTUxJRF81X1wiPjxnIGlkPVwiWE1MSURfNDJfXCI+PHBhdGggaWQ9XCJYTUxJRF80NF9cIiBjbGFzcz1cInN0MFwiIGQ9XCJNMjAsMXYyMGgxVjFIMjB6IE0yLDE3aDE2di00SDJWMTd6IE0xMCw5aDhWNWgtOFY5elwiLz48L2c+PC9nPjwvc3ZnPicpO1xuICB9XG5cbiAgJi5pY29uLWFsaWduLXRvcCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgc3R5bGU9XCJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDIyIDIyO1wiIHhtbDpzcGFjZT1cInByZXNlcnZlXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48ZyBpZD1cIlhNTElEXzM1X1wiPjxwYXRoIGlkPVwiWE1MSURfMzZfXCIgZD1cIk0xLDF2MWgyMFYxSDF6IE05LDRINXYxNmg0VjR6IE0xNywxMlY0aC00djhIMTd6XCIvPjwvZz48L2c+PC9zdmc+Jyk7XG4gIH1cblxuICAmLmljb24tYWxpZ24tbWlkZGxlIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBzdHlsZT1cImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjIgMjI7XCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxzdHlsZSB0eXBlPVwidGV4dC9jc3NcIj4uc3Qwe2ZpbGwtcnVsZTpldmVub2RkO2NsaXAtcnVsZTpldmVub2RkO308L3N0eWxlPjxnIGlkPVwiWE1MSURfNV9cIj48ZyBpZD1cIlhNTElEXzI0X1wiPjxwb2x5Z29uIGlkPVwiWE1MSURfMjVfXCIgY2xhc3M9XCJzdDBcIiBwb2ludHM9XCIxMywyIDEzLDEwIDksMTAgOSw2IDUsNiA1LDEwIDEsMTAgMSwxMSA1LDExIDUsMTUgOSwxNSA5LDExIDEzLDExIDEzLDE5IDE3LDE5IDE3LDExIDIxLDExIDIxLDEwIDE3LDEwIDE3LDIgXHRcdFwiLz48L2c+PC9nPjwvc3ZnPicpO1xuICB9XG5cbiAgJi5pY29uLWFsaWduLWJvdHRvbSB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgc3R5bGU9XCJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDIyIDIyO1wiIHhtbDpzcGFjZT1cInByZXNlcnZlXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48ZyBpZD1cIlhNTElEXzM1X1wiPjxwYXRoIGlkPVwiWE1MSURfMzZfXCIgZD1cIk0yMSwyMHYtMUgxdjFIMjF6IE05LDFINXYxNmg0VjF6IE0xMyw5djhoNFY5SDEzelwiLz48L2c+PC9nPjwvc3ZnPicpO1xuICB9XG5cbiAgJi5pY29uLWFsaWduLWhvcml6b250YWwge1xuICAgIHdpZHRoOiAyMnB4O1xuICAgIGhlaWdodDogMjJweDtcbiAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIHN0eWxlPVwiZW5hYmxlLWJhY2tncm91bmQ6bmV3IDAgMCAyMiAyMjtcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PGcgaWQ9XCJYTUxJRF8zNV9cIj48cGF0aCBpZD1cIlhNTElEXzM2X1wiIGQ9XCJNMSwxdjFoMjBWMUgxeiBNMC45OTk5OTksMTkuMDAwMDA3NlYyMGgyMHYtMC45OTk5OTI0SDAuOTk5OTk5eiBNOS4wMDAwMDEsMi45OTk5OTk1aC00djE1aDRWMi45OTk5OTk1eiBNMTcsMTMuOTk5OTk5VjYuOTk5OTk4NmgtMy45OTk5OTl2Ny4wMDAwMDA1SDE3elwiLz48L2c+PC9nPjwvc3ZnPicpO1xuICB9XG5cbiAgJi5pY29uLWFsaWduLXZlcnRpY2FsIHtcbiAgICB3aWR0aDogMjJweDtcbiAgICBoZWlnaHQ6IDIycHg7XG4gICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBzdHlsZT1cImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMjIgMjI7XCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIiBmaWxsPVwiQHt0aGVtZUNvbG9yfVwiPjxnPjxnIGlkPVwiWE1MSURfMzVfXCI+PHBhdGggaWQ9XCJYTUxJRF8zNl9cIiBkPVwiTTAuOTk5OTk5OCwyMWgxdi0yMGgtMVYyMXogTTE5LjAwMDAwNzYsMjFIMjB2LTIwaC0wLjk5OTk5MjRWMjF6IE0yLjk5OTk5OTUsMTIuOTk5OTk5djMuOTk5OTk5aDE1IHYtMy45OTk5OTlIMi45OTk5OTk1eiBNMTMuOTk5OTk5LDQuOTk5OTk5SDYuOTk5OTk4NnY0aDcuMDAwMDAwNVY0Ljk5OTk5OXpcIi8+PC9nPjwvZz48L3N2Zz4nKTtcbiAgfVxuXG4gIC8vIEZvcm1hdHNcblxuICAmLmljb24tZm9ybWF0LXBkZiB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgc3R5bGU9XCJlbmFibGUtYmFja2dyb3VuZDpuZXcgMCAwIDIyIDIyO1wiIHhtbDpzcGFjZT1cInByZXNlcnZlXCIgZmlsbD1cIkB7dGhlbWVDb2xvcn1cIj48Zz48cGF0aCBpZD1cIlhNTElEXzJfXCIgZD1cIk0yLDIxaDE4VjRsLTMuOTc5MTY2LTRMMiwwVjIxeiBNMTksOHYxMkgzVjFoMTJsNCw0Vjh6XCIvPjwvZz48Zz48cGF0aCBkPVwiTTkuOTk5NjMyOCw3LjI5OTQxMjNMOS45OTk2MzI4LDcuMjk5NDEyM0MxMC4wOTg4MjQ1LDcuMjk5NDEyMywxMC4wOTg4MjQ1LDcuMjk5NDEyMyw5Ljk5OTYzMjgsNy4yOTk0MTIzXHRjMC4wOTkxOTE3LTAuNDAwNDQwNywwLjIwMDIyMDEtMC42MDA2NjE4LDAuMjAwMjIwMS0wLjkwMDA3MzVWNi4xOTkxMTgxYzAuMDk5MTkxNy0wLjQ5OTYzMjQsMC4wOTkxOTE3LTAuOTAwMDczNSwwLTAuOTk5MjY1MiBjMCwwLDAsMCwwLTAuMDk5MTkxN2wtMC4wOTkxOTE3LTAuMDk5MTkxN2wwLDBsMCwwYzAsMCwwLDAuMDk5MTkxNy0wLjA5OTE5MTcsMC4wOTkxOTE3IEM5Ljc5OTQxMTgsNS42OTk0ODU4LDkuNzk5NDExOCw2LjM5OTMzODcsOS45OTk2MzI4LDcuMjk5NDEyM0w5Ljk5OTYzMjgsNy4yOTk0MTIzeiBNNywxNC4yMDA1ODczXHRjLTAuMjAwMjIwMSwwLjA5OTE5MjYtMC40MDA0NDA3LDAuMjAwMjIxMS0wLjQ5OTYzMjgsMC4yOTk0MTE4Yy0wLjY5OTg1MjksMC42MDA2NjEzLTEuMTk5NDg1OCwxLjMwMDUxNDItMS4zMDA1MTQyLDEuNTk5OTI2OWwwLDAgbDAsMGwwLDBDNS43OTg2Nzc0LDE2LjAwMDczNDMsNi4zOTkzMzg3LDE1LjQwMDA3NCw3LDE0LjIwMDU4NzNDNy4wOTkxOTE3LDE0LjIwMDU4NzMsNy4wOTkxOTE3LDE0LjIwMDU4NzMsNywxNC4yMDA1ODczIEM3LjA5OTE5MTcsMTQuMjAwNTg3Myw3LDE0LjIwMDU4NzMsNywxNC4yMDA1ODczeiBNMTYuMTk5MTE5NiwxMi42OTk4NTM5XHRjLTAuMDk5MTkzNi0wLjA5OTE5MjYtMC40OTk2MzM4LTAuNDAwNDQxMi0xLjg5OTMzOTctMC40MDA0NDEyYy0wLjA5OTE5MjYsMC0wLjA5OTE5MjYsMC0wLjIwMDIyMTEsMGwwLDBjMCwwLDAsMCwwLDAuMDk5MTkyNiBjMC42OTk4NTI5LDAuMjk5NDExOCwxLjM5OTcwNTksMC40OTk2MzI4LDEuODk5MzM4NywwLjQ5OTYzMjhjMC4wOTkxOTE3LDAsMC4wOTkxOTE3LDAsMC4yMDAyMjIsMGwwLDBoMC4wOTkxOTE3IGMwLDAsMCwwLDAtMC4wOTkxOTI2bDAsMEMxNi4zMDAxNDgsMTIuNzk5MDQ0NiwxNi4xOTkxMTk2LDEyLjc5OTA0NDYsMTYuMTk5MTE5NiwxMi42OTk4NTM5eiBNMTYuNTk5NTU5OCwxMy40OTg4OTg1IGMtMC4yMDAyMjIsMC4wOTkxOTE3LTAuNDk5NjMzOCwwLjIwMDIyMTEtMC45MDAwNzQsMC4yMDAyMjExYy0wLjgwMDg4MTQsMC0yLjAwMDM2ODEtMC4yMDAyMjExLTIuOTk5NjMxOS0wLjY5OTg1MjkgYy0xLjcwMDk1NTQsMC4yMDAyMjExLTIuOTk5NjMyOCwwLjQwMDQ0MDItNC4wMDA3MzUzLDAuODAwODgxNGMtMC4wOTkxOTE3LDAtMC4wOTkxOTE3LDAtMC4yMDAyMjAxLDAuMDk5MTkxNyBDNy4yOTk0MTIzLDE2LjAwMDczNDMsNi4yOTgzMDk4LDE3LDUuNDk5MjY1MiwxN2MtMC4yMDAyMjA2LDAtMC4yOTk0MTIzLDAtMC40MDA0NDEyLTAuMDk5MTkxN2wtMC40OTk2MzI0LTAuMjk5NDExOFYxNi41MDIyMDNcdEM0LjUsMTYuMzAxOTgyOSw0LjUsMTYuMjAyNzkxMiw0LjUsMTYuMDAyNTcxMWMwLjA5OTE5MTctMC40OTk2MzI4LDAuNjk5ODUyOS0xLjM5OTcwNjgsMS44OTkzMzg3LTIuMDk5NTU5OCBjMC4yMDAyMjAxLTAuMDk5MTkxNywwLjQ5OTYzMjgtMC4yOTk0MTE4LDAuOTAwMDczNS0wLjQ5OTYzMjhjMC4yOTk0MTE4LTAuNDk5NjMyOCwwLjYwMDY2MTMtMS4xMDAyOTQxLDAuOTk5MjY1Mi0xLjgwMDE0NjEgYzAuNDk5NjMyOC0wLjk5OTI2NTcsMC44MDA4ODE0LTIuMDAwMzY4MSwxLjEwMDI5MzItMi45MDA0NDEybDAsMEM4Ljk5ODUzMDQsNy41MDMzMDU0LDguNzk4MzA5Myw2LjgwMzQ1MjUsOS4xOTg3NTA1LDUuNDAxOTA5NEM5LjI5Nzk0MjIsNS4wMDE0Njg3LDkuNTk5MTkxNyw0LjYwMTAyOCw5Ljk5OTYzMjgsNC42MDEwMjhoMC4yMDAyMjAxYzAuMjAwMjIwMSwwLDAuNDAwNDQwMiwwLjA5OTE5MTcsMC42MDA2NjEzLDAuMjAwMjIwNiBjMC42OTk4NTI5LDAuNjk5ODUyOSwwLjQwMDQ0MTIsMi4yOTk3Nzk0LDAsMy42MDAyOTQxYzAsMC4wOTkxOTE3LDAsMC4wOTkxOTE3LDAsMC4wOTkxOTE3IGMwLjQwMDQ0MTIsMS4xMDAyOTMyLDAuOTk5MjY1NywyLjAwMDM2NzIsMS41OTk5MjYsMi42MDEwMjg0YzAuMjk5NDExOCwwLjIwMDIyMTEsMC40OTk2MzI4LDAuNDAwNDQwMiwwLjkwMDA3NCwwLjYwMDY2MTMgYzAuNDk5NjMyOCwwLDAuOTAwMDczMS0wLjA5OTE5MTcsMS4zMDA1MTQyLTAuMDk5MTkxN2MxLjE5OTQ4NDgsMCwyLjAwMDM2ODEsMC4yMDAyMjAxLDIuMjk5Nzc5OSwwLjY5OTg1Mlx0QzE3LDEyLjUwMzMwNTQsMTcsMTIuNzAzNTI1NSwxNywxMi45MDM3NDU3QzE2LjkwMDgwODMsMTIuOTk5MjY1NywxNi43OTk3Nzk5LDEzLjMwMDUxNDIsMTYuNTk5NTU5OCwxMy40OTg4OTg1eiBNMTAuMDk4ODI0NSw5LjU5OTE5MTdDOS44OTg2MDM0LDEwLjI5OTA0NDYsOS40OTgxNjIzLDExLjA5OTkyNiw5LjA5OTU1ODgsMTIgYy0wLjIwMDIyMDEsMC40MDA0NDAyLTAuNDAwNDQwMiwwLjY5OTg1Mi0wLjYwMDY2MTMsMS4xMDAyOTQxaDAuMDk5MTkxN2gwLjA5OTE5MTdsMCwwIGMxLjMwMDUxNDItMC40OTk2MzI4LDIuNS0wLjgwMDg4MTQsMy4zMDA4ODE0LTAuOTAwMDczMUMxMS43OTc5NDEyLDEyLjEwMTAyODQsMTEuNjk4NzUwNSwxMiwxMS41OTc3MjIxLDExLjkwMDgwODMgQzExLjA5OTkyNiwxMS4zMDAxNDcxLDEwLjQ5OTI2NTcsMTAuNDk5MjY1NywxMC4wOTg4MjQ1LDkuNTk5MTkxN3pcIi8+PC9nPjwvc3ZnPicpO1xuICB9XG4gICYuaWNvbi1mb3JtYXQtcHB0eCB7XG4gICAgd2lkdGg6IDIycHg7XG4gICAgaGVpZ2h0OiAyMnB4O1xuICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiLTIzOCAyNDAgMjIgMjJcIiBzdHlsZT1cImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAtMjM4IDI0MCAyMiAyMjtcIiB4bWw6c3BhY2U9XCJwcmVzZXJ2ZVwiIGZpbGw9XCJAe3RoZW1lQ29sb3J9XCI+PGc+PHBhdGggaWQ9XCJYTUxJRF8yX1wiIGQ9XCJNLTIzNiwyNjFoMTh2LTE3bC0zLjk3OTE3MTgtNEgtMjM2VjI2MXogTS0yMTksMjQ4djEyaC0xNnYtMTloMTJsNCw0VjI0OHpcIi8+PC9nPjxnPjxwYXRoIGQ9XCJNLTIyOC44MjI2OTI5LDI1MC44NjQ2ODUxYzAuMTM3MDg1LTAuMDYwNzkxLDAuMjM0MTkxOS0wLjIzMDIyNDYsMC4zMTMxMTA0LTAuMzY0NzQ2MVx0YzAuMDc5Mjg0Ny0wLjEzNTE5MjksMC4wODYxODE2LTAuMjkzNTE4MSwwLjA4NjE4MTYtMC40NzM5MzhjMC0wLjIyMjEwNjktMC4wNjEzNDAzLTAuNDE4NjQwMS0wLjE3MjM2MzMtMC41NjAxODA3XHRjLTAuMTEwMjkwNS0wLjE0MDUwMjktMC4yOTY4NzUtMC4yNjI4Nzg0LTAuNDYyODkwNi0wLjI5MzE1MTljLTAuMTIxMDkzOC0wLjAyMzMxNTQtMC4yMzk2ODUxLTAuMDAxMjgxNy0wLjQ1MzU1MjIsMC4wMDkwOTQyIGwtMC4zMTE1MjM0LDAuMDEwMzc2djEuNzkyNTQxNWgwLjQ1MjM5MjZDLTIyOC45ODE1MDYzLDI1MC45OTI3MzY4LTIyOC45NTg2MTgyLDI1MC45MjQ5ODc4LTIyOC44MjI2OTI5LDI1MC44NjQ2ODUxelwiLz48cGF0aCBkPVwiTS0yMzMsMjU2LjExNDEzNTdsNy4zMzMzMTMsMS4zNTUzNDY3VjI0NUwtMjMzLDI0Ni4zMjY4NDMzVjI1Ni4xMTQxMzU3eiBNLTIzMC44NjYwODg5LDI0OC4yODE4NjA0bDEuNDk2ODg3Mi0wLjA5Nzc3ODMgYzAuNjA3Nzg4MS0wLjAzOTczMzksMC45MDc1MzE3LTAuMDU1NzI1MSwxLjEwMTgwNjYtMC4wMDcxNDExYzAuMzAzMjIyNywwLjA3MzYwODQsMC42MzcyMDcsMC4yMzQ5ODU0LDAuODQ4MzI3NiwwLjUzODE0N1x0YzAuMjEzODY3MiwwLjMwNzA2NzksMC4zNTU1OTA4LDAuNzU5MjE2MywwLjM1NTU5MDgsMS4yNjIwODVjMCwwLjM4Nzg3ODQtMC4wNjIzMTY5LDAuNzEzMDczNy0wLjE4NjI3OTMsMC45NzQxMjExXHRjLTAuMTIzMDQ2OSwwLjI1OTA5NDItMC4yNzgwMTUxLDAuNDU5MTA2NC0wLjQ2NDA1MDMsMC42MDAxNTg3Yy0wLjE4Mzk2LDAuMTM5NDY1My0wLjM5OTEwODksMC4yNzAwMTk1LTAuNTU4Nzc2OSwwLjMyNzI3MDUgYy0wLjMxNDU3NTIsMC4wNzc0NTM2LTAuNTI4Njg2NSwwLjE3NDc0MzctMC45ODAyODU2LDAuMTUwODE3OWgtMC41NzA4NjE4djEuOTU2MjM3OGwtMS4wNDIzNTg0LTAuMTA4MTU0M1YyNDguMjgxODYwNHpcIi8+PHBhdGggZD1cIk0tMjIxLjcyNjY4NDYsMjQ3SC0yMjV2OWgzLjI3MzMxNTRDLTIyMS4zMjUzNDc5LDI1Ni0yMjEsMjU1LjY3NDY1MjEtMjIxLDI1NS4yNzMzMTU0di03LjU0NjYzMDlcdEMtMjIxLDI0Ny4zMjUzNDc5LTIyMS4zMjUzNDc5LDI0Ny0yMjEuNzI2Njg0NiwyNDd6XCIvPjwvZz48L3N2Zz4nKTtcbiAgfVxufVxuXG4vLyBPdmVyd3JpdGUgY29sb3IgZm9yIHRvb2xiYXJcbi5uYXZiYXIge1xuICBpLmljb24ge1xuICAgICYuaWNvbi11bmRvIHtcbiAgICAgIHdpZHRoOiAyMnB4O1xuICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHtuYXZCYXJJY29uQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0yMCwxN3YtMmMwLTEuNy0xLjMtMy0zLTNIMy43bDMuNCwzLjRsLTEuNCwxLjRsLTUuMi01LjJMMCwxMWwwLjUtMC42bDUuMi01LjJsMS40LDEuNEwzLjcsMTBIMTdjMi44LDAsNSwyLjIsNSw1djJIMjB6XCIvPjwvZz48L3N2Zz4nKTtcbiAgICB9XG4gICAgJi5pY29uLXJlZG8ge1xuICAgICAgd2lkdGg6IDIycHg7XG4gICAgICBoZWlnaHQ6IDIycHg7XG4gICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe25hdkJhckljb25Db2xvcn1cIj48Zz48cGF0aCBkPVwiTTAsMTd2LTJjMC0yLjgsMi4yLTUsNS01aDEzLjNsLTMuNC0zLjRsMS40LTEuNGw1LjIsNS4yTDIyLDExbC0wLjUsMC42bC01LjIsNS4ybC0xLjQtMS40bDMuNC0zLjRINWMtMS43LDAtMywxLjMtMywzdjJIMHpcIi8+PC9nPjwvc3ZnPicpO1xuICAgIH1cbiAgICAmLmljb24tc2VhcmNoIHtcbiAgICAgIHdpZHRoOiAyMnB4O1xuICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHtuYXZCYXJJY29uQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0xOS41LDE2LjhMMTYsMTMuM2MwLjctMS4xLDEuMS0yLjQsMS4xLTMuOEMxNyw1LjQsMTMuNiwyLDkuNSwyUzIsNS40LDIsOS41UzUuNCwxNyw5LjUsMTdjMS40LDAsMi43LTAuNCwzLjgtMS4xbDMuNSwzLjVjMC43LDAuNywxLjksMC43LDIuNiwwQzIwLjIsMTguNywyMC4yLDE3LjYsMTkuNSwxNi44eiBNOS41LDE1LjNjLTMuMiwwLTUuOC0yLjYtNS44LTUuOHMyLjYtNS44LDUuOC01LjhzNS44LDIuNiw1LjgsNS44UzEyLjcsMTUuMyw5LjUsMTUuM3pcIi8+PC9nPjwvc3ZnPicpO1xuICAgIH1cbiAgICAmLmljb24tYnVyZ2VyIHtcbiAgICAgIHdpZHRoOiAyMnB4O1xuICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCItOCAxIDIyIDIyXCIgZmlsbD1cIkB7bmF2QmFySWNvbkNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNLTYsNnYyaDE4VjZILTZ6IE0tNiwxM2gxOHYtMkgtNlYxM3ogTS02LDE4aDE4di0ySC02VjE4elwiLz48L2c+PC9zdmc+Jyk7XG4gICAgfVxuICAgICYuaWNvbi1wbHVzIHtcbiAgICAgIHdpZHRoOiAyMnB4O1xuICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHtuYXZCYXJJY29uQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0yMSwxMmgtOXY5aC0ydi05SDF2LTJoOVYxaDJ2OWg5VjEyelwiLz48L2c+PC9zdmc+Jyk7XG4gICAgfVxuICAgICYuaWNvbi1lZGl0IHtcbiAgICAgIHdpZHRoOiAyMnB4O1xuICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHtuYXZCYXJJY29uQ29sb3J9XCI+PGc+PHBhdGggZD1cIk0wLDIwaDIydjFIMFYyMHpcIi8+PHBvbHlnb24gcG9pbnRzPVwiMTcuMSwzLjEgMy41LDE2LjcgMywyMCA2LjMsMTkuNSAxOS45LDUuOSBcdFwiLz48cGF0aCBkPVwiTTIwLjUsNS4zTDIyLDMuOGMwLDAtMC4yLTEuMi0wLjktMS45QzIwLjQsMS4xLDE5LjIsMSwxOS4yLDFsLTEuNSwxLjVMMjAuNSw1LjN6XCIvPjwvZz48L3N2Zz4nKTtcbiAgICB9XG4gICAgJi5pY29uLXBsYXkge1xuICAgICAgd2lkdGg6IDIycHg7XG4gICAgICBoZWlnaHQ6IDIycHg7XG4gICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe25hdkJhckljb25Db2xvcn1cIj48Zz48cGF0aCBkPVwiTTQuMDQ2NDM2MywyLjk4ODQ1NTNjMC4wMDY1MjYsMC4wMDI5NiwwLjAxNDIzNDUsMC4wMDY4MzUsMC4wMjMxNDM4LDAuMDExOTAyMSBjMC41OTA4NjA0LDAuMzM1NzYzNywxMi43MTE4Mzk3LDcuMjkyNDQzMywxMy44OTc3NDg5LDguMDI2ODQwMmMtMC41ODMxNTg1LDAuMzQxNzc1OS0xMy4wMTM3NTg3LDcuNDg3OTI3NC0xMy45MzQ2NTksNy45ODI2NzI3IEw0LjA0NjQzNjMsMi45ODg0NTUzIE0zLjk4ODkzNTcsMkMzLjQ0Mjc3OTUsMi4wMDAwNTc3LDMuMDAwNTI1LDIuNDUzMzU3NSwzLjAwMDUyNSwzLjAxNTM0OFx0YzAsMC41NzM0ODcsMCwxNS4xNjMyOTU3LDAsMTUuOTk0NTIyMUMzLjAwMDUyNSwxOS42MjI5NjMsMy40Nzk2MTA0LDIwLDMuOTk0MDU4OCwyMCBjMC4xNzI5MzcyLDAsMC4zNDk5MTkxLTAuMDQyNjMxMSwwLjUxMzk3NjMtMC4xMzMyMjI2YzAuODkwNTYwMi0wLjQ5MTA0NSwxMy4xODgwODk0LTcuNTU4MzM3MiwxMy45NDA3Mzg3LTcuOTk5NDQ1OSBjMC42NzUxMjEzLTAuMzk1NTIwMiwwLjY4NjczMTMtMS4zMzc1MTIsMC0xLjczMjY2MDNDMTcuNDAzMTc1NCw5LjUzMzMyNzEsNS4xNTIzODUyLDIuNTAxODUyLDQuNTM5Mzk1MywyLjE1MzUxNjUgQzQuMzUyNjIwMSwyLjA0NzI3OTQsNC4xNjU0MDEsMS45OTk5ODEzLDMuOTg4OTM1NywyTDMuOTg4OTM1NywyelwiLz48L2c+PC9zdmc+Jyk7XG4gICAgfVxuICAgICYuaWNvbi1zZXR0aW5ncyB7XG4gICAgICB3aWR0aDogMjJweDtcbiAgICAgIGhlaWdodDogMjJweDtcbiAgICAgIC5lbmNvZGVkLXN2Zy1iYWNrZ3JvdW5kKCc8c3ZnIHZlcnNpb249XCIxLjFcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgeD1cIjBweFwiIHk9XCIwcHhcIiB2aWV3Qm94PVwiMCAwIDIyIDIyXCIgZmlsbD1cIkB7bmF2QmFySWNvbkNvbG9yfVwiPjxnPjxwYXRoIGQ9XCJNMTIuMSwySDkuOUM5LjYsMiw5LjQsMi4yLDkuMywyLjVMOC44LDQuOWMwLDAuMi0wLjIsMC4zLTAuMywwLjNzLTAuMSwwLTAuMi0wLjFMNi4yLDMuOEM2LjEsMy43LDYsMy43LDUuOCwzLjdjLTAuMSwwLTAuMywwLTAuNCwwLjFMMy44LDUuNGMtMC4xLDAuMi0wLjIsMC41LDAsMC44bDEuMywyLjFjMC4xLDAuMiwwLjEsMC40LTAuMiwwLjVMMi41LDkuM0MyLjIsOS40LDIsOS42LDIsOS45djIuMmMwLDAuMywwLjIsMC41LDAuNSwwLjZsMi40LDAuNWMwLjMsMC4xLDAuNCwwLjMsMC4yLDAuNWwtMS4zLDIuMWMtMC4yLDAuMi0wLjEsMC42LDAuMSwwLjhsMS42LDEuNmMwLjEsMC4xLDAuMywwLjIsMC40LDAuMnMwLjIsMCwwLjMtMC4xTDguMywxN2MwLjEtMC4xLDAuMS0wLjEsMC4yLTAuMXMwLjMsMC4xLDAuMywwLjNsMC41LDIuM0M5LjQsMTkuOCw5LjYsMjAsOS45LDIwaDIuMmMwLjMsMCwwLjUtMC4yLDAuNi0wLjVsMC41LTIuNGMwLTAuMiwwLjEtMC4zLDAuMy0wLjNjMC4xLDAsMC4xLDAsMC4yLDAuMWwyLjEsMS4zYzAuMSwwLjEsMC4yLDAuMSwwLjMsMC4xYzAuMiwwLDAuMy0wLjEsMC40LTAuMmwxLjYtMS42YzAuMi0wLjIsMC4yLTAuNSwwLjEtMC44bC0xLjMtMi4xYy0wLjItMC4yLTAuMS0wLjUsMC4yLTAuNWwyLjQtMC41YzAuMy0wLjEsMC41LTAuMywwLjUtMC42VjkuOGMwLTAuMy0wLjItMC41LTAuNS0wLjZsLTIuNC0wLjVjLTAuMy0wLjEtMC40LTAuMy0wLjItMC41bDEuMy0yLjFjMC4yLTAuMiwwLjEtMC42LTAuMS0wLjhsLTEuNi0xLjZjLTAuMS0wLjEtMC4zLTAuMi0wLjQtMC4ycy0wLjIsMC0wLjMsMC4xbC0yLjEsMS4zQzEzLjYsNSwxMy42LDUsMTMuNSw1cy0wLjMtMC4xLTAuMy0wLjNsLTAuNS0yLjJDMTIuNiwyLjIsMTIuNCwyLDEyLjEsMkwxMi4xLDJ6IE0xMSwxNC41Yy0xLjksMC0zLjUtMS42LTMuNS0zLjVTOS4xLDcuNSwxMSw3LjVzMy41LDEuNiwzLjUsMy41UzEyLjksMTQuNSwxMSwxNC41TDExLDE0LjV6XCIvPjwvZz48L3N2Zz4nKTtcbiAgICB9XG4gICAgJi5pY29uLXByZXYge1xuICAgICAgd2lkdGg6IDIwcHg7XG4gICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe25hdkJhckljb25Db2xvcn1cIj48Zz48cG9seWdvbiBwb2ludHM9XCI1LjEsMTAuOSAxMy45LDIgMTYsNC4xIDkuMiwxMS4xIDE2LDE3LjkgMTMuOSwyMCA1LjEsMTEuMiA1LDExLjEgXCIvPjwvZz48L3N2Zz4nKTtcbiAgICB9XG4gICAgJi5pY29uLW5leHQge1xuICAgICAgd2lkdGg6IDIwcHg7XG4gICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAuZW5jb2RlZC1zdmctYmFja2dyb3VuZCgnPHN2ZyB2ZXJzaW9uPVwiMS4xXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiIHg9XCIwcHhcIiB5PVwiMHB4XCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCJAe25hdkJhckljb25Db2xvcn1cIj48Zz48cG9seWdvbiBwb2ludHM9XCIxNi45LDEwLjkgOC4xLDIgNiw0LjEgMTIuOCwxMS4xIDYsMTcuOSA4LjEsMjAgMTYuOSwxMS4yIDE3LDExLjEgXCIvPjwvZz48L3N2Zz4nKTtcbiAgICB9XG4gICAgJi5pY29uLWV4cGFuZC1kb3duIHtcbiAgICAgIHdpZHRoOiAyMnB4O1xuICAgICAgaGVpZ2h0OiAyMnB4O1xuICAgICAgLmVuY29kZWQtc3ZnLWJhY2tncm91bmQoJzxzdmcgdmVyc2lvbj1cIjEuMVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB4PVwiMHB4XCIgeT1cIjBweFwiIHZpZXdCb3g9XCIwIDAgMjIgMjJcIiBmaWxsPVwiQHtuYXZCYXJJY29uQ29sb3J9XCI+PGc+PHBvbHlnb24gcG9pbnRzPVwiMTAuOSwxNi45IDIsOC4xIDQuMSw2IDExLjEsMTIuOCAxNy45LDYgMjAsOC4xIDExLjIsMTYuOSAxMS4xLDE3IFwiLz48L2c+PC9zdmc+Jyk7XG4gICAgfVxuICB9XG59IiwiLy8gRW5jb2RlZCBTVkcgQmFja2dyb3VuZFxuLmVuY29kZWQtc3ZnLW1hc2soQHN2Zykge1xuICBAdXJsOiBgZW5jb2RlVVJJQ29tcG9uZW50KEB7c3ZnfSlgO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiBAdGhlbWVDb2xvcjtcbiAgLXdlYmtpdC1tYXNrLWltYWdlOiB1cmwoXCJkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCxAe3VybH1cIik7XG59IiwiQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL19taXhpbnMubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL19jb2xvcnMtdmFycy5sZXNzJyk7XG5cbi8vIENvbG9yc1xuQHRoZW1lQ29sb3I6ICNERjY3Mzc7IC8vICgyMjMsMTAzLDU1KVxuQG5hdkJhckljb25Db2xvcjogI2ZmZjtcblxuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2ludHJvLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9ncmlkLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC92aWV3cy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvcGFnZXMubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL3Rvb2xiYXJzLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC90b29sYmFycy1wYWdlcy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvc2VhcmNoYmFyLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9tZXNzYWdlYmFyLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9pY29ucy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvYmFkZ2VzLmxlc3MnKTtcbi8vQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2NoaXBzLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9jb250ZW50LWJsb2NrLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9saXN0cy5sZXNzJyk7XG4vL0BpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9jb250YWN0cy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvZm9ybXMubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2Zsb2F0aW5nLWJ1dHRvbi5sZXNzJyk7XG4vL0BpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9hY2NvcmRpb24ubGVzcycpO1xuLy9AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvY2FyZHMubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL21vZGFscy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvcGFuZWxzLmxlc3MnKTtcbi8vQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2xhenktbG9hZC5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvdGFicy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvbWVzc2FnZXMubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL3N0YXR1c2Jhci5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvcHJlbG9hZGVyLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9wcm9ncmVzc2Jhci5sZXNzJyk7XG4vL0BpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9wdWxsLXRvLXJlZnJlc2gubGVzcycpO1xuLy9AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvaW5maW5pdGUtc2Nyb2xsLmxlc3MnKTtcbi8vQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2F1dG9jb21wbGV0ZS5sZXNzJyk7XG4vL0BpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9zd2lwZXIubGVzcycpO1xuLy9AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvcGhvdG8tYnJvd3Nlci5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvcGlja2VyLmxlc3MnKTtcbi8vQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2NhbGVuZGFyLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9ub3RpZmljYXRpb25zLmxlc3MnKTtcbi8vQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uLy4uL3ZlbmRvci9mcmFtZXdvcms3L3NyYy9sZXNzL21hdGVyaWFsL2xvZ2luLXNjcmVlbi5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vLi4vdmVuZG9yL2ZyYW1ld29yazcvc3JjL2xlc3MvbWF0ZXJpYWwvcmlwcGxlLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi8uLi92ZW5kb3IvZnJhbWV3b3JrNy9zcmMvbGVzcy9tYXRlcmlhbC9kaXNhYmxlZC5sZXNzJyk7XG5cblxuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvX21peGlucy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9tYXRlcmlhbC9fY29udGFpbmVyLmxlc3MnKTtcbkBpbXBvcnQgdXJsKCcuLi8uLi8uLi8uLi9jb21tb24vbW9iaWxlL3Jlc291cmNlcy9sZXNzL21hdGVyaWFsL19kYXRhdmlldy5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9tYXRlcmlhbC9fbGlzdHZpZXcubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvbWF0ZXJpYWwvX2J1dHRvbi5sZXNzJyk7XG5AaW1wb3J0IHVybCgnLi4vLi4vLi4vLi4vY29tbW9uL21vYmlsZS9yZXNvdXJjZXMvbGVzcy9tYXRlcmlhbC9fY29udGV4dG1lbnUubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvbWF0ZXJpYWwvX2NvbG9yLXBhbGV0dGUubGVzcycpO1xuQGltcG9ydCB1cmwoJy4uLy4uLy4uLy4uL2NvbW1vbi9tb2JpbGUvcmVzb3VyY2VzL2xlc3MvbWF0ZXJpYWwvX2Fib3V0Lmxlc3MnKTtcblxuQGltcG9ydCB1cmwoJ21hdGVyaWFsL19zZWFyY2gubGVzcycpO1xuQGltcG9ydCB1cmwoJ21hdGVyaWFsL19pY29ucy5sZXNzJyk7XG5cbi8vIFRvcCBvZmZzZXRcblxuI2VkaXRvcl9zZGsge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IDA7XG4gIHJpZ2h0OiAwO1xuICB0b3A6IEB0b29sYmFyU2l6ZTtcbiAgYm90dG9tOiAwO1xuICBoZWlnaHQ6IGF1dG87XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIC50cmFuc2l0aW9uKDMwMG1zKTtcbn1cblxuLy8gRGlzYWJsZSB0ZXh0IHNlbGVjdFxuKiB7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gIHVzZXItc2VsZWN0OiBub25lO1xufVxuXG5pbnB1dCwgdGV4dGFyZWEge1xuICAtd2Via2l0LXRvdWNoLWNhbGxvdXQ6ZGVmYXVsdDtcbiAgLXdlYmtpdC11c2VyLXNlbGVjdDp0ZXh0O1xuICB1c2VyLXNlbGVjdDp0ZXh0O1xufVxuXG4vLyBBZGQgQ29udGFpbmVyXG5cbiNhZGQtdGFibGUsXG4jYWRkLXNoYXBlIHtcbiAgLnBhZ2Uge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIH1cbn1cblxuLy8gVGFibGUgc3R5bGVzXG5cbi50YWJsZS1zdHlsZXMge1xuICAucm93IHtcbiAgICAmLCBsaSB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuICAgIH1cbiAgfVxuXG4gIGxpIHtcbiAgICBtYXJnaW46IDA7XG4gICAgcGFkZGluZzogMXB4O1xuXG4gICAgaW1nIHtcbiAgICAgIHdpZHRoOiA3MHB4O1xuICAgICAgaGVpZ2h0OiA1MHB4O1xuICAgIH1cbiAgfVxufVxuXG4vLyBTaGFwZXNcblxuLnNoYXBlcyB7XG4gIGxpIHtcbiAgICB3aWR0aDogNzBweDtcbiAgICBoZWlnaHQ6IDcwcHg7XG4gICAgbWFyZ2luOiAwIDFweDtcblxuICAgIC50aHVtYiB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IEB0aGVtZUNvbG9yO1xuICAgIH1cbiAgfVxufVxuXG4vLyBCdWxsZXRzIGFuZCBudW1iZXJzXG5cbi5idWxsZXRzLFxuLm51bWJlcnMge1xuICB1bCB7XG4gICAgbWFyZ2luLXRvcDogMTBweDtcbiAgfVxuXG4gIGxpIHtcbiAgICB3aWR0aDogNzBweDtcbiAgICBoZWlnaHQ6IDcwcHg7XG4gICAgbWFyZ2luLXJpZ2h0OiAxcHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2M0YzRjNDtcbiAgICBodG1sLnBpeGVsLXJhdGlvLTIgJiB7XG4gICAgICBib3JkZXI6IDAuNXB4IHNvbGlkICNjNGM0YzQ7XG4gICAgfVxuICAgIGh0bWwucGl4ZWwtcmF0aW8tMyAmIHtcbiAgICAgIGJvcmRlcjogMC4zM3B4IHNvbGlkICNjNGM0YzQ7XG4gICAgfVxuXG4gICAgJi5hY3RpdmUge1xuICAgICAgLy9cbiAgICB9XG5cbiAgICAudGh1bWIge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAd2hpdGU7XG4gICAgICBiYWNrZ3JvdW5kLXNpemU6IGNvdmVyO1xuXG4gICAgICBsYWJlbCB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiAzNCU7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIFNsaWRlIGxheW91dFxuXG4uc2xpZGUtbGF5b3V0IHtcbiAgLnJvdyB7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuICB9XG5cbiAgbGkge1xuICAgIG1hcmdpbjogMDtcbiAgICBwYWRkaW5nOiAxcHg7XG5cbiAgICBpbWcge1xuICAgICAgYm94LXNoYWRvdzogMCAwIDAgMXB4IHJnYmEoMCwwLDAsMC4xNSk7XG4gICAgfVxuICB9XG59XG5cbi8vIFNsaWRlIHRoZW1lXG5cbi5zbGlkZS10aGVtZSB7XG4gIC5yb3cge1xuICAgIG1hcmdpbi10b3A6IDE0cHg7XG4gICAgbWFyZ2luLWJvdHRvbTogMTJweDtcblxuICAgIGRpdiB7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBwYWRkaW5nOiAzcHg7XG4gICAgICBib3gtc2hhZG93OiAwIDAgMCAxcHggcmdiYSgwLDAsMCwwLjE1KTtcbiAgICAgIHdpZHRoOiA4NXB4O1xuICAgICAgaGVpZ2h0OiAzOHB4O1xuICAgIH1cbiAgfVxufVxuXG4vLyBDaGFydHNcblxuLmNoYXJ0LXR5cGVzIHtcbiAgbGkge1xuICAgIHdpZHRoOiA2MHB4O1xuICAgIGhlaWdodDogNjBweDtcbiAgICBtYXJnaW46IDZweDtcblxuICAgIC50aHVtYiB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgICB9XG4gIH1cbn0iXX0= */ \ No newline at end of file diff --git a/apps/presentationeditor/mobile/resources/less/ios/_icons.less b/apps/presentationeditor/mobile/resources/less/ios/_icons.less index 2fe1ae30e..c0379093b 100644 --- a/apps/presentationeditor/mobile/resources/less/ios/_icons.less +++ b/apps/presentationeditor/mobile/resources/less/ios/_icons.less @@ -363,4 +363,9 @@ i.icon { height: 22px; .encoded-svg-background(''); } + &.icon-format-odp { + width: 22px; + height: 22px; + .encoded-svg-background(''); + } } \ No newline at end of file diff --git a/apps/presentationeditor/mobile/resources/less/material/_icons.less b/apps/presentationeditor/mobile/resources/less/material/_icons.less index 890ab0ca9..ce6367503 100644 --- a/apps/presentationeditor/mobile/resources/less/material/_icons.less +++ b/apps/presentationeditor/mobile/resources/less/material/_icons.less @@ -333,6 +333,11 @@ i.icon { height: 22px; .encoded-svg-background(''); } + &.icon-format-odp { + width: 22px; + height: 22px; + .encoded-svg-background(''); + } } // Overwrite color for toolbar diff --git a/apps/presentationeditor/sdk_dev_scripts.js b/apps/presentationeditor/sdk_dev_scripts.js index 5805ba034..e1f833587 100644 --- a/apps/presentationeditor/sdk_dev_scripts.js +++ b/apps/presentationeditor/sdk_dev_scripts.js @@ -5,6 +5,7 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/downloaderfiles.js", "../../../../sdkjs/common/docscoapicommon.js", "../../../../sdkjs/common/docscoapi.js", + "../../../../sdkjs/common/spellcheckapi.js", "../../../../sdkjs/common/apiCommon.js", "../../../../sdkjs/common/SerializeCommonWordExcel.js", "../../../../sdkjs/common/editorscommon.js", @@ -37,6 +38,7 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/Drawings/Format/Format.js", "../../../../sdkjs/common/Drawings/Format/GraphicObjectBase.js", "../../../../sdkjs/common/Drawings/Format/Shape.js", + "../../../../sdkjs/common/Drawings/Format/CnxShape.js", "../../../../sdkjs/slide/Editor/Format/ShapePrototype.js", "../../../../sdkjs/common/Drawings/Format/Path.js", "../../../../sdkjs/common/Drawings/Format/Image.js", @@ -58,6 +60,7 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/Drawings/TrackObjects/ResizeTracks.js", "../../../../sdkjs/common/Drawings/TrackObjects/RotateTracks.js", "../../../../sdkjs/common/Drawings/TrackObjects/Spline.js", + "../../../../sdkjs/common/Drawings/TrackObjects/ConnectorTrack.js", "../../../../sdkjs/common/Drawings/DrawingObjectsHandlers.js", "../../../../sdkjs/common/Drawings/TextDrawer.js", "../../../../sdkjs/common/Drawings/Externals.js", @@ -77,6 +80,7 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/cell/model/CellInfo.js", "../../../../sdkjs/cell/view/DrawingObjectsController.js", "../../../../sdkjs/slide/Drawing/ThemeLoader.js", + "../../../../sdkjs/word/Editor/DocumentContentElementBase.js", "../../../../sdkjs/word/Editor/Serialize2.js", "../../../../sdkjs/word/Editor/Numbering.js", "../../../../sdkjs/word/Editor/NumberingChanges.js", @@ -96,6 +100,7 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/word/Editor/SectionsChanges.js", "../../../../sdkjs/word/Editor/Styles.js", "../../../../sdkjs/word/Editor/StylesChanges.js", + "../../../../sdkjs/word/Editor/RevisionsChange.js", "../../../../sdkjs/slide/Editor/Format/StylesPrototype.js", "../../../../sdkjs/word/Drawing/Graphics.js", "../../../../sdkjs/word/Drawing/ShapeDrawer.js", @@ -108,7 +113,10 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/slide/Editor/Format/SlideMaster.js", "../../../../sdkjs/slide/Editor/Format/Layout.js", "../../../../sdkjs/slide/Editor/Format/Comments.js", + "../../../../sdkjs/slide/Editor/Format/NotesMaster.js", + "../../../../sdkjs/slide/Editor/Format/Notes.js", "../../../../sdkjs/word/Editor/ParagraphContent.js", + "../../../../sdkjs/word/Editor/ParagraphContentBase.js", "../../../../sdkjs/word/Editor/Paragraph/ParaTextPr.js", "../../../../sdkjs/word/Editor/Paragraph/ParaTextPrChanges.js", "../../../../sdkjs/word/Editor/Paragraph/ParaDrawing.js", @@ -124,6 +132,10 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/word/Editor/LogicDocumentController.js", "../../../../sdkjs/word/Editor/DrawingsController.js", "../../../../sdkjs/word/Editor/HeaderFooterController.js", + "../../../../sdkjs/word/Editor/StructuredDocumentTags/BlockLevel.js", + "../../../../sdkjs/word/Editor/StructuredDocumentTags/InlineLevel.js", + "../../../../sdkjs/word/Editor/StructuredDocumentTags/SdtPr.js", + "../../../../sdkjs/word/Editor/StructuredDocumentTags/SdtPrChanges.js", "../../../../sdkjs/slide/apiCommon.js", "../../../../sdkjs/common/apiBase.js", "../../../../sdkjs/slide/api.js", diff --git a/apps/spreadsheeteditor/embed/index.html b/apps/spreadsheeteditor/embed/index.html index 0695c7f3d..f45c3ecef 100644 --- a/apps/spreadsheeteditor/embed/index.html +++ b/apps/spreadsheeteditor/embed/index.html @@ -322,9 +322,6 @@ - - - - - - - diff --git a/apps/spreadsheeteditor/embed/js/ApplicationController.js b/apps/spreadsheeteditor/embed/js/ApplicationController.js index 268488467..7f6873718 100644 --- a/apps/spreadsheeteditor/embed/js/ApplicationController.js +++ b/apps/spreadsheeteditor/embed/js/ApplicationController.js @@ -414,14 +414,14 @@ var ApplicationController = new(function(){ Common.Analytics.trackEvent('Internal Error', id.toString()); } - function onExternalError(error) { + function onExternalMessage(error) { if (error) { hidePreloader(); - $('#id-error-mask-title').text(error.title); + $('#id-error-mask-title').text('Error'); $('#id-error-mask-text').text(error.msg); $('#id-error-mask').css('display', 'block'); - Common.Analytics.trackEvent('External Error', error.title); + Common.Analytics.trackEvent('External Error'); } } @@ -519,7 +519,7 @@ var ApplicationController = new(function(){ // Initialize api gateway Common.Gateway.on('init', loadConfig); Common.Gateway.on('opendocument', loadDocument); - Common.Gateway.on('showerror', onExternalError); + Common.Gateway.on('showmessage', onExternalMessage); Common.Gateway.ready(); } diff --git a/apps/spreadsheeteditor/embed/js/ApplicationView.js b/apps/spreadsheeteditor/embed/js/ApplicationView.js index ededb84b7..52ffc9df1 100644 --- a/apps/spreadsheeteditor/embed/js/ApplicationView.js +++ b/apps/spreadsheeteditor/embed/js/ApplicationView.js @@ -42,10 +42,10 @@ var ApplicationView = new(function(){ $btnTools.addClass('dropdown-toggle').attr('data-toggle', 'dropdown').attr('aria-expanded', 'true'); $btnTools.parent().append( ''); } diff --git a/apps/spreadsheeteditor/main/app.js b/apps/spreadsheeteditor/main/app.js index db740f9e6..7ef127121 100644 --- a/apps/spreadsheeteditor/main/app.js +++ b/apps/spreadsheeteditor/main/app.js @@ -54,8 +54,6 @@ require.config({ jmousewheel : '../vendor/perfect-scrollbar/src/jquery.mousewheel', xregexp : '../vendor/xregexp/xregexp-all-min', sockjs : '../vendor/sockjs/sockjs.min', - jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', allfonts : '../../sdkjs/common/AllFonts', sdk : '../../sdkjs/cell/sdk-all-min', api : 'api/documents/api', @@ -108,9 +106,7 @@ require.config({ 'underscore', 'allfonts', 'xregexp', - 'sockjs', - 'jsziputils', - 'jsrsasign' + 'sockjs' ] }, gateway: { diff --git a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js index 9c6d8e649..50945b669 100644 --- a/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js +++ b/apps/spreadsheeteditor/main/app/controller/DocumentHolder.js @@ -141,51 +141,59 @@ define([ onCreateDelayedElements: function(view) { var me = this; - view.pmiCut.on('click', _.bind(me.onCopyPaste, me)); - view.pmiCopy.on('click', _.bind(me.onCopyPaste, me)); - view.pmiPaste.on('click', _.bind(me.onCopyPaste, me)); - view.pmiImgCut.on('click', _.bind(me.onCopyPaste, me)); - view.pmiImgCopy.on('click', _.bind(me.onCopyPaste, me)); - view.pmiImgPaste.on('click', _.bind(me.onCopyPaste, me)); - view.pmiTextCut.on('click', _.bind(me.onCopyPaste, me)); - view.pmiTextCopy.on('click', _.bind(me.onCopyPaste, me)); - view.pmiTextPaste.on('click', _.bind(me.onCopyPaste, me)); - view.pmiInsertEntire.on('click', _.bind(me.onInsertEntire, me)); - view.pmiDeleteEntire.on('click', _.bind(me.onDeleteEntire, me)); - view.pmiInsertCells.menu.on('item:click', _.bind(me.onInsertCells, me)); - view.pmiDeleteCells.menu.on('item:click', _.bind(me.onDeleteCells, me)); - view.pmiSparklines.menu.on('item:click', _.bind(me.onClear, me)); - view.pmiSortCells.menu.on('item:click', _.bind(me.onSortCells, me)); - view.pmiFilterCells.menu.on('item:click', _.bind(me.onFilterCells, me)); - view.pmiReapply.on('click', _.bind(me.onReapply, me)); - view.pmiClear.menu.on('item:click', _.bind(me.onClear, me)); - view.pmiSelectTable.menu.on('item:click', _.bind(me.onSelectTable, me)); - view.pmiInsertTable.menu.on('item:click', _.bind(me.onInsertTable, me)); - view.pmiDeleteTable.menu.on('item:click', _.bind(me.onDeleteTable, me)); - view.pmiInsFunction.on('click', _.bind(me.onInsFunction, me)); - view.menuAddHyperlink.on('click', _.bind(me.onInsHyperlink, me)); - view.menuEditHyperlink.on('click', _.bind(me.onInsHyperlink, me)); - view.menuRemoveHyperlink.on('click', _.bind(me.onDelHyperlink, me)); - view.pmiRowHeight.menu.on('item:click', _.bind(me.onSetSize, me)); - view.pmiColumnWidth.menu.on('item:click', _.bind(me.onSetSize, me)); - view.pmiEntireHide.on('click', _.bind(me.onEntireHide, me)); - view.pmiEntireShow.on('click', _.bind(me.onEntireShow, me)); - view.pmiFreezePanes.on('click', _.bind(me.onFreezePanes, me)); - view.pmiEntriesList.on('click', _.bind(me.onEntriesList, me)); - /** coauthoring begin **/ - view.pmiAddComment.on('click', _.bind(me.onAddComment, me)); - /** coauthoring end **/ - view.pmiAddNamedRange.on('click', _.bind(me.onAddNamedRange, me)); - view.imgMenu.on('item:click', _.bind(me.onImgMenu, me)); - view.menuParagraphVAlign.menu.on('item:click', _.bind(me.onParagraphVAlign, me)); - view.menuParagraphDirection.menu.on('item:click', _.bind(me.onParagraphDirection, me)); - view.menuAddHyperlinkShape.on('click', _.bind(me.onInsHyperlink, me)); - view.menuEditHyperlinkShape.on('click', _.bind(me.onInsHyperlink, me)); - view.menuRemoveHyperlinkShape.on('click', _.bind(me.onRemoveHyperlinkShape, me)); - view.pmiTextAdvanced.on('click', _.bind(me.onTextAdvanced, me)); - view.mnuShapeAdvanced.on('click', _.bind(me.onShapeAdvanced, me)); - view.mnuChartEdit.on('click', _.bind(me.onChartEdit, me)); - view.mnuImgAdvanced.on('click', _.bind(me.onImgAdvanced, me)); + if (me.permissions.isEdit) { + view.pmiCut.on('click', _.bind(me.onCopyPaste, me)); + view.pmiCopy.on('click', _.bind(me.onCopyPaste, me)); + view.pmiPaste.on('click', _.bind(me.onCopyPaste, me)); + view.pmiImgCut.on('click', _.bind(me.onCopyPaste, me)); + view.pmiImgCopy.on('click', _.bind(me.onCopyPaste, me)); + view.pmiImgPaste.on('click', _.bind(me.onCopyPaste, me)); + view.pmiTextCut.on('click', _.bind(me.onCopyPaste, me)); + view.pmiTextCopy.on('click', _.bind(me.onCopyPaste, me)); + view.pmiTextPaste.on('click', _.bind(me.onCopyPaste, me)); + view.pmiInsertEntire.on('click', _.bind(me.onInsertEntire, me)); + view.pmiDeleteEntire.on('click', _.bind(me.onDeleteEntire, me)); + view.pmiInsertCells.menu.on('item:click', _.bind(me.onInsertCells, me)); + view.pmiDeleteCells.menu.on('item:click', _.bind(me.onDeleteCells, me)); + view.pmiSparklines.menu.on('item:click', _.bind(me.onClear, me)); + view.pmiSortCells.menu.on('item:click', _.bind(me.onSortCells, me)); + view.pmiFilterCells.menu.on('item:click', _.bind(me.onFilterCells, me)); + view.pmiReapply.on('click', _.bind(me.onReapply, me)); + view.pmiClear.menu.on('item:click', _.bind(me.onClear, me)); + view.pmiSelectTable.menu.on('item:click', _.bind(me.onSelectTable, me)); + view.pmiInsertTable.menu.on('item:click', _.bind(me.onInsertTable, me)); + view.pmiDeleteTable.menu.on('item:click', _.bind(me.onDeleteTable, me)); + view.pmiInsFunction.on('click', _.bind(me.onInsFunction, me)); + view.menuAddHyperlink.on('click', _.bind(me.onInsHyperlink, me)); + view.menuEditHyperlink.on('click', _.bind(me.onInsHyperlink, me)); + view.menuRemoveHyperlink.on('click', _.bind(me.onDelHyperlink, me)); + view.pmiRowHeight.menu.on('item:click', _.bind(me.onSetSize, me)); + view.pmiColumnWidth.menu.on('item:click', _.bind(me.onSetSize, me)); + view.pmiEntireHide.on('click', _.bind(me.onEntireHide, me)); + view.pmiEntireShow.on('click', _.bind(me.onEntireShow, me)); + view.pmiFreezePanes.on('click', _.bind(me.onFreezePanes, me)); + view.pmiEntriesList.on('click', _.bind(me.onEntriesList, me)); + /** coauthoring begin **/ + view.pmiAddComment.on('click', _.bind(me.onAddComment, me)); + /** coauthoring end **/ + view.pmiAddNamedRange.on('click', _.bind(me.onAddNamedRange, me)); + view.imgMenu.on('item:click', _.bind(me.onImgMenu, me)); + view.menuParagraphVAlign.menu.on('item:click', _.bind(me.onParagraphVAlign, me)); + view.menuParagraphDirection.menu.on('item:click', _.bind(me.onParagraphDirection, me)); + view.menuParagraphBullets.menu.on('item:click', _.bind(me.onSelectNoneBullet, me)); + view.menuAddHyperlinkShape.on('click', _.bind(me.onInsHyperlink, me)); + view.menuEditHyperlinkShape.on('click', _.bind(me.onInsHyperlink, me)); + view.menuRemoveHyperlinkShape.on('click', _.bind(me.onRemoveHyperlinkShape, me)); + view.pmiTextAdvanced.on('click', _.bind(me.onTextAdvanced, me)); + view.mnuShapeAdvanced.on('click', _.bind(me.onShapeAdvanced, me)); + view.mnuChartEdit.on('click', _.bind(me.onChartEdit, me)); + view.mnuImgAdvanced.on('click', _.bind(me.onImgAdvanced, me)); + view.textInShapeMenu.on('render:after', _.bind(me.onTextInShapeAfterRender, me)); + } else { + view.menuViewCopy.on('click', _.bind(me.onCopyPaste, me)); + view.menuViewUndo.on('click', _.bind(me.onUndo, me)); + view.menuViewAddComment.on('click', _.bind(me.onAddComment, me)); + } var documentHolderEl = view.cmpEl; @@ -643,6 +651,39 @@ define([ } }, + onSelectNoneBullet: function(menu, item) { + if (this.api && item.options.value == -1) { + this.api.asc_setListType(item.options.value); + Common.NotificationCenter.trigger('edit:complete', this.documentHolder); + Common.component.Analytics.trackEvent('DocumentHolder', 'List Type'); + } + }, + + onSelectBullets: function(picker, itemView, record, e) { + var rawData = {}, + isPickerSelect = _.isFunction(record.toJSON); + + if (isPickerSelect){ + if (record.get('selected')) { + rawData = record.toJSON(); + } else { + // record deselected + return; + } + } else { + rawData = record; + } + + if (this.api) + this.api.asc_setListType(rawData.type, rawData.subtype); + + if (e.type !== 'click') + this.documentHolder.textInShapeMenu.hide(); + + Common.NotificationCenter.trigger('edit:complete', this.documentHolder); + Common.component.Analytics.trackEvent('DocumentHolder', 'List Type'); + }, + onRemoveHyperlinkShape: function(item) { if (this.api) { this.api.asc_removeHyperlink(); @@ -1069,6 +1110,13 @@ define([ } }, + onUndo: function() { + if (this.api) { + this.api.asc_Undo(); + Common.NotificationCenter.trigger('edit:complete', this.documentHolder); + } + }, + onApiContextMenu: function(event) { var me = this; _.delay(function(){ @@ -1170,15 +1218,15 @@ define([ }, showObjectMenu: function(event){ - if (this.api && this.permissions.isEdit && !this.mouse.isLeftButtonDown && !this.rangeSelectionMode){ - this.fillMenuProps(this.api.asc_getCellInfo(), true, event); + if (this.api && !this.mouse.isLeftButtonDown && !this.rangeSelectionMode){ + (this.permissions.isEdit) ? this.fillMenuProps(this.api.asc_getCellInfo(), true, event) : this.fillViewMenuProps(this.api.asc_getCellInfo(), true, event); } }, onSelectionChanged: function(info){ - if (this.permissions.isEdit && !this.mouse.isLeftButtonDown && !this.rangeSelectionMode && + if (!this.mouse.isLeftButtonDown && !this.rangeSelectionMode && this.currentMenu && this.currentMenu.isVisible()){ - this.fillMenuProps(info); + (this.permissions.isEdit) ? this.fillMenuProps(info, true, event) : this.fillViewMenuProps(info, true, event); } }, @@ -1266,7 +1314,8 @@ define([ if (elType == Asc.c_oAscTypeSelectElement.Image) { var value = selectedObjects[i].asc_getObjectValue(), align = value.asc_getVerticalTextAlign(), - direct = value.asc_getVert(); + direct = value.asc_getVert(), + listtype = this.api.asc_getCurrentListType(); isObjLocked = isObjLocked || value.asc_getLocked(); documentHolder.menuParagraphTop.setChecked(align == Asc.c_oAscVAlign.Top); documentHolder.menuParagraphCenter.setChecked(align == Asc.c_oAscVAlign.Center); @@ -1275,6 +1324,10 @@ define([ documentHolder.menuParagraphDirectH.setChecked(direct == Asc.c_oAscVertDrawingText.normal); documentHolder.menuParagraphDirect90.setChecked(direct == Asc.c_oAscVertDrawingText.vert); documentHolder.menuParagraphDirect270.setChecked(direct == Asc.c_oAscVertDrawingText.vert270); + + documentHolder.menuParagraphBulletNone.setChecked(listtype.get_ListType() == -1); + var rec = documentHolder.paraBulletsPicker.store.findWhere({ type: listtype.get_ListType(), subtype: listtype.get_ListSubType() }); + documentHolder.paraBulletsPicker.selectRecord(rec, true); } else if (elType == Asc.c_oAscTypeSelectElement.Paragraph) { documentHolder.pmiTextAdvanced.textInfo = selectedObjects[i].asc_getObjectValue(); isObjLocked = isObjLocked || documentHolder.pmiTextAdvanced.textInfo.asc_getLocked(); @@ -1371,7 +1424,7 @@ define([ documentHolder.pmiEntireHide.isrowmenu = isrowmenu; documentHolder.pmiEntireShow.isrowmenu = isrowmenu; - documentHolder.setMenuItemCommentCaptionMode(cellinfo.asc_getComments().length < 1, this.permissions.canEditComments); + documentHolder.setMenuItemCommentCaptionMode(documentHolder.pmiAddComment, cellinfo.asc_getComments().length < 1, this.permissions.canEditComments); commentsController && commentsController.blockPopover(true); documentHolder.pmiClear.menu.items[1].setDisabled(iscelledit); @@ -1421,6 +1474,26 @@ define([ } }, + fillViewMenuProps: function(cellinfo, showMenu, event){ + var documentHolder = this.documentHolder, + seltype = cellinfo.asc_getFlags().asc_getSelectionType(), + isCellLocked = cellinfo.asc_getLocked(), + isTableLocked = cellinfo.asc_getLockedTable()===true, + commentsController = this.getApplication().getController('Common.Controllers.Comments'), + iscellmenu = (seltype==Asc.c_oAscSelectionType.RangeCells) && !this.permissions.isEditMailMerge && !this.permissions.isEditDiagram, + iscelledit = this.api.isCellEdited; + + if (!showMenu && !documentHolder.viewModeMenu.isVisible()) return; + + documentHolder.menuViewUndo.setVisible(this.permissions.isEdit); + documentHolder.menuViewCopySeparator.setVisible(iscellmenu && !iscelledit && this.permissions.canCoAuthoring && this.permissions.canComments && this.permissions.isEdit); + documentHolder.menuViewAddComment.setVisible(iscellmenu && !iscelledit && this.permissions.canCoAuthoring && this.permissions.canComments && this.permissions.isEdit); + documentHolder.setMenuItemCommentCaptionMode(documentHolder.menuViewAddComment, cellinfo.asc_getComments().length < 1, this.permissions.canEditComments); + commentsController && commentsController.blockPopover(true); + documentHolder.menuViewAddComment.setDisabled(isCellLocked || isTableLocked); + if (showMenu) this.showPopupMenu(documentHolder.viewModeMenu, {}, event); + }, + showPopupMenu: function(menu, value, event){ if (!_.isUndefined(menu) && menu !== null){ Common.UI.Menu.Manager.hideAll(); @@ -2338,6 +2411,19 @@ define([ Common.NotificationCenter.trigger('edit:complete', me.documentHolder); }, + onTextInShapeAfterRender:function(cmp) { + var view = this.documentHolder, + _conf = view.paraBulletsPicker.conf; + view.paraBulletsPicker = new Common.UI.DataView({ + el : $('#id-docholder-menu-bullets'), + parentMenu : view.menuParagraphBullets.menu, + store : view.paraBulletsPicker.store, + itemTemplate: _.template('
    ') + }); + view.paraBulletsPicker.on('item:click', _.bind(this.onSelectBullets, this)); + _conf && view.paraBulletsPicker.selectRecord(_conf.rec, true); + }, + guestText : 'Guest', textCtrlClick : 'Press CTRL and click link', txtHeight : 'Height', diff --git a/apps/spreadsheeteditor/main/app/controller/LeftMenu.js b/apps/spreadsheeteditor/main/app/controller/LeftMenu.js index b0300bd43..a575d2967 100644 --- a/apps/spreadsheeteditor/main/app/controller/LeftMenu.js +++ b/apps/spreadsheeteditor/main/app/controller/LeftMenu.js @@ -256,7 +256,8 @@ define([ /** coauthoring begin **/ var value = Common.localStorage.getItem("sse-settings-livecomment"); - (!(value!==null && parseInt(value) == 0)) ? this.api.asc_showComments() : this.api.asc_hideComments(); + var resolved = Common.localStorage.getItem("sse-settings-resolvedcomment"); + (!(value!==null && parseInt(value) == 0)) ? this.api.asc_showComments(!(resolved!==null && parseInt(resolved) == 0)) : this.api.asc_hideComments(); // this.getApplication().getController('DocumentHolder').setLiveCommenting(!(value!==null && parseInt(value) == 0)); if (this.mode.isEdit && !this.mode.isOffline && this.mode.canCoAuthoring) { @@ -549,9 +550,12 @@ define([ commentsShowHide: function(state) { if (this.api) { - var value = Common.localStorage.getItem("sse-settings-livecomment"); - if (value !== null && parseInt(value) == 0) { - (state) ? this.api.asc_showComments() : this.api.asc_hideComments(); + var value = Common.localStorage.getItem("sse-settings-livecomment"), + resolved = Common.localStorage.getItem("sse-settings-resolvedcomment"); + value = (value!==null && parseInt(value) == 0); + resolved = (resolved!==null && parseInt(resolved) == 0); + if (value || resolved) { + (state) ? this.api.asc_showComments(true) : ((!value) ? this.api.asc_showComments(!resolved) : this.api.asc_hideComments()); } if (state) { diff --git a/apps/spreadsheeteditor/main/app/controller/Main.js b/apps/spreadsheeteditor/main/app/controller/Main.js index 8f778c613..8e6bfc195 100644 --- a/apps/spreadsheeteditor/main/app/controller/Main.js +++ b/apps/spreadsheeteditor/main/app/controller/Main.js @@ -202,13 +202,13 @@ define([ me.api.asc_enableKeyEvents(false); }, 'modal:close': function(dlg) { - if (dlg && dlg.$lastmodal && dlg.$lastmodal.size() < 1) { + if (dlg && dlg.$lastmodal && dlg.$lastmodal.length < 1) { me.isModalShowed = false; me.api.asc_enableKeyEvents(true); } }, 'modal:hide': function(dlg) { - if (dlg && dlg.$lastmodal && dlg.$lastmodal.size() < 1) { + if (dlg && dlg.$lastmodal && dlg.$lastmodal.length < 1) { me.isModalShowed = false; me.api.asc_enableKeyEvents(true); } @@ -546,7 +546,8 @@ define([ /** coauthoring begin **/ value = Common.localStorage.getItem("sse-settings-livecomment"); this.isLiveCommenting = !(value!==null && parseInt(value) == 0); - this.isLiveCommenting?this.api.asc_showComments():this.api.asc_hideComments(); + var resolved = Common.localStorage.getItem("sse-settings-resolvedcomment"); + this.isLiveCommenting ? this.api.asc_showComments(!(resolved!==null && parseInt(resolved) == 0)) : this.api.asc_hideComments(); if (this.appOptions.isEdit && !this.appOptions.isOffline && this.appOptions.canCoAuthoring) { value = Common.localStorage.getItem("sse-settings-coauthmode"); @@ -670,8 +671,11 @@ define([ Common.NotificationCenter.trigger('document:ready', 'main'); } }, 50); - } else if (me.appOptions.canBrandingExt) - Common.NotificationCenter.trigger('document:ready', 'main'); + } else { + documentHolderView.createDelayedElementsViewer(); + if (me.appOptions.canBrandingExt) + Common.NotificationCenter.trigger('document:ready', 'main'); + } if (me.appOptions.canAnalytics && false) Common.component.Analytics.initialize('UA-12442749-13', 'Spreadsheet Editor'); @@ -965,7 +969,7 @@ define([ msg.msg = (msg.msg).toString(); this.showTips([msg.msg.charAt(0).toUpperCase() + msg.msg.substring(1)]); - Common.component.Analytics.trackEvent('External Error', msg.title); + Common.component.Analytics.trackEvent('External Error'); } }, @@ -1047,6 +1051,16 @@ define([ config.closable = true; break; + case Asc.c_oAscError.ID.FrmlOperandExpected: + config.msg = this.errorOperandExpected; + config.closable = true; + break; + + case Asc.c_oAscError.ID.FrmlWrongReferences: + config.msg = this.errorFrmlWrongReferences; + config.closable = true; + break; + case Asc.c_oAscError.ID.UnexpectedGuid: config.msg = this.errorUnexpectedGuid; break; @@ -1071,10 +1085,6 @@ define([ config.msg = this.errorDataRange; break; - case Asc.c_oAscError.ID.FrmlOperandExpected: - config.msg = this.errorOperandExpected; - break; - case Asc.c_oAscError.ID.VKeyEncrypt: config.msg = this.errorToken; break; @@ -1160,10 +1170,6 @@ define([ config.msg = this.errorOpenWarning; break; - case Asc.c_oAscError.ID.FrmlWrongReferences: - config.msg = this.errorFrmlWrongReferences; - break; - case Asc.c_oAscError.ID.CopyMultiselectAreaError: config.msg = this.errorCopyMultiselectArea; break; @@ -1411,10 +1417,10 @@ define([ type: type, codepages: advOptions.asc_getOptions().asc_getCodePages(), settings: advOptions.asc_getOptions().asc_getRecommendedSettings(), - handler: function (encoding, delimiter) { + handler: function (encoding, delimiter, delimiterChar) { me.isShowOpenDialog = false; if (me && me.api) { - me.api.asc_setAdvancedOptions(type, new Asc.asc_CCSVAdvancedOptions(encoding, delimiter)); + me.api.asc_setAdvancedOptions(type, new Asc.asc_CCSVAdvancedOptions(encoding, delimiter, delimiterChar)); me.loadMask && me.loadMask.show(); } } @@ -2057,7 +2063,7 @@ define([ errorFileVKey: 'External error.
    Incorrect securety key. Please, contact support.', 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.', errorDataRange: 'Incorrect data range.', - errorOperandExpected: 'Operand expected', + errorOperandExpected: 'The entered function syntax is not correct. Please check if you are missing one of the parentheses - \'(\' or \')\'.', errorKeyEncrypt: 'Unknown key descriptor', errorKeyExpire: 'Key descriptor expired', errorUsersExceed: 'Count of users was exceed', diff --git a/apps/spreadsheeteditor/main/app/controller/Toolbar.js b/apps/spreadsheeteditor/main/app/controller/Toolbar.js index ba215c995..389a39ded 100644 --- a/apps/spreadsheeteditor/main/app/controller/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/controller/Toolbar.js @@ -810,7 +810,20 @@ define([ props = me.api.asc_getChartObject(); if (props) { props.putType(record.get('type')); - (ischartedit) ? me.api.asc_editChartDrawingObject(props) : me.api.asc_addChartDrawingObject(props); + var range = props.getRange(), + isvalid = me.api.asc_checkDataRange(Asc.c_oAscSelectionDialogType.Chart, range, true, !props.getInColumns(), props.getType()); + if (isvalid == Asc.c_oAscError.ID.No) { + (ischartedit) ? me.api.asc_editChartDrawingObject(props) : me.api.asc_addChartDrawingObject(props); + } else { + Common.UI.warning({ + msg: (isvalid == Asc.c_oAscError.ID.StockChartError) ? me.errorStockChart : ((isvalid == Asc.c_oAscError.ID.MaxDataSeriesError) ? me.errorMaxRows : me.txtInvalidRange), + callback: function() { + _.defer(function(btn) { + Common.NotificationCenter.trigger('edit:complete', me.toolbar); + }) + } + }); + } } } } @@ -938,8 +951,8 @@ define([ onCustomNumberFormat: function() { var me = this, - value = Common.localStorage.getItem("sse-settings-reg-settings"); - value = (value!==null) ? parseInt(value) : ((me.toolbar.mode.lang) ? parseInt(Common.util.LanguageInfo.getLocalLanguageCode(me.toolbar.mode.lang)) : 0x0409); + value = me.api.asc_getLocale(); + (!value) && (value = ((me.toolbar.mode.lang) ? parseInt(Common.util.LanguageInfo.getLocalLanguageCode(me.toolbar.mode.lang)) : 0x0409)); (new SSE.Views.FormatSettingsDialog({ api: me.api, @@ -957,10 +970,9 @@ define([ onNumberFormatOpenBefore: function(combo) { if (this.api) { - var me = this; - - var value = Common.localStorage.getItem("sse-settings-reg-settings"); - value = (value!==null) ? parseInt(value) : ((this.toolbar.mode.lang) ? parseInt(Common.util.LanguageInfo.getLocalLanguageCode(this.toolbar.mode.lang)) : 0x0409); + var me = this, + value = me.api.asc_getLocale(); + (!value) && (value = ((me.toolbar.mode.lang) ? parseInt(Common.util.LanguageInfo.getLocalLanguageCode(me.toolbar.mode.lang)) : 0x0409)); if (this._state.langId !== value) { this._state.langId = value; @@ -1436,7 +1448,7 @@ define([ restoreHeight: 300, style: 'max-height: 300px;', store: me.getCollection('TableTemplates'), - itemTemplate: _.template('
    ') + itemTemplate: _.template('
    ') }); picker.on('item:click', function(picker, item, record) { @@ -2224,7 +2236,7 @@ define([ store: this.getApplication().getCollection('Common.Collections.TextArt'), parentMenu: this.toolbar.mnuInsertTextArt.menu, showLast: false, - itemTemplate: _.template('
    ') + itemTemplate: _.template('
    ') }); this.toolbar.mnuTextArtPicker.on('item:click', function(picker, item, record, e) { @@ -2571,8 +2583,23 @@ define([ if (me._state.tablename) me.api.asc_changeAutoFilter(me._state.tablename, Asc.c_oAscChangeFilterOptions.style, fmtname); - else - me.api.asc_addAutoFilter(fmtname, dlg.getSettings()); + else { + var settings = dlg.getSettings(); + if (settings.selectionType == Asc.c_oAscSelectionType.RangeMax || settings.selectionType == Asc.c_oAscSelectionType.RangeRow || + settings.selectionType == Asc.c_oAscSelectionType.RangeCol) + Common.UI.warning({ + title: me.textLongOperation, + msg: me.warnLongOperation, + buttons: ['ok', 'cancel'], + callback: function(btn) { + if (btn == 'ok') + setTimeout(function() { me.api.asc_addAutoFilter(fmtname, settings.range)}, 1); + Common.NotificationCenter.trigger('edit:complete', me.toolbar); + } + }); + else + me.api.asc_addAutoFilter(fmtname, settings.range); + } } Common.NotificationCenter.trigger('edit:complete', me.toolbar); @@ -2584,14 +2611,30 @@ define([ win.show(); win.setSettings({ - api : me.api + api : me.api, + selectionType: me.api.asc_getCellInfo().asc_getFlags().asc_getSelectionType() }); } else { me._state.filter = undefined; if (me._state.tablename) me.api.asc_changeAutoFilter(me._state.tablename, Asc.c_oAscChangeFilterOptions.style, fmtname); - else - me.api.asc_addAutoFilter(fmtname); + else { + var selectionType = me.api.asc_getCellInfo().asc_getFlags().asc_getSelectionType(); + if (selectionType == Asc.c_oAscSelectionType.RangeMax || selectionType == Asc.c_oAscSelectionType.RangeRow || + selectionType == Asc.c_oAscSelectionType.RangeCol) + Common.UI.warning({ + title: me.textLongOperation, + msg: me.warnLongOperation, + buttons: ['ok', 'cancel'], + callback: function(btn) { + if (btn == 'ok') + setTimeout(function() { me.api.asc_addAutoFilter(fmtname)}, 1); + Common.NotificationCenter.trigger('edit:complete', me.toolbar); + } + }); + else + me.api.asc_addAutoFilter(fmtname); + } } } }, @@ -3024,7 +3067,12 @@ define([ txtExpandSort: 'The data next to the selection will not be sorted. Do you want to expand the selection to include the adjacent data or continue with sorting the currently selected cells only?', txtExpand: 'Expand and sort', txtSorting: 'Sorting', - txtSortSelected: 'Sort selected' + txtSortSelected: 'Sort selected', + textLongOperation: 'Long operation', + warnLongOperation: 'The operation you are about to perform might take rather much time to complete.
    Are you sure you want to continue?', + txtInvalidRange: 'ERROR! Invalid cells range', + errorMaxRows: 'ERROR! The maximum number of data series per chart is 255.', + 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.Controllers.Toolbar || {})); }); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app/template/ShapeSettingsAdvanced.template b/apps/spreadsheeteditor/main/app/template/ShapeSettingsAdvanced.template index aecab244e..2ae9bfa02 100644 --- a/apps/spreadsheeteditor/main/app/template/ShapeSettingsAdvanced.template +++ b/apps/spreadsheeteditor/main/app/template/ShapeSettingsAdvanced.template @@ -94,6 +94,24 @@
    PAGE UP, LEFT ARROW, UP ARROW Perform the previous animation or return to the previous slide.
    Go to slide numbernumber+ENTERGo to slide with the specified number.
    Stop or restart previewSStop or restart an automatic presentation.
    Close preview ESC PAGE UP, СТРЕЛКА ВЛЕВО, СТРЕЛКА ВВЕРХ Показать предыдущий эффект анимации или вернуться к предыдущему слайду.
    Перейти к слайду с заданным номеромномер+ENTERПерейти к слайду с заданным номером.
    Остановить или перезапустить просмотрSОстановить или перезапустить автоматический показ слайдов.
    Закрыть просмотр ESC
    +
    +
    + + + + + + + +
    + +
    +
    + +
    +
    +
    +
    diff --git a/apps/spreadsheeteditor/main/app/view/AutoFilterDialog.js b/apps/spreadsheeteditor/main/app/view/AutoFilterDialog.js index c0c2fa909..e1500b78b 100644 --- a/apps/spreadsheeteditor/main/app/view/AutoFilterDialog.js +++ b/apps/spreadsheeteditor/main/app/view/AutoFilterDialog.js @@ -93,7 +93,7 @@ define([ this.handler = options.handler; this.type = options.type || 'number'; - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); Common.UI.Window.prototype.initialize.call(this, _options); }, @@ -342,7 +342,7 @@ define([ this.api = options.api; this.handler = options.handler; - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); Common.UI.Window.prototype.initialize.call(this, _options); }, @@ -516,7 +516,7 @@ define([ this.throughIndexes = []; this.filteredIndexes = []; - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); Common.UI.Window.prototype.initialize.call(this, _options); }, diff --git a/apps/spreadsheeteditor/main/app/view/CellRangeDialog.js b/apps/spreadsheeteditor/main/app/view/CellRangeDialog.js index d68518186..b8a91cb4e 100644 --- a/apps/spreadsheeteditor/main/app/view/CellRangeDialog.js +++ b/apps/spreadsheeteditor/main/app/view/CellRangeDialog.js @@ -69,7 +69,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); Common.UI.Window.prototype.initialize.call(this, this.options); }, @@ -136,7 +136,7 @@ define([ }, onApiRangeChanged: function(info) { - this.inputRange.setValue(info); + this.inputRange.setValue(info.asc_getName()); if (this.inputRange.cmpEl.hasClass('error')) this.inputRange.cmpEl.removeClass('error'); }, diff --git a/apps/spreadsheeteditor/main/app/view/ChartSettings.js b/apps/spreadsheeteditor/main/app/view/ChartSettings.js index 57bc7883b..9f353da74 100644 --- a/apps/spreadsheeteditor/main/app/view/ChartSettings.js +++ b/apps/spreadsheeteditor/main/app/view/ChartSettings.js @@ -925,6 +925,7 @@ define([ { chartSettings: props, imageSettings: (me.isChart) ? me._originalProps : null, + sparklineStyles: me.sparklineStyles, isChart: me.isChart, api: me.api, handler: function(result, value) { @@ -1109,6 +1110,7 @@ define([ if (styles && styles.length>1){ var stylesStore = this.cmbSparkStyle.menuPicker.store, selectedIdx = styles[styles.length-1]; + this.sparklineStyles = styles; if (stylesStore.length == styles.length-1) { var data = stylesStore.models; for (var i=0; i') }, + {caption: '--'}, + me.menuParagraphBulletNone = new Common.UI.MenuItem({ + caption : me.textNone, + checkable : true, + checked : false, + value : -1 + }) + ] + }) + }); + me.paraBulletsPicker = { + conf: {rec: null}, + store : new Common.UI.DataViewStore([ + {offsety: 38, type: 0, subtype: 1}, + {offsety: 76, type: 0, subtype: 2}, + {offsety: 114, type: 0, subtype: 3}, + {offsety: 152, type: 0, subtype: 4}, + {offsety: 190, type: 0, subtype: 5}, + {offsety: 228, type: 0, subtype: 6}, + {offsety: 266, type: 0, subtype: 7}, + {offsety: 570, type: 1, subtype: 4}, + {offsety: 532, type: 1, subtype: 5}, + {offsety: 608, type: 1, subtype: 6}, + {offsety: 418, type: 1, subtype: 1}, + {offsety: 456, type: 1, subtype: 2}, + {offsety: 494, type: 1, subtype: 3}, + {offsety: 646, type: 1, subtype: 7} + ]), + selectRecord: function (rec) { + this.conf.rec = rec; + } + }; + me.menuAddHyperlinkShape = new Common.UI.MenuItem({ caption : me.txtInsHyperlink }); @@ -588,6 +660,7 @@ define([ {caption: '--'}, me.menuParagraphVAlign, me.menuParagraphDirection, + me.menuParagraphBullets, me.menuAddHyperlinkShape, me.menuHyperlinkShape, {caption: '--'}, @@ -627,8 +700,8 @@ define([ me.fireEvent('createdelayedelements', [me]); }, - setMenuItemCommentCaptionMode: function (add, editable) { - this.pmiAddComment.setCaption(add ? this.txtAddComment : (editable ? this.txtEditComment : this.txtShowComment), true); + setMenuItemCommentCaptionMode: function (item, add, editable) { + item.setCaption(add ? this.txtAddComment : (editable ? this.txtEditComment : this.txtShowComment), true); }, txtSort: 'Sort', @@ -668,7 +741,7 @@ define([ txtUngroup: 'Ungroup', txtGroup: 'Group', topCellText: 'Align Top', - centerCellText: 'Align Center', + centerCellText: 'Align Middle', bottomCellText: 'Align Bottom', vertAlignText: 'Vertical Alignment', txtTextAdvanced: 'Text Advanced Settings', @@ -679,8 +752,8 @@ define([ chartText: 'Chart Advanced Settings', directionText: 'Text Direction', directHText: 'Horizontal', - direct90Text: 'Rotate at 90°', - direct270Text: 'Rotate at 270°', + direct90Text: 'Rotate Text Down', + direct270Text: 'Rotate Text Up', txtAddNamedRange: 'Define Name', textFreezePanes: 'Freeze Panes', textUnFreezePanes: 'Unfreeze Panes', @@ -712,7 +785,10 @@ define([ txtClearSparklines: 'Clear Selected Sparklines', txtClearSparklineGroups: 'Clear Selected Sparkline Groups', txtShowComment: 'Show Comment', - advancedImgText: 'Image Advanced Settings' + advancedImgText: 'Image Advanced Settings', + textNone: 'None', + bulletsText: 'Bullets and Numbering', + textUndo: 'Undo' }, SSE.Views.DocumentHolder || {})); }); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js b/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js index cc62ba7f8..a5dda5fdf 100644 --- a/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js +++ b/apps/spreadsheeteditor/main/app/view/FileMenuPanels.js @@ -443,6 +443,10 @@ define([ '', '', '','', + '', + '', + '', + '','', '', '', '', @@ -502,6 +506,13 @@ define([ this.chLiveComment = new Common.UI.CheckBox({ el: $('#fms-chb-live-comment'), labelText: this.strLiveComment + }).on('change', _.bind(function(field, newValue, oldValue, eOpts){ + this.chResolvedComment.setDisabled(field.getValue()!=='checked'); + }, this)); + + this.chResolvedComment = new Common.UI.CheckBox({ + el: $('#fms-chb-resolved-comment'), + labelText: this.strResolvedComment }); this.cmbCoAuthMode = new Common.UI.ComboBox({ @@ -681,6 +692,9 @@ define([ value = Common.localStorage.getItem("sse-settings-livecomment"); this.chLiveComment.setValue(!(value!==null && parseInt(value) == 0)); + value = Common.localStorage.getItem("sse-settings-resolvedcomment"); + this.chResolvedComment.setValue(!(value!==null && parseInt(value) == 0)); + value = Common.localStorage.getItem("sse-settings-coauthmode"); if (value===null && Common.localStorage.getItem("sse-settings-autosave")===null && this.mode.customization && this.mode.customization.autosave===false) @@ -721,28 +735,12 @@ define([ this.cmbFuncLocale.setValue(item ? item.get('value') : 'en'); this.updateFuncExample(item ? item.get('exampleValue') : this.txtExampleEn); - value = Common.localStorage.getItem("sse-settings-reg-settings"); - if (value!==null) { - item = this.cmbRegSettings.store.findWhere({value: parseInt(value)}); - this.cmbRegSettings.setValue(item ? item.get('value') : 0x0409); + value = this.api.asc_getLocale(); + if (value) { + item = this.cmbRegSettings.store.findWhere({value: value}); + this.cmbRegSettings.setValue(item ? item.get('value') : Common.util.LanguageInfo.getLocalLanguageName(value)[1]); } else { - if (this.mode.lang) { - var lang = this.mode.lang.toLowerCase(), - langshort = lang.split("-")[0].toLowerCase(), - code = Common.util.LanguageInfo.getLocalLanguageCode(lang), - codefull, codeshort; - this.cmbRegSettings.store.each(function(model){ - var val = model.get('value'), - langname = Common.util.LanguageInfo.getLocalLanguageName(val)[0].toLowerCase(); - if ( langname == lang ) - codefull = val; - if ( langname.indexOf(langshort)==0 ) - codeshort = val; - }); - code = (codefull) ? codefull : ((codeshort) ? codeshort : ((code) ? Common.util.LanguageInfo.getLocalLanguageName(code)[1] : 0x0409)); - this.cmbRegSettings.setValue(code); - } else - this.cmbRegSettings.setValue(0x0409); + this.cmbRegSettings.setValue((this.mode.lang) ? Common.util.LanguageInfo.getLocalLanguageName(parseInt(Common.util.LanguageInfo.getLocalLanguageCode(this.mode.lang)))[1] : 0x0409); } this.updateRegionalExample(this.cmbRegSettings.getValue()); }, @@ -751,6 +749,7 @@ define([ Common.localStorage.setItem("sse-settings-zoom", this.cmbZoom.getValue()); /** coauthoring begin **/ Common.localStorage.setItem("sse-settings-livecomment", this.chLiveComment.isChecked() ? 1 : 0); + Common.localStorage.setItem("sse-settings-resolvedcomment", this.chResolvedComment.isChecked() ? 1 : 0); if (this.mode.isEdit && !this.mode.isOffline && this.mode.canCoAuthoring) Common.localStorage.setItem("sse-settings-coauthmode", this.cmbCoAuthMode.getValue()); /** coauthoring end **/ @@ -828,7 +827,8 @@ define([ strAutoRecover: 'Turn on autorecover', txtInch: 'Inch', textForceSave: 'Save to Server', - strForcesave: 'Always save to server (otherwise save to server on document close)' + strForcesave: 'Always save to server (otherwise save to server on document close)', + strResolvedComment: 'Turn on display of the resolved comments' }, SSE.Views.FileMenuPanels.MainSettingsGeneral || {})); SSE.Views.FileMenuPanels.RecentFiles = Common.UI.BaseView.extend({ diff --git a/apps/spreadsheeteditor/main/app/view/FormulaDialog.js b/apps/spreadsheeteditor/main/app/view/FormulaDialog.js index 55dd6d9d8..a6bdf7a8a 100644 --- a/apps/spreadsheeteditor/main/app/view/FormulaDialog.js +++ b/apps/spreadsheeteditor/main/app/view/FormulaDialog.js @@ -92,7 +92,7 @@ define([ this.formulasGroups = options.formulasGroups; this.handler = options.handler; - _options.tpl = _.template(this.template, _options); + _options.tpl = _.template(this.template)(_options); Common.UI.Window.prototype.initialize.call(this, _options); }, diff --git a/apps/spreadsheeteditor/main/app/view/HyperlinkSettingsDialog.js b/apps/spreadsheeteditor/main/app/view/HyperlinkSettingsDialog.js index 0a9468a35..1a65109df 100644 --- a/apps/spreadsheeteditor/main/app/view/HyperlinkSettingsDialog.js +++ b/apps/spreadsheeteditor/main/app/view/HyperlinkSettingsDialog.js @@ -99,7 +99,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); this.api = this.options.api; Common.UI.Window.prototype.initialize.call(this, this.options); diff --git a/apps/spreadsheeteditor/main/app/view/SetValueDialog.js b/apps/spreadsheeteditor/main/app/view/SetValueDialog.js index 94aac612e..50fdfe928 100644 --- a/apps/spreadsheeteditor/main/app/view/SetValueDialog.js +++ b/apps/spreadsheeteditor/main/app/view/SetValueDialog.js @@ -67,7 +67,7 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); this.startvalue = this.options.startvalue; this.maxvalue = this.options.maxvalue; this.defaultUnit = this.options.defaultUnit; diff --git a/apps/spreadsheeteditor/main/app/view/ShapeSettings.js b/apps/spreadsheeteditor/main/app/view/ShapeSettings.js index a43b106db..f11030b49 100644 --- a/apps/spreadsheeteditor/main/app/view/ShapeSettings.js +++ b/apps/spreadsheeteditor/main/app/view/ShapeSettings.js @@ -1258,6 +1258,18 @@ define([ this.sldrGradient.on('thumbdblclick', function(cmp){ me.btnGradColor.cmpEl.find('button').dropdown('toggle'); }); + this.sldrGradient.on('sortthumbs', function(cmp, recalc_indexes){ + var colors = [], + currentIdx; + _.each (recalc_indexes, function(recalc_index, index) { + colors.push(me.GradColor.colors[recalc_index]); + if (me.GradColor.currentIdx == recalc_index) + currentIdx = index; + }); + me.OriginalFillType = null; + me.GradColor.colors = colors; + me.GradColor.currentIdx = currentIdx; + }); this.fillControls.push(this.sldrGradient); this.cmbBorderSize = new Common.UI.ComboBorderSizeEditable({ diff --git a/apps/spreadsheeteditor/main/app/view/ShapeSettingsAdvanced.js b/apps/spreadsheeteditor/main/app/view/ShapeSettingsAdvanced.js index 6fefebc73..808d21b2e 100644 --- a/apps/spreadsheeteditor/main/app/view/ShapeSettingsAdvanced.js +++ b/apps/spreadsheeteditor/main/app/view/ShapeSettingsAdvanced.js @@ -63,6 +63,7 @@ define([ 'text!spreadsheeteditor/main/app/template/ShapeSettingsAdvanced.temp {panelId: 'id-adv-shape-width', panelCaption: this.textSize}, {panelId: 'id-adv-shape-shape', panelCaption: this.textWeightArrows}, {panelId: 'id-adv-shape-margins', panelCaption: this.strMargins}, + {panelId: 'id-adv-shape-columns', panelCaption: this.strColumns}, {panelId: 'id-adv-shape-alttext', panelCaption: this.textAlt} ], contentTemplate: _.template(contentTemplate)({ @@ -435,6 +436,45 @@ define([ 'text!spreadsheeteditor/main/app/template/ShapeSettingsAdvanced.temp obj.getChild('.footer .primary').focus(); }); + // Columns + + this.spnColumns = new Common.UI.MetricSpinner({ + el: $('#shape-columns-number'), + step: 1, + width: 100, + defaultUnit : "", + value: '1', + maxValue: 16, + minValue: 1 + }); + this.spnColumns.on('change', _.bind(function(field, newValue, oldValue, eOpts){ + if (this._changedProps) { + if (this._changedProps.asc_getShapeProperties()===null || this._changedProps.asc_getShapeProperties()===undefined) + this._changedProps.asc_putShapeProperties(new Asc.asc_CShapeProperty()); + + this._changedProps.asc_getShapeProperties().asc_putColumnNumber(field.getNumberValue()); + } + }, this)); + + this.spnSpacing = new Common.UI.MetricSpinner({ + el: $('#shape-columns-spacing'), + step: .1, + width: 100, + defaultUnit : "cm", + value: '0 cm', + maxValue: 40.64, + minValue: 0 + }); + this.spnSpacing.on('change', _.bind(function(field, newValue, oldValue, eOpts){ + if (this._changedProps) { + if (this._changedProps.asc_getShapeProperties()===null || this._changedProps.asc_getShapeProperties()===undefined) + this._changedProps.asc_putShapeProperties(new Asc.asc_CShapeProperty()); + + this._changedProps.asc_getShapeProperties().asc_putColumnSpace(Common.Utils.Metric.fnRecalcToMM(field.getNumberValue())); + } + }, this)); + this.spinners.push(this.spnSpacing); + // Alt Text this.inputAltTitle = new Common.UI.InputField({ @@ -494,6 +534,12 @@ define([ 'text!spreadsheeteditor/main/app/template/ShapeSettingsAdvanced.temp } this.btnsCategory[2].setDisabled(null === margins); // Margins + value = shapeprops.asc_getColumnNumber(); + this.spnColumns.setValue((null !== value && undefined !== value) ? value : '', true); + + value = shapeprops.asc_getColumnSpace(); + this.spnSpacing.setValue((null !== value && undefined !== value) ? Common.Utils.Metric.fnRecalcFromMM(value) : '', true); + value = props.asc_getTitle(); this.inputAltTitle.setValue(value ? value : ''); @@ -717,8 +763,10 @@ define([ 'text!spreadsheeteditor/main/app/template/ShapeSettingsAdvanced.temp textAlt: 'Alternative Text', textAltTitle: 'Title', textAltDescription: 'Description', - textAltTip: 'The alternative text-based representation of the visual object information, which will be read to the people with vision or cognitive impairments to help them better understand what information there is in the image, autoshape, chart or table.' - + textAltTip: 'The alternative text-based representation of the visual object information, which will be read to the people with vision or cognitive impairments to help them better understand what information there is in the image, autoshape, chart or table.', + strColumns: 'Columns', + textSpacing: 'Spacing between columns', + textColNumber: 'Number of columns' }, SSE.Views.ShapeSettingsAdvanced || {})); }); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app/view/Statusbar.js b/apps/spreadsheeteditor/main/app/view/Statusbar.js index c9a0223f4..4086b3e9a 100644 --- a/apps/spreadsheeteditor/main/app/view/Statusbar.js +++ b/apps/spreadsheeteditor/main/app/view/Statusbar.js @@ -68,7 +68,7 @@ define([ templateUserList: _.template(''), @@ -489,7 +489,7 @@ define([ _onAddUser: function(m, c, opts) { if (this.panelUsersList) { - this.panelUsersList.find('ul').append(_.template(this.tplUser, {user: m, scope: this})); + this.panelUsersList.find('ul').append(_.template(this.tplUser)({user: m, scope: this})); this.panelUsersList.scroller.update({minScrollbarLength : 40, alwaysVisibleY: true}); } }, @@ -706,7 +706,7 @@ define([ label: this.labelSheetName, btns: {ok: this.okButtonText, cancel: this.cancelButtonText} }); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); Common.UI.Window.prototype.initialize.call(this, this.options); }, @@ -823,7 +823,7 @@ define([ label: options.ismove ? this.textMoveBefore : this.textCopyBefore, btns: {ok: this.okButtonText, cancel: this.cancelButtonText} }); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); Common.UI.Window.prototype.initialize.call(this, this.options); }, diff --git a/apps/spreadsheeteditor/main/app/view/TableOptionsDialog.js b/apps/spreadsheeteditor/main/app/view/TableOptionsDialog.js index 0c1712e57..023fd5bc3 100644 --- a/apps/spreadsheeteditor/main/app/view/TableOptionsDialog.js +++ b/apps/spreadsheeteditor/main/app/view/TableOptionsDialog.js @@ -72,8 +72,9 @@ define([ '' ].join(''); - this.options.tpl = _.template(this.template, this.options); + this.options.tpl = _.template(this.template)(this.options); this.checkRangeType = Asc.c_oAscSelectionDialogType.FormatTable; + this.selectionType = Asc.c_oAscSelectionType.RangeCells; Common.UI.Window.prototype.initialize.call(this, this.options); }, @@ -129,6 +130,8 @@ define([ } if (settings.title) me.setTitle(settings.title); + if (settings.selectionType) + me.selectionType = settings.selectionType; me.api.asc_unregisterCallback('asc_onSelectionRangeChanged', _.bind(me.onApiRangeChanged, me)); me.api.asc_registerCallback('asc_onSelectionRangeChanged', _.bind(me.onApiRangeChanged, me)); @@ -145,15 +148,16 @@ define([ if (this.checkRangeType == Asc.c_oAscSelectionDialogType.FormatTable) { var options = this.api.asc_getAddFormatTableOptions(this.inputRange.getValue()); options.asc_setIsTitle(this.cbTitle.checked); - return options; + return { selectionType: this.selectionType, range: options}; } else - return this.inputRange.getValue(); + return { selectionType: this.selectionType, range: this.inputRange.getValue()}; }, onApiRangeChanged: function(info) { - this.inputRange.setValue(info); + this.inputRange.setValue(info.asc_getName()); if (this.inputRange.cmpEl.hasClass('error')) this.inputRange.cmpEl.removeClass('error'); + this.selectionType = info.asc_getType(); }, isRangeValid: function() { diff --git a/apps/spreadsheeteditor/main/app/view/TableSettings.js b/apps/spreadsheeteditor/main/app/view/TableSettings.js index 53b39fed8..88be21d07 100644 --- a/apps/spreadsheeteditor/main/app/view/TableSettings.js +++ b/apps/spreadsheeteditor/main/app/view/TableSettings.js @@ -478,10 +478,25 @@ define([ var handlerDlg = function(dlg, result) { if (result == 'ok') { me.api.asc_setSelectionDialogMode(Asc.c_oAscSelectionDialogType.None); - me.api.asc_changeTableRange(me._state.TableName, dlg.getSettings()); + + var settings = dlg.getSettings(); + if (settings.selectionType == Asc.c_oAscSelectionType.RangeMax || settings.selectionType == Asc.c_oAscSelectionType.RangeRow || + settings.selectionType == Asc.c_oAscSelectionType.RangeCol) + Common.UI.warning({ + title: me.textLongOperation, + msg: me.warnLongOperation, + buttons: ['ok', 'cancel'], + callback: function(btn) { + if (btn == 'ok') + setTimeout(function() { me.api.asc_changeTableRange(me._state.TableName, settings.range)}, 1); + Common.NotificationCenter.trigger('edit:complete', me); + } + }); + else + me.api.asc_changeTableRange(me._state.TableName, settings.range); } - Common.NotificationCenter.trigger('edit:complete', me.toolbar); + Common.NotificationCenter.trigger('edit:complete', me); }; var win = new SSE.Views.TableOptionsDialog({ handler: handlerDlg @@ -545,7 +560,9 @@ define([ notcriticalErrorTitle : 'Warning', textReservedName : 'The name you are trying to use is already referenced in cell formulas. Please use some other name.', textAdvanced: 'Show advanced settings', - textConvertRange: 'Convert to range' + textConvertRange: 'Convert to range', + textLongOperation: 'Long operation', + warnLongOperation: 'The operation you are about to perform might take rather much time to complete.
    Are you sure you want to continue?' }, SSE.Views.TableSettings || {})); }); \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/app/view/TextArtSettings.js b/apps/spreadsheeteditor/main/app/view/TextArtSettings.js index 4a26f7699..f31ebef90 100644 --- a/apps/spreadsheeteditor/main/app/view/TextArtSettings.js +++ b/apps/spreadsheeteditor/main/app/view/TextArtSettings.js @@ -1228,6 +1228,18 @@ define([ this.sldrGradient.on('thumbdblclick', function(cmp){ me.btnGradColor.cmpEl.find('button').dropdown('toggle'); }); + this.sldrGradient.on('sortthumbs', function(cmp, recalc_indexes){ + var colors = [], + currentIdx; + _.each (recalc_indexes, function(recalc_index, index) { + colors.push(me.GradColor.colors[recalc_index]); + if (me.GradColor.currentIdx == recalc_index) + currentIdx = index; + }); + me.OriginalFillType = null; + me.GradColor.colors = colors; + me.GradColor.currentIdx = currentIdx; + }); this.lockedControls.push(this.sldrGradient); this.cmbBorderSize = new Common.UI.ComboBorderSizeEditable({ diff --git a/apps/spreadsheeteditor/main/app/view/Toolbar.js b/apps/spreadsheeteditor/main/app/view/Toolbar.js index cf8975daf..b4ed35954 100644 --- a/apps/spreadsheeteditor/main/app/view/Toolbar.js +++ b/apps/spreadsheeteditor/main/app/view/Toolbar.js @@ -1016,7 +1016,7 @@ define([ value : 'top' }, { - caption : me.tipAlignCenter, + caption : me.tipAlignMiddle, iconCls : 'mnu-valign-middle', icls : 'btn-valign-middle', checkable : true, diff --git a/apps/spreadsheeteditor/main/app_dev.js b/apps/spreadsheeteditor/main/app_dev.js index 3d8301bbb..1cc730a2d 100644 --- a/apps/spreadsheeteditor/main/app_dev.js +++ b/apps/spreadsheeteditor/main/app_dev.js @@ -54,8 +54,6 @@ require.config({ jmousewheel : '../vendor/perfect-scrollbar/src/jquery.mousewheel', xregexp : '../vendor/xregexp/xregexp-all-min', sockjs : '../vendor/sockjs/sockjs.min', - jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', api : 'api/documents/api', core : 'common/main/lib/core/application', notification : 'common/main/lib/core/NotificationCenter', @@ -121,8 +119,6 @@ require([ 'analytics', 'gateway', 'locale', - 'jsziputils', - 'jsrsasign', 'sockjs', 'underscore' ], function (Backbone, Bootstrap, Core) { diff --git a/apps/spreadsheeteditor/main/locale/de.json b/apps/spreadsheeteditor/main/locale/de.json index 62fc071b7..c1d0fb427 100644 --- a/apps/spreadsheeteditor/main/locale/de.json +++ b/apps/spreadsheeteditor/main/locale/de.json @@ -84,6 +84,7 @@ "Common.Views.OpenDialog.okButtonText": "OK", "Common.Views.OpenDialog.txtDelimiter": "Trennzeichen", "Common.Views.OpenDialog.txtEncoding": "Verschlüsselung", + "Common.Views.OpenDialog.txtOther": "Sonstige", "Common.Views.OpenDialog.txtPassword": "Kennwort", "Common.Views.OpenDialog.txtSpace": "Leerzeichen", "Common.Views.OpenDialog.txtTab": "Tabulator", @@ -365,6 +366,8 @@ "SSE.Controllers.Statusbar.warnDeleteSheet": "Das Arbeitsblatt könnte Daten enthalten. Möchten Sie wirklich fortsetzen?", "SSE.Controllers.Statusbar.zoomText": "Zoom {0}%", "SSE.Controllers.Toolbar.confirmAddFontName": "Die Schriftart, die Sie verwenden wollen, ist auf diesem Gerät nicht verfügbar.
    Der Textstil wird mit einer der Systemschriften angezeigt, die gespeicherte Schriftart wird verwendet, wenn sie verfügbar ist.
    Wollen Sie fortsetzen?\n", + "SSE.Controllers.Toolbar.errorMaxRows": "FEHLER! Die maximale Anzahl der Datenreihen per Diagramm ist 255", + "SSE.Controllers.Toolbar.errorStockChart": "Falsche Reihenfolge der Zeilen. Um ein Kursdiagramm zu erstellen, ordnen Sie die Daten auf dem Blatt folgendermaßen an:
    Eröffnungspreis, Höchstpreis, Tiefstpreis, Schlusskurs.", "SSE.Controllers.Toolbar.textAccent": "Akzente", "SSE.Controllers.Toolbar.textBracket": "Klammern", "SSE.Controllers.Toolbar.textCancel": "Abbrechen", @@ -374,6 +377,7 @@ "SSE.Controllers.Toolbar.textIntegral": "Integrale", "SSE.Controllers.Toolbar.textLargeOperator": "Große Operatoren", "SSE.Controllers.Toolbar.textLimitAndLog": "Grenzwerte und Logarithmen", + "SSE.Controllers.Toolbar.textLongOperation": "Operation ist zeitaufwendig", "SSE.Controllers.Toolbar.textMatrix": "Matrizen", "SSE.Controllers.Toolbar.textOperator": "Operatoren", "SSE.Controllers.Toolbar.textRadical": "Wurzeln", @@ -507,6 +511,7 @@ "SSE.Controllers.Toolbar.txtIntegralTriple": "Dreifaches Integral\t", "SSE.Controllers.Toolbar.txtIntegralTripleCenterSubSup": "Dreifaches Integral\t", "SSE.Controllers.Toolbar.txtIntegralTripleSubSup": "Dreifaches Integral\t", + "SSE.Controllers.Toolbar.txtInvalidRange": "FEHLER! Ungültiger Zellbereich", "SSE.Controllers.Toolbar.txtLargeOperator_Conjunction": "Keil", "SSE.Controllers.Toolbar.txtLargeOperator_Conjunction_CenterSub": "Keil", "SSE.Controllers.Toolbar.txtLargeOperator_Conjunction_CenterSubSup": "Keil", @@ -700,6 +705,7 @@ "SSE.Controllers.Toolbar.txtSymbol_vdots": "Vertikale Ellipse", "SSE.Controllers.Toolbar.txtSymbol_xsi": "Xi", "SSE.Controllers.Toolbar.txtSymbol_zeta": "Zeta", + "SSE.Controllers.Toolbar.warnLongOperation": "Die Operation, die Sie durchführen möchten, kann viel Zeit in Anspruch nehmen.
    Soll sie fortgesetzt werden?", "SSE.Controllers.Toolbar.warnMergeLostData": "Nur die Daten aus der oberen linken Zelle bleiben nach der Vereinigung.
    Möchten Sie wirklich fortsetzen?", "SSE.Views.AutoFilterDialog.btnCustomFilter": "Benutzerdefinierter Filter", "SSE.Views.AutoFilterDialog.cancelButtonText": "Abbrechen", @@ -935,13 +941,14 @@ "SSE.Views.DocumentHolder.advancedImgText": "Erweiterte Einstellungen des Bildes", "SSE.Views.DocumentHolder.advancedShapeText": "Erweiterte Einstellungen der Form", "SSE.Views.DocumentHolder.bottomCellText": "Unten ausrichten", + "SSE.Views.DocumentHolder.bulletsText": "Nummerierung und Aufzählungszeichen", "SSE.Views.DocumentHolder.centerCellText": "Zentriert ausrichten", "SSE.Views.DocumentHolder.chartText": "Erweiterte Einstellungen des Diagramms", "SSE.Views.DocumentHolder.deleteColumnText": "Spalte", "SSE.Views.DocumentHolder.deleteRowText": "Zeile", "SSE.Views.DocumentHolder.deleteTableText": "Tabelle", - "SSE.Views.DocumentHolder.direct270Text": "Um 270° drehen", - "SSE.Views.DocumentHolder.direct90Text": "Um 90° drehen ", + "SSE.Views.DocumentHolder.direct270Text": "Text nach oben drehen", + "SSE.Views.DocumentHolder.direct90Text": "Text nach unten drehen", "SSE.Views.DocumentHolder.directHText": "Horizontal", "SSE.Views.DocumentHolder.directionText": "Textausrichtung\t", "SSE.Views.DocumentHolder.editChartText": "Daten ändern", @@ -961,6 +968,7 @@ "SSE.Views.DocumentHolder.textArrangeFront": "In den Vordergrund bringen", "SSE.Views.DocumentHolder.textEntriesList": "Aus der Dropdown-Liste wählen\n", "SSE.Views.DocumentHolder.textFreezePanes": "Fensterausschnitten fixieren", + "SSE.Views.DocumentHolder.textNone": "Kein", "SSE.Views.DocumentHolder.textUnFreezePanes": "Unfreeze Panes", "SSE.Views.DocumentHolder.topCellText": "Oben ausrichten", "SSE.Views.DocumentHolder.txtAddComment": "Kommentar hinzufügen", @@ -1055,6 +1063,7 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.strLiveComment": "Live-Kommentare einschalten", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strRegSettings": "Regionale Einstellungen", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strRegSettingsEx": "Beispiel:", + "SSE.Views.FileMenuPanels.MainSettingsGeneral.strResolvedComment": "Die Anzeige der aufgelösten Kommentare einschalten", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strStrict": "Formal", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strUnit": "Maßeinheit ", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strZoom": "Standard-Zoom-Wert", @@ -1377,6 +1386,7 @@ "SSE.Views.ShapeSettings.txtWood": "Holz", "SSE.Views.ShapeSettingsAdvanced.cancelButtonText": "Abbrechen", "SSE.Views.ShapeSettingsAdvanced.okButtonText": "OK", + "SSE.Views.ShapeSettingsAdvanced.strColumns": "Spalten", "SSE.Views.ShapeSettingsAdvanced.strMargins": "Ränder um den Text", "SSE.Views.ShapeSettingsAdvanced.textAlt": "Der alternative Text", "SSE.Views.ShapeSettingsAdvanced.textAltDescription": "Beschreibung", @@ -1388,6 +1398,7 @@ "SSE.Views.ShapeSettingsAdvanced.textBevel": "Schräge Kante", "SSE.Views.ShapeSettingsAdvanced.textBottom": "Unten", "SSE.Views.ShapeSettingsAdvanced.textCapType": "Abschlusstyp", + "SSE.Views.ShapeSettingsAdvanced.textColNumber": "Anzahl von Spalten\t", "SSE.Views.ShapeSettingsAdvanced.textEndSize": "Endgröße", "SSE.Views.ShapeSettingsAdvanced.textEndStyle": "Endlinienart", "SSE.Views.ShapeSettingsAdvanced.textFlat": "Flach", @@ -1400,6 +1411,7 @@ "SSE.Views.ShapeSettingsAdvanced.textRight": "Rechts", "SSE.Views.ShapeSettingsAdvanced.textRound": "Rund", "SSE.Views.ShapeSettingsAdvanced.textSize": "Größe", + "SSE.Views.ShapeSettingsAdvanced.textSpacing": "Abstand zwischen Spalten", "SSE.Views.ShapeSettingsAdvanced.textSquare": "Eckig", "SSE.Views.ShapeSettingsAdvanced.textTitle": "Form - Erweiterte Einstellungen", "SSE.Views.ShapeSettingsAdvanced.textTop": "Oben", @@ -1474,6 +1486,7 @@ "SSE.Views.TableSettings.textInvalidName": "FEHLER! Ungültiger Tabellenname", "SSE.Views.TableSettings.textIsLocked": "Das Element wird gerade von einem anderen Benutzer bearbeitet.", "SSE.Views.TableSettings.textLast": "Letzte", + "SSE.Views.TableSettings.textLongOperation": "Operation ist zeitaufwendig", "SSE.Views.TableSettings.textOK": "OK", "SSE.Views.TableSettings.textReservedName": "Der Name, den Sie verwenden möchten, wurde bereits in Zellformeln verwiesen. Bitte benutzen Sie einen anderen Namen.", "SSE.Views.TableSettings.textResize": "Tabellengröße ändern", @@ -1482,6 +1495,7 @@ "SSE.Views.TableSettings.textTableName": "Tabellenname", "SSE.Views.TableSettings.textTemplate": "Vorlage auswählen", "SSE.Views.TableSettings.textTotal": "Insgesamt", + "SSE.Views.TableSettings.warnLongOperation": "Die Operation, die Sie durchführen möchten, kann viel Zeit in Anspruch nehmen.
    Soll sie fortgesetzt werden?", "SSE.Views.TableSettingsAdvanced.cancelButtonText": "Abbrechen", "SSE.Views.TableSettingsAdvanced.okButtonText": "OK", "SSE.Views.TableSettingsAdvanced.textAlt": "Der alternative Text", diff --git a/apps/spreadsheeteditor/main/locale/en.json b/apps/spreadsheeteditor/main/locale/en.json index cea0fad83..c4f0cdf6e 100644 --- a/apps/spreadsheeteditor/main/locale/en.json +++ b/apps/spreadsheeteditor/main/locale/en.json @@ -84,6 +84,7 @@ "Common.Views.OpenDialog.okButtonText": "OK", "Common.Views.OpenDialog.txtDelimiter": "Delimiter", "Common.Views.OpenDialog.txtEncoding": "Encoding ", + "Common.Views.OpenDialog.txtOther": "Other", "Common.Views.OpenDialog.txtPassword": "Password", "Common.Views.OpenDialog.txtSpace": "Space", "Common.Views.OpenDialog.txtTab": "Tab", @@ -365,6 +366,8 @@ "SSE.Controllers.Statusbar.warnDeleteSheet": "The worksheet might contain data. Are you sure you want to proceed?", "SSE.Controllers.Statusbar.zoomText": "Zoom {0}%", "SSE.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?", + "SSE.Controllers.Toolbar.errorMaxRows": "ERROR! The maximum number of data series per chart is 255", + "SSE.Controllers.Toolbar.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.Controllers.Toolbar.textAccent": "Accents", "SSE.Controllers.Toolbar.textBracket": "Brackets", "SSE.Controllers.Toolbar.textCancel": "Cancel", @@ -374,6 +377,7 @@ "SSE.Controllers.Toolbar.textIntegral": "Integrals", "SSE.Controllers.Toolbar.textLargeOperator": "Large Operators", "SSE.Controllers.Toolbar.textLimitAndLog": "Limits And Logarithms", + "SSE.Controllers.Toolbar.textLongOperation": "Long operation", "SSE.Controllers.Toolbar.textMatrix": "Matrices", "SSE.Controllers.Toolbar.textOperator": "Operators", "SSE.Controllers.Toolbar.textRadical": "Radicals", @@ -507,6 +511,7 @@ "SSE.Controllers.Toolbar.txtIntegralTriple": "Triple Integral", "SSE.Controllers.Toolbar.txtIntegralTripleCenterSubSup": "Triple Integral", "SSE.Controllers.Toolbar.txtIntegralTripleSubSup": "Triple Integral", + "SSE.Controllers.Toolbar.txtInvalidRange": "ERROR! Invalid cell range", "SSE.Controllers.Toolbar.txtLargeOperator_Conjunction": "Wedge", "SSE.Controllers.Toolbar.txtLargeOperator_Conjunction_CenterSub": "Wedge", "SSE.Controllers.Toolbar.txtLargeOperator_Conjunction_CenterSubSup": "Wedge", @@ -700,6 +705,7 @@ "SSE.Controllers.Toolbar.txtSymbol_vdots": "Vertical Ellipsis", "SSE.Controllers.Toolbar.txtSymbol_xsi": "Xi", "SSE.Controllers.Toolbar.txtSymbol_zeta": "Zeta", + "SSE.Controllers.Toolbar.warnLongOperation": "The operation you are about to perform might take rather much time to complete.
    Are you sure you want to continue?", "SSE.Controllers.Toolbar.warnMergeLostData": "Only the data from the upper-left cell will remain in the merged cell.
    Are you sure you want to continue?", "SSE.Views.AutoFilterDialog.btnCustomFilter": "Custom Filter", "SSE.Views.AutoFilterDialog.cancelButtonText": "Cancel", @@ -935,13 +941,14 @@ "SSE.Views.DocumentHolder.advancedImgText": "Image Advanced Settings", "SSE.Views.DocumentHolder.advancedShapeText": "Shape Advanced Settings", "SSE.Views.DocumentHolder.bottomCellText": "Align Bottom", - "SSE.Views.DocumentHolder.centerCellText": "Align Center", + "SSE.Views.DocumentHolder.bulletsText": "Bullets and Numbering", + "SSE.Views.DocumentHolder.centerCellText": "Align Middle", "SSE.Views.DocumentHolder.chartText": "Chart Advanced Settings", "SSE.Views.DocumentHolder.deleteColumnText": "Column", "SSE.Views.DocumentHolder.deleteRowText": "Row", "SSE.Views.DocumentHolder.deleteTableText": "Table", - "SSE.Views.DocumentHolder.direct270Text": "Rotate at 270°", - "SSE.Views.DocumentHolder.direct90Text": "Rotate at 90°", + "SSE.Views.DocumentHolder.direct270Text": "Rotate Text Up", + "SSE.Views.DocumentHolder.direct90Text": "Rotate Text Down", "SSE.Views.DocumentHolder.directHText": "Horizontal", "SSE.Views.DocumentHolder.directionText": "Text Direction", "SSE.Views.DocumentHolder.editChartText": "Edit Data", @@ -961,6 +968,7 @@ "SSE.Views.DocumentHolder.textArrangeFront": "Bring to Foreground", "SSE.Views.DocumentHolder.textEntriesList": "Select from drop-down list", "SSE.Views.DocumentHolder.textFreezePanes": "Freeze Panes", + "SSE.Views.DocumentHolder.textNone": "None", "SSE.Views.DocumentHolder.textUnFreezePanes": "Unfreeze Panes", "SSE.Views.DocumentHolder.topCellText": "Align Top", "SSE.Views.DocumentHolder.txtAddComment": "Add Comment", @@ -1014,6 +1022,7 @@ "SSE.Views.DocumentHolder.txtUngroup": "Ungroup", "SSE.Views.DocumentHolder.txtWidth": "Width", "SSE.Views.DocumentHolder.vertAlignText": "Vertical Alignment", + "SSE.Views.DocumentHolder.textUndo": "Undo", "SSE.Views.FileMenu.btnBackCaption": "Go to Documents", "SSE.Views.FileMenu.btnCloseMenuCaption": "Close Menu", "SSE.Views.FileMenu.btnCreateNewCaption": "Create New", @@ -1055,6 +1064,7 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.strLiveComment": "Turn on display of the comments", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strRegSettings": "Regional Settings", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strRegSettingsEx": "Example: ", + "SSE.Views.FileMenuPanels.MainSettingsGeneral.strResolvedComment": "Turn on display of the resolved comments", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strStrict": "Strict", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strUnit": "Unit of Measurement", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strZoom": "Default Zoom Value", @@ -1078,6 +1088,7 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtPt": "Point", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtRu": "Russian", "SSE.Views.FileMenuPanels.MainSettingsGeneral.txtWin": "as Windows", + "SSE.Views.FileMenuPanels.MainSettingsGeneral.strResolvedComment": "Turn on display of the resolved comments", "SSE.Views.FileMenuPanels.Settings.txtGeneral": "General", "SSE.Views.FileMenuPanels.Settings.txtPageSettings": "Page Settings", "SSE.Views.FormatSettingsDialog.textCancel": "Cancel", @@ -1377,6 +1388,7 @@ "SSE.Views.ShapeSettings.txtWood": "Wood", "SSE.Views.ShapeSettingsAdvanced.cancelButtonText": "Cancel", "SSE.Views.ShapeSettingsAdvanced.okButtonText": "OK", + "SSE.Views.ShapeSettingsAdvanced.strColumns": "Columns", "SSE.Views.ShapeSettingsAdvanced.strMargins": "Text Padding", "SSE.Views.ShapeSettingsAdvanced.textAlt": "Alternative Text", "SSE.Views.ShapeSettingsAdvanced.textAltDescription": "Description", @@ -1388,6 +1400,7 @@ "SSE.Views.ShapeSettingsAdvanced.textBevel": "Bevel", "SSE.Views.ShapeSettingsAdvanced.textBottom": "Bottom", "SSE.Views.ShapeSettingsAdvanced.textCapType": "Cap Type", + "SSE.Views.ShapeSettingsAdvanced.textColNumber": "Number of columns", "SSE.Views.ShapeSettingsAdvanced.textEndSize": "End Size", "SSE.Views.ShapeSettingsAdvanced.textEndStyle": "End Style", "SSE.Views.ShapeSettingsAdvanced.textFlat": "Flat", @@ -1400,6 +1413,7 @@ "SSE.Views.ShapeSettingsAdvanced.textRight": "Right", "SSE.Views.ShapeSettingsAdvanced.textRound": "Round", "SSE.Views.ShapeSettingsAdvanced.textSize": "Size", + "SSE.Views.ShapeSettingsAdvanced.textSpacing": "Spacing between columns", "SSE.Views.ShapeSettingsAdvanced.textSquare": "Square", "SSE.Views.ShapeSettingsAdvanced.textTitle": "Shape - Advanced Settings", "SSE.Views.ShapeSettingsAdvanced.textTop": "Top", @@ -1474,6 +1488,7 @@ "SSE.Views.TableSettings.textInvalidName": "ERROR! Invalid table name", "SSE.Views.TableSettings.textIsLocked": "This element is being edited by another user.", "SSE.Views.TableSettings.textLast": "Last", + "SSE.Views.TableSettings.textLongOperation": "Long operation", "SSE.Views.TableSettings.textOK": "OK", "SSE.Views.TableSettings.textReservedName": "The name you are trying to use is already referenced in cell formulas. Please use some other name.", "SSE.Views.TableSettings.textResize": "Resize table", @@ -1482,6 +1497,7 @@ "SSE.Views.TableSettings.textTableName": "Table Name", "SSE.Views.TableSettings.textTemplate": "Select From Template", "SSE.Views.TableSettings.textTotal": "Total", + "SSE.Views.TableSettings.warnLongOperation": "The operation you are about to perform might take rather much time to complete.
    Are you sure you want to continue?", "SSE.Views.TableSettingsAdvanced.cancelButtonText": "Cancel", "SSE.Views.TableSettingsAdvanced.okButtonText": "Ok", "SSE.Views.TableSettingsAdvanced.textAlt": "Alternative Text", @@ -1560,6 +1576,7 @@ "SSE.Views.Toolbar.textDiagUpBorder": "Diagonal Up Border", "SSE.Views.Toolbar.textEntireCol": "Entire Column", "SSE.Views.Toolbar.textEntireRow": "Entire Row", + "SSE.Views.Toolbar.textFreezePanes": "Freeze Panes", "SSE.Views.Toolbar.textHideFBar": "Hide Formula Bar", "SSE.Views.Toolbar.textHideGridlines": "Hide Gridlines", "SSE.Views.Toolbar.textHideHeadings": "Hide Headings", diff --git a/apps/spreadsheeteditor/main/locale/fr.json b/apps/spreadsheeteditor/main/locale/fr.json index 1613f08bc..d42a679e6 100644 --- a/apps/spreadsheeteditor/main/locale/fr.json +++ b/apps/spreadsheeteditor/main/locale/fr.json @@ -84,6 +84,7 @@ "Common.Views.OpenDialog.okButtonText": "OK", "Common.Views.OpenDialog.txtDelimiter": "Délimiteur", "Common.Views.OpenDialog.txtEncoding": "Encodage", + "Common.Views.OpenDialog.txtOther": "Other", "Common.Views.OpenDialog.txtPassword": "Mot de passe", "Common.Views.OpenDialog.txtSpace": "Espace", "Common.Views.OpenDialog.txtTab": "Tabulation", @@ -232,7 +233,7 @@ "SSE.Controllers.LeftMenu.warnDownloadAs": "Si vous continuez à enregistrer dans ce format toutes les fonctions sauf le texte seront perdues.
    Êtes-vous sûr de vouloir continuer ?", "SSE.Controllers.Main.confirmMoveCellRange": "La plage de cellules finale peut contenir des données.Voulez-vous continuer ?", "SSE.Controllers.Main.confirmPutMergeRange": "Les données source contenaient des cellules fusionnées.
    La fusion a été supprimée avant la transmission des cellules dans le tableau.", - "SSE.Controllers.Main.convertationTimeoutText": "Expiration du délai de conversion.", + "SSE.Controllers.Main.convertationTimeoutText": "Délai de conversion expiré.", "SSE.Controllers.Main.criticalErrorExtText": "Cliquez sur \"OK\" pour revenir à la liste des documents.", "SSE.Controllers.Main.criticalErrorTitle": "Erreur", "SSE.Controllers.Main.defaultTitleText": "ONLYOFFICE Spreadsheet Editor", @@ -274,8 +275,8 @@ "SSE.Controllers.Main.errorPrintMaxPagesCount": "Malheureusement, il n’est pas possible d’imprimer plus de 1500 pages à la fois en utilisant la version actuelle du programme.
    Cette restriction sera supprimée dans la version future.", "SSE.Controllers.Main.errorProcessSaveResult": "Échec de l'enregistrement", "SSE.Controllers.Main.errorServerVersion": "La version de l'éditeur a été mise à jour. La page sera rechargée pour appliquer les modifications.", - "SSE.Controllers.Main.errorSessionAbsolute": "La session de la modification de document a expiré.Veuillez recharger la page.", - "SSE.Controllers.Main.errorSessionIdle": "Le document n'est pas modifié depuis longtemps. Veuillez recharger la page.", + "SSE.Controllers.Main.errorSessionAbsolute": "Votre session a expiré. Veuillez recharger la page.", + "SSE.Controllers.Main.errorSessionIdle": "Le document n'a pas été modifié depuis trop longtemps. Veuillez recharger la page.", "SSE.Controllers.Main.errorSessionToken": "La connexion au serveur a été interrompue. Veuillez recharger la page.", "SSE.Controllers.Main.errorStockChart": "L'ordre des lignes est incorrect. Pour créer un graphique boursier organisez vos données sur la feuille de calcul dans l'ordre suivant:
    cours à l'ouverture, cours maximal, cours minimal, cours à la clôture.", "SSE.Controllers.Main.errorToken": "Le jeton de sécurité du document n’était pas formé correctement.
    Veuillez contacter l'administrateur de Document Server.", @@ -365,6 +366,8 @@ "SSE.Controllers.Statusbar.warnDeleteSheet": "La feuille de travail peut contenir des données. Êtes-vous sûr de vouloir continuer ?", "SSE.Controllers.Statusbar.zoomText": "Zoom {0}%", "SSE.Controllers.Toolbar.confirmAddFontName": "La police que vous allez enregistrer n'est pas disponible sur l'appareil actuel.
    Le style du texte sera affiché à l'aide de l'une des polices de système, la police sauvée sera utilisée lorsqu'il est disponible.
    Voulez-vous continuer?", + "SSE.Controllers.Toolbar.errorMaxRows": "ERROR! The maximum number of data series per chart is 255", + "SSE.Controllers.Toolbar.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.Controllers.Toolbar.textAccent": "Types d'accentuation", "SSE.Controllers.Toolbar.textBracket": "Crochets", "SSE.Controllers.Toolbar.textCancel": "Annuler", @@ -374,6 +377,7 @@ "SSE.Controllers.Toolbar.textIntegral": "Intégrales", "SSE.Controllers.Toolbar.textLargeOperator": "Grands opérateurs", "SSE.Controllers.Toolbar.textLimitAndLog": "Limites et logarithmes ", + "SSE.Controllers.Toolbar.textLongOperation": "Longue opération", "SSE.Controllers.Toolbar.textMatrix": "Matrices", "SSE.Controllers.Toolbar.textOperator": "Opérateurs", "SSE.Controllers.Toolbar.textRadical": "Radicaux", @@ -507,6 +511,7 @@ "SSE.Controllers.Toolbar.txtIntegralTriple": "Triple intégrale", "SSE.Controllers.Toolbar.txtIntegralTripleCenterSubSup": "Triple intégrale", "SSE.Controllers.Toolbar.txtIntegralTripleSubSup": "Triple intégrale", + "SSE.Controllers.Toolbar.txtInvalidRange": "ERROR! Invalid cell range", "SSE.Controllers.Toolbar.txtLargeOperator_Conjunction": "Coin", "SSE.Controllers.Toolbar.txtLargeOperator_Conjunction_CenterSub": "Coin", "SSE.Controllers.Toolbar.txtLargeOperator_Conjunction_CenterSubSup": "Coin", @@ -700,6 +705,7 @@ "SSE.Controllers.Toolbar.txtSymbol_vdots": "Trois points verticaux", "SSE.Controllers.Toolbar.txtSymbol_xsi": "Xi", "SSE.Controllers.Toolbar.txtSymbol_zeta": "Zêta", + "SSE.Controllers.Toolbar.warnLongOperation": "L'opération que vous êtes sur le point d'effectuer peut prendre beaucoup de temps.
    Êtes-vous sûr de vouloir continuer ?", "SSE.Controllers.Toolbar.warnMergeLostData": "Seulement les données de la cellule supérieure gauche seront conservées dans la cellule fusionnée.
    Êtes-vous sûr de vouloir continuer ?", "SSE.Views.AutoFilterDialog.btnCustomFilter": "Filtre personnalisé", "SSE.Views.AutoFilterDialog.cancelButtonText": "Annuler", @@ -935,6 +941,7 @@ "SSE.Views.DocumentHolder.advancedImgText": "Paramètres avancés de l'image", "SSE.Views.DocumentHolder.advancedShapeText": "Paramètres avancés de la forme", "SSE.Views.DocumentHolder.bottomCellText": "Aligner en bas", + "SSE.Views.DocumentHolder.bulletsText": "Bullets and Numbering", "SSE.Views.DocumentHolder.centerCellText": "Aligner au centre", "SSE.Views.DocumentHolder.chartText": "Paramètres du graphique avancés", "SSE.Views.DocumentHolder.deleteColumnText": "Colonne", @@ -961,6 +968,7 @@ "SSE.Views.DocumentHolder.textArrangeFront": "Mettre au premier plan", "SSE.Views.DocumentHolder.textEntriesList": "Choisir dans la liste déroulante", "SSE.Views.DocumentHolder.textFreezePanes": "Verrouiller les volets", + "SSE.Views.DocumentHolder.textNone": "None", "SSE.Views.DocumentHolder.textUnFreezePanes": "Dégager les volets", "SSE.Views.DocumentHolder.topCellText": "Aligner en haut", "SSE.Views.DocumentHolder.txtAddComment": "Ajouter un commentaire", @@ -1048,13 +1056,14 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.strCoAuthModeDescFast": "Les autres utilisateurs pourront voir immédiatement vos modifications ", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strCoAuthModeDescStrict": "Avant de pouvoir afficher les modifications, vous avez besoin de les accépter ", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFast": "Rapide", - "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFontRender": "Hinting de la police", + "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFontRender": "Visibilité de la police", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strForcesave": "Toujours enregistrer sur le serveur ( sinon enregistrer sur le serveur lors de la fermeture du document )", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFuncLocale": "La formule de langue", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strFuncLocaleEx": "Example: SUM; MIN; MAX; COUNT", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strLiveComment": "Activer l'affichage des commentaires", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strRegSettings": "Paramètres régionaux", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strRegSettingsEx": "Exemple: ", + "SSE.Views.FileMenuPanels.MainSettingsGeneral.strResolvedComment": "Turn on display of the resolved comments", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strStrict": "Strict", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strUnit": "Unité de mesure", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strZoom": "Valeur du zoom par défaut", @@ -1269,7 +1278,7 @@ "SSE.Views.ParagraphSettingsAdvanced.noTabs": "Les onglets spécifiés s'affichent dans ce champ", "SSE.Views.ParagraphSettingsAdvanced.okButtonText": "OK", "SSE.Views.ParagraphSettingsAdvanced.strAllCaps": "Majuscules", - "SSE.Views.ParagraphSettingsAdvanced.strDoubleStrike": "Barré double", + "SSE.Views.ParagraphSettingsAdvanced.strDoubleStrike": "Double barré", "SSE.Views.ParagraphSettingsAdvanced.strIndentsFirstLine": "Première ligne", "SSE.Views.ParagraphSettingsAdvanced.strIndentsLeftText": "A gauche", "SSE.Views.ParagraphSettingsAdvanced.strIndentsRightText": "A droite", @@ -1377,6 +1386,7 @@ "SSE.Views.ShapeSettings.txtWood": "Bois", "SSE.Views.ShapeSettingsAdvanced.cancelButtonText": "Annuler", "SSE.Views.ShapeSettingsAdvanced.okButtonText": "OK", + "SSE.Views.ShapeSettingsAdvanced.strColumns": "Columns", "SSE.Views.ShapeSettingsAdvanced.strMargins": "Rembourrage texte", "SSE.Views.ShapeSettingsAdvanced.textAlt": "Texte de remplacement", "SSE.Views.ShapeSettingsAdvanced.textAltDescription": "Description", @@ -1388,6 +1398,7 @@ "SSE.Views.ShapeSettingsAdvanced.textBevel": "Biseau", "SSE.Views.ShapeSettingsAdvanced.textBottom": "En bas", "SSE.Views.ShapeSettingsAdvanced.textCapType": "Type de lettrine", + "SSE.Views.ShapeSettingsAdvanced.textColNumber": "Number of columns", "SSE.Views.ShapeSettingsAdvanced.textEndSize": "Taille de fin", "SSE.Views.ShapeSettingsAdvanced.textEndStyle": "Style de fin", "SSE.Views.ShapeSettingsAdvanced.textFlat": "Plat", @@ -1400,6 +1411,7 @@ "SSE.Views.ShapeSettingsAdvanced.textRight": "A droite", "SSE.Views.ShapeSettingsAdvanced.textRound": "Arrondi", "SSE.Views.ShapeSettingsAdvanced.textSize": "Taille", + "SSE.Views.ShapeSettingsAdvanced.textSpacing": "Spacing between columns", "SSE.Views.ShapeSettingsAdvanced.textSquare": "Carré", "SSE.Views.ShapeSettingsAdvanced.textTitle": "Forme - Paramètres avancés", "SSE.Views.ShapeSettingsAdvanced.textTop": "En haut", @@ -1474,6 +1486,7 @@ "SSE.Views.TableSettings.textInvalidName": "ERREUR! Non valable nom de la table", "SSE.Views.TableSettings.textIsLocked": "Cet élément est en cours de modification par un autre utilisateur.", "SSE.Views.TableSettings.textLast": "Dernier", + "SSE.Views.TableSettings.textLongOperation": "Longue opération", "SSE.Views.TableSettings.textOK": "OK", "SSE.Views.TableSettings.textReservedName": "Le nom que vous essayez d'utiliser est déjà référencé dans des formules de cellules. Veuillez utiliser un autre nom.", "SSE.Views.TableSettings.textResize": "Redimensionner tableau", @@ -1482,6 +1495,7 @@ "SSE.Views.TableSettings.textTableName": "Nom de la tableau", "SSE.Views.TableSettings.textTemplate": "Sélectionner à partir d'un modèle", "SSE.Views.TableSettings.textTotal": "Total", + "SSE.Views.TableSettings.warnLongOperation": "L'opération que vous êtes sur le point d'effectuer peut prendre beaucoup de temps.
    Êtes-vous sûr de vouloir continuer ?", "SSE.Views.TableSettingsAdvanced.cancelButtonText": "Annuler", "SSE.Views.TableSettingsAdvanced.okButtonText": "OK", "SSE.Views.TableSettingsAdvanced.textAlt": "Texte de remplacement", diff --git a/apps/spreadsheeteditor/main/locale/ru.json b/apps/spreadsheeteditor/main/locale/ru.json index 70fb959a7..487e73c0e 100644 --- a/apps/spreadsheeteditor/main/locale/ru.json +++ b/apps/spreadsheeteditor/main/locale/ru.json @@ -84,6 +84,7 @@ "Common.Views.OpenDialog.okButtonText": "OK", "Common.Views.OpenDialog.txtDelimiter": "Разделитель", "Common.Views.OpenDialog.txtEncoding": "Кодировка ", + "Common.Views.OpenDialog.txtOther": "Другое", "Common.Views.OpenDialog.txtPassword": "Пароль", "Common.Views.OpenDialog.txtSpace": "Пробел", "Common.Views.OpenDialog.txtTab": "Табуляция", @@ -365,6 +366,8 @@ "SSE.Controllers.Statusbar.warnDeleteSheet": "Рабочий лист может содержать данные. Вы действительно хотите продолжить?", "SSE.Controllers.Statusbar.zoomText": "Масштаб {0}%", "SSE.Controllers.Toolbar.confirmAddFontName": "Шрифт, который вы хотите сохранить, недоступен на этом устройстве.
    Стиль текста будет отображаться с помощью одного из системных шрифтов. Сохраненный шрифт будет использоваться, когда он станет доступен.
    Вы хотите продолжить?", + "SSE.Controllers.Toolbar.errorMaxRows": "ОШИБКА! Максимальное число рядов данных для одной диаграммы - 255", + "SSE.Controllers.Toolbar.errorStockChart": "Неверный порядок строк. Чтобы создать биржевую диаграмму, расположите данные на листе в следующем порядке:
    цена открытия, максимальная цена, минимальная цена, цена закрытия.", "SSE.Controllers.Toolbar.textAccent": "Диакритические знаки", "SSE.Controllers.Toolbar.textBracket": "Скобки", "SSE.Controllers.Toolbar.textCancel": "Отмена", @@ -374,6 +377,7 @@ "SSE.Controllers.Toolbar.textIntegral": "Интегралы", "SSE.Controllers.Toolbar.textLargeOperator": "Крупные операторы", "SSE.Controllers.Toolbar.textLimitAndLog": "Пределы и логарифмы", + "SSE.Controllers.Toolbar.textLongOperation": "Длительная операция", "SSE.Controllers.Toolbar.textMatrix": "Матрицы", "SSE.Controllers.Toolbar.textOperator": "Операторы", "SSE.Controllers.Toolbar.textRadical": "Радикалы", @@ -507,6 +511,7 @@ "SSE.Controllers.Toolbar.txtIntegralTriple": "Тройной интеграл", "SSE.Controllers.Toolbar.txtIntegralTripleCenterSubSup": "Тройной интеграл", "SSE.Controllers.Toolbar.txtIntegralTripleSubSup": "Тройной интеграл", + "SSE.Controllers.Toolbar.txtInvalidRange": "ОШИБКА! Недопустимый диапазон ячеек", "SSE.Controllers.Toolbar.txtLargeOperator_Conjunction": "Клин", "SSE.Controllers.Toolbar.txtLargeOperator_Conjunction_CenterSub": "Клин", "SSE.Controllers.Toolbar.txtLargeOperator_Conjunction_CenterSubSup": "Клин", @@ -700,6 +705,7 @@ "SSE.Controllers.Toolbar.txtSymbol_vdots": "Вертикальное многоточие", "SSE.Controllers.Toolbar.txtSymbol_xsi": "Кси", "SSE.Controllers.Toolbar.txtSymbol_zeta": "Дзета", + "SSE.Controllers.Toolbar.warnLongOperation": "Для завершения операции, которую вы собираетесь выполнить, может потребоваться довольно много времени.
    Вы действительно хотите продолжить?", "SSE.Controllers.Toolbar.warnMergeLostData": "В объединенной ячейке останутся только данные из левой верхней ячейки.
    Вы действительно хотите продолжить?", "SSE.Views.AutoFilterDialog.btnCustomFilter": "Пользовательский", "SSE.Views.AutoFilterDialog.cancelButtonText": "Отмена", @@ -935,13 +941,14 @@ "SSE.Views.DocumentHolder.advancedImgText": "Дополнительные параметры изображения", "SSE.Views.DocumentHolder.advancedShapeText": "Дополнительные параметры фигуры", "SSE.Views.DocumentHolder.bottomCellText": "По нижнему краю", + "SSE.Views.DocumentHolder.bulletsText": "Маркеры и нумерация", "SSE.Views.DocumentHolder.centerCellText": "По центру", "SSE.Views.DocumentHolder.chartText": "Дополнительные параметры диаграммы", "SSE.Views.DocumentHolder.deleteColumnText": "Столбец", "SSE.Views.DocumentHolder.deleteRowText": "Строку", "SSE.Views.DocumentHolder.deleteTableText": "Таблицу", - "SSE.Views.DocumentHolder.direct270Text": "Поворот на 270°", - "SSE.Views.DocumentHolder.direct90Text": "Поворот на 90°", + "SSE.Views.DocumentHolder.direct270Text": "Повернуть текст вверх", + "SSE.Views.DocumentHolder.direct90Text": "Повернуть текст вниз", "SSE.Views.DocumentHolder.directHText": "Горизонтальное", "SSE.Views.DocumentHolder.directionText": "Направление текста", "SSE.Views.DocumentHolder.editChartText": "Изменить данные", @@ -961,6 +968,7 @@ "SSE.Views.DocumentHolder.textArrangeFront": "Вынести на передний план", "SSE.Views.DocumentHolder.textEntriesList": "Выбрать из списка", "SSE.Views.DocumentHolder.textFreezePanes": "Закрепить области", + "SSE.Views.DocumentHolder.textNone": "Нет", "SSE.Views.DocumentHolder.textUnFreezePanes": "Снять закрепление областей", "SSE.Views.DocumentHolder.topCellText": "По верхнему краю", "SSE.Views.DocumentHolder.txtAddComment": "Добавить комментарий", @@ -1055,6 +1063,7 @@ "SSE.Views.FileMenuPanels.MainSettingsGeneral.strLiveComment": "Включить отображение комментариев в тексте", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strRegSettings": "Региональные параметры", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strRegSettingsEx": "Пример:", + "SSE.Views.FileMenuPanels.MainSettingsGeneral.strResolvedComment": "Включить отображение решенных комментариев", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strStrict": "Строгий", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strUnit": "Единица измерения", "SSE.Views.FileMenuPanels.MainSettingsGeneral.strZoom": "Стандартное значение масштаба", @@ -1377,6 +1386,7 @@ "SSE.Views.ShapeSettings.txtWood": "Дерево", "SSE.Views.ShapeSettingsAdvanced.cancelButtonText": "Отмена", "SSE.Views.ShapeSettingsAdvanced.okButtonText": "ОК", + "SSE.Views.ShapeSettingsAdvanced.strColumns": "Столбцы", "SSE.Views.ShapeSettingsAdvanced.strMargins": "Поля вокруг текста", "SSE.Views.ShapeSettingsAdvanced.textAlt": "Альтернативный текст", "SSE.Views.ShapeSettingsAdvanced.textAltDescription": "Описание", @@ -1388,6 +1398,7 @@ "SSE.Views.ShapeSettingsAdvanced.textBevel": "Скошенный", "SSE.Views.ShapeSettingsAdvanced.textBottom": "Снизу", "SSE.Views.ShapeSettingsAdvanced.textCapType": "Тип окончания", + "SSE.Views.ShapeSettingsAdvanced.textColNumber": "Количество столбцов", "SSE.Views.ShapeSettingsAdvanced.textEndSize": "Конечный размер", "SSE.Views.ShapeSettingsAdvanced.textEndStyle": "Конечный стиль", "SSE.Views.ShapeSettingsAdvanced.textFlat": "Плоский", @@ -1400,6 +1411,7 @@ "SSE.Views.ShapeSettingsAdvanced.textRight": "Справа", "SSE.Views.ShapeSettingsAdvanced.textRound": "Закругленный", "SSE.Views.ShapeSettingsAdvanced.textSize": "Размер", + "SSE.Views.ShapeSettingsAdvanced.textSpacing": "Интервал между столбцами", "SSE.Views.ShapeSettingsAdvanced.textSquare": "Квадратный", "SSE.Views.ShapeSettingsAdvanced.textTitle": "Фигура - Дополнительные параметры", "SSE.Views.ShapeSettingsAdvanced.textTop": "Сверху", @@ -1474,6 +1486,7 @@ "SSE.Views.TableSettings.textInvalidName": "Ошибка! Недопустимое имя таблицы", "SSE.Views.TableSettings.textIsLocked": "Этот элемент редактируется другим пользователем.", "SSE.Views.TableSettings.textLast": "Последний", + "SSE.Views.TableSettings.textLongOperation": "Длительная операция", "SSE.Views.TableSettings.textOK": "OK", "SSE.Views.TableSettings.textReservedName": "Формулы в ячейках уже содержат ссылки на имя, которое вы пытаетесь использовать. Используйте другое имя.", "SSE.Views.TableSettings.textResize": "Размер таблицы", @@ -1482,6 +1495,7 @@ "SSE.Views.TableSettings.textTableName": "Имя таблицы", "SSE.Views.TableSettings.textTemplate": "По шаблону", "SSE.Views.TableSettings.textTotal": "Итоговая", + "SSE.Views.TableSettings.warnLongOperation": "Для завершения операции, которую вы собираетесь выполнить, может потребоваться довольно много времени.
    Вы действительно хотите продолжить?", "SSE.Views.TableSettingsAdvanced.cancelButtonText": "Отмена", "SSE.Views.TableSettingsAdvanced.okButtonText": "Ok", "SSE.Views.TableSettingsAdvanced.textAlt": "Альтернативный текст", diff --git a/apps/spreadsheeteditor/main/resources/formula-lang/de.json b/apps/spreadsheeteditor/main/resources/formula-lang/de.json index 265404152..ef8aad7f8 100644 --- a/apps/spreadsheeteditor/main/resources/formula-lang/de.json +++ b/apps/spreadsheeteditor/main/resources/formula-lang/de.json @@ -1 +1 @@ -{"DATE":"DATUM","DATEDIF":"DATEDIF","DATEVALUE":"DATWERT","DAY":"TAG","DAYS360":"TAGE360","EDATE":"EDATUM","EOMONTH":"MONATSENDE","HOUR":"STUNDE","MINUTE":"MINUTE","MONTH":"MONAT","NETWORKDAYS":"NETTOARBEITSTAGE","NOW":"JETZT","SECOND":"SEKUNDE","TIME":"ZEIT","TIMEVALUE":"ZEITWERT","TODAY":"HEUTE","WEEKDAY":"WOCHENTAG","WEEKNUM":"KALENDERWOCHE","WORKDAY":"ARBEITSTAG","YEAR":"JAHR","YEARFRAC":"BRTEILJAHRE","BIN2DEC":"BININDEZ","BIN2HEX":"BININHEX","BIN2OCT":"BININOKT","COMPLEX":"KOMPLEXE","DEC2BIN":"DEZINBIN","DEC2HEX":"DEZINHEX","DEC2OCT":"DEZINOKT","DELTA":"DELTA","ERF":"GAUSSFEHLER","ERFC":"GAUSSFKOMPL","GESTEP":"GGANZZAHL","HEX2BIN":"HEXINBIN","HEX2DEC":"HEXINDEZ","HEX2OCT":"HEXINOKT","IMABS":"IMABS","IMAGINARY":"IMAGINÄRTEIL","IMARGUMENT":"IMARGUMENT","IMCONJUGATE":"IMKONJUGIERTE","IMCOS":"IMCOS","IMDIV":"IMDIV","IMEXP":"IMEXP","IMLN":"IMLN","IMLOG10":"IMLOG10","IMLOG2":"IMLOG2","IMPOWER":"IMAPOTENZ","IMPRODUCT":"IMPRODUKT","IMREAL":"IMREALTEIL","IMSIN":"IMSIN","IMSQRT":"IMWURZEL","IMSUB":"IMSUB","IMSUM":"IMSUMME","OCT2BIN":"OKTINBIN","OCT2DEC":"OKTINDEZ","OCT2HEX":"OKTINHEX","CHAR":"ZEICHEN","CLEAN":"SÄUBERN","CODE":"CODE","CONCATENATE":"VERKETTEN","DOLLAR":"DM","EXACT":"IDENTISCH","FIND":"FINDEN","FINDB":"FINDENB","FIXED":"FEST","LEFT":"LINKS","LEFTB":"LINKSB","LEN":"LÄNGE","LENB":"LENB","LOWER":"KLEIN","MID":"TEIL","MIDB":"TEILB","PROPER":"GROSS2","REPLACE":"ERSETZEN","REPLACEB":"ERSETZENB","REPT":"WIEDERHOLEN","RIGHT":"RECHTS","RIGHTB":"RECHTSB","SEARCH":"SUCHEN","SEARCHB":"SUCHENB","SUBSTITUTE":"WECHSELN","T":"T","TEXT":"TEXT","TRIM":"GLÄTTEN","UPPER":"GROSS","VALUE":"WERT","AVEDEV":"MITTELABW","AVERAGE":"MITTELWERT","AVERAGEA":"MITTELWERTA","AVERAGEIF":"MITTELWERTWENN","AVERAGEIFS":"MITTELWERTWENNS","BINOMDIST":"BINOMVERT","CONFIDENCE":"KONFIDENZ","CORREL":"KORREL","COUNT":"ANZAHL","COUNTA":"ANZAHL2","COUNTBLANK":"ANZAHLLEEREZELLEN","COUNTIF":"ZÄHLENWENN","COUNTIFS":"ZÄHLENWENNS","COVAR":"KOVAR","CRITBINOM":"KRITBINOM","DEVSQ":"SUMQUADABW","EXPONDIST":"EXPONVERT","FISHER":"FISHER","FISHERINV":"FISHERINV","FORECAST":"SCHÄTZER","FREQUENCY":"HÄUFIGKEIT","GAMMALN":"GAMMALN","GEOMEAN":"GEOMITTEL","HARMEAN":"HARMITTEL","HYPGEOMDIST":"HYPGEOMVERT","INTERCEPT":"ACHSENABSCHNITT","KURT":"KURT","LARGE":"KGRÖSSTE","LOGINV":"LOGINV","LOGNORMDIST":"LOGNORMVERT","MAX":"MAX","MAXA":"MAXA","MEDIAN":"MEDIAN","MIN":"MIN","MINA":"MINA","MODE":"MODALWERT","NEGBINOMDIST":"NEGBINOMVERT","NORMDIST":"NORMVERT","NORMINV":"NORMINV","NORMSDIST":"STANDNORMVERT","NORMSINV":"STANDNORMINV","PEARSON":"PEARSON","PERCENTILE":"QUANTIL","PERCENTRANK":"QUANTILSRANG","PERMUT":"VARIATIONEN","POISSON":"POISSON","PROB":"WAHRSCHBEREICH","QUARTILE":"QUARTILE","RSQ":"BESTIMMTHEITSMASS","SKEW":"SCHIEFE","SLOPE":"STEIGUNG","SMALL":"KKLEINSTE","STANDARDIZE":"STANDARDISIERUNG","STDEV":"STABW","STDEVA":"STABWA","STDEVP":"STABWN","STDEVPA":"STABWNA","STEYX":"STFEHLERYX","VAR":"VARIANZ","VARA":"VARIANZA","VARP":"VARIANZEN","VARPA":"VARIANZENA","ACCRINT":"AUFGELZINS","ACCRINTM":"AUFGELZINSF","AMORDEGRC":"AMORDEGRK","AMORLINC":"AMORLINEARK","COUPDAYBS":"ZINSTERMTAGVA","COUPDAYS":"ZINSTERMTAGE","COUPDAYSNC":"ZINSTERMTAGNZ","COUPNCD":"ZINSTERMNZ","COUPNUM":"ZINSTERMZAHL","COUPPCD":"ZINSTERMVZ","CUMIPMT":"KUMZINSZ","CUMPRINC":"KUMKAPITAL","DB":"GDA2","DDB":"GDA","DISC":"DISAGIO","DOLLARDE":"NOTIERUNGDEZ","DOLLARFR":"NOTIERUNGBRU","DURATION":"DURATIONТ","EFFECT":"EFFEKTIV","FV":"ZW","FVSCHEDULE":"ZW2","INTRATE":"ZINSSATZ","IPMT":"ZINSZ","IRR":"IKV","ISPMT":"ISPMT","MDURATION":"MDURATION","MIRR":"QIKV","NOMINAL":"NOMINAL","NPER":"ZZR","NPV":"NBW","ODDFPRICE":"UNREGER.KURS","ODDFYIELD":"UNREGER.REND","ODDLPRICE":"UNREGLE.KURS","ODDLYIELD":"UNREGLE.REND","PMT":"RMZ","PPMT":"KAPZ","PRICE":"KURS","PRICEDISC":"KURSDISAGIO","PRICEMAT":"KURSFÄLLIG","PV":"BW","RATE":"ZINS","RECEIVED":"AUSZAHLUNG","SLN":"LIA","SYD":"DIA","TBILLEQ":"TBILLÄQUIV","TBILLPRICE":"TBILLKURS","TBILLYIELD":"TBILLRENDITE","VDB":"VDB","XIRR":"XINTZINSFUSS","XNPV":"XKAPITALWERT","YIELD":"RENDITE","YIELDDISC":"RENDITEDIS","YIELDMAT":"RENDITEFÄLL","ABS":"ABS","ACOS":"ARCCOS","ACOSH":"ARCCOSHYP","ASIN":"ARCSIN","ASINH":"ARCSINHYP","ATAN":"ARCTAN","ATAN2":"ARCTAN2","ATANH":"ARCTANHYP","CEILING":"OBERGRENZE","COMBIN":"KOMBINATIONEN","COS":"COS","COSH":"COSHYP","DEGREES":"GRAD","EVEN":"GERADE","EXP":"EXP","FACT":"FAKULTÄT","FACTDOUBLE":"ZWEIFAKULTÄT","FLOOR":"UNTERGRENZE","GCD":"GGT","INT":"GANZZAHL","LCM":"KGV","LN":"LN","LOG":"LOG","LOG10":"LOG10","MDETERM":"MDET","MINVERSE":"MINV","MMULT":"MMULT","MOD":"REST","MROUND":"VRUNDEN","MULTINOMIAL":"POLYNOMIAL","ODD":"UNGERADE","PI":"PI","POWER":"POTENZ","PRODUCT":"PRODUKT","QUOTIENT":"QUOTIENT","RADIANS":"BOGENMASS","RAND":"ZUFALLSZAHL","RANDBETWEEN":"ZUFALLSBEREICH","ROMAN":"RÖMISCH","ROUND":"RUNDEN","ROUNDDOWN":"ABRUNDEN","ROUNDUP":"AUFRUNDEN","SERIESSUM":"POTENZREIHE","SIGN":"VORZEICHEN","SIN":"SIN","SINH":"SINHYP","SQRT":"WURZEL","SQRTPI":"WURZELPI","SUBTOTAL":"TEILERGEBNIS","SUM":"SUMME","SUMIF":"SUMMEWENN","SUMIFS":"SUMMEWENNS","SUMPRODUCT":"SUMMENPRODUKT","SUMSQ":"QUADRATESUMME","SUMX2MY2":"SUMMEX2MY2","SUMX2PY2":"SUMMEX2PY2","SUMXMY2":"SUMMEXMY2","TAN":"TAN","TANH":"TANHYP","TRUNC":"KÜRZEN","ADDRESS":"ADRESSE","CHOOSE":"WAHL","COLUMN":"SPALTE","COLUMNS":"SPALTEN","HLOOKUP":"WVERWEIS","INDEX":"INDEX","INDIRECT":"INDIREKT","LOOKUP":"VERWEIS","MATCH":"VERGLEICH","OFFSET":"BEREICH.VERSCHIEBEN","ROW":"ZEILE","ROWS":"ZEILEN","TRANSPOSE":"MTRANS","VLOOKUP":"SVERWEIS","ERROR.TYPE":"FEHLER.TYP","ISBLANK":"ISTLEER","ISERR":"ISTFEHL","ISERROR":"ISTFEHLER","ISEVEN":"ISTGERADE","ISLOGICAL":"ISTLOG","ISNA":"ISTNV","ISNONTEXT":"ISTKTEXT","ISNUMBER":"ISTZAHL","ISODD":"ISTUNGERADE","ISREF":"ISTBEZUG","ISTEXT":"ISTTEXT","N":"N","NA":"NV","TYPE":"TYP","AND":"UND","FALSE":"FALSCH","IF":"WENN","IFERROR":"WENNFEHLER","NOT":"NICHT","OR":"ODER","TRUE":"WAHR","LocalFormulaOperands":{"StructureTables":{"h": "Kopfzeilen","d": "Daten","a": "Alle","tr": "Diese Zeile","t": "Ergebnisse"},"CONST_TRUE_FALSE":{"t":"WAHR","f":"FALSCH"},"CONST_ERROR":{"nil":"#NULL!","div":"#DIV\/0!","value":"#WERT!","ref":"#BEZUG!","name":"#NAME\\?","num":"#ZAHL!","na":"#NV","getdata":"#DATEN_ABRUFEN","uf":"#UNSUPPORTED_FUNCTION!"}}} \ No newline at end of file +{"DATE":"DATUM","DATEDIF":"DATEDIF","DATEVALUE":"DATWERT","DAY":"TAG","DAYS360":"TAGE360","EDATE":"EDATUM","EOMONTH":"MONATSENDE","HOUR":"STUNDE","MINUTE":"MINUTE","MONTH":"MONAT","NETWORKDAYS":"NETTOARBEITSTAGE","NOW":"JETZT","SECOND":"SEKUNDE","TIME":"ZEIT","TIMEVALUE":"ZEITWERT","TODAY":"HEUTE","WEEKDAY":"WOCHENTAG","WEEKNUM":"KALENDERWOCHE","WORKDAY":"ARBEITSTAG","YEAR":"JAHR","YEARFRAC":"BRTEILJAHRE","BIN2DEC":"BININDEZ","BIN2HEX":"BININHEX","BIN2OCT":"BININOKT","COMPLEX":"KOMPLEXE","DEC2BIN":"DEZINBIN","DEC2HEX":"DEZINHEX","DEC2OCT":"DEZINOKT","DELTA":"DELTA","ERF":"GAUSSFEHLER","ERFC":"GAUSSFKOMPL","GESTEP":"GGANZZAHL","HEX2BIN":"HEXINBIN","HEX2DEC":"HEXINDEZ","HEX2OCT":"HEXINOKT","IMABS":"IMABS","IMAGINARY":"IMAGINÄRTEIL","IMARGUMENT":"IMARGUMENT","IMCONJUGATE":"IMKONJUGIERTE","IMCOS":"IMCOS","IMCOSH":"IMCOSH","IMCOT":"IMCOT","IMCSC":"IMCOSEC","IMCSCH":"IMCOSECHYP","IMDIV":"IMDIV","IMEXP":"IMEXP","IMLN":"IMLN","IMLOG10":"IMLOG10","IMLOG2":"IMLOG2","IMPOWER":"IMAPOTENZ","IMPRODUCT":"IMPRODUKT","IMREAL":"IMREALTEIL","IMSEC":"IMSEC","IMSECH":"IMSECHYP","IMSIN":"IMSIN","IMSINH":"IMSINHYP","IMSQRT":"IMWURZEL","IMSUB":"IMSUB","IMSUM":"IMSUMME","IMTAN":"IMTAN","OCT2BIN":"OKTINBIN","OCT2DEC":"OKTINDEZ","OCT2HEX":"OKTINHEX","CHAR":"ZEICHEN","CLEAN":"SÄUBERN","CODE":"CODE","CONCATENATE":"VERKETTEN","DOLLAR":"DM","EXACT":"IDENTISCH","FIND":"FINDEN","FINDB":"FINDENB","FIXED":"FEST","LEFT":"LINKS","LEFTB":"LINKSB","LEN":"LÄNGE","LENB":"LENB","LOWER":"KLEIN","MID":"TEIL","MIDB":"TEILB","PROPER":"GROSS2","REPLACE":"ERSETZEN","REPLACEB":"ERSETZENB","REPT":"WIEDERHOLEN","RIGHT":"RECHTS","RIGHTB":"RECHTSB","SEARCH":"SUCHEN","SEARCHB":"SUCHENB","SUBSTITUTE":"WECHSELN","T":"T","TEXT":"TEXT","TRIM":"GLÄTTEN","UPPER":"GROSS","VALUE":"WERT","AVEDEV":"MITTELABW","AVERAGE":"MITTELWERT","AVERAGEA":"MITTELWERTA","AVERAGEIF":"MITTELWERTWENN","AVERAGEIFS":"MITTELWERTWENNS","BINOMDIST":"BINOMVERT","CONFIDENCE":"KONFIDENZ","CORREL":"KORREL","COUNT":"ANZAHL","COUNTA":"ANZAHL2","COUNTBLANK":"ANZAHLLEEREZELLEN","COUNTIF":"ZÄHLENWENN","COUNTIFS":"ZÄHLENWENNS","COVAR":"KOVAR","CRITBINOM":"KRITBINOM","DEVSQ":"SUMQUADABW","EXPONDIST":"EXPONVERT","FISHER":"FISHER","FISHERINV":"FISHERINV","FORECAST":"SCHÄTZER","FREQUENCY":"HÄUFIGKEIT","GAMMALN":"GAMMALN","GEOMEAN":"GEOMITTEL","HARMEAN":"HARMITTEL","HYPGEOMDIST":"HYPGEOMVERT","INTERCEPT":"ACHSENABSCHNITT","KURT":"KURT","LARGE":"KGRÖSSTE","LOGINV":"LOGINV","LOGNORMDIST":"LOGNORMVERT","MAX":"MAX","MAXA":"MAXA","MEDIAN":"MEDIAN","MIN":"MIN","MINA":"MINA","MODE":"MODALWERT","NEGBINOMDIST":"NEGBINOMVERT","NORMDIST":"NORMVERT","NORMINV":"NORMINV","NORMSDIST":"STANDNORMVERT","NORMSINV":"STANDNORMINV","PEARSON":"PEARSON","PERCENTILE":"QUANTIL","PERCENTRANK":"QUANTILSRANG","PERMUT":"VARIATIONEN","POISSON":"POISSON","PROB":"WAHRSCHBEREICH","QUARTILE":"QUARTILE","RSQ":"BESTIMMTHEITSMASS","SKEW":"SCHIEFE","SLOPE":"STEIGUNG","SMALL":"KKLEINSTE","STANDARDIZE":"STANDARDISIERUNG","STDEV":"STABW","STDEVA":"STABWA","STDEVP":"STABWN","STDEVPA":"STABWNA","STEYX":"STFEHLERYX","VAR":"VARIANZ","VARA":"VARIANZA","VARP":"VARIANZEN","VARPA":"VARIANZENA","ACCRINT":"AUFGELZINS","ACCRINTM":"AUFGELZINSF","AMORDEGRC":"AMORDEGRK","AMORLINC":"AMORLINEARK","COUPDAYBS":"ZINSTERMTAGVA","COUPDAYS":"ZINSTERMTAGE","COUPDAYSNC":"ZINSTERMTAGNZ","COUPNCD":"ZINSTERMNZ","COUPNUM":"ZINSTERMZAHL","COUPPCD":"ZINSTERMVZ","CUMIPMT":"KUMZINSZ","CUMPRINC":"KUMKAPITAL","DB":"GDA2","DDB":"GDA","DISC":"DISAGIO","DOLLARDE":"NOTIERUNGDEZ","DOLLARFR":"NOTIERUNGBRU","DURATION":"DURATIONТ","EFFECT":"EFFEKTIV","FV":"ZW","FVSCHEDULE":"ZW2","INTRATE":"ZINSSATZ","IPMT":"ZINSZ","IRR":"IKV","ISPMT":"ISPMT","MDURATION":"MDURATION","MIRR":"QIKV","NOMINAL":"NOMINAL","NPER":"ZZR","NPV":"NBW","ODDFPRICE":"UNREGER.KURS","ODDFYIELD":"UNREGER.REND","ODDLPRICE":"UNREGLE.KURS","ODDLYIELD":"UNREGLE.REND","PMT":"RMZ","PPMT":"KAPZ","PRICE":"KURS","PRICEDISC":"KURSDISAGIO","PRICEMAT":"KURSFÄLLIG","PV":"BW","RATE":"ZINS","RECEIVED":"AUSZAHLUNG","SLN":"LIA","SYD":"DIA","TBILLEQ":"TBILLÄQUIV","TBILLPRICE":"TBILLKURS","TBILLYIELD":"TBILLRENDITE","VDB":"VDB","XIRR":"XINTZINSFUSS","XNPV":"XKAPITALWERT","YIELD":"RENDITE","YIELDDISC":"RENDITEDIS","YIELDMAT":"RENDITEFÄLL","ABS":"ABS","ACOS":"ARCCOS","ACOSH":"ARCCOSHYP","ACOT":"ARCCOT","ACOTH":"ARCCOTHYP","ARABIC":"ARABISCH","ASIN":"ARCSIN","ASINH":"ARCSINHYP","ATAN":"ARCTAN","ATAN2":"ARCTAN2","ATANH":"ARCTANHYP","BASE":"BASE","CEILING":"OBERGRENZE","CEILING.MATH":"OBERGRENZE.MATHEMATIK","CEILING.PRECISE":"OBERGRENZE.GENAU","COMBIN":"KOMBINATIONEN","COMBINA":"KOMBINATIONEN2","COS":"COS","COSH":"COSHYP","COT":"COT","COTH":"COTHYP","CSC":"COSEC","CSCH":"COSECHYP","DECIMAL":"DEZIMAL","DEGREES":"GRAD","EVEN":"GERADE","EXP":"EXP","FACT":"FAKULTÄT","FACTDOUBLE":"ZWEIFAKULTÄT","FLOOR":"UNTERGRENZE","FLOOR.PRECISE":"UNTERGRENZE.GENAU","FLOOR.MATH":"UNTERGRENZE.MATHEMATIK","GCD":"GGT","INT":"GANZZAHL","ISO.CEILING":"ISO.OBERGRENZE","LCM":"KGV","LN":"LN","LOG":"LOG","LOG10":"LOG10","MDETERM":"MDET","MINVERSE":"MINV","MMULT":"MMULT","MOD":"REST","MROUND":"VRUNDEN","MULTINOMIAL":"POLYNOMIAL","ODD":"UNGERADE","PI":"PI","POWER":"POTENZ","PRODUCT":"PRODUKT","QUOTIENT":"QUOTIENT","RADIANS":"BOGENMASS","RAND":"ZUFALLSZAHL","RANDBETWEEN":"ZUFALLSBEREICH","ROMAN":"RÖMISCH","ROUND":"RUNDEN","ROUNDDOWN":"ABRUNDEN","ROUNDUP":"AUFRUNDEN","SEC":"SEC","SECH":"SECHYP","SERIESSUM":"POTENZREIHE","SIGN":"VORZEICHEN","SIN":"SIN","SINH":"SINHYP","SQRT":"WURZEL","SQRTPI":"WURZELPI","SUBTOTAL":"TEILERGEBNIS","SUM":"SUMME","SUMIF":"SUMMEWENN","SUMIFS":"SUMMEWENNS","SUMPRODUCT":"SUMMENPRODUKT","SUMSQ":"QUADRATESUMME","SUMX2MY2":"SUMMEX2MY2","SUMX2PY2":"SUMMEX2PY2","SUMXMY2":"SUMMEXMY2","TAN":"TAN","TANH":"TANHYP","TRUNC":"KÜRZEN","ADDRESS":"ADRESSE","CHOOSE":"WAHL","COLUMN":"SPALTE","COLUMNS":"SPALTEN","HLOOKUP":"WVERWEIS","INDEX":"INDEX","INDIRECT":"INDIREKT","LOOKUP":"VERWEIS","MATCH":"VERGLEICH","OFFSET":"BEREICH.VERSCHIEBEN","ROW":"ZEILE","ROWS":"ZEILEN","TRANSPOSE":"MTRANS","VLOOKUP":"SVERWEIS","ERROR.TYPE":"FEHLER.TYP","ISBLANK":"ISTLEER","ISERR":"ISTFEHL","ISERROR":"ISTFEHLER","ISEVEN":"ISTGERADE","ISLOGICAL":"ISTLOG","ISNA":"ISTNV","ISNONTEXT":"ISTKTEXT","ISNUMBER":"ISTZAHL","ISODD":"ISTUNGERADE","ISREF":"ISTBEZUG","ISTEXT":"ISTTEXT","N":"N","NA":"NV","TYPE":"TYP","AND":"UND","FALSE":"FALSCH","IF":"WENN","IFERROR":"WENNFEHLER","NOT":"NICHT","OR":"ODER","TRUE":"WAHR","LocalFormulaOperands":{"StructureTables":{"h":"Kopfzeilen","d":"Daten","a":"Alle","tr":"Diese Zeile","t":"Ergebnisse"},"CONST_TRUE_FALSE":{"t":"WAHR","f":"FALSCH"},"CONST_ERROR":{"nil":"#NULL!","div":"#DIV/0!","value":"#WERT!","ref":"#BEZUG!","name":"#NAME\\?","num":"#ZAHL!","na":"#NV","getdata":"#DATEN_ABRUFEN","uf":"#UNSUPPORTED_FUNCTION!"}}} \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/resources/formula-lang/en.json b/apps/spreadsheeteditor/main/resources/formula-lang/en.json index 096586346..412dbbf0e 100644 --- a/apps/spreadsheeteditor/main/resources/formula-lang/en.json +++ b/apps/spreadsheeteditor/main/resources/formula-lang/en.json @@ -1 +1 @@ -{"DATE":"DATE","DATEDIF":"DATEDIF","DATEVALUE":"DATEVALUE","DAY":"DAY","DAYS360":"DAYS360","EDATE":"EDATE","EOMONTH":"EOMONTH","HOUR":"HOUR","MINUTE":"MINUTE","MONTH":"MONTH","NETWORKDAYS":"NETWORKDAYS","NOW":"NOW","SECOND":"SECOND","TIME":"TIME","TIMEVALUE":"TIMEVALUE","TODAY":"TODAY","WEEKDAY":"WEEKDAY","WEEKNUM":"WEEKNUM","WORKDAY":"WORKDAY","YEAR":"YEAR","YEARFRAC":"YEARFRAC","BIN2DEC":"BIN2DEC","BIN2HEX":"BIN2HEX","BIN2OCT":"BIN2OCT","COMPLEX":"COMPLEX","DEC2BIN":"DEC2BIN","DEC2HEX":"DEC2HEX","DEC2OCT":"DEC2OCT","DELTA":"DELTA","ERF":"ERF","ERFC":"ERFC","GESTEP":"GESTEP","HEX2BIN":"HEX2BIN","HEX2DEC":"HEX2DEC","HEX2OCT":"HEX2OCT","IMABS":"IMABS","IMAGINARY":"IMAGINARY","IMARGUMENT":"IMARGUMENT","IMCONJUGATE":"IMCONJUGATE","IMCOS":"IMCOS","IMDIV":"IMDIV","IMEXP":"IMEXP","IMLN":"IMLN","IMLOG10":"IMLOG10","IMLOG2":"IMLOG2","IMPOWER":"IMPOWER","IMPRODUCT":"IMPRODUCT","IMREAL":"IMREAL","IMSIN":"IMSIN","IMSQRT":"IMSQRT","IMSUB":"IMSUB","IMSUM":"IMSUM","OCT2BIN":"OCT2BIN","OCT2DEC":"OCT2DEC","OCT2HEX":"OCT2HEX","CHAR":"CHAR","CLEAN":"CLEAN","CODE":"CODE","CONCATENATE":"CONCATENATE","DOLLAR":"DOLLAR","EXACT":"EXACT","FIND":"FIND","FINDB":"FINDB","FIXED":"FIXED","LEFT":"LEFT","LEFTB":"LEFTB","LEN":"LEN","LENB":"LENB","LOWER":"LOWER","MID":"MID","MIDB":"MIDB","PROPER":"PROPER","REPLACE":"REPLACE","REPLACEB":"REPLACEB","REPT":"REPT","RIGHT":"RIGHT","RIGHTB":"RIGHTB","SEARCH":"SEARCH","SEARCHB":"SEARCHB","SUBSTITUTE":"SUBSTITUTE","T":"Т","TEXT":"TEXT","TRIM":"TRIM","UPPER":"UPPER","VALUE":"VALUE","AVEDEV":"AVEDEV","AVERAGE":"AVERAGE","AVERAGEA":"AVERAGEA","AVERAGEIF":"AVERAGEIF","AVERAGEIFS":"AVERAGEIFS","BINOMDIST":"BINOMDIST","CONFIDENCE":"CONFIDENCE","CORREL":"CORREL","COUNT":"COUNT","COUNTA":"COUNTA","COUNTBLANK":"COUNTBLANK","COUNTIF":"COUNTIF","COUNTIFS":"COUNTIFS","COVAR":"COVAR","CRITBINOM":"CRITBINOM","DEVSQ":"DEVSQ","EXPONDIST":"EXPONDIST","FISHER":"FISHER","FISHERINV":"FISHERINV","FORECAST":"FORECAST","FREQUENCY":"FREQUENCY","GAMMALN":"GAMMALN","GEOMEAN":"GEOMEAN","HARMEAN":"HARMEAN","HYPGEOMDIST":"HYPGEOMDIST","INTERCEPT":"INTERCEPT","KURT":"KURT","LARGE":"LARGE","LOGINV":"LOGINV","LOGNORMDIST":"LOGNORMDIST","MAX":"MAX","MAXA":"MAXA","MEDIAN":"MEDIAN","MIN":"MIN","MINA":"MINA","MODE":"MODE","NEGBINOMDIST":"NEGBINOMDIST","NORMDIST":"NORMDIST","NORMINV":"NORMINV","NORMSDIST":"NORMSDIST","NORMSINV":"NORMSINV","PEARSON":"PEARSON","PERCENTILE":"PERCENTILE","PERCENTRANK":"PERCENTRANK","PERMUT":"PERMUT","POISSON":"POISSON","PROB":"PROB","QUARTILE":"QUARTILE","RSQ":"RSQ","SKEW":"SKEW","SLOPE":"SLOPE","SMALL":"SMALL","STANDARDIZE":"STANDARDIZE","STDEV":"STDEV","STDEVA":"STDEVA","STDEVP":"STDEVP","STDEVPA":"STDEVPA","STEYX":"STEYX","VAR":"VAR","VARA":"VARA","VARP":"VARP","VARPA":"VARPA","ACCRINT":"ACCRINT","ACCRINTM":"ACCRINTM","AMORDEGRC":"AMORDEGRC","AMORLINC":"AMORLINC","COUPDAYBS":"COUPDAYBS","COUPDAYS":"COUPDAYS","COUPDAYSNC":"COUPDAYSNC","COUPNCD":"COUPNCD","COUPNUM":"COUPNUM","COUPPCD":"COUPPCD","CUMIPMT":"CUMIPMT","CUMPRINC":"CUMPRINC","DB":"DB","DDB":"DDB","DISC":"DISC","DOLLARDE":"DOLLARDE","DOLLARFR":"DOLLARFR","DURATION":"DURATION","EFFECT":"EFFECT","FV":"FV","FVSCHEDULE":"FVSCHEDULE","INTRATE":"INTRATE","IPMT":"IPMT","IRR":"IRR","ISPMT":"ISPMT","MDURATION":"MDURATION","MIRR":"MIRR","NOMINAL":"NOMINAL","NPER":"NPER","NPV":"NPV","ODDFPRICE":"ODDFPRICE","ODDFYIELD":"ODDFYIELD","ODDLPRICE":"ODDLPRICE","ODDLYIELD":"ODDLYIELD","PMT":"PMT","PPMT":"PPMT","PRICE":"PRICE","PRICEDISC":"PRICEDISC","PRICEMAT":"PRICEMAT","PV":"PV","RATE":"RATE","RECEIVED":"RECEIVED","SLN":"SLN","SYD":"SYD","TBILLEQ":"TBILLEQ","TBILLPRICE":"TBILLPRICE","TBILLYIELD":"TBILLYIELD","VDB":"VDB","XIRR":"XIRR","XNPV":"XNPV","YIELD":"YIELD","YIELDDISC":"YIELDDISC","YIELDMAT":"YIELDMAT","ABS":"ABS","ACOS":"ACOS","ACOSH":"ACOSH","ASIN":"ASIN","ASINH":"ASINH","ATAN":"ATAN","ATAN2":"ATAN2","ATANH":"ATANH","CEILING":"CEILING","COMBIN":"COMBIN","COS":"COS","COSH":"COSH","DEGREES":"DEGREES","EVEN":"EVEN","EXP":"EXP","FACT":"FACT","FACTDOUBLE":"FACTDOUBLE","FLOOR":"FLOOR","GCD":"GCD","INT":"INT","LCM":"LCM","LN":"LN","LOG":"LOG","LOG10":"LOG10","MDETERM":"MDETERM","MINVERSE":"MINVERSE","MMULT":"MMULT","MOD":"MOD","MROUND":"MROUND","MULTINOMIAL":"MULTINOMIAL","ODD":"ODD","PI":"PI","POWER":"POWER","PRODUCT":"PRODUCT","QUOTIENT":"QUOTIENT","RADIANS":"RADIANS","RAND":"RAND","RANDBETWEEN":"RANDBETWEEN","ROMAN":"ROMAN","ROUND":"ROUND","ROUNDDOWN":"ROUNDDOWN","ROUNDUP":"ROUNDUP","SERIESSUM":"SERIESSUM","SIGN":"SIGN","SIN":"SIN","SINH":"SINH","SQRT":"SQRT","SQRTPI":"SQRTPI","SUBTOTAL":"SUBTOTAL","SUM":"SUM","SUMIF":"SUMIF","SUMIFS":"SUMIFS","SUMPRODUCT":"SUMPRODUCT","SUMSQ":"SUMSQ","SUMX2MY2":"SUMX2MY2","SUMX2PY2":"SUMX2PY2","SUMXMY2":"SUMXMY2","TAN":"TAN","TANH":"TANH","TRUNC":"TRUNC","ADDRESS":"ADDRESS","CHOOSE":"CHOOSE","COLUMN":"COLUMN","COLUMNS":"COLUMNS","HLOOKUP":"HLOOKUP","INDEX":"INDEX","INDIRECT":"INDIRECT","LOOKUP":"LOOKUP","MATCH":"MATCH","OFFSET":"OFFSET","ROW":"ROW","ROWS":"ROWS","TRANSPOSE":"TRANSPOSE","VLOOKUP":"VLOOKUP","ERROR.TYPE":"ERROR.TYPE","ISBLANK":"ISBLANK","ISERR":"ISERR","ISERROR":"ISERROR","ISEVEN":"ISEVEN","ISLOGICAL":"ISLOGICAL","ISNA":"ISNA","ISNONTEXT":"ISNONTEXT","ISNUMBER":"ISNUMBER","ISODD":"ISODD","ISREF":"ISREF","ISTEXT":"ISTEXT","N":"N","NA":"NA","TYPE":"TYPE","AND":"AND","FALSE":"FALSE","IF":"IF","IFERROR":"IFERROR","NOT":"NOT","OR":"OR","TRUE":"TRUE","LocalFormulaOperands":{"StructureTables":{"h": "Headers","d": "Data","a": "All","tr": "This row","t": "Totals"},"CONST_TRUE_FALSE":{"t":"TRUE","f":"FALSE"},"CONST_ERROR":{"nil":"#NULL!","div":"#DIV\/0!","value":"#VALUE!","ref":"#REF!","name":"#NAME\\?","num":"#NUM!","na":"#N\/A","getdata":"#GETTING_DATA","uf":"#UNSUPPORTED_FUNCTION!"}}} \ No newline at end of file +{"DATE":"DATE","DATEDIF":"DATEDIF","DATEVALUE":"DATEVALUE","DAY":"DAY","DAYS360":"DAYS360","EDATE":"EDATE","EOMONTH":"EOMONTH","HOUR":"HOUR","MINUTE":"MINUTE","MONTH":"MONTH","NETWORKDAYS":"NETWORKDAYS","NOW":"NOW","SECOND":"SECOND","TIME":"TIME","TIMEVALUE":"TIMEVALUE","TODAY":"TODAY","WEEKDAY":"WEEKDAY","WEEKNUM":"WEEKNUM","WORKDAY":"WORKDAY","YEAR":"YEAR","YEARFRAC":"YEARFRAC","BIN2DEC":"BIN2DEC","BIN2HEX":"BIN2HEX","BIN2OCT":"BIN2OCT","COMPLEX":"COMPLEX","DEC2BIN":"DEC2BIN","DEC2HEX":"DEC2HEX","DEC2OCT":"DEC2OCT","DELTA":"DELTA","ERF":"ERF","ERFC":"ERFC","GESTEP":"GESTEP","HEX2BIN":"HEX2BIN","HEX2DEC":"HEX2DEC","HEX2OCT":"HEX2OCT","IMABS":"IMABS","IMAGINARY":"IMAGINARY","IMARGUMENT":"IMARGUMENT","IMCONJUGATE":"IMCONJUGATE","IMCOS":"IMCOS","IMCOSH":"IMCOSH","IMCOT":"IMCOT","IMCSC":"IMCSC","IMCSCH":"IMCSCH","IMDIV":"IMDIV","IMEXP":"IMEXP","IMLN":"IMLN","IMLOG10":"IMLOG10","IMLOG2":"IMLOG2","IMPOWER":"IMPOWER","IMPRODUCT":"IMPRODUCT","IMREAL":"IMREAL","IMSEC":"IMSEC","IMSECH":"IMSECH","IMSIN":"IMSIN","IMSINH":"IMSINH","IMSQRT":"IMSQRT","IMSUB":"IMSUB","IMSUM":"IMSUM","IMTAN":"IMTAN","OCT2BIN":"OCT2BIN","OCT2DEC":"OCT2DEC","OCT2HEX":"OCT2HEX","CHAR":"CHAR","CLEAN":"CLEAN","CODE":"CODE","CONCATENATE":"CONCATENATE","DOLLAR":"DOLLAR","EXACT":"EXACT","FIND":"FIND","FINDB":"FINDB","FIXED":"FIXED","LEFT":"LEFT","LEFTB":"LEFTB","LEN":"LEN","LENB":"LENB","LOWER":"LOWER","MID":"MID","MIDB":"MIDB","PROPER":"PROPER","REPLACE":"REPLACE","REPLACEB":"REPLACEB","REPT":"REPT","RIGHT":"RIGHT","RIGHTB":"RIGHTB","SEARCH":"SEARCH","SEARCHB":"SEARCHB","SUBSTITUTE":"SUBSTITUTE","T":"Т","TEXT":"TEXT","TRIM":"TRIM","UPPER":"UPPER","VALUE":"VALUE","AVEDEV":"AVEDEV","AVERAGE":"AVERAGE","AVERAGEA":"AVERAGEA","AVERAGEIF":"AVERAGEIF","AVERAGEIFS":"AVERAGEIFS","BINOMDIST":"BINOMDIST","CONFIDENCE":"CONFIDENCE","CORREL":"CORREL","COUNT":"COUNT","COUNTA":"COUNTA","COUNTBLANK":"COUNTBLANK","COUNTIF":"COUNTIF","COUNTIFS":"COUNTIFS","COVAR":"COVAR","CRITBINOM":"CRITBINOM","DEVSQ":"DEVSQ","EXPONDIST":"EXPONDIST","FISHER":"FISHER","FISHERINV":"FISHERINV","FORECAST":"FORECAST","FREQUENCY":"FREQUENCY","GAMMALN":"GAMMALN","GEOMEAN":"GEOMEAN","HARMEAN":"HARMEAN","HYPGEOMDIST":"HYPGEOMDIST","INTERCEPT":"INTERCEPT","KURT":"KURT","LARGE":"LARGE","LOGINV":"LOGINV","LOGNORMDIST":"LOGNORMDIST","MAX":"MAX","MAXA":"MAXA","MEDIAN":"MEDIAN","MIN":"MIN","MINA":"MINA","MODE":"MODE","NEGBINOMDIST":"NEGBINOMDIST","NORMDIST":"NORMDIST","NORMINV":"NORMINV","NORMSDIST":"NORMSDIST","NORMSINV":"NORMSINV","PEARSON":"PEARSON","PERCENTILE":"PERCENTILE","PERCENTRANK":"PERCENTRANK","PERMUT":"PERMUT","POISSON":"POISSON","PROB":"PROB","QUARTILE":"QUARTILE","RSQ":"RSQ","SKEW":"SKEW","SLOPE":"SLOPE","SMALL":"SMALL","STANDARDIZE":"STANDARDIZE","STDEV":"STDEV","STDEVA":"STDEVA","STDEVP":"STDEVP","STDEVPA":"STDEVPA","STEYX":"STEYX","VAR":"VAR","VARA":"VARA","VARP":"VARP","VARPA":"VARPA","ACCRINT":"ACCRINT","ACCRINTM":"ACCRINTM","AMORDEGRC":"AMORDEGRC","AMORLINC":"AMORLINC","COUPDAYBS":"COUPDAYBS","COUPDAYS":"COUPDAYS","COUPDAYSNC":"COUPDAYSNC","COUPNCD":"COUPNCD","COUPNUM":"COUPNUM","COUPPCD":"COUPPCD","CUMIPMT":"CUMIPMT","CUMPRINC":"CUMPRINC","DB":"DB","DDB":"DDB","DISC":"DISC","DOLLARDE":"DOLLARDE","DOLLARFR":"DOLLARFR","DURATION":"DURATION","EFFECT":"EFFECT","FV":"FV","FVSCHEDULE":"FVSCHEDULE","INTRATE":"INTRATE","IPMT":"IPMT","IRR":"IRR","ISPMT":"ISPMT","MDURATION":"MDURATION","MIRR":"MIRR","NOMINAL":"NOMINAL","NPER":"NPER","NPV":"NPV","ODDFPRICE":"ODDFPRICE","ODDFYIELD":"ODDFYIELD","ODDLPRICE":"ODDLPRICE","ODDLYIELD":"ODDLYIELD","PMT":"PMT","PPMT":"PPMT","PRICE":"PRICE","PRICEDISC":"PRICEDISC","PRICEMAT":"PRICEMAT","PV":"PV","RATE":"RATE","RECEIVED":"RECEIVED","SLN":"SLN","SYD":"SYD","TBILLEQ":"TBILLEQ","TBILLPRICE":"TBILLPRICE","TBILLYIELD":"TBILLYIELD","VDB":"VDB","XIRR":"XIRR","XNPV":"XNPV","YIELD":"YIELD","YIELDDISC":"YIELDDISC","YIELDMAT":"YIELDMAT","ABS":"ABS","ACOS":"ACOS","ACOSH":"ACOSH","ACOT":"ACOT","ACOTH":"ACOTH","ARABIC":"ARABIC","ASIN":"ASIN","ASINH":"ASINH","ATAN":"ATAN","ATAN2":"ATAN2","ATANH":"ATANH","BASE":"BASE","CEILING":"CEILING","CEILING.MATH":"CEILING.MATH","CEILING.PRECISE":"CEILING.PRESIZE","COMBIN":"COMBIN","COMBINA":"COMBINA","COS":"COS","COSH":"COSH","COT":"COT","COTH":"COTH","CSC":"CSC","CSCH":"CSCH","DECIMAL":"DECIMAL","DEGREES":"DEGREES","EVEN":"EVEN","EXP":"EXP","FACT":"FACT","FACTDOUBLE":"FACTDOUBLE","FLOOR":"FLOOR","FLOOR.PRECISE":"FLOOR.PRECISE","FLOOR.MATH":"FLOOR.MATH","GCD":"GCD","INT":"INT","ISO.CEILING":"ISO.CEILING","LCM":"LCM","LN":"LN","LOG":"LOG","LOG10":"LOG10","MDETERM":"MDETERM","MINVERSE":"MINVERSE","MMULT":"MMULT","MOD":"MOD","MROUND":"MROUND","MULTINOMIAL":"MULTINOMIAL","ODD":"ODD","PI":"PI","POWER":"POWER","PRODUCT":"PRODUCT","QUOTIENT":"QUOTIENT","RADIANS":"RADIANS","RAND":"RAND","RANDBETWEEN":"RANDBETWEEN","ROMAN":"ROMAN","ROUND":"ROUND","ROUNDDOWN":"ROUNDDOWN","ROUNDUP":"ROUNDUP","SEC":"SEC","SECH":"SECH","SERIESSUM":"SERIESSUM","SIGN":"SIGN","SIN":"SIN","SINH":"SINH","SQRT":"SQRT","SQRTPI":"SQRTPI","SUBTOTAL":"SUBTOTAL","SUM":"SUM","SUMIF":"SUMIF","SUMIFS":"SUMIFS","SUMPRODUCT":"SUMPRODUCT","SUMSQ":"SUMSQ","SUMX2MY2":"SUMX2MY2","SUMX2PY2":"SUMX2PY2","SUMXMY2":"SUMXMY2","TAN":"TAN","TANH":"TANH","TRUNC":"TRUNC","ADDRESS":"ADDRESS","CHOOSE":"CHOOSE","COLUMN":"COLUMN","COLUMNS":"COLUMNS","HLOOKUP":"HLOOKUP","INDEX":"INDEX","INDIRECT":"INDIRECT","LOOKUP":"LOOKUP","MATCH":"MATCH","OFFSET":"OFFSET","ROW":"ROW","ROWS":"ROWS","TRANSPOSE":"TRANSPOSE","VLOOKUP":"VLOOKUP","ERROR.TYPE":"ERROR.TYPE","ISBLANK":"ISBLANK","ISERR":"ISERR","ISERROR":"ISERROR","ISEVEN":"ISEVEN","ISLOGICAL":"ISLOGICAL","ISNA":"ISNA","ISNONTEXT":"ISNONTEXT","ISNUMBER":"ISNUMBER","ISODD":"ISODD","ISREF":"ISREF","ISTEXT":"ISTEXT","N":"N","NA":"NA","TYPE":"TYPE","AND":"AND","FALSE":"FALSE","IF":"IF","IFERROR":"IFERROR","NOT":"NOT","OR":"OR","TRUE":"TRUE","LocalFormulaOperands":{"StructureTables":{"h":"Headers","d":"Data","a":"All","tr":"This row","t":"Totals"},"CONST_TRUE_FALSE":{"t":"TRUE","f":"FALSE"},"CONST_ERROR":{"nil":"#NULL!","div":"#DIV/0!","value":"#VALUE!","ref":"#REF!","name":"#NAME\\?","num":"#NUM!","na":"#N/A","getdata":"#GETTING_DATA","uf":"#UNSUPPORTED_FUNCTION!"}}} \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/resources/formula-lang/en_desc.json b/apps/spreadsheeteditor/main/resources/formula-lang/en_desc.json index e504c1f25..1ebb9dd13 100644 --- a/apps/spreadsheeteditor/main/resources/formula-lang/en_desc.json +++ b/apps/spreadsheeteditor/main/resources/formula-lang/en_desc.json @@ -1 +1 @@ -{"DATE":{"a":"( year, month, day )","d":"Date and time function used to add dates in the default format MM/dd/yyyy"},"DATEDIF":{"a":"( start-date , end-date , unit )","d":"Date and time function used to return the difference between two date values (start date and end date), based on the interval (unit) specified"},"DATEVALUE":{"a":"( date-time-string )","d":"Date and time function used to return a serial number of the specified date"},"DAY":{"a":"( date-value )","d":"Date and time function which returns the day (a number from 1 to 31) of the date given in the numerical format (MM/dd/yyyy by default)"},"DAYS360":{"a":"( start-date , end-date [ , method-flag ] )","d":"Date and time function used to return the number of days between two dates (start-date and end-date) based on a 360-day year using one of the calculation method (US or European)"},"EDATE":{"a":"( start-date , month-offset )","d":"Date and time function used to return the serial number of the date which comes the indicated number of months (month-offset) before or after the specified date (start-date)"},"EOMONTH":{"a":"( start-date , month-offset )","d":"Date and time function used to return the serial number of the last day of the month that comes the indicated number of months before or after the specified start date"},"HOUR":{"a":"( time-value )","d":"Date and time function which returns the hour (a number from 0 to 23) of the time value"},"MINUTE":{"a":"( time-value )","d":"Date and time function which returns the minute (a number from 0 to 59) of the time value"},"MONTH":{"a":"( date-value )","d":"Date and time function which returns the month (a number from 1 to 12) of the date given in the numerical format (MM/dd/yyyy by default)"},"NETWORKDAYS":{"a":"( start-date , end-date [ , holidays ] )","d":"Date and time function used to return the number of the work days between two dates (start date and end-date) excluding weekends and dates considered as holidays"},"NOW":{"a":"()","d":""},"SECOND":{"a":"( time-value )","d":"Date and time function which returns the second (a number from 0 to 59) of the time value"},"TIME":{"a":"( hour, minute, second )","d":"Date and time function used to add a particular time in the selected format (hh:mm tt by default)"},"TIMEVALUE":{"a":"( date-time-string )","d":"Date and time function used to return the serial number of a time"},"TODAY":{"a":"()","d":"Date and time function used to add the current day in the following format MM/dd/yy. This function does not require an argument"},"WEEKDAY":{"a":"( serial-value [ , weekday-start-flag ] )","d":"Date and time function used to determine which day of the week the specified date is"},"WEEKNUM":{"a":"( serial-value [ , weekday-start-flag ] )","d":"date and time functions. It used to return the number of the week the specified date falls within the year"},"WORKDAY":{"a":"( start-date , day-offset [ , holidays ] )","d":"Date and time function used to return the date which comes the indicated number of days (day-offset) before or after the specified start date excluding weekends and dates considered as holidays"},"YEAR":{"a":"( date-value )","d":"Date and time function which returns the year (a number from 1900 to 9999) of the date given in the numerical format (MM/dd/yyyy by default)"},"YEARFRAC":{"a":"( start-date , end-date [ , basis ] )","d":"Date and time function used to return the fraction of a year represented by the number of whole days from start-date to end-date calculated on the specified basis"},"BIN2DEC":{"a":"( number )","d":"Engineering function used to convert a binary number into a decimal number"},"BIN2HEX":{"a":"( number [ , num-hex-digits ] )","d":"Engineering function used to convert a binary number into a hexadecimal number"},"BIN2OCT":{"a":"( number [ , num-hex-digits ] )","d":"Engineering function used to convert a binary number into an octal number"},"COMPLEX":{"a":"( real-number , imaginary-number [ , suffix ] )","d":"Engineering function used to convert a real part and an imaginary part into the complex number expressed in a + bi or a + bj form"},"DEC2BIN":{"a":"( number [ , num-hex-digits ] )","d":"Engineering function used to convert a decimal number into a binary number"},"DEC2HEX":{"a":"( number [ , num-hex-digits ] )","d":"Engineering function used to convert a decimal number into a hexadecimal number"},"DEC2OCT":{"a":"( number [ , num-hex-digits ] )","d":"Engineering function used to convert a decimal number into an octal number"},"DELTA":{"a":"( number-1 [ , number-2 ] )","d":"Engineering function used to test if two numbers are equal. The function returns 1 if the numbers are equal and 0 otherwise"},"ERF":{"a":"( lower-bound [ , upper-bound ] )","d":"Engineering function used to calculate the error function integrated between the specified lower and upper limits"},"ERFC":{"a":"( lower-bound )","d":"Engineering function used to calculate the complementary error function integrated between the specified lower limit and infinity"},"GESTEP":{"a":"( number [ , step ] )","d":"Engineering function used to test if a number is greater than a threshold value. The function returns 1 if the number is greater than or equal to the threshold value and 0 otherwise"},"HEX2BIN":{"a":"( number [ , num-hex-digits ] )","d":"Engineering function used to convert a hexadecimal number to a binary number"},"HEX2DEC":{"a":"( number )","d":"Engineering function used to convert a hexadecimal number into a decimal number"},"HEX2OCT":{"a":"( number [ , num-hex-digits ] )","d":"Engineering function used to convert a hexadecimal number to an octal number"},"IMABS":{"a":"( complex-number )","d":"Engineering function used to return the absolute value of a complex number"},"IMAGINARY":{"a":"( complex-number )","d":"Engineering function used to return the imaginary part of the specified complex number"},"IMARGUMENT":{"a":"( complex-number )","d":"Engineering function used to return the argument Theta, an angle expressed in radians"},"IMCONJUGATE":{"a":"( complex-number )","d":"Engineering function used to return the complex conjugate of a complex number"},"IMCOS":{"a":"( complex-number )","d":"Engineering function used to return the cosine of a complex number"},"IMDIV":{"a":"( complex-number-1 , complex-number-2 )","d":"Engineering function used to return the quotient of two complex numbers expressed in a + bi or a + bj form"},"IMEXP":{"a":"( complex-number )","d":"Engineering function used to return the e constant raised to the to the power specified by a complex number. The e constant is equal to 2,71828182845904"},"IMLN":{"a":"( complex-number )","d":"Engineering function used to return the natural logarithm of a complex number"},"IMLOG10":{"a":"( complex-number )","d":"Engineering function used to return the logarithm of a complex number to a base of 10"},"IMLOG2":{"a":"( complex-number )","d":"Engineering function used to return the logarithm of a complex number to a base of 2"},"IMPOWER":{"a":"( complex-number, power )","d":"Engineering function used to return the result of a complex number raised to the desired power"},"IMPRODUCT":{"a":"( argument-list )","d":"Engineering function used to return the product of the specified complex numbers"},"IMREAL":{"a":"( complex-number )","d":"Engineering function used to return the real part of the specified complex number"},"IMSIN":{"a":"( complex-number )","d":"Engineering function used to return the sine of a complex number"},"IMSQRT":{"a":"( complex-number )","d":"Engineering function used to return the square root of a complex number"},"IMSUB":{"a":"( complex-number-1 , complex-number-2 )","d":"Engineering function used to return the difference of two complex numbers expressed in a + bi or a + bj form"},"IMSUM":{"a":"( argument-list )","d":"Engineering function used to return the sum of the specified complex numbers"},"OCT2BIN":{"a":"( number [ , num-hex-digits ] )","d":"Engineering function used to convert an octal number to a binary number"},"OCT2DEC":{"a":"( number )","d":"Engineering function used to convert an octal number to a decimal number"},"OCT2HEX":{"a":"( number [ , num-hex-digits ] )","d":"Engineering function used to convert an octal number to a hexadecimal number"},"CHAR":{"a":"( number )","d":"Text and data function used to return the ASCII character specified by a number"},"CLEAN":{"a":"( string )","d":"Text and data function used to remove all the nonprintable characters from the selected string"},"CODE":{"a":"( string )","d":"Text and data function used to return the ASCII value of the specified character or the first character in a cell"},"CONCATENATE":{"a":"(text1, text2, ...)","d":"Text and data function used to combine the data from two or more cells into a single one"},"DOLLAR":{"a":"( number [ , num-decimal ] )","d":"Text and data function used to convert a number to text, using a currency format $#.##"},"EXACT":{"a":"(text1, text2)","d":"Text and data function used to compare data in two cells. The function returns TRUE if the data are the same, and FALSE if not"},"FIND":{"a":"( string-1 , string-2 [ , start-pos ] )","d":"Text and data function used to find the specified substring (string-1) within a string (string-2) and is intended for languages that use the single-byte character set (SBCS)"},"FINDB":{"a":"( string-1 , string-2 [ , start-pos ] )","d":"Text and data function used to find the specified substring (string-1) within a string (string-2) and is intended for languages the double-byte character set (DBCS) like Japanese, Chinese, Korean etc."},"FIXED":{"a":"( number [ , [ num-decimal ] [ , suppress-commas-flag ] ] )","d":"Text and data function used to return the text representation of a number rounded to a specified number of decimal places"},"LEFT":{"a":"( string [ , number-chars ] )","d":"Text and data function used to extract the substring from the specified string starting from the left character and is intended for languages that use the single-byte character set (SBCS)"},"LEFTB":{"a":"( string [ , number-chars ] )","d":"Text and data function used to extract the substring from the specified string starting from the left character and is intended for languages that use the double-byte character set (DBCS) like Japanese, Chinese, Korean etc."},"LEN":{"a":"( string )","d":"Text and data function used to analyse the specified string and return the number of characters it contains and is intended for languages that use the single-byte character set (SBCS)"},"LENB":{"a":"( string )","d":"Text and data function used to analyse the specified string and return the number of characters it contains and is intended for languages that use the double-byte character set (DBCS) like Japanese, Chinese, Korean etc."},"LOWER":{"a":"(text)","d":"Text and data function used to convert uppercase letters to lowercase in the selected cell"},"MID":{"a":"( string , start-pos , number-chars )","d":"Text and data function used to extract the characters from the specified string starting from any position and is intended for languages that use the single-byte character set (SBCS)"},"MIDB":{"a":"( string , start-pos , number-chars )","d":"Text and data function used to extract the characters from the specified string starting from any position and is intended for languages that use the double-byte character set (DBCS) like Japanese, Chinese, Korean etc."},"PROPER":{"a":"( string )","d":"Text and data function used to convert the first character of each word to uppercase and all the remaining characters to lowercase"},"REPLACE":{"a":"( string-1, start-pos, number-chars, string-2 )","d":"Text and data function used to replace a set of characters, based on the number of characters and the start position you specify, with a new set of characters and is intended for languages that use the single-byte character set (SBCS)"},"REPLACEB":{"a":"( string-1, start-pos, number-chars, string-2 )","d":"Text and data function used to replace a set of characters, based on the number of characters and the start position you specify, with a new set of characters and is intended for languages that use the double-byte character set (DBCS) like Japanese, Chinese, Korean etc."},"REPT":{"a":"(text, number_of_times)","d":"Text and data function used to repeat the data in the selected cell as many time as you wish"},"RIGHT":{"a":"( string [ , number-chars ] )","d":"Text and data function used to extract a substring from a string starting from the right-most character, based on the specified number of characters and is intended for languages that use the single-byte character set (SBCS)"},"RIGHTB":{"a":"( string [ , number-chars ] )","d":"Text and data function used to extract a substring from a string starting from the right-most character, based on the specified number of characters and is intended for languages that use the double-byte character set (DBCS) like Japanese, Chinese, Korean etc."},"SEARCH":{"a":"( string-1 , string-2 [ , start-pos ] )","d":"Text and data function used to return the location of the specified substring in a string and is intended for languages that use the single-byte character set (SBCS)"},"SEARCHB":{"a":"( string-1 , string-2 [ , start-pos ] )","d":"Text and data function used to return the location of the specified substring in a string and is intended for languages that use the double-byte character set (DBCS) like Japanese, Chinese, Korean etc."},"SUBSTITUTE":{"a":"( string , old-string , new-string [ , occurence ] )","d":"Text and data function used to replace a set of characters with a new one"},"T":{"a":"( value )","d":"Text and data function used to check whether the value in the cell (or used as argument) is text or not. In case it is not text, the function returns blank result. In case the value/argument is text, the function returns the same text value"},"TEXT":{"a":"( value , format )","d":"Text and data function used to convert a value to a text in the specified format"},"TRIM":{"a":"( string )","d":"Text and data function used to remove the leading and trailing spaces from a string"},"UPPER":{"a":"(text)","d":"Text and data function used to convert lowercase letters to uppercase in the selected cell"},"VALUE":{"a":"( string )","d":"Text and data function used to convert a text value that represents a number to a number. If the converted text is not a number, the function will return a #VALUE! error"},"AVEDEV":{"a":"( argument-list )","d":"Statistical function used to analyze the range of data and return the average of the absolute deviations of numbers from their mean"},"AVERAGE":{"a":"( argument-list )","d":"Statistical function used to analyze the range of data and find the average value"},"AVERAGEA":{"a":"( argument-list )","d":"Statistical function used to analyze the range of data including text and logical values and find the average value. The AVERAGEA function treats text and FALSE as a value of 0 and TRUE as a value of 1"},"AVERAGEIF":{"a":"( cell-range, selection-criteria [ , average-range ] )","d":"Statistical function used to analyze the range of data and find the average value of all numbers in a range of cells, based on the specified criterion"},"AVERAGEIFS":{"a":"( average-range, criteria-range-1, criteria-1 [ criteria-range-2, criteria-2 ], ... )","d":"Statistical function used to analyze the range of data and find the average value of all numbers in a range of cells, based on the multiple criterions"},"BINOMDIST":{"a":"( number-successes , number-trials , success-probability , cumulative-flag )","d":"Statistical function used to return the individual term binomial distribution probability"},"CONFIDENCE":{"a":"( alpha , standard-dev , size )","d":"Statistical function used to return the confidence interval"},"CORREL":{"a":"( array-1 , array-2 )","d":"Statistical function used to analyze the range of data and return the correlation coefficient of two range of cells"},"COUNT":{"a":"( argument-list )","d":"Statistical function used to count the number of the selected cells which contain numbers ignoring empty cells or those contaning text"},"COUNTA":{"a":"( argument-list )","d":"Statistical function used to analyze the range of cells and count the number of cells that are not empty"},"COUNTBLANK":{"a":"( argument-list )","d":"Statistical function used to analyze the range of cells and return the number of the empty cells"},"COUNTIF":{"a":"( cell-range, selection-criteria )","d":"Statistical function used to count the number of the selected cells based on the specified criterion"},"COUNTIFS":{"a":"( criteria-range-1, criteria-1, [ criteria-range-2, criteria-2 ], ... )","d":"Statistical function used to count the number of the selected cells based on the multiple criterions"},"COVAR":{"a":"( array-1 , array-2 )","d":"Statistical function used to return the covariance of two ranges of data"},"CRITBINOM":{"a":"( number-trials , success-probability , alpha )","d":"Statistical function used to return the smallest value for which the cumulative binomial distribution is greater than or equal to the specified alpha value"},"DEVSQ":{"a":"( argument-list )","d":"Statistical function used to analyze the range of data and sum the squares of the deviations of numbers from their mean"},"EXPONDIST":{"a":"( x , lambda , cumulative-flag )","d":"Statistical function used to return the exponential distribution"},"FISHER":{"a":"( number )","d":"Statistical function used to return the Fisher transformation of a number"},"FISHERINV":{"a":"( number )","d":"Statistical function used to perform the inverse of Fisher transformation"},"FORECAST":{"a":"( x , array-1 , array-2 )","d":"Statistical function used to predict a future value based on existing values provided"},"FREQUENCY":{"a":"( data-array , bins-array )","d":"Statistical function used to сalculate how often values occur within the selected range of cells and display the first value of the returned vertical array of numbers"},"GAMMALN":{"a":"(number)","d":"Statistical function used to return the natural logarithm of the gamma function"},"GEOMEAN":{"a":"( argument-list )","d":"Statistical function used to calculate the geometric mean of the argument list"},"HARMEAN":{"a":"( argument-list )","d":"Statistical function used to calculate the harmonic mean of the argument list"},"HYPGEOMDIST":{"a":"( sample-successes , number-sample , population-successes , number-population )","d":"Statistical function used to return the hypergeometric distribution, the probability of a given number of sample successes, given the sample size, population successes, and population size"},"INTERCEPT":{"a":"( array-1 , array-2 )","d":"Statistical function used to analyze the first array values and second array values to calculate the intersection point"},"KURT":{"a":"( argument-list )","d":"Statistical function used to return the kurtosis of the argument list"},"LARGE":{"a":"( array , k )","d":"Statistical function used to analyze the range of cells and return the nth largest value"},"LOGINV":{"a":"( x , mean , standard-deviation )","d":"Statistical function used to return the inverse of the lognormal cumulative distribution function of the given x value with the specified parameters"},"LOGNORMDIST":{"a":"( x , mean , standard-deviation )","d":"Statistical function used to analyze logarithmically transformed data and return the lognormal cumulative distribution function of the given x value with the specified parameters"},"MAX":{"a":"(number1, number2, ...)","d":"Statistical function used to analyze the range of data and find the largest number"},"MAXA":{"a":"(number1, number2, ...)","d":"Statistical function used to analyze the range of data and find the largest value"},"MEDIAN":{"a":"( argument-list )","d":"Statistical function used to calculate the median of the argument list"},"MIN":{"a":"(number1, number2, ...)","d":"Statistical function used to analyze the range of data and find the smallest number"},"MINA":{"a":"(number1, number2, ...)","d":"Statistical function used to analyze the range of data and find the smallest value"},"MODE":{"a":"( argument-list )","d":"Statistical function used to analyze the range of data and return the most frequently occurring value"},"NEGBINOMDIST":{"a":"( number-failures , number-successes , success-probability )","d":"Statistical function used to return the negative binomial distribution"},"NORMDIST":{"a":"( x , mean , standard-deviation , cumulative-flag )","d":"Statistical function used to return the normal distribution for the specified mean and standard deviation"},"NORMINV":{"a":"( x , mean , standard-deviation )","d":"Statistical function used to return the inverse of the normal cumulative distribution for the specified mean and standard deviation"},"NORMSDIST":{"a":"(number)","d":"Statistical function used to return the standard normal cumulative distribution function"},"NORMSINV":{"a":"( probability )","d":"Statistical function used to return the inverse of the standard normal cumulative distribution"},"PEARSON":{"a":"( array-1 , array-2 )","d":"Statistical function used to return the Pearson product moment correlation coefficient"},"PERCENTILE":{"a":"( array , k )","d":"Statistical function used to analyze the range of data and return the nth percentile"},"PERCENTRANK":{"a":"( array , x [ , significance ] )","d":"Statistical function used to return the rank of a value in a set of values as a percentage of the set"},"PERMUT":{"a":"( number , number-chosen )","d":"Statistical function used to return the number of permutations for a specified number of items"},"POISSON":{"a":"( x , mean , cumulative-flag )","d":"Statistical function used to return the Poisson distribution"},"PROB":{"a":"( x-range , probability-range , lower-limit [ , upper-limit ] )","d":"Statistical function used to return the probability that values in a range are between lower and upper limits"},"QUARTILE":{"a":"( array , result-category )","d":"Statistical function used to analyze the range of data and return the quartile"},"RSQ":{"a":"( array-1 , array-2 )","d":"Statistical function used to return the square of the Pearson product moment correlation coefficient"},"SKEW":{"a":"( argument-list )","d":"Statistical function used to analyze the range of data and return the skewness of a distribution of the argument list"},"SLOPE":{"a":"( array-1 , array-2 )","d":"Statistical function used to return the slope of the linear regression line through data in two arrays"},"SMALL":{"a":"( array , k )","d":"Statistical function used to analyze the range of data and find the nth smallest value"},"STANDARDIZE":{"a":"( x , mean , standard-deviation )","d":"Statistical function used to return a normalized value from a distribution characterized by the specified parameters"},"STDEV":{"a":"( argument-list )","d":"Statistical function used to analyze the range of data and return the standard deviation of a population based on a set of numbers"},"STDEVA":{"a":"( argument-list )","d":"Statistical function used to analyze the range of data and return the standard deviation of a population based on a set of numbers, text, and logical values (TRUE or FALSE). The STDEVA function treats text and FALSE as a value of 0 and TRUE as a value of 1"},"STDEVP":{"a":"( argument-list )","d":"Statistical function used to analyze the range of data and return the standard deviation of an entire population"},"STDEVPA":{"a":"( argument-list )","d":"Statistical function used to analyze the range of data and return the standard deviation of an entire population"},"STEYX":{"a":"( known-ys , known-xs )","d":"Statistical function used to return the standard error of the predicted y-value for each x in the regression line"},"VAR":{"a":"( argument-list )","d":"Statistical function used to analyze the set of values and calculate the sample variance"},"VARA":{"a":"( argument-list )","d":"Statistical function used to analyze the set of values and calculate the sample variance"},"VARP":{"a":"( argument-list )","d":"Statistical function used to analyze the set of values and calculate the variance of an entire population"},"VARPA":{"a":"( argument-list )","d":"Statistical function used to analyze the set of values and return the variance of an entire population"},"ACCRINT":{"a":"( issue , first-interest , settlement , rate , [ par ] , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the accrued interest for a security that pays periodic interest"},"ACCRINTM":{"a":"( issue , settlement , rate , [ [ par ] [ , [ basis ] ] ] )","d":"Financial function used to calculate the accrued interest for a security that pays interest at maturity"},"AMORDEGRC":{"a":"( cost , date-purchased , first-period , salvage , period , rate [ , [ basis ] ] )","d":"Financial function used to calculate the depreciation of an asset for each accounting period using a degressive depreciation method"},"AMORLINC":{"a":"( cost , date-purchased , first-period , salvage , period , rate [ , [ basis ] ] )","d":"Financial function used to calculate the depreciation of an asset for each accounting period using a linear depreciation method"},"COUPDAYBS":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the number of days from the beginning of the coupon period to the settlement date"},"COUPDAYS":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the number of days in the coupon period that contains the settlement date"},"COUPDAYSNC":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the number of days from the settlement date to the next coupon payment"},"COUPNCD":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the next coupon date after the settlement date"},"COUPNUM":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the number of coupons between the settlement date and the maturity date"},"COUPPCD":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the previous coupon date before the settlement date"},"CUMIPMT":{"a":"( rate , nper , pv , start-period , end-period , type )","d":"Financial function used to calculate the cumulative interest paid on an investment between two periods based on a specified interest rate and a constant payment schedule"},"CUMPRINC":{"a":"( rate , nper , pv , start-period , end-period , type )","d":"Financial function used to calculate the cumulative principal paid on an investment between two periods based on a specified interest rate and a constant payment schedule"},"DB":{"a":"( cost , salvage , life , period [ , [ month ] ] )","d":"Financial function used to calculate the depreciation of an asset for a specified accounting period using the fixed-declining balance method"},"DDB":{"a":"( cost , salvage , life , period [ , factor ] )","d":"Financial function used to calculate the depreciation of an asset for a specified accounting period using the double-declining balance method"},"DISC":{"a":"( settlement , maturity , pr , redemption [ , [ basis ] ] )","d":"Financial function used to calculate the discount rate for a security"},"DOLLARDE":{"a":"( fractional-dollar , fraction )","d":"Financial function used to convert a dollar price represented as a fraction into a dollar price represented as a decimal number"},"DOLLARFR":{"a":"( decimal-dollar , fraction )","d":"Financial function used to convert a dollar price represented as a decimal number into a dollar price represented as a fraction"},"DURATION":{"a":"( settlement , maturity , coupon , yld , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the Macaulay duration of a security with an assumed par value of $100"},"EFFECT":{"a":"( nominal-rate , npery )","d":"Financial function used to calculate the effective annual interest rate for a security based on a specified nominal annual interest rate and the number of compounding periods per year"},"FV":{"a":"( rate , nper , pmt [ , [ pv ] [ ,[ type ] ] ] )","d":"Financial function used to calculate the future value of an investment based on a specified interest rate and a constant payment schedule"},"FVSCHEDULE":{"a":"( principal , schedule )","d":"Financial function used to calculate the future value of an investment based on a series of changeable interest rates"},"INTRATE":{"a":"( settlement , maturity , pr , redemption [ , [ basis ] ] )","d":"Financial function used to calculate the interest rate for a fully invested security that pays interest only at maturity"},"IPMT":{"a":"( rate , per , nper , pv [ , [ fv ] [ , [ type ] ] ] )","d":"Financial function used to calculate the interest payment for an investment based on a specified interest rate and a constant payment schedule"},"IRR":{"a":"( values [ , [ guess ] ] )","d":"Financial function used to calculate the internal rate of return for a series of periodic cash flows"},"ISPMT":{"a":"( rate , per , nper , pv )","d":"Financial function used to calculate the interest payment for a specified period of an investment based on a constant payment schedule"},"MDURATION":{"a":"( settlement , maturity , coupon , yld , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the modified Macaulay duration of a security with an assumed par value of $100"},"MIRR":{"a":"( values , finance-rate , reinvest-rate )","d":"Financial function used to calculate the modified internal rate of return for a series of periodic cash flows"},"NOMINAL":{"a":"( effect-rate , npery )","d":"Financial function used to calculate the nominal annual interest rate for a security based on a specified effective annual interest rate and the number of compounding periods per year"},"NPER":{"a":"( rate , pmt , pv [ , [ fv ] [ , [ type ] ] ] )","d":"Financial function used to calculate the number of periods for an investment based on a specified interest rate and a constant payment schedule"},"NPV":{"a":"( rate , argument-list )","d":"Financial function used to calculate the net present value of an investment based on a specified discount rate"},"ODDFPRICE":{"a":"( settlement , maturity , issue , first-coupon , rate , yld , redemption , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the price per $100 par value for a security that pays periodic interest but has an odd first period (it is shorter or longer than other periods)"},"ODDFYIELD":{"a":"( settlement , maturity , issue , first-coupon , rate , pr , redemption , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the yield of a security that pays periodic interest but has an odd first period (it is shorter or longer than other periods)"},"ODDLPRICE":{"a":"( settlement , maturity , last-interest , rate , yld , redemption , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the price per $100 par value for a security that pays periodic interest but has an odd last period (it is shorter or longer than other periods)"},"ODDLYIELD":{"a":"( settlement , maturity , last-interest , rate , pr , redemption , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the yield of a security that pays periodic interest but has an odd last period (it is shorter or longer than other periods)"},"PMT":{"a":"( rate , nper , pv [ , [ fv ] [ ,[ type ] ] ] )","d":"Financial function used to calculate the payment amount for a loan based on a specified interest rate and a constant payment schedule"},"PPMT":{"a":"( rate , per , nper , pv [ , [ fv ] [ , [ type ] ] ] )","d":"Financial function used to calculate the principal payment for an investment based on a specified interest rate and a constant payment schedule"},"PRICE":{"a":"( settlement , maturity , rate , yld , redemption , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the price per $100 par value for a security that pays periodic interest"},"PRICEDISC":{"a":"( settlement , maturity , discount , redemption [ , [ basis ] ] )","d":"Financial function used to calculate the price per $100 par value for a discounted security"},"PRICEMAT":{"a":"( settlement , maturity , issue , rate , yld [ , [ basis ] ] )","d":"Financial function used to calculate the price per $100 par value for a security that pays interest at maturity"},"PV":{"a":"( rate , nper , pmt [ , [ fv ] [ ,[ type ] ] ] )","d":"Financial function used to calculate the present value of an investment based on a specified interest rate and a constant payment schedule"},"RATE":{"a":"( nper , pmt , pv [ , [ [ fv ] [ , [ [ type ] [ , [ guess ] ] ] ] ] ] )","d":"Financial function used to calculate the interest rate for an investment based on a constant payment schedule"},"RECEIVED":{"a":"( settlement , maturity , investment , discount [ , [ basis ] ] )","d":"Financial function used to calculate the amount received at maturity for a fully invested security"},"SLN":{"a":"( cost , salvage , life )","d":"Financial function used to calculate the depreciation of an asset for one accounting period using the straight-line depreciation method"},"SYD":{"a":"( cost , salvage , life , per )","d":"Financial function used to calculate the depreciation of an asset for a specified accounting period using the sum of the years' digits method"},"TBILLEQ":{"a":"( settlement , maturity , discount )","d":"Financial function used to calculate the bond-equivalent yield of a Treasury bill"},"TBILLPRICE":{"a":"( settlement , maturity , discount )","d":"Financial function used to calculate the price per $100 par value for a Treasury bill"},"TBILLYIELD":{"a":"( settlement , maturity , pr )","d":"Financial function used to calculate the yield of a Treasury bill"},"VDB":{"a":"( cost , salvage , life , start-period , end-period [ , [ [ factor ] [ , [ no-switch-flag ] ] ] ] ] )","d":"Financial function used to calculate the depreciation of an asset for a specified or partial accounting period using the variable declining balance method"},"XIRR":{"a":"( values , dates [ , [ guess ] ] )","d":"Financial function used to calculate the internal rate of return for a series of irregular cash flows"},"XNPV":{"a":"( rate , values , dates )","d":"Financial function used to calculate the net present value for an investment based on a specified interest rate and a schedule of irregular payments"},"YIELD":{"a":"( settlement , maturity , rate , pr , redemption , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the yield of a security that pays periodic interest"},"YIELDDISC":{"a":"( settlement , maturity , pr , redemption , [ , [ basis ] ] )","d":"Financial function used to calculate the annual yield of a discounted security"},"YIELDMAT":{"a":"( settlement , maturity , issue , rate , pr [ , [ basis ] ] )","d":"Financial function used to calculate the annual yield of a security that pays interest at maturity"},"ABS":{"a":"( x )","d":"Math and trigonometry function used to return the absolute value of a number"},"ACOS":{"a":"( x )","d":"Math and trigonometry function used to return the arccosine of a number"},"ACOSH":{"a":"( x )","d":"Math and trigonometry function used to return the inverse hyperbolic cosine of a number"},"ASIN":{"a":"( x )","d":"Math and trigonometry function used to return the arcsine of a number"},"ASINH":{"a":"( x )","d":"Math and trigonometry function used to return the inverse hyperbolic sine of a number"},"ATAN":{"a":"( x )","d":"Math and trigonometry function used to return the arctangent of a number"},"ATAN2":{"a":"( x, y )","d":"Math and trigonometry function used to return the arctangent of x and y coordinates"},"ATANH":{"a":"( x )","d":"Math and trigonometry function used to return the inverse hyperbolic tangent of a number"},"CEILING":{"a":"( x, significance )","d":"Math and trigonometry function used to round the number up to the nearest multiple of significance"},"COMBIN":{"a":"( number , number-chosen )","d":"Math and trigonometry function used to return the number of combinations for a specified number of items"},"COS":{"a":"( x )","d":"Math and trigonometry function used to return the cosine of an angle"},"COSH":{"a":"( x )","d":"Math and trigonometry function used to return the hyperbolic cosine of a number"},"DEGREES":{"a":"( angle )","d":"Math and trigonometry function used to convert radians into degrees"},"EVEN":{"a":"( x )","d":"Math and trigonometry function used to round the number up to the nearest even integer"},"EXP":{"a":"( x )","d":"Math and trigonometry function used to return the e constant raised to the desired power. The e constant is equal to 2,71828182845904"},"FACT":{"a":"( x )","d":"Math and trigonometry function used to return the factorial of a number"},"FACTDOUBLE":{"a":"( x )","d":"Math and trigonometry function used to return the double factorial of a number"},"FLOOR":{"a":"( x, significance )","d":"Math and trigonometry function used to round the number down to the nearest multiple of significance"},"GCD":{"a":"( argument-list )","d":"Math and trigonometry function used to return the greatest common divisor of two or more numbers"},"INT":{"a":"( x )","d":"Math and trigonometry function used to analyze and return the integer part of the specified number"},"LCM":{"a":"( argument-list )","d":"Math and trigonometry function used to return the lowest common multiple of one or more numbers"},"LN":{"a":"( x )","d":"Math and trigonometry function used to return the natural logarithm of a number"},"LOG":{"a":"( x [ , base ] )","d":"Math and trigonometry function used to return the logarithm of a number to a specified base"},"LOG10":{"a":"( x )","d":"Math and trigonometry function used to return the logarithm of a number to a base of 10"},"MDETERM":{"a":"( array )","d":"Math and trigonometry function used to return the matrix determinant of an array"},"MINVERSE":{"a":"( array )","d":"Math and trigonometry function used to return the inverse matrix for a given matrix and display the first value of the returned array of numbers"},"MMULT":{"a":"( array1, array2 )","d":"Math and trigonometry function used to return the matrix product of two arrays and display the first value of the returned array of numbers"},"MOD":{"a":"( x, y )","d":"Math and trigonometry function used to return the remainder after the division of a number by the specified divisor"},"MROUND":{"a":"( x, multiple )","d":"Math and trigonometry function used to round the number to the desired multiple"},"MULTINOMIAL":{"a":"( argument-list )","d":"Math and trigonometry function used to return the ratio of the factorial of a sum of numbers to the product of factorials"},"ODD":{"a":"( x )","d":"Math and trigonometry function used to round the number up to the nearest odd integer"},"PI":{"a":"()","d":"math and trigonometry functions. The function returns the mathematical constant pi, equal to 3.14159265358979. It does not require any argument"},"POWER":{"a":"( x, y )","d":"Math and trigonometry function used to return the result of a number raised to the desired power"},"PRODUCT":{"a":"( argument-list )","d":"Math and trigonometry function used to multiply all the numbers in the selected range of cells and return the product"},"QUOTIENT":{"a":"( dividend , divisor )","d":"Math and trigonometry function used to return the integer portion of a division"},"RADIANS":{"a":"( angle )","d":"Math and trigonometry function used to convert degrees into radians"},"RAND":{"a":"()","d":"math and trigonometry functions. The function returns a random number greater than or equal to 0 and less than 1. It does not require any argument"},"RANDBETWEEN":{"a":"( lower-bound , upper-bound )","d":"math and trigonometry functions. The function returns a random number greater than or equal to lower-bound and less than or equal to upper-bound"},"ROMAN":{"a":"( number, form )","d":"math and trigonometry functions. The function is used to convert a number to a roman numeral"},"ROUND":{"a":"( x , number-digits )","d":"Math and trigonometry function used to round the number to the desired number of digits"},"ROUNDDOWN":{"a":"( x , number-digits )","d":"Math and trigonometry function used to round the number down to the desired number of digits"},"ROUNDUP":{"a":"( x , number-digits )","d":"Math and trigonometry function used to round the number up to the desired number of digits"},"SERIESSUM":{"a":"( input-value , initial-power , step , coefficients )","d":"Math and trigonometry function used to return the sum of a power series"},"SIGN":{"a":"( x )","d":"Math and trigonometry function used to return the sign of a number. If the number is positive, the function returns 1. If the number is negative, the function returns -1. If the number is 0, the function returns 0"},"SIN":{"a":"( x )","d":"Math and trigonometry function used to return the sine of an angle"},"SINH":{"a":"( x )","d":"Math and trigonometry function used to return the hyperbolic sine of a number"},"SQRT":{"a":"( x )","d":"Math and trigonometry function used to return the square root of a number"},"SQRTPI":{"a":"( x )","d":"one of the Math and trigonometry function used to return the square root of the pi constant (3.14159265358979) multiplied by the specified number"},"SUBTOTAL":{"a":"( function-number , argument-list )","d":"Returns a subtotal in a list or database"},"SUM":{"a":"( argument-list )","d":"Math and trigonometry function used to add all the numbers in the selected range of cells and return the result"},"SUMIF":{"a":"( cell-range, selection-criteria [ , sum-range ] )","d":"Math and trigonometry function used to add all the numbers in the selected range of cells based on the specified criterion and return the result"},"SUMIFS":{"a":"( sum-range, criteria-range1, criteria1, [ criteria-range2, criteria2 ], ... )","d":"Math and trigonometry function used to add all the numbers in the selected range of cells based on multiple criteria and return the result"},"SUMPRODUCT":{"a":"( argument-list )","d":"Math and trigonometry function used to multiply the values in the selected ranges of cells or arrays and return the sum of the products"},"SUMSQ":{"a":"( argument-list )","d":"Math and trigonometry function used to add the squares of numbers and return the result"},"SUMX2MY2":{"a":"( array-1 , array-2 )","d":"Math and trigonometry function used to sum the difference of squares between two arrays"},"SUMX2PY2":{"a":"( array-1 , array-2 )","d":"Math and trigonometry function used to sum the squares of numbers in the selected arrays and return the sum of the results"},"SUMXMY2":{"a":"( array-1 , array-2 )","d":"Math and trigonometry function used to return the sum of the squares of the differences between corresponding items in the arrays"},"TAN":{"a":"( x )","d":"Math and trigonometry function used to return the tangent of an angle"},"TANH":{"a":"( x )","d":"Math and trigonometry function used to return the hyperbolic tangent of a number"},"TRUNC":{"a":"( x [ , number-digits ] )","d":"Math and trigonometry function used to return a number truncated to a specified number of digits"},"ADDRESS":{"a":"( row-number , col-number [ , [ ref-type ] [ , [ A1-ref-style-flag ] [ , sheet-name ] ] ] )","d":"Lookup and reference function used to return a text representation of a cell address"},"CHOOSE":{"a":"( index , argument-list )","d":"Lookup and reference function used to return a value from a list of values based on a specified index (position)"},"COLUMN":{"a":"( [ reference ] )","d":"Lookup and reference function used to return the column number of a cell"},"COLUMNS":{"a":"( array )","d":"Lookup and reference function used to return the number of columns in a cell reference"},"HLOOKUP":{"a":"( lookup-value , table-array , row-index-num [ , [ range-lookup-flag ] ] )","d":"Lookup and reference function used to perform the horizontal search for a value in the top row of a table or an array and return the value in the same column based on a specified row index number"},"INDEX":{"a":"( array , [ row-number ] [ , [ column-number ] ] ) INDEX( reference , [ row-number ] [ , [ column-number ] [ , [ area-number ] ] ] )","d":"Lookup and reference function used to return a value within a range of cells on the base of a specified row and column number. The INDEX function has two forms"},"INDIRECT":{"a":"( ref-text [ , [ A1-ref-style-flag ] ] )","d":"Lookup and reference function used to return the reference to a cell based on its string representation"},"LOOKUP":{"a":"( lookup-value , lookup-vector , result-vector )","d":"Lookup and reference function used to return a value from a selected range (row or column containing the data in ascending order)"},"MATCH":{"a":"( lookup-value , lookup-array [ , [ match-type ]] )","d":"Lookup and reference function used to return a relative position of a specified item in a range of cells"},"OFFSET":{"a":"( reference , rows , cols [ , [ height ] [ , [ width ] ] ] )","d":"Lookup and reference function used to return a reference to a cell displaced from the specified cell (or the upper-left cell in the range of cells) to a certain number of rows and columns"},"ROW":{"a":"( [ reference ] )","d":"Lookup and reference function used to return the row number of a cell reference"},"ROWS":{"a":"( array )","d":"Lookup and reference function used to return the number of rows in a cell references"},"TRANSPOSE":{"a":"( array )","d":"Lookup and reference function used to return the first element of an array"},"VLOOKUP":{"a":"( lookup-value , table-array , col-index-num [ , [ range-lookup-flag ] ] )","d":"Lookup and reference function used to perform the vertical search for a value in the left-most column of a table or an array and return the value in the same row based on a specified column index number"},"ERROR.TYPE":{"a":"(value)","d":"Information function used to return the numeric representation of one of the existing errors"},"ISBLANK":{"a":"(value)","d":"Information function used to check if the cell is empty or not. If the cell does not contain any value, the function returns TRUE, otherwise the function returns FALSE"},"ISERR":{"a":"(value)","d":"Information function used to check for an error value. If the cell contains an error value (except #N/A), the function returns TRUE, otherwise the function returns FALSE"},"ISERROR":{"a":"(value)","d":"Information function used to check for an error value. If the cell contains one of the error values: #N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME? or #NULL, the function returns TRUE, otherwise the function returns FALSE"},"ISEVEN":{"a":"(number)","d":"Information function used to check for an even value. If the cell contains an even value, the function returns TRUE. If the value is odd, it returns FALSE"},"ISLOGICAL":{"a":"(value)","d":"Information function used to check for a logical value (TRUE or FALSE). If the cell contains a logical value, the function returns TRUE, otherwise the function returns FALSE"},"ISNA":{"a":"(value)","d":"Information function used to check for a #N/A error. If the cell contains a #N/A error value, the function returns TRUE, otherwise the function returns FALSE"},"ISNONTEXT":{"a":"(value)","d":"Information function used to check for a value that is not a text. If the cell does not contain a text value, the function returns TRUE, otherwise the function returns FALSE"},"ISNUMBER":{"a":"(value)","d":"Information function used to check for a numeric value. If the cell contains a numeric value, the function returns TRUE, otherwise the function returns FALSE"},"ISODD":{"a":"(number)","d":"Information function used to check for an odd value. If the cell contains an odd value, the function returns TRUE. If the value is even, it returns FALSE"},"ISREF":{"a":"(value)","d":"Information function used to verify if the value is a valid cell reference"},"ISTEXT":{"a":"(value)","d":"Information function used to check for a text value. If the cell contains a text value, the function returns TRUE, otherwise the function returns FALSE"},"N":{"a":"(value)","d":"Information function used to convert a value to a number"},"NA":{"a":"()","d":"Information function used to return the #N/A error value. This function does not require an argument"},"TYPE":{"a":"(value)","d":"Information function used to determine the type of the resulting or displayed value"},"AND":{"a":"(logical1, logical2, ...)","d":"Logical function used to check if the logical value you enter is TRUE or FALSE. The function returns TRUE if all the arguments are TRUE"},"FALSE":{"a":"()","d":"logical functions. The function returns FALSE and does not require any argument"},"IF":{"a":"(logical_test, value_if_true, value_if_false)","d":"Logical function used to check the logical expression and return one value if it is TRUE, or another if it is FALSE"},"IFERROR":{"a":"(value, value_if_error)","d":"Logical function used to check if there is an error in the formula in the first argument. The function returns the result of the formula if there is no error, or the value_if_error if there is one"},"NOT":{"a":"(logical)","d":"Logical function used to check if the logical value you enter is TRUE or FALSE. The function returns TRUE if the argument is FALSE and FALSE if the argument is TRUE"},"OR":{"a":"(logical1, logical2, ...)","d":"Logical function used to check if the logical value you enter is TRUE or FALSE. The function returns FALSE if all the arguments are FALSE"},"TRUE":{"a":"()","d":"logical functions which returns TRUE and does not require any argument"}} \ No newline at end of file +{"DATE":{"a":"( year, month, day )","d":"Date and time function used to add dates in the default format MM/dd/yyyy"},"DATEDIF":{"a":"( start-date , end-date , unit )","d":"Date and time function used to return the difference between two date values (start date and end date), based on the interval (unit) specified"},"DATEVALUE":{"a":"( date-time-string )","d":"Date and time function used to return a serial number of the specified date"},"DAY":{"a":"( date-value )","d":"Date and time function which returns the day (a number from 1 to 31) of the date given in the numerical format (MM/dd/yyyy by default)"},"DAYS360":{"a":"( start-date , end-date [ , method-flag ] )","d":"Date and time function used to return the number of days between two dates (start-date and end-date) based on a 360-day year using one of the calculation method (US or European)"},"EDATE":{"a":"( start-date , month-offset )","d":"Date and time function used to return the serial number of the date which comes the indicated number of months (month-offset) before or after the specified date (start-date)"},"EOMONTH":{"a":"( start-date , month-offset )","d":"Date and time function used to return the serial number of the last day of the month that comes the indicated number of months before or after the specified start date"},"HOUR":{"a":"( time-value )","d":"Date and time function which returns the hour (a number from 0 to 23) of the time value"},"MINUTE":{"a":"( time-value )","d":"Date and time function which returns the minute (a number from 0 to 59) of the time value"},"MONTH":{"a":"( date-value )","d":"Date and time function which returns the month (a number from 1 to 12) of the date given in the numerical format (MM/dd/yyyy by default)"},"NETWORKDAYS":{"a":"( start-date , end-date [ , holidays ] )","d":"Date and time function used to return the number of the work days between two dates (start date and end-date) excluding weekends and dates considered as holidays"},"NOW":{"a":"()","d":""},"SECOND":{"a":"( time-value )","d":"Date and time function which returns the second (a number from 0 to 59) of the time value"},"TIME":{"a":"( hour, minute, second )","d":"Date and time function used to add a particular time in the selected format (hh:mm tt by default)"},"TIMEVALUE":{"a":"( date-time-string )","d":"Date and time function used to return the serial number of a time"},"TODAY":{"a":"()","d":"Date and time function used to add the current day in the following format MM/dd/yy. This function does not require an argument"},"WEEKDAY":{"a":"( serial-value [ , weekday-start-flag ] )","d":"Date and time function used to determine which day of the week the specified date is"},"WEEKNUM":{"a":"( serial-value [ , weekday-start-flag ] )","d":"date and time functions. It used to return the number of the week the specified date falls within the year"},"WORKDAY":{"a":"( start-date , day-offset [ , holidays ] )","d":"Date and time function used to return the date which comes the indicated number of days (day-offset) before or after the specified start date excluding weekends and dates considered as holidays"},"YEAR":{"a":"( date-value )","d":"Date and time function which returns the year (a number from 1900 to 9999) of the date given in the numerical format (MM/dd/yyyy by default)"},"YEARFRAC":{"a":"( start-date , end-date [ , basis ] )","d":"Date and time function used to return the fraction of a year represented by the number of whole days from start-date to end-date calculated on the specified basis"},"BIN2DEC":{"a":"( number )","d":"Engineering function used to convert a binary number into a decimal number"},"BIN2HEX":{"a":"( number [ , num-hex-digits ] )","d":"Engineering function used to convert a binary number into a hexadecimal number"},"BIN2OCT":{"a":"( number [ , num-hex-digits ] )","d":"Engineering function used to convert a binary number into an octal number"},"COMPLEX":{"a":"( real-number , imaginary-number [ , suffix ] )","d":"Engineering function used to convert a real part and an imaginary part into the complex number expressed in a + bi or a + bj form"},"DEC2BIN":{"a":"( number [ , num-hex-digits ] )","d":"Engineering function used to convert a decimal number into a binary number"},"DEC2HEX":{"a":"( number [ , num-hex-digits ] )","d":"Engineering function used to convert a decimal number into a hexadecimal number"},"DEC2OCT":{"a":"( number [ , num-hex-digits ] )","d":"Engineering function used to convert a decimal number into an octal number"},"DELTA":{"a":"( number-1 [ , number-2 ] )","d":"Engineering function used to test if two numbers are equal. The function returns 1 if the numbers are equal and 0 otherwise"},"ERF":{"a":"( lower-bound [ , upper-bound ] )","d":"Engineering function used to calculate the error function integrated between the specified lower and upper limits"},"ERFC":{"a":"( lower-bound )","d":"Engineering function used to calculate the complementary error function integrated between the specified lower limit and infinity"},"GESTEP":{"a":"( number [ , step ] )","d":"Engineering function used to test if a number is greater than a threshold value. The function returns 1 if the number is greater than or equal to the threshold value and 0 otherwise"},"HEX2BIN":{"a":"( number [ , num-hex-digits ] )","d":"Engineering function used to convert a hexadecimal number to a binary number"},"HEX2DEC":{"a":"( number )","d":"Engineering function used to convert a hexadecimal number into a decimal number"},"HEX2OCT":{"a":"( number [ , num-hex-digits ] )","d":"Engineering function used to convert a hexadecimal number to an octal number"},"IMABS":{"a":"( complex-number )","d":"Engineering function used to return the absolute value of a complex number"},"IMAGINARY":{"a":"( complex-number )","d":"Engineering function used to return the imaginary part of the specified complex number"},"IMARGUMENT":{"a":"( complex-number )","d":"Engineering function used to return the argument Theta, an angle expressed in radians"},"IMCONJUGATE":{"a":"( complex-number )","d":"Engineering function used to return the complex conjugate of a complex number"},"IMCOS":{"a":"( complex-number )","d":"Engineering function used to return the cosine of a complex number"},"IMCOSH":{"a":"( complex-number )","d":"Engineering function used to return the hyperbolic cosine of a complex number"},"IMCOT":{"a":"( complex-number )","d":"Engineering function used to return the cotangent of a complex number"},"IMCSC":{"a":"( complex-number )","d":"Engineering function used to return the cosecant of a complex number"},"IMCSCH":{"a":"( complex-number )","d":"Engineering function used to return the hyperbolic cosecant of a complex number"},"IMDIV":{"a":"( complex-number-1 , complex-number-2 )","d":"Engineering function used to return the quotient of two complex numbers expressed in a + bi or a + bj form"},"IMEXP":{"a":"( complex-number )","d":"Engineering function used to return the e constant raised to the to the power specified by a complex number. The e constant is equal to 2,71828182845904"},"IMLN":{"a":"( complex-number )","d":"Engineering function used to return the natural logarithm of a complex number"},"IMLOG10":{"a":"( complex-number )","d":"Engineering function used to return the logarithm of a complex number to a base of 10"},"IMLOG2":{"a":"( complex-number )","d":"Engineering function used to return the logarithm of a complex number to a base of 2"},"IMPOWER":{"a":"( complex-number, power )","d":"Engineering function used to return the result of a complex number raised to the desired power"},"IMPRODUCT":{"a":"( argument-list )","d":"Engineering function used to return the product of the specified complex numbers"},"IMREAL":{"a":"( complex-number )","d":"Engineering function used to return the real part of the specified complex number"},"IMSEC":{"a":"( complex-number )","d":"Engineering function used to return the secant of a complex number"},"IMSECH":{"a":"( complex-number )","d":"Engineering function used to return the hyperbolic secant of a complex number"},"IMSIN":{"a":"( complex-number )","d":"Engineering function used to return the sine of a complex number"},"IMSINH":{"a":"( complex-number )","d":"Engineering function used to return the hyperbolic sine of a complex number"},"IMSQRT":{"a":"( complex-number )","d":"Engineering function used to return the square root of a complex number"},"IMSUB":{"a":"( complex-number-1 , complex-number-2 )","d":"Engineering function used to return the difference of two complex numbers expressed in a + bi or a + bj form"},"IMSUM":{"a":"( argument-list )","d":"Engineering function used to return the sum of the specified complex numbers"},"IMTAN":{"a":"( complex-number )","d":"Engineering function used return to the tangent of a complex number"},"OCT2BIN":{"a":"( number [ , num-hex-digits ] )","d":"Engineering function used to convert an octal number to a binary number"},"OCT2DEC":{"a":"( number )","d":"Engineering function used to convert an octal number to a decimal number"},"OCT2HEX":{"a":"( number [ , num-hex-digits ] )","d":"Engineering function used to convert an octal number to a hexadecimal number"},"CHAR":{"a":"( number )","d":"Text and data function used to return the ASCII character specified by a number"},"CLEAN":{"a":"( string )","d":"Text and data function used to remove all the nonprintable characters from the selected string"},"CODE":{"a":"( string )","d":"Text and data function used to return the ASCII value of the specified character or the first character in a cell"},"CONCATENATE":{"a":"(text1, text2, ...)","d":"Text and data function used to combine the data from two or more cells into a single one"},"DOLLAR":{"a":"( number [ , num-decimal ] )","d":"Text and data function used to convert a number to text, using a currency format $#.##"},"EXACT":{"a":"(text1, text2)","d":"Text and data function used to compare data in two cells. The function returns TRUE if the data are the same, and FALSE if not"},"FIND":{"a":"( string-1 , string-2 [ , start-pos ] )","d":"Text and data function used to find the specified substring (string-1) within a string (string-2) and is intended for languages that use the single-byte character set (SBCS)"},"FINDB":{"a":"( string-1 , string-2 [ , start-pos ] )","d":"Text and data function used to find the specified substring (string-1) within a string (string-2) and is intended for languages the double-byte character set (DBCS) like Japanese, Chinese, Korean etc."},"FIXED":{"a":"( number [ , [ num-decimal ] [ , suppress-commas-flag ] ] )","d":"Text and data function used to return the text representation of a number rounded to a specified number of decimal places"},"LEFT":{"a":"( string [ , number-chars ] )","d":"Text and data function used to extract the substring from the specified string starting from the left character and is intended for languages that use the single-byte character set (SBCS)"},"LEFTB":{"a":"( string [ , number-chars ] )","d":"Text and data function used to extract the substring from the specified string starting from the left character and is intended for languages that use the double-byte character set (DBCS) like Japanese, Chinese, Korean etc."},"LEN":{"a":"( string )","d":"Text and data function used to analyse the specified string and return the number of characters it contains and is intended for languages that use the single-byte character set (SBCS)"},"LENB":{"a":"( string )","d":"Text and data function used to analyse the specified string and return the number of characters it contains and is intended for languages that use the double-byte character set (DBCS) like Japanese, Chinese, Korean etc."},"LOWER":{"a":"(text)","d":"Text and data function used to convert uppercase letters to lowercase in the selected cell"},"MID":{"a":"( string , start-pos , number-chars )","d":"Text and data function used to extract the characters from the specified string starting from any position and is intended for languages that use the single-byte character set (SBCS)"},"MIDB":{"a":"( string , start-pos , number-chars )","d":"Text and data function used to extract the characters from the specified string starting from any position and is intended for languages that use the double-byte character set (DBCS) like Japanese, Chinese, Korean etc."},"PROPER":{"a":"( string )","d":"Text and data function used to convert the first character of each word to uppercase and all the remaining characters to lowercase"},"REPLACE":{"a":"( string-1, start-pos, number-chars, string-2 )","d":"Text and data function used to replace a set of characters, based on the number of characters and the start position you specify, with a new set of characters and is intended for languages that use the single-byte character set (SBCS)"},"REPLACEB":{"a":"( string-1, start-pos, number-chars, string-2 )","d":"Text and data function used to replace a set of characters, based on the number of characters and the start position you specify, with a new set of characters and is intended for languages that use the double-byte character set (DBCS) like Japanese, Chinese, Korean etc."},"REPT":{"a":"(text, number_of_times)","d":"Text and data function used to repeat the data in the selected cell as many time as you wish"},"RIGHT":{"a":"( string [ , number-chars ] )","d":"Text and data function used to extract a substring from a string starting from the right-most character, based on the specified number of characters and is intended for languages that use the single-byte character set (SBCS)"},"RIGHTB":{"a":"( string [ , number-chars ] )","d":"Text and data function used to extract a substring from a string starting from the right-most character, based on the specified number of characters and is intended for languages that use the double-byte character set (DBCS) like Japanese, Chinese, Korean etc."},"SEARCH":{"a":"( string-1 , string-2 [ , start-pos ] )","d":"Text and data function used to return the location of the specified substring in a string and is intended for languages that use the single-byte character set (SBCS)"},"SEARCHB":{"a":"( string-1 , string-2 [ , start-pos ] )","d":"Text and data function used to return the location of the specified substring in a string and is intended for languages that use the double-byte character set (DBCS) like Japanese, Chinese, Korean etc."},"SUBSTITUTE":{"a":"( string , old-string , new-string [ , occurence ] )","d":"Text and data function used to replace a set of characters with a new one"},"T":{"a":"( value )","d":"Text and data function used to check whether the value in the cell (or used as argument) is text or not. In case it is not text, the function returns blank result. In case the value/argument is text, the function returns the same text value"},"TEXT":{"a":"( value , format )","d":"Text and data function used to convert a value to a text in the specified format"},"TRIM":{"a":"( string )","d":"Text and data function used to remove the leading and trailing spaces from a string"},"UPPER":{"a":"(text)","d":"Text and data function used to convert lowercase letters to uppercase in the selected cell"},"VALUE":{"a":"( string )","d":"Text and data function used to convert a text value that represents a number to a number. If the converted text is not a number, the function will return a #VALUE! error"},"AVEDEV":{"a":"( argument-list )","d":"Statistical function used to analyze the range of data and return the average of the absolute deviations of numbers from their mean"},"AVERAGE":{"a":"( argument-list )","d":"Statistical function used to analyze the range of data and find the average value"},"AVERAGEA":{"a":"( argument-list )","d":"Statistical function used to analyze the range of data including text and logical values and find the average value. The AVERAGEA function treats text and FALSE as a value of 0 and TRUE as a value of 1"},"AVERAGEIF":{"a":"( cell-range, selection-criteria [ , average-range ] )","d":"Statistical function used to analyze the range of data and find the average value of all numbers in a range of cells, based on the specified criterion"},"AVERAGEIFS":{"a":"( average-range, criteria-range-1, criteria-1 [ criteria-range-2, criteria-2 ], ... )","d":"Statistical function used to analyze the range of data and find the average value of all numbers in a range of cells, based on the multiple criterions"},"BINOMDIST":{"a":"( number-successes , number-trials , success-probability , cumulative-flag )","d":"Statistical function used to return the individual term binomial distribution probability"},"CONFIDENCE":{"a":"( alpha , standard-dev , size )","d":"Statistical function used to return the confidence interval"},"CORREL":{"a":"( array-1 , array-2 )","d":"Statistical function used to analyze the range of data and return the correlation coefficient of two range of cells"},"COUNT":{"a":"( argument-list )","d":"Statistical function used to count the number of the selected cells which contain numbers ignoring empty cells or those contaning text"},"COUNTA":{"a":"( argument-list )","d":"Statistical function used to analyze the range of cells and count the number of cells that are not empty"},"COUNTBLANK":{"a":"( argument-list )","d":"Statistical function used to analyze the range of cells and return the number of the empty cells"},"COUNTIF":{"a":"( cell-range, selection-criteria )","d":"Statistical function used to count the number of the selected cells based on the specified criterion"},"COUNTIFS":{"a":"( criteria-range-1, criteria-1, [ criteria-range-2, criteria-2 ], ... )","d":"Statistical function used to count the number of the selected cells based on the multiple criterions"},"COVAR":{"a":"( array-1 , array-2 )","d":"Statistical function used to return the covariance of two ranges of data"},"CRITBINOM":{"a":"( number-trials , success-probability , alpha )","d":"Statistical function used to return the smallest value for which the cumulative binomial distribution is greater than or equal to the specified alpha value"},"DEVSQ":{"a":"( argument-list )","d":"Statistical function used to analyze the range of data and sum the squares of the deviations of numbers from their mean"},"EXPONDIST":{"a":"( x , lambda , cumulative-flag )","d":"Statistical function used to return the exponential distribution"},"FISHER":{"a":"( number )","d":"Statistical function used to return the Fisher transformation of a number"},"FISHERINV":{"a":"( number )","d":"Statistical function used to perform the inverse of Fisher transformation"},"FORECAST":{"a":"( x , array-1 , array-2 )","d":"Statistical function used to predict a future value based on existing values provided"},"FREQUENCY":{"a":"( data-array , bins-array )","d":"Statistical function used to сalculate how often values occur within the selected range of cells and display the first value of the returned vertical array of numbers"},"GAMMALN":{"a":"(number)","d":"Statistical function used to return the natural logarithm of the gamma function"},"GEOMEAN":{"a":"( argument-list )","d":"Statistical function used to calculate the geometric mean of the argument list"},"HARMEAN":{"a":"( argument-list )","d":"Statistical function used to calculate the harmonic mean of the argument list"},"HYPGEOMDIST":{"a":"( sample-successes , number-sample , population-successes , number-population )","d":"Statistical function used to return the hypergeometric distribution, the probability of a given number of sample successes, given the sample size, population successes, and population size"},"INTERCEPT":{"a":"( array-1 , array-2 )","d":"Statistical function used to analyze the first array values and second array values to calculate the intersection point"},"KURT":{"a":"( argument-list )","d":"Statistical function used to return the kurtosis of the argument list"},"LARGE":{"a":"( array , k )","d":"Statistical function used to analyze the range of cells and return the nth largest value"},"LOGINV":{"a":"( x , mean , standard-deviation )","d":"Statistical function used to return the inverse of the lognormal cumulative distribution function of the given x value with the specified parameters"},"LOGNORMDIST":{"a":"( x , mean , standard-deviation )","d":"Statistical function used to analyze logarithmically transformed data and return the lognormal cumulative distribution function of the given x value with the specified parameters"},"MAX":{"a":"(number1, number2, ...)","d":"Statistical function used to analyze the range of data and find the largest number"},"MAXA":{"a":"(number1, number2, ...)","d":"Statistical function used to analyze the range of data and find the largest value"},"MEDIAN":{"a":"( argument-list )","d":"Statistical function used to calculate the median of the argument list"},"MIN":{"a":"(number1, number2, ...)","d":"Statistical function used to analyze the range of data and find the smallest number"},"MINA":{"a":"(number1, number2, ...)","d":"Statistical function used to analyze the range of data and find the smallest value"},"MODE":{"a":"( argument-list )","d":"Statistical function used to analyze the range of data and return the most frequently occurring value"},"NEGBINOMDIST":{"a":"( number-failures , number-successes , success-probability )","d":"Statistical function used to return the negative binomial distribution"},"NORMDIST":{"a":"( x , mean , standard-deviation , cumulative-flag )","d":"Statistical function used to return the normal distribution for the specified mean and standard deviation"},"NORMINV":{"a":"( x , mean , standard-deviation )","d":"Statistical function used to return the inverse of the normal cumulative distribution for the specified mean and standard deviation"},"NORMSDIST":{"a":"(number)","d":"Statistical function used to return the standard normal cumulative distribution function"},"NORMSINV":{"a":"( probability )","d":"Statistical function used to return the inverse of the standard normal cumulative distribution"},"PEARSON":{"a":"( array-1 , array-2 )","d":"Statistical function used to return the Pearson product moment correlation coefficient"},"PERCENTILE":{"a":"( array , k )","d":"Statistical function used to analyze the range of data and return the nth percentile"},"PERCENTRANK":{"a":"( array , x [ , significance ] )","d":"Statistical function used to return the rank of a value in a set of values as a percentage of the set"},"PERMUT":{"a":"( number , number-chosen )","d":"Statistical function used to return the number of permutations for a specified number of items"},"POISSON":{"a":"( x , mean , cumulative-flag )","d":"Statistical function used to return the Poisson distribution"},"PROB":{"a":"( x-range , probability-range , lower-limit [ , upper-limit ] )","d":"Statistical function used to return the probability that values in a range are between lower and upper limits"},"QUARTILE":{"a":"( array , result-category )","d":"Statistical function used to analyze the range of data and return the quartile"},"RSQ":{"a":"( array-1 , array-2 )","d":"Statistical function used to return the square of the Pearson product moment correlation coefficient"},"SKEW":{"a":"( argument-list )","d":"Statistical function used to analyze the range of data and return the skewness of a distribution of the argument list"},"SLOPE":{"a":"( array-1 , array-2 )","d":"Statistical function used to return the slope of the linear regression line through data in two arrays"},"SMALL":{"a":"( array , k )","d":"Statistical function used to analyze the range of data and find the nth smallest value"},"STANDARDIZE":{"a":"( x , mean , standard-deviation )","d":"Statistical function used to return a normalized value from a distribution characterized by the specified parameters"},"STDEV":{"a":"( argument-list )","d":"Statistical function used to analyze the range of data and return the standard deviation of a population based on a set of numbers"},"STDEVA":{"a":"( argument-list )","d":"Statistical function used to analyze the range of data and return the standard deviation of a population based on a set of numbers, text, and logical values (TRUE or FALSE). The STDEVA function treats text and FALSE as a value of 0 and TRUE as a value of 1"},"STDEVP":{"a":"( argument-list )","d":"Statistical function used to analyze the range of data and return the standard deviation of an entire population"},"STDEVPA":{"a":"( argument-list )","d":"Statistical function used to analyze the range of data and return the standard deviation of an entire population"},"STEYX":{"a":"( known-ys , known-xs )","d":"Statistical function used to return the standard error of the predicted y-value for each x in the regression line"},"VAR":{"a":"( argument-list )","d":"Statistical function used to analyze the set of values and calculate the sample variance"},"VARA":{"a":"( argument-list )","d":"Statistical function used to analyze the set of values and calculate the sample variance"},"VARP":{"a":"( argument-list )","d":"Statistical function used to analyze the set of values and calculate the variance of an entire population"},"VARPA":{"a":"( argument-list )","d":"Statistical function used to analyze the set of values and return the variance of an entire population"},"ACCRINT":{"a":"( issue , first-interest , settlement , rate , [ par ] , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the accrued interest for a security that pays periodic interest"},"ACCRINTM":{"a":"( issue , settlement , rate , [ [ par ] [ , [ basis ] ] ] )","d":"Financial function used to calculate the accrued interest for a security that pays interest at maturity"},"AMORDEGRC":{"a":"( cost , date-purchased , first-period , salvage , period , rate [ , [ basis ] ] )","d":"Financial function used to calculate the depreciation of an asset for each accounting period using a degressive depreciation method"},"AMORLINC":{"a":"( cost , date-purchased , first-period , salvage , period , rate [ , [ basis ] ] )","d":"Financial function used to calculate the depreciation of an asset for each accounting period using a linear depreciation method"},"COUPDAYBS":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the number of days from the beginning of the coupon period to the settlement date"},"COUPDAYS":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the number of days in the coupon period that contains the settlement date"},"COUPDAYSNC":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the number of days from the settlement date to the next coupon payment"},"COUPNCD":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the next coupon date after the settlement date"},"COUPNUM":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the number of coupons between the settlement date and the maturity date"},"COUPPCD":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the previous coupon date before the settlement date"},"CUMIPMT":{"a":"( rate , nper , pv , start-period , end-period , type )","d":"Financial function used to calculate the cumulative interest paid on an investment between two periods based on a specified interest rate and a constant payment schedule"},"CUMPRINC":{"a":"( rate , nper , pv , start-period , end-period , type )","d":"Financial function used to calculate the cumulative principal paid on an investment between two periods based on a specified interest rate and a constant payment schedule"},"DB":{"a":"( cost , salvage , life , period [ , [ month ] ] )","d":"Financial function used to calculate the depreciation of an asset for a specified accounting period using the fixed-declining balance method"},"DDB":{"a":"( cost , salvage , life , period [ , factor ] )","d":"Financial function used to calculate the depreciation of an asset for a specified accounting period using the double-declining balance method"},"DISC":{"a":"( settlement , maturity , pr , redemption [ , [ basis ] ] )","d":"Financial function used to calculate the discount rate for a security"},"DOLLARDE":{"a":"( fractional-dollar , fraction )","d":"Financial function used to convert a dollar price represented as a fraction into a dollar price represented as a decimal number"},"DOLLARFR":{"a":"( decimal-dollar , fraction )","d":"Financial function used to convert a dollar price represented as a decimal number into a dollar price represented as a fraction"},"DURATION":{"a":"( settlement , maturity , coupon , yld , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the Macaulay duration of a security with an assumed par value of $100"},"EFFECT":{"a":"( nominal-rate , npery )","d":"Financial function used to calculate the effective annual interest rate for a security based on a specified nominal annual interest rate and the number of compounding periods per year"},"FV":{"a":"( rate , nper , pmt [ , [ pv ] [ ,[ type ] ] ] )","d":"Financial function used to calculate the future value of an investment based on a specified interest rate and a constant payment schedule"},"FVSCHEDULE":{"a":"( principal , schedule )","d":"Financial function used to calculate the future value of an investment based on a series of changeable interest rates"},"INTRATE":{"a":"( settlement , maturity , pr , redemption [ , [ basis ] ] )","d":"Financial function used to calculate the interest rate for a fully invested security that pays interest only at maturity"},"IPMT":{"a":"( rate , per , nper , pv [ , [ fv ] [ , [ type ] ] ] )","d":"Financial function used to calculate the interest payment for an investment based on a specified interest rate and a constant payment schedule"},"IRR":{"a":"( values [ , [ guess ] ] )","d":"Financial function used to calculate the internal rate of return for a series of periodic cash flows"},"ISPMT":{"a":"( rate , per , nper , pv )","d":"Financial function used to calculate the interest payment for a specified period of an investment based on a constant payment schedule"},"MDURATION":{"a":"( settlement , maturity , coupon , yld , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the modified Macaulay duration of a security with an assumed par value of $100"},"MIRR":{"a":"( values , finance-rate , reinvest-rate )","d":"Financial function used to calculate the modified internal rate of return for a series of periodic cash flows"},"NOMINAL":{"a":"( effect-rate , npery )","d":"Financial function used to calculate the nominal annual interest rate for a security based on a specified effective annual interest rate and the number of compounding periods per year"},"NPER":{"a":"( rate , pmt , pv [ , [ fv ] [ , [ type ] ] ] )","d":"Financial function used to calculate the number of periods for an investment based on a specified interest rate and a constant payment schedule"},"NPV":{"a":"( rate , argument-list )","d":"Financial function used to calculate the net present value of an investment based on a specified discount rate"},"ODDFPRICE":{"a":"( settlement , maturity , issue , first-coupon , rate , yld , redemption , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the price per $100 par value for a security that pays periodic interest but has an odd first period (it is shorter or longer than other periods)"},"ODDFYIELD":{"a":"( settlement , maturity , issue , first-coupon , rate , pr , redemption , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the yield of a security that pays periodic interest but has an odd first period (it is shorter or longer than other periods)"},"ODDLPRICE":{"a":"( settlement , maturity , last-interest , rate , yld , redemption , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the price per $100 par value for a security that pays periodic interest but has an odd last period (it is shorter or longer than other periods)"},"ODDLYIELD":{"a":"( settlement , maturity , last-interest , rate , pr , redemption , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the yield of a security that pays periodic interest but has an odd last period (it is shorter or longer than other periods)"},"PMT":{"a":"( rate , nper , pv [ , [ fv ] [ ,[ type ] ] ] )","d":"Financial function used to calculate the payment amount for a loan based on a specified interest rate and a constant payment schedule"},"PPMT":{"a":"( rate , per , nper , pv [ , [ fv ] [ , [ type ] ] ] )","d":"Financial function used to calculate the principal payment for an investment based on a specified interest rate and a constant payment schedule"},"PRICE":{"a":"( settlement , maturity , rate , yld , redemption , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the price per $100 par value for a security that pays periodic interest"},"PRICEDISC":{"a":"( settlement , maturity , discount , redemption [ , [ basis ] ] )","d":"Financial function used to calculate the price per $100 par value for a discounted security"},"PRICEMAT":{"a":"( settlement , maturity , issue , rate , yld [ , [ basis ] ] )","d":"Financial function used to calculate the price per $100 par value for a security that pays interest at maturity"},"PV":{"a":"( rate , nper , pmt [ , [ fv ] [ ,[ type ] ] ] )","d":"Financial function used to calculate the present value of an investment based on a specified interest rate and a constant payment schedule"},"RATE":{"a":"( nper , pmt , pv [ , [ [ fv ] [ , [ [ type ] [ , [ guess ] ] ] ] ] ] )","d":"Financial function used to calculate the interest rate for an investment based on a constant payment schedule"},"RECEIVED":{"a":"( settlement , maturity , investment , discount [ , [ basis ] ] )","d":"Financial function used to calculate the amount received at maturity for a fully invested security"},"SLN":{"a":"( cost , salvage , life )","d":"Financial function used to calculate the depreciation of an asset for one accounting period using the straight-line depreciation method"},"SYD":{"a":"( cost , salvage , life , per )","d":"Financial function used to calculate the depreciation of an asset for a specified accounting period using the sum of the years' digits method"},"TBILLEQ":{"a":"( settlement , maturity , discount )","d":"Financial function used to calculate the bond-equivalent yield of a Treasury bill"},"TBILLPRICE":{"a":"( settlement , maturity , discount )","d":"Financial function used to calculate the price per $100 par value for a Treasury bill"},"TBILLYIELD":{"a":"( settlement , maturity , pr )","d":"Financial function used to calculate the yield of a Treasury bill"},"VDB":{"a":"( cost , salvage , life , start-period , end-period [ , [ [ factor ] [ , [ no-switch-flag ] ] ] ] ] )","d":"Financial function used to calculate the depreciation of an asset for a specified or partial accounting period using the variable declining balance method"},"XIRR":{"a":"( values , dates [ , [ guess ] ] )","d":"Financial function used to calculate the internal rate of return for a series of irregular cash flows"},"XNPV":{"a":"( rate , values , dates )","d":"Financial function used to calculate the net present value for an investment based on a specified interest rate and a schedule of irregular payments"},"YIELD":{"a":"( settlement , maturity , rate , pr , redemption , frequency [ , [ basis ] ] )","d":"Financial function used to calculate the yield of a security that pays periodic interest"},"YIELDDISC":{"a":"( settlement , maturity , pr , redemption , [ , [ basis ] ] )","d":"Financial function used to calculate the annual yield of a discounted security"},"YIELDMAT":{"a":"( settlement , maturity , issue , rate , pr [ , [ basis ] ] )","d":"Financial function used to calculate the annual yield of a security that pays interest at maturity"},"ABS":{"a":"( x )","d":"Math and trigonometry function used to return the absolute value of a number"},"ACOS":{"a":"( x )","d":"Math and trigonometry function used to return the arccosine of a number"},"ACOSH":{"a":"( x )","d":"Math and trigonometry function used to return the inverse hyperbolic cosine of a number"},"ACOT":{"a":"( x )","d":"Math and trigonometry function used to return the principal value of the arccotangent, or inverse cotangent, of a number"},"ACOTH":{"a":"( x )","d":"Math and trigonometry function used to return the inverse hyperbolic cotangent of a number"},"ARABIC":{"a":"( x )","d":"Math and trigonometry function used to convert a Roman numeral to an Arabic numeral"},"ASIN":{"a":"( x )","d":"Math and trigonometry function used to return the arcsine of a number"},"ASINH":{"a":"( x )","d":"Math and trigonometry function used to return the inverse hyperbolic sine of a number"},"ATAN":{"a":"( x )","d":"Math and trigonometry function used to return the arctangent of a number"},"ATAN2":{"a":"( x, y )","d":"Math and trigonometry function used to return the arctangent of x and y coordinates"},"ATANH":{"a":"( x )","d":"Math and trigonometry function used to return the inverse hyperbolic tangent of a number"},"BASE":{"a":"( number , base [ , min-length ] )","d":"Converts a number into a text representation with the given base"},"CEILING":{"a":"( x, significance )","d":"Math and trigonometry function used to round the number up to the nearest multiple of significance"},"CEILING.MATH":{"a":"( x [ , [ significance ] [ , [ mode ] ] )","d":"Math and trigonometry function used to rounds a number up to the nearest integer or to the nearest multiple of significance"},"CEILING.PRECISE":{"a":"( x [ , significance ] )","d":"Math and trigonometry function used to return a number that is rounded up to the nearest integer or to the nearest multiple of significance"},"COMBIN":{"a":"( number , number-chosen )","d":"Math and trigonometry function used to return the number of combinations for a specified number of items"},"COMBINA":{"a":"( number , number-chosen )","d":"Math and trigonometry function used to return the number of combinations (with repetitions) for a given number of items"},"COS":{"a":"( x )","d":"Math and trigonometry function used to return the cosine of an angle"},"COSH":{"a":"( x )","d":"Math and trigonometry function used to return the hyperbolic cosine of a number"},"COT":{"a":"( x )","d":"Math and trigonometry function used to return the cotangent of an angle specified in radians"},"COTH":{"a":"( x )","d":"Math and trigonometry function used to return the hyperbolic cotangent of a hyperbolic angle"},"CSC":{"a":"( x )","d":"Math and trigonometry function used to return the cosecant of an angle"},"CSCH":{"a":"( x )","d":"Math and trigonometry function used to return the hyperbolic cosecant of an angle"},"DECIMAL":{"a":"( text , base )","d":"Converts a text representation of a number in a given base into a decimal number"},"DEGREES":{"a":"( angle )","d":"Math and trigonometry function used to convert radians into degrees"},"EVEN":{"a":"( x )","d":"Math and trigonometry function used to round the number up to the nearest even integer"},"EXP":{"a":"( x )","d":"Math and trigonometry function used to return the e constant raised to the desired power. The e constant is equal to 2,71828182845904"},"FACT":{"a":"( x )","d":"Math and trigonometry function used to return the factorial of a number"},"FACTDOUBLE":{"a":"( x )","d":"Math and trigonometry function used to return the double factorial of a number"},"FLOOR":{"a":"( x, significance )","d":"Math and trigonometry function used to round the number down to the nearest multiple of significance"},"FLOOR.PRECISE":{"a":"( x, significance )","d":"Math and trigonometry function used to return a number that is rounded down to the nearest integer or to the nearest multiple of significance"},"FLOOR.MATH":{"a":"( x, significance )","d":"Math and trigonometry function used to round a number down to the nearest integer or to the nearest multiple of significance"},"GCD":{"a":"( argument-list )","d":"Math and trigonometry function used to return the greatest common divisor of two or more numbers"},"INT":{"a":"( x )","d":"Math and trigonometry function used to analyze and return the integer part of the specified number"},"ISO.CEILING":{"a":"( number [ , significance ] )","d":"Math and trigonometry function used to return a number that is rounded up to the nearest integer or to the nearest multiple of significance regardless of the sign of the number. However, if the number or the significance is zero, zero is returned."},"LCM":{"a":"( argument-list )","d":"Math and trigonometry function used to return the lowest common multiple of one or more numbers"},"LN":{"a":"( x )","d":"Math and trigonometry function used to return the natural logarithm of a number"},"LOG":{"a":"( x [ , base ] )","d":"Math and trigonometry function used to return the logarithm of a number to a specified base"},"LOG10":{"a":"( x )","d":"Math and trigonometry function used to return the logarithm of a number to a base of 10"},"MDETERM":{"a":"( array )","d":"Math and trigonometry function used to return the matrix determinant of an array"},"MINVERSE":{"a":"( array )","d":"Math and trigonometry function used to return the inverse matrix for a given matrix and display the first value of the returned array of numbers"},"MMULT":{"a":"( array1, array2 )","d":"Math and trigonometry function used to return the matrix product of two arrays and display the first value of the returned array of numbers"},"MOD":{"a":"( x, y )","d":"Math and trigonometry function used to return the remainder after the division of a number by the specified divisor"},"MROUND":{"a":"( x, multiple )","d":"Math and trigonometry function used to round the number to the desired multiple"},"MULTINOMIAL":{"a":"( argument-list )","d":"Math and trigonometry function used to return the ratio of the factorial of a sum of numbers to the product of factorials"},"ODD":{"a":"( x )","d":"Math and trigonometry function used to round the number up to the nearest odd integer"},"PI":{"a":"()","d":"math and trigonometry functions. The function returns the mathematical constant pi, equal to 3.14159265358979. It does not require any argument"},"POWER":{"a":"( x, y )","d":"Math and trigonometry function used to return the result of a number raised to the desired power"},"PRODUCT":{"a":"( argument-list )","d":"Math and trigonometry function used to multiply all the numbers in the selected range of cells and return the product"},"QUOTIENT":{"a":"( dividend , divisor )","d":"Math and trigonometry function used to return the integer portion of a division"},"RADIANS":{"a":"( angle )","d":"Math and trigonometry function used to convert degrees into radians"},"RAND":{"a":"()","d":"math and trigonometry functions. The function returns a random number greater than or equal to 0 and less than 1. It does not require any argument"},"RANDBETWEEN":{"a":"( lower-bound , upper-bound )","d":"math and trigonometry functions. The function returns a random number greater than or equal to lower-bound and less than or equal to upper-bound"},"ROMAN":{"a":"( number, form )","d":"math and trigonometry functions. The function is used to convert a number to a roman numeral"},"ROUND":{"a":"( x , number-digits )","d":"Math and trigonometry function used to round the number to the desired number of digits"},"ROUNDDOWN":{"a":"( x , number-digits )","d":"Math and trigonometry function used to round the number down to the desired number of digits"},"ROUNDUP":{"a":"( x , number-digits )","d":"Math and trigonometry function used to round the number up to the desired number of digits"},"SEC":{"a":"( x )","d":"Math and trigonometry function used to return the secant of an angle"},"SECH":{"a":"( x )","d":"Math and trigonometry function used to return the hyperbolic secant of an angle"},"SERIESSUM":{"a":"( input-value , initial-power , step , coefficients )","d":"Math and trigonometry function used to return the sum of a power series"},"SIGN":{"a":"( x )","d":"Math and trigonometry function used to return the sign of a number. If the number is positive, the function returns 1. If the number is negative, the function returns -1. If the number is 0, the function returns 0"},"SIN":{"a":"( x )","d":"Math and trigonometry function used to return the sine of an angle"},"SINH":{"a":"( x )","d":"Math and trigonometry function used to return the hyperbolic sine of a number"},"SQRT":{"a":"( x )","d":"Math and trigonometry function used to return the square root of a number"},"SQRTPI":{"a":"( x )","d":"one of the Math and trigonometry function used to return the square root of the pi constant (3.14159265358979) multiplied by the specified number"},"SUBTOTAL":{"a":"( function-number , argument-list )","d":"Returns a subtotal in a list or database"},"SUM":{"a":"( argument-list )","d":"Math and trigonometry function used to add all the numbers in the selected range of cells and return the result"},"SUMIF":{"a":"( cell-range, selection-criteria [ , sum-range ] )","d":"Math and trigonometry function used to add all the numbers in the selected range of cells based on the specified criterion and return the result"},"SUMIFS":{"a":"( sum-range, criteria-range1, criteria1, [ criteria-range2, criteria2 ], ... )","d":"Math and trigonometry function used to add all the numbers in the selected range of cells based on multiple criteria and return the result"},"SUMPRODUCT":{"a":"( argument-list )","d":"Math and trigonometry function used to multiply the values in the selected ranges of cells or arrays and return the sum of the products"},"SUMSQ":{"a":"( argument-list )","d":"Math and trigonometry function used to add the squares of numbers and return the result"},"SUMX2MY2":{"a":"( array-1 , array-2 )","d":"Math and trigonometry function used to sum the difference of squares between two arrays"},"SUMX2PY2":{"a":"( array-1 , array-2 )","d":"Math and trigonometry function used to sum the squares of numbers in the selected arrays and return the sum of the results"},"SUMXMY2":{"a":"( array-1 , array-2 )","d":"Math and trigonometry function used to return the sum of the squares of the differences between corresponding items in the arrays"},"TAN":{"a":"( x )","d":"Math and trigonometry function used to return the tangent of an angle"},"TANH":{"a":"( x )","d":"Math and trigonometry function used to return the hyperbolic tangent of a number"},"TRUNC":{"a":"( x [ , number-digits ] )","d":"Math and trigonometry function used to return a number truncated to a specified number of digits"},"ADDRESS":{"a":"( row-number , col-number [ , [ ref-type ] [ , [ A1-ref-style-flag ] [ , sheet-name ] ] ] )","d":"Lookup and reference function used to return a text representation of a cell address"},"CHOOSE":{"a":"( index , argument-list )","d":"Lookup and reference function used to return a value from a list of values based on a specified index (position)"},"COLUMN":{"a":"( [ reference ] )","d":"Lookup and reference function used to return the column number of a cell"},"COLUMNS":{"a":"( array )","d":"Lookup and reference function used to return the number of columns in a cell reference"},"HLOOKUP":{"a":"( lookup-value , table-array , row-index-num [ , [ range-lookup-flag ] ] )","d":"Lookup and reference function used to perform the horizontal search for a value in the top row of a table or an array and return the value in the same column based on a specified row index number"},"INDEX":{"a":"( array , [ row-number ] [ , [ column-number ] ] ) INDEX( reference , [ row-number ] [ , [ column-number ] [ , [ area-number ] ] ] )","d":"Lookup and reference function used to return a value within a range of cells on the base of a specified row and column number. The INDEX function has two forms"},"INDIRECT":{"a":"( ref-text [ , [ A1-ref-style-flag ] ] )","d":"Lookup and reference function used to return the reference to a cell based on its string representation"},"LOOKUP":{"a":"( lookup-value , lookup-vector , result-vector )","d":"Lookup and reference function used to return a value from a selected range (row or column containing the data in ascending order)"},"MATCH":{"a":"( lookup-value , lookup-array [ , [ match-type ]] )","d":"Lookup and reference function used to return a relative position of a specified item in a range of cells"},"OFFSET":{"a":"( reference , rows , cols [ , [ height ] [ , [ width ] ] ] )","d":"Lookup and reference function used to return a reference to a cell displaced from the specified cell (or the upper-left cell in the range of cells) to a certain number of rows and columns"},"ROW":{"a":"( [ reference ] )","d":"Lookup and reference function used to return the row number of a cell reference"},"ROWS":{"a":"( array )","d":"Lookup and reference function used to return the number of rows in a cell references"},"TRANSPOSE":{"a":"( array )","d":"Lookup and reference function used to return the first element of an array"},"VLOOKUP":{"a":"( lookup-value , table-array , col-index-num [ , [ range-lookup-flag ] ] )","d":"Lookup and reference function used to perform the vertical search for a value in the left-most column of a table or an array and return the value in the same row based on a specified column index number"},"ERROR.TYPE":{"a":"(value)","d":"Information function used to return the numeric representation of one of the existing errors"},"ISBLANK":{"a":"(value)","d":"Information function used to check if the cell is empty or not. If the cell does not contain any value, the function returns TRUE, otherwise the function returns FALSE"},"ISERR":{"a":"(value)","d":"Information function used to check for an error value. If the cell contains an error value (except #N/A), the function returns TRUE, otherwise the function returns FALSE"},"ISERROR":{"a":"(value)","d":"Information function used to check for an error value. If the cell contains one of the error values: #N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME? or #NULL, the function returns TRUE, otherwise the function returns FALSE"},"ISEVEN":{"a":"(number)","d":"Information function used to check for an even value. If the cell contains an even value, the function returns TRUE. If the value is odd, it returns FALSE"},"ISLOGICAL":{"a":"(value)","d":"Information function used to check for a logical value (TRUE or FALSE). If the cell contains a logical value, the function returns TRUE, otherwise the function returns FALSE"},"ISNA":{"a":"(value)","d":"Information function used to check for a #N/A error. If the cell contains a #N/A error value, the function returns TRUE, otherwise the function returns FALSE"},"ISNONTEXT":{"a":"(value)","d":"Information function used to check for a value that is not a text. If the cell does not contain a text value, the function returns TRUE, otherwise the function returns FALSE"},"ISNUMBER":{"a":"(value)","d":"Information function used to check for a numeric value. If the cell contains a numeric value, the function returns TRUE, otherwise the function returns FALSE"},"ISODD":{"a":"(number)","d":"Information function used to check for an odd value. If the cell contains an odd value, the function returns TRUE. If the value is even, it returns FALSE"},"ISREF":{"a":"(value)","d":"Information function used to verify if the value is a valid cell reference"},"ISTEXT":{"a":"(value)","d":"Information function used to check for a text value. If the cell contains a text value, the function returns TRUE, otherwise the function returns FALSE"},"N":{"a":"(value)","d":"Information function used to convert a value to a number"},"NA":{"a":"()","d":"Information function used to return the #N/A error value. This function does not require an argument"},"TYPE":{"a":"(value)","d":"Information function used to determine the type of the resulting or displayed value"},"AND":{"a":"(logical1, logical2, ...)","d":"Logical function used to check if the logical value you enter is TRUE or FALSE. The function returns TRUE if all the arguments are TRUE"},"FALSE":{"a":"()","d":"logical functions. The function returns FALSE and does not require any argument"},"IF":{"a":"(logical_test, value_if_true, value_if_false)","d":"Logical function used to check the logical expression and return one value if it is TRUE, or another if it is FALSE"},"IFERROR":{"a":"(value, value_if_error)","d":"Logical function used to check if there is an error in the formula in the first argument. The function returns the result of the formula if there is no error, or the value_if_error if there is one"},"NOT":{"a":"(logical)","d":"Logical function used to check if the logical value you enter is TRUE or FALSE. The function returns TRUE if the argument is FALSE and FALSE if the argument is TRUE"},"OR":{"a":"(logical1, logical2, ...)","d":"Logical function used to check if the logical value you enter is TRUE or FALSE. The function returns FALSE if all the arguments are FALSE"},"TRUE":{"a":"()","d":"logical functions which returns TRUE and does not require any argument"}} \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/resources/formula-lang/pl.json b/apps/spreadsheeteditor/main/resources/formula-lang/pl.json index bc1f87ee1..25e44fde9 100644 --- a/apps/spreadsheeteditor/main/resources/formula-lang/pl.json +++ b/apps/spreadsheeteditor/main/resources/formula-lang/pl.json @@ -1 +1 @@ -{"DATE":"DATA","DATEDIF":"DATA.JEŻELI","DATEVALUE":"DATA.WARTOŚĆ","DAY":"DZIEŃ","DAYS360":"DNI.360","EDATE":"NR.SER.DATY","EOMONTH":"NR.SER.OST.DN.MIES","HOUR":"GODZINA","MINUTE":"MINUTA","MONTH":"MIESIĄC","NETWORKDAYS":"DNI.ROBOCZE","NOW":"TERAZ","SECOND":"SEKUNDA","TIME":"CZAS","TIMEVALUE":"CZAS.WARTOŚĆ","TODAY":"DZIŚ","WEEKDAY":"DZIEŃ.TYG","WEEKNUM":"NUM.TYG","WORKDAY":"DZIEŃ.ROBOCZY","YEAR":"ROK","YEARFRAC":"CZĘŚĆ.ROKU","BIN2DEC":"DWÓJK.NA.DZIES","BIN2HEX":"DWÓJK.NA.SZESN","BIN2OCT":"DWÓJK.NA.ÓSM","COMPLEX":"LICZBA.ZESP","DEC2BIN":"DZIES.NA.DWÓJK","DEC2HEX":"DZIES.NA.SZESN","DEC2OCT":"DZIES.NA.ÓSM","DELTA":"CZY.RÓWNE","ERF":"FUNKCJA.BŁ","ERFC":"KOMP.FUNKCJA.BŁ","GESTEP":"SPRAWDŹ.PRÓG","HEX2BIN":"SZESN.NA.DWÓJK","HEX2DEC":"SZESN.NA.DZIES","HEX2OCT":"SZESN.NA.ÓSM","IMABS":"MODUŁ.LICZBY.ZESP","IMAGINARY":"CZ.UROJ.LICZBY.ZESP","IMARGUMENT":"ARG.LICZBY.ZESP","IMCONJUGATE":"SPRZĘŻ.LICZBY.ZESP","IMCOS":"COS.LICZBY.ZESP","IMDIV":"ILORAZ.LICZB.ZESP","IMEXP":"EXP.LICZBY.ZESP","IMLN":"LN.LICZBY.ZESP","IMLOG10":"LOG10.LICZBY.ZESP","IMLOG2":"LOG2.LICZBY.ZESP","IMPOWER":"POTĘGA.LICZBY.ZESP","IMPRODUCT":"ILOCZYN.LICZB.ZESP","IMREAL":"CZ.RZECZ.LICZBY.ZESP","IMSIN":"SIN.LICZBY.ZESP","IMSQRT":"PIERWIASTEK.LICZBY.ZESP","IMSUB":"RÓŻN.LICZB.ZESP","IMSUM":"SUMA.LICZB.ZESP","OCT2BIN":"ÓSM.NA.DWÓJK","OCT2DEC":"ÓSM.NA.DZIES","OCT2HEX":"ÓSM.NA.SZESN","CHAR":"ZNAK","CLEAN":"OCZYŚĆ","CODE":"KOD","CONCATENATE":"ZŁĄCZ.TEKSTY","DOLLAR":"KWOTA","EXACT":"PORÓWNAJ","FIND":"ZNAJDŹ","FINDB":"ZNAJDŹB","FIXED":"ZAOKR.DO.TEKST","LEFT":"LEWY","LEFTB":"LEWYB","LEN":"DŁ","LENB":"DŁ.B","LOWER":"LITERY.MAŁE","MID":"FRAGMENT.TEKSTU","MIDB":"FRAGMENT.TEKSTU.B","PROPER":"Z.WIELKIEJ.LITERY","REPLACE":"ZASTĄP","REPLACEB":"ZASTĄP.B","REPT":"POWT","RIGHT":"PRAWY","RIGHTB":"PRAWY.B","SEARCH":"SZUKAJ.TEKST","SEARCHB":"SZUKAJ.TEKST.B","SUBSTITUTE":"PODSTAW","T":"T","TEXT":"TEKST","TRIM":"USUŃ.ZBĘDNE.ODSTĘPY","UPPER":"LITERY.WIELKIE","VALUE":"WARTOŚĆ","AVEDEV":"ODCH.ŚREDNIE","AVERAGE":"ŚREDNIA","AVERAGEA":"ŚREDNIA.A","AVERAGEIF":"ŚREDNIA.JEŻELI","AVERAGEIFS":"ŚREDNIA.WARUNKÓW","BINOMDIST":"ROZKŁ.DWUM","CONFIDENCE":"UFNOŚĆ","CORREL":"WSP.KORELACJI","COUNT":"ILE.LICZB","COUNTA":"ILE.NIEPUSTYCH","COUNTBLANK":"LICZ.PUSTE","COUNTIF":"LICZ.JEŻELI","COUNTIFS":"LICZ.WARUNKI","COVAR":"KOWARIANCJA","CRITBINOM":"PRÓG.ROZKŁAD.DWUM","DEVSQ":"ODCH.KWADRATOWE","EXPONDIST":"ROZKŁAD.EXP","FISHER":"ROZKŁAD.FISHER","FISHERINV":"ROZKŁAD.FISHER.ODW","FORECAST":"REGLINX","FREQUENCY":"CZĘSTOŚĆ","GAMMALN":"ROZKŁAD.LIN.GAMMA","GEOMEAN":"ŚREDNIA.GEOMETRYCZNA","HARMEAN":"ŚREDNIA.HARMONICZNA","HYPGEOMDIST":"ROZKŁAD.HIPERGEOM","INTERCEPT":"ODCIĘTA","KURT":"KURTOZA","LARGE":"MAX.K","LOGINV":"ROZKŁAD.LOG.ODW","LOGNORMDIST":"ROZKŁAD.LOG","MAX":"MAX","MAXA":"MAX.A","MEDIAN":"MEDIANA","MIN":"MIN","MINA":"MIN.A","MODE":"WYST.NAJCZĘŚCIEJ","NEGBINOMDIST":"ROZKŁAD.DWUM.PRZEC","NORMDIST":"ROZKŁAD.NORMALNY.S","NORMINV":"ROZKŁAD.NORMALNY.ODW","NORMSDIST":"ROZKŁAD.NORMALNY","NORMSINV":"ROZKŁAD.NORMALNY.S.ODW","PEARSON":"PEARSON","PERCENTILE":"PERCENTYL","PERCENTRANK":"PROCENT.POZYCJA","PERMUT":"PERMUTACJE","POISSON":"ROZKŁAD.POISSON","PROB":"PRAWDPD","QUARTILE":"KWARTYL","RSQ":"R.KWADRAT","SKEW":"SKOŚNOŚĆ","SLOPE":"NACHYLENIE","SMALL":"MIN.K","STANDARDIZE":"NORMALIZUJ","STDEV":"ODCH.STANDARDOWE","STDEVA":"ODCH.STANDARDOWE.A","STDEVP":"ODCH.STANDARD.POPUL","STDEVPA":"ODCH.STANDARD.POPUL.A","STEYX":"REGBŁSTD","VAR":"WARIANCJA","VARA":"WARIANCJA.A","VARP":"WARIANCJA.POPUL","VARPA":"WARIANCJA.POPUL.A","ACCRINT":"NAL.ODS","ACCRINTM":"NAL.ODS.WYKUP","AMORDEGRC":"AMORT.NIELIN","AMORLINC":"AMORT.LIN","COUPDAYBS":"WYPŁ.DNI.OD.POCZ","COUPDAYS":"WYPŁ.DNI","COUPDAYSNC":"WYPŁ.DNI.NAST","COUPNCD":"WYPŁ.DATA.NAST","COUPNUM":"WYPŁ.LICZBA","COUPPCD":"WYPŁ.DATA.POPRZ","CUMIPMT":"SPŁAC.ODS","CUMPRINC":"SPŁAC.KAPIT","DB":"DB","DDB":"DDB","DISC":"STOPA.DYSK","DOLLARDE":"CENA.DZIES","DOLLARFR":"CENA.UŁAM","DURATION":"ROCZ.PRZYCH","EFFECT":"EFEKTYWNA","FV":"FV","FVSCHEDULE":"WART.PRZYSZŁ.KAP","INTRATE":"STOPA.PROC","IPMT":"IPMT","IRR":"IRR","ISPMT":"ISPMT","MDURATION":"ROCZ.PRZYCH.M","MIRR":"MIRR","NOMINAL":"NOMINALNA","NPER":"NPER","NPV":"NPV","ODDFPRICE":"CENA.PIERW.OKR","ODDFYIELD":"RENT.PIERW.OKR","ODDLPRICE":"CENA.OST.OKR","ODDLYIELD":"RENT.OST.OKR","PMT":"PMT","PPMT":"PPMT","PRICE":"CENA","PRICEDISC":"CENA.DYSK","PRICEMAT":"CENA.WYKUP","PV":"PV","RATE":"RATE","RECEIVED":"KWOTA.WYKUP","SLN":"SLN","SYD":"SYD","TBILLEQ":"RENT.EKW.BS","TBILLPRICE":"CENA.BS","TBILLYIELD":"RENT.BS","VDB":"VDB","XIRR":"XIRR","XNPV":"XNPV","YIELD":"RENTOWNOŚĆ","YIELDDISC":"RENT.DYSK","YIELDMAT":"RENT.WYKUP","ABS":"MODUŁ.LICZBY","ACOS":"ACOS","ACOSH":"ACOSH","ASIN":"ASIN","ASINH":"ASINH","ATAN":"ATAN","ATAN2":"ATAN2","ATANH":"ATANH","CEILING":"ZAOKR.W.GÓRĘ","COMBIN":"KOMBINACJE","COS":"COS","COSH":"COSH","DEGREES":"STOPNIE","EVEN":"ZAOKR.DO.PARZ","EXP":"EXP","FACT":"SILNIA","FACTDOUBLE":"SILNIA.DWUKR","FLOOR":"ZAOKR.W.DÓŁ","GCD":"NAJW.WSP.DZIEL","INT":"ZAOKR.DO.CAŁK","LCM":"NAJMN.WSP.WIEL","LN":"LN","LOG":"LOG","LOG10":"LOG10","MDETERM":"WYZNACZNIK.MACIERZY","MINVERSE":"MACIERZ.ODW","MMULT":"MACIERZ.ILOCZYN","MOD":"MOD","MROUND":"ZAOKR.DO.WIELOKR","MULTINOMIAL":"WIELOMIAN","ODD":"ZAOKR.DO.NPARZ","PI":"PI","POWER":"POTĘGA","PRODUCT":"ILOCZYN","QUOTIENT":"CZ.CAŁK.DZIELENIA","RADIANS":"RADIANY","RAND":"LOS","RANDBETWEEN":"LOS.ZAKR","ROMAN":"RZYMSKIE","ROUND":"ZAOKR","ROUNDDOWN":"ZAOKR.DÓŁ","ROUNDUP":"ZAOKR.GÓRA","SERIESSUM":"SUMA.SZER.POT","SIGN":"ZNAK.LICZBY","SIN":"SIN","SINH":"SINH","SQRT":"PIERWIASTEK","SQRTPI":"PIERW.PI","SUBTOTAL":"SUMY.CZĘŚCIOWE","SUM":"SUMA","SUMIF":"SUMA.JEŻELI","SUMIFS":"SUMA.WARUNKÓW","SUMPRODUCT":"SUMA.ILOCZYNÓW","SUMSQ":"SUMA.KWADRATÓW","SUMX2MY2":"SUMA.X2.M.Y2","SUMX2PY2":"SUMA.X2.P.Y2","SUMXMY2":"SUMA.XMY.2","TAN":"TAN","TANH":"TANH","TRUNC":"LICZBA.CAŁK","ADDRESS":"ADRES","CHOOSE":"WYBIERZ","COLUMN":"NR.KOLUMNY","COLUMNS":"LICZBA.KOLUMN","HLOOKUP":"WYSZUKAJ.POZIOMO","INDEX":"INDEKS","INDIRECT":"ADR.POŚR","LOOKUP":"WYSZUKAJ","MATCH":"PODAJ.POZYCJĘ","OFFSET":"PRZESUNIĘCIE","ROW":"WIERSZ","ROWS":"ILE.WIERSZY","TRANSPOSE":"TRANSPONUJ","VLOOKUP":"WYSZUKAJ.PIONOWO","ERROR.TYPE":"NR.BŁĘDU","ISBLANK":"CZY.PUSTA","ISERR":"CZY.BŁ","ISERROR":"CZY.BŁĄD","ISEVEN":"CZY.PARZYSTE","ISLOGICAL":"CZY.LOGICZNA","ISNA":"CZY.BRAK","ISNONTEXT":"CZY.NIE.TEKST","ISNUMBER":"CZY.LICZBA","ISODD":"CZY.NIEPARZYSTE","ISREF":"CZY.ADR","ISTEXT":"CZY.TEKST","N":"N","NA":"BRAK","TYPE":"TYP","AND":"ORAZ","FALSE":"FAŁSZ","IF":"JEŻELI","IFERROR":"JEŻELI.BŁĄD","NOT":"NIE","OR":"LUB","TRUE":"PRAWDA","LocalFormulaOperands":{"StructureTables":{"h":"Wszystkie","d":"Dane","a":"Nagłówki","tr":"Ten wiersz","t":"Sumy"},"CONST_TRUE_FALSE":{"t":"PRAWDA","f":"FAŁSZ"},"CONST_ERROR":{"nil":"#ZERO!","div":"#DZIEL/0!","value":"#ARG!","ref":"#ADR!","name":"#NAZWA?","num":"#LICZBA!","na":"#N/D","getdata":"#GETTING_DATA","uf":"#NIEOBSŁUGIWANE_FUNKCJA!"}}} \ No newline at end of file +{"DATE":"DATA","DATEDIF":"DATA.JEŻELI","DATEVALUE":"DATA.WARTOŚĆ","DAY":"DZIEŃ","DAYS360":"DNI.360","EDATE":"NR.SER.DATY","EOMONTH":"NR.SER.OST.DN.MIES","HOUR":"GODZINA","MINUTE":"MINUTA","MONTH":"MIESIĄC","NETWORKDAYS":"DNI.ROBOCZE","NOW":"TERAZ","SECOND":"SEKUNDA","TIME":"CZAS","TIMEVALUE":"CZAS.WARTOŚĆ","TODAY":"DZIŚ","WEEKDAY":"DZIEŃ.TYG","WEEKNUM":"NUM.TYG","WORKDAY":"DZIEŃ.ROBOCZY","YEAR":"ROK","YEARFRAC":"CZĘŚĆ.ROKU","BIN2DEC":"DWÓJK.NA.DZIES","BIN2HEX":"DWÓJK.NA.SZESN","BIN2OCT":"DWÓJK.NA.ÓSM","COMPLEX":"LICZBA.ZESP","DEC2BIN":"DZIES.NA.DWÓJK","DEC2HEX":"DZIES.NA.SZESN","DEC2OCT":"DZIES.NA.ÓSM","DELTA":"CZY.RÓWNE","ERF":"FUNKCJA.BŁ","ERFC":"KOMP.FUNKCJA.BŁ","GESTEP":"SPRAWDŹ.PRÓG","HEX2BIN":"SZESN.NA.DWÓJK","HEX2DEC":"SZESN.NA.DZIES","HEX2OCT":"SZESN.NA.ÓSM","IMABS":"MODUŁ.LICZBY.ZESP","IMAGINARY":"CZ.UROJ.LICZBY.ZESP","IMARGUMENT":"ARG.LICZBY.ZESP","IMCONJUGATE":"SPRZĘŻ.LICZBY.ZESP","IMCOS":"COS.LICZBY.ZESP","IMCOSH":"COSH.LICZBY.ZESP","IMCOT":"COT.LICZBY.ZESP","IMCSC":"CSC.LICZBY.ZESP","IMCSCH":"CSCH.LICZBY.ZESP","IMDIV":"ILORAZ.LICZB.ZESP","IMEXP":"EXP.LICZBY.ZESP","IMLN":"LN.LICZBY.ZESP","IMLOG10":"LOG10.LICZBY.ZESP","IMLOG2":"LOG2.LICZBY.ZESP","IMPOWER":"POTĘGA.LICZBY.ZESP","IMPRODUCT":"ILOCZYN.LICZB.ZESP","IMREAL":"CZ.RZECZ.LICZBY.ZESP","IMSEC":"SEC.LICZBY.ZESP","IMSECH":"SECH.LICZBY.ZESP","IMSIN":"SIN.LICZBY.ZESP","IMSINH":"SINH.LICZBY.ZESP","IMSQRT":"PIERWIASTEK.LICZBY.ZESP","IMSUB":"RÓŻN.LICZB.ZESP","IMSUM":"SUMA.LICZB.ZESP","IMTAN":"TAN.LICZBY.ZESP","OCT2BIN":"ÓSM.NA.DWÓJK","OCT2DEC":"ÓSM.NA.DZIES","OCT2HEX":"ÓSM.NA.SZESN","CHAR":"ZNAK","CLEAN":"OCZYŚĆ","CODE":"KOD","CONCATENATE":"ZŁĄCZ.TEKSTY","DOLLAR":"KWOTA","EXACT":"PORÓWNAJ","FIND":"ZNAJDŹ","FINDB":"ZNAJDŹB","FIXED":"ZAOKR.DO.TEKST","LEFT":"LEWY","LEFTB":"LEWYB","LEN":"DŁ","LENB":"DŁ.B","LOWER":"LITERY.MAŁE","MID":"FRAGMENT.TEKSTU","MIDB":"FRAGMENT.TEKSTU.B","PROPER":"Z.WIELKIEJ.LITERY","REPLACE":"ZASTĄP","REPLACEB":"ZASTĄP.B","REPT":"POWT","RIGHT":"PRAWY","RIGHTB":"PRAWY.B","SEARCH":"SZUKAJ.TEKST","SEARCHB":"SZUKAJ.TEKST.B","SUBSTITUTE":"PODSTAW","T":"T","TEXT":"TEKST","TRIM":"USUŃ.ZBĘDNE.ODSTĘPY","UPPER":"LITERY.WIELKIE","VALUE":"WARTOŚĆ","AVEDEV":"ODCH.ŚREDNIE","AVERAGE":"ŚREDNIA","AVERAGEA":"ŚREDNIA.A","AVERAGEIF":"ŚREDNIA.JEŻELI","AVERAGEIFS":"ŚREDNIA.WARUNKÓW","BINOMDIST":"ROZKŁ.DWUM","CONFIDENCE":"UFNOŚĆ","CORREL":"WSP.KORELACJI","COUNT":"ILE.LICZB","COUNTA":"ILE.NIEPUSTYCH","COUNTBLANK":"LICZ.PUSTE","COUNTIF":"LICZ.JEŻELI","COUNTIFS":"LICZ.WARUNKI","COVAR":"KOWARIANCJA","CRITBINOM":"PRÓG.ROZKŁAD.DWUM","DEVSQ":"ODCH.KWADRATOWE","EXPONDIST":"ROZKŁAD.EXP","FISHER":"ROZKŁAD.FISHER","FISHERINV":"ROZKŁAD.FISHER.ODW","FORECAST":"REGLINX","FREQUENCY":"CZĘSTOŚĆ","GAMMALN":"ROZKŁAD.LIN.GAMMA","GEOMEAN":"ŚREDNIA.GEOMETRYCZNA","HARMEAN":"ŚREDNIA.HARMONICZNA","HYPGEOMDIST":"ROZKŁAD.HIPERGEOM","INTERCEPT":"ODCIĘTA","KURT":"KURTOZA","LARGE":"MAX.K","LOGINV":"ROZKŁAD.LOG.ODW","LOGNORMDIST":"ROZKŁAD.LOG","MAX":"MAX","MAXA":"MAX.A","MEDIAN":"MEDIANA","MIN":"MIN","MINA":"MIN.A","MODE":"WYST.NAJCZĘŚCIEJ","NEGBINOMDIST":"ROZKŁAD.DWUM.PRZEC","NORMDIST":"ROZKŁAD.NORMALNY.S","NORMINV":"ROZKŁAD.NORMALNY.ODW","NORMSDIST":"ROZKŁAD.NORMALNY","NORMSINV":"ROZKŁAD.NORMALNY.S.ODW","PEARSON":"PEARSON","PERCENTILE":"PERCENTYL","PERCENTRANK":"PROCENT.POZYCJA","PERMUT":"PERMUTACJE","POISSON":"ROZKŁAD.POISSON","PROB":"PRAWDPD","QUARTILE":"KWARTYL","RSQ":"R.KWADRAT","SKEW":"SKOŚNOŚĆ","SLOPE":"NACHYLENIE","SMALL":"MIN.K","STANDARDIZE":"NORMALIZUJ","STDEV":"ODCH.STANDARDOWE","STDEVA":"ODCH.STANDARDOWE.A","STDEVP":"ODCH.STANDARD.POPUL","STDEVPA":"ODCH.STANDARD.POPUL.A","STEYX":"REGBŁSTD","VAR":"WARIANCJA","VARA":"WARIANCJA.A","VARP":"WARIANCJA.POPUL","VARPA":"WARIANCJA.POPUL.A","ACCRINT":"NAL.ODS","ACCRINTM":"NAL.ODS.WYKUP","AMORDEGRC":"AMORT.NIELIN","AMORLINC":"AMORT.LIN","COUPDAYBS":"WYPŁ.DNI.OD.POCZ","COUPDAYS":"WYPŁ.DNI","COUPDAYSNC":"WYPŁ.DNI.NAST","COUPNCD":"WYPŁ.DATA.NAST","COUPNUM":"WYPŁ.LICZBA","COUPPCD":"WYPŁ.DATA.POPRZ","CUMIPMT":"SPŁAC.ODS","CUMPRINC":"SPŁAC.KAPIT","DB":"DB","DDB":"DDB","DISC":"STOPA.DYSK","DOLLARDE":"CENA.DZIES","DOLLARFR":"CENA.UŁAM","DURATION":"ROCZ.PRZYCH","EFFECT":"EFEKTYWNA","FV":"FV","FVSCHEDULE":"WART.PRZYSZŁ.KAP","INTRATE":"STOPA.PROC","IPMT":"IPMT","IRR":"IRR","ISPMT":"ISPMT","MDURATION":"ROCZ.PRZYCH.M","MIRR":"MIRR","NOMINAL":"NOMINALNA","NPER":"NPER","NPV":"NPV","ODDFPRICE":"CENA.PIERW.OKR","ODDFYIELD":"RENT.PIERW.OKR","ODDLPRICE":"CENA.OST.OKR","ODDLYIELD":"RENT.OST.OKR","PMT":"PMT","PPMT":"PPMT","PRICE":"CENA","PRICEDISC":"CENA.DYSK","PRICEMAT":"CENA.WYKUP","PV":"PV","RATE":"RATE","RECEIVED":"KWOTA.WYKUP","SLN":"SLN","SYD":"SYD","TBILLEQ":"RENT.EKW.BS","TBILLPRICE":"CENA.BS","TBILLYIELD":"RENT.BS","VDB":"VDB","XIRR":"XIRR","XNPV":"XNPV","YIELD":"RENTOWNOŚĆ","YIELDDISC":"RENT.DYSK","YIELDMAT":"RENT.WYKUP","ABS":"MODUŁ.LICZBY","ACOS":"ACOS","ACOSH":"ACOSH","ACOT":"ACOT","ACOTH":"ACOTH","ARABIC":"ARABSKIE","ASIN":"ASIN","ASINH":"ASINH","ATAN":"ATAN","ATAN2":"ATAN2","ATANH":"ATANH","BASE":"PODSTAWA","CEILING":"ZAOKR.W.GÓRĘ","CEILING.MATH":"ZAOKR.W.GÓRĘ.MATEMATYCZNE","CEILING.PRESIZE":"ZAOKR.W.GÓRĘ.DOKŁ","COMBIN":"KOMBINACJE","COMBINA":"KOMBINACJE.A","COS":"COS","COSH":"COSH","COT":"COT","COTH":"COTH","CSC":"CSC","CSCH":"CSCH","DECIMAL":"DZIESIĘTNA","DEGREES":"STOPNIE","EVEN":"ZAOKR.DO.PARZ","EXP":"EXP","FACT":"SILNIA","FACTDOUBLE":"SILNIA.DWUKR","FLOOR":"ZAOKR.W.DÓŁ","FLOOR.PRECISE":"ZAOKR.W.DÓŁ.DOKŁ","FLOOR.MATH":"ZAOKR.W.DÓŁ.MATEMATYCZNE","GCD":"NAJW.WSP.DZIEL","INT":"ZAOKR.DO.CAŁK","ISO.CEILING":"ISO.ZAOKR.W.GÓRĘ","LCM":"NAJMN.WSP.WIEL","LN":"LN","LOG":"LOG","LOG10":"LOG10","MDETERM":"WYZNACZNIK.MACIERZY","MINVERSE":"MACIERZ.ODW","MMULT":"MACIERZ.ILOCZYN","MOD":"MOD","MROUND":"ZAOKR.DO.WIELOKR","MULTINOMIAL":"WIELOMIAN","ODD":"ZAOKR.DO.NPARZ","PI":"PI","POWER":"POTĘGA","PRODUCT":"ILOCZYN","QUOTIENT":"CZ.CAŁK.DZIELENIA","RADIANS":"RADIANY","RAND":"LOS","RANDBETWEEN":"LOS.ZAKR","ROMAN":"RZYMSKIE","ROUND":"ZAOKR","ROUNDDOWN":"ZAOKR.DÓŁ","ROUNDUP":"ZAOKR.GÓRA","SEC":"SEC","SECH":"SECH","SERIESSUM":"SUMA.SZER.POT","SIGN":"ZNAK.LICZBY","SIN":"SIN","SINH":"SINH","SQRT":"PIERWIASTEK","SQRTPI":"PIERW.PI","SUBTOTAL":"SUMY.CZĘŚCIOWE","SUM":"SUMA","SUMIF":"SUMA.JEŻELI","SUMIFS":"SUMA.WARUNKÓW","SUMPRODUCT":"SUMA.ILOCZYNÓW","SUMSQ":"SUMA.KWADRATÓW","SUMX2MY2":"SUMA.X2.M.Y2","SUMX2PY2":"SUMA.X2.P.Y2","SUMXMY2":"SUMA.XMY.2","TAN":"TAN","TANH":"TANH","TRUNC":"LICZBA.CAŁK","ADDRESS":"ADRES","CHOOSE":"WYBIERZ","COLUMN":"NR.KOLUMNY","COLUMNS":"LICZBA.KOLUMN","HLOOKUP":"WYSZUKAJ.POZIOMO","INDEX":"INDEKS","INDIRECT":"ADR.POŚR","LOOKUP":"WYSZUKAJ","MATCH":"PODAJ.POZYCJĘ","OFFSET":"PRZESUNIĘCIE","ROW":"WIERSZ","ROWS":"ILE.WIERSZY","TRANSPOSE":"TRANSPONUJ","VLOOKUP":"WYSZUKAJ.PIONOWO","ERROR.TYPE":"NR.BŁĘDU","ISBLANK":"CZY.PUSTA","ISERR":"CZY.BŁ","ISERROR":"CZY.BŁĄD","ISEVEN":"CZY.PARZYSTE","ISLOGICAL":"CZY.LOGICZNA","ISNA":"CZY.BRAK","ISNONTEXT":"CZY.NIE.TEKST","ISNUMBER":"CZY.LICZBA","ISODD":"CZY.NIEPARZYSTE","ISREF":"CZY.ADR","ISTEXT":"CZY.TEKST","N":"N","NA":"BRAK","TYPE":"TYP","AND":"ORAZ","FALSE":"FAŁSZ","IF":"JEŻELI","IFERROR":"JEŻELI.BŁĄD","NOT":"NIE","OR":"LUB","TRUE":"PRAWDA","LocalFormulaOperands":{"StructureTables":{"h":"Wszystkie","d":"Dane","a":"Nagłówki","tr":"Ten wiersz","t":"Sumy"},"CONST_TRUE_FALSE":{"t":"PRAWDA","f":"FAŁSZ"},"CONST_ERROR":{"nil":"#ZERO!","div":"#DZIEL/0!","value":"#ARG!","ref":"#ADR!","name":"#NAZWA?","num":"#LICZBA!","na":"#N/D","getdata":"#GETTING_DATA","uf":"#NIEOBSŁUGIWANE_FUNKCJA!"}}} \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/resources/formula-lang/ru.json b/apps/spreadsheeteditor/main/resources/formula-lang/ru.json index e32af7839..cda9296a9 100644 --- a/apps/spreadsheeteditor/main/resources/formula-lang/ru.json +++ b/apps/spreadsheeteditor/main/resources/formula-lang/ru.json @@ -1 +1 @@ -{"DATE":"ДАТА","DATEDIF":"РАЗНДАТ","DATEVALUE":"ДАТАЗНАЧ","DAY":"ДЕНЬ","DAYS360":"ДНЕЙ360","EDATE":"ДАТАМЕС","EOMONTH":"КОНМЕСЯЦА","HOUR":"ЧАС","MINUTE":"МИНУТЫ","MONTH":"МЕСЯЦ","NETWORKDAYS":"ЧИСТРАБДНИ","NOW":"ТДАТА","SECOND":"СЕКУНДЫ","TIME":"ВРЕМЯ","TIMEVALUE":"ВРЕМЗНАЧ","TODAY":"СЕГОДНЯ","WEEKDAY":"ДЕНЬНЕД","WEEKNUM":"НОМНЕДЕЛИ","WORKDAY":"РАБДЕНЬ","YEAR":"ГОД","YEARFRAC":"ДОЛЯГОДА","BIN2DEC":"ДВ.В.ДЕС","BIN2HEX":"ДВ.В.ШЕСТН","BIN2OCT":"ДВ.В.ВОСЬМ","COMPLEX":"КОМПЛЕКСН","DEC2BIN":"ДЕС.В.ДВ","DEC2HEX":"ДЕС.В.ШЕСТН","DEC2OCT":"ДЕС.В.ВОСЬМ","DELTA":"ДЕЛЬТА","ERF":"ФОШ","ERFC":"ДФОШ","GESTEP":"ПОРОГ","HEX2BIN":"ШЕСТН.В.ДВ","HEX2DEC":"ШЕСТН.В.ДЕС","HEX2OCT":"ШЕСТН.В.ВОСЬМ","IMABS":"МНИМ.ABS","IMAGINARY":"МНИМ.ЧАСТЬ","IMARGUMENT":"МНИМ.АРГУМЕНТ","IMCONJUGATE":"МНИМ.СОПРЯЖ","IMCOS":"МНИМ.COS","IMDIV":"МНИМ.ДЕЛ","IMEXP":"МНИМ.EXP","IMLN":"МНИМ.LN","IMLOG10":"МНИМ.LOG10","IMLOG2":"МНИМ.LOG2","IMPOWER":"МНИМ.СТЕПЕНЬ","IMPRODUCT":"МНИМ.ПРОИЗВЕД","IMREAL":"МНИМ.ВЕЩ","IMSIN":"МНИМ.SIN","IMSQRT":"МНИМ.КОРЕНЬ","IMSUB":"МНИМ.РАЗН","IMSUM":"МНИМ.СУММ","OCT2BIN":"ВОСЬМ.В.ДВ","OCT2DEC":"ВОСЬМ.В.ДЕС","OCT2HEX":"ВОСЬМ.В.ШЕСТН","CHAR":"СИМВОЛ","CLEAN":"ПЕЧСИМВ","CODE":"КОДСИМВ","CONCATENATE":"СЦЕПИТЬ","DOLLAR":"РУБЛЬ","EXACT":"СОВПАД","FIND":"НАЙТИ","FINDB":"НАЙТИБ","FIXED":"ФИКСИРОВАННЫЙ","LEFT":"ЛЕВСИМВ","LEFTB":"ЛЕВБ","LEN":"ДЛСТР","LENB":"ДЛИНБ","LOWER":"СТРОЧН","MID":"ПСТР","MIDB":"ПСТРБ","PROPER":"ПРОПНАЧ","REPLACE":"ЗАМЕНИТЬ","REPLACEB":"ЗАМЕНИТЬБ","REPT":"ПОВТОР","RIGHT":"ПРАВСИМВ","RIGHTB":"ПРАВБ","SEARCH":"ПОИСК","SEARCHB":"ПОИСКБ","SUBSTITUTE":"ПОДСТАВИТЬ","T":"Т","TEXT":"ТЕКСТ","TRIM":"СЖПРОБЕЛЫ","UPPER":"ПРОПИСН","VALUE":"ЗНАЧЕН","AVEDEV":"СРОТКЛ","AVERAGE":"СРЗНАЧ","AVERAGEA":"СРЗНАЧА","AVERAGEIF":"СРЗНАЧЕСЛИ","AVERAGEIFS":"СРЗНАЧЕСЛИМН","BINOMDIST":"БИНОМРАСП","CONFIDENCE":"ДОВЕРИТ","CORREL":"КОРРЕЛ","COUNT":"СЧЁТ","COUNTA":"СЧЁТЗ","COUNTBLANK":"СЧИТАТЬПУСТОТЫ","COUNTIF":"СЧЁТЕСЛИ","COUNTIFS":"СЧЁТЕСЛИМН","COVAR":"КОВАР","CRITBINOM":"КРИТБИНОМ","DEVSQ":"КВАДРОТКЛ","EXPONDIST":"ЭКСПРАСП","FISHER":"ФИШЕР","FISHERINV":"ФИШЕРОБР","FORECAST":"ПРОГНОЗ","FREQUENCY":"ЧАСТОТА","GAMMALN":"ГАММАНЛОГ","GEOMEAN":"СРГЕОМ","HARMEAN":"СРГАРМ","HYPGEOMDIST":"ГИПЕРГЕОМЕТ","INTERCEPT":"ОТРЕЗОК","KURT":"ЭКСЦЕСС","LARGE":"НАИБОЛЬШИЙ","LOGINV":"ЛОГНОРМОБР","LOGNORMDIST":"ЛОГНОРМРАСП","MAX":"МАКС","MAXA":"МАКСА","MEDIAN":"МЕДИАНА","MIN":"МИН","MINA":"МИНА","MODE":"МОДА","NEGBINOMDIST":"ОТРБИНОМРАСП","NORMDIST":"НОРМРАСП","NORMINV":"НОРМОБР","NORMSDIST":"НОРМСТРАСП","NORMSINV":"НОРМСТОБР","PEARSON":"ПИРСОН","PERCENTILE":"ПЕРСЕНТИЛЬ","PERCENTRANK":"ПРОЦЕНТРАНГ","PERMUT":"ПЕРЕСТ","POISSON":"ПУАССОН","PROB":"ВЕРОЯТНОСТЬ","QUARTILE":"КВАРТИЛЬ","RSQ":"КВПИРСОН","SKEW":"СКОС","SLOPE":"НАКЛОН","SMALL":"НАИМЕНЬШИЙ","STANDARDIZE":"НОРМАЛИЗАЦИЯ","STDEV":"СТАНДОТКЛОН","STDEVA":"СТАНДОТКЛОНА","STDEVP":"СТАНДОТКЛОНП","STDEVPA":"СТАНДОТКЛОНПА","STEYX":"СТОШYX","VAR":"ДИСП","VARA":"ДИСПА","VARP":"ДИСПР","VARPA":"ДИСПРА","ACCRINT":"НАКОПДОХОД","ACCRINTM":"НАКОПДОХОДПОГАШ","AMORDEGRC":"АМОРУМ","AMORLINC":"АМОРУВ","COUPDAYBS":"ДНЕЙКУПОНДО","COUPDAYS":"ДНЕЙКУПОН","COUPDAYSNC":"ДНЕЙКУПОНПОСЛЕ","COUPNCD":"ДАТАКУПОНПОСЛЕ","COUPNUM":"ЧИСЛКУПОН","COUPPCD":"ДАТАКУПОНДО","CUMIPMT":"ОБЩПЛАТ","CUMPRINC":"ОБЩДОХОД","DB":"ФУО","DDB":"ДДОБ","DISC":"СКИДКА","DOLLARDE":"РУБЛЬ.ДЕС","DOLLARFR":"РУБЛЬ.ДРОБЬ","DURATION":"ДЛИТ","EFFECT":"ЭФФЕКТ","FV":"БС","FVSCHEDULE":"БЗРАСПИС","INTRATE":"ИНОРМА","IPMT":"ПРПЛТ","IRR":"ВСД","ISPMT":"ПРОЦПЛАТ","MDURATION":"МДЛИТ","MIRR":"МВСД","NOMINAL":"НОМИНАЛ","NPER":"КПЕР","NPV":"ЧПС","ODDFPRICE":"ЦЕНАПЕРВНЕРЕГ","ODDFYIELD":"ДОХОДПЕРВНЕРЕГ","ODDLPRICE":"ЦЕНАПОСЛНЕРЕГ","ODDLYIELD":"ДОХОДПОСЛНЕРЕГ","PMT":"ПЛТ","PPMT":"ОСПЛТ","PRICE":"ЦЕНА","PRICEDISC":"ЦЕНАСКИДКА","PRICEMAT":"ЦЕНАПОГАШ","PV":"ПС","RATE":"СТАВКА","RECEIVED":"ПОЛУЧЕНО","SLN":"АПЛ","SYD":"АСЧ","TBILLEQ":"РАВНОКЧЕК","TBILLPRICE":"ЦЕНАКЧЕК","TBILLYIELD":"ДОХОДКЧЕК","VDB":"ПУО","XIRR":"ЧИСТВНДОХ","XNPV":"ЧИСТНЗ","YIELD":"ДОХОД","YIELDDISC":"ДОХОДСКИДКА","YIELDMAT":"ДОХОДПОГАШ","ABS":"ABS","ACOS":"ACOS","ACOSH":"ACOSH","ASIN":"ASIN","ASINH":"ASINH","ATAN":"ATAN","ATAN2":"ATAN2","ATANH":"ATANH","CEILING":"ОКРВВЕРХ","COMBIN":"ЧИСЛКОМБ","COS":"COS","COSH":"COSH","DEGREES":"ГРАДУСЫ","EVEN":"ЧЁТН","EXP":"EXP","FACT":"ФАКТР","FACTDOUBLE":"ДВФАКТР","FLOOR":"ОКРВНИЗ","GCD":"НОД","INT":"ЦЕЛОЕ","LCM":"НОК","LN":"LN","LOG":"LOG","LOG10":"LOG10","MDETERM":"МОПРЕД","MINVERSE":"МОБР","MMULT":"МУМНОЖ","MOD":"ОСТАТ","MROUND":"ОКРУГЛТ","MULTINOMIAL":"МУЛЬТИНОМ","ODD":"НЕЧЁТ","PI":"ПИ","POWER":"СТЕПЕНЬ","PRODUCT":"ПРОИЗВЕД","QUOTIENT":"ЧАСТНОЕ","RADIANS":"РАДИАНЫ","RAND":"СЛЧИС","RANDBETWEEN":"СЛУЧМЕЖДУ","ROMAN":"РИМСКОЕ","ROUND":"ОКРУГЛ","ROUNDDOWN":"ОКРУГЛВНИЗ","ROUNDUP":"ОКРУГЛВВЕРХ","SERIESSUM":"РЯД.СУММ","SIGN":"ЗНАК","SIN":"SIN","SINH":"SINH","SQRT":"КОРЕНЬ","SQRTPI":"КОРЕНЬПИ","SUBTOTAL":"ПРОМЕЖУТОЧНЫЕ.ИТОГИ","SUM":"СУММ","SUMIF":"СУММЕСЛИ","SUMIFS":"СУММЕСЛИМН","SUMPRODUCT":"СУММПРОИЗВ","SUMSQ":"СУММКВ","SUMX2MY2":"СУММРАЗНКВ","SUMX2PY2":"СУММСУММКВ","SUMXMY2":"СУММКВРАЗН","TAN":"TAN","TANH":"TANH","TRUNC":"ОТБР","ADDRESS":"АДРЕС","CHOOSE":"ВЫБОР","COLUMN":"СТОЛБЕЦ","COLUMNS":"ЧИСЛСТОЛБ","HLOOKUP":"ГПР","INDEX":"ИНДЕКС","INDIRECT":"ДВССЫЛ","LOOKUP":"ПРОСМОТР","MATCH":"ПОИСКПОЗ","OFFSET":"СМЕЩ","ROW":"СТРОКА","ROWS":"ЧСТРОК","TRANSPOSE":"ТРАНСП","VLOOKUP":"ВПР","ERROR.TYPE":"ТИП.ОШИБКИ","ISBLANK":"ЕПУСТО","ISERR":"ЕОШ","ISERROR":"ЕОШИБКА","ISEVEN":"ЕЧЁТН","ISLOGICAL":"ЕЛОГИЧ","ISNA":"ЕНД","ISNONTEXT":"ЕНЕТЕКСТ","ISNUMBER":"ЕЧИСЛО","ISODD":"ЕНЕЧЁТ","ISREF":"ЕССЫЛКА","ISTEXT":"ЕТЕКСТ","N":"Ч","NA":"НД","TYPE":"ТИП","AND":"И","FALSE":"ЛОЖЬ","IF":"ЕСЛИ","IFERROR":"ЕСЛИОШИБКА","NOT":"НЕ","OR":"ИЛИ","TRUE":"ИСТИНА","LocalFormulaOperands":{"StructureTables":{"h": "Заголовки","d": "Данные","a": "Все","tr": "Эта строка","t": "Итоги"},"CONST_TRUE_FALSE":{"t":"ИСТИНА","f":"ЛОЖЬ"},"CONST_ERROR":{"nil":"#ПУСТО!","div":"#ДЕЛ\/0!","value":"#ЗНАЧ!","ref":"#ССЫЛКА!","name":"#ИМЯ\\?","num":"#ЧИСЛО!","na":"#Н\/Д","getdata":"#GETTING_DATA","uf":"#UNSUPPORTED_FUNCTION!"}}} \ No newline at end of file +{"DATE":"ДАТА","DATEDIF":"РАЗНДАТ","DATEVALUE":"ДАТАЗНАЧ","DAY":"ДЕНЬ","DAYS360":"ДНЕЙ360","EDATE":"ДАТАМЕС","EOMONTH":"КОНМЕСЯЦА","HOUR":"ЧАС","MINUTE":"МИНУТЫ","MONTH":"МЕСЯЦ","NETWORKDAYS":"ЧИСТРАБДНИ","NOW":"ТДАТА","SECOND":"СЕКУНДЫ","TIME":"ВРЕМЯ","TIMEVALUE":"ВРЕМЗНАЧ","TODAY":"СЕГОДНЯ","WEEKDAY":"ДЕНЬНЕД","WEEKNUM":"НОМНЕДЕЛИ","WORKDAY":"РАБДЕНЬ","YEAR":"ГОД","YEARFRAC":"ДОЛЯГОДА","BIN2DEC":"ДВ.В.ДЕС","BIN2HEX":"ДВ.В.ШЕСТН","BIN2OCT":"ДВ.В.ВОСЬМ","COMPLEX":"КОМПЛЕКСН","DEC2BIN":"ДЕС.В.ДВ","DEC2HEX":"ДЕС.В.ШЕСТН","DEC2OCT":"ДЕС.В.ВОСЬМ","DELTA":"ДЕЛЬТА","ERF":"ФОШ","ERFC":"ДФОШ","GESTEP":"ПОРОГ","HEX2BIN":"ШЕСТН.В.ДВ","HEX2DEC":"ШЕСТН.В.ДЕС","HEX2OCT":"ШЕСТН.В.ВОСЬМ","IMABS":"МНИМ.ABS","IMAGINARY":"МНИМ.ЧАСТЬ","IMARGUMENT":"МНИМ.АРГУМЕНТ","IMCONJUGATE":"МНИМ.СОПРЯЖ","IMCOS":"МНИМ.COS","IMCOSH":"МНИМ.COSH","IMCOT":"МНИМ.COT","IMCSC":"МНИМ.CSC","IMCSCH":"МНИМ.CSCH","IMDIV":"МНИМ.ДЕЛ","IMEXP":"МНИМ.EXP","IMLN":"МНИМ.LN","IMLOG10":"МНИМ.LOG10","IMLOG2":"МНИМ.LOG2","IMPOWER":"МНИМ.СТЕПЕНЬ","IMPRODUCT":"МНИМ.ПРОИЗВЕД","IMREAL":"МНИМ.ВЕЩ","IMSEC":"МНИМ.SEC","IMSECH":"МНИМ.SECH","IMSIN":"МНИМ.SIN","IMSINH":"МНИМ.SINH","IMSQRT":"МНИМ.КОРЕНЬ","IMSUB":"МНИМ.РАЗН","IMSUM":"МНИМ.СУММ","IMTAN":"МНИМ.TAN","OCT2BIN":"ВОСЬМ.В.ДВ","OCT2DEC":"ВОСЬМ.В.ДЕС","OCT2HEX":"ВОСЬМ.В.ШЕСТН","CHAR":"СИМВОЛ","CLEAN":"ПЕЧСИМВ","CODE":"КОДСИМВ","CONCATENATE":"СЦЕПИТЬ","DOLLAR":"РУБЛЬ","EXACT":"СОВПАД","FIND":"НАЙТИ","FINDB":"НАЙТИБ","FIXED":"ФИКСИРОВАННЫЙ","LEFT":"ЛЕВСИМВ","LEFTB":"ЛЕВБ","LEN":"ДЛСТР","LENB":"ДЛИНБ","LOWER":"СТРОЧН","MID":"ПСТР","MIDB":"ПСТРБ","PROPER":"ПРОПНАЧ","REPLACE":"ЗАМЕНИТЬ","REPLACEB":"ЗАМЕНИТЬБ","REPT":"ПОВТОР","RIGHT":"ПРАВСИМВ","RIGHTB":"ПРАВБ","SEARCH":"ПОИСК","SEARCHB":"ПОИСКБ","SUBSTITUTE":"ПОДСТАВИТЬ","T":"Т","TEXT":"ТЕКСТ","TRIM":"СЖПРОБЕЛЫ","UPPER":"ПРОПИСН","VALUE":"ЗНАЧЕН","AVEDEV":"СРОТКЛ","AVERAGE":"СРЗНАЧ","AVERAGEA":"СРЗНАЧА","AVERAGEIF":"СРЗНАЧЕСЛИ","AVERAGEIFS":"СРЗНАЧЕСЛИМН","BINOMDIST":"БИНОМРАСП","CONFIDENCE":"ДОВЕРИТ","CORREL":"КОРРЕЛ","COUNT":"СЧЁТ","COUNTA":"СЧЁТЗ","COUNTBLANK":"СЧИТАТЬПУСТОТЫ","COUNTIF":"СЧЁТЕСЛИ","COUNTIFS":"СЧЁТЕСЛИМН","COVAR":"КОВАР","CRITBINOM":"КРИТБИНОМ","DEVSQ":"КВАДРОТКЛ","EXPONDIST":"ЭКСПРАСП","FISHER":"ФИШЕР","FISHERINV":"ФИШЕРОБР","FORECAST":"ПРОГНОЗ","FREQUENCY":"ЧАСТОТА","GAMMALN":"ГАММАНЛОГ","GEOMEAN":"СРГЕОМ","HARMEAN":"СРГАРМ","HYPGEOMDIST":"ГИПЕРГЕОМЕТ","INTERCEPT":"ОТРЕЗОК","KURT":"ЭКСЦЕСС","LARGE":"НАИБОЛЬШИЙ","LOGINV":"ЛОГНОРМОБР","LOGNORMDIST":"ЛОГНОРМРАСП","MAX":"МАКС","MAXA":"МАКСА","MEDIAN":"МЕДИАНА","MIN":"МИН","MINA":"МИНА","MODE":"МОДА","NEGBINOMDIST":"ОТРБИНОМРАСП","NORMDIST":"НОРМРАСП","NORMINV":"НОРМОБР","NORMSDIST":"НОРМСТРАСП","NORMSINV":"НОРМСТОБР","PEARSON":"ПИРСОН","PERCENTILE":"ПЕРСЕНТИЛЬ","PERCENTRANK":"ПРОЦЕНТРАНГ","PERMUT":"ПЕРЕСТ","POISSON":"ПУАССОН","PROB":"ВЕРОЯТНОСТЬ","QUARTILE":"КВАРТИЛЬ","RSQ":"КВПИРСОН","SKEW":"СКОС","SLOPE":"НАКЛОН","SMALL":"НАИМЕНЬШИЙ","STANDARDIZE":"НОРМАЛИЗАЦИЯ","STDEV":"СТАНДОТКЛОН","STDEVA":"СТАНДОТКЛОНА","STDEVP":"СТАНДОТКЛОНП","STDEVPA":"СТАНДОТКЛОНПА","STEYX":"СТОШYX","VAR":"ДИСП","VARA":"ДИСПА","VARP":"ДИСПР","VARPA":"ДИСПРА","ACCRINT":"НАКОПДОХОД","ACCRINTM":"НАКОПДОХОДПОГАШ","AMORDEGRC":"АМОРУМ","AMORLINC":"АМОРУВ","COUPDAYBS":"ДНЕЙКУПОНДО","COUPDAYS":"ДНЕЙКУПОН","COUPDAYSNC":"ДНЕЙКУПОНПОСЛЕ","COUPNCD":"ДАТАКУПОНПОСЛЕ","COUPNUM":"ЧИСЛКУПОН","COUPPCD":"ДАТАКУПОНДО","CUMIPMT":"ОБЩПЛАТ","CUMPRINC":"ОБЩДОХОД","DB":"ФУО","DDB":"ДДОБ","DISC":"СКИДКА","DOLLARDE":"РУБЛЬ.ДЕС","DOLLARFR":"РУБЛЬ.ДРОБЬ","DURATION":"ДЛИТ","EFFECT":"ЭФФЕКТ","FV":"БС","FVSCHEDULE":"БЗРАСПИС","INTRATE":"ИНОРМА","IPMT":"ПРПЛТ","IRR":"ВСД","ISPMT":"ПРОЦПЛАТ","MDURATION":"МДЛИТ","MIRR":"МВСД","NOMINAL":"НОМИНАЛ","NPER":"КПЕР","NPV":"ЧПС","ODDFPRICE":"ЦЕНАПЕРВНЕРЕГ","ODDFYIELD":"ДОХОДПЕРВНЕРЕГ","ODDLPRICE":"ЦЕНАПОСЛНЕРЕГ","ODDLYIELD":"ДОХОДПОСЛНЕРЕГ","PMT":"ПЛТ","PPMT":"ОСПЛТ","PRICE":"ЦЕНА","PRICEDISC":"ЦЕНАСКИДКА","PRICEMAT":"ЦЕНАПОГАШ","PV":"ПС","RATE":"СТАВКА","RECEIVED":"ПОЛУЧЕНО","SLN":"АПЛ","SYD":"АСЧ","TBILLEQ":"РАВНОКЧЕК","TBILLPRICE":"ЦЕНАКЧЕК","TBILLYIELD":"ДОХОДКЧЕК","VDB":"ПУО","XIRR":"ЧИСТВНДОХ","XNPV":"ЧИСТНЗ","YIELD":"ДОХОД","YIELDDISC":"ДОХОДСКИДКА","YIELDMAT":"ДОХОДПОГАШ","ABS":"ABS","ACOS":"ACOS","ACOSH":"ACOSH","ACOT":"ACOT","ACOTH":"ACOTH","ARABIC":"АРАБСКОЕ","ASIN":"ASIN","ASINH":"ASINH","ATAN":"ATAN","ATAN2":"ATAN2","ATANH":"ATANH","BASE":"ОСНОВАНИЕ","CEILING":"ОКРВВЕРХ","CEILING.MATH":"ОКРВВЕРХ.МАТ","CEILING.PRECISE":"ОКРВВЕРХ.ТОЧН","COMBIN":"ЧИСЛКОМБ","COMBINA":"ЧИСЛКОМБА","COS":"COS","COSH":"COSH","COT":"COT","COTH":"COTH","CSC":"CSC","CSCH":"CSCH","DECIMAL":"ДЕС","DEGREES":"ГРАДУСЫ","EVEN":"ЧЁТН","EXP":"EXP","FACT":"ФАКТР","FACTDOUBLE":"ДВФАКТР","FLOOR":"ОКРВНИЗ","FLOOR.PRECISE":"ОКРВНИЗ.ТОЧН","FLOOR.MATH":"ОКРВНИЗ.МАТ","GCD":"НОД","INT":"ЦЕЛОЕ","ISO.CEILING":"ISO.ОКРВВЕРХ","LCM":"НОК","LN":"LN","LOG":"LOG","LOG10":"LOG10","MDETERM":"МОПРЕД","MINVERSE":"МОБР","MMULT":"МУМНОЖ","MOD":"ОСТАТ","MROUND":"ОКРУГЛТ","MULTINOMIAL":"МУЛЬТИНОМ","ODD":"НЕЧЁТ","PI":"ПИ","POWER":"СТЕПЕНЬ","PRODUCT":"ПРОИЗВЕД","QUOTIENT":"ЧАСТНОЕ","RADIANS":"РАДИАНЫ","RAND":"СЛЧИС","RANDBETWEEN":"СЛУЧМЕЖДУ","ROMAN":"РИМСКОЕ","ROUND":"ОКРУГЛ","ROUNDDOWN":"ОКРУГЛВНИЗ","ROUNDUP":"ОКРУГЛВВЕРХ","SEC":"SEC","SECH":"SECH","SERIESSUM":"РЯД.СУММ","SIGN":"ЗНАК","SIN":"SIN","SINH":"SINH","SQRT":"КОРЕНЬ","SQRTPI":"КОРЕНЬПИ","SUBTOTAL":"ПРОМЕЖУТОЧНЫЕ.ИТОГИ","SUM":"СУММ","SUMIF":"СУММЕСЛИ","SUMIFS":"СУММЕСЛИМН","SUMPRODUCT":"СУММПРОИЗВ","SUMSQ":"СУММКВ","SUMX2MY2":"СУММРАЗНКВ","SUMX2PY2":"СУММСУММКВ","SUMXMY2":"СУММКВРАЗН","TAN":"TAN","TANH":"TANH","TRUNC":"ОТБР","ADDRESS":"АДРЕС","CHOOSE":"ВЫБОР","COLUMN":"СТОЛБЕЦ","COLUMNS":"ЧИСЛСТОЛБ","HLOOKUP":"ГПР","INDEX":"ИНДЕКС","INDIRECT":"ДВССЫЛ","LOOKUP":"ПРОСМОТР","MATCH":"ПОИСКПОЗ","OFFSET":"СМЕЩ","ROW":"СТРОКА","ROWS":"ЧСТРОК","TRANSPOSE":"ТРАНСП","VLOOKUP":"ВПР","ERROR.TYPE":"ТИП.ОШИБКИ","ISBLANK":"ЕПУСТО","ISERR":"ЕОШ","ISERROR":"ЕОШИБКА","ISEVEN":"ЕЧЁТН","ISLOGICAL":"ЕЛОГИЧ","ISNA":"ЕНД","ISNONTEXT":"ЕНЕТЕКСТ","ISNUMBER":"ЕЧИСЛО","ISODD":"ЕНЕЧЁТ","ISREF":"ЕССЫЛКА","ISTEXT":"ЕТЕКСТ","N":"Ч","NA":"НД","TYPE":"ТИП","AND":"И","FALSE":"ЛОЖЬ","IF":"ЕСЛИ","IFERROR":"ЕСЛИОШИБКА","NOT":"НЕ","OR":"ИЛИ","TRUE":"ИСТИНА","LocalFormulaOperands":{"StructureTables":{"h":"Заголовки","d":"Данные","a":"Все","tr":"Эта строка","t":"Итоги"},"CONST_TRUE_FALSE":{"t":"ИСТИНА","f":"ЛОЖЬ"},"CONST_ERROR":{"nil":"#ПУСТО!","div":"#ДЕЛ/0!","value":"#ЗНАЧ!","ref":"#ССЫЛКА!","name":"#ИМЯ\\?","num":"#ЧИСЛО!","na":"#Н/Д","getdata":"#GETTING_DATA","uf":"#UNSUPPORTED_FUNCTION!"}}} \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/resources/formula-lang/ru_desc.json b/apps/spreadsheeteditor/main/resources/formula-lang/ru_desc.json index 765b64768..59320170b 100644 --- a/apps/spreadsheeteditor/main/resources/formula-lang/ru_desc.json +++ b/apps/spreadsheeteditor/main/resources/formula-lang/ru_desc.json @@ -1 +1 @@ -{"DATE":{"a":"( year, month, day )","d":"Функция даты и времени, используется для добавления дат в стандартном формате ММ/дд/гггг"},"DATEDIF":{"a":"( start-date , end-date , unit )","d":"Функция даты и времени, возвращает разницу между двумя датами (начальной и конечной) согласно заданному интервалу (единице)"},"DATEVALUE":{"a":"( date-time-string )","d":"Функция даты и времени, возвращает порядковый номер заданной даты"},"DAY":{"a":"( date-value )","d":"Функция даты и времени, возвращает день (число от 1 до 31), соответствующий дате, заданной в числовом формате (MM/дд/гггг по умолчанию)"},"DAYS360":{"a":"( start-date , end-date [ , method-flag ] )","d":"Функция даты и времени, возвращает количество дней между двумя датами (начальной и конечной) на основе 360-дневного года с использованием одного из методов вычислений (американского или европейского)"},"EDATE":{"a":"( start-date , month-offset )","d":"Функция даты и времени, возвращает порядковый номер даты, которая идет на заданное число месяцев (month-offset) до или после заданной даты (start-date)"},"EOMONTH":{"a":"( start-date , month-offset )","d":"Функция даты и времени, возвращает порядковый номер последнего дня месяца, который идет на заданное число месяцев до или после заданной начальной даты"},"HOUR":{"a":"( time-value )","d":"Функция даты и времени, возвращает количество часов (число от 0 до 23), соответствующее заданному значению времени"},"MINUTE":{"a":"( time-value )","d":"Функция даты и времени, возвращает количество минут (число от 0 до 59), соответствующее заданному значению времени"},"MONTH":{"a":"( date-value )","d":"Функция даты и времени, возвращает месяц (число от 1 до 12), соответствующий дате, заданной в числовом формате (MM/дд/гггг по умолчанию)"},"NETWORKDAYS":{"a":"( start-date , end-date [ , holidays ] )","d":"Функция даты и времени, возвращает количество рабочих дней между двумя датами (начальной и конечной). Выходные и праздничные дни в это число не включаются"},"NOW":{"a":"()","d":"Функция даты и времени, используется для добавления в электронную таблицу текущей даты и времени в следующем формате: MM/дд/гг чч:мм. Данная функция не требует аргумента"},"SECOND":{"a":"( time-value )","d":"Функция даты и времени, возвращает количество секунд (число от 0 до 59), соответствующее заданному значению времени"},"TIME":{"a":"( hour, minute, second )","d":"Функция даты и времени, используется для добавления определенного времени в выбранном формате (по умолчанию чч:мм tt (указатель половины дня a.m./p.m.))"},"TIMEVALUE":{"a":"( date-time-string )","d":"Функция даты и времени, возвращает порядковый номер, соответствующий заданному времени"},"TODAY":{"a":"()","d":"Функция даты и времени, используется для добавления текущей даты в следующем формате: MM/дд/гг. Данная функция не требует аргумента"},"WEEKDAY":{"a":"( serial-value [ , weekday-start-flag ] )","d":"Функция даты и времени, определяет, какой день недели соответствует заданной дате"},"WEEKNUM":{"a":"( serial-value [ , weekday-start-flag ] )","d":"Функция даты и времени, возвращает порядковый номер той недели в течение года, на которую приходится заданная дата"},"WORKDAY":{"a":"( start-date , day-offset [ , holidays ] )","d":"Функция даты и времени, возвращает дату, которая идет на заданное число дней (day-offset) до или после заданной начальной даты, без учета выходных и праздничных дней"},"YEAR":{"a":"( date-value )","d":"Функция даты и времени, возвращает год (число от 1900 до 9999), соответствующий дате, заданной в числовом формате (MM/дд/гггг по умолчанию)"},"YEARFRAC":{"a":"( start-date , end-date [ , basis ] )","d":"Функция даты и времени, возвращает долю года, представленную числом целых дней между начальной и конечной датами, вычисляемую заданным способом"},"BIN2DEC":{"a":"( number )","d":"Инженерная функция, преобразует двоичное число в десятичное"},"BIN2HEX":{"a":"( number [ , num-hex-digits ] )","d":"Инженерная функция, преобразует двоичное число в шестнадцатеричное"},"BIN2OCT":{"a":"( number [ , num-hex-digits ] )","d":"Инженерная функция, преобразует двоичное число в восьмеричное"},"COMPLEX":{"a":"( real-number , imaginary-number [ , suffix ] )","d":"Инженерная функция, используется для преобразования действительной и мнимой части в комплексное число, выраженное в формате a + bi или a + bj"},"DEC2BIN":{"a":"( number [ , num-hex-digits ] )","d":"Инженерная функция, преобразует десятичное число в двоичное"},"DEC2HEX":{"a":"( number [ , num-hex-digits ] )","d":"Инженерная функция, преобразует десятичное число в шестнадцатеричное"},"DEC2OCT":{"a":"( number [ , num-hex-digits ] )","d":"Инженерная функция, преобразует десятичное число в восьмеричное"},"DELTA":{"a":"( number-1 [ , number-2 ] )","d":"Инженерная функция, используется для проверки равенства двух чисел. Функция возвращает 1, если числа равны, в противном случае возвращает 0"},"ERF":{"a":"( lower-bound [ , upper-bound ] )","d":"Инженерная функция, используется для расчета значения функции ошибки, проинтегрированного в интервале от заданного нижнего до заданного верхнего предела"},"ERFC":{"a":"( lower-bound )","d":"Инженерная функция, используется для расчета значения дополнительной функции ошибки, проинтегрированного в интервале от заданного нижнего предела до бесконечности"},"GESTEP":{"a":"( number [ , step ] )","d":"Инженерная функция, используется для проверки того, превышает ли какое-то число пороговое значение. Функция возвращает 1, если число больше или равно пороговому значению, в противном случае возвращает 0"},"HEX2BIN":{"a":"( number [ , num-hex-digits ] )","d":"Инженерная функция, преобразует шестнадцатеричное число в двоичное"},"HEX2DEC":{"a":"( number )","d":"Инженерная функция, преобразует шестнадцатеричное число в десятичное"},"HEX2OCT":{"a":"( number [ , num-hex-digits ] )","d":"Инженерная функция, преобразует шестнадцатеричное число в восьмеричное"},"IMABS":{"a":"( complex-number )","d":"Инженерная функция, возвращает абсолютное значение комплексного числа"},"IMAGINARY":{"a":"( complex-number )","d":"Инженерная функция, возвращает мнимую часть заданного комплексного числа"},"IMARGUMENT":{"a":"( complex-number )","d":"Инженерная функция, возвращает значение аргумента Тета, то есть угол в радианах"},"IMCONJUGATE":{"a":"( complex-number )","d":"Инженерная функция, возвращает комплексно-сопряженное значение комплексного числа"},"IMCOS":{"a":"( complex-number )","d":"Инженерная функция, возвращает косинус комплексного числа"},"IMDIV":{"a":"( complex-number-1 , complex-number-2 )","d":"Инженерная функция, возвращает частное от деления двух комплексных чисел, представленных в формате a + bi или a + bj"},"IMEXP":{"a":"( complex-number )","d":"Инженерная функция, возвращает экспоненту комплексного числа (значение константы e, возведенной в степень, заданную комплексным числом). Константа e равна 2,71828182845904"},"IMLN":{"a":"( complex-number )","d":"Инженерная функция, возвращает натуральный логарифм комплексного числа"},"IMLOG10":{"a":"( complex-number )","d":"Инженерная функция, возвращает двоичный логарифм комплексного числа"},"IMLOG2":{"a":"( complex-number )","d":"Инженерная функция, возвращает десятичный логарифм комплексного числа"},"IMPOWER":{"a":"( complex-number, power )","d":"Инженерная функция, возвращает комплексное число, возведенное в заданную степень"},"IMPRODUCT":{"a":"( argument-list )","d":"Инженерная функция, возвращает произведение указанных комплексных чисел"},"IMREAL":{"a":"( complex-number )","d":"Инженерная функция, возвращает действительную часть комплексного числа"},"IMSIN":{"a":"( complex-number )","d":"Инженерная функция, возвращает синус комплексного числа"},"IMSQRT":{"a":"( complex-number )","d":"Инженерная функция, возвращает значение квадратного корня из комплексного числа"},"IMSUB":{"a":"( complex-number-1 , complex-number-2 )","d":"Инженерная функция, возвращает разность двух комплексных чисел, представленных в формате a + bi или a + bj"},"IMSUM":{"a":"( argument-list )","d":"Инженерная функция, возвращает сумму двух комплексных чисел, представленных в формате a + bi или a + bj"},"OCT2BIN":{"a":"( number [ , num-hex-digits ] )","d":"Инженерная функция, преобразует восьмеричное число в двоичное"},"OCT2DEC":{"a":"( number )","d":"Инженерная функция, преобразует восьмеричное число в десятичное"},"OCT2HEX":{"a":"( number [ , num-hex-digits ] )","d":"Инженерная функция, преобразует восьмеричное число в шестнадцатеричное"},"CHAR":{"a":"( number )","d":"Функция для работы с текстом и данными, возвращает символ ASCII, соответствующий заданному числовому коду"},"CLEAN":{"a":"( string )","d":"Функция для работы с текстом и данными, используется для удаления всех непечатаемых символов из выбранной строки"},"CODE":{"a":"( string )","d":"Функция для работы с текстом и данными, возвращает числовой код ASCII, соответствующий заданному символу или первому символу в ячейке"},"CONCATENATE":{"a":"(text1, text2, ...)","d":"Функция для работы с текстом и данными, используется для объединения данных из двух или более ячеек в одну"},"DOLLAR":{"a":"( number [ , num-decimal ] )","d":"Функция для работы с текстом и данными, преобразует число в текст, используя денежный формат $#.##"},"EXACT":{"a":"(text1, text2)","d":"Функция для работы с текстом и данными, используется для сравнения данных в двух ячейках. Функция возвращает значение TRUE (ИСТИНА), если данные совпадают, и FALSE (ЛОЖЬ), если нет"},"FIND":{"a":"( string-1 , string-2 [ , start-pos ] )","d":"Функция для работы с текстом и данными, используется для поиска заданной подстроки (string-1) внутри строки (string-2), предназначена для языков, использующих однобайтовую кодировку (SBCS)"},"FINDB":{"a":"( string-1 , string-2 [ , start-pos ] )","d":"Функция для работы с текстом и данными, используется для поиска заданной подстроки (string-1) внутри строки (string-2), предназначена для языков, использующих двухбайтовую кодировку (DBCS), таких как японский, китайский, корейский и т.д."},"FIXED":{"a":"( number [ , [ num-decimal ] [ , suppress-commas-flag ] ] )","d":"Функция для работы с текстом и данными, возвращает текстовое представление числа, округленного до заданного количества десятичных знаков"},"LEFT":{"a":"( string [ , number-chars ] )","d":"Функция для работы с текстом и данными, извлекает подстроку из заданной строки, начиная с левого символа, предназначена для языков, использующих однобайтовую кодировку (SBCS)"},"LEFTB":{"a":"( string [ , number-chars ] )","d":"Функция для работы с текстом и данными, извлекает подстроку из заданной строки, начиная с левого символа, предназначена для языков, использующих двухбайтовую кодировку (DBCS), таких как японский, китайский, корейский и т.д."},"LEN":{"a":"( string )","d":"Функция для работы с текстом и данными, анализирует заданную строку и возвращает количество символов, которые она содержит, предназначена для языков, использующих однобайтовую кодировку (SBCS)"},"LENB":{"a":"( string )","d":"Функция для работы с текстом и данными, анализирует заданную строку и возвращает количество символов, которые она содержит, предназначена для языков, использующих двухбайтовую кодировку (DBCS), таких как японский, китайский, корейский и т.д."},"LOWER":{"a":"(text)","d":"Функция для работы с текстом и данными, используется для преобразования букв в выбранной ячейке из верхнего регистра в нижний"},"MID":{"a":"( string , start-pos , number-chars )","d":"Функция для работы с текстом и данными, извлекает символы из заданной строки, начиная с любого места, предназначена для языков, использующих однобайтовую кодировку (SBCS)"},"MIDB":{"a":"( string , start-pos , number-chars )","d":"Функция для работы с текстом и данными, извлекает символы из заданной строки, начиная с любого места, предназначена для языков, использующих двухбайтовую кодировку (DBCS), таких как японский, китайский, корейский и т.д."},"PROPER":{"a":"( string )","d":"Функция для работы с текстом и данными, преобразует первую букву каждого слова в прописную (верхний регистр), а все остальные буквы - в строчные (нижний регистр)"},"REPLACE":{"a":"( string-1, start-pos, number-chars, string-2 )","d":"Функция для работы с текстом и данными, заменяет ряд символов на новый, с учетом заданного количества символов и начальной позиции, предназначена для языков, использующих однобайтовую кодировку (SBCS)"},"REPLACEB":{"a":"( string-1, start-pos, number-chars, string-2 )","d":"Функция для работы с текстом и данными, заменяет ряд символов на новый, с учетом заданного количества символов и начальной позиции, предназначена для языков, использующих двухбайтовую кодировку (DBCS), таких как японский, китайский, корейский и т.д."},"REPT":{"a":"(text, number_of_times)","d":"Функция для работы с текстом и данными, используется для повторения данных в выбранной ячейке заданное количество раз"},"RIGHT":{"a":"( string [ , number-chars ] )","d":"Функция для работы с текстом и данными, извлекает подстроку из заданной строки, начиная с крайнего правого символа, согласно заданному количеству символов, предназначена для языков, использующих однобайтовую кодировку (SBCS)"},"RIGHTB":{"a":"( string [ , number-chars ] )","d":"Функция для работы с текстом и данными, извлекает подстроку из заданной строки, начиная с крайнего правого символа, согласно заданному количеству символов, предназначена для языков, использующих двухбайтовую кодировку (DBCS), таких как японский, китайский, корейский и т.д."},"SEARCH":{"a":"( string-1 , string-2 [ , start-pos ] )","d":"Функция для работы с текстом и данными, возвращает местоположение заданной подстроки в строке, предназначена для языков, использующих однобайтовую кодировку (SBCS)"},"SEARCHB":{"a":"( string-1 , string-2 [ , start-pos ] )","d":"Функция для работы с текстом и данными, возвращает местоположение заданной подстроки в строке, предназначена для языков, использующих двухбайтовую кодировку (DBCS), таких как японский, китайский, корейский и т.д."},"SUBSTITUTE":{"a":"( string , old-string , new-string [ , occurence ] )","d":"Функция для работы с текстом и данными, заменяет ряд символов на новый"},"T":{"a":"( value )","d":"Функция для работы с текстом и данными, используется для проверки, является ли значение в ячейке (или используемое как аргумент) текстом или нет. Если это не текст, функция возвращает пустой результат. Если значение/аргумент является текстом, функция возвращает это же текстовое значение"},"TEXT":{"a":"( value , format )","d":"Функция для работы с текстом и данными, преобразует числовое значение в текст в заданном формате"},"TRIM":{"a":"( string )","d":"Функция для работы с текстом и данными, удаляет пробелы из начала и конца строки"},"UPPER":{"a":"(text)","d":"Функция для работы с текстом и данными, используется для преобразования букв в выбранной ячейке из нижнего регистра в верхний"},"VALUE":{"a":"( string )","d":"Функция для работы с текстом и данными, преобразует текстовое значение, представляющее число, в числовое значение. Если преобразуемый текст не является числом, функция возвращает ошибку #VALUE!"},"AVEDEV":{"a":"( argument-list )","d":"Статистическая функция, используется для анализа диапазона данных и возвращает среднее абсолютных значений отклонений чисел от их среднего значения"},"AVERAGE":{"a":"( argument-list )","d":"Статистическая функция, анализирует диапазон данных и вычисляет среднее значение"},"AVERAGEA":{"a":"( argument-list )","d":"Статистическая функция, анализирует диапазон данных, включая текстовые и логические значения, и вычисляет среднее значение. Функция AVERAGEA интерпретирует текст и логическое значение FALSE (ЛОЖЬ) как числовое значение 0, а логическое значение TRUE (ИСТИНА) как числовое значение 1"},"AVERAGEIF":{"a":"( cell-range, selection-criteria [ , average-range ] )","d":"Статистическая функция, анализирует диапазон данных и вычисляет среднее значение всех чисел в диапазоне ячеек, которые соответствуют заданному условию"},"AVERAGEIFS":{"a":"( average-range, criteria-range-1, criteria-1 [ criteria-range-2, criteria-2 ], ... )","d":"Статистическая функция, анализирует диапазон данных и вычисляет среднее значение всех чисел в диапазоне ячеек, которые соответствуют нескольким заданным условиям"},"BINOMDIST":{"a":"( number-successes , number-trials , success-probability , cumulative-flag )","d":"Статистическая функция, возвращает отдельное значение вероятности биномиального распределения"},"CONFIDENCE":{"a":"( alpha , standard-dev , size )","d":"Статистическая функция, возвращает доверительный интервал"},"CORREL":{"a":"( array-1 , array-2 )","d":"Статистическая функция, используется для анализа диапазона данных и возвращает коэффициент корреляции между двумя диапазонами ячеек"},"COUNT":{"a":"( argument-list )","d":"Статистическая функция, используется для подсчета количества ячеек в выбранном диапазоне, содержащих числа, без учета пустых или содержащих текст ячеек"},"COUNTA":{"a":"( argument-list )","d":"Статистическая функция, используется для анализа диапазона ячеек и подсчета количества непустых ячеек"},"COUNTBLANK":{"a":"( argument-list )","d":"Статистическая функция, используется для анализа диапазона ячеек и возвращает количество пустых ячеек"},"COUNTIFS":{"a":"( criteria-range1, criteria1, [ criteria-range2, criteria2 ], ... )","d":"Статистическая функция, используется для подсчета количества ячеек выделенного диапазона, соответствующих нескольким заданным условиям"},"COUNTIF":{"a":"( cell-range, selection-criteria )","d":"Статистическая функция, используется для подсчета количества ячеек выделенного диапазона, соответствующих заданному условию"},"COVAR":{"a":"( array-1 , array-2 )","d":"Статистическая функция, возвращает ковариацию в двух диапазонах данных"},"CRITBINOM":{"a":"( number-trials , success-probability , alpha )","d":"Статистическая функция, возвращает наименьшее значение, для которого интегральное биномиальное распределение больше или равно заданному условию"},"DEVSQ":{"a":"( argument-list )","d":"Статистическая функция, используется для анализа диапазона ячеек и возвращает сумму квадратов отклонений чисел от их среднего значения"},"EXPONDIST":{"a":"( x , lambda , cumulative-flag )","d":"Статистическая функция, возвращает экспоненциальное распределение"},"FISHER":{"a":"( number )","d":"Статистическая функция, возвращает преобразование Фишера для числа"},"FISHERINV":{"a":"( number )","d":"Статистическая функция, выполняет обратное преобразование Фишера"},"FORECAST":{"a":"( x , array-1 , array-2 )","d":"Статистическая функция, предсказывает будущее значение на основе существующих значений"},"FREQUENCY":{"a":"( data-array , bins-array )","d":"Статистическая функция, вычисляет частоту появления значений в выбранном диапазоне ячеек и отображает первое значение возвращаемого вертикального массива чисел"},"GAMMALN":{"a":"(number)","d":"Статистическая функция, возвращает натуральный логарифм гамма-функции"},"GEOMEAN":{"a":"( argument-list )","d":"Статистическая функция, вычисляет среднее геометрическое для списка значений"},"HARMEAN":{"a":"( argument-list )","d":"Статистическая функция, вычисляет среднее гармоническое для списка значений"},"HYPGEOMDIST":{"a":"( sample-successes , number-sample , population-successes , number-population )","d":"Статистическая функция, возвращает гипергеометрическое распределение, вероятность заданного количества успехов в выборке, если заданы размер выборки, количество успехов в генеральной совокупности и размер генеральной совокупности"},"INTERCEPT":{"a":"( array-1 , array-2 )","d":"Статистическая функция, анализирует значения первого и второго массивов для вычисления точки пересечения"},"KURT":{"a":"( argument-list )","d":"Статистическая функция, возвращает эксцесс списка значений"},"LARGE":{"a":"( array , k )","d":"Статистическая функция, анализирует диапазон ячеек и возвращает n-ое по величине значение"},"LOGINV":{"a":"( x , mean , standard-deviation )","d":"Статистическая функция, возвращает обратное логарифмическое нормальное распределение для заданного значения x с указанными параметрами"},"LOGNORMDIST":{"a":"( x , mean , standard-deviation )","d":"Статистическая функция, анализирует логарифмически преобразованные данные и возвращает логарифмическое нормальное распределение для заданного значения x с указанными параметрами"},"MAX":{"a":"(number1, number2, ...)","d":"Статистическая функция, используется для анализа диапазона данных и поиска наибольшего числа"},"MAXA":{"a":"(number1, number2, ...)","d":"Статистическая функция, используется для анализа диапазона данных и поиска наибольшего значения"},"MEDIAN":{"a":"( argument-list )","d":"Статистическая функция, вычисляет медиану для списка значений"},"MIN":{"a":"(number1, number2, ...)","d":"Статистическая функция, используется для анализа диапазона данных и поиска наименьшего числа"},"MINA":{"a":"(number1, number2, ...)","d":"Статистическая функция, используется для анализа диапазона данных и поиска наименьшего значения"},"MODE":{"a":"( argument-list )","d":"Статистическая функция, анализирует диапазон данных и возвращает наиболее часто встречающееся значение"},"NEGBINOMDIST":{"a":"( number-failures , number-successes , success-probability )","d":"Статистическая функция, возвращает отрицательное биномиальное распределение"},"NORMDIST":{"a":"( x , mean , standard-deviation , cumulative-flag )","d":"Статистическая функция, возвращает нормальную функцию распределения для указанного среднего значения и стандартного отклонения"},"NORMINV":{"a":"( x , mean , standard-deviation )","d":"Статистическая функция, возвращает обратное нормальное распределение для указанного среднего значения и стандартного отклонения"},"NORMSDIST":{"a":"(number)","d":"Статистическая функция, возвращает стандартное нормальное интегральное распределение"},"NORMSINV":{"a":"( probability )","d":"Статистическая функция, возвращает обратное значение стандартного нормального распределения"},"PEARSON":{"a":"( array-1 , array-2 )","d":"Статистическая функция, возвращает коэффициент корреляции Пирсона"},"PERCENTILE":{"a":"( array , k )","d":"Статистическая функция, анализирует диапазон данных и возвращает n-ый процентиль"},"PERCENTRANK":{"a":"( array , x [ , significance ] )","d":"Статистическая функция, возвращает категорию значения в наборе данных как процентное содержание в наборе данных"},"PERMUT":{"a":"( number , number-chosen )","d":"Статистическая функция, возвращает количество перестановок для заданного числа элементов"},"POISSON":{"a":"( x , mean , cumulative-flag )","d":"Статистическая функция, возвращает распределение Пуассона"},"PROB":{"a":"( x-range , probability-range , lower-limit [ , upper-limit ] )","d":"Статистическая функция, возвращает вероятность того, что значения из интервала находятся внутри нижнего и верхнего пределов"},"QUARTILE":{"a":"( array , result-category )","d":"Статистическая функция, анализирует диапазон данных и возвращает квартиль"},"RSQ":{"a":"( array-1 , array-2 )","d":"Статистическая функция, возвращает квадрат коэффициента корреляции Пирсона"},"SKEW":{"a":"( argument-list )","d":"Статистическая функция, анализирует диапазон данных и возвращает асимметрию распределения для списка значений"},"SLOPE":{"a":"( array-1 , array-2 )","d":"Статистическая функция, возвращает наклон линии линейной регрессии для данных в двух массивах"},"SMALL":{"a":"( array , k )","d":"Статистическая функция, анализирует диапазон данных и находит n-ое наименьшее значение"},"STANDARDIZE":{"a":"( x , mean , standard-deviation )","d":"Статистическая функция, возвращает нормализованное значение для распределения, характеризуемого заданными параметрами"},"STDEV":{"a":"( argument-list )","d":"Статистическая функция, анализирует диапазон данных и возвращает стандартное отклонение по выборке, содержащей числа"},"STDEVA":{"a":"( argument-list )","d":"Статистическая функция, анализирует диапазон данных и возвращает стандартное отклонение по выборке, содержащей числа, текст и логические значения (TRUE или FALSE). Текст и логические значения FALSE (ЛОЖЬ) интерпретируются как 0, а логические значения TRUE (ИСТИНА) - как 1"},"STDEVP":{"a":"( argument-list )","d":"Статистическая функция, используется для анализа диапазона данных и возвращает стандартное отклонение по всей совокупности значений"},"STDEVPA":{"a":"( argument-list )","d":"Статистическая функция, используется для анализа диапазона данных и возвращает стандартное отклонение по всей совокупности значений"},"STEYX":{"a":"( known-ys , known-xs )","d":"Статистическая функция, возвращает стандартную ошибку предсказанных значений Y для каждого значения X по регрессивной шкале"},"VAR":{"a":"( argument-list )","d":"Статистическая функция, анализирует диапазон данных и возвращает дисперсию по выборке, содержащей числа"},"VARA":{"a":"( argument-list )","d":"Статистическая функция, анализирует диапазон данных и возвращает дисперсию по выборке"},"VARP":{"a":"( argument-list )","d":"Статистическая функция, анализирует диапазон данных и возвращает дисперсию по всей совокупности значений"},"VARPA":{"a":"( argument-list )","d":"Статистическая функция, анализирует диапазон данных и возвращает дисперсию по всей совокупности значений"},"ACCRINT":{"a":"( issue , first-interest , settlement , rate , [ par ] , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления дохода по ценным бумагам с периодической выплатой процентов"},"ACCRINTM":{"a":"( issue , settlement , rate , [ [ par ] [ , [ basis ] ] ] )","d":"Финансовая функция, используется для вычисления дохода по ценным бумагам, процент по которым уплачивается при наступлении срока погашения"},"AMORDEGRC":{"a":"( cost , date-purchased , first-period , salvage , period , rate [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления величины амортизации имущества по каждому отчетному периоду методом дегрессивной амортизации"},"AMORLINC":{"a":"( cost , date-purchased , first-period , salvage , period , rate [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления величины амортизации имущества по каждому отчетному периоду методом линейной амортизации"},"COUPDAYBS":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления количества дней от начала действия купона до даты покупки ценной бумаги"},"COUPDAYS":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления количества дней в периоде купона, содержащем дату покупки ценной бумаги"},"COUPDAYSNC":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления количества дней от даты покупки ценной бумаги до следующей выплаты по купону"},"COUPNCD":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления даты следующей выплаты по купону после даты покупки ценной бумаги"},"COUPNUM":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления количества выплат процентов между датой покупки ценной бумаги и датой погашения"},"COUPPCD":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления даты выплаты процентов, предшествующей дате покупки ценной бумаги"},"CUMIPMT":{"a":"( rate , nper , pv , start-period , end-period , type )","d":"Финансовая функция, используется для вычисления общего размера процентых выплат по инвестиции между двумя периодами времени исходя из указанной процентной ставки и постоянной периодичности платежей"},"CUMPRINC":{"a":"( rate , nper , pv , start-period , end-period , type )","d":"Финансовая функция, используется для вычисления общей суммы, выплачиваемой в погашение основного долга по инвестиции между двумя периодами времени исходя из указанной процентной ставки и постоянной периодичности платежей"},"DB":{"a":"( cost , salvage , life , period [ , [ month ] ] )","d":"Финансовая функция, используется для вычисления величины амортизации имущества за указанный отчетный период методом фиксированного убывающего остатка"},"DDB":{"a":"( cost , salvage , life , period [ , factor ] )","d":"Финансовая функция, используется для вычисления величины амортизации имущества за указанный отчетный период методом двойного убывающего остатка"},"DISC":{"a":"( settlement , maturity , pr , redemption [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления ставки дисконтирования по ценной бумаге"},"DOLLARDE":{"a":"( fractional-dollar , fraction )","d":"Финансовая функция, преобразует цену в долларах, представленную в виде дроби, в цену в долларах, выраженную десятичным числом"},"DOLLARFR":{"a":"( decimal-dollar , fraction )","d":"Финансовая функция, преобразует цену в долларах, представленную десятичным числом, в цену в долларах, выраженную в виде дроби"},"DURATION":{"a":"( settlement , maturity , coupon , yld , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления продолжительности Маколея (взвешенного среднего срока погашения) для ценной бумаги с предполагаемой номинальной стоимостью 100 рублей"},"EFFECT":{"a":"( nominal-rate , npery )","d":"Финансовая функция, используется для вычисления эффективной (фактической) годовой процентной ставки по ценной бумаге исходя из указанной номинальной годовой процентной ставки и количества периодов в году, за которые начисляются сложные проценты"},"FV":{"a":"( rate , nper , pmt [ , [ pv ] [ ,[ type ] ] ] )","d":"Финансовая функция, вычисляет будущую стоимость инвестиции исходя из заданной процентной ставки и постоянной периодичности платежей"},"FVSCHEDULE":{"a":"( principal , schedule )","d":"Финансовая функция, используется для вычисления будущей стоимости инвестиций на основании ряда непостоянных процентных ставок"},"INTRATE":{"a":"( settlement , maturity , pr , redemption [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления ставки доходности по полностью обеспеченной ценной бумаге, проценты по которой уплачиваются только при наступлении срока погашения"},"IPMT":{"a":"( rate , per , nper , pv [ , [ fv ] [ , [ type ] ] ] )","d":"Финансовая функция, используется для вычисления суммы платежей по процентам для инвестиции исходя из указанной процентной ставки и постоянной периодичности платежей"},"IRR":{"a":"( values [ , [ guess ] ] )","d":"Финансовая функция, используется для вычисления внутренней ставки доходности по ряду периодических потоков денежных средств"},"ISPMT":{"a":"( rate , per , nper , pv )","d":"Финансовая функция, используется для вычисления процентов, выплачиваемых за определенный инвестиционный период, исходя из постоянной периодичности платежей"},"MDURATION":{"a":"( settlement , maturity , coupon , yld , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления модифицированной продолжительности Маколея (взвешенного среднего срока погашения) для ценной бумаги с предполагаемой номинальной стоимостью 100 рублей"},"MIRR":{"a":"( values , finance-rate , reinvest-rate )","d":"Финансовая функция, используется для вычисления модифицированной внутренней ставки доходности по ряду периодических денежных потоков"},"NOMINAL":{"a":"( effect-rate , npery )","d":"Финансовая функция, используется для вычисления номинальной годовой процентной ставки по ценной бумаге исходя из указанной эффективной (фактической) годовой процентной ставки и количества периодов в году, за которые начисляются сложные проценты"},"NPER":{"a":"( rate , pmt , pv [ , [ fv ] [ , [ type ] ] ] )","d":"Финансовая функция, вычисляет количество периодов выплаты для инвестиции исходя из заданной процентной ставки и постоянной периодичности платежей"},"NPV":{"a":"( rate , argument-list )","d":"Финансовая функция, вычисляет величину чистой приведенной стоимости инвестиции на основе заданной ставки дисконтирования"},"ODDFPRICE":{"a":"( settlement , maturity , issue , first-coupon , rate , yld , redemption , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления цены за 100 рублей номинальной стоимости ценной бумаги с периодической выплатой процентов в случае нерегулярной продолжительности первого периода выплаты процентов (больше или меньше остальных периодов)"},"ODDFYIELD":{"a":"( settlement , maturity , issue , first-coupon , rate , pr , redemption , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления дохода по ценной бумаге с периодической выплатой процентов в случае нерегулярной продолжительности первого периода выплаты процентов (больше или меньше остальных периодов)"},"ODDLPRICE":{"a":"( settlement , maturity , last-interest , rate , yld , redemption , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления цены за 100 рублей номинальной стоимости ценной бумаги с периодической выплатой процентов в случае нерегулярной продолжительности последнего периода выплаты процентов (больше или меньше остальных периодов)"},"ODDLYIELD":{"a":"( settlement , maturity , last-interest , rate , pr , redemption , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления дохода по ценной бумаге с периодической выплатой процентов в случае нерегулярной продолжительности последнего периода выплаты процентов (больше или меньше остальных периодов)"},"PMT":{"a":"( rate , nper , pv [ , [ fv ] [ ,[ type ] ] ] )","d":"Финансовая функция, вычисляет размер периодического платежа по ссуде исходя из заданной процентной ставки и постоянной периодичности платежей"},"PPMT":{"a":"( rate , per , nper , pv [ , [ fv ] [ , [ type ] ] ] )","d":"Финансовая функция, используется для вычисления размера платежа в счет погашения основного долга по инвестиции исходя из заданной процентной ставки и постоянной периодичности платежей"},"PRICE":{"a":"( settlement , maturity , rate , yld , redemption , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления цены за 100 рублей номинальной стоимости ценной бумаги с периодической выплатой процентов"},"PRICEDISC":{"a":"( settlement , maturity , discount , redemption [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления цены за 100 рублей номинальной стоимости ценной бумаги, на которую сделана скидка"},"PRICEMAT":{"a":"( settlement , maturity , issue , rate , yld [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления цены за 100 рублей номинальной стоимости ценной бумаги, процент по которой уплачивается при наступлении срока погашения"},"PV":{"a":"( rate , nper , pmt [ , [ fv ] [ ,[ type ] ] ] )","d":"Финансовая функция, вычисляет текущую стоимость инвестиции исходя из заданной процентной ставки и постоянной периодичности платежей"},"RATE":{"a":"( nper , pmt , pv [ , [ [ fv ] [ , [ [ type ] [ , [ guess ] ] ] ] ] ] )","d":"Финансовая функция, используется для вычисления размера процентной ставки по инвестиции исходя из постоянной периодичности платежей"},"RECEIVED":{"a":"( settlement , maturity , investment , discount [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления суммы, полученной за полностью обеспеченную ценную бумагу при наступлении срока погашения"},"SLN":{"a":"( cost , salvage , life )","d":"Финансовая функция, используется для вычисления величины амортизации имущества за один отчетный период линейным методом амортизационных отчислений"},"SYD":{"a":"( cost , salvage , life , per )","d":"Финансовая функция, используется для вычисления величины амортизации имущества за указанный отчетный период методом \"суммы годовых цифр\""},"TBILLEQ":{"a":"( settlement , maturity , discount )","d":"Финансовая функция, используется для вычисления эквивалентной доходности по казначейскому векселю"},"TBILLPRICE":{"a":"( settlement , maturity , discount )","d":"Финансовая функция, используется для вычисления цены на 100 рублей номинальной стоимости для казначейского векселя"},"TBILLYIELD":{"a":"( settlement , maturity , pr )","d":"Финансовая функция, используется для вычисления доходности по казначейскому векселю"},"VDB":{"a":"( cost , salvage , life , start-period , end-period [ , [ [ factor ] [ , [ no-switch-flag ] ] ] ] ] )","d":"Финансовая функция, используется для вычисления величины амортизации имущества за указанный отчетный период или его часть методом двойного уменьшения остатка или иным указанным методом"},"XIRR":{"a":"( values , dates [ , [ guess ] ] )","d":"Финансовая функция, используется для вычисления внутренней ставки доходности по ряду нерегулярных денежных потоков"},"XNPV":{"a":"( rate , values , dates )","d":"Финансовая функция, используется для вычисления чистой приведенной стоимости инвестиции исходя из указанной процентной ставки и нерегулярных выплат"},"YIELD":{"a":"( settlement , maturity , rate , pr , redemption , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления доходности по ценной бумаге с периодической выплатой процентов"},"YIELDDISC":{"a":"( settlement , maturity , pr , redemption , [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления годовой доходности по ценной бумаге, на которую дается скидка"},"YIELDMAT":{"a":"( settlement , maturity , issue , rate , pr [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления годовой доходности по ценным бумагам, процент по которым уплачивается при наступлении срока погашения"},"ABS":{"a":"( x )","d":"Математическая и тригонометрическая функция, используется для нахождения модуля (абсолютной величины) числа"},"ACOS":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает арккосинус числа"},"ACOSH":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает гиперболический арккосинус числа"},"ASIN":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает арксинус числа"},"ASINH":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает гиперболический арксинус числа"},"ATAN":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает арктангенс числа"},"ATAN2":{"a":"( x, y )","d":"Математическая и тригонометрическая функция, возвращает арктангенс координат x и y"},"ATANH":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает гиперболический арктангенс числа"},"CEILING":{"a":"( x, significance )","d":"Математическая и тригонометрическая функция, используется, чтобы округлить число в большую сторону до ближайшего числа, кратного заданной значимости"},"COMBIN":{"a":"( number , number-chosen )","d":"Математическая и тригонометрическая функция, возвращает количество комбинаций для заданного числа элементов"},"COS":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает косинус угла"},"COSH":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает гиперболический косинус числа"},"DEGREES":{"a":"( angle )","d":"Математическая и тригонометрическая функция, преобразует радианы в градусы"},"EVEN":{"a":"( x )","d":"Математическая и тригонометрическая функция, используется, чтобы округлить число до ближайшего четного целого числа"},"EXP":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает значение константы e, возведенной в заданную степень. Константа e равна 2,71828182845904"},"FACT":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает факториал числа"},"FACTDOUBLE":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает двойной факториал числа"},"FLOOR":{"a":"( x, significance )","d":"Математическая и тригонометрическая функция, используется, чтобы округлить число в меньшую сторону до ближайшего числа, кратного заданной значимости"},"GCD":{"a":"( argument-list )","d":"Математическая и тригонометрическая функция, возвращает наибольший общий делитель для двух и более чисел"},"INT":{"a":"( x )","d":"Математическая и тригонометрическая функция, анализирует и возвращает целую часть заданного числа"},"LCM":{"a":"( argument-list )","d":"Математическая и тригонометрическая функция, возвращает наименьшее общее кратное для одного или более чисел"},"LN":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает натуральный логарифм числа"},"LOG":{"a":"( x [ , base ] )","d":"Математическая и тригонометрическая функция, возвращает логарифм числа по заданному основанию"},"LOG10":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает логарифм числа по основанию 10"},"MDETERM":{"a":"( array )","d":"Математическая и тригонометрическая функция, возвращает определитель матрицы (матрица хранится в массиве)"},"MINVERSE":{"a":"( array )","d":"Математическая и тригонометрическая функция, возвращает обратную матрицу для заданной матрицы и отображает первое значение возвращаемого массива чисел"},"MMULT":{"a":"( array1, array2 )","d":"Математическая и тригонометрическая функция, возвращает матричное произведение двух массивов и отображает первое значение из возвращаемого массива чисел"},"MOD":{"a":"( x, y )","d":"Математическая и тригонометрическая функция, возвращает остаток от деления числа на заданный делитель"},"MROUND":{"a":"( x, multiple )","d":"Математическая и тригонометрическая функция, используется, чтобы округлить число до кратного заданной значимости"},"MULTINOMIAL":{"a":"( argument-list )","d":"Математическая и тригонометрическая функция, возвращает отношение факториала суммы значений к произведению факториалов"},"ODD":{"a":"( x )","d":"Математическая и тригонометрическая функция, используется, чтобы округлить число до ближайшего нечетного целого числа"},"PI":{"a":"()","d":"Математическая и тригонометрическая функция, возвращает математическую константу пи, равную 3.14159265358979. Функция не требует аргумента"},"POWER":{"a":"( x, y )","d":"Математическая и тригонометрическая функция, возвращает результат возведения числа в заданную степень"},"PRODUCT":{"a":"( argument-list )","d":"Математическая и тригонометрическая функция, перемножает все числа в заданном диапазоне ячеек и возвращает произведение"},"QUOTIENT":{"a":"( dividend , divisor )","d":"Математическая и тригонометрическая функция, возвращает целую часть результата деления с остатком"},"RADIANS":{"a":"( angle )","d":"Математическая и тригонометрическая функция, преобразует градусы в радианы"},"RAND":{"a":"()","d":"Математическая и тригонометрическая функция, возвращает случайное число, которое больше или равно 0 и меньше 1. Функция не требует аргумента"},"RANDBETWEEN":{"a":"( lower-bound , upper-bound )","d":"Математическая и тригонометрическая функция, возвращает случайное число, большее или равное значению аргумента lower-bound (нижняя граница) и меньшее или равное значению аргумента upper-bound (верхняя граница)"},"ROMAN":{"a":"( number, form )","d":"Математическая и тригонометрическая функция, преобразует число в римское"},"ROUND":{"a":"( x , number-digits )","d":"Математическая и тригонометрическая функция, округляет число до заданного количества десятичных разрядов"},"ROUNDDOWN":{"a":"( x , number-digits )","d":"Математическая и тригонометрическая функция, округляет число в меньшую сторону до заданного количества десятичных разрядов"},"ROUNDUP":{"a":"( x , number-digits )","d":"Математическая и тригонометрическая функция, округляет число в большую сторону до заданного количества десятичных разрядов"},"SERIESSUM":{"a":"( input-value , initial-power , step , coefficients )","d":"Математическая и тригонометрическая функция, возвращает сумму степенного ряда"},"SIGN":{"a":"( x )","d":"Математическая и тригонометрическая функция, определяет знак числа. Если число положительное, функция возвращает значение 1. Если число отрицательное, функция возвращает значение -1. Если число равно 0, функция возвращает значение 0"},"SIN":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает синус угла"},"SINH":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает гиперболический синус числа"},"SQRT":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает квадратный корень числа"},"SQRTPI":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает квадратный корень от результата умножения константы пи (3.14159265358979) на заданное число"},"SUBTOTAL":{"a":"( function-number , argument-list )","d":"Возвращает промежуточный итог в список или базу данных"},"SUM":{"a":"( argument-list )","d":"Математическая и тригонометрическая функция, возвращает результат сложения всех чисел в выбранном диапазоне ячеек"},"SUMIF":{"a":"( cell-range, selection-criteria [ , sum-range ] )","d":"Математическая и тригонометрическая функция, суммирует все числа в выбранном диапазоне ячеек в соответствии с заданным условием и возвращает результат"},"SUMIFS":{"a":"( sum-range, criteria-range1, criteria1, [ criteria-range2, criteria2 ], ... )","d":"Математическая и тригонометрическая функция, суммирует все числа в выбранном диапазоне ячеек в соответствии с несколькими условиями и возвращает результат"},"SUMPRODUCT":{"a":"( argument-list )","d":"Математическая и тригонометрическая функция, перемножает соответствующие элементы заданных диапазонов ячеек или массивов и возвращает сумму произведений"},"SUMSQ":{"a":"( argument-list )","d":"Математическая и тригонометрическая функция, вычисляет сумму квадратов чисел и возвращает результат"},"SUMX2MY2":{"a":"( array-1 , array-2 )","d":"Математическая и тригонометрическая функция, вычисляет сумму разностей квадратов соответствующих элементов в двух массивах"},"SUMX2PY2":{"a":"( array-1 , array-2 )","d":"Математическая и тригонометрическая функция, вычисляет суммы квадратов соответствующих элементов в двух массивах и возвращает сумму полученных результатов"},"SUMXMY2":{"a":"( array-1 , array-2 )","d":"Математическая и тригонометрическая функция, возвращает сумму квадратов разностей соответствующих элементов в двух массивах"},"TAN":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает тангенс угла"},"TANH":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает гиперболический тангенс числа"},"TRUNC":{"a":"( x [ , number-digits ] )","d":"Математическая и тригонометрическая функция, возвращает число, усеченное до заданного количества десятичных разрядов"},"ADDRESS":{"a":"( row-number , col-number [ , [ ref-type ] [ , [ A1-ref-style-flag ] [ , sheet-name ] ] ] )","d":"Поисковая функция, возвращает адрес ячейки, представленный в виде текста"},"CHOOSE":{"a":"( index , argument-list )","d":"Поисковая функция, возвращает значение из списка значений по заданному индексу (позиции)"},"COLUMN":{"a":"( [ reference ] )","d":"Поисковая функция, возвращает номер столбца ячейки"},"COLUMNS":{"a":"( array )","d":"Поисковая функция, возвращает количество столбцов в ссылке на ячейки"},"HLOOKUP":{"a":"( lookup-value , table-array , row-index-num [ , [ range-lookup-flag ] ] )","d":"Поисковая функция, используется для выполнения горизонтального поиска значения в верхней строке таблицы или массива и возвращает значение, которое находится в том же самом столбце в строке с заданным номером"},"INDEX":{"a":"( array , [ row-number ] [ , [ column-number ] ] ) INDEX( reference , [ row-number ] [ , [ column-number ] [ , [ area-number ] ] ] )","d":"Поисковая функция, возвращает значение в диапазоне ячеек на основании заданных номера строки и номера столбца. Существуют две формы функции INDEX"},"INDIRECT":{"a":"( ref-text [ , [ A1-ref-style-flag ] ] )","d":"Поисковая функция, возвращает ссылку на ячейку, указанную с помощью текстовой строки"},"LOOKUP":{"a":"( lookup-value , lookup-vector , result-vector )","d":"Поисковая функция, возвращает значение из выбранного диапазона (строки или столбца с данными, отсортированными в порядке возрастания)"},"MATCH":{"a":"( lookup-value , lookup-array [ , [ match-type ]] )","d":"Поисковая функция, возвращает относительное положение заданного элемента в диапазоне ячеек"},"OFFSET":{"a":"( reference , rows , cols [ , [ height ] [ , [ width ] ] ] )","d":"Поисковая функция, возвращает ссылку на ячейку, отстоящую от заданной ячейки (или верхней левой ячейки в диапазоне ячеек) на определенное число строк и столбцов"},"ROW":{"a":"( [ reference ] )","d":"Поисковая функция, возвращает номер строки для ссылки на ячейку"},"ROWS":{"a":"( array )","d":"Поисковая функция, возвращает количество строк в ссылке на ячейки"},"TRANSPOSE":{"a":"( array )","d":"Поисковая функция, возвращает первый элемент массива"},"VLOOKUP":{"a":"( lookup-value , table-array , col-index-num [ , [ range-lookup-flag ] ] )","d":"Поисковая функция, используется для выполнения вертикального поиска значения в крайнем левом столбце таблицы или массива и возвращает значение, которое находится в той же самой строке в столбце с заданным номером"},"ERROR.TYPE":{"a":"(value)","d":"Информационная функция, возвращает числовое представление одной из существующих ошибок"},"ISBLANK":{"a":"(value)","d":"Информационная функция, проверяет, является ли ячейка пустой. Если ячейка пуста, функция возвращает значение TRUE (ИСТИНА), в противном случае функция возвращает значение FALSE (ЛОЖЬ)"},"ISERR":{"a":"(value)","d":"Информационная функция, используется для проверки на наличие значения ошибки. Если ячейка содержит значение ошибки (кроме #N/A), функция возвращает значение TRUE (ИСТИНА), в противном случае функция возвращает значение FALSE (ЛОЖЬ)"},"ISERROR":{"a":"(value)","d":"Информационная функция, используется для проверки на наличие значения ошибки. Если ячейка содержит одно из следующих значений ошибки: #N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME? или #NULL, функция возвращает значение TRUE (ИСТИНА), в противном случае функция возвращает значение FALSE (ЛОЖЬ)"},"ISEVEN":{"a":"(number)","d":"Информационная функция, используется для проверки на наличие четного числа. Если ячейка содержит четное число, функция возвращает значение TRUE. Если число является нечетным, она возвращает значение FALSE"},"ISLOGICAL":{"a":"(value)","d":"Информационная функция, используется для проверки на наличие логического значения (TRUE (ИСТИНА) или FALSE (ЛОЖЬ)). Если ячейка содержит логическое значение, функция возвращает значение TRUE (ИСТИНА), в противном случае функция возвращает значение FALSE (ЛОЖЬ)"},"ISNA":{"a":"(value)","d":"Информационная функция, используется для проверки на наличие ошибки #N/A. Если ячейка содержит значение ошибки #N/A, функция возвращает значение TRUE (ИСТИНА), в противном случае функция возвращает значение FALSE (ЛОЖЬ)"},"ISNONTEXT":{"a":"(value)","d":"Информационная функция, используется для проверки на наличие значения, которое не является текстом. Если ячейка не содержит текстового значения, функция возвращает значение TRUE (ИСТИНА), в противном случае функция возвращает значение FALSE (ЛОЖЬ)"},"ISNUMBER":{"a":"(value)","d":"Информационная функция, используется для проверки на наличие числового значения. Если ячейка содержит числовое значение, функция возвращает значение TRUE (ИСТИНА), в противном случае функция возвращает значение FALSE (ЛОЖЬ)"},"ISODD":{"a":"(number)","d":"Информационная функция, используется для проверки на наличие нечетного числа. Если ячейка содержит нечетное число, функция возвращает значение TRUE. Если число является четным, она возвращает значение FALSE"},"ISREF":{"a":"(value)","d":"Информационная функция, используется для проверки, является ли значение допустимой ссылкой на другую ячейку"},"ISTEXT":{"a":"(value)","d":"Информационная функция, используется для проверки на наличие текстового значения. Если ячейка содержит текстовое значение, функция возвращает значение TRUE (ИСТИНА), в противном случае функция возвращает значение FALSE (ЛОЖЬ)"},"N":{"a":"(value)","d":"Информационная функция, преобразует значение в число"},"NA":{"a":"()","d":"Информационная функция, возвращает значение ошибки #N/A. Эта функция не требует аргумента"},"TYPE":{"a":"(value)","d":"Информационная функция, используется для определения типа результирующего или отображаемого значения"},"AND":{"a":"(logical1, logical2, ...)","d":"Логическая функция, используется для проверки, является ли введенное логическое значение TRUE (истинным) или FALSE (ложным). Функция возвращает значение TRUE (ИСТИНА), если все аргументы имеют значение TRUE (ИСТИНА)"},"FALSE":{"a":"()","d":"Логическая функция, возвращает значение FALSE (ЛОЖЬ) и не требует аргумента"},"IF":{"a":"(logical_test, value_if_true, value_if_false)","d":"Логическая функция, используется для проверки логического выражения и возвращает одно значение, если проверяемое условие имеет значение TRUE (ИСТИНА), и другое, если оно имеет значение FALSE (ЛОЖЬ)"},"IFERROR":{"a":"(value, value_if_error)","d":"Логическая функция, используется для проверки формулы на наличие ошибок в первом аргументе. Функция возвращает результат формулы, если ошибки нет, или определенное значение, если она есть"},"NOT":{"a":"(logical)","d":"Логическая функция, используется для проверки, является ли введенное логическое значение TRUE (истинным) или FALSE (ложным). Функция возвращает значение TRUE (ИСТИНА), если аргумент имеет значение FALSE (ЛОЖЬ), и FALSE (ЛОЖЬ), если аргумент имеет значение TRUE (ИСТИНА)"},"OR":{"a":"(logical1, logical2, ...)","d":"Логическая функция, используется для проверки, является ли введенное логическое значение TRUE (истинным) или FALSE (ложным). Функция возвращает значение FALSE (ЛОЖЬ), если все аргументы имеют значение FALSE (ЛОЖЬ)"},"TRUE":{"a":"()","d":"Логическая функция, возвращает значение TRUE (ИСТИНА) и не требует аргумента"}} \ No newline at end of file +{"DATE":{"a":"( year, month, day )","d":"Функция даты и времени, используется для добавления дат в стандартном формате ММ/дд/гггг"},"DATEDIF":{"a":"( start-date , end-date , unit )","d":"Функция даты и времени, возвращает разницу между двумя датами (начальной и конечной) согласно заданному интервалу (единице)"},"DATEVALUE":{"a":"( date-time-string )","d":"Функция даты и времени, возвращает порядковый номер заданной даты"},"DAY":{"a":"( date-value )","d":"Функция даты и времени, возвращает день (число от 1 до 31), соответствующий дате, заданной в числовом формате (MM/дд/гггг по умолчанию)"},"DAYS360":{"a":"( start-date , end-date [ , method-flag ] )","d":"Функция даты и времени, возвращает количество дней между двумя датами (начальной и конечной) на основе 360-дневного года с использованием одного из методов вычислений (американского или европейского)"},"EDATE":{"a":"( start-date , month-offset )","d":"Функция даты и времени, возвращает порядковый номер даты, которая идет на заданное число месяцев (month-offset) до или после заданной даты (start-date)"},"EOMONTH":{"a":"( start-date , month-offset )","d":"Функция даты и времени, возвращает порядковый номер последнего дня месяца, который идет на заданное число месяцев до или после заданной начальной даты"},"HOUR":{"a":"( time-value )","d":"Функция даты и времени, возвращает количество часов (число от 0 до 23), соответствующее заданному значению времени"},"MINUTE":{"a":"( time-value )","d":"Функция даты и времени, возвращает количество минут (число от 0 до 59), соответствующее заданному значению времени"},"MONTH":{"a":"( date-value )","d":"Функция даты и времени, возвращает месяц (число от 1 до 12), соответствующий дате, заданной в числовом формате (MM/дд/гггг по умолчанию)"},"NETWORKDAYS":{"a":"( start-date , end-date [ , holidays ] )","d":"Функция даты и времени, возвращает количество рабочих дней между двумя датами (начальной и конечной). Выходные и праздничные дни в это число не включаются"},"NOW":{"a":"()","d":"Функция даты и времени, используется для добавления в электронную таблицу текущей даты и времени в следующем формате: MM/дд/гг чч:мм. Данная функция не требует аргумента"},"SECOND":{"a":"( time-value )","d":"Функция даты и времени, возвращает количество секунд (число от 0 до 59), соответствующее заданному значению времени"},"TIME":{"a":"( hour, minute, second )","d":"Функция даты и времени, используется для добавления определенного времени в выбранном формате (по умолчанию чч:мм tt (указатель половины дня a.m./p.m.))"},"TIMEVALUE":{"a":"( date-time-string )","d":"Функция даты и времени, возвращает порядковый номер, соответствующий заданному времени"},"TODAY":{"a":"()","d":"Функция даты и времени, используется для добавления текущей даты в следующем формате: MM/дд/гг. Данная функция не требует аргумента"},"WEEKDAY":{"a":"( serial-value [ , weekday-start-flag ] )","d":"Функция даты и времени, определяет, какой день недели соответствует заданной дате"},"WEEKNUM":{"a":"( serial-value [ , weekday-start-flag ] )","d":"Функция даты и времени, возвращает порядковый номер той недели в течение года, на которую приходится заданная дата"},"WORKDAY":{"a":"( start-date , day-offset [ , holidays ] )","d":"Функция даты и времени, возвращает дату, которая идет на заданное число дней (day-offset) до или после заданной начальной даты, без учета выходных и праздничных дней"},"YEAR":{"a":"( date-value )","d":"Функция даты и времени, возвращает год (число от 1900 до 9999), соответствующий дате, заданной в числовом формате (MM/дд/гггг по умолчанию)"},"YEARFRAC":{"a":"( start-date , end-date [ , basis ] )","d":"Функция даты и времени, возвращает долю года, представленную числом целых дней между начальной и конечной датами, вычисляемую заданным способом"},"BIN2DEC":{"a":"( number )","d":"Инженерная функция, преобразует двоичное число в десятичное"},"BIN2HEX":{"a":"( number [ , num-hex-digits ] )","d":"Инженерная функция, преобразует двоичное число в шестнадцатеричное"},"BIN2OCT":{"a":"( number [ , num-hex-digits ] )","d":"Инженерная функция, преобразует двоичное число в восьмеричное"},"COMPLEX":{"a":"( real-number , imaginary-number [ , suffix ] )","d":"Инженерная функция, используется для преобразования действительной и мнимой части в комплексное число, выраженное в формате a + bi или a + bj"},"DEC2BIN":{"a":"( number [ , num-hex-digits ] )","d":"Инженерная функция, преобразует десятичное число в двоичное"},"DEC2HEX":{"a":"( number [ , num-hex-digits ] )","d":"Инженерная функция, преобразует десятичное число в шестнадцатеричное"},"DEC2OCT":{"a":"( number [ , num-hex-digits ] )","d":"Инженерная функция, преобразует десятичное число в восьмеричное"},"DELTA":{"a":"( number-1 [ , number-2 ] )","d":"Инженерная функция, используется для проверки равенства двух чисел. Функция возвращает 1, если числа равны, в противном случае возвращает 0"},"ERF":{"a":"( lower-bound [ , upper-bound ] )","d":"Инженерная функция, используется для расчета значения функции ошибки, проинтегрированного в интервале от заданного нижнего до заданного верхнего предела"},"ERFC":{"a":"( lower-bound )","d":"Инженерная функция, используется для расчета значения дополнительной функции ошибки, проинтегрированного в интервале от заданного нижнего предела до бесконечности"},"GESTEP":{"a":"( number [ , step ] )","d":"Инженерная функция, используется для проверки того, превышает ли какое-то число пороговое значение. Функция возвращает 1, если число больше или равно пороговому значению, в противном случае возвращает 0"},"HEX2BIN":{"a":"( number [ , num-hex-digits ] )","d":"Инженерная функция, преобразует шестнадцатеричное число в двоичное"},"HEX2DEC":{"a":"( number )","d":"Инженерная функция, преобразует шестнадцатеричное число в десятичное"},"HEX2OCT":{"a":"( number [ , num-hex-digits ] )","d":"Инженерная функция, преобразует шестнадцатеричное число в восьмеричное"},"IMABS":{"a":"( complex-number )","d":"Инженерная функция, возвращает абсолютное значение комплексного числа"},"IMAGINARY":{"a":"( complex-number )","d":"Инженерная функция, возвращает мнимую часть заданного комплексного числа"},"IMARGUMENT":{"a":"( complex-number )","d":"Инженерная функция, возвращает значение аргумента Тета, то есть угол в радианах"},"IMCONJUGATE":{"a":"( complex-number )","d":"Инженерная функция, возвращает комплексно-сопряженное значение комплексного числа"},"IMCOS":{"a":"( complex-number )","d":"Инженерная функция, возвращает косинус комплексного числа, представленного в текстовом формате a + bi или a + bj"},"IMCOSH":{"a":"( complex-number )","d":"Инженерная функция, возвращает гиперболический косинус комплексного числа в текстовом формате a + bi или a + bj"},"IMCOT":{"a":"( complex-number )","d":"Инженерная функция, возвращает котангенс комплексного числа в текстовом формате a + bi или a + bj"},"IMCSC":{"a":"( complex-number )","d":"Инженерная функция, возвращает косеканс комплексного числа в текстовом формате a + bi или a + bj"},"IMCSCH":{"a":"( complex-number )","d":"Инженерная функция, возвращает гиперболический косеканс комплексного числа в текстовом формате a + bi или a + bj"},"IMDIV":{"a":"( complex-number-1 , complex-number-2 )","d":"Инженерная функция, возвращает частное от деления двух комплексных чисел, представленных в формате a + bi или a + bj"},"IMEXP":{"a":"( complex-number )","d":"Инженерная функция, возвращает экспоненту комплексного числа (значение константы e, возведенной в степень, заданную комплексным числом). Константа e равна 2,71828182845904"},"IMLN":{"a":"( complex-number )","d":"Инженерная функция, возвращает натуральный логарифм комплексного числа"},"IMLOG10":{"a":"( complex-number )","d":"Инженерная функция, возвращает двоичный логарифм комплексного числа"},"IMLOG2":{"a":"( complex-number )","d":"Инженерная функция, возвращает десятичный логарифм комплексного числа"},"IMPOWER":{"a":"( complex-number, power )","d":"Инженерная функция, возвращает комплексное число, возведенное в заданную степень"},"IMPRODUCT":{"a":"( argument-list )","d":"Инженерная функция, возвращает произведение указанных комплексных чисел"},"IMREAL":{"a":"( complex-number )","d":"Инженерная функция, возвращает действительную часть комплексного числа"},"IMSEC":{"a":"( complex-number )","d":"Инженерная функция, возвращает секанс комплексного числа в текстовом формате a + bi или a + bj"},"IMSECH":{"a":"( complex-number )","d":"Инженерная функция, возвращает гиперболический секанс комплексного числа в текстовом формате a + bi или a + bj"},"IMSIN":{"a":"( complex-number )","d":"Инженерная функция, возвращает синус комплексного числа a + bi или a + bj"},"IMSINH":{"a":"( complex-number )","d":"Инженерная функция, возвращает гиперболический синус комплексного числа в текстовом формате a + bi или a + bj"},"IMSQRT":{"a":"( complex-number )","d":"Инженерная функция, возвращает значение квадратного корня из комплексного числа"},"IMSUB":{"a":"( complex-number-1 , complex-number-2 )","d":"Инженерная функция, возвращает разность двух комплексных чисел, представленных в формате a + bi или a + bj"},"IMSUM":{"a":"( argument-list )","d":"Инженерная функция, возвращает сумму двух комплексных чисел, представленных в формате a + bi или a + bj"},"IMTAN":{"a":"( complex-number )","d":"Инженерная функция, тангенс комплексного числа в текстовом формате a + bi или a + bj"},"OCT2BIN":{"a":"( number [ , num-hex-digits ] )","d":"Инженерная функция, преобразует восьмеричное число в двоичное"},"OCT2DEC":{"a":"( number )","d":"Инженерная функция, преобразует восьмеричное число в десятичное"},"OCT2HEX":{"a":"( number [ , num-hex-digits ] )","d":"Инженерная функция, преобразует восьмеричное число в шестнадцатеричное"},"CHAR":{"a":"( number )","d":"Функция для работы с текстом и данными, возвращает символ ASCII, соответствующий заданному числовому коду"},"CLEAN":{"a":"( string )","d":"Функция для работы с текстом и данными, используется для удаления всех непечатаемых символов из выбранной строки"},"CODE":{"a":"( string )","d":"Функция для работы с текстом и данными, возвращает числовой код ASCII, соответствующий заданному символу или первому символу в ячейке"},"CONCATENATE":{"a":"(text1, text2, ...)","d":"Функция для работы с текстом и данными, используется для объединения данных из двух или более ячеек в одну"},"DOLLAR":{"a":"( number [ , num-decimal ] )","d":"Функция для работы с текстом и данными, преобразует число в текст, используя денежный формат $#.##"},"EXACT":{"a":"(text1, text2)","d":"Функция для работы с текстом и данными, используется для сравнения данных в двух ячейках. Функция возвращает значение TRUE (ИСТИНА), если данные совпадают, и FALSE (ЛОЖЬ), если нет"},"FIND":{"a":"( string-1 , string-2 [ , start-pos ] )","d":"Функция для работы с текстом и данными, используется для поиска заданной подстроки (string-1) внутри строки (string-2), предназначена для языков, использующих однобайтовую кодировку (SBCS)"},"FINDB":{"a":"( string-1 , string-2 [ , start-pos ] )","d":"Функция для работы с текстом и данными, используется для поиска заданной подстроки (string-1) внутри строки (string-2), предназначена для языков, использующих двухбайтовую кодировку (DBCS), таких как японский, китайский, корейский и т.д."},"FIXED":{"a":"( number [ , [ num-decimal ] [ , suppress-commas-flag ] ] )","d":"Функция для работы с текстом и данными, возвращает текстовое представление числа, округленного до заданного количества десятичных знаков"},"LEFT":{"a":"( string [ , number-chars ] )","d":"Функция для работы с текстом и данными, извлекает подстроку из заданной строки, начиная с левого символа, предназначена для языков, использующих однобайтовую кодировку (SBCS)"},"LEFTB":{"a":"( string [ , number-chars ] )","d":"Функция для работы с текстом и данными, извлекает подстроку из заданной строки, начиная с левого символа, предназначена для языков, использующих двухбайтовую кодировку (DBCS), таких как японский, китайский, корейский и т.д."},"LEN":{"a":"( string )","d":"Функция для работы с текстом и данными, анализирует заданную строку и возвращает количество символов, которые она содержит, предназначена для языков, использующих однобайтовую кодировку (SBCS)"},"LENB":{"a":"( string )","d":"Функция для работы с текстом и данными, анализирует заданную строку и возвращает количество символов, которые она содержит, предназначена для языков, использующих двухбайтовую кодировку (DBCS), таких как японский, китайский, корейский и т.д."},"LOWER":{"a":"(text)","d":"Функция для работы с текстом и данными, используется для преобразования букв в выбранной ячейке из верхнего регистра в нижний"},"MID":{"a":"( string , start-pos , number-chars )","d":"Функция для работы с текстом и данными, извлекает символы из заданной строки, начиная с любого места, предназначена для языков, использующих однобайтовую кодировку (SBCS)"},"MIDB":{"a":"( string , start-pos , number-chars )","d":"Функция для работы с текстом и данными, извлекает символы из заданной строки, начиная с любого места, предназначена для языков, использующих двухбайтовую кодировку (DBCS), таких как японский, китайский, корейский и т.д."},"PROPER":{"a":"( string )","d":"Функция для работы с текстом и данными, преобразует первую букву каждого слова в прописную (верхний регистр), а все остальные буквы - в строчные (нижний регистр)"},"REPLACE":{"a":"( string-1, start-pos, number-chars, string-2 )","d":"Функция для работы с текстом и данными, заменяет ряд символов на новый, с учетом заданного количества символов и начальной позиции, предназначена для языков, использующих однобайтовую кодировку (SBCS)"},"REPLACEB":{"a":"( string-1, start-pos, number-chars, string-2 )","d":"Функция для работы с текстом и данными, заменяет ряд символов на новый, с учетом заданного количества символов и начальной позиции, предназначена для языков, использующих двухбайтовую кодировку (DBCS), таких как японский, китайский, корейский и т.д."},"REPT":{"a":"(text, number_of_times)","d":"Функция для работы с текстом и данными, используется для повторения данных в выбранной ячейке заданное количество раз"},"RIGHT":{"a":"( string [ , number-chars ] )","d":"Функция для работы с текстом и данными, извлекает подстроку из заданной строки, начиная с крайнего правого символа, согласно заданному количеству символов, предназначена для языков, использующих однобайтовую кодировку (SBCS)"},"RIGHTB":{"a":"( string [ , number-chars ] )","d":"Функция для работы с текстом и данными, извлекает подстроку из заданной строки, начиная с крайнего правого символа, согласно заданному количеству символов, предназначена для языков, использующих двухбайтовую кодировку (DBCS), таких как японский, китайский, корейский и т.д."},"SEARCH":{"a":"( string-1 , string-2 [ , start-pos ] )","d":"Функция для работы с текстом и данными, возвращает местоположение заданной подстроки в строке, предназначена для языков, использующих однобайтовую кодировку (SBCS)"},"SEARCHB":{"a":"( string-1 , string-2 [ , start-pos ] )","d":"Функция для работы с текстом и данными, возвращает местоположение заданной подстроки в строке, предназначена для языков, использующих двухбайтовую кодировку (DBCS), таких как японский, китайский, корейский и т.д."},"SUBSTITUTE":{"a":"( string , old-string , new-string [ , occurence ] )","d":"Функция для работы с текстом и данными, заменяет ряд символов на новый"},"T":{"a":"( value )","d":"Функция для работы с текстом и данными, используется для проверки, является ли значение в ячейке (или используемое как аргумент) текстом или нет. Если это не текст, функция возвращает пустой результат. Если значение/аргумент является текстом, функция возвращает это же текстовое значение"},"TEXT":{"a":"( value , format )","d":"Функция для работы с текстом и данными, преобразует числовое значение в текст в заданном формате"},"TRIM":{"a":"( string )","d":"Функция для работы с текстом и данными, удаляет пробелы из начала и конца строки"},"UPPER":{"a":"(text)","d":"Функция для работы с текстом и данными, используется для преобразования букв в выбранной ячейке из нижнего регистра в верхний"},"VALUE":{"a":"( string )","d":"Функция для работы с текстом и данными, преобразует текстовое значение, представляющее число, в числовое значение. Если преобразуемый текст не является числом, функция возвращает ошибку #VALUE!"},"AVEDEV":{"a":"( argument-list )","d":"Статистическая функция, используется для анализа диапазона данных и возвращает среднее абсолютных значений отклонений чисел от их среднего значения"},"AVERAGE":{"a":"( argument-list )","d":"Статистическая функция, анализирует диапазон данных и вычисляет среднее значение"},"AVERAGEA":{"a":"( argument-list )","d":"Статистическая функция, анализирует диапазон данных, включая текстовые и логические значения, и вычисляет среднее значение. Функция AVERAGEA интерпретирует текст и логическое значение FALSE (ЛОЖЬ) как числовое значение 0, а логическое значение TRUE (ИСТИНА) как числовое значение 1"},"AVERAGEIF":{"a":"( cell-range, selection-criteria [ , average-range ] )","d":"Статистическая функция, анализирует диапазон данных и вычисляет среднее значение всех чисел в диапазоне ячеек, которые соответствуют заданному условию"},"AVERAGEIFS":{"a":"( average-range, criteria-range-1, criteria-1 [ criteria-range-2, criteria-2 ], ... )","d":"Статистическая функция, анализирует диапазон данных и вычисляет среднее значение всех чисел в диапазоне ячеек, которые соответствуют нескольким заданным условиям"},"BINOMDIST":{"a":"( number-successes , number-trials , success-probability , cumulative-flag )","d":"Статистическая функция, возвращает отдельное значение вероятности биномиального распределения"},"CONFIDENCE":{"a":"( alpha , standard-dev , size )","d":"Статистическая функция, возвращает доверительный интервал"},"CORREL":{"a":"( array-1 , array-2 )","d":"Статистическая функция, используется для анализа диапазона данных и возвращает коэффициент корреляции между двумя диапазонами ячеек"},"COUNT":{"a":"( argument-list )","d":"Статистическая функция, используется для подсчета количества ячеек в выбранном диапазоне, содержащих числа, без учета пустых или содержащих текст ячеек"},"COUNTA":{"a":"( argument-list )","d":"Статистическая функция, используется для анализа диапазона ячеек и подсчета количества непустых ячеек"},"COUNTBLANK":{"a":"( argument-list )","d":"Статистическая функция, используется для анализа диапазона ячеек и возвращает количество пустых ячеек"},"COUNTIFS":{"a":"( criteria-range1, criteria1, [ criteria-range2, criteria2 ], ... )","d":"Статистическая функция, используется для подсчета количества ячеек выделенного диапазона, соответствующих нескольким заданным условиям"},"COUNTIF":{"a":"( cell-range, selection-criteria )","d":"Статистическая функция, используется для подсчета количества ячеек выделенного диапазона, соответствующих заданному условию"},"COVAR":{"a":"( array-1 , array-2 )","d":"Статистическая функция, возвращает ковариацию в двух диапазонах данных"},"CRITBINOM":{"a":"( number-trials , success-probability , alpha )","d":"Статистическая функция, возвращает наименьшее значение, для которого интегральное биномиальное распределение больше или равно заданному условию"},"DEVSQ":{"a":"( argument-list )","d":"Статистическая функция, используется для анализа диапазона ячеек и возвращает сумму квадратов отклонений чисел от их среднего значения"},"EXPONDIST":{"a":"( x , lambda , cumulative-flag )","d":"Статистическая функция, возвращает экспоненциальное распределение"},"FISHER":{"a":"( number )","d":"Статистическая функция, возвращает преобразование Фишера для числа"},"FISHERINV":{"a":"( number )","d":"Статистическая функция, выполняет обратное преобразование Фишера"},"FORECAST":{"a":"( x , array-1 , array-2 )","d":"Статистическая функция, предсказывает будущее значение на основе существующих значений"},"FREQUENCY":{"a":"( data-array , bins-array )","d":"Статистическая функция, вычисляет частоту появления значений в выбранном диапазоне ячеек и отображает первое значение возвращаемого вертикального массива чисел"},"GAMMALN":{"a":"(number)","d":"Статистическая функция, возвращает натуральный логарифм гамма-функции"},"GEOMEAN":{"a":"( argument-list )","d":"Статистическая функция, вычисляет среднее геометрическое для списка значений"},"HARMEAN":{"a":"( argument-list )","d":"Статистическая функция, вычисляет среднее гармоническое для списка значений"},"HYPGEOMDIST":{"a":"( sample-successes , number-sample , population-successes , number-population )","d":"Статистическая функция, возвращает гипергеометрическое распределение, вероятность заданного количества успехов в выборке, если заданы размер выборки, количество успехов в генеральной совокупности и размер генеральной совокупности"},"INTERCEPT":{"a":"( array-1 , array-2 )","d":"Статистическая функция, анализирует значения первого и второго массивов для вычисления точки пересечения"},"KURT":{"a":"( argument-list )","d":"Статистическая функция, возвращает эксцесс списка значений"},"LARGE":{"a":"( array , k )","d":"Статистическая функция, анализирует диапазон ячеек и возвращает n-ое по величине значение"},"LOGINV":{"a":"( x , mean , standard-deviation )","d":"Статистическая функция, возвращает обратное логарифмическое нормальное распределение для заданного значения x с указанными параметрами"},"LOGNORMDIST":{"a":"( x , mean , standard-deviation )","d":"Статистическая функция, анализирует логарифмически преобразованные данные и возвращает логарифмическое нормальное распределение для заданного значения x с указанными параметрами"},"MAX":{"a":"(number1, number2, ...)","d":"Статистическая функция, используется для анализа диапазона данных и поиска наибольшего числа"},"MAXA":{"a":"(number1, number2, ...)","d":"Статистическая функция, используется для анализа диапазона данных и поиска наибольшего значения"},"MEDIAN":{"a":"( argument-list )","d":"Статистическая функция, вычисляет медиану для списка значений"},"MIN":{"a":"(number1, number2, ...)","d":"Статистическая функция, используется для анализа диапазона данных и поиска наименьшего числа"},"MINA":{"a":"(number1, number2, ...)","d":"Статистическая функция, используется для анализа диапазона данных и поиска наименьшего значения"},"MODE":{"a":"( argument-list )","d":"Статистическая функция, анализирует диапазон данных и возвращает наиболее часто встречающееся значение"},"NEGBINOMDIST":{"a":"( number-failures , number-successes , success-probability )","d":"Статистическая функция, возвращает отрицательное биномиальное распределение"},"NORMDIST":{"a":"( x , mean , standard-deviation , cumulative-flag )","d":"Статистическая функция, возвращает нормальную функцию распределения для указанного среднего значения и стандартного отклонения"},"NORMINV":{"a":"( x , mean , standard-deviation )","d":"Статистическая функция, возвращает обратное нормальное распределение для указанного среднего значения и стандартного отклонения"},"NORMSDIST":{"a":"(number)","d":"Статистическая функция, возвращает стандартное нормальное интегральное распределение"},"NORMSINV":{"a":"( probability )","d":"Статистическая функция, возвращает обратное значение стандартного нормального распределения"},"PEARSON":{"a":"( array-1 , array-2 )","d":"Статистическая функция, возвращает коэффициент корреляции Пирсона"},"PERCENTILE":{"a":"( array , k )","d":"Статистическая функция, анализирует диапазон данных и возвращает n-ый процентиль"},"PERCENTRANK":{"a":"( array , x [ , significance ] )","d":"Статистическая функция, возвращает категорию значения в наборе данных как процентное содержание в наборе данных"},"PERMUT":{"a":"( number , number-chosen )","d":"Статистическая функция, возвращает количество перестановок для заданного числа элементов"},"POISSON":{"a":"( x , mean , cumulative-flag )","d":"Статистическая функция, возвращает распределение Пуассона"},"PROB":{"a":"( x-range , probability-range , lower-limit [ , upper-limit ] )","d":"Статистическая функция, возвращает вероятность того, что значения из интервала находятся внутри нижнего и верхнего пределов"},"QUARTILE":{"a":"( array , result-category )","d":"Статистическая функция, анализирует диапазон данных и возвращает квартиль"},"RSQ":{"a":"( array-1 , array-2 )","d":"Статистическая функция, возвращает квадрат коэффициента корреляции Пирсона"},"SKEW":{"a":"( argument-list )","d":"Статистическая функция, анализирует диапазон данных и возвращает асимметрию распределения для списка значений"},"SLOPE":{"a":"( array-1 , array-2 )","d":"Статистическая функция, возвращает наклон линии линейной регрессии для данных в двух массивах"},"SMALL":{"a":"( array , k )","d":"Статистическая функция, анализирует диапазон данных и находит n-ое наименьшее значение"},"STANDARDIZE":{"a":"( x , mean , standard-deviation )","d":"Статистическая функция, возвращает нормализованное значение для распределения, характеризуемого заданными параметрами"},"STDEV":{"a":"( argument-list )","d":"Статистическая функция, анализирует диапазон данных и возвращает стандартное отклонение по выборке, содержащей числа"},"STDEVA":{"a":"( argument-list )","d":"Статистическая функция, анализирует диапазон данных и возвращает стандартное отклонение по выборке, содержащей числа, текст и логические значения (TRUE или FALSE). Текст и логические значения FALSE (ЛОЖЬ) интерпретируются как 0, а логические значения TRUE (ИСТИНА) - как 1"},"STDEVP":{"a":"( argument-list )","d":"Статистическая функция, используется для анализа диапазона данных и возвращает стандартное отклонение по всей совокупности значений"},"STDEVPA":{"a":"( argument-list )","d":"Статистическая функция, используется для анализа диапазона данных и возвращает стандартное отклонение по всей совокупности значений"},"STEYX":{"a":"( known-ys , known-xs )","d":"Статистическая функция, возвращает стандартную ошибку предсказанных значений Y для каждого значения X по регрессивной шкале"},"VAR":{"a":"( argument-list )","d":"Статистическая функция, анализирует диапазон данных и возвращает дисперсию по выборке, содержащей числа"},"VARA":{"a":"( argument-list )","d":"Статистическая функция, анализирует диапазон данных и возвращает дисперсию по выборке"},"VARP":{"a":"( argument-list )","d":"Статистическая функция, анализирует диапазон данных и возвращает дисперсию по всей совокупности значений"},"VARPA":{"a":"( argument-list )","d":"Статистическая функция, анализирует диапазон данных и возвращает дисперсию по всей совокупности значений"},"ACCRINT":{"a":"( issue , first-interest , settlement , rate , [ par ] , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления дохода по ценным бумагам с периодической выплатой процентов"},"ACCRINTM":{"a":"( issue , settlement , rate , [ [ par ] [ , [ basis ] ] ] )","d":"Финансовая функция, используется для вычисления дохода по ценным бумагам, процент по которым уплачивается при наступлении срока погашения"},"AMORDEGRC":{"a":"( cost , date-purchased , first-period , salvage , period , rate [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления величины амортизации имущества по каждому отчетному периоду методом дегрессивной амортизации"},"AMORLINC":{"a":"( cost , date-purchased , first-period , salvage , period , rate [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления величины амортизации имущества по каждому отчетному периоду методом линейной амортизации"},"COUPDAYBS":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления количества дней от начала действия купона до даты покупки ценной бумаги"},"COUPDAYS":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления количества дней в периоде купона, содержащем дату покупки ценной бумаги"},"COUPDAYSNC":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления количества дней от даты покупки ценной бумаги до следующей выплаты по купону"},"COUPNCD":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления даты следующей выплаты по купону после даты покупки ценной бумаги"},"COUPNUM":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления количества выплат процентов между датой покупки ценной бумаги и датой погашения"},"COUPPCD":{"a":"( settlement , maturity , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления даты выплаты процентов, предшествующей дате покупки ценной бумаги"},"CUMIPMT":{"a":"( rate , nper , pv , start-period , end-period , type )","d":"Финансовая функция, используется для вычисления общего размера процентых выплат по инвестиции между двумя периодами времени исходя из указанной процентной ставки и постоянной периодичности платежей"},"CUMPRINC":{"a":"( rate , nper , pv , start-period , end-period , type )","d":"Финансовая функция, используется для вычисления общей суммы, выплачиваемой в погашение основного долга по инвестиции между двумя периодами времени исходя из указанной процентной ставки и постоянной периодичности платежей"},"DB":{"a":"( cost , salvage , life , period [ , [ month ] ] )","d":"Финансовая функция, используется для вычисления величины амортизации имущества за указанный отчетный период методом фиксированного убывающего остатка"},"DDB":{"a":"( cost , salvage , life , period [ , factor ] )","d":"Финансовая функция, используется для вычисления величины амортизации имущества за указанный отчетный период методом двойного убывающего остатка"},"DISC":{"a":"( settlement , maturity , pr , redemption [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления ставки дисконтирования по ценной бумаге"},"DOLLARDE":{"a":"( fractional-dollar , fraction )","d":"Финансовая функция, преобразует цену в долларах, представленную в виде дроби, в цену в долларах, выраженную десятичным числом"},"DOLLARFR":{"a":"( decimal-dollar , fraction )","d":"Финансовая функция, преобразует цену в долларах, представленную десятичным числом, в цену в долларах, выраженную в виде дроби"},"DURATION":{"a":"( settlement , maturity , coupon , yld , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления продолжительности Маколея (взвешенного среднего срока погашения) для ценной бумаги с предполагаемой номинальной стоимостью 100 рублей"},"EFFECT":{"a":"( nominal-rate , npery )","d":"Финансовая функция, используется для вычисления эффективной (фактической) годовой процентной ставки по ценной бумаге исходя из указанной номинальной годовой процентной ставки и количества периодов в году, за которые начисляются сложные проценты"},"FV":{"a":"( rate , nper , pmt [ , [ pv ] [ ,[ type ] ] ] )","d":"Финансовая функция, вычисляет будущую стоимость инвестиции исходя из заданной процентной ставки и постоянной периодичности платежей"},"FVSCHEDULE":{"a":"( principal , schedule )","d":"Финансовая функция, используется для вычисления будущей стоимости инвестиций на основании ряда непостоянных процентных ставок"},"INTRATE":{"a":"( settlement , maturity , pr , redemption [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления ставки доходности по полностью обеспеченной ценной бумаге, проценты по которой уплачиваются только при наступлении срока погашения"},"IPMT":{"a":"( rate , per , nper , pv [ , [ fv ] [ , [ type ] ] ] )","d":"Финансовая функция, используется для вычисления суммы платежей по процентам для инвестиции исходя из указанной процентной ставки и постоянной периодичности платежей"},"IRR":{"a":"( values [ , [ guess ] ] )","d":"Финансовая функция, используется для вычисления внутренней ставки доходности по ряду периодических потоков денежных средств"},"ISPMT":{"a":"( rate , per , nper , pv )","d":"Финансовая функция, используется для вычисления процентов, выплачиваемых за определенный инвестиционный период, исходя из постоянной периодичности платежей"},"MDURATION":{"a":"( settlement , maturity , coupon , yld , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления модифицированной продолжительности Маколея (взвешенного среднего срока погашения) для ценной бумаги с предполагаемой номинальной стоимостью 100 рублей"},"MIRR":{"a":"( values , finance-rate , reinvest-rate )","d":"Финансовая функция, используется для вычисления модифицированной внутренней ставки доходности по ряду периодических денежных потоков"},"NOMINAL":{"a":"( effect-rate , npery )","d":"Финансовая функция, используется для вычисления номинальной годовой процентной ставки по ценной бумаге исходя из указанной эффективной (фактической) годовой процентной ставки и количества периодов в году, за которые начисляются сложные проценты"},"NPER":{"a":"( rate , pmt , pv [ , [ fv ] [ , [ type ] ] ] )","d":"Финансовая функция, вычисляет количество периодов выплаты для инвестиции исходя из заданной процентной ставки и постоянной периодичности платежей"},"NPV":{"a":"( rate , argument-list )","d":"Финансовая функция, вычисляет величину чистой приведенной стоимости инвестиции на основе заданной ставки дисконтирования"},"ODDFPRICE":{"a":"( settlement , maturity , issue , first-coupon , rate , yld , redemption , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления цены за 100 рублей номинальной стоимости ценной бумаги с периодической выплатой процентов в случае нерегулярной продолжительности первого периода выплаты процентов (больше или меньше остальных периодов)"},"ODDFYIELD":{"a":"( settlement , maturity , issue , first-coupon , rate , pr , redemption , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления дохода по ценной бумаге с периодической выплатой процентов в случае нерегулярной продолжительности первого периода выплаты процентов (больше или меньше остальных периодов)"},"ODDLPRICE":{"a":"( settlement , maturity , last-interest , rate , yld , redemption , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления цены за 100 рублей номинальной стоимости ценной бумаги с периодической выплатой процентов в случае нерегулярной продолжительности последнего периода выплаты процентов (больше или меньше остальных периодов)"},"ODDLYIELD":{"a":"( settlement , maturity , last-interest , rate , pr , redemption , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления дохода по ценной бумаге с периодической выплатой процентов в случае нерегулярной продолжительности последнего периода выплаты процентов (больше или меньше остальных периодов)"},"PMT":{"a":"( rate , nper , pv [ , [ fv ] [ ,[ type ] ] ] )","d":"Финансовая функция, вычисляет размер периодического платежа по ссуде исходя из заданной процентной ставки и постоянной периодичности платежей"},"PPMT":{"a":"( rate , per , nper , pv [ , [ fv ] [ , [ type ] ] ] )","d":"Финансовая функция, используется для вычисления размера платежа в счет погашения основного долга по инвестиции исходя из заданной процентной ставки и постоянной периодичности платежей"},"PRICE":{"a":"( settlement , maturity , rate , yld , redemption , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления цены за 100 рублей номинальной стоимости ценной бумаги с периодической выплатой процентов"},"PRICEDISC":{"a":"( settlement , maturity , discount , redemption [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления цены за 100 рублей номинальной стоимости ценной бумаги, на которую сделана скидка"},"PRICEMAT":{"a":"( settlement , maturity , issue , rate , yld [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления цены за 100 рублей номинальной стоимости ценной бумаги, процент по которой уплачивается при наступлении срока погашения"},"PV":{"a":"( rate , nper , pmt [ , [ fv ] [ ,[ type ] ] ] )","d":"Финансовая функция, вычисляет текущую стоимость инвестиции исходя из заданной процентной ставки и постоянной периодичности платежей"},"RATE":{"a":"( nper , pmt , pv [ , [ [ fv ] [ , [ [ type ] [ , [ guess ] ] ] ] ] ] )","d":"Финансовая функция, используется для вычисления размера процентной ставки по инвестиции исходя из постоянной периодичности платежей"},"RECEIVED":{"a":"( settlement , maturity , investment , discount [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления суммы, полученной за полностью обеспеченную ценную бумагу при наступлении срока погашения"},"SLN":{"a":"( cost , salvage , life )","d":"Финансовая функция, используется для вычисления величины амортизации имущества за один отчетный период линейным методом амортизационных отчислений"},"SYD":{"a":"( cost , salvage , life , per )","d":"Финансовая функция, используется для вычисления величины амортизации имущества за указанный отчетный период методом \"суммы годовых цифр\""},"TBILLEQ":{"a":"( settlement , maturity , discount )","d":"Финансовая функция, используется для вычисления эквивалентной доходности по казначейскому векселю"},"TBILLPRICE":{"a":"( settlement , maturity , discount )","d":"Финансовая функция, используется для вычисления цены на 100 рублей номинальной стоимости для казначейского векселя"},"TBILLYIELD":{"a":"( settlement , maturity , pr )","d":"Финансовая функция, используется для вычисления доходности по казначейскому векселю"},"VDB":{"a":"( cost , salvage , life , start-period , end-period [ , [ [ factor ] [ , [ no-switch-flag ] ] ] ] ] )","d":"Финансовая функция, используется для вычисления величины амортизации имущества за указанный отчетный период или его часть методом двойного уменьшения остатка или иным указанным методом"},"XIRR":{"a":"( values , dates [ , [ guess ] ] )","d":"Финансовая функция, используется для вычисления внутренней ставки доходности по ряду нерегулярных денежных потоков"},"XNPV":{"a":"( rate , values , dates )","d":"Финансовая функция, используется для вычисления чистой приведенной стоимости инвестиции исходя из указанной процентной ставки и нерегулярных выплат"},"YIELD":{"a":"( settlement , maturity , rate , pr , redemption , frequency [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления доходности по ценной бумаге с периодической выплатой процентов"},"YIELDDISC":{"a":"( settlement , maturity , pr , redemption , [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления годовой доходности по ценной бумаге, на которую дается скидка"},"YIELDMAT":{"a":"( settlement , maturity , issue , rate , pr [ , [ basis ] ] )","d":"Финансовая функция, используется для вычисления годовой доходности по ценным бумагам, процент по которым уплачивается при наступлении срока погашения"},"ABS":{"a":"( x )","d":"Математическая и тригонометрическая функция, используется для нахождения модуля (абсолютной величины) числа"},"ACOS":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает арккосинус числа"},"ACOSH":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает гиперболический арккосинус числа"},"ACOT":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает главное значение арккотангенса, или обратного котангенса, числа"},"ACOTH":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает гиперболический арккотангенс числа"},"ARABIC":{"a":"( x )","d":"Математическая и тригонометрическая функция, преобразует римское число в арабское"},"ASIN":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает арксинус числа"},"ASINH":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает гиперболический арксинус числа"},"ATAN":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает арктангенс числа"},"ATAN2":{"a":"( x, y )","d":"Математическая и тригонометрическая функция, возвращает арктангенс координат x и y"},"ATANH":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает гиперболический арктангенс числа"},"BASE":{"a":"( number , base [ , min-length ] )","d":"Преобразует число в текстовое представление с указанным основанием системы счисления"},"CEILING":{"a":"( x, significance )","d":"Математическая и тригонометрическая функция, используется, чтобы округлить число в большую сторону до ближайшего числа, кратного заданной значимости"},"CEILING.MATH":{"a":"( x [ , [ significance ] [ , [ mode ] ] )","d":"Математическая и тригонометрическая функция, округляет число до ближайшего целого или до ближайшего кратного заданной значимости"},"CEILING.PRECISE":{"a":"( x [ , significance ] )","d":"Математическая и тригонометрическая функция, округляет число вверх до ближайшего целого или до ближайшего кратного указанному значению"},"COMBIN":{"a":"( number , number-chosen )","d":"Математическая и тригонометрическая функция, возвращает количество комбинаций для заданного числа элементов"},"COMBINA":{"a":"( number , number-chosen )","d":"Математическая и тригонометрическая функция, возвращает количество комбинаций (с повторениями) для заданного числа элементов"},"COS":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает косинус угла"},"COSH":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает гиперболический косинус числа"},"COT":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает значение котангенса заданного угла в радианах"},"COTH":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает гиперболический котангенс числа"},"CSC":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает косеканс угла."},"CSCH":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает гиперболический косеканс угла"},"DECIMAL":{"a":"( text , base )","d":"Преобразует текстовое представление числа с указанным основанием в десятичное число"},"DEGREES":{"a":"( angle )","d":"Математическая и тригонометрическая функция, преобразует радианы в градусы"},"EVEN":{"a":"( x )","d":"Математическая и тригонометрическая функция, используется, чтобы округлить число до ближайшего четного целого числа"},"EXP":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает значение константы e, возведенной в заданную степень. Константа e равна 2,71828182845904"},"FACT":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает факториал числа"},"FACTDOUBLE":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает двойной факториал числа"},"FLOOR":{"a":"( x, significance )","d":"Математическая и тригонометрическая функция, используется, чтобы округлить число в меньшую сторону до ближайшего числа, кратного заданной значимости"},"FLOOR.PRECISE":{"a":"( x, significance )","d":"Математическая и тригонометрическая функция, возвращает число, округленное с недостатком до ближайшего целого или до ближайшего кратного разрядности"},"FLOOR.MATH":{"a":"( x, significance )","d":"Математическая и тригонометрическая функция, округляет число в меньшую сторону до ближайшего целого или до ближайшего кратного указанному значению"},"GCD":{"a":"( argument-list )","d":"Математическая и тригонометрическая функция, возвращает наибольший общий делитель для двух и более чисел"},"INT":{"a":"( x )","d":"Математическая и тригонометрическая функция, анализирует и возвращает целую часть заданного числа"},"ISO.CEILING":{"a":"( number [ , significance ] )","d":"Округляет число вверх до ближайшего целого или до ближайшего кратного указанному значению вне зависимости от его знака; если в качестве точности указан нуль, возвращается нуль"},"LCM":{"a":"( argument-list )","d":"Математическая и тригонометрическая функция, возвращает наименьшее общее кратное для одного или более чисел"},"LN":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает натуральный логарифм числа"},"LOG":{"a":"( x [ , base ] )","d":"Математическая и тригонометрическая функция, возвращает логарифм числа по заданному основанию"},"LOG10":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает логарифм числа по основанию 10"},"MDETERM":{"a":"( array )","d":"Математическая и тригонометрическая функция, возвращает определитель матрицы (матрица хранится в массиве)"},"MINVERSE":{"a":"( array )","d":"Математическая и тригонометрическая функция, возвращает обратную матрицу для заданной матрицы и отображает первое значение возвращаемого массива чисел"},"MMULT":{"a":"( array1, array2 )","d":"Математическая и тригонометрическая функция, возвращает матричное произведение двух массивов и отображает первое значение из возвращаемого массива чисел"},"MOD":{"a":"( x, y )","d":"Математическая и тригонометрическая функция, возвращает остаток от деления числа на заданный делитель"},"MROUND":{"a":"( x, multiple )","d":"Математическая и тригонометрическая функция, используется, чтобы округлить число до кратного заданной значимости"},"MULTINOMIAL":{"a":"( argument-list )","d":"Математическая и тригонометрическая функция, возвращает отношение факториала суммы значений к произведению факториалов"},"ODD":{"a":"( x )","d":"Математическая и тригонометрическая функция, используется, чтобы округлить число до ближайшего нечетного целого числа"},"PI":{"a":"()","d":"Математическая и тригонометрическая функция, возвращает математическую константу пи, равную 3.14159265358979. Функция не требует аргумента"},"POWER":{"a":"( x, y )","d":"Математическая и тригонометрическая функция, возвращает результат возведения числа в заданную степень"},"PRODUCT":{"a":"( argument-list )","d":"Математическая и тригонометрическая функция, перемножает все числа в заданном диапазоне ячеек и возвращает произведение"},"QUOTIENT":{"a":"( dividend , divisor )","d":"Математическая и тригонометрическая функция, возвращает целую часть результата деления с остатком"},"RADIANS":{"a":"( angle )","d":"Математическая и тригонометрическая функция, преобразует градусы в радианы"},"RAND":{"a":"()","d":"Математическая и тригонометрическая функция, возвращает случайное число, которое больше или равно 0 и меньше 1. Функция не требует аргумента"},"RANDBETWEEN":{"a":"( lower-bound , upper-bound )","d":"Математическая и тригонометрическая функция, возвращает случайное число, большее или равное значению аргумента lower-bound (нижняя граница) и меньшее или равное значению аргумента upper-bound (верхняя граница)"},"ROMAN":{"a":"( number, form )","d":"Математическая и тригонометрическая функция, преобразует число в римское"},"ROUND":{"a":"( x , number-digits )","d":"Математическая и тригонометрическая функция, округляет число до заданного количества десятичных разрядов"},"ROUNDDOWN":{"a":"( x , number-digits )","d":"Математическая и тригонометрическая функция, округляет число в меньшую сторону до заданного количества десятичных разрядов"},"ROUNDUP":{"a":"( x , number-digits )","d":"Математическая и тригонометрическая функция, округляет число в большую сторону до заданного количества десятичных разрядов"},"SEC":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает секанс угла"},"SECH":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает гиперболический секанс угла"},"SERIESSUM":{"a":"( input-value , initial-power , step , coefficients )","d":"Математическая и тригонометрическая функция, возвращает сумму степенного ряда"},"SIGN":{"a":"( x )","d":"Математическая и тригонометрическая функция, определяет знак числа. Если число положительное, функция возвращает значение 1. Если число отрицательное, функция возвращает значение -1. Если число равно 0, функция возвращает значение 0"},"SIN":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает синус угла"},"SINH":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает гиперболический синус числа"},"SQRT":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает квадратный корень числа"},"SQRTPI":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает квадратный корень от результата умножения константы пи (3.14159265358979) на заданное число"},"SUBTOTAL":{"a":"( function-number , argument-list )","d":"Возвращает промежуточный итог в список или базу данных"},"SUM":{"a":"( argument-list )","d":"Математическая и тригонометрическая функция, возвращает результат сложения всех чисел в выбранном диапазоне ячеек"},"SUMIF":{"a":"( cell-range, selection-criteria [ , sum-range ] )","d":"Математическая и тригонометрическая функция, суммирует все числа в выбранном диапазоне ячеек в соответствии с заданным условием и возвращает результат"},"SUMIFS":{"a":"( sum-range, criteria-range1, criteria1, [ criteria-range2, criteria2 ], ... )","d":"Математическая и тригонометрическая функция, суммирует все числа в выбранном диапазоне ячеек в соответствии с несколькими условиями и возвращает результат"},"SUMPRODUCT":{"a":"( argument-list )","d":"Математическая и тригонометрическая функция, перемножает соответствующие элементы заданных диапазонов ячеек или массивов и возвращает сумму произведений"},"SUMSQ":{"a":"( argument-list )","d":"Математическая и тригонометрическая функция, вычисляет сумму квадратов чисел и возвращает результат"},"SUMX2MY2":{"a":"( array-1 , array-2 )","d":"Математическая и тригонометрическая функция, вычисляет сумму разностей квадратов соответствующих элементов в двух массивах"},"SUMX2PY2":{"a":"( array-1 , array-2 )","d":"Математическая и тригонометрическая функция, вычисляет суммы квадратов соответствующих элементов в двух массивах и возвращает сумму полученных результатов"},"SUMXMY2":{"a":"( array-1 , array-2 )","d":"Математическая и тригонометрическая функция, возвращает сумму квадратов разностей соответствующих элементов в двух массивах"},"TAN":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает тангенс угла"},"TANH":{"a":"( x )","d":"Математическая и тригонометрическая функция, возвращает гиперболический тангенс числа"},"TRUNC":{"a":"( x [ , number-digits ] )","d":"Математическая и тригонометрическая функция, возвращает число, усеченное до заданного количества десятичных разрядов"},"ADDRESS":{"a":"( row-number , col-number [ , [ ref-type ] [ , [ A1-ref-style-flag ] [ , sheet-name ] ] ] )","d":"Поисковая функция, возвращает адрес ячейки, представленный в виде текста"},"CHOOSE":{"a":"( index , argument-list )","d":"Поисковая функция, возвращает значение из списка значений по заданному индексу (позиции)"},"COLUMN":{"a":"( [ reference ] )","d":"Поисковая функция, возвращает номер столбца ячейки"},"COLUMNS":{"a":"( array )","d":"Поисковая функция, возвращает количество столбцов в ссылке на ячейки"},"HLOOKUP":{"a":"( lookup-value , table-array , row-index-num [ , [ range-lookup-flag ] ] )","d":"Поисковая функция, используется для выполнения горизонтального поиска значения в верхней строке таблицы или массива и возвращает значение, которое находится в том же самом столбце в строке с заданным номером"},"INDEX":{"a":"( array , [ row-number ] [ , [ column-number ] ] ) INDEX( reference , [ row-number ] [ , [ column-number ] [ , [ area-number ] ] ] )","d":"Поисковая функция, возвращает значение в диапазоне ячеек на основании заданных номера строки и номера столбца. Существуют две формы функции INDEX"},"INDIRECT":{"a":"( ref-text [ , [ A1-ref-style-flag ] ] )","d":"Поисковая функция, возвращает ссылку на ячейку, указанную с помощью текстовой строки"},"LOOKUP":{"a":"( lookup-value , lookup-vector , result-vector )","d":"Поисковая функция, возвращает значение из выбранного диапазона (строки или столбца с данными, отсортированными в порядке возрастания)"},"MATCH":{"a":"( lookup-value , lookup-array [ , [ match-type ]] )","d":"Поисковая функция, возвращает относительное положение заданного элемента в диапазоне ячеек"},"OFFSET":{"a":"( reference , rows , cols [ , [ height ] [ , [ width ] ] ] )","d":"Поисковая функция, возвращает ссылку на ячейку, отстоящую от заданной ячейки (или верхней левой ячейки в диапазоне ячеек) на определенное число строк и столбцов"},"ROW":{"a":"( [ reference ] )","d":"Поисковая функция, возвращает номер строки для ссылки на ячейку"},"ROWS":{"a":"( array )","d":"Поисковая функция, возвращает количество строк в ссылке на ячейки"},"TRANSPOSE":{"a":"( array )","d":"Поисковая функция, возвращает первый элемент массива"},"VLOOKUP":{"a":"( lookup-value , table-array , col-index-num [ , [ range-lookup-flag ] ] )","d":"Поисковая функция, используется для выполнения вертикального поиска значения в крайнем левом столбце таблицы или массива и возвращает значение, которое находится в той же самой строке в столбце с заданным номером"},"ERROR.TYPE":{"a":"(value)","d":"Информационная функция, возвращает числовое представление одной из существующих ошибок"},"ISBLANK":{"a":"(value)","d":"Информационная функция, проверяет, является ли ячейка пустой. Если ячейка пуста, функция возвращает значение TRUE (ИСТИНА), в противном случае функция возвращает значение FALSE (ЛОЖЬ)"},"ISERR":{"a":"(value)","d":"Информационная функция, используется для проверки на наличие значения ошибки. Если ячейка содержит значение ошибки (кроме #N/A), функция возвращает значение TRUE (ИСТИНА), в противном случае функция возвращает значение FALSE (ЛОЖЬ)"},"ISERROR":{"a":"(value)","d":"Информационная функция, используется для проверки на наличие значения ошибки. Если ячейка содержит одно из следующих значений ошибки: #N/A, #VALUE!, #REF!, #DIV/0!, #NUM!, #NAME? или #NULL, функция возвращает значение TRUE (ИСТИНА), в противном случае функция возвращает значение FALSE (ЛОЖЬ)"},"ISEVEN":{"a":"(number)","d":"Информационная функция, используется для проверки на наличие четного числа. Если ячейка содержит четное число, функция возвращает значение TRUE. Если число является нечетным, она возвращает значение FALSE"},"ISLOGICAL":{"a":"(value)","d":"Информационная функция, используется для проверки на наличие логического значения (TRUE (ИСТИНА) или FALSE (ЛОЖЬ)). Если ячейка содержит логическое значение, функция возвращает значение TRUE (ИСТИНА), в противном случае функция возвращает значение FALSE (ЛОЖЬ)"},"ISNA":{"a":"(value)","d":"Информационная функция, используется для проверки на наличие ошибки #N/A. Если ячейка содержит значение ошибки #N/A, функция возвращает значение TRUE (ИСТИНА), в противном случае функция возвращает значение FALSE (ЛОЖЬ)"},"ISNONTEXT":{"a":"(value)","d":"Информационная функция, используется для проверки на наличие значения, которое не является текстом. Если ячейка не содержит текстового значения, функция возвращает значение TRUE (ИСТИНА), в противном случае функция возвращает значение FALSE (ЛОЖЬ)"},"ISNUMBER":{"a":"(value)","d":"Информационная функция, используется для проверки на наличие числового значения. Если ячейка содержит числовое значение, функция возвращает значение TRUE (ИСТИНА), в противном случае функция возвращает значение FALSE (ЛОЖЬ)"},"ISODD":{"a":"(number)","d":"Информационная функция, используется для проверки на наличие нечетного числа. Если ячейка содержит нечетное число, функция возвращает значение TRUE. Если число является четным, она возвращает значение FALSE"},"ISREF":{"a":"(value)","d":"Информационная функция, используется для проверки, является ли значение допустимой ссылкой на другую ячейку"},"ISTEXT":{"a":"(value)","d":"Информационная функция, используется для проверки на наличие текстового значения. Если ячейка содержит текстовое значение, функция возвращает значение TRUE (ИСТИНА), в противном случае функция возвращает значение FALSE (ЛОЖЬ)"},"N":{"a":"(value)","d":"Информационная функция, преобразует значение в число"},"NA":{"a":"()","d":"Информационная функция, возвращает значение ошибки #N/A. Эта функция не требует аргумента"},"TYPE":{"a":"(value)","d":"Информационная функция, используется для определения типа результирующего или отображаемого значения"},"AND":{"a":"(logical1, logical2, ...)","d":"Логическая функция, используется для проверки, является ли введенное логическое значение TRUE (истинным) или FALSE (ложным). Функция возвращает значение TRUE (ИСТИНА), если все аргументы имеют значение TRUE (ИСТИНА)"},"FALSE":{"a":"()","d":"Логическая функция, возвращает значение FALSE (ЛОЖЬ) и не требует аргумента"},"IF":{"a":"(logical_test, value_if_true, value_if_false)","d":"Логическая функция, используется для проверки логического выражения и возвращает одно значение, если проверяемое условие имеет значение TRUE (ИСТИНА), и другое, если оно имеет значение FALSE (ЛОЖЬ)"},"IFERROR":{"a":"(value, value_if_error)","d":"Логическая функция, используется для проверки формулы на наличие ошибок в первом аргументе. Функция возвращает результат формулы, если ошибки нет, или определенное значение, если она есть"},"NOT":{"a":"(logical)","d":"Логическая функция, используется для проверки, является ли введенное логическое значение TRUE (истинным) или FALSE (ложным). Функция возвращает значение TRUE (ИСТИНА), если аргумент имеет значение FALSE (ЛОЖЬ), и FALSE (ЛОЖЬ), если аргумент имеет значение TRUE (ИСТИНА)"},"OR":{"a":"(logical1, logical2, ...)","d":"Логическая функция, используется для проверки, является ли введенное логическое значение TRUE (истинным) или FALSE (ложным). Функция возвращает значение FALSE (ЛОЖЬ), если все аргументы имеют значение FALSE (ЛОЖЬ)"},"TRUE":{"a":"()","d":"Логическая функция, возвращает значение TRUE (ИСТИНА) и не требует аргумента"}} \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/resources/help/en/Functions/and.htm b/apps/spreadsheeteditor/main/resources/help/en/Functions/and.htm index d00b86ac3..c7752e2fb 100644 --- a/apps/spreadsheeteditor/main/resources/help/en/Functions/and.htm +++ b/apps/spreadsheeteditor/main/resources/help/en/Functions/and.htm @@ -23,7 +23,7 @@
  • select the Logical function group from the list,
  • click the AND function,
  • enter the required arguments separating them by commas, -

    Note: you can enter up to 265 logical values.

    +

    Note: you can enter up to 255 logical values.

  • press the Enter button.
  • diff --git a/apps/spreadsheeteditor/main/resources/help/en/Functions/average.htm b/apps/spreadsheeteditor/main/resources/help/en/Functions/average.htm index 7f401ab28..534813aa0 100644 --- a/apps/spreadsheeteditor/main/resources/help/en/Functions/average.htm +++ b/apps/spreadsheeteditor/main/resources/help/en/Functions/average.htm @@ -12,7 +12,7 @@

    The AVERAGE function is one of the statistical functions. It is used to analyze the range of data and find the average value.

    The AVERAGE function syntax is:

    AVERAGE(argument-list)

    -

    where argument-list is up to 30 numerical values entered manually or included into the cells you make reference to.

    +

    where argument-list is up to 255 numerical values entered manually or included into the cells you make reference to.

    To apply the AVERAGE function,

    1. select the cell where you wish to display the result,
    2. diff --git a/apps/spreadsheeteditor/main/resources/help/en/Functions/averagea.htm b/apps/spreadsheeteditor/main/resources/help/en/Functions/averagea.htm index 6779bd20d..938fca4f1 100644 --- a/apps/spreadsheeteditor/main/resources/help/en/Functions/averagea.htm +++ b/apps/spreadsheeteditor/main/resources/help/en/Functions/averagea.htm @@ -12,7 +12,7 @@

      The AVERAGEA function is one of the statistical functions. It is used to analyze the range of data including text and logical values and find the average value. The AVERAGEA function treats text and FALSE as a value of 0 and TRUE as a value of 1.

      The AVERAGEA function syntax is:

      AVERAGEA(argument-list)

      -

      where argumenti-list is up to 30 values entered manually or included into the cells you make reference to.

      +

      where argumenti-list is up to 255 values entered manually or included into the cells you make reference to.

      To apply the AVERAGEA function,

      1. select the cell where you wish to display the result,
      2. diff --git a/apps/spreadsheeteditor/main/resources/help/en/Functions/averageifs.htm b/apps/spreadsheeteditor/main/resources/help/en/Functions/averageifs.htm new file mode 100644 index 000000000..5402e9f45 --- /dev/null +++ b/apps/spreadsheeteditor/main/resources/help/en/Functions/averageifs.htm @@ -0,0 +1,37 @@ + + + + AVERAGEIFS Function + + + + + +
        +

        AVERAGEIFS Function

        +

        The AVERAGEIFS function is one of the statistical functions. It is used to analyze the range of data and find the average value of all numbers in a range of cells, based on multiple criteria.

        +

        The AVERAGEIFS function syntax is:

        +

        AVERAGEIFS(average-range, criteria-range-1, criteria-1, [criteria-range-2, criteria-2], ...)

        +

        where

        +

        average-range is the selected range of cells you need to find the average in. It is a required argument.

        +

        criteria-range-1 is the first selected range of cells to apply the criteria-1 to. It is a required argument.

        +

        criteria-1 is the first condition that must be met. It is applied to the criteria-range-1 and used to determine the cells in the average-range to average. It can be a value entered manually or included into the cell you make reference to. It is a required argument.

        +

        criteria-range-2, criteria-2, ... are additional ranges of cells and their corresponding criteria. These arguments are optional. You can add up to 127 ranges and corresponding criteria.

        +

        Note: you can use wildcard characters when specifying criteria. The question mark "?" can replace any single character and the asterisk "*" can be used instead of any number of characters.

        +

        To apply the AVERAGEIFS function,

        +
          +
        1. select the cell where you wish to display the result,
        2. +
        3. click the Insert Function Insert Function icon icon situated at the top toolbar, +
          or right-click within a selected cell and select the Insert Function option from the menu, +
          or click the Function icon icon situated at the formula bar, +
        4. +
        5. select the Statistical function group from the list,
        6. +
        7. click the AVERAGEIFS function,
        8. +
        9. enter the required arguments separating them by commas,
        10. +
        11. press the Enter button.
        12. +
        +

        The result will be displayed in the selected cell.

        +

        AVERAGEIFS Function

        +
        + + \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/resources/help/en/Functions/countifs.htm b/apps/spreadsheeteditor/main/resources/help/en/Functions/countifs.htm new file mode 100644 index 000000000..ff304e1d9 --- /dev/null +++ b/apps/spreadsheeteditor/main/resources/help/en/Functions/countifs.htm @@ -0,0 +1,36 @@ + + + + COUNTIFS Function + + + + + +
        +

        COUNTIFS Function

        +

        The COUNTIFS function is one of the statistical functions. It is used to count the number of the selected cells based on multiple criteria.

        +

        The COUNTIFS function syntax is:

        +

        COUNTIFS(criteria-range-1, criteria-1, [criteria-range-2, criteria-2], ...)

        +

        where

        +

        criteria-range-1 is the first selected range of cells to apply the criteria-1 to. It is a required argument.

        +

        criteria-1 is the first condition that must be met. It is applied to the criteria-range-1 and used to determine the cells in the criteria-range-1 to count. It can be a value entered manually or included into the cell you make reference to. It is a required argument.

        +

        criteria-range-2, criteria-2, ... are additional ranges of cells and their corresponding criteria. These arguments are optional. You can add up to 127 ranges and corresponding criteria.

        +

        Note: you can use wildcard characters when specifying criteria. The question mark "?" can replace any single character and the asterisk "*" can be used instead of any number of characters. If you want to find a question mark or asterisk, type a tilde (~) before the character.

        +

        To apply the COUNTIFS function,

        +
          +
        1. select the cell where you wish to display the result,
        2. +
        3. click the Insert Function Insert Function icon icon situated at the top toolbar, +
          or right-click within a selected cell and select the Insert Function option from the menu, +
          or click the Function icon icon situated at the formula bar, +
        4. +
        5. select the Statistical function group from the list,
        6. +
        7. click the COUNTIFS function,
        8. +
        9. enter the required arguments separating them by commas,
        10. +
        11. press the Enter button.
        12. +
        +

        The result will be displayed in the selected cell.

        +

        COUNTIFS Function

        +
        + + \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/resources/help/en/Functions/or.htm b/apps/spreadsheeteditor/main/resources/help/en/Functions/or.htm index a40c4f9f4..4a7ba7996 100644 --- a/apps/spreadsheeteditor/main/resources/help/en/Functions/or.htm +++ b/apps/spreadsheeteditor/main/resources/help/en/Functions/or.htm @@ -23,7 +23,7 @@
      3. select the Logical function group from the list,
      4. click the OR function,
      5. enter the required arguments separating them by commas, -

        Note: you can enter up to 265 logical values.

        +

        Note: you can enter up to 255 logical values.

      6. press the Enter button.
      diff --git a/apps/spreadsheeteditor/main/resources/help/en/Functions/sumifs.htm b/apps/spreadsheeteditor/main/resources/help/en/Functions/sumifs.htm index 945c221a1..07d0aafd2 100644 --- a/apps/spreadsheeteditor/main/resources/help/en/Functions/sumifs.htm +++ b/apps/spreadsheeteditor/main/resources/help/en/Functions/sumifs.htm @@ -15,7 +15,7 @@

      where

      sum-range is the range of cells to sum.

      criteria-range1 is the first selected range of cells to apply the criteria1 to.

      -

      criteria1 is the first condition that must be met. It is applied to the criteria-range1 and used to determine the cells in the sum-range to sum, a value entered manually or included into the cell you make reference to.

      +

      criteria1 is the first condition that must be met. It is applied to the criteria-range1 and used to determine the cells in the sum-range to sum. It can be a value entered manually or included into the cell you make reference to.

      criteria-range2, criteria2, ... are additional ranges of cells and their corresponding criteria. These arguments are optional.

      Note: you can use wildcard characters when specifying criteria. The question mark "?" can replace any single character and the asterisk "*" can be used instead of any number of characters.

      To apply the SUMIFS function,

      diff --git a/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/AddBorders.htm b/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/AddBorders.htm index 54e31c11d..674967e05 100644 --- a/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/AddBorders.htm +++ b/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/AddBorders.htm @@ -15,8 +15,13 @@

      Note: you can also select multiple non-adjacent cells or cell ranges holding down the Ctrl key while selecting cells/ranges with the mouse.

    3. click the Add Borders Add Borders icon icon situated at the top toolbar,
    4. -
    5. select the border style you wish to apply: Outside Borders Outside Borders icon, All Borders All Borders icon, Top Borders Top Borders icon, Bottom Borders Bottom Borders icon, Left Borders Left Borders icon, Right Borders Right Borders icon, No Borders No Borders icon, Inside Borders Inside Borders icon, Inside Vertical Borders Inside Vertical Borders icon, Inside Horizontal Borders Inside Horisontal Borders icon, Diagonal Up Border Diagonal Up Border icon, Diagonal Down Border Diagonal Down Border icon;
    6. -
    7. set the Border Width Border Width icon and select a Border Color Border Color icon clicking the corresponding option and selecting the color you need from the palette.
    8. +
    9. select the border style you wish to apply: +
        +
      1. open the Border Style submenu and select one of the available options,
      2. +
      3. open the Border Color Border Color icon submenu and select the color you need from the palette,
      4. +
      5. select one of the available border templates: Outside Borders Outside Borders icon, All Borders All Borders icon, Top Borders Top Borders icon, Bottom Borders Bottom Borders icon, Left Borders Left Borders icon, Right Borders Right Borders icon, No Borders No Borders icon, Inside Borders Inside Borders icon, Inside Vertical Borders Inside Vertical Borders icon, Inside Horizontal Borders Inside Horisontal Borders icon, Diagonal Up Border Diagonal Up Border icon, Diagonal Down Border Diagonal Down Border icon.
      6. +
      +
    diff --git a/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/ChangeNumberFormat.htm b/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/ChangeNumberFormat.htm index db250bc19..98b360056 100644 --- a/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/ChangeNumberFormat.htm +++ b/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/ChangeNumberFormat.htm @@ -9,6 +9,7 @@

    Change number format

    +

    Apply a number format

    You can easily change the number format, i.e. the way the numbers you enter appear in your spreadsheet. To do that,

    1. select a cell, a range of cells with the mouse or the whole worksheet by pressing the Ctrl+A key combination, @@ -18,20 +19,21 @@
      • General - is used to display the data you enter as plain numbers in the most compact way without any additional signs,
      • Number - is used to display the numbers with 0-30 digits after the decimal point where a thousand separator is added between each group of three digits before the decimal point,
      • -
      • Integer - is used to display the numbers as an integer,
      • +
      • Scientific (exponential) - is used to keep short the numbers converting in a string of type d.dddE+ddd or d.dddE-ddd where each d is a digit 0 to 9,
      • -
      • Accounting - is used to display monetary values with one of the following currency symbols: $ Dollar, Euro, £ Pound, p. Rouble, ¥ Yen, and two decimal places. Unlike the Currency format, the Accounting format aligns currency symbols by the left side of the cell, represents zero values as dashes and displays negative values in parentheses. +
      • Accounting - is used to display monetary values with the default currency symbol and two decimal places. To apply another currency symbol or number of decimal places, follow the instructions below. Unlike the Currency format, the Accounting format aligns currency symbols by the left side of the cell, represents zero values as dashes and displays negative values in parentheses.

        Accounting and Currency number formats

        -

        Note: to quickly apply the Accounting format to the selected data, you can also click the Accounting Style Accounting Style icon icon at the top toolbar and select the necessary currency symbol.

        +

        Note: to quickly apply the Accounting format to the selected data, you can also click the Accounting Style Accounting Style icon icon at the top toolbar and select the necessary currency symbol: one of the following currency symbols: $ Dollar, Euro, £ Pound, Rouble, ¥ Yen.

      • -
      • Currency - is used to display monetary values with one of the following currency symbols: $ Dollar, Euro, £ Pound, p. Rouble, ¥ Yen, and two decimal places. Unlike the Accounting format, the Currency format places a currency symbol directly before the first digit and displays negative values with the negative sign (-).
      • -
      • Date - is used to display dates. You can select one of the following date formats: MM-dd-yy, MM-dd-yyyy, dd-MM-yy, dd-MM-yyyy, dd-MMM-yyyy, dd-MMM, MMM-yy,
      • -
      • Time - is used to display time. You can select one of the following time formats: HH:mm, HH:MM:ss, hh:mm tt, hh:mm:ss tt, [h]:mm:ss,
      • +
      • Currency - is used to display monetary values with the default currency symbol and two decimal places. To apply another currency symbol or number of decimal places, follow the instructions below. Unlike the Accounting format, the Currency format places a currency symbol directly before the first digit and displays negative values with the negative sign (-).
      • +
      • Date - is used to display dates,
      • +
      • Time - is used to display time,
      • Persentage - is used to display the data as a percentage accompanied by a percent sign %,

        Note: to quickly apply the percent style to your data you can also use the Percent Style Percent Style icon icon at the top toolbar.

      • Fraction - is used to display the numbers as common fractions rather than decimals.
      • Text - is used to display the numeric values as a plain text with as much precision as available.
      • +
      • More formats - is used to customize the already applied number formats specifying additional parameters (see the description below).
    2. change the number of decimal places, if needed: @@ -41,7 +43,25 @@
    - +

    Customize the number format

    +

    You can customize the applied number format in the following way:

    +
      +
    1. select the cells you want to customize the number format for,
    2. +
    3. click the General Format General Format button button at the top toolbar,
    4. +
    5. select the More formats option,
    6. +
    7. in the Number Format window that opens, adjust the available parameters. The options differ depending on the number format that is applied to the selected cells. You can use the Category list to change the number format. +

      Number Format window

      +
        +
      • for the Number format, you can set the number of Decimal points, specify if you want to Use 1000 separator or not and choose one of the available Formats for displaying negative values.
      • +
      • for the Scientific and Persentage formats, you can set the number of Decimal points.
      • +
      • for the Accounting and Currency formats, you can set the number of Decimal points, choose one of the available currency Symbols and one of the available Formats for displaying negative values.
      • +
      • for the Date format, you can select one of the available date formats: 4/15, 4/15/06, 04/15/06, 4/15/2006, 4/15/06 0:00, 4/15/06 12:00 AM, A, April 15 2006, 15-Apr, 15-Apr-06, Apr-06, April-06, A-06, 15 Apr 2006, 15/Apr, 15/Apr/06, Apr/06, April/06, A/06, 15/Apr/2006, 15 Apr, 15 Apr 06, Apr 06, April 06, A 06, 15 Apr 2006.
      • +
      • for the Time format, you can select one of the available time formats: 12:48:58 PM, 12:48, 12:48 PM, 12:48:58, 48:57.6, 36:48:58.
      • +
      • for the Fraction format, you can select one of the available formats: Up to one digit (1/3), Up to two digits (12/25), Up to three digits (131/135), As halves (1/2), As fourths (2/4), As eighths (4/8), As sixteenths (8/16), As tenths (5/10) , As hundredths (50/100).
      • +
      +
    8. +
    9. click the OK button to apply the changes.
    10. +
    \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/CopyPasteData.htm b/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/CopyPasteData.htm index 8cdf0323d..79f39b73e 100644 --- a/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/CopyPasteData.htm +++ b/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/CopyPasteData.htm @@ -14,7 +14,8 @@

    To copy or paste data from/into another spreadsheet or some other program use the following key combinations:

    Note: instead of cutting and pasting data within the same worksheet you can select the necessary cell/range of cells, hover the mouse cursor over the selection border so that it turns into the Arrow icon icon and drag and drop the selection to the necessary position.

    -

    Use Auto Fill option

    +

    Use the Paste Special feature

    +

    Once the copied data is pasted, the Paste Special Paste Special button appears next to the lower right corner of the inserted cell/cell range. Click this button to select the necessary paste option.

    +

    When pasting a cell/cell range with formatted data, the following options are available:

    + +

    Paste options

    +

    When pasting the contents of a single cell or some text within autoshapes, the following options are available:

    + +

    Use the Auto Fill option

    To quickly fill multiple cells with the same data use the Auto Fill option:

    1. select a cell/range of cells containing the necessary data,
    2. diff --git a/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/InsertAutoshapes.htm b/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/InsertAutoshapes.htm index 22ba6f04d..34b018132 100644 --- a/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/InsertAutoshapes.htm +++ b/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/InsertAutoshapes.htm @@ -113,6 +113,8 @@

      Shape - Advanced Settings

      The Text Padding tab allows to change the autoshape Top, Bottom, Left and Right internal margins (i.e. the distance between the text within the shape and the autoshape borders).

      Note: this tab is only available if text is added within the autoshape, otherwise the tab is disabled.

      +

      Shape - Advanced Settings

      +

      The Alternative Text tab allows to specify a Title and Description which will be read to the people with vision or cognitive impairments to help them better understand what information there is in the shape.


      Insert and format text within the autoshape

      To insert a text into the autoshape select the shape with the mouse and start typing your text. The text you add in this way becomes a part of the autoshape (when you move or rotate the shape, the text moves or rotates with it).

      diff --git a/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/InsertChart.htm b/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/InsertChart.htm index 146fd588e..67968db5b 100644 --- a/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/InsertChart.htm +++ b/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/InsertChart.htm @@ -13,19 +13,39 @@

      Insert a chart

      To insert a chart into the speadsheet,

        -
      1. select the cell range that contain the data you wish to use for the chart,
      2. -
      3. click the Insert Chart Insert Chart icon icon at the top toolbar,
      4. -
      5. after that a window will appear where you can specify the chart settings: - -

        The Type & Data tab allows you to select the chart type as well as the data you wish to use to create a chart.

        +
      6. Select the cell range that contain the data you wish to use for the chart,
      7. +
      8. Click the Insert Chart Insert Chart icon icon at the top toolbar,
      9. +
      10. + Select a chart Type you wish to insert: Column, Line, Pie, Bar, Area, XY (Scatter), or Stock. +

        Note: for Column, Line, Pie, or Bar charts, a 3D format is also available.

        +
      11. +
      +

      After that the chart will be added to the worksheet.

      +

      Adjust the chart settings

      +

      Now you can change the inserted chart settings. To change the chart type,

      +
        +
      1. select the chart with the mouse,
      2. +
      3. + click the Chart Settings Chart Settings icon icon at the right sidebar, +

        Chart Settings Right-Side Panel window

        +
      4. +
      5. open the Type drop-down list and select the type you need,
      6. +
      7. open the Style drop-down list below and select the style which suits you best.
      8. +
      +

      The selected chart type and style will be changed. If you need to edit the data used to create the chart,

      +
        +
      1. click the Show advanced settings link situated at the right-side panel, or choose the Chart Advanced Settings option from the right-click menu, or just double-click the chart,
      2. +
      3. in the opened Chart - Advanced Settings window make all the necessary changes,
      4. +
      5. click the OK button to apply the changes and close the window.
      6. +
      +

      The description of the chart settings that can be edited using the Chart - Advanced Settings window you can find below.

      +

      The Type & Data tab allows you to change the chart type as well as the data you wish to use to create a chart.

        -
      • Select a chart Type you wish to insert: Column, Line, Pie, Bar, Area, XY (Scatter), or Stock. -

        Note: for Column, Line, Pie, or Bar charts, a 3D format is also available.

        -
      • +
      • Change the chart Type selecting one of the available options: Column, Line, Pie, Bar, Area, XY (Scatter), or Stock.
      • Check the selected Data Range and modify it, if necessary, clicking the Select Data button and entering the desired data range in the following format: Sheet1!A1:B4.
      • Choose the way to arrange the data. You can either select the Data series to be used on the X axis: in rows or in columns.
      -

      Insert Chart window

      +

      Chart - Advanced Settings

      The Layout tab allows you to change the layout of chart elements.

        @@ -89,7 +109,7 @@
      -

      Insert Chart window

      +

      Chart - Advanced Settings

      Note: the Vertical/Horizontal Axis tabs will be disabled for Pie charts since charts of this type have no axes.

      The Vertical Axis tab allows you to change the parameters of the vertical axis also referred to as the values axis or y-axis which displays numeric values. Note that the vertical axis will be the category axis which displays text labels for the Bar charts, therefore in this case the Vertical Axis tab options will correspond to the ones described in the next section. For the XY (Scatter) charts, both axes are value axes.

      @@ -123,7 +143,7 @@ -

      Insert Chart window

      +

      Chart - Advanced Settings

      The Horizontal Axis tab allows you to change the parameters of the horizontal axis also referred to as the categories axis or x-axis which displays text labels. Note that the horizontal axis will be the value axis which displays numeric values for the Bar charts, therefore in this case the Horizontal Axis tab options will correspond to the ones described in the previous section. For the XY (Scatter) charts, both axes are value axes.

        @@ -151,35 +171,20 @@
      -

      Insert Chart window

      - - -
    3. once the chart is added you can change its size and position.
    4. -
    +

    Chart - Advanced Settings

    +

    The Alternative Text tab allows to specify a Title and Description which will be read to the people with vision or cognitive impairments to help them better understand what information there is in the chart.

    +

    Chart - Advanced Settings

    +

    Edit chart elements

    To edit the chart Title, select the default text with the mouse and type in your own one instead.

    To change the font formatting within text elements, such as the chart title, axes titles, legend entries, data labels etc., select the necessary text element by left-clicking it. Then use icons on the top toolbar to change the font type, style, size, or color.

    To delete a chart element, select it by left-clicking and press the Delete key on the keyboard.

    You can also rotate 3D charts using the mouse. Left-click within the plot area and hold the mouse button until a blue dashed box appears. Drag the cursor without releasing the mouse button to change the 3D chart orientation.

    3D chart

    - -

    Adjust chart settings

    -

    To change the inserted chart type,

    -
      -
    1. select the chart with the mouse,
    2. -
    3. click the Chart Settings Chart Settings icon icon at the right sidebar, -

      Chart Settings Right-Side Panel window

    4. -
    5. open the Type drop-down list and select the type you need,
    6. -
    7. open the Style drop-down list below and select the style which suits you best.
    8. -
    -

    The selected chart type and style will be changed. If you need to edit the data used to create the chart,

    -
      -
    1. click the Show advanced settings link situated at the right-side panel, or choose the Chart Advanced Settings option from the right-click menu, or just double-click the chart,
    2. -
    3. in the opened Chart - Advanced Settings window make all the necessary changes,
    4. -
    5. click the OK button to apply the changes and close the window.
    6. -

    When the chart is selected, the Shape Settings Shape Settings icon icon is also available on the right, since a shape is used as a background for the chart. You can click this icon to open the Shape Settings tab at the right sidebar and adjust the shape Fill and Stroke. Note that you cannot change the shape type.

    -

    To delete the inserted chart, click it and press the Delete key.

    +

    If necessary, you can change the chart size and position.

    +

    To delete the inserted chart, click it and press the Delete key.

    +

    Edit sparklines

    Sparkline is a little chart that fits in one cell. Sparklines can be useful if you want to visually represent information for each row or column in large data sets. This makes it easier to show trends in multiple data series.

    If your spreadsheet contains existing sparklines created using some other application, you can change sparkline properties. To do that, select the cell that contains a sparkline with the mouse and click the Chart Settings Chart Settings icon icon at the right sidebar. If the selected sparkline is included into a sparkline group, the changes will be applied to all sparklines in the group.

    diff --git a/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/InsertFunction.htm b/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/InsertFunction.htm index 4ef64c72d..767c44f27 100644 --- a/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/InsertFunction.htm +++ b/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/InsertFunction.htm @@ -57,7 +57,7 @@ - + diff --git a/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/InsertImages.htm b/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/InsertImages.htm index e4fa98c50..733fb7e32 100644 --- a/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/InsertImages.htm +++ b/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/InsertImages.htm @@ -11,7 +11,8 @@

    Insert images

    Spreadsheet Editor allows you to insert images in the most popular formats into your worksheet. The following image formats are supported: BMP, GIF, JPEG, JPG, PNG.

    -

    To insert an image into the spreadsheet,

    +

    Insert an image

    +

    To insert an image into the spreadsheet,

    1. place the cursor where you want the image to be put,
    2. click the Insert Image Insert Image icon icon at the top toolbar,
    3. @@ -21,16 +22,29 @@
    4. the Picture from URL option will open the window where you can enter the necessary image web address and click the OK button
    5. -
    6. once the image is added you can change its size and position.
    -

    To replace the inserted image,

    +

    After that the image will be added to the worksheet.

    +

    Adjust the image settings

    +

    Once the image is added you can change its size and position.

    +

    To specify exact image dimensions:

    +
      +
    1. select the image you wish to resize with the mouse,
    2. +
    3. + click the Image Settings Image Settings icon icon at the right sidebar, +

      Image Settings Right-Side Panel window

      +
    4. +
    5. in the Size section, set the necessary Width and Height values. If the Constant Proportions Constant Proportions icon button is clicked (in this case it looks like this Constant Proportions icon activated), the width and height will be changed together preserving the original image aspect ratio. To restore the default size of the added image, click the Default Size button.
    6. +
    +

    To replace the inserted image,

    1. select the image you wish to replace with the mouse,
    2. -
    3. click the Image Settings Image Settings icon icon at the right sidebar, -

      Image Settings Right-Side Panel window

    4. +
    5. click the Image Settings Image Settings icon icon at the right sidebar,
    6. in the Replace Image section click the button you need: From File or From URL and select the desired image.

    The selected image will be replaced.

    +

    To change its advanced settings, click the image with the right mouse button and select the Image Advanced Settings option from the right-click menu or just click the Show advanced settings link at the right sidebar. The image properties window will open:

    +

    Image - Advanced Settings

    +

    The Alternative Text tab allows to specify a Title and Description which will be read to the people with vision or cognitive impairments to help them better understand what information there is in the image.

    To delete the inserted image, click it and press the Delete key.

    diff --git a/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/SortData.htm b/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/SortData.htm index f962d343b..01cbe748f 100644 --- a/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/SortData.htm +++ b/apps/spreadsheeteditor/main/resources/help/en/UsageInstructions/SortData.htm @@ -18,19 +18,33 @@

    To sort your data,

      -
    1. select a range of cells you wish to sort,
    2. -
    3. click the Sort Lowest to Highest Sort Lowest to Highest icon icon situated at the top toolbar to sort your data in ascending order, +
    4. select a range of cells you wish to sort (you can select a single cell in a range to sort the entire range), +
    5. +
    6. click the Sort Ascending Sort Ascending icon icon situated at the top toolbar to sort your data in ascending order,
      OR
      - click the Sort Highest to Lowest Sort Highest to Lowest icon icon situated at the top toolbar to sort your data in descending order. + click the Sort Descending Sort Descending icon icon situated at the top toolbar to sort your data in descending order.
    +

    Note: if you select a single column/row within a cell range or a part of the column/row, you will be asked if you want to expand the selection to include adjacent cells or sort the selected data only.

    You can also sort your data using the contextual menu options. Right-click the selected range of cells, select the Sort option from the menu and then select Ascending or Descending option from the submenu.

    +

    It's also possible to sort the data by a color using the contextual menu:

    +
      +
    1. right-click a cell containing the color you want to sort your data by,
    2. +
    3. select the Sort option from the menu,
    4. +
    5. + select the necessary option from the submenu: +
        +
      • Selected Cell Color on top - to display the entries with the same cell background color on the top of the column,
      • +
      • Selected Font Color on top - to display the entries with the same font color on the top of the column.
      • +
      +
    6. +

    Filter Data

    To display only the rows that meet certain criteria and hide other ones, make use of the Filter option.

    To enable a filter,
      -
    1. Select a range of cells containing data to filter,
    2. +
    3. Select a range of cells containing data to filter (you can select a single cell in a range to filter the entire range),
    4. Click the Filter Filter icon icon situated at the top toolbar.

      The drop-down arrow Drop-Down Arrow will appear in the first cell of each column of the selected cell range. It means that the filter is enabled.

      @@ -83,7 +97,7 @@

      Filter data by color

    5. -

      The Filter Filter button button will appear in the first cell of the column. It means that the filter is applied.

      +

      The Filter Filter button button will appear in the first cell of the column. It means that the filter is applied. The number of filtered records will be displayed at the status bar.

    Sort filtered data

    @@ -95,6 +109,11 @@
  • Sort by font color - allows to select one of the colors and display the entries with the same font color on the top of the column.
  • The latter two options can be used if the cell range you want to sort contains some cells you have formatted changing their background or font color (manually or using predefined styles).

    +

    The sorting direction will be indicated by an arrow in the filter buttons.

    +

    You can also quickly sort the data by a color using the contextual menu options:

    1. right-click a cell containing the color you want to sort your data by,
    2. @@ -125,7 +144,7 @@
    3. click the OK button to apply the selected template.

    The template will be applied to the selected range of cells and you will be able to edit the table headers and apply the filter to work with your data.

    -

    Note: once you've created a new formatted table, a default name (Table1, Table2 etc.) will be automatically assigned to the table. You can change this name making it more meaningful and use it for further work.

    +

    Note: once you create a new formatted table, a default name (Table1, Table2 etc.) will be automatically assigned to the table. You can change this name making it more meaningful and use it for further work.

    Some of the table settings can be altered using the Table Settings tab of the right sidebar that opens if you select at least one cell within the table with the mouse and click the Table Settings Table Settings icon icon on the right.

    Table Settings tab

    The Rows and Columns sections on the top allow you to emphasize certain rows/columns applying a specific formatting to them, or highlight different rows/columns with the different background colors to clearly distinguish them. The following options are available:

    @@ -152,6 +171,10 @@
  • Delete a row, column (depending on the cursor position or the selection), or the entire table.
  • Note: the options of the Rows & Columns section are also accessible from the right-click menu.

    +

    The Convert to range button can be used if you want to transform the table into a regular data range removing the filter but preserving the table style (i.e. cell and font colors etc.). Once you apply this option, the Table Settings tab at the right sidebar will be unavailable.

    +

    To change the advanced table properties, use the Show advanced settings link at the right sidebar. The table properties window will open:

    +

    Table - Advanced Settings

    +

    The Alternative Text tab allows to specify a Title and Description which will be read to the people with vision or cognitive impairments to help them better understand what information there is in the table.

    Reapply Filter

    If the filtered data has been changed, you can refresh the filter to display an up-to-date result:

      diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/averageifs.png b/apps/spreadsheeteditor/main/resources/help/en/images/averageifs.png new file mode 100644 index 000000000..eb1fcdb39 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/en/images/averageifs.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/chartwindow.png b/apps/spreadsheeteditor/main/resources/help/en/images/chartwindow.png index 7132d2978..b6d389755 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/en/images/chartwindow.png and b/apps/spreadsheeteditor/main/resources/help/en/images/chartwindow.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/chartwindow1.png b/apps/spreadsheeteditor/main/resources/help/en/images/chartwindow1.png index 71e7730d0..56bfbb94a 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/en/images/chartwindow1.png and b/apps/spreadsheeteditor/main/resources/help/en/images/chartwindow1.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/chartwindow2.png b/apps/spreadsheeteditor/main/resources/help/en/images/chartwindow2.png index 567e66d5d..9b459bafa 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/en/images/chartwindow2.png and b/apps/spreadsheeteditor/main/resources/help/en/images/chartwindow2.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/chartwindow3.png b/apps/spreadsheeteditor/main/resources/help/en/images/chartwindow3.png index 73aa15fd9..80d9c25d6 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/en/images/chartwindow3.png and b/apps/spreadsheeteditor/main/resources/help/en/images/chartwindow3.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/chartwindow4.png b/apps/spreadsheeteditor/main/resources/help/en/images/chartwindow4.png new file mode 100644 index 000000000..eeb6305e6 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/en/images/chartwindow4.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/countifs.png b/apps/spreadsheeteditor/main/resources/help/en/images/countifs.png new file mode 100644 index 000000000..eec6057f1 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/en/images/countifs.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/generalformat.png b/apps/spreadsheeteditor/main/resources/help/en/images/generalformat.png index 7a4a74c82..8828501b0 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/en/images/generalformat.png and b/apps/spreadsheeteditor/main/resources/help/en/images/generalformat.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/highesttolowest.png b/apps/spreadsheeteditor/main/resources/help/en/images/highesttolowest.png new file mode 100644 index 000000000..b137e1a41 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/en/images/highesttolowest.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/highesttolowest1.png b/apps/spreadsheeteditor/main/resources/help/en/images/highesttolowest1.png new file mode 100644 index 000000000..278e4bed7 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/en/images/highesttolowest1.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/imageadvancedsettings.png b/apps/spreadsheeteditor/main/resources/help/en/images/imageadvancedsettings.png new file mode 100644 index 000000000..0d6c3bad7 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/en/images/imageadvancedsettings.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/imagesettings.png b/apps/spreadsheeteditor/main/resources/help/en/images/imagesettings.png index 490e16029..4ad496189 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/en/images/imagesettings.png and b/apps/spreadsheeteditor/main/resources/help/en/images/imagesettings.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/lowesttohighest.png b/apps/spreadsheeteditor/main/resources/help/en/images/lowesttohighest.png new file mode 100644 index 000000000..69b35cb48 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/en/images/lowesttohighest.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/lowesttohighest1.png b/apps/spreadsheeteditor/main/resources/help/en/images/lowesttohighest1.png new file mode 100644 index 000000000..af73ce603 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/en/images/lowesttohighest1.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/numberformatwindow.png b/apps/spreadsheeteditor/main/resources/help/en/images/numberformatwindow.png new file mode 100644 index 000000000..cfaf1994a Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/en/images/numberformatwindow.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/pastespecial.png b/apps/spreadsheeteditor/main/resources/help/en/images/pastespecial.png new file mode 100644 index 000000000..d7a8c9967 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/en/images/pastespecial.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/pastespecialbutton.png b/apps/spreadsheeteditor/main/resources/help/en/images/pastespecialbutton.png new file mode 100644 index 000000000..8feb3c534 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/en/images/pastespecialbutton.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/shape_properties.png b/apps/spreadsheeteditor/main/resources/help/en/images/shape_properties.png index 4d8049b99..c69278931 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/en/images/shape_properties.png and b/apps/spreadsheeteditor/main/resources/help/en/images/shape_properties.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/shape_properties_1.png b/apps/spreadsheeteditor/main/resources/help/en/images/shape_properties_1.png index 9c7664208..d94a0525d 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/en/images/shape_properties_1.png and b/apps/spreadsheeteditor/main/resources/help/en/images/shape_properties_1.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/shape_properties_2.png b/apps/spreadsheeteditor/main/resources/help/en/images/shape_properties_2.png index 136172c91..bbcd69fce 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/en/images/shape_properties_2.png and b/apps/spreadsheeteditor/main/resources/help/en/images/shape_properties_2.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/shape_properties_3.png b/apps/spreadsheeteditor/main/resources/help/en/images/shape_properties_3.png index 8513882ac..ea21a2310 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/en/images/shape_properties_3.png and b/apps/spreadsheeteditor/main/resources/help/en/images/shape_properties_3.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/tableadvancedsettings.png b/apps/spreadsheeteditor/main/resources/help/en/images/tableadvancedsettings.png new file mode 100644 index 000000000..75db9bc95 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/en/images/tableadvancedsettings.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/en/images/tablesettingstab.png b/apps/spreadsheeteditor/main/resources/help/en/images/tablesettingstab.png index 9462da299..fea4ec48e 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/en/images/tablesettingstab.png and b/apps/spreadsheeteditor/main/resources/help/en/images/tablesettingstab.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/Functions/and.htm b/apps/spreadsheeteditor/main/resources/help/ru/Functions/and.htm index a7c5ebfc2..e8361bdb3 100644 --- a/apps/spreadsheeteditor/main/resources/help/ru/Functions/and.htm +++ b/apps/spreadsheeteditor/main/resources/help/ru/Functions/and.htm @@ -23,7 +23,7 @@
    1. выберите из списка группу функций Логические,
    2. щелкните по функции AND,
    3. введите требуемые аргументы, разделяя их запятыми, -

      Примечание: можно ввести до 265 логических значений.

      +

      Примечание: можно ввести до 255 логических значений.

    4. нажмите клавишу Enter.
    diff --git a/apps/spreadsheeteditor/main/resources/help/ru/Functions/average.htm b/apps/spreadsheeteditor/main/resources/help/ru/Functions/average.htm index fa25c1063..df0cb92ff 100644 --- a/apps/spreadsheeteditor/main/resources/help/ru/Functions/average.htm +++ b/apps/spreadsheeteditor/main/resources/help/ru/Functions/average.htm @@ -12,7 +12,7 @@

    Функция AVERAGE - это одна из статистических функций. Анализирует диапазон данных и вычисляет среднее значение.

    Синтаксис функции AVERAGE:

    AVERAGE(argument-list)

    -

    где argument-list (список значений) - это до 30 числовых значений, введенных вручную или находящихся в ячейках, на которые даются ссылки.

    +

    где argument-list (список значений) - это до 255 числовых значений, введенных вручную или находящихся в ячейках, на которые даются ссылки.

    Чтобы применить функцию AVERAGE:

    1. выделите ячейку, в которой требуется отобразить результат,
    2. diff --git a/apps/spreadsheeteditor/main/resources/help/ru/Functions/averagea.htm b/apps/spreadsheeteditor/main/resources/help/ru/Functions/averagea.htm index b470fb2ff..a233f14d1 100644 --- a/apps/spreadsheeteditor/main/resources/help/ru/Functions/averagea.htm +++ b/apps/spreadsheeteditor/main/resources/help/ru/Functions/averagea.htm @@ -12,7 +12,7 @@

      Функция AVERAGEA - это одна из статистических функций. Анализирует диапазон данных, включая текстовые и логические значения, и вычисляет среднее значение. Функция AVERAGEA интерпретирует текст и логическое значение FALSE (ЛОЖЬ) как числовое значение 0, а логическое значение TRUE (ИСТИНА) как числовое значение 1.

      Синтаксис функции AVERAGEA:

      AVERAGEA(argument-list)

      -

      где argumenti-list (список значений) - до 30 значений, введенных вручную или находящихся в ячейках, на которые даются ссылки.

      +

      где argumenti-list (список значений) - до 255 значений, введенных вручную или находящихся в ячейках, на которые даются ссылки.

      Чтобы применить функцию AVERAGEA,

      1. выделите ячейку, в которой требуется отобразить результат,
      2. diff --git a/apps/spreadsheeteditor/main/resources/help/ru/Functions/averageifs.htm b/apps/spreadsheeteditor/main/resources/help/ru/Functions/averageifs.htm new file mode 100644 index 000000000..6d5447d8a --- /dev/null +++ b/apps/spreadsheeteditor/main/resources/help/ru/Functions/averageifs.htm @@ -0,0 +1,40 @@ + + + + Функция AVERAGEIFS (СРЗНАЧЕСЛИМН) + + + + + +
        +

        Функция AVERAGEIFS (СРЗНАЧЕСЛИМН)

        +

        Функция AVERAGEIFS (СРЗНАЧЕСЛИМН) - это одна из статистических функций. Анализирует диапазон данных и вычисляет среднее значение всех чисел в диапазоне ячеек, которые соответствуют нескольким заданным условиями.

        +

        Синтаксис функции AVERAGEIFS:

        +

        AVERAGEIFS(average-range, criteria-range-1, criteria-1, [criteria-range-2, criteria-2], ...)

        +

        где

        +

        average-range - выбранный диапазон ячеек, для которого необходимо вычислить среднее значение. Это обязательный аргумент.

        +

        criteria-range-1 - первый выбранный диапазон ячеек, к которому применяется условие criteria-1. Это обязательный аргумент.

        +

        criteria-1 - первое условие, которое должно выполняться. Оно применяется к диапазону criteria-range-1 и определяет, для каких ячеек в диапазоне average-range вычислять среднее значение. Это значение, введенное вручную или находящееся в ячейке, на которую дается ссылка. Это обязательный аргумент.

        +

        criteria-range-2, criteria-2, ... - дополнительные диапазоны ячеек и соответствующие условия. Это необязательные аргументы. Можно добавить до 127 диапазонов и соответствующих условий.

        +

        Примечание: при указании условий можно использовать подстановочные знаки. Вопросительный знак "?" может замещать любой отдельный символ, а звездочку "*" можно использовать вместо любого количества символов.

        +

        Чтобы применить функцию AVERAGEIFS,

        +
          +
        1. выделите ячейку, в которой требуется отобразить результат,
        2. +
        3. + щелкните по значку Вставить функцию Значок Вставить функцию, расположенному на верхней панели инструментов, +
          или щелкните правой кнопкой мыши по выделенной ячейке и выберите в меню команду Вставить функцию, +
          или щелкните по значку Значок Функция перед строкой формул, +
        4. +
        5. выберите из списка группу функций Статистические,
        6. +
        7. щелкните по функции AVERAGEIFS,
        8. +
        9. + введите требуемые аргументы, разделяя их запятыми, +
        10. +
        11. нажмите клавишу Enter.
        12. +
        +

        Результат будет отображен в выбранной ячейке.

        +

        Функция AVERAGEIFS

        +
        + + \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/resources/help/ru/Functions/countifs.htm b/apps/spreadsheeteditor/main/resources/help/ru/Functions/countifs.htm new file mode 100644 index 000000000..dc2c47123 --- /dev/null +++ b/apps/spreadsheeteditor/main/resources/help/ru/Functions/countifs.htm @@ -0,0 +1,37 @@ + + + + Функция COUNTIFS (СЧЁТЕСЛИМН) + + + + + +
        +

        Функция COUNTIFS (СЧЁТЕСЛИМН)

        +

        Функция COUNTIFS (СЧЁТЕСЛИМН) - это одна из статистических функций. Она используется для подсчета количества ячеек выделенного диапазона, соответствующих нескольким заданным условиям.

        +

        Синтаксис функции COUNTIFS:

        +

        COUNTIFS(criteria-range-1, criteria-1, [criteria-range-2, criteria-2], ...)

        +

        где

        +

        criteria-range-1 - первый выбранный диапазон ячеек, к которому применяется условие criteria-1. Это обязательный аргумент.

        +

        criteria-1 - первое условие, которое должно выполняться. Оно применяется к диапазону criteria-range-1 и определяет, какие ячейки в диапазоне criteria-range-1 необходимо учитывать. Это значение, введенное вручную или находящееся в ячейке, на которую дается ссылка. Это обязательный аргумент.

        +

        criteria-range-2, criteria-2, ... - дополнительные диапазоны ячеек и соответствующие условия. Это необязательные аргументы. Можно добавить до 127 диапазонов и соответствующих условий.

        +

        Примечание: при указании условий можно использовать подстановочные знаки. Вопросительный знак "?" может замещать любой отдельный символ, а звездочку "*" можно использовать вместо любого количества символов. Если требуется найти вопросительный знак или звездочку, введите перед этим символом тильду (~).

        +

        Чтобы применить функцию COUNTIFS,

        +
          +
        1. выделите ячейку, в которой требуется отобразить результат,
        2. +
        3. + щелкните по значку Вставить функцию Значок Вставить функцию, расположенному на верхней панели инструментов, +
          или щелкните правой кнопкой мыши по выделенной ячейке и выберите в меню команду Вставить функцию, +
          или щелкните по значку Значок Функция перед строкой формул, +
        4. +
        5. выберите из списка группу функций Статистические,
        6. +
        7. щелкните по функции COUNTIFS,
        8. +
        9. введите требуемые аргументы, разделяя их запятыми,
        10. +
        11. нажмите клавишу Enter.
        12. +
        +

        Результат будет отображен в выбранной ячейке.

        +

        Функция COUNTIFS

        +
        + + \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/resources/help/ru/Functions/or.htm b/apps/spreadsheeteditor/main/resources/help/ru/Functions/or.htm index fb13f7b33..f70d9b88e 100644 --- a/apps/spreadsheeteditor/main/resources/help/ru/Functions/or.htm +++ b/apps/spreadsheeteditor/main/resources/help/ru/Functions/or.htm @@ -23,7 +23,7 @@
      3. выберите из списка группу функций Логические,
      4. щелкните по функции OR,
      5. введите требуемые аргументы, разделяя их запятыми, -

        Примечание: можно ввести до 265 логических значений.

        +

        Примечание: можно ввести до 255 логических значений.

      6. нажмите клавишу Enter.
      diff --git a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/AddBorders.htm b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/AddBorders.htm index 8d40f2963..2d7397111 100644 --- a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/AddBorders.htm +++ b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/AddBorders.htm @@ -15,8 +15,13 @@

      Примечание: можно также выделить несколько ячеек или диапазонов ячеек, которые не являются смежными, удерживая клавишу Ctrl при выделении ячеек и диапазонов с помощью мыши.

    3. щелкните по значку Границы Значок Границы, расположенному на верхней панели инструментов,
    4. -
    5. выберите стиль границ, который требуется применить: Внешние границы Значок Внешние границы, Все границы Значок Все границы, Верхние границы Значок Верхние границы, Нижние границы Значок Нижние границы, Левые границы Значок Левые границы, Правые границы Значок Правые границы, Без границ Значок Без границ, Внутренние границы Значок Внутренние границы, Внутренние вертикальные границы Значок Внутренние вертикальные границы, Внутренние горизонтальные границы Значок Внутренние горизонтальные границы, Диагональная граница снизу вверх Значок Диагональная граница снизу вверх, Диагональная граница сверху вниз Значок Диагональная граница сверху вниз;
    6. -
    7. задайте Ширину границ Значок Ширина границ и выберите Цвет границ Значок Цвет границ, щелкнув по соответствующей команде и выбрав нужный цвет на палитре.
    8. +
    9. выберите стиль границ, который требуется применить: +
        +
      1. откройте подменю Стиль границ и выберите один из доступных вариантов,
      2. +
      3. откройте подменю Цвет границ Значок Цвет границ и выберите нужный цвет на палитре,
      4. +
      5. выберите один из доступных шаблонов границ: Внешние границы Значок Внешние границы, Все границы Значок Все границы, Верхние границы Значок Верхние границы, Нижние границы Значок Нижние границы, Левые границы Значок Левые границы, Правые границы Значок Правые границы, Без границ Значок Без границ, Внутренние границы Значок Внутренние границы, Внутренние вертикальные границы Значок Внутренние вертикальные границы, Внутренние горизонтальные границы Значок Внутренние горизонтальные границы, Диагональная граница снизу вверх Значок Диагональная граница снизу вверх, Диагональная граница сверху вниз Значок Диагональная граница сверху вниз.
      6. +
      +
    diff --git a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/ChangeNumberFormat.htm b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/ChangeNumberFormat.htm index c6d7516ba..9949631d5 100644 --- a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/ChangeNumberFormat.htm +++ b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/ChangeNumberFormat.htm @@ -9,6 +9,7 @@

    Изменение формата представления чисел

    +

    Применение числового формата

    Можно легко изменить числовой формат, то есть то, каким образом выглядят введенные числа в электронной таблице. Для этого:

    1. выделите ячейку, диапазон ячеек мышью или весь рабочий лист, нажав сочетание клавиш Ctrl+A, @@ -18,21 +19,22 @@
      • Общий - используется для отображения введенных данных как обычных чисел, самым компактным образом без дополнительных знаков,
      • Числовой - используется для отображения чисел с 0-30 знаками после десятичной запятой, где между каждой группой из трех цифр перед десятичной запятой вставляется разделитель тысяч,
      • -
      • Целочисленный - используется для отображения чисел в виде целых чисел,
      • +
      • Научный (экспоненциальный) - используется для представления очень длинных чисел за счет преобразования в строку типа d.dddE+ddd или d.dddE-ddd, где каждый символ d обозначает цифру от 0 до 9,
      • - Финансовый - используется для отображения денежных значений с одним из следующих обозначений денежной единицы: $ Доллар, Евро, £ Фунт, p. Рубль, ¥ Йена и двумя десятичными знаками. В отличие от Денежного формата, в Финансовом формате обозначения денежной единицы выравниваются по левому краю ячейки, нулевые значения представляются как тире, а отрицательные значения отображаются в скобках. + Финансовый - используется для отображения денежных значений с используемым по умолчанию обозначением денежной единицы и двумя десятичными знаками. Чтобы применить другое обозначение денежной единицы или количество десятичных знаков, следуйте приведенным ниже инструкциям. В отличие от Денежного формата, в Финансовом формате обозначения денежной единицы выравниваются по левому краю ячейки, нулевые значения представляются как тире, а отрицательные значения отображаются в скобках.

        Финансовый и денежный форматы представления чисел

        -

        Примечание: чтобы быстро применить к выделенным данным Финансовый формат, можно также щелкнуть по значку Финансовый формат Значок Финансовый формат на верхней панели инструментов и выбрать нужное обозначение денежной единицы.

        +

        Примечание: чтобы быстро применить к выделенным данным Финансовый формат, можно также щелкнуть по значку Финансовый формат Значок Финансовый формат на верхней панели инструментов и выбрать нужное обозначение денежной единицы: $ Доллар, Евро, £ Фунт, Рубль, ¥ Йена.

      • -
      • Денежный - используется для отображения денежных значений с одним из следующих обозначений денежной единицы: $ Доллар, Евро, £ Фунт, p. Рубль, ¥ Йена и двумя десятичными знаками. В отличие от Финансового формата, в Денежном формате обозначение денежной единицы помещается непосредственно рядом с числом, а отрицательные значения отображаются с отрицательным знаком (-).
      • -
      • Дата - используется для отображения дат. Можно выбрать один из следующих форматов представления дат: MM-dd-yy, MM-dd-yyyy, dd-MM-yy, dd-MM-yyyy, dd-MMM-yyyy, dd-MMM, MMM-yy,
      • -
      • Время - используется для отображения времени. Можно выбрать один из следующих форматов представления времени: HH:mm, HH:MM:ss, hh:mm tt, hh:mm:ss tt, [h]:mm:ss,
      • +
      • Денежный - используется для отображения денежных значений с используемым по умолчанию обозначением денежной единицы и двумя десятичными знаками. Чтобы применить другое обозначение денежной единицы или количество десятичных знаков, следуйте приведенным ниже инструкциям. В отличие от Финансового формата, в Денежном формате обозначение денежной единицы помещается непосредственно рядом с числом, а отрицательные значения отображаются с отрицательным знаком (-).
      • +
      • Дата - используется для отображения дат,
      • +
      • Время - используется для отображения времени,
      • Процентный - используется для отображения данных в виде процентов со знаком процента %,

        Примечание: чтобы быстро применить к данным процентный формат, можно также использовать значок Процентный формат Значок Процентный формат на верхней панели инструментов.

      • Дробный - используется для отображения чисел в виде обыкновенных, а не десятичных дробей.
      • Текстовый - используется для отображения числовых значений, при котором они рассматриваются как обычный текст, с максимально доступной точностью.
      • +
      • Другие форматы - используется для настройки уже примененных числовых форматов с указанием дополнительных параметров (см. описание ниже).
    2. при необходимости измените количество десятичных разрядов: @@ -42,7 +44,26 @@
    - +

    Настройка числового формата

    +

    Настроить числовой формат можно следующим образом:

    +
      +
    1. выделите ячейки, для которых требуется настроить числовой формат,
    2. +
    3. нажмите кнопку Общий формат Кнопка Общий формат на верхней панели инструментов,
    4. +
    5. выберите опцию Другие форматы,
    6. +
    7. + в открывшемся окне Числовой формат настройте доступные параметры. Опции различаются в зависимости от того, какой числовой формат применен к выделенным ячейкам. Чтобы изменить числовой формат, можно использовать список Категория. +

      Окно Числовой формат

      +
        +
      • для Числового формата можно задать количество Десятичных знаков, указать, надо ли Использовать разделитель разрядов, и выбрать один из доступных Форматов для отображения отрицательных значений.
      • +
      • для Научного и Процентного форматов, можно задать количество Десятичных знаков.
      • +
      • для Финансового и Денежного форматов, можно задать количество Десятичных знаков, выбрать одно из доступных Обозначений денежных единиц и один из доступных Форматов для отображения отрицательных значений.
      • +
      • для формата Дата можно выбрать один из доступных форматов представления дат: 15.4, 15.4.06, 15.04.06, 15.4.2006, 15.4.06 0:00, 15.4.06 12:00 AM, A, апреля 15 2006, 15-апр, 15-апр-06, апр-06, Апрель-06, A-06, 15-апр-2006, 15.апр, 15.апр.06, апр.06, Апрель.06, А.06, 15.апр.2006, 15 апр, 15 апр 06, апр 06, Апрель 06, А 06, 15 апр 2006.
      • +
      • для формата Время можно выбрать один из доступных форматов представления времени: 12:48:58 PM, 12:48, 12:48 PM, 12:48:58, 48:57,6, 36:48:58.
      • +
      • для Дробного формата можно выбрать один из доступных форматов: До одной цифры (1/3), До двух цифр (12/25), До трех цифр (131/135), Половинными долями (1/2), Четвертыми долями (2/4), Восьмыми долями (4/8), Шестнадцатыми долями (8/16), Десятыми долями (5/10) , Сотыми долями (50/100).
      • +
      +
    8. +
    9. нажмите кнопку OK, чтобы применить изменения.
    10. +
    \ No newline at end of file diff --git a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/CopyPasteData.htm b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/CopyPasteData.htm index d29e55acf..f2ba55d8f 100644 --- a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/CopyPasteData.htm +++ b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/CopyPasteData.htm @@ -27,6 +27,38 @@ установить указатель мыши у границы выделения (при этом он будет выглядеть так: Стрелка) и перетащить выделение мышью в нужное место.

    +

    Использование функции Специальная вставка

    +

    После вставки скопированных данных рядом с правым нижним углом вставленной ячейки/диапазона ячеек появляется кнопка Специальная вставка Специальная вставка. Нажмите на эту кнопку, чтобы выбрать нужный параметр вставки.

    +

    При вставке ячейки/диапазона ячеек с отформатированными данными доступны следующие параметры:

    + +

    Параметры вставки

    +

    При вставке содержимого отдельной ячейки или текста в автофигурах доступны следующие параметры:

    +

    Использование функции автозаполнения

    Для быстрого заполнения множества ячеек одними и теми же данными воспользуйтесь функцией Автозаполнение: diff --git a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertAutoshapes.htm b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertAutoshapes.htm index d9f1282bd..6b1f53a7c 100644 --- a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertAutoshapes.htm +++ b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertAutoshapes.htm @@ -115,6 +115,8 @@

    Фигура - Дополнительные параметры

    На вкладке Поля вокруг текста можно изменить внутренние поля автофигуры Сверху, Снизу, Слева и Справа (то есть расстояние между текстом внутри фигуры и границами автофигуры).

    Примечание: эта вкладка доступна, только если в автофигуру добавлен текст, в противном случае вкладка неактивна.

    +

    Фигура - Дополнительные параметры

    +

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


    Вставка и форматирование текста внутри автофигуры

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

    diff --git a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertChart.htm b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertChart.htm index 41b962a45..1786d36b2 100644 --- a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertChart.htm +++ b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertChart.htm @@ -13,19 +13,40 @@

    Вставка диаграммы

    Для вставки диаграммы в электронную таблицу:

      -
    1. выделите диапазон ячеек, содержащих данные, которые необходимо использовать для диаграммы,
    2. -
    3. щелкните по значку Вставить диаграмму Значок Вставить диаграмму на верхней панели инструментов,
    4. -
    5. после этого появится окно, в котором можно задать параметры диаграммы: +
    6. Выделите диапазон ячеек, содержащих данные, которые необходимо использовать для диаграммы,
    7. +
    8. Щелкните по значку Вставить диаграмму Значок Вставить диаграмму на верхней панели инструментов,
    9. +
    10. + Выберите Тип диаграммы, которую требуется вставить: гистограмма, график, круговая, линейчатая, с областями, точечная, биржевая. +

      Обратите внимание: для Гистограмм, Графиков, Круговых или Линейчатых диаграмм также доступен формат 3D.

      +
    11. +
    +

    После этого диаграмма будет добавлена на рабочий лист.

    +

    Изменение параметров диаграммы

    +

    Теперь можно изменить параметры вставленной диаграммы. Чтобы изменить тип диаграммы:

    +
      +
    1. выделите диаграмму мышью,
    2. +
    3. + щелкните по значку Параметры диаграммы Значок Параметры диаграммы на правой боковой панели, +

      Вкладка Параметры диаграммы на правой боковой панели

      +
    4. +
    5. раскройте выпадающий список Тип и выберите нужный тип,
    6. +
    7. раскройте выпадающий список Стиль, расположенный ниже, и выберите подходящий стиль.
    8. +
    +

    Тип и стиль выбранной диаграммы будут изменены. Если требуется отредактировать данные, использованные для построения диаграммы,

    +
      +
    1. нажмите на ссылку Дополнительные параметры, расположенную на правой боковой панели, или выберите пункт Дополнительные параметры диаграммы из контекстного меню или просто дважды щелкните мышью по диаграмме,
    2. +
    3. в открывшемся окне Диаграмма - Дополнительные параметры внесите все необходимые изменения,
    4. +
    5. нажмите кнопку OK, чтобы применить изменения и закрыть окно.
    6. +
    +

    Ниже приводится описание параметров диаграммы, которые можно изменить с помощью окна Диаграмма - Дополнительные параметры.

    -

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

    +

    На вкладке Тип и данные можно изменить тип диаграммы, а также данные, которые вы хотите использовать для создания диаграммы.

    -

    Окно вставки диаграммы

    +

    Диаграмма - Дополнительные параметры

    На вкладке Макет можно изменить расположение элементов диаграммы:

    -

    Окно вставки диаграммы

    +

    Диаграмма - Дополнительные параметры

    Примечание: Вкладки Вертикальная/горизонтальная ось недоступны для круговых диаграмм, так как у круговых диаграмм нет осей.

    На вкладке Вертикальная ось можно изменить параметры вертикальной оси, которую называют также осью значений или осью Y, где указываются числовые значения. Обратите, пожалуйста, внимание, что для гистограмм вертикальная ось является осью категорий, на которой показываются текстовые подписи, так что в этом случае опции вкладки Вертикальная ось будут соответствовать опциям, о которых пойдет речь в следующем разделе. Для точечных диаграмм обе оси являются осями категорий.

    @@ -186,7 +207,7 @@ -

    Окно вставки диаграммы

    +

    Диаграмма - Дополнительные параметры

    На вкладке Горизонтальная ось можно изменить параметры горизонтальной оси, которую также называют осью категорий или осью X, где отображаются текстовые подписи. Обратите внимание, что для Гистограмм горизонтальная ось является осью значений, на которой отображаются числовые значения, @@ -248,38 +269,26 @@ -

    Окно вставки диаграммы

    - - -
  • после того как диаграмма будет добавлена, можно изменить ее размер и положение.
  • - +

    Диаграмма - Дополнительные параметры

    + +

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

    +

    Диаграмма - Дополнительные параметры

    +

    Редактирование элементов диаграммы

    Чтобы изменить Заголовок диаграммы, выделите мышью стандартный текст и введите вместо него свой собственный.

    Чтобы изменить форматирование шрифта внутри текстовых элементов, таких как заголовок диаграммы, названия осей, элементы условных обозначений, подписи данных и так далее, выделите нужный текстовый элемент, щелкнув по нему левой кнопкой мыши. Затем используйте значки на верхней панели инструментов, чтобы изменить тип, размер, цвет шрифта или его стиль оформления.

    Чтобы удалить элемент диаграммы, выделите его, щелкнув левой кнопкой мыши, и нажмите клавишу Delete на клавиатуре.

    Можно также поворачивать 3D-диаграммы с помощью мыши. Щелкните левой кнопкой мыши внутри области построения диаграммы и удерживайте кнопку мыши до появления голубой пунктирной рамки. Не отпуская кнопку мыши, перетащите курсор, чтобы изменить ориентацию 3D-диаграммы.

    3D-диаграмма

    -

    Изменение параметров диаграммы

    -

    Чтобы изменить тип вставленной диаграммы:

    -
      -
    1. выделите диаграмму мышью,
    2. -
    3. щелкните по значку Параметры диаграммы Значок Параметры диаграммы на правой боковой панели, -

      Вкладка Параметры диаграммы на правой боковой панели

    4. -
    5. раскройте выпадающий список Тип и выберите нужный тип,
    6. -
    7. раскройте выпадающий список Стиль, расположенный ниже, и выберите подходящий стиль.
    8. -
    -

    Тип и стиль выбранной диаграммы будут изменены. Если требуется отредактировать данные, использованные для построения диаграммы,

    -
      -
    1. нажмите на ссылку Дополнительные параметры, расположенную на правой боковой панели, или выберите пункт Дополнительные параметры диаграммы из контекстного меню или просто дважды щелкните мышью по диаграмме,
    2. -
    3. в открывшемся окне Диаграмма - Дополнительные параметры внесите все необходимые изменения,
    4. -
    5. нажмите кнопку OK, чтобы применить изменения и закрыть окно.
    6. -
    -

    При выборе диаграммы становится также активным значок Параметры фигуры Значок Параметры фигуры - справа, так как фигура используется в качестве фона для диаграммы. Можно щелкнуть по этому значку, чтобы открыть вкладку - Параметры фигуры на правой боковой панели инструментов и изменить параметры Заливки и Обводки фигуры. - Обратите, пожалуйста, внимание, что вы не можете изменить вид фигуры. -

    -

    Чтобы удалить вставленную диаграмму, щелкните по ней и нажмите клавишу Delete.

    +

    + При выборе диаграммы становится также активным значок Параметры фигуры Значок Параметры фигуры + справа, так как фигура используется в качестве фона для диаграммы. Можно щелкнуть по этому значку, чтобы открыть вкладку + Параметры фигуры на правой боковой панели инструментов и изменить параметры Заливки и Обводки фигуры. + Обратите, пожалуйста, внимание, что вы не можете изменить вид фигуры. +

    +

    В случае необходимости можно изменить размер и положение диаграммы.

    +

    Чтобы удалить вставленную диаграмму, щелкните по ней и нажмите клавишу Delete.

    +

    Редактирование спарклайнов

    Спарклайн - это небольшая диаграмма, помещенная в одну ячейку. Спарклайны могут быть полезны, если требуется наглядно представить информацию для каждой строки или столбца в больших наборах данных. Это позволяет проще показать тенденции изменений во множестве рядов данных.

    Если таблица содержит уже существующие спарклайны, созданные с помощью какого-то другого приложения, можно изменить свойства спарклайнов. Для этого выделите мышью ячейку со спарклайном и щелкните по значку Параметры диаграммы Значок Параметры диаграммы на правой боковой панели. Если выделенный спарклайн входит в группу спарклайнов, изменения будут применены ко всем спарклайнам в группе.

    @@ -288,52 +297,52 @@
  • Используйте выпадающий список Тип для выбора одного из доступных типов спарклайнов:
      -
    • Column (Гистограмма) - этот тип аналогичен обычной Гистограмме.
    • -
    • Line (График) - этот тип аналогичен обычному Графику.
    • -
    • Win/Loss (Выигрыш/проигрыш) - этот тип подходит для представления данных, которые включают как положительные, так и отрицательные значения.
    • +
    • Гистограмма - этот тип аналогичен обычной Гистограмме.
    • +
    • График - этот тип аналогичен обычному Графику.
    • +
    • Выигрыш/проигрыш - этот тип подходит для представления данных, которые включают как положительные, так и отрицательные значения.
  • В разделе Стиль можно выполнить следующие действия:
      -
    • выберите наиболее подходящий стиль из выпадающего списка Template (Шаблон).
    • -
    • выберите нужный Color (Цвет) для спарклайна.
    • -
    • выберите нужную Line Weight (Толщину линии) (доступно только для типа График).
    • +
    • выберите наиболее подходящий стиль из выпадающего списка Шаблон.
    • +
    • выберите нужный Цвет для спарклайна.
    • +
    • выберите нужную Толщину линии (доступно только для типа График).
  • - В разделе Show (Показать) можно выбрать, какие элементы спарклайна требуется выделить, чтобы они были отчетливо видны. Установите галочку слева от элемента, который надо выделить, и выберите нужный цвет, нажав на цветной прямоугольник: + В разделе Показать можно выбрать, какие элементы спарклайна требуется выделить, чтобы они были отчетливо видны. Установите галочку слева от элемента, который надо выделить, и выберите нужный цвет, нажав на цветной прямоугольник:
      -
    • High Point (Максимальная точка) - чтобы выделить точки, представляющие максимальные значения,
    • -
    • Low Point (Минимальная точка) - чтобы выделить точки, представляющие минимальные значения,
    • -
    • Negative Point (Отрицательная точка) - чтобы выделить точки, представляющие отрицательные значения,
    • -
    • First/Last Point (Первая/Последняя точка) - чтобы выделить точку, представляющую первое/последнее значение,
    • -
    • Markers (Маркеры) (доступно только для типа График) - чтобы выделить все значения.
    • +
    • Максимальная точка - чтобы выделить точки, представляющие максимальные значения,
    • +
    • Минимальная точка - чтобы выделить точки, представляющие минимальные значения,
    • +
    • Отрицательная точка - чтобы выделить точки, представляющие отрицательные значения,
    • +
    • Первая/Последняя точка - чтобы выделить точку, представляющую первое/последнее значение,
    • +
    • Маркеры (доступно только для типа График) - чтобы выделить все значения.
  • -

    Нажмите на ссылку Дополнительные параметры, расположенную на правой боковой панели, чтобы открыть окно Sparkline - Advanced Settings (Спарклайн - Дополнительные параметры).

    -

    Sparkline Advanced Settings window

    +

    Нажмите на ссылку Дополнительные параметры, расположенную на правой боковой панели, чтобы открыть окно Спарклайн - Дополнительные параметры.

    +

    Окно Спарклайн - Дополнительные параметры

    На вкладке Тип и данные можно изменить Тип и Стиль спарклайна, а также указать параметры отображения для Скрытых и пустых ячеек:

    -

    Sparkline Advanced Settings window

    +

    Окно Спарклайн - Дополнительные параметры

    На вкладке Параметры оси можно задать следующие параметры Горизонтальной/Вертикальной оси:

    diff --git a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertFunction.htm b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertFunction.htm index 7932eda8d..f65a63ad4 100644 --- a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertFunction.htm +++ b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertFunction.htm @@ -68,7 +68,7 @@ - + diff --git a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertImages.htm b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertImages.htm index c5d6ba734..f532008f0 100644 --- a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertImages.htm +++ b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/InsertImages.htm @@ -11,7 +11,8 @@

    Вставка изображений

    В онлайн-редакторе электронных таблиц можно вставлять в электронную таблицу изображения самых популярных форматов. Поддерживаются следующие форматы изображений: BMP, GIF, JPEG, JPG, PNG.

    -

    Для вставки изображения в электронную таблицу:

    +

    Вставка изображения

    +

    Для вставки изображения в электронную таблицу:

    1. установите курсор там, где требуется поместить изображение,
    2. щелкните по значку Вставить изображение Значок Вставить изображение на верхней панели инструментов,
    3. @@ -21,16 +22,29 @@
    4. при выборе опции Изображение по URL откроется окно, в котором можно ввести веб-адрес нужного изображения, а затем нажать кнопку OK
    5. -
    6. после того как изображение будет добавлено, можно изменить его размер и положение.
    +

    После этого изображение будет добавлено на рабочий лист.

    +

    Изменение параметров изображения

    +

    После того как изображение будет добавлено, можно изменить его размер и положение.

    +

    Для того, чтобы задать точные размеры изображения:

    +
      +
    1. выделите мышью изображение, размер которого требуется изменить,
    2. +
    3. + щелкните по значку Параметры изображения Значок Параметры изображения на правой боковой панели, +

      Вкладка Параметры изображения на правой боковой панели

      +
    4. +
    5. в разделе Размер задайте нужные значения Ширины и Высоты. Если нажата кнопка Сохранять пропорции Кнопка Сохранять пропорции (в этом случае она выглядит так: Кнопка Сохранять пропорции нажата), ширина и высота будут изменены пропорционально, сохраняя исходное соотношение сторон изображения. Чтобы восстановить размер по умолчанию добавленного изображения, нажмите кнопку По умолчанию.
    6. +

    Для замены вставленного изображения:

    1. выделите мышью изображение, которое требуется заменить,
    2. -
    3. щелкните по значку Параметры изображения Значок Параметры изображения на правой боковой панели, -

      Вкладка Параметры изображения на правой боковой панели

    4. +
    5. щелкните по значку Параметры изображения Значок Параметры изображения на правой боковой панели,
    6. в разделе Заменить изображение нажмите нужную кнопку: Из файла или По URL и выберите требуемое изображение.

    Выбранное изображение будет заменено.

    +

    Чтобы изменить дополнительные параметры изображения, щелкните по нему правой кнопкой мыши и выберите из контекстного меню пункт Дополнительные параметры изображения. Или нажмите ссылку Дополнительные параметры на правой боковой панели. Откроется окно свойств изображения:

    +

    Изображение - Дополнительные параметры

    +

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

    Чтобы удалить вставленное изображение, щелкните по нему и нажмите клавишу Delete.

    diff --git a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/SortData.htm b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/SortData.htm index 1a733f32b..796cd4a5a 100644 --- a/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/SortData.htm +++ b/apps/spreadsheeteditor/main/resources/help/ru/UsageInstructions/SortData.htm @@ -18,18 +18,32 @@

    Для сортировки данных:

      -
    1. выделите диапазон ячеек, который требуется отсортировать,
    2. +
    3. выделите диапазон ячеек, который требуется отсортировать (можно выделить отдельную ячейку в диапазоне, чтобы отсортировать весь диапазон),
    4. щелкните по значку Сортировка по возрастанию Значок Сортировка по возрастанию, расположенному на верхней панели инструментов, для сортировки данных в порядке возрастания,
      ИЛИ
      щелкните по значку Сортировка по убыванию Значок Сортировка по убыванию, расположенному на верхней панели инструментов, для сортировки данных в порядке убывания.
    +

    Примечание: если вы выделите отдельный столбец/строку в диапазоне ячеек или часть строки/столбца, вам будет предложено выбрать, хотите ли вы расширить выделенный диапазон, чтобы включить смежные ячейки, или отсортировать только выделенные данные.

    Данные также можно сортировать, используя команды контекстного меню. Щелкните правой кнопкой мыши по выделенному диапазону ячеек, выберите в меню команду Сортировка, а затем выберите из подменю опцию По возрастанию или По убыванию.

    +

    С помощью контекстного меню данные можно также отсортировать по цвету:

    +
      +
    1. щелкните правой кнопкой мыши по ячейке, содержащей цвет, по которому требуется отсортировать данные,
    2. +
    3. выберите в меню команду Сортировка,
    4. +
    5. + выберите из подменю нужную опцию: +
        +
      • Сначала ячейки с выделенным цветом - чтобы отобразить записи с таким же цветом фона ячеек в верхней части столбца,
      • +
      • Сначала ячейки с выделенным шрифтом - чтобы отобразить записи с таким же цветом шрифта в верхней части столбца.
      • +
      +
    6. +
    +

    Фильтрация данных

    Чтобы отобразить только те строки, которые соответствуют определенным критериям, и скрыть остальные, воспользуйтесь Фильтром.

    Чтобы включить фильтр:
      -
    1. Выделите диапазон ячеек, содержащих данные, которые требуется отфильтровать,
    2. +
    3. Выделите диапазон ячеек, содержащих данные, которые требуется отфильтровать (можно выделить отдельную ячейку в диапазоне, чтобы отфильтровать весь диапазон),
    4. Щелкните по значку Фильтр Значок Фильтр, расположенному на верхней панели инструментов.

      В первой ячейке каждого столбца выделенного диапазона ячеек появится кнопка со стрелкой Кнопка со стрелкой. Это означает, что фильтр включен.

      @@ -83,7 +97,7 @@

      Фильтрация данных по цвету

    5. -

      В первой ячейке столбца появится кнопка Фильтр Кнопка Фильтр. Это означает, что фильтр применен.

      +

      В первой ячейке столбца появится кнопка Фильтр Кнопка Фильтр. Это означает, что фильтр применен. Количество отфильтрованых записей будет отображено в строке состояния.

    Сортировка отфильтрованных данных

    @@ -95,6 +109,11 @@
  • Сортировка по цвету шрифта - позволяет выбрать один из цветов и отобразить записи с таким же цветом шрифта в верхней части столбца.
  • Последние две команды можно использовать, если в диапазоне ячеек, который требуется отсортировать, есть ячейки, которые вы отформатировали, изменив цвет их фона или шрифта (вручную или с помощью готовых стилей).

    +

    Направление сортировки будет обозначено с помощью стрелки в кнопках фильтра.

    +

    Данные можно также быстро отсортировать по цвету с помощью команд контекстного меню:

    1. щелкните правой кнопкой мыши по ячейке, содержащей цвет, по которому требуется отсортировать данные,
    2. @@ -152,6 +171,10 @@
    3. Удалить строку, столбец (в зависимости от позиции курсора или выделения) или всю таблицу.
    4. Примечание: опции раздела Строки и столбцы также доступны из контекстного меню.

      +

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

      +

      Чтобы изменить дополнительные параметры таблицы, нажмите ссылку Дополнительные параметры на правой боковой панели. Откроется окно свойств таблицы:

      +

      Таблица - Дополнительные параметры

      +

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

      Повторное применение фильтра

      Если отфильтрованные данные были изменены, можно обновить фильтр, чтобы отобразить актуальный результат:

        diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/averageifs.png b/apps/spreadsheeteditor/main/resources/help/ru/images/averageifs.png new file mode 100644 index 000000000..5577c516d Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/ru/images/averageifs.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/chartwindow.png b/apps/spreadsheeteditor/main/resources/help/ru/images/chartwindow.png index de1521fe9..7e0a92f2d 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/ru/images/chartwindow.png and b/apps/spreadsheeteditor/main/resources/help/ru/images/chartwindow.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/chartwindow1.png b/apps/spreadsheeteditor/main/resources/help/ru/images/chartwindow1.png index 7d6b6b78b..f548c166c 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/ru/images/chartwindow1.png and b/apps/spreadsheeteditor/main/resources/help/ru/images/chartwindow1.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/chartwindow2.png b/apps/spreadsheeteditor/main/resources/help/ru/images/chartwindow2.png index b66d02cde..522a757ed 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/ru/images/chartwindow2.png and b/apps/spreadsheeteditor/main/resources/help/ru/images/chartwindow2.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/chartwindow3.png b/apps/spreadsheeteditor/main/resources/help/ru/images/chartwindow3.png index b0113f12d..e7aa7c688 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/ru/images/chartwindow3.png and b/apps/spreadsheeteditor/main/resources/help/ru/images/chartwindow3.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/chartwindow4.png b/apps/spreadsheeteditor/main/resources/help/ru/images/chartwindow4.png new file mode 100644 index 000000000..fdb31a631 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/ru/images/chartwindow4.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/countifs.png b/apps/spreadsheeteditor/main/resources/help/ru/images/countifs.png new file mode 100644 index 000000000..ddb04ddb8 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/ru/images/countifs.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/generalformat.png b/apps/spreadsheeteditor/main/resources/help/ru/images/generalformat.png index a8c1659c3..f5988f9cf 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/ru/images/generalformat.png and b/apps/spreadsheeteditor/main/resources/help/ru/images/generalformat.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/highesttolowest.png b/apps/spreadsheeteditor/main/resources/help/ru/images/highesttolowest.png new file mode 100644 index 000000000..b137e1a41 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/ru/images/highesttolowest.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/highesttolowest1.png b/apps/spreadsheeteditor/main/resources/help/ru/images/highesttolowest1.png new file mode 100644 index 000000000..278e4bed7 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/ru/images/highesttolowest1.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/imageadvancedsettings.png b/apps/spreadsheeteditor/main/resources/help/ru/images/imageadvancedsettings.png new file mode 100644 index 000000000..9d3c94f57 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/ru/images/imageadvancedsettings.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/imagesettings.png b/apps/spreadsheeteditor/main/resources/help/ru/images/imagesettings.png index 38e8ee529..09ae2d5a2 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/ru/images/imagesettings.png and b/apps/spreadsheeteditor/main/resources/help/ru/images/imagesettings.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/lowesttohighest.png b/apps/spreadsheeteditor/main/resources/help/ru/images/lowesttohighest.png new file mode 100644 index 000000000..69b35cb48 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/ru/images/lowesttohighest.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/lowesttohighest1.png b/apps/spreadsheeteditor/main/resources/help/ru/images/lowesttohighest1.png new file mode 100644 index 000000000..af73ce603 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/ru/images/lowesttohighest1.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/numberformatwindow.png b/apps/spreadsheeteditor/main/resources/help/ru/images/numberformatwindow.png new file mode 100644 index 000000000..660f3c48d Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/ru/images/numberformatwindow.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/pastespecial.png b/apps/spreadsheeteditor/main/resources/help/ru/images/pastespecial.png new file mode 100644 index 000000000..510b53737 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/ru/images/pastespecial.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/pastespecialbutton.png b/apps/spreadsheeteditor/main/resources/help/ru/images/pastespecialbutton.png new file mode 100644 index 000000000..8feb3c534 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/ru/images/pastespecialbutton.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/right_sparkline.png b/apps/spreadsheeteditor/main/resources/help/ru/images/right_sparkline.png index a60f2f7f3..add9921b0 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/ru/images/right_sparkline.png and b/apps/spreadsheeteditor/main/resources/help/ru/images/right_sparkline.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/shape_properties.png b/apps/spreadsheeteditor/main/resources/help/ru/images/shape_properties.png index 184045006..8e76b378d 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/ru/images/shape_properties.png and b/apps/spreadsheeteditor/main/resources/help/ru/images/shape_properties.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/shape_properties_1.png b/apps/spreadsheeteditor/main/resources/help/ru/images/shape_properties_1.png index 5a580f649..d2c83197e 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/ru/images/shape_properties_1.png and b/apps/spreadsheeteditor/main/resources/help/ru/images/shape_properties_1.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/shape_properties_2.png b/apps/spreadsheeteditor/main/resources/help/ru/images/shape_properties_2.png index d68478383..5335ecc7a 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/ru/images/shape_properties_2.png and b/apps/spreadsheeteditor/main/resources/help/ru/images/shape_properties_2.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/shape_properties_3.png b/apps/spreadsheeteditor/main/resources/help/ru/images/shape_properties_3.png index 8513882ac..e5baeba3c 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/ru/images/shape_properties_3.png and b/apps/spreadsheeteditor/main/resources/help/ru/images/shape_properties_3.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/sparklinewindow.png b/apps/spreadsheeteditor/main/resources/help/ru/images/sparklinewindow.png index a62fb9b21..2caf706d7 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/ru/images/sparklinewindow.png and b/apps/spreadsheeteditor/main/resources/help/ru/images/sparklinewindow.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/sparklinewindow2.png b/apps/spreadsheeteditor/main/resources/help/ru/images/sparklinewindow2.png index 58e5e385e..ad77460db 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/ru/images/sparklinewindow2.png and b/apps/spreadsheeteditor/main/resources/help/ru/images/sparklinewindow2.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/tableadvancedsettings.png b/apps/spreadsheeteditor/main/resources/help/ru/images/tableadvancedsettings.png new file mode 100644 index 000000000..f393a6eb9 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/help/ru/images/tableadvancedsettings.png differ diff --git a/apps/spreadsheeteditor/main/resources/help/ru/images/tablesettingstab.png b/apps/spreadsheeteditor/main/resources/help/ru/images/tablesettingstab.png index d12a9fa88..179684c25 100644 Binary files a/apps/spreadsheeteditor/main/resources/help/ru/images/tablesettingstab.png and b/apps/spreadsheeteditor/main/resources/help/ru/images/tablesettingstab.png differ diff --git a/apps/spreadsheeteditor/main/resources/img/toolbar/bullets-and-numbering.png b/apps/spreadsheeteditor/main/resources/img/toolbar/bullets-and-numbering.png new file mode 100644 index 000000000..7831c5018 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/img/toolbar/bullets-and-numbering.png differ diff --git a/apps/spreadsheeteditor/main/resources/img/toolbar/bullets-and-numbering@2x.png b/apps/spreadsheeteditor/main/resources/img/toolbar/bullets-and-numbering@2x.png new file mode 100644 index 000000000..2839461c1 Binary files /dev/null and b/apps/spreadsheeteditor/main/resources/img/toolbar/bullets-and-numbering@2x.png differ diff --git a/apps/spreadsheeteditor/main/resources/less/layout.less b/apps/spreadsheeteditor/main/resources/less/layout.less index 0e15cd67b..5ba12c1da 100644 --- a/apps/spreadsheeteditor/main/resources/less/layout.less +++ b/apps/spreadsheeteditor/main/resources/less/layout.less @@ -55,6 +55,10 @@ label { border-top: 1px solid @gray-dark; border-left: 1px solid @gray-dark; } + + .layout-resizer { + background-color: transparent; + } } .tooltip.main-info { diff --git a/apps/spreadsheeteditor/main/resources/less/toolbar.less b/apps/spreadsheeteditor/main/resources/less/toolbar.less index f961ffbb8..37362c248 100644 --- a/apps/spreadsheeteditor/main/resources/less/toolbar.less +++ b/apps/spreadsheeteditor/main/resources/less/toolbar.less @@ -265,4 +265,10 @@ z-index: @zindex-dropdown - 20; background-color: @gray-light; border: 1px solid @gray; +} + +.item-markerlist { + .background-ximage('@{app-image-path}/toolbar/bullets-and-numbering.png', '@{app-image-path}/toolbar/bullets-and-numbering@2x.png', 38px); + width: 38px; + height: 38px; } \ No newline at end of file diff --git a/apps/spreadsheeteditor/mobile/app-dev.js b/apps/spreadsheeteditor/mobile/app-dev.js index 70e500048..ead495523 100644 --- a/apps/spreadsheeteditor/mobile/app-dev.js +++ b/apps/spreadsheeteditor/mobile/app-dev.js @@ -51,9 +51,6 @@ require.config({ text : '../vendor/requirejs-text/text', xregexp : '../vendor/xregexp/xregexp-all-min', sockjs : '../vendor/sockjs/sockjs.min', - jszip : '../vendor/jszip/jszip.min', - jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', api : 'api/documents/api', core : 'common/main/lib/core/application', extendes : 'common/mobile/utils/extendes', @@ -100,9 +97,6 @@ require([ 'analytics', 'gateway', 'locale', - 'jszip', - 'jsziputils', - 'jsrsasign', 'sockjs' ], function (Backbone, Framework7) { Backbone.history.start(); diff --git a/apps/spreadsheeteditor/mobile/app.js b/apps/spreadsheeteditor/mobile/app.js index 518035953..fd4cd8d79 100644 --- a/apps/spreadsheeteditor/mobile/app.js +++ b/apps/spreadsheeteditor/mobile/app.js @@ -51,9 +51,6 @@ require.config({ text : '../vendor/requirejs-text/text', xregexp : '../vendor/xregexp/xregexp-all-min', sockjs : '../vendor/sockjs/sockjs.min', - jszip : '../vendor/jszip/jszip.min', - jsziputils : '../vendor/jszip-utils/jszip-utils.min', - jsrsasign : '../vendor/jsrsasign/jsrsasign-latest-all-min', allfonts : '../../sdkjs/common/AllFonts', sdk : '../../sdkjs/cell/sdk-all-min', api : 'api/documents/api', @@ -80,10 +77,7 @@ require.config({ 'underscore', 'allfonts', 'xregexp', - 'sockjs', - 'jszip', - 'jsziputils', - 'jsrsasign' + 'sockjs' ] }, backbone: { diff --git a/apps/spreadsheeteditor/mobile/app/controller/CellEditor.js b/apps/spreadsheeteditor/mobile/app/controller/CellEditor.js index 8fa9593c4..08fad6980 100644 --- a/apps/spreadsheeteditor/mobile/app/controller/CellEditor.js +++ b/apps/spreadsheeteditor/mobile/app/controller/CellEditor.js @@ -177,7 +177,7 @@ define([ }, onInsertFunction: function() { - if (this.mode == 'edit') { + if (this.mode.isEdit) { SSE.getController('AddContainer').showModal({ panel: 'function', button: '#ce-function' diff --git a/apps/spreadsheeteditor/mobile/app/controller/DocumentHolder.js b/apps/spreadsheeteditor/mobile/app/controller/DocumentHolder.js index 02fdd98dd..6651aaaf3 100644 --- a/apps/spreadsheeteditor/mobile/app/controller/DocumentHolder.js +++ b/apps/spreadsheeteditor/mobile/app/controller/DocumentHolder.js @@ -85,7 +85,7 @@ define([ }, setMode: function (mode) { - _isEdit = ('edit' === mode); + _isEdit = mode.isEdit; }, // When our application is ready, lets get started diff --git a/apps/spreadsheeteditor/mobile/app/controller/Main.js b/apps/spreadsheeteditor/mobile/app/controller/Main.js index 82d129827..baaea94bd 100644 --- a/apps/spreadsheeteditor/mobile/app/controller/Main.js +++ b/apps/spreadsheeteditor/mobile/app/controller/Main.js @@ -228,11 +228,11 @@ define([ setMode: function(mode){ var me = this; - Common.SharedSettings.set('mode', mode); + Common.SharedSettings.set('mode', mode.isEdit ? 'edit' : 'view'); if ( me.api ) { - me.api.asc_enableKeyEvents(mode == 'edit'); - me.api.asc_setViewMode(mode != 'edit'); + me.api.asc_enableKeyEvents(mode.isEdit); + me.api.asc_setViewMode(!mode.isEdit); } }, @@ -453,7 +453,7 @@ define([ /** coauthoring begin **/ value = Common.localStorage.getItem("sse-settings-livecomment"); this.isLiveCommenting = !(value!==null && parseInt(value) == 0); - this.isLiveCommenting?this.api.asc_showComments():this.api.asc_hideComments(); + this.isLiveCommenting?this.api.asc_showComments(true):this.api.asc_hideComments(); if (this.appOptions.isEdit && this.appOptions.canLicense && !this.appOptions.isOffline && this.appOptions.canCoAuthoring) { value = Common.localStorage.getItem("sse-settings-coauthmode"); @@ -614,7 +614,7 @@ define([ _.each(me.getApplication().controllers, function(controller) { if (controller && _.isFunction(controller.setMode)) { - controller.setMode(me.editorConfig.mode); + controller.setMode(me.appOptions); } }); @@ -676,7 +676,7 @@ define([ message: [msg.msg.charAt(0).toUpperCase() + msg.msg.substring(1)] }); - Common.component.Analytics.trackEvent('External Error', msg.title); + Common.component.Analytics.trackEvent('External Error'); } }, @@ -786,6 +786,7 @@ define([ case Asc.c_oAscError.ID.FrmlOperandExpected: config.msg = this.errorOperandExpected; + config.closable = true; break; case Asc.c_oAscError.ID.VKeyEncrypt: @@ -875,6 +876,7 @@ define([ case Asc.c_oAscError.ID.FrmlWrongReferences: config.msg = this.errorFrmlWrongReferences; + config.closable = true; break; case Asc.c_oAscError.ID.CopyMultiselectAreaError: diff --git a/apps/spreadsheeteditor/mobile/app/controller/Statusbar.js b/apps/spreadsheeteditor/mobile/app/controller/Statusbar.js index 28da2f85a..57e605ddd 100644 --- a/apps/spreadsheeteditor/mobile/app/controller/Statusbar.js +++ b/apps/spreadsheeteditor/mobile/app/controller/Statusbar.js @@ -112,7 +112,7 @@ define([ setMode: function(mode) { this.statusbar.setMode(mode); - this.isEdit = mode == 'edit'; + this.isEdit = mode.isEdit; }, /* diff --git a/apps/spreadsheeteditor/mobile/app/controller/add/AddFunction.js b/apps/spreadsheeteditor/mobile/app/controller/add/AddFunction.js index e44925767..eb584ee89 100644 --- a/apps/spreadsheeteditor/mobile/app/controller/add/AddFunction.js +++ b/apps/spreadsheeteditor/mobile/app/controller/add/AddFunction.js @@ -87,6 +87,7 @@ define([ _.defer(function () { var editorLang = SSE.getController("Main").editorConfig.lang; + editorLang = (editorLang ? editorLang : 'en').split("-")[0].toLowerCase(); var localizationFunctions = function(data) { fc = data; @@ -134,8 +135,8 @@ define([ type: _name, group: groupname, caption: func.asc_getLocaleName(), - args: jsonDesc[_name].a || '', - descr: jsonDesc[_name].d || '' + args: (jsonDesc && jsonDesc[_name]) ? jsonDesc[_name].a : '', + descr: (jsonDesc && jsonDesc[_name]) ? jsonDesc[_name].d : '' }; } } diff --git a/apps/spreadsheeteditor/mobile/app/controller/edit/EditCell.js b/apps/spreadsheeteditor/mobile/app/controller/edit/EditCell.js index 14e829717..c643f8edb 100644 --- a/apps/spreadsheeteditor/mobile/app/controller/edit/EditCell.js +++ b/apps/spreadsheeteditor/mobile/app/controller/edit/EditCell.js @@ -107,7 +107,7 @@ define([ }, setMode: function (mode) { - _isEdit = ('edit' === mode); + _isEdit = mode.isEdit; }, onLaunch: function () { diff --git a/apps/spreadsheeteditor/mobile/app/controller/edit/EditChart.js b/apps/spreadsheeteditor/mobile/app/controller/edit/EditChart.js index 09371e246..ffd5e4606 100644 --- a/apps/spreadsheeteditor/mobile/app/controller/edit/EditChart.js +++ b/apps/spreadsheeteditor/mobile/app/controller/edit/EditChart.js @@ -117,7 +117,7 @@ define([ }, setMode: function (mode) { - _isEdit = ('edit' === mode); + _isEdit = mode.isEdit; }, onLaunch: function () { diff --git a/apps/spreadsheeteditor/mobile/app/controller/edit/EditImage.js b/apps/spreadsheeteditor/mobile/app/controller/edit/EditImage.js index f96c0454d..7892bc0c6 100644 --- a/apps/spreadsheeteditor/mobile/app/controller/edit/EditImage.js +++ b/apps/spreadsheeteditor/mobile/app/controller/edit/EditImage.js @@ -81,7 +81,7 @@ define([ }, setMode: function (mode) { - _isEdit = ('edit' === mode); + _isEdit = mode.isEdit; }, onPageShow: function (view, pageId) { diff --git a/apps/spreadsheeteditor/mobile/app/controller/edit/EditShape.js b/apps/spreadsheeteditor/mobile/app/controller/edit/EditShape.js index 824564a7d..6fba05b2c 100644 --- a/apps/spreadsheeteditor/mobile/app/controller/edit/EditShape.js +++ b/apps/spreadsheeteditor/mobile/app/controller/edit/EditShape.js @@ -110,7 +110,7 @@ define([ }, setMode: function (mode) { - _isEdit = ('edit' === mode); + _isEdit = mode.isEdit; }, onPageShow: function (view, pageId) { diff --git a/apps/spreadsheeteditor/mobile/app/controller/edit/EditText.js b/apps/spreadsheeteditor/mobile/app/controller/edit/EditText.js index 0b9dfd6b5..08f41ec1b 100644 --- a/apps/spreadsheeteditor/mobile/app/controller/edit/EditText.js +++ b/apps/spreadsheeteditor/mobile/app/controller/edit/EditText.js @@ -85,7 +85,7 @@ define([ }, setMode: function (mode) { - _isEdit = ('edit' === mode); + _isEdit = mode.isEdit; }, onPageShow: function (view, pageId) { diff --git a/apps/spreadsheeteditor/mobile/app/template/AddOther.template b/apps/spreadsheeteditor/mobile/app/template/AddOther.template index b3f467468..f20d083e8 100644 --- a/apps/spreadsheeteditor/mobile/app/template/AddOther.template +++ b/apps/spreadsheeteditor/mobile/app/template/AddOther.template @@ -82,12 +82,13 @@
        -
        <%= scope.textAddress %>
        + <% if (!android) { %>
        <%= scope.textAddress %>
        <% } %>
        ', '<% }); %>' - ].join(''), { + ].join(''))({ styles: styles, styleSize: styleSize }); diff --git a/apps/spreadsheeteditor/mobile/app/view/edit/EditChart.js b/apps/spreadsheeteditor/mobile/app/view/edit/EditChart.js index dadda1dc3..e1ed91813 100644 --- a/apps/spreadsheeteditor/mobile/app/view/edit/EditChart.js +++ b/apps/spreadsheeteditor/mobile/app/view/edit/EditChart.js @@ -160,7 +160,7 @@ define([ '<% }); %>', '', '<% }); %>' - ].join(''), { + ].join(''))({ styles: styles }); diff --git a/apps/spreadsheeteditor/sdk_dev_scripts.js b/apps/spreadsheeteditor/sdk_dev_scripts.js index 731ff6002..ed9644d13 100644 --- a/apps/spreadsheeteditor/sdk_dev_scripts.js +++ b/apps/spreadsheeteditor/sdk_dev_scripts.js @@ -37,6 +37,7 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/Drawings/Format/Format.js", "../../../../sdkjs/common/Drawings/Format/GraphicObjectBase.js", "../../../../sdkjs/common/Drawings/Format/Shape.js", + "../../../../sdkjs/common/Drawings/Format/CnxShape.js", "../../../../sdkjs/common/Drawings/Format/Path.js", "../../../../sdkjs/common/Drawings/Format/Image.js", "../../../../sdkjs/common/Drawings/Format/GroupShape.js", @@ -56,6 +57,7 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/Drawings/TrackObjects/ResizeTracks.js", "../../../../sdkjs/common/Drawings/TrackObjects/RotateTracks.js", "../../../../sdkjs/common/Drawings/TrackObjects/Spline.js", + "../../../../sdkjs/common/Drawings/TrackObjects/ConnectorTrack.js", "../../../../sdkjs/common/Drawings/DrawingObjectsHandlers.js", "../../../../sdkjs/common/Drawings/TextDrawer.js", "../../../../sdkjs/common/Drawings/Externals.js", @@ -118,10 +120,12 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/common/Private/license.js", "../../../../sdkjs/cell/Private/comments.js", "../../../../sdkjs/word/Editor/Common.js", + "../../../../sdkjs/word/Editor/DocumentContentElementBase.js", "../../../../sdkjs/word/Editor/Comments.js", "../../../../sdkjs/word/Editor/CommentsChanges.js", "../../../../sdkjs/word/Editor/Styles.js", "../../../../sdkjs/word/Editor/StylesChanges.js", + "../../../../sdkjs/word/Editor/RevisionsChange.js", "../../../../sdkjs/word/Editor/ParagraphContent.js", "../../../../sdkjs/word/Editor/Paragraph/ParaTextPr.js", "../../../../sdkjs/word/Editor/Paragraph/ParaTextPrChanges.js", @@ -162,6 +166,10 @@ var sdk_dev_scrpipts = [ "../../../../sdkjs/word/Editor/Table/TableRowChanges.js", "../../../../sdkjs/word/Editor/Table/TableCell.js", "../../../../sdkjs/word/Editor/Table/TableCellChanges.js", + "../../../../sdkjs/word/Editor/StructuredDocumentTags/BlockLevel.js", + "../../../../sdkjs/word/Editor/StructuredDocumentTags/InlineLevel.js", + "../../../../sdkjs/word/Editor/StructuredDocumentTags/SdtPr.js", + "../../../../sdkjs/word/Editor/StructuredDocumentTags/SdtPrChanges.js", "../../../../sdkjs/word/Editor/Serialize2.js", "../../../../sdkjs/word/Editor/Spelling.js", "../../../../sdkjs/word/Editor/Footnotes.js", diff --git a/build/Gruntfile.js b/build/Gruntfile.js index 05a499ce5..e4021d4b2 100644 --- a/build/Gruntfile.js +++ b/build/Gruntfile.js @@ -114,7 +114,6 @@ module.exports = function(grunt) { doRegisterTask('bootstrap'); doRegisterTask('jszip'); doRegisterTask('jsziputils'); - doRegisterTask('jsrsasign'); doRegisterTask('requirejs', function(defaultConfig, packageFile) { return { uglify: { @@ -374,7 +373,6 @@ module.exports = function(grunt) { grunt.registerTask('deploy-bootstrap', ['bootstrap-init', 'clean', 'copy']); grunt.registerTask('deploy-jszip', ['jszip-init', 'clean', 'copy']); grunt.registerTask('deploy-jsziputils', ['jsziputils-init', 'clean', 'copy']); - grunt.registerTask('deploy-jsrsasign', ['jsrsasign-init', 'clean', 'copy']); grunt.registerTask('deploy-requirejs', ['requirejs-init', 'clean', 'uglify']); grunt.registerTask('deploy-app-main', ['main-app-init', 'clean', 'imagemin', 'less', 'requirejs', 'concat', diff --git a/build/common.json b/build/common.json index c5fc67f31..0a7255f78 100644 --- a/build/common.json +++ b/build/common.json @@ -162,17 +162,6 @@ } } }, - "jsrsasign": { - "clean": [ - "../deploy/web-apps/vendor/jsrsasign" - ], - "copy": { - "script": { - "src": "../vendor/jsrsasign/jsrsasign-latest-all-min.js", - "dest": "../deploy/web-apps/vendor/jsrsasign/jsrsasign-latest-all-min.js" - } - } - }, "underscore": { "clean": [ "../deploy/web-apps/vendor/underscore" @@ -206,8 +195,7 @@ "deploy-underscore", "deploy-bootstrap", "deploy-jszip", - "deploy-jsziputils", - "deploy-jsrsasign" + "deploy-jsziputils" ] } } \ No newline at end of file diff --git a/build/documenteditor.json b/build/documenteditor.json index a9ee525c2..ac7be5be4 100644 --- a/build/documenteditor.json +++ b/build/documenteditor.json @@ -30,7 +30,6 @@ "sockjs": "empty:", "jszip": "empty:", "jszip-utils": "empty:", - "jsrsasign": "empty:", "coapisettings": "empty:", "allfonts": "empty:", "sdk": "empty:", @@ -85,8 +84,7 @@ "xregexp", "sockjs", "jszip", - "jszip-utils", - "jsrsasign" + "jszip-utils" ] }, "gateway": { @@ -197,7 +195,6 @@ "sockjs": "empty:", "jszip": "empty:", "jszip-utils": "empty:", - "jsrsasign": "empty:", "coapisettings": "empty:", "allfonts": "empty:", "sdk": "empty:", @@ -255,8 +252,7 @@ "xregexp", "sockjs", "jszip", - "jszip-utils", - "jsrsasign" + "jszip-utils" ] }, "gateway": { diff --git a/build/presentationeditor.json b/build/presentationeditor.json index 7073edbb6..b3512c847 100644 --- a/build/presentationeditor.json +++ b/build/presentationeditor.json @@ -30,7 +30,6 @@ "sockjs": "empty:", "jszip": "empty:", "jszip-utils": "empty:", - "jsrsasign": "empty:", "coapisettings": "empty:", "allfonts": "empty:", "sdk": "empty:", @@ -85,8 +84,7 @@ "xregexp", "sockjs", "jszip", - "jszip-utils", - "jsrsasign" + "jszip-utils" ] }, "gateway": { @@ -197,7 +195,6 @@ "sockjs": "empty:", "jszip": "empty:", "jszip-utils": "empty:", - "jsrsasign": "empty:", "coapisettings": "empty:", "allfonts": "empty:", "sdk": "empty:", @@ -255,8 +252,7 @@ "xregexp", "sockjs", "jszip", - "jszip-utils", - "jsrsasign" + "jszip-utils" ] }, "gateway": { diff --git a/build/spreadsheeteditor.json b/build/spreadsheeteditor.json index e3655845b..2ff9bd594 100644 --- a/build/spreadsheeteditor.json +++ b/build/spreadsheeteditor.json @@ -30,7 +30,6 @@ "sockjs": "empty:", "jszip": "empty:", "jszip-utils": "empty:", - "jsrsasign": "empty:", "coapisettings": "empty:", "allfonts": "empty:", "sdk": "empty:", @@ -85,8 +84,7 @@ "xregexp", "sockjs", "jszip", - "jszip-utils", - "jsrsasign" + "jszip-utils" ] }, "gateway": { @@ -208,7 +206,6 @@ "sockjs": "empty:", "jszip": "empty:", "jszip-utils": "empty:", - "jsrsasign": "empty:", "coapisettings": "empty:", "allfonts": "empty:", "sdk": "empty:", @@ -266,8 +263,7 @@ "xregexp", "sockjs", "jszip", - "jszip-utils", - "jsrsasign" + "jszip-utils" ] }, "gateway": { diff --git a/vendor/jquery/README.md b/vendor/jquery/README.md index 328064b7b..92dfef0e6 100644 --- a/vendor/jquery/README.md +++ b/vendor/jquery/README.md @@ -1,7 +1,9 @@ jQuery Component ================ -Shim repository for the [jQuery](http://jquery.com). +Shim [repository](https://github.com/components/jquery) for the [jQuery](http://jquery.com). + +If you're looking for jquery-migrate: It got it's [own repository](https://github.com/components/jquery-migrate) since jQuery v3.0.0. Package Managers ---------------- @@ -9,3 +11,4 @@ Package Managers * [Bower](http://bower.io/): `jquery` * [Component](https://github.com/component/component): `components/jquery` * [Composer](http://packagist.org/packages/components/jquery): `components/jquery` +* [spm](http://spmjs.io/package/jquery): `jquery` diff --git a/vendor/jquery/bower.json b/vendor/jquery/bower.json index 2fa650fc5..a03804338 100644 --- a/vendor/jquery/bower.json +++ b/vendor/jquery/bower.json @@ -1,11 +1,16 @@ { - "name": "jquery", - "version": "2.0.3", - "description": "jQuery component", - "keywords": [ - "jquery", - "component" - ], - "main": "jquery.js", - "license": "MIT" + "name": "jquery", + "version": "3.2.1", + "description": "jQuery component", + "license": "MIT", + "keywords": [ + "jquery", + "component" + ], + "main": "jquery.js", + "ignore": [ + "component.json", + "package.json", + "composer.json" + ] } diff --git a/vendor/jquery/component.json b/vendor/jquery/component.json index cf834a301..0716b0a5d 100644 --- a/vendor/jquery/component.json +++ b/vendor/jquery/component.json @@ -1,15 +1,22 @@ { - "name": "jquery", - "repo": "components/jquery", - "version": "2.0.3", - "description": "jQuery component", - "keywords": [ - "jquery", - "component" - ], - "main": "jquery.js", - "scripts": [ - "jquery.js" - ], - "license": "MIT" + "name": "jquery", + "repo": "components/jquery", + "version": "3.2.1", + "description": "jQuery component", + "license": "MIT", + "keywords": [ + "jquery", + "component" + ], + "main": "jquery.js", + "scripts": [ + "jquery.js", + "jquery.min.js", + "jquery.slim.js", + "jquery.slim.min.js" + ], + "files": [ + "jquery.min.map", + "jquery.slim.min.map" + ] } diff --git a/vendor/jquery/composer.json b/vendor/jquery/composer.json index c61784062..8a779adb8 100644 --- a/vendor/jquery/composer.json +++ b/vendor/jquery/composer.json @@ -6,20 +6,17 @@ "license": "MIT", "support": { "irc": "irc://irc.freenode.org/jquery", - "issues": "http://bugs.jquery.com", + "issues": "https://github.com/jquery/jquery/issues", "forum": "http://forum.jquery.com", "wiki": "http://docs.jquery.com/", "source": "https://github.com/jquery/jquery" }, "authors": [ { - "name": "John Resig", - "email": "jeresig@gmail.com" + "name": "JS Foundation and other contributors", + "url": "https://github.com/jquery/jquery/blob/master/AUTHORS.txt" } ], - "require": { - "robloach/component-installer": "*" - }, "extra": { "component": { "scripts": [ @@ -27,8 +24,10 @@ ], "files": [ "jquery.min.js", - "jquery-migrate.js", - "jquery-migrate.min.js" + "jquery.min.map", + "jquery.slim.js", + "jquery.slim.min.js", + "jquery.slim.min.map" ] } } diff --git a/vendor/jquery/jquery-migrate.js b/vendor/jquery/jquery-migrate.js index 89437ebed..05b1a803c 100644 --- a/vendor/jquery/jquery-migrate.js +++ b/vendor/jquery/jquery-migrate.js @@ -1,30 +1,47 @@ /*! - * jQuery Migrate - v1.4.1 - 2016-05-19 + * jQuery Migrate - v3.0.0 - 2016-06-09 * Copyright jQuery Foundation and other contributors */ -(function( jQuery, window, undefined ) { -// See http://bugs.jquery.com/ticket/13335 -// "use strict"; +(function( jQuery, window ) { +"use strict"; -jQuery.migrateVersion = "1.4.1"; +jQuery.migrateVersion = "3.0.0"; +( function() { + + // Support: IE9 only + // IE9 only creates console object when dev tools are first opened + // Also, avoid Function#bind here to simplify PhantomJS usage + var log = window.console && window.console.log && + function() { window.console.log.apply( window.console, arguments ); }, + rbadVersions = /^[12]\./; + + if ( !log ) { + return; + } + + // Need jQuery 3.0.0+ and no older Migrate loaded + if ( !jQuery || rbadVersions.test( jQuery.fn.jquery ) ) { + log( "JQMIGRATE: jQuery 3.0.0+ REQUIRED" ); + } + if ( jQuery.migrateWarnings ) { + log( "JQMIGRATE: Migrate plugin loaded multiple times" ); + } + + // Show a message on the console so devs know we're active + log( "JQMIGRATE: Migrate is installed" + + ( jQuery.migrateMute ? "" : " with logging active" ) + + ", version " + jQuery.migrateVersion ); + +} )(); + var warnedAbout = {}; // List of warnings already given; public read only jQuery.migrateWarnings = []; -// Set to true to prevent console output; migrateWarnings still maintained -// jQuery.migrateMute = false; - -// Show a message on the console so devs know we're active -if ( window.console && window.console.log ) { - window.console.log( "JQMIGRATE: Migrate is installed" + - ( jQuery.migrateMute ? "" : " with logging active" ) + - ", version " + jQuery.migrateVersion ); -} - // Set to false to disable traces that appear with warnings if ( jQuery.migrateTrace === undefined ) { jQuery.migrateTrace = true; @@ -36,7 +53,7 @@ jQuery.migrateReset = function() { jQuery.migrateWarnings.length = 0; }; -function migrateWarn( msg) { +function migrateWarn( msg ) { var console = window.console; if ( !warnedAbout[ msg ] ) { warnedAbout[ msg ] = true; @@ -51,209 +68,40 @@ function migrateWarn( msg) { } function migrateWarnProp( obj, prop, value, msg ) { - if ( Object.defineProperty ) { - // On ES5 browsers (non-oldIE), warn if the code tries to get prop; - // allow property to be overwritten in case some other plugin wants it - try { - Object.defineProperty( obj, prop, { - configurable: true, - enumerable: true, - get: function() { - migrateWarn( msg ); - return value; - }, - set: function( newValue ) { - migrateWarn( msg ); - value = newValue; - } - }); - return; - } catch( err ) { - // IE8 is a dope about Object.defineProperty, can't warn there + Object.defineProperty( obj, prop, { + configurable: true, + enumerable: true, + get: function() { + migrateWarn( msg ); + return value; } - } - - // Non-ES5 (or broken) browser; just set the property - jQuery._definePropertyBroken = true; - obj[ prop ] = value; + } ); } if ( document.compatMode === "BackCompat" ) { - // jQuery has never supported or tested Quirks Mode + + // JQuery has never supported or tested Quirks Mode migrateWarn( "jQuery is not compatible with Quirks Mode" ); } -var attrFn = jQuery( "", { size: 1 } ).attr("size") && jQuery.attrFn, - oldAttr = jQuery.attr, - valueAttrGet = jQuery.attrHooks.value && jQuery.attrHooks.value.get || - function() { return null; }, - valueAttrSet = jQuery.attrHooks.value && jQuery.attrHooks.value.set || - function() { return undefined; }, - rnoType = /^(?:input|button)$/i, - rnoAttrNodeType = /^[238]$/, - rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i, - ruseDefault = /^(?:checked|selected)$/i; - -// jQuery.attrFn -migrateWarnProp( jQuery, "attrFn", attrFn || {}, "jQuery.attrFn is deprecated" ); - -jQuery.attr = function( elem, name, value, pass ) { - var lowerName = name.toLowerCase(), - nType = elem && elem.nodeType; - - if ( pass ) { - // Since pass is used internally, we only warn for new jQuery - // versions where there isn't a pass arg in the formal params - if ( oldAttr.length < 4 ) { - migrateWarn("jQuery.fn.attr( props, pass ) is deprecated"); - } - if ( elem && !rnoAttrNodeType.test( nType ) && - (attrFn ? name in attrFn : jQuery.isFunction(jQuery.fn[name])) ) { - return jQuery( elem )[ name ]( value ); - } - } - - // Warn if user tries to set `type`, since it breaks on IE 6/7/8; by checking - // for disconnected elements we don't warn on $( "
        \ - Powered by JSLitmus \ -
        '; - - /** - * The public API for creating and running tests - */ - window.JSLitmus = { - /** The list of all tests that have been registered with JSLitmus.test */ - _tests: [], - /** The queue of tests that need to be run */ - _queue: [], - - /** - * The parsed query parameters the current page URL. This is provided as a - * convenience for test functions - it's not used by JSLitmus proper - */ - params: {}, - - /** - * Initialize - */ - _init: function() { - // Parse query params into JSLitmus.params[] hash - var match = (location + '').match(/([^?#]*)(#.*)?$/); - if (match) { - var pairs = match[1].split('&'); - for (var i = 0; i < pairs.length; i++) { - var pair = pairs[i].split('='); - if (pair.length > 1) { - var key = pair.shift(); - var value = pair.length > 1 ? pair.join('=') : pair[0]; - this.params[key] = value; - } - } - } - - // Write out the stylesheet. We have to do this here because IE - // doesn't honor sheets written after the document has loaded. - document.write(STYLESHEET); - - // Setup the rest of the UI once the document is loaded - if (window.addEventListener) { - window.addEventListener('load', this._setup, false); - } else if (document.addEventListener) { - document.addEventListener('load', this._setup, false); - } else if (window.attachEvent) { - window.attachEvent('onload', this._setup); - } - - return this; - }, - - /** - * Set up the UI - */ - _setup: function() { - var el = jsl.$('jslitmus_container'); - if (!el) document.body.appendChild(el = document.createElement('div')); - - el.innerHTML = MARKUP; - - // Render the UI for all our tests - for (var i=0; i < JSLitmus._tests.length; i++) - JSLitmus.renderTest(JSLitmus._tests[i]); - }, - - /** - * (Re)render all the test results - */ - renderAll: function() { - for (var i = 0; i < JSLitmus._tests.length; i++) - JSLitmus.renderTest(JSLitmus._tests[i]); - JSLitmus.renderChart(); - }, - - /** - * (Re)render the chart graphics - */ - renderChart: function() { - var url = JSLitmus.chartUrl(); - jsl.$('chart_link').href = url; - jsl.$('chart_image').src = url; - jsl.$('chart').style.display = ''; - - // Update the tiny URL - jsl.$('tiny_url').src = 'http://tinyurl.com/api-create.php?url='+escape(url); - }, - - /** - * (Re)render the results for a specific test - */ - renderTest: function(test) { - // Make a new row if needed - if (!test._row) { - var trow = jsl.$('test_row_template'); - if (!trow) return; - - test._row = trow.cloneNode(true); - test._row.style.display = ''; - test._row.id = ''; - test._row.onclick = function() {JSLitmus._queueTest(test);}; - test._row.title = 'Run ' + test.name + ' test'; - trow.parentNode.appendChild(test._row); - test._row.cells[0].innerHTML = test.name; - } - - var cell = test._row.cells[1]; - var cns = [test.loopArg ? 'test_looping' : 'test_nonlooping']; - - if (test.error) { - cns.push('test_error'); - cell.innerHTML = - '
        ' + test.error + '
        ' + - '
        • ' + - jsl.join(test.error, ': ', '
        • ') + - '
        '; - } else { - if (test.running) { - cns.push('test_running'); - cell.innerHTML = 'running'; - } else if (jsl.indexOf(JSLitmus._queue, test) >= 0) { - cns.push('test_pending'); - cell.innerHTML = 'pending'; - } else if (test.count) { - cns.push('test_done'); - var hz = test.getHz(jsl.$('test_normalize').checked); - cell.innerHTML = hz != Infinity ? hz : '∞'; - } else { - cell.innerHTML = 'ready'; - } - } - cell.className = cns.join(' '); - }, - - /** - * Create a new test - */ - test: function(name, f) { - // Create the Test object - var test = new Test(name, f); - JSLitmus._tests.push(test); - - // Re-render if the test state changes - test.onChange = JSLitmus.renderTest; - - // Run the next test if this one finished - test.onStop = function(test) { - if (JSLitmus.onTestFinish) JSLitmus.onTestFinish(test); - JSLitmus.currentTest = null; - JSLitmus._nextTest(); - }; - - // Render the new test - this.renderTest(test); - }, - - /** - * Add all tests to the run queue - */ - runAll: function(e) { - e = e || window.event; - var reverse = e && e.shiftKey, len = JSLitmus._tests.length; - for (var i = 0; i < len; i++) { - JSLitmus._queueTest(JSLitmus._tests[!reverse ? i : (len - i - 1)]); - } - }, - - /** - * Remove all tests from the run queue. The current test has to finish on - * it's own though - */ - stop: function() { - while (JSLitmus._queue.length) { - var test = JSLitmus._queue.shift(); - JSLitmus.renderTest(test); - } - }, - - /** - * Run the next test in the run queue - */ - _nextTest: function() { - if (!JSLitmus.currentTest) { - var test = JSLitmus._queue.shift(); - if (test) { - jsl.$('stop_button').disabled = false; - JSLitmus.currentTest = test; - test.run(); - JSLitmus.renderTest(test); - if (JSLitmus.onTestStart) JSLitmus.onTestStart(test); - } else { - jsl.$('stop_button').disabled = true; - JSLitmus.renderChart(); - } - } - }, - - /** - * Add a test to the run queue - */ - _queueTest: function(test) { - if (jsl.indexOf(JSLitmus._queue, test) >= 0) return; - JSLitmus._queue.push(test); - JSLitmus.renderTest(test); - JSLitmus._nextTest(); - }, - - /** - * Generate a Google Chart URL that shows the data for all tests - */ - chartUrl: function() { - var n = JSLitmus._tests.length, markers = [], data = []; - var d, min = 0, max = -1e10; - var normalize = jsl.$('test_normalize').checked; - - // Gather test data - for (var i=0; i < JSLitmus._tests.length; i++) { - var test = JSLitmus._tests[i]; - if (test.count) { - var hz = test.getHz(normalize); - var v = hz != Infinity ? hz : 0; - data.push(v); - markers.push('t' + jsl.escape(test.name + '(' + jsl.toLabel(hz)+ ')') + ',000000,0,' + - markers.length + ',10'); - max = Math.max(v, max); - } - } - if (markers.length <= 0) return null; - - // Build chart title - var title = document.getElementsByTagName('title'); - title = (title && title.length) ? title[0].innerHTML : null; - var chart_title = []; - if (title) chart_title.push(title); - chart_title.push('Ops/sec (' + platform + ')'); - - // Build labels - var labels = [jsl.toLabel(min), jsl.toLabel(max)]; - - var w = 250, bw = 15; - var bs = 5; - var h = markers.length*(bw + bs) + 30 + chart_title.length*20; - - var params = { - chtt: escape(chart_title.join('|')), - chts: '000000,10', - cht: 'bhg', // chart type - chd: 't:' + data.join(','), // data set - chds: min + ',' + max, // max/min of data - chxt: 'x', // label axes - chxl: '0:|' + labels.join('|'), // labels - chsp: '0,1', - chm: markers.join('|'), // test names - chbh: [bw, 0, bs].join(','), // bar widths - // chf: 'bg,lg,0,eeeeee,0,eeeeee,.5,ffffff,1', // gradient - chs: w + 'x' + h - }; - return 'http://chart.apis.google.com/chart?' + jsl.join(params, '=', '&'); - } - }; - - JSLitmus._init(); -})(); \ No newline at end of file diff --git a/vendor/underscore/test/vendor/qunit-extras.js b/vendor/underscore/test/vendor/qunit-extras.js new file mode 100644 index 000000000..663d32489 --- /dev/null +++ b/vendor/underscore/test/vendor/qunit-extras.js @@ -0,0 +1,776 @@ +/*! + * QUnit Extras v1.4.1 + * Copyright 2011-2015 John-David Dalton + * Based on a gist by Jörn Zaefferer + * Available under MIT license + */ +;(function() { + + /** Used as a safe reference for `undefined` in pre ES5 environments. */ + var undefined; + + /** Used as a horizontal rule in console output. */ + var hr = '----------------------------------------'; + + /** Used for native method references. */ + var arrayProto = Array.prototype; + + /** Native method shortcut. */ + var push = arrayProto.push, + unshift = arrayProto.unshift; + + /** Used to match HTML entities. */ + var reEscapedHtml = /(&|<|>|"|')/g; + + /** Used to match parts of the assert message. */ + var reDied = /^Died on test #\d+/, + reMessage = /^([\s\S]*?)<\/span>/; + + /** Used to associate color names with their corresponding codes. */ + var ansiCodes = { + 'bold': 1, + 'green': 32, + 'magenta': 35, + 'red': 31 + }; + + /** Used to convert HTML entities to characters. */ + var htmlUnescapes = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + ''': "'" + }; + + /** Used to determine if values are of the language type Object. */ + var objectTypes = { + 'function': true, + 'object': true + }; + + /** Used as a reference to the global object. */ + var root = (objectTypes[typeof window] && window) || this; + + /** Detect free variable `exports`. */ + var freeExports = objectTypes[typeof exports] && exports && !exports.nodeType && exports; + + /** Detect free variable `module`. */ + var freeModule = objectTypes[typeof module] && module && !module.nodeType && module; + + /** Detect free variable `global` from Node.js or Browserified code and use it as `root`. */ + var freeGlobal = freeExports && freeModule && typeof global == 'object' && global; + if (freeGlobal && (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal || freeGlobal.self === freeGlobal)) { + root = freeGlobal; + } + + /*--------------------------------------------------------------------------*/ + + /** + * Checks if a given value is present in an array using strict equality + * for comparisons, i.e. `===`. + * + * @private + * @param {Array} array The array to iterate over. + * @param {*} value The value to check for. + * @returns {boolean} Returns `true` if the `value` is found, else `false`. + */ + function contains(array, value) { + var index = -1, + length = array ? array.length : 0; + + while (++index < length) { + if (array[index] === value) { + return true; + } + } + return false; + } + + /** + * Checks if `value` is the language type of `Object`. + * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) + * + * @private + * @param {*} value The value to check. + * @returns {boolean} Returns `true` if `value` is an object, else `false`. + */ + function isObject(value) { + var type = typeof value; + return type == 'function' || (value && type == 'object') || false; + } + + /** + * Creates a string with `text` repeated `n` number of times. + * + * @private + * @param {string} text The text to repeat. + * @param {number} n The number of times to repeat `text`. + * @returns {string} The created string. + */ + function repeat(text, n) { + return Array(n + 1).join(text); + } + + /** + * Resolves the value of property `key` on `object`. + * + * @private + * @param {Object} object The object to inspect. + * @param {string} key The name of the property to resolve. + * @returns {*} Returns the resolved value. + */ + function result(object, key) { + return object == null ? undefined : object[key]; + } + + /** + * Converts the HTML entities `&`, `<`, `>`, `"`, and `'` + * in `string` to their corresponding characters. + * + * @private + * @param {string} string The string to unescape. + * @returns {string} Returns the unescaped string. + */ + function unescape(string) { + return string == null ? '' : String(string).replace(reEscapedHtml, unescapeHtmlChar); + } + + /** + * Used by `unescape` to convert HTML entities to characters. + * + * @private + * @param {string} match The matched character to unescape. + * @returns {string} Returns the unescaped character. + */ + function unescapeHtmlChar(match) { + return htmlUnescapes[match]; + } + + /** + * Creates a function that provides `value` to the wrapper function as its + * first argument. Additional arguments provided to the function are appended + * to those provided to the wrapper function. The wrapper is executed with + * the `this` binding of the created function. + * + * @private + * @param {*} value The value to wrap. + * @param {Function} wrapper The wrapper function. + * @returns {Function} Returns the new function. + */ + function wrap(value, wrapper) { + return function() { + var args = [value]; + push.apply(args, arguments); + return wrapper.apply(this, args); + }; + } + + /*--------------------------------------------------------------------------*/ + + /** + * Installs the QUnit additions on the given `context` object. + * + * @memberOf exports + * @param {Object} context The context object. + */ + function runInContext(context) { + + /** Object references. */ + var phantom = context.phantom, + define = context.define, + document = !phantom && context.document, + process = phantom || context.process, + amd = define && define.amd, + console = context.console, + java = !document && context.java, + print = context.print, + require = context.require; + + /** Detects if running on Node.js. */ + var isNode = isObject(process) && typeof process.on == 'function'; + + /** Detects if running in a PhantomJS web page. */ + var isPhantomPage = typeof context.callPhantom == 'function'; + + /** Detects if QUnit Extras should log to the console. */ + var isSilent = document && !isPhantomPage; + + /** Used to indicate if running in Windows. */ + var isWindows = isNode && process.platform == 'win32'; + + /** Used to indicate if ANSI escape codes are supported. */ + var isAnsiSupported = (function() { + if (isNode && process.stdout && !process.stdout.isTTY) { + return false; + } + if (isWindows || getEnv('COLORTERM')) { + return true; + } + return /^(?:ansi|cygwin|linux|screen|xterm|vt100)$|color/i.test(getEnv('TERM')); + }()); + + /** Used to display the wait throbber. */ + var throbberDelay = 500, + waitCount = -1; + + /** Shorten `context.QUnit.QUnit` to `context.QUnit`. */ + var QUnit = context.QUnit = context.QUnit.QUnit || context.QUnit; + + /*------------------------------------------------------------------------*/ + + /** + * Schedules timer-based callbacks. + * + * @private + * @param {Function|string} fn The function to call. + * @param {number} delay The number of milliseconds to delay the `fn` call. + * @param {Array} args Arguments to invoke `fn` with. + * @param {boolean} repeated A flag to specify whether `fn` is called repeatedly. + * @returns {number} The ID of the timeout. + */ + function schedule(fn, delay, args, repeated) { + // Rhino 1.7RC4 will error assigning `task` below. + // See https://bugzilla.mozilla.org/show_bug.cgi?id=775566. + var task = ids[++counter] = new JavaAdapter(java.util.TimerTask, { + 'run': function() { + fn.apply(context, args); + } + }); + // Support non-functions. + if (typeof fn != 'function') { + fn = (function(code) { + code = String(code); + return function() { eval(code); }; + }(fn)); + } + // Used by `setInterval`. + if (repeated) { + timer.schedule(task, delay, delay); + } + // Used by `setTimeout`. + else { + timer.schedule(task, delay); + } + return counter; + } + + /** + * Clears the delay set by `setInterval` or `setTimeout`. + * + * @memberOf context + * @param {number} id The ID of the timeout to be cleared. + */ + function clearTimer(id) { + if (ids[id]) { + ids[id].cancel(); + timer.purge(); + delete ids[id]; + } + } + + /** + * Executes a code snippet or function repeatedly, with a delay between each call. + * + * @memberOf context + * @param {Function|string} fn The function to call or string to evaluate. + * @param {number} delay The number of milliseconds to delay each `fn` call. + * @param {...*} [args] Arguments to invoke `fn` with. + * @returns {number} The ID of the timeout. + */ + function setInterval(fn, delay) { + return schedule(fn, delay, slice.call(arguments, 2), true); + } + + /** + * Executes a code snippet or a function after specified delay. + * + * @memberOf context + * @param {Function|string} fn The function to call or string to evaluate. + * @param {number} delay The number of milliseconds to delay the `fn` call. + * @param {...*} [args] Arguments to invoke `fn` with. + * @returns {number} The ID of the timeout. + */ + function setTimeout(fn, delay) { + return schedule(fn, delay, slice.call(arguments, 2)); + } + + /*------------------------------------------------------------------------*/ + + /** + * Gets the environment variable value by a given name. + * + * @private + * @param {string} name The name of the environment variable to get. + * @returns {*} Returns the environment variable value. + */ + function getEnv(name) { + if (isNode) { + return process.env[name]; + } + if (java) { + return java.lang.System.getenv(name); + } + if (!amd && typeof require == 'function') { + try { + return require('system').env[name]; + } catch(e) {} + } + } + + /** + * Adds text color to the terminal output of `string`. + * + * @private + * @param {string} colorName The name of the color to add. + * @param {string} string The string to add colors to. + * @returns {string} Returns the colored string. + */ + function color(colorName, string) { + return isAnsiSupported + ? ('\x1B[' + ansiCodes[colorName] + 'm' + string + '\x1B[0m') + : string; + } + + /** + * Writes an inline message to standard output. + * + * @private + * @param {string} [text=''] The text to log. + */ + var logInline = (function() { + if (!isNode || isWindows) { + return function() {}; + } + // Cleanup any inline logs when exited via `ctrl+c`. + process.on('SIGINT', function() { + logInline(); + process.exit(); + }); + + var prevLine = ''; + return function(text) { + var blankLine = repeat(' ', prevLine.length); + if (text == null) { + text = ''; + } + if (text.length > hr.length) { + text = text.slice(0, hr.length - 3) + '...'; + } + prevLine = text; + process.stdout.write(text + blankLine.slice(text.length) + '\r'); + } + }()); + + /** + * Writes the wait throbber to standard output. + * + * @private + */ + function logThrobber() { + logInline('Please wait' + repeat('.', (++waitCount % 3) + 1)); + } + + /*------------------------------------------------------------------------*/ + + /** + * The number of retries async tests have to succeed. + * + * @memberOf QUnit.config + * @type number + */ + QUnit.config.asyncRetries = 0; + + /** + * An object of excused tests and assertions. + * + * @memberOf QUnit.config + * @type Object + */ + QUnit.config.excused = {}; + + /** + * An object used to hold "extras" information about the current running test. + * + * @memberOf QUnit.config + * @type Object + */ + QUnit.config.extrasData = { + + /** + * The data object for the active test module. + * + * @memberOf QUnit.config.extrasData + * @type Object + */ + 'module': {}, + + /** + * The data object for Sauce Labs. + * + * @memberOf QUnit.config.extrasData + * @type Object + */ + 'sauce': { + + /** + * An array of failed test details. + * + * @memberOf QUnit.config.extrasData.sauce + * @type Array + */ + 'tests': [] + } + }; + + /** + * Converts an object into a string representation. + * + * @memberOf QUnit + * @type Function + * @param {Object} object The object to stringify. + * @returns {string} The result string. + */ + QUnit.jsDump.parsers.object = (function() { + var func = QUnit.jsDump.parsers.object; + if (isSilent) { + return func; + } + return function(object) { + if (typeof object.rhinoException != 'object') { + return func(object); + } + return object.name + + ' { message: "' + object.message + + '", fileName: "' + object.fileName + + '", lineNumber: ' + object.lineNumber + ' }'; + }; + }()); + + /*------------------------------------------------------------------------*/ + + // Add a callback to be triggered after every assertion. + QUnit.log(function(details) { + QUnit.config.extrasData.module.logs.push(details); + }); + + // Add a callback to be triggered at the start of every test module. + QUnit.moduleStart(function(details) { + var module = QUnit.config.extrasData.module; + module.name = details.name; + module.logs = []; + module.printed = false; + }); + + // Wrap old API to intercept `expected` and `message`. + if (QUnit.push) { + QUnit.push = wrap(QUnit.push, function(push, result, actual, expected, message) { + push.call(this, result, actual, expected, message); + + var asserts = QUnit.config.current.assertions, + item = asserts[asserts.length - 1]; + + item.expected = QUnit.jsDump.parse(expected); + item.text = message; + }); + } + // Wrap old API to intercept `message`. + if (QUnit.pushFailure) { + QUnit.pushFailure = wrap(QUnit.pushFailure, function(pushFailure, message, source, actual) { + pushFailure.call(this, message, source, actual); + + var asserts = QUnit.config.current.assertions, + item = asserts[asserts.length - 1]; + + item.expected = ''; + item.text = message; + }); + } + // Wrap to flag tests using `assert.async`. + if (QUnit.assert.async) { + QUnit.assert.async = wrap(QUnit.assert.async, function(async) { + this.test.usesAsync = true; + return async.call(this); + }); + } + // Add a callback to be triggered at the start of every test. + QUnit.testStart(function(details) { + var config = QUnit.config, + test = config.current; + + var excused = config.excused || {}, + excusedTests = excused[details.module], + excusedAsserts = excusedTests && excusedTests[details.name]; + + // Allow async tests to retry. + if (!test.retries) { + test.retries = 0; + test.finish = wrap(test.finish, function(finish) { + if (this.async || this.usesAsync) { + var asserts = this.assertions, + config = QUnit.config, + index = -1, + length = asserts.length, + logs = config.extrasData.module.logs, + queue = config.queue; + + while (++index < length) { + var assert = asserts[index]; + if (!assert.result && this.retries < config.asyncRetries) { + var oldLength = queue.length; + logs.length -= asserts.length; + asserts.length = 0; + + this.retries++; + this.queue(); + + unshift.apply(queue, queue.splice(oldLength, queue.length - oldLength)); + return; + } + } + } + finish.call(this); + }); + } + // Exit early when there is nothing to excuse. + if (!excusedAsserts) { + return; + } + // Excuse the entire test. + if (excusedAsserts === true) { + test.async = test.usesAsync = false; + test.callback = function() {}; + test.expected = 0; + return; + } + // Wrap to intercept `expected` and `message`. + if (test.push) { + test.push = wrap(test.push, function(push, result, actual, expected, message) { + push.call(this, result, actual, expected, message); + + var item = this.assertions[this.assertions.length - 1]; + item.expected = QUnit.jsDump.parse(expected); + item.text = message; + }); + } + // Wrap to intercept `message`. + if (test.pushFailure) { + test.pushFailure = wrap(test.pushFailure, function(pushFailure, message, source, actual) { + pushFailure.call(this, message, source, actual); + + var item = this.assertions[this.assertions.length - 1]; + item.expected = ''; + item.text = message; + }); + } + // Wrap to excuse specific assertions. + test.finish = wrap(test.finish, function(finish) { + var asserts = this.assertions, + config = QUnit.config, + expected = this.expected, + items = asserts.slice(), + length = items.length; + + if (expected == null) { + if (config.requireExpects) { + expected = length; + items.push('Expected number of assertions to be defined, but expect() was not called.'); + } else if (!length) { + expected = 1; + items.push('Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.'); + } + } else if (expected != length) { + items.push('Expected ' + expected + ' assertions, but ' + length + ' were run'); + } + var index = -1; + length = items.length; + + while (++index < length) { + var assert = items[index], + isStr = typeof assert == 'string'; + + var assertMessage = isStr ? assert : assert.text || unescape(result(reMessage.exec(assert.message), 1)), + assertValue = isStr ? assert : assert.expected, + assertDied = result(reDied.exec(assertMessage), 0); + + if ((assertMessage && contains(excusedAsserts, assertMessage)) || + (assertDied && contains(excusedAsserts, assertDied)) || + (assertValue && ( + contains(excusedAsserts, assertValue) || + contains(excusedAsserts, assertValue.replace(/\s+/g, '')) + ))) { + if (isStr) { + while (asserts.length < expected) { + asserts.push({ 'result': true }); + } + asserts.length = expected; + } + else { + assert.result = true; + } + } + } + finish.call(this); + }); + }); + + // Add a callback to be triggered after a test is completed. + QUnit.testDone(function(details) { + var config = QUnit.config, + data = config.extrasData, + failures = details.failed, + hidepassed = config.hidepassed, + module = data.module, + moduleLogs = module.logs, + sauceTests = data.sauce.tests; + + if (hidepassed && !failures) { + return; + } + if (!isSilent) { + logInline(); + if (!module.printed) { + module.printed = true; + console.log(hr); + console.log(color('bold', module.name)); + console.log(hr); + } + console.log(' ' + (failures ? color('red', 'FAIL') : color('green', 'PASS')) + ' - ' + details.name); + } + if (!failures) { + return; + } + var index = -1, + length = moduleLogs.length; + + while(++index < length) { + var entry = moduleLogs[index]; + if (hidepassed && entry.result) { + continue; + } + var expected = entry.expected, + result = entry.result, + type = typeof expected != 'undefined' ? 'EQ' : 'OK'; + + var message = [ + result ? color('green', 'PASS') : color('red', 'FAIL'), + type, + entry.message || 'ok' + ]; + + if (!result && type == 'EQ') { + message.push(color('magenta', 'Expected: ' + expected + ', Actual: ' + entry.actual)); + } + if (!isSilent) { + console.log(' ' + message.join(' | ')); + } + if (!entry.result) { + sauceTests.push(entry); + } + } + }); + + // Add a callback to be triggered when all testing has completed. + QUnit.done(function(details) { + var failures = details.failed, + statusColor = failures ? 'magenta' : 'green'; + + if (!isSilent) { + logInline(); + console.log(hr); + console.log(color(statusColor, ' PASS: ' + details.passed + ' FAIL: ' + failures + ' TOTAL: ' + details.total)); + console.log(color(statusColor, ' Finished in ' + details.runtime + ' milliseconds.')); + console.log(hr); + } + // Exit out of Node.js or PhantomJS. + try { + if (failures) { + process.exit(1); + } else { + process.exit(0); + } + } catch(e) {} + + // Exit out of Narwhal, Rhino, or RingoJS. + try { + if (failures) { + java.lang.System.exit(1); + } else { + quit(); + } + } catch(e) {} + + // Assign results to `global_test_results` for Sauce Labs. + details.tests = QUnit.config.extrasData.sauce.tests; + context.global_test_results = details; + }); + + /*------------------------------------------------------------------------*/ + + // Replace poisoned `raises` method. + context.raises = QUnit.raises = QUnit['throws'] || QUnit.raises; + + // Add CLI extras. + if (!document) { + // Timeout fallbacks based on the work of Andrea Giammarchi and Weston C. + // See https://github.com/WebReflection/wru/blob/master/src/rhinoTimers.js + // and http://stackoverflow.com/questions/2261705/how-to-run-a-javascript-function-asynchronously-without-using-settimeout. + try { + var counter = 0, + ids = {}, + slice = Array.prototype.slice, + timer = new java.util.Timer; + + (function() { + var getDescriptor = Object.getOwnPropertyDescriptor || function() { + return { 'writable': true }; + }; + + var descriptor; + if ((!context.clearInterval || ((descriptor = getDescriptor(context, 'clearInterval')) && (descriptor.writable || descriptor.set))) && + (!context.setInterval || ((descriptor = getDescriptor(context, 'setInterval')) && (descriptor.writable || descriptor.set)))) { + context.clearInterval = clearTimer; + context.setInterval = setInterval; + } + if ((!context.clearTimeout || ((descriptor = getDescriptor(context, 'clearTimeout')) && (descriptor.writable || descriptor.set))) && + (!context.setTimeout || ((descriptor = getDescriptor(context, 'setTimeout')) && (descriptor.writable || descriptor.set)))) { + context.clearTimeout = clearTimer; + context.setTimeout = setTimeout; + } + }()); + } catch(e) {} + + // Expose QUnit API on `context`. + // Exclude `module` because some environments have it as a built-in object. + ('asyncTest deepEqual equal equals expect notDeepEqual notEqual notStrictEqual ' + + 'ok raises same start stop strictEqual test throws').replace(/\S+/g, function(methodName) { + context[methodName] = QUnit[methodName]; + }); + + // Add `console.log` support to Narwhal, Rhino, and RingoJS. + if (!console) { + console = context.console = { 'log': function() {} }; + } + // RingoJS removes ANSI escape codes in `console.log`, but not in `print`. + if (java && typeof print == 'function') { + console.log = print; + } + // Start log throbber. + if (!isSilent) { + context.setInterval(logThrobber, throbberDelay); + } + // Must call `QUnit.start` in the test file if not loaded in a browser. + QUnit.config.autostart = false; + QUnit.init(); + } + } + + /*--------------------------------------------------------------------------*/ + + // Export QUnit Extras. + if (freeExports) { + freeExports.runInContext = runInContext; + } else { + runInContext(root); + } +}.call(this)); \ No newline at end of file diff --git a/vendor/underscore/test/vendor/qunit.css b/vendor/underscore/test/vendor/qunit.css index 7ba3f9a30..f1dcd4e1c 100644 --- a/vendor/underscore/test/vendor/qunit.css +++ b/vendor/underscore/test/vendor/qunit.css @@ -1,11 +1,12 @@ -/** - * QUnit v1.12.0 - A JavaScript Unit Testing Framework +/*! + * QUnit 1.18.0 + * http://qunitjs.com/ * - * http://qunitjs.com - * - * Copyright 2012 jQuery Foundation and other contributors - * Released under the MIT license. + * Copyright jQuery Foundation and other contributors + * Released under the MIT license * http://jquery.org/license + * + * Date: 2015-04-03T10:23Z */ /** Font Family and Sizes */ @@ -31,32 +32,29 @@ #qunit-header { padding: 0.5em 0 0.5em 1em; - color: #8699a4; - background-color: #0d3349; + color: #8699A4; + background-color: #0D3349; font-size: 1.5em; line-height: 1em; - font-weight: normal; + font-weight: 400; border-radius: 5px 5px 0 0; - -moz-border-radius: 5px 5px 0 0; - -webkit-border-top-right-radius: 5px; - -webkit-border-top-left-radius: 5px; } #qunit-header a { text-decoration: none; - color: #c2ccd1; + color: #C2CCD1; } #qunit-header a:hover, #qunit-header a:focus { - color: #fff; + color: #FFF; } #qunit-testrunner-toolbar label { display: inline-block; - padding: 0 .5em 0 .1em; + padding: 0 0.5em 0 0.1em; } #qunit-banner { @@ -64,21 +62,33 @@ } #qunit-testrunner-toolbar { - padding: 0.5em 0 0.5em 2em; + padding: 0.5em 1em 0.5em 1em; color: #5E740B; - background-color: #eee; + background-color: #EEE; overflow: hidden; } #qunit-userAgent { - padding: 0.5em 0 0.5em 2.5em; - background-color: #2b81af; - color: #fff; + padding: 0.5em 1em 0.5em 1em; + background-color: #2B81AF; + color: #FFF; text-shadow: rgba(0, 0, 0, 0.5) 2px 2px 1px; } #qunit-modulefilter-container { float: right; + padding: 0.2em; +} + +.qunit-url-config { + display: inline-block; + padding: 0.1em; +} + +.qunit-filter { + display: block; + float: right; + margin-left: 1em; } /** Tests: Pass/Fail */ @@ -88,24 +98,51 @@ } #qunit-tests li { - padding: 0.4em 0.5em 0.4em 2.5em; - border-bottom: 1px solid #fff; + padding: 0.4em 1em 0.4em 1em; + border-bottom: 1px solid #FFF; list-style-position: inside; } -#qunit-tests.hidepass li.pass, #qunit-tests.hidepass li.running { +#qunit-tests > li { display: none; } +#qunit-tests li.running, +#qunit-tests li.pass, +#qunit-tests li.fail, +#qunit-tests li.skipped { + display: list-item; +} + +#qunit-tests.hidepass li.running, +#qunit-tests.hidepass li.pass { + visibility: hidden; + position: absolute; + width: 0px; + height: 0px; + padding: 0; + border: 0; + margin: 0; +} + #qunit-tests li strong { cursor: pointer; } +#qunit-tests li.skipped strong { + cursor: default; +} + #qunit-tests li a { padding: 0.5em; - color: #c2ccd1; + color: #C2CCD1; text-decoration: none; } + +#qunit-tests li p a { + padding: 0.25em; + color: #6B6464; +} #qunit-tests li a:hover, #qunit-tests li a:focus { color: #000; @@ -120,11 +157,9 @@ margin-top: 0.5em; padding: 0.5em; - background-color: #fff; + background-color: #FFF; border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; } .qunit-collapsed { @@ -133,13 +168,13 @@ #qunit-tests table { border-collapse: collapse; - margin-top: .2em; + margin-top: 0.2em; } #qunit-tests th { text-align: right; vertical-align: top; - padding: 0 .5em 0 0; + padding: 0 0.5em 0 0; } #qunit-tests td { @@ -153,26 +188,26 @@ } #qunit-tests del { - background-color: #e0f2be; - color: #374e0c; + background-color: #E0F2BE; + color: #374E0C; text-decoration: none; } #qunit-tests ins { - background-color: #ffcaca; + background-color: #FFCACA; color: #500; text-decoration: none; } /*** Test Counts */ -#qunit-tests b.counts { color: black; } +#qunit-tests b.counts { color: #000; } #qunit-tests b.passed { color: #5E740B; } #qunit-tests b.failed { color: #710909; } #qunit-tests li li { padding: 5px; - background-color: #fff; + background-color: #FFF; border-bottom: none; list-style-position: inside; } @@ -180,8 +215,8 @@ /*** Passing Styles */ #qunit-tests li li.pass { - color: #3c510c; - background-color: #fff; + color: #3C510C; + background-color: #FFF; border-left: 10px solid #C6E746; } @@ -189,7 +224,7 @@ #qunit-tests .pass .test-name { color: #366097; } #qunit-tests .pass .test-actual, -#qunit-tests .pass .test-expected { color: #999999; } +#qunit-tests .pass .test-expected { color: #999; } #qunit-banner.qunit-pass { background-color: #C6E746; } @@ -197,40 +232,52 @@ #qunit-tests li li.fail { color: #710909; - background-color: #fff; + background-color: #FFF; border-left: 10px solid #EE5757; white-space: pre; } #qunit-tests > li:last-child { border-radius: 0 0 5px 5px; - -moz-border-radius: 0 0 5px 5px; - -webkit-border-bottom-right-radius: 5px; - -webkit-border-bottom-left-radius: 5px; } -#qunit-tests .fail { color: #000000; background-color: #EE5757; } +#qunit-tests .fail { color: #000; background-color: #EE5757; } #qunit-tests .fail .test-name, -#qunit-tests .fail .module-name { color: #000000; } +#qunit-tests .fail .module-name { color: #000; } #qunit-tests .fail .test-actual { color: #EE5757; } -#qunit-tests .fail .test-expected { color: green; } +#qunit-tests .fail .test-expected { color: #008000; } #qunit-banner.qunit-fail { background-color: #EE5757; } +/*** Skipped tests */ + +#qunit-tests .skipped { + background-color: #EBECE9; +} + +#qunit-tests .qunit-skipped-label { + background-color: #F4FF77; + display: inline-block; + font-style: normal; + color: #366097; + line-height: 1.8em; + padding: 0 0.5em; + margin: -0.4em 0.4em -0.4em 0; +} /** Result */ #qunit-testresult { - padding: 0.5em 0.5em 0.5em 2.5em; + padding: 0.5em 1em 0.5em 1em; - color: #2b81af; + color: #2B81AF; background-color: #D2E0E6; - border-bottom: 1px solid white; + border-bottom: 1px solid #FFF; } #qunit-testresult .module-name { - font-weight: bold; + font-weight: 700; } /** Fixture */ diff --git a/vendor/underscore/test/vendor/qunit.js b/vendor/underscore/test/vendor/qunit.js index 84c73907d..f3542ca9d 100644 --- a/vendor/underscore/test/vendor/qunit.js +++ b/vendor/underscore/test/vendor/qunit.js @@ -1,35 +1,42 @@ -/** - * QUnit v1.12.0 - A JavaScript Unit Testing Framework +/*! + * QUnit 1.18.0 + * http://qunitjs.com/ * - * http://qunitjs.com + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license * - * Copyright 2013 jQuery Foundation and other contributors - * Released under the MIT license. - * https://jquery.org/license/ + * Date: 2015-04-03T10:23Z */ (function( window ) { var QUnit, - assert, config, onErrorFnPrev, - testId = 0, - fileName = (sourceFromStacktrace( 0 ) || "" ).replace(/(:\d+)+\)?/, "").replace(/.+\//, ""), + loggingCallbacks = {}, + fileName = ( sourceFromStacktrace( 0 ) || "" ).replace( /(:\d+)+\)?/, "" ).replace( /.+\//, "" ), toString = Object.prototype.toString, hasOwn = Object.prototype.hasOwnProperty, // Keep a local reference to Date (GH-283) Date = window.Date, + now = Date.now || function() { + return new Date().getTime(); + }, + globalStartCalled = false, + runStarted = false, setTimeout = window.setTimeout, + clearTimeout = window.clearTimeout, defined = { - setTimeout: typeof window.setTimeout !== "undefined", + document: window.document !== undefined, + setTimeout: window.setTimeout !== undefined, sessionStorage: (function() { var x = "qunit-test-string"; try { sessionStorage.setItem( x, x ); sessionStorage.removeItem( x ); return true; - } catch( e ) { + } catch ( e ) { return false; } }()) @@ -71,627 +78,18 @@ var QUnit, * @return {Object} New object with only the own properties (recursively). */ objectValues = function( obj ) { - // Grunt 0.3.x uses an older version of jshint that still has jshint/jshint#392. - /*jshint newcap: false */ var key, val, vals = QUnit.is( "array", obj ) ? [] : {}; for ( key in obj ) { if ( hasOwn.call( obj, key ) ) { - val = obj[key]; - vals[key] = val === Object(val) ? objectValues(val) : val; + val = obj[ key ]; + vals[ key ] = val === Object( val ) ? objectValues( val ) : val; } } return vals; }; -function Test( settings ) { - extend( this, settings ); - this.assertions = []; - this.testNumber = ++Test.count; -} - -Test.count = 0; - -Test.prototype = { - init: function() { - var a, b, li, - tests = id( "qunit-tests" ); - - if ( tests ) { - b = document.createElement( "strong" ); - b.innerHTML = this.nameHtml; - - // `a` initialized at top of scope - a = document.createElement( "a" ); - a.innerHTML = "Rerun"; - a.href = QUnit.url({ testNumber: this.testNumber }); - - li = document.createElement( "li" ); - li.appendChild( b ); - li.appendChild( a ); - li.className = "running"; - li.id = this.id = "qunit-test-output" + testId++; - - tests.appendChild( li ); - } - }, - setup: function() { - if ( - // Emit moduleStart when we're switching from one module to another - this.module !== config.previousModule || - // They could be equal (both undefined) but if the previousModule property doesn't - // yet exist it means this is the first test in a suite that isn't wrapped in a - // module, in which case we'll just emit a moduleStart event for 'undefined'. - // Without this, reporters can get testStart before moduleStart which is a problem. - !hasOwn.call( config, "previousModule" ) - ) { - if ( hasOwn.call( config, "previousModule" ) ) { - runLoggingCallbacks( "moduleDone", QUnit, { - name: config.previousModule, - failed: config.moduleStats.bad, - passed: config.moduleStats.all - config.moduleStats.bad, - total: config.moduleStats.all - }); - } - config.previousModule = this.module; - config.moduleStats = { all: 0, bad: 0 }; - runLoggingCallbacks( "moduleStart", QUnit, { - name: this.module - }); - } - - config.current = this; - - this.testEnvironment = extend({ - setup: function() {}, - teardown: function() {} - }, this.moduleTestEnvironment ); - - this.started = +new Date(); - runLoggingCallbacks( "testStart", QUnit, { - name: this.testName, - module: this.module - }); - - /*jshint camelcase:false */ - - - /** - * Expose the current test environment. - * - * @deprecated since 1.12.0: Use QUnit.config.current.testEnvironment instead. - */ - QUnit.current_testEnvironment = this.testEnvironment; - - /*jshint camelcase:true */ - - if ( !config.pollution ) { - saveGlobal(); - } - if ( config.notrycatch ) { - this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert ); - return; - } - try { - this.testEnvironment.setup.call( this.testEnvironment, QUnit.assert ); - } catch( e ) { - QUnit.pushFailure( "Setup failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) ); - } - }, - run: function() { - config.current = this; - - var running = id( "qunit-testresult" ); - - if ( running ) { - running.innerHTML = "Running:
        " + this.nameHtml; - } - - if ( this.async ) { - QUnit.stop(); - } - - this.callbackStarted = +new Date(); - - if ( config.notrycatch ) { - this.callback.call( this.testEnvironment, QUnit.assert ); - this.callbackRuntime = +new Date() - this.callbackStarted; - return; - } - - try { - this.callback.call( this.testEnvironment, QUnit.assert ); - this.callbackRuntime = +new Date() - this.callbackStarted; - } catch( e ) { - this.callbackRuntime = +new Date() - this.callbackStarted; - - QUnit.pushFailure( "Died on test #" + (this.assertions.length + 1) + " " + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) ); - // else next test will carry the responsibility - saveGlobal(); - - // Restart the tests if they're blocking - if ( config.blocking ) { - QUnit.start(); - } - } - }, - teardown: function() { - config.current = this; - if ( config.notrycatch ) { - if ( typeof this.callbackRuntime === "undefined" ) { - this.callbackRuntime = +new Date() - this.callbackStarted; - } - this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert ); - return; - } else { - try { - this.testEnvironment.teardown.call( this.testEnvironment, QUnit.assert ); - } catch( e ) { - QUnit.pushFailure( "Teardown failed on " + this.testName + ": " + ( e.message || e ), extractStacktrace( e, 1 ) ); - } - } - checkPollution(); - }, - finish: function() { - config.current = this; - if ( config.requireExpects && this.expected === null ) { - QUnit.pushFailure( "Expected number of assertions to be defined, but expect() was not called.", this.stack ); - } else if ( this.expected !== null && this.expected !== this.assertions.length ) { - QUnit.pushFailure( "Expected " + this.expected + " assertions, but " + this.assertions.length + " were run", this.stack ); - } else if ( this.expected === null && !this.assertions.length ) { - QUnit.pushFailure( "Expected at least one assertion, but none were run - call expect(0) to accept zero assertions.", this.stack ); - } - - var i, assertion, a, b, time, li, ol, - test = this, - good = 0, - bad = 0, - tests = id( "qunit-tests" ); - - this.runtime = +new Date() - this.started; - config.stats.all += this.assertions.length; - config.moduleStats.all += this.assertions.length; - - if ( tests ) { - ol = document.createElement( "ol" ); - ol.className = "qunit-assert-list"; - - for ( i = 0; i < this.assertions.length; i++ ) { - assertion = this.assertions[i]; - - li = document.createElement( "li" ); - li.className = assertion.result ? "pass" : "fail"; - li.innerHTML = assertion.message || ( assertion.result ? "okay" : "failed" ); - ol.appendChild( li ); - - if ( assertion.result ) { - good++; - } else { - bad++; - config.stats.bad++; - config.moduleStats.bad++; - } - } - - // store result when possible - if ( QUnit.config.reorder && defined.sessionStorage ) { - if ( bad ) { - sessionStorage.setItem( "qunit-test-" + this.module + "-" + this.testName, bad ); - } else { - sessionStorage.removeItem( "qunit-test-" + this.module + "-" + this.testName ); - } - } - - if ( bad === 0 ) { - addClass( ol, "qunit-collapsed" ); - } - - // `b` initialized at top of scope - b = document.createElement( "strong" ); - b.innerHTML = this.nameHtml + " (" + bad + ", " + good + ", " + this.assertions.length + ")"; - - addEvent(b, "click", function() { - var next = b.parentNode.lastChild, - collapsed = hasClass( next, "qunit-collapsed" ); - ( collapsed ? removeClass : addClass )( next, "qunit-collapsed" ); - }); - - addEvent(b, "dblclick", function( e ) { - var target = e && e.target ? e.target : window.event.srcElement; - if ( target.nodeName.toLowerCase() === "span" || target.nodeName.toLowerCase() === "b" ) { - target = target.parentNode; - } - if ( window.location && target.nodeName.toLowerCase() === "strong" ) { - window.location = QUnit.url({ testNumber: test.testNumber }); - } - }); - - // `time` initialized at top of scope - time = document.createElement( "span" ); - time.className = "runtime"; - time.innerHTML = this.runtime + " ms"; - - // `li` initialized at top of scope - li = id( this.id ); - li.className = bad ? "fail" : "pass"; - li.removeChild( li.firstChild ); - a = li.firstChild; - li.appendChild( b ); - li.appendChild( a ); - li.appendChild( time ); - li.appendChild( ol ); - - } else { - for ( i = 0; i < this.assertions.length; i++ ) { - if ( !this.assertions[i].result ) { - bad++; - config.stats.bad++; - config.moduleStats.bad++; - } - } - } - - runLoggingCallbacks( "testDone", QUnit, { - name: this.testName, - module: this.module, - failed: bad, - passed: this.assertions.length - bad, - total: this.assertions.length, - duration: this.runtime - }); - - QUnit.reset(); - - config.current = undefined; - }, - - queue: function() { - var bad, - test = this; - - synchronize(function() { - test.init(); - }); - function run() { - // each of these can by async - synchronize(function() { - test.setup(); - }); - synchronize(function() { - test.run(); - }); - synchronize(function() { - test.teardown(); - }); - synchronize(function() { - test.finish(); - }); - } - - // `bad` initialized at top of scope - // defer when previous test run passed, if storage is available - bad = QUnit.config.reorder && defined.sessionStorage && - +sessionStorage.getItem( "qunit-test-" + this.module + "-" + this.testName ); - - if ( bad ) { - run(); - } else { - synchronize( run, true ); - } - } -}; - -// Root QUnit object. -// `QUnit` initialized at top of scope -QUnit = { - - // call on start of module test to prepend name to all tests - module: function( name, testEnvironment ) { - config.currentModule = name; - config.currentModuleTestEnvironment = testEnvironment; - config.modules[name] = true; - }, - - asyncTest: function( testName, expected, callback ) { - if ( arguments.length === 2 ) { - callback = expected; - expected = null; - } - - QUnit.test( testName, expected, callback, true ); - }, - - test: function( testName, expected, callback, async ) { - var test, - nameHtml = "" + escapeText( testName ) + ""; - - if ( arguments.length === 2 ) { - callback = expected; - expected = null; - } - - if ( config.currentModule ) { - nameHtml = "" + escapeText( config.currentModule ) + ": " + nameHtml; - } - - test = new Test({ - nameHtml: nameHtml, - testName: testName, - expected: expected, - async: async, - callback: callback, - module: config.currentModule, - moduleTestEnvironment: config.currentModuleTestEnvironment, - stack: sourceFromStacktrace( 2 ) - }); - - if ( !validTest( test ) ) { - return; - } - - test.queue(); - }, - - // Specify the number of expected assertions to guarantee that failed test (no assertions are run at all) don't slip through. - expect: function( asserts ) { - if (arguments.length === 1) { - config.current.expected = asserts; - } else { - return config.current.expected; - } - }, - - start: function( count ) { - // QUnit hasn't been initialized yet. - // Note: RequireJS (et al) may delay onLoad - if ( config.semaphore === undefined ) { - QUnit.begin(function() { - // This is triggered at the top of QUnit.load, push start() to the event loop, to allow QUnit.load to finish first - setTimeout(function() { - QUnit.start( count ); - }); - }); - return; - } - - config.semaphore -= count || 1; - // don't start until equal number of stop-calls - if ( config.semaphore > 0 ) { - return; - } - // ignore if start is called more often then stop - if ( config.semaphore < 0 ) { - config.semaphore = 0; - QUnit.pushFailure( "Called start() while already started (QUnit.config.semaphore was 0 already)", null, sourceFromStacktrace(2) ); - return; - } - // A slight delay, to avoid any current callbacks - if ( defined.setTimeout ) { - setTimeout(function() { - if ( config.semaphore > 0 ) { - return; - } - if ( config.timeout ) { - clearTimeout( config.timeout ); - } - - config.blocking = false; - process( true ); - }, 13); - } else { - config.blocking = false; - process( true ); - } - }, - - stop: function( count ) { - config.semaphore += count || 1; - config.blocking = true; - - if ( config.testTimeout && defined.setTimeout ) { - clearTimeout( config.timeout ); - config.timeout = setTimeout(function() { - QUnit.ok( false, "Test timed out" ); - config.semaphore = 1; - QUnit.start(); - }, config.testTimeout ); - } - } -}; - -// `assert` initialized at top of scope -// Assert helpers -// All of these must either call QUnit.push() or manually do: -// - runLoggingCallbacks( "log", .. ); -// - config.current.assertions.push({ .. }); -// We attach it to the QUnit object *after* we expose the public API, -// otherwise `assert` will become a global variable in browsers (#341). -assert = { - /** - * Asserts rough true-ish result. - * @name ok - * @function - * @example ok( "asdfasdf".length > 5, "There must be at least 5 chars" ); - */ - ok: function( result, msg ) { - if ( !config.current ) { - throw new Error( "ok() assertion outside test context, was " + sourceFromStacktrace(2) ); - } - result = !!result; - msg = msg || (result ? "okay" : "failed" ); - - var source, - details = { - module: config.current.module, - name: config.current.testName, - result: result, - message: msg - }; - - msg = "" + escapeText( msg ) + ""; - - if ( !result ) { - source = sourceFromStacktrace( 2 ); - if ( source ) { - details.source = source; - msg += "
    Statistical Functions Are used to analyze data: finding the average value, the largest or smallest values in a range of cells.AVEDEV; AVERAGE; AVERAGEA; AVERAGEIF; BINOMDIST; CONFIDENCE; CORREL; COUNT; COUNTA; COUNBLANK; COUNTIF; COVAR; CRITBINOM; DEVSQ; EXPONDIST; FISHER; FISHERINV; FORECAST; FREQUENCY; GAMMALN; GEOMEAN; HARMEAN; HYPGEOMDIST; INTERCEPT; KURT; LARGE; LOGINV; LOGNORMDIST; MAX; MAXA; MEDIAN; MIN; MINA; MODE; NEGBINOMDIST; NORMDIST; NORMINV; NORMSDIST; NORMSINV; PEARSON; PERCENTILE; PERCENTRANK; PERMUT; POISSON; PROB; QUARTILE; RSQ; SKEW; SLOPE; SMALL; STANDARDIZE; STDEV; STDEVA; STDEVP; STDEVPA; STEYX; VAR; VARA; VARP; VARPAAVEDEV; AVERAGE; AVERAGEA; AVERAGEIF; AVERAGEIFS; BINOMDIST; CONFIDENCE; CORREL; COUNT; COUNTA; COUNBLANK; COUNTIF; COUNTIFS; COVAR; CRITBINOM; DEVSQ; EXPONDIST; FISHER; FISHERINV; FORECAST; FREQUENCY; GAMMALN; GEOMEAN; HARMEAN; HYPGEOMDIST; INTERCEPT; KURT; LARGE; LOGINV; LOGNORMDIST; MAX; MAXA; MEDIAN; MIN; MINA; MODE; NEGBINOMDIST; NORMDIST; NORMINV; NORMSDIST; NORMSINV; PEARSON; PERCENTILE; PERCENTRANK; PERMUT; POISSON; PROB; QUARTILE; RSQ; SKEW; SLOPE; SMALL; STANDARDIZE; STDEV; STDEVA; STDEVP; STDEVPA; STEYX; VAR; VARA; VARP; VARPA
    Financial Functions
    Статистические функции Используются для анализа данных: нахождения среднего значения, наибольшего или наименьшего значения в диапазоне ячеек.AVEDEV (СРОТКЛ); AVERAGE (СРЗНАЧ); AVERAGEA (СРЗНАЧА); AVERAGEIF (СРЗНАЧЕСЛИ); BINOMDIST (БИНОМРАСП); CONFIDENCE (ДОВЕРИТ); CORREL (КОРРЕЛ); COUNT (СЧЁТ); COUNTA (СЧЁТЗ); COUNBLANK (СЧИТАТЬПУСТОТЫ); COUNTIF (СЧЁТЕСЛИ); COVAR (КОВАР); CRITBINOM (КРИТБИНОМ); DEVSQ (КВАДРОТКЛ); EXPONDIST (ЭКСПРАСП); FISHER (ФИШЕР); FISHERINV (ФИШЕРОБР); FORECAST (ПРОГНОЗ); FREQUENCY (ЧАСТОТА); GAMMALN (ГАММАНЛОГ); GEOMEAN (СРГЕОМ); HARMEAN (СРГАРМ); HYPGEOMDIST (ГИПЕРГЕОМЕТ); INTERCEPT (ОТРЕЗОК); KURT (ЭКСЦЕСС); LARGE (НАИБОЛЬШИЙ); LOGINV (ЛОГНОРМОБР); LOGNORMDIST (ЛОГНОРМРАСП); MAX (МАКС); MAXA (МАКСА); MEDIAN (МЕДИАНА); MIN (МИН); MINA (МИНА); MODE (МОДА); NEGBINOMDIST (ОТРБИНОМРАСП); NORMDIST (НОРМРАСП); NORMINV (НОРМОБР); NORMSDIST (НОРМСТРАСП); NORMSINV (НОРМСТОБР); PEARSON (ПИРСОН); PERCENTILE (ПЕРСЕНТИЛЬ); PERCENTRANK (ПРОЦЕНТРАНГ); PERMUT (ПЕРЕСТ); POISSON (ПУАССОН); PROB (ВЕРОЯТНОСТЬ); QUARTILE (КВАРТИЛЬ); RSQ (КВПИРСОН); SKEW (СКОС); SLOPE (НАКЛОН); SMALL (НАИМЕНЬШИЙ); STANDARDIZE (НОРМАЛИЗАЦИЯ); STDEV (СТАНДОТКЛОН); STDEVA (СТАНДОТКЛОНА); STDEVP (СТАНДОТКЛОНП); STDEVPA (СТАНДОТКЛОНПА); STEYX (СТОШYX); VAR (ДИСП); VARA (ДИСПА); VARP (ДИСПР); VARPA (ДИСПРА)AVEDEV (СРОТКЛ); AVERAGE (СРЗНАЧ); AVERAGEA (СРЗНАЧА); AVERAGEIF (СРЗНАЧЕСЛИ); AVERAGEIFS (СРЗНАЧЕСЛИМН); BINOMDIST (БИНОМРАСП); CONFIDENCE (ДОВЕРИТ); CORREL (КОРРЕЛ); COUNT (СЧЁТ); COUNTA (СЧЁТЗ); COUNBLANK (СЧИТАТЬПУСТОТЫ); COUNTIF (СЧЁТЕСЛИ); COUNTIFS (СЧЁТЕСЛИМН); COVAR (КОВАР); CRITBINOM (КРИТБИНОМ); DEVSQ (КВАДРОТКЛ); EXPONDIST (ЭКСПРАСП); FISHER (ФИШЕР); FISHERINV (ФИШЕРОБР); FORECAST (ПРОГНОЗ); FREQUENCY (ЧАСТОТА); GAMMALN (ГАММАНЛОГ); GEOMEAN (СРГЕОМ); HARMEAN (СРГАРМ); HYPGEOMDIST (ГИПЕРГЕОМЕТ); INTERCEPT (ОТРЕЗОК); KURT (ЭКСЦЕСС); LARGE (НАИБОЛЬШИЙ); LOGINV (ЛОГНОРМОБР); LOGNORMDIST (ЛОГНОРМРАСП); MAX (МАКС); MAXA (МАКСА); MEDIAN (МЕДИАНА); MIN (МИН); MINA (МИНА); MODE (МОДА); NEGBINOMDIST (ОТРБИНОМРАСП); NORMDIST (НОРМРАСП); NORMINV (НОРМОБР); NORMSDIST (НОРМСТРАСП); NORMSINV (НОРМСТОБР); PEARSON (ПИРСОН); PERCENTILE (ПЕРСЕНТИЛЬ); PERCENTRANK (ПРОЦЕНТРАНГ); PERMUT (ПЕРЕСТ); POISSON (ПУАССОН); PROB (ВЕРОЯТНОСТЬ); QUARTILE (КВАРТИЛЬ); RSQ (КВПИРСОН); SKEW (СКОС); SLOPE (НАКЛОН); SMALL (НАИМЕНЬШИЙ); STANDARDIZE (НОРМАЛИЗАЦИЯ); STDEV (СТАНДОТКЛОН); STDEVA (СТАНДОТКЛОНА); STDEVP (СТАНДОТКЛОНП); STDEVPA (СТАНДОТКЛОНПА); STEYX (СТОШYX); VAR (ДИСП); VARA (ДИСПА); VARP (ДИСПР); VARPA (ДИСПРА)
    Финансовые функции
    Source:
    " + escapeText( source ) + "
    "; - } - } - runLoggingCallbacks( "log", QUnit, details ); - config.current.assertions.push({ - result: result, - message: msg - }); - }, - - /** - * Assert that the first two arguments are equal, with an optional message. - * Prints out both actual and expected values. - * @name equal - * @function - * @example equal( format( "Received {0} bytes.", 2), "Received 2 bytes.", "format() replaces {0} with next argument" ); - */ - equal: function( actual, expected, message ) { - /*jshint eqeqeq:false */ - QUnit.push( expected == actual, actual, expected, message ); - }, - - /** - * @name notEqual - * @function - */ - notEqual: function( actual, expected, message ) { - /*jshint eqeqeq:false */ - QUnit.push( expected != actual, actual, expected, message ); - }, - - /** - * @name propEqual - * @function - */ - propEqual: function( actual, expected, message ) { - actual = objectValues(actual); - expected = objectValues(expected); - QUnit.push( QUnit.equiv(actual, expected), actual, expected, message ); - }, - - /** - * @name notPropEqual - * @function - */ - notPropEqual: function( actual, expected, message ) { - actual = objectValues(actual); - expected = objectValues(expected); - QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message ); - }, - - /** - * @name deepEqual - * @function - */ - deepEqual: function( actual, expected, message ) { - QUnit.push( QUnit.equiv(actual, expected), actual, expected, message ); - }, - - /** - * @name notDeepEqual - * @function - */ - notDeepEqual: function( actual, expected, message ) { - QUnit.push( !QUnit.equiv(actual, expected), actual, expected, message ); - }, - - /** - * @name strictEqual - * @function - */ - strictEqual: function( actual, expected, message ) { - QUnit.push( expected === actual, actual, expected, message ); - }, - - /** - * @name notStrictEqual - * @function - */ - notStrictEqual: function( actual, expected, message ) { - QUnit.push( expected !== actual, actual, expected, message ); - }, - - "throws": function( block, expected, message ) { - var actual, - expectedOutput = expected, - ok = false; - - // 'expected' is optional - if ( typeof expected === "string" ) { - message = expected; - expected = null; - } - - config.current.ignoreGlobalErrors = true; - try { - block.call( config.current.testEnvironment ); - } catch (e) { - actual = e; - } - config.current.ignoreGlobalErrors = false; - - if ( actual ) { - // we don't want to validate thrown error - if ( !expected ) { - ok = true; - expectedOutput = null; - // expected is a regexp - } else if ( QUnit.objectType( expected ) === "regexp" ) { - ok = expected.test( errorString( actual ) ); - // expected is a constructor - } else if ( actual instanceof expected ) { - ok = true; - // expected is a validation function which returns true is validation passed - } else if ( expected.call( {}, actual ) === true ) { - expectedOutput = null; - ok = true; - } - - QUnit.push( ok, actual, expectedOutput, message ); - } else { - QUnit.pushFailure( message, null, "No exception was thrown." ); - } - } -}; - -/** - * @deprecated since 1.8.0 - * Kept assertion helpers in root for backwards compatibility. - */ -extend( QUnit, assert ); - -/** - * @deprecated since 1.9.0 - * Kept root "raises()" for backwards compatibility. - * (Note that we don't introduce assert.raises). - */ -QUnit.raises = assert[ "throws" ]; - -/** - * @deprecated since 1.0.0, replaced with error pushes since 1.3.0 - * Kept to avoid TypeErrors for undefined methods. - */ -QUnit.equals = function() { - QUnit.push( false, false, false, "QUnit.equals has been deprecated since 2009 (e88049a0), use QUnit.equal instead" ); -}; -QUnit.same = function() { - QUnit.push( false, false, false, "QUnit.same has been deprecated since 2009 (e88049a0), use QUnit.deepEqual instead" ); -}; - -// We want access to the constructor's prototype -(function() { - function F() {} - F.prototype = QUnit; - QUnit = new F(); - // Make F QUnit's constructor so that we can add to the prototype later - QUnit.constructor = F; -}()); +QUnit = {}; /** * Config object: Maintain internal state @@ -705,10 +103,6 @@ config = { // block until document ready blocking: true, - // when enabled, show only failing tests - // gets persisted through sessionStorage and can be changed in UI via checkbox - hidepassed: false, - // by default, run previously failed tests first // very useful in combination with "Hide passed tests" checked reorder: true, @@ -716,165 +110,233 @@ config = { // by default, modify document.title when suite is done altertitle: true, + // by default, scroll to top of the page when suite is done + scrolltop: true, + // when enabled, all tests must call expect() requireExpects: false, + // depth up-to which object will be dumped + maxDepth: 5, + // add checkboxes that are persisted in the query-string // when enabled, the id is set to `true` as a `QUnit.config` property urlConfig: [ + { + id: "hidepassed", + label: "Hide passed tests", + tooltip: "Only show tests and assertions that fail. Stored as query-strings." + }, { id: "noglobals", label: "Check for Globals", - tooltip: "Enabling this will test if any test introduces new properties on the `window` object. Stored as query-strings." + tooltip: "Enabling this will test if any test introduces new properties on the " + + "`window` object. Stored as query-strings." }, { id: "notrycatch", label: "No try-catch", - tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging exceptions in IE reasonable. Stored as query-strings." + tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging " + + "exceptions in IE reasonable. Stored as query-strings." } ], // Set of all modules. - modules: {}, + modules: [], - // logging callback queues - begin: [], - done: [], - log: [], - testStart: [], - testDone: [], - moduleStart: [], - moduleDone: [] + // The first unnamed module + currentModule: { + name: "", + tests: [] + }, + + callbacks: {} }; -// Export global variables, unless an 'exports' object exists, -// in that case we assume we're in CommonJS (dealt with on the bottom of the script) -if ( typeof exports === "undefined" ) { - extend( window, QUnit.constructor.prototype ); - - // Expose QUnit object - window.QUnit = QUnit; -} +// Push a loose unnamed module to the modules collection +config.modules.push( config.currentModule ); // Initialize more QUnit.config and QUnit.urlParams (function() { - var i, + var i, current, location = window.location || { search: "", protocol: "file:" }, params = location.search.slice( 1 ).split( "&" ), length = params.length, - urlParams = {}, - current; + urlParams = {}; if ( params[ 0 ] ) { for ( i = 0; i < length; i++ ) { current = params[ i ].split( "=" ); current[ 0 ] = decodeURIComponent( current[ 0 ] ); + // allow just a key to turn on a flag, e.g., test.html?noglobals current[ 1 ] = current[ 1 ] ? decodeURIComponent( current[ 1 ] ) : true; - urlParams[ current[ 0 ] ] = current[ 1 ]; + if ( urlParams[ current[ 0 ] ] ) { + urlParams[ current[ 0 ] ] = [].concat( urlParams[ current[ 0 ] ], current[ 1 ] ); + } else { + urlParams[ current[ 0 ] ] = current[ 1 ]; + } } } + if ( urlParams.filter === true ) { + delete urlParams.filter; + } + QUnit.urlParams = urlParams; // String search anywhere in moduleName+testName config.filter = urlParams.filter; - // Exact match of the module name - config.module = urlParams.module; + if ( urlParams.maxDepth ) { + config.maxDepth = parseInt( urlParams.maxDepth, 10 ) === -1 ? + Number.POSITIVE_INFINITY : + urlParams.maxDepth; + } - config.testNumber = parseInt( urlParams.testNumber, 10 ) || null; + config.testId = []; + if ( urlParams.testId ) { + + // Ensure that urlParams.testId is an array + urlParams.testId = decodeURIComponent( urlParams.testId ).split( "," ); + for ( i = 0; i < urlParams.testId.length; i++ ) { + config.testId.push( urlParams.testId[ i ] ); + } + } // Figure out if we're running the tests from a server or not QUnit.isLocal = location.protocol === "file:"; + + // Expose the current QUnit version + QUnit.version = "1.18.0"; }()); -// Extend QUnit object, -// these after set here because they should not be exposed as global functions +// Root QUnit object. +// `QUnit` initialized at top of scope extend( QUnit, { - assert: assert, - config: config, + // call on start of module test to prepend name to all tests + module: function( name, testEnvironment ) { + var currentModule = { + name: name, + testEnvironment: testEnvironment, + tests: [] + }; - // Initialize the configuration options - init: function() { - extend( config, { - stats: { all: 0, bad: 0 }, - moduleStats: { all: 0, bad: 0 }, - started: +new Date(), - updateRate: 1000, - blocking: false, - autostart: true, - autorun: false, - filter: "", - queue: [], - semaphore: 1 + // DEPRECATED: handles setup/teardown functions, + // beforeEach and afterEach should be used instead + if ( testEnvironment && testEnvironment.setup ) { + testEnvironment.beforeEach = testEnvironment.setup; + delete testEnvironment.setup; + } + if ( testEnvironment && testEnvironment.teardown ) { + testEnvironment.afterEach = testEnvironment.teardown; + delete testEnvironment.teardown; + } + + config.modules.push( currentModule ); + config.currentModule = currentModule; + }, + + // DEPRECATED: QUnit.asyncTest() will be removed in QUnit 2.0. + asyncTest: function( testName, expected, callback ) { + if ( arguments.length === 2 ) { + callback = expected; + expected = null; + } + + QUnit.test( testName, expected, callback, true ); + }, + + test: function( testName, expected, callback, async ) { + var test; + + if ( arguments.length === 2 ) { + callback = expected; + expected = null; + } + + test = new Test({ + testName: testName, + expected: expected, + async: async, + callback: callback }); - var tests, banner, result, - qunit = id( "qunit" ); - - if ( qunit ) { - qunit.innerHTML = - "

    " + escapeText( document.title ) + "

    " + - "

    " + - "
    " + - "

    " + - "
      "; - } - - tests = id( "qunit-tests" ); - banner = id( "qunit-banner" ); - result = id( "qunit-testresult" ); - - if ( tests ) { - tests.innerHTML = ""; - } - - if ( banner ) { - banner.className = ""; - } - - if ( result ) { - result.parentNode.removeChild( result ); - } - - if ( tests ) { - result = document.createElement( "p" ); - result.id = "qunit-testresult"; - result.className = "result"; - tests.parentNode.insertBefore( result, tests ); - result.innerHTML = "Running...
       "; - } + test.queue(); }, - // Resets the test setup. Useful for tests that modify the DOM. - /* - DEPRECATED: Use multiple tests instead of resetting inside a test. - Use testStart or testDone for custom cleanup. - This method will throw an error in 2.0, and will be removed in 2.1 - */ - reset: function() { - var fixture = id( "qunit-fixture" ); - if ( fixture ) { - fixture.innerHTML = config.fixture; - } + skip: function( testName ) { + var test = new Test({ + testName: testName, + skip: true + }); + + test.queue(); }, - // Trigger an event on an element. - // @example triggerEvent( document.body, "click" ); - triggerEvent: function( elem, type, event ) { - if ( document.createEvent ) { - event = document.createEvent( "MouseEvents" ); - event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView, - 0, 0, 0, 0, 0, false, false, false, false, 0, null); + // DEPRECATED: The functionality of QUnit.start() will be altered in QUnit 2.0. + // In QUnit 2.0, invoking it will ONLY affect the `QUnit.config.autostart` blocking behavior. + start: function( count ) { + var globalStartAlreadyCalled = globalStartCalled; - elem.dispatchEvent( event ); - } else if ( elem.fireEvent ) { - elem.fireEvent( "on" + type ); + if ( !config.current ) { + globalStartCalled = true; + + if ( runStarted ) { + throw new Error( "Called start() outside of a test context while already started" ); + } else if ( globalStartAlreadyCalled || count > 1 ) { + throw new Error( "Called start() outside of a test context too many times" ); + } else if ( config.autostart ) { + throw new Error( "Called start() outside of a test context when " + + "QUnit.config.autostart was true" ); + } else if ( !config.pageLoaded ) { + + // The page isn't completely loaded yet, so bail out and let `QUnit.load` handle it + config.autostart = true; + return; + } + } else { + + // If a test is running, adjust its semaphore + config.current.semaphore -= count || 1; + + // Don't start until equal number of stop-calls + if ( config.current.semaphore > 0 ) { + return; + } + + // throw an Error if start is called more often than stop + if ( config.current.semaphore < 0 ) { + config.current.semaphore = 0; + + QUnit.pushFailure( + "Called start() while already started (test's semaphore was 0 already)", + sourceFromStacktrace( 2 ) + ); + return; + } } + + resumeProcessing(); }, + // DEPRECATED: QUnit.stop() will be removed in QUnit 2.0. + stop: function( count ) { + + // If there isn't a test running, don't allow QUnit.stop() to be called + if ( !config.current ) { + throw new Error( "Called stop() outside of a test context" ); + } + + // If a test is running, adjust its semaphore + config.current.semaphore += count || 1; + + pauseProcessing(); + }, + + config: config, + // Safe object type checking is: function( type, obj ) { return QUnit.objectType( obj ) === type; @@ -882,19 +344,20 @@ extend( QUnit, { objectType: function( obj ) { if ( typeof obj === "undefined" ) { - return "undefined"; - // consider: typeof null === object - } - if ( obj === null ) { - return "null"; + return "undefined"; } - var match = toString.call( obj ).match(/^\[object\s(.*)\]$/), - type = match && match[1] || ""; + // Consider: typeof null === object + if ( obj === null ) { + return "null"; + } + + var match = toString.call( obj ).match( /^\[object\s(.*)\]$/ ), + type = match && match[ 1 ] || ""; switch ( type ) { case "Number": - if ( isNaN(obj) ) { + if ( isNaN( obj ) ) { return "nan"; } return "number"; @@ -912,308 +375,65 @@ extend( QUnit, { return undefined; }, - push: function( result, actual, expected, message ) { - if ( !config.current ) { - throw new Error( "assertion outside test context, was " + sourceFromStacktrace() ); - } - - var output, source, - details = { - module: config.current.module, - name: config.current.testName, - result: result, - message: message, - actual: actual, - expected: expected - }; - - message = escapeText( message ) || ( result ? "okay" : "failed" ); - message = "" + message + ""; - output = message; - - if ( !result ) { - expected = escapeText( QUnit.jsDump.parse(expected) ); - actual = escapeText( QUnit.jsDump.parse(actual) ); - output += ""; - - if ( actual !== expected ) { - output += ""; - output += ""; - } - - source = sourceFromStacktrace(); - - if ( source ) { - details.source = source; - output += ""; - } - - output += "
      Expected:
      " + expected + "
      Result:
      " + actual + "
      Diff:
      " + QUnit.diff( expected, actual ) + "
      Source:
      " + escapeText( source ) + "
      "; - } - - runLoggingCallbacks( "log", QUnit, details ); - - config.current.assertions.push({ - result: !!result, - message: output - }); - }, - - pushFailure: function( message, source, actual ) { - if ( !config.current ) { - throw new Error( "pushFailure() assertion outside test context, was " + sourceFromStacktrace(2) ); - } - - var output, - details = { - module: config.current.module, - name: config.current.testName, - result: false, - message: message - }; - - message = escapeText( message ) || "error"; - message = "" + message + ""; - output = message; - - output += ""; - - if ( actual ) { - output += ""; - } - - if ( source ) { - details.source = source; - output += ""; - } - - output += "
      Result:
      " + escapeText( actual ) + "
      Source:
      " + escapeText( source ) + "
      "; - - runLoggingCallbacks( "log", QUnit, details ); - - config.current.assertions.push({ - result: false, - message: output - }); - }, - - url: function( params ) { - params = extend( extend( {}, QUnit.urlParams ), params ); - var key, - querystring = "?"; - - for ( key in params ) { - if ( hasOwn.call( params, key ) ) { - querystring += encodeURIComponent( key ) + "=" + - encodeURIComponent( params[ key ] ) + "&"; - } - } - return window.location.protocol + "//" + window.location.host + - window.location.pathname + querystring.slice( 0, -1 ); - }, - extend: extend, - id: id, - addEvent: addEvent, - addClass: addClass, - hasClass: hasClass, - removeClass: removeClass - // load, equiv, jsDump, diff: Attached later + + load: function() { + config.pageLoaded = true; + + // Initialize the configuration options + extend( config, { + stats: { all: 0, bad: 0 }, + moduleStats: { all: 0, bad: 0 }, + started: 0, + updateRate: 1000, + autostart: true, + filter: "" + }, true ); + + config.blocking = false; + + if ( config.autostart ) { + resumeProcessing(); + } + } }); -/** - * @deprecated: Created for backwards compatibility with test runner that set the hook function - * into QUnit.{hook}, instead of invoking it and passing the hook function. - * QUnit.constructor is set to the empty F() above so that we can add to it's prototype here. - * Doing this allows us to tell if the following methods have been overwritten on the actual - * QUnit object. - */ -extend( QUnit.constructor.prototype, { +// Register logging callbacks +(function() { + var i, l, key, + callbacks = [ "begin", "done", "log", "testStart", "testDone", + "moduleStart", "moduleDone" ]; - // Logging callbacks; all receive a single argument with the listed properties - // run test/logs.html for any related changes - begin: registerLoggingCallback( "begin" ), - - // done: { failed, passed, total, runtime } - done: registerLoggingCallback( "done" ), - - // log: { result, actual, expected, message } - log: registerLoggingCallback( "log" ), - - // testStart: { name } - testStart: registerLoggingCallback( "testStart" ), - - // testDone: { name, failed, passed, total, duration } - testDone: registerLoggingCallback( "testDone" ), - - // moduleStart: { name } - moduleStart: registerLoggingCallback( "moduleStart" ), - - // moduleDone: { name, failed, passed, total } - moduleDone: registerLoggingCallback( "moduleDone" ) -}); - -if ( typeof document === "undefined" || document.readyState === "complete" ) { - config.autorun = true; -} - -QUnit.load = function() { - runLoggingCallbacks( "begin", QUnit, {} ); - - // Initialize the config, saving the execution queue - var banner, filter, i, label, len, main, ol, toolbar, userAgent, val, - urlConfigCheckboxesContainer, urlConfigCheckboxes, moduleFilter, - numModules = 0, - moduleNames = [], - moduleFilterHtml = "", - urlConfigHtml = "", - oldconfig = extend( {}, config ); - - QUnit.init(); - extend(config, oldconfig); - - config.blocking = false; - - len = config.urlConfig.length; - - for ( i = 0; i < len; i++ ) { - val = config.urlConfig[i]; - if ( typeof val === "string" ) { - val = { - id: val, - label: val, - tooltip: "[no tooltip available]" - }; - } - config[ val.id ] = QUnit.urlParams[ val.id ]; - urlConfigHtml += ""; - } - for ( i in config.modules ) { - if ( config.modules.hasOwnProperty( i ) ) { - moduleNames.push(i); - } - } - numModules = moduleNames.length; - moduleNames.sort( function( a, b ) { - return a.localeCompare( b ); - }); - moduleFilterHtml += ""; - - // `userAgent` initialized at top of scope - userAgent = id( "qunit-userAgent" ); - if ( userAgent ) { - userAgent.innerHTML = navigator.userAgent; - } - - // `banner` initialized at top of scope - banner = id( "qunit-header" ); - if ( banner ) { - banner.innerHTML = "" + banner.innerHTML + " "; - } - - // `toolbar` initialized at top of scope - toolbar = id( "qunit-testrunner-toolbar" ); - if ( toolbar ) { - // `filter` initialized at top of scope - filter = document.createElement( "input" ); - filter.type = "checkbox"; - filter.id = "qunit-filter-pass"; - - addEvent( filter, "click", function() { - var tmp, - ol = document.getElementById( "qunit-tests" ); - - if ( filter.checked ) { - ol.className = ol.className + " hidepass"; - } else { - tmp = " " + ol.className.replace( /[\n\t\r]/g, " " ) + " "; - ol.className = tmp.replace( / hidepass /, " " ); + function registerLoggingCallback( key ) { + var loggingCallback = function( callback ) { + if ( QUnit.objectType( callback ) !== "function" ) { + throw new Error( + "QUnit logging methods require a callback function as their first parameters." + ); } - if ( defined.sessionStorage ) { - if (filter.checked) { - sessionStorage.setItem( "qunit-filter-passed-tests", "true" ); - } else { - sessionStorage.removeItem( "qunit-filter-passed-tests" ); - } - } - }); - if ( config.hidepassed || defined.sessionStorage && sessionStorage.getItem( "qunit-filter-passed-tests" ) ) { - filter.checked = true; - // `ol` initialized at top of scope - ol = document.getElementById( "qunit-tests" ); - ol.className = ol.className + " hidepass"; + config.callbacks[ key ].push( callback ); + }; + + // DEPRECATED: This will be removed on QUnit 2.0.0+ + // Stores the registered functions allowing restoring + // at verifyLoggingCallbacks() if modified + loggingCallbacks[ key ] = loggingCallback; + + return loggingCallback; + } + + for ( i = 0, l = callbacks.length; i < l; i++ ) { + key = callbacks[ i ]; + + // Initialize key collection of logging callback + if ( QUnit.objectType( config.callbacks[ key ] ) === "undefined" ) { + config.callbacks[ key ] = []; } - toolbar.appendChild( filter ); - // `label` initialized at top of scope - label = document.createElement( "label" ); - label.setAttribute( "for", "qunit-filter-pass" ); - label.setAttribute( "title", "Only show tests and assertions that fail. Stored in sessionStorage." ); - label.innerHTML = "Hide passed tests"; - toolbar.appendChild( label ); - - urlConfigCheckboxesContainer = document.createElement("span"); - urlConfigCheckboxesContainer.innerHTML = urlConfigHtml; - urlConfigCheckboxes = urlConfigCheckboxesContainer.getElementsByTagName("input"); - // For oldIE support: - // * Add handlers to the individual elements instead of the container - // * Use "click" instead of "change" - // * Fallback from event.target to event.srcElement - addEvents( urlConfigCheckboxes, "click", function( event ) { - var params = {}, - target = event.target || event.srcElement; - params[ target.name ] = target.checked ? true : undefined; - window.location = QUnit.url( params ); - }); - toolbar.appendChild( urlConfigCheckboxesContainer ); - - if (numModules > 1) { - moduleFilter = document.createElement( "span" ); - moduleFilter.setAttribute( "id", "qunit-modulefilter-container" ); - moduleFilter.innerHTML = moduleFilterHtml; - addEvent( moduleFilter.lastChild, "change", function() { - var selectBox = moduleFilter.getElementsByTagName("select")[0], - selectedModule = decodeURIComponent(selectBox.options[selectBox.selectedIndex].value); - - window.location = QUnit.url({ - module: ( selectedModule === "" ) ? undefined : selectedModule, - // Remove any existing filters - filter: undefined, - testNumber: undefined - }); - }); - toolbar.appendChild(moduleFilter); - } + QUnit[ key ] = registerLoggingCallback( key ); } - - // `main` initialized at top of scope - main = id( "qunit-fixture" ); - if ( main ) { - config.fixture = main.innerHTML; - } - - if ( config.autostart ) { - QUnit.start(); - } -}; - -addEvent( window, "load", QUnit.load ); +})(); // `onErrorFnPrev` initialized at top of scope // Preserve other handlers @@ -1222,7 +442,7 @@ onErrorFnPrev = window.onerror; // Cover uncaught exceptions // Returning true will suppress the default browser handler, // returning false will let it run. -window.onerror = function ( error, filePath, linerNr ) { +window.onerror = function( error, filePath, linerNr ) { var ret = false; if ( onErrorFnPrev ) { ret = onErrorFnPrev( error, filePath, linerNr ); @@ -1237,9 +457,9 @@ window.onerror = function ( error, filePath, linerNr ) { } QUnit.pushFailure( error, filePath + ":" + linerNr ); } else { - QUnit.test( "global failure", extend( function() { + QUnit.test( "global failure", extend(function() { QUnit.pushFailure( error, filePath + ":" + linerNr ); - }, { validTest: validTest } ) ); + }, { validTest: true } ) ); } return false; } @@ -1248,71 +468,27 @@ window.onerror = function ( error, filePath, linerNr ) { }; function done() { + var runtime, passed; + config.autorun = true; // Log the last module results - if ( config.currentModule ) { - runLoggingCallbacks( "moduleDone", QUnit, { - name: config.currentModule, + if ( config.previousModule ) { + runLoggingCallbacks( "moduleDone", { + name: config.previousModule.name, + tests: config.previousModule.tests, failed: config.moduleStats.bad, passed: config.moduleStats.all - config.moduleStats.bad, - total: config.moduleStats.all + total: config.moduleStats.all, + runtime: now() - config.moduleStats.started }); } delete config.previousModule; - var i, key, - banner = id( "qunit-banner" ), - tests = id( "qunit-tests" ), - runtime = +new Date() - config.started, - passed = config.stats.all - config.stats.bad, - html = [ - "Tests completed in ", - runtime, - " milliseconds.
      ", - "", - passed, - " assertions of ", - config.stats.all, - " passed, ", - config.stats.bad, - " failed." - ].join( "" ); + runtime = now() - config.started; + passed = config.stats.all - config.stats.bad; - if ( banner ) { - banner.className = ( config.stats.bad ? "qunit-fail" : "qunit-pass" ); - } - - if ( tests ) { - id( "qunit-testresult" ).innerHTML = html; - } - - if ( config.altertitle && typeof document !== "undefined" && document.title ) { - // show ✖ for good, ✔ for bad suite result in title - // use escape sequences in case file gets loaded with non-utf-8-charset - document.title = [ - ( config.stats.bad ? "\u2716" : "\u2714" ), - document.title.replace( /^[\u2714\u2716] /i, "" ) - ].join( " " ); - } - - // clear own sessionStorage items if all tests passed - if ( config.reorder && defined.sessionStorage && config.stats.bad === 0 ) { - // `key` & `i` initialized at top of scope - for ( i = 0; i < sessionStorage.length; i++ ) { - key = sessionStorage.key( i++ ); - if ( key.indexOf( "qunit-test-" ) === 0 ) { - sessionStorage.removeItem( key ); - } - } - } - - // scroll back to top to show results - if ( window.scrollTo ) { - window.scrollTo(0, 0); - } - - runLoggingCallbacks( "done", QUnit, { + runLoggingCallbacks( "done", { failed: config.stats.bad, passed: passed, total: config.stats.all, @@ -1320,60 +496,16 @@ function done() { }); } -/** @return Boolean: true if this test should be ran */ -function validTest( test ) { - var include, - filter = config.filter && config.filter.toLowerCase(), - module = config.module && config.module.toLowerCase(), - fullName = (test.module + ": " + test.testName).toLowerCase(); - - // Internally-generated tests are always valid - if ( test.callback && test.callback.validTest === validTest ) { - delete test.callback.validTest; - return true; - } - - if ( config.testNumber ) { - return test.testNumber === config.testNumber; - } - - if ( module && ( !test.module || test.module.toLowerCase() !== module ) ) { - return false; - } - - if ( !filter ) { - return true; - } - - include = filter.charAt( 0 ) !== "!"; - if ( !include ) { - filter = filter.slice( 1 ); - } - - // If the filter matches, we need to honour include - if ( fullName.indexOf( filter ) !== -1 ) { - return include; - } - - // Otherwise, do the opposite - return !include; -} - -// so far supports only Firefox, Chrome and Opera (buggy), Safari (for real exceptions) -// Later Safari and IE10 are supposed to support error.stack as well +// Doesn't support IE6 to IE9, it will return undefined on these browsers // See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack function extractStacktrace( e, offset ) { - offset = offset === undefined ? 3 : offset; + offset = offset === undefined ? 4 : offset; var stack, include, i; - if ( e.stacktrace ) { - // Opera - return e.stacktrace.split( "\n" )[ offset + 3 ]; - } else if ( e.stack ) { - // Firefox, Chrome + if ( e.stack ) { stack = e.stack.split( "\n" ); - if (/^error$/i.test( stack[0] ) ) { + if ( /^error$/i.test( stack[ 0 ] ) ) { stack.shift(); } if ( fileName ) { @@ -1389,51 +521,43 @@ function extractStacktrace( e, offset ) { } } return stack[ offset ]; + + // Support: Safari <=6 only } else if ( e.sourceURL ) { - // Safari, PhantomJS - // hopefully one day Safari provides actual stacktraces + // exclude useless self-reference for generated Error objects if ( /qunit.js$/.test( e.sourceURL ) ) { return; } + // for actual exceptions, this is useful return e.sourceURL + ":" + e.line; } } -function sourceFromStacktrace( offset ) { - try { - throw new Error(); - } catch ( e ) { - return extractStacktrace( e, offset ); - } -} -/** - * Escape text for attribute or text content. - */ -function escapeText( s ) { - if ( !s ) { - return ""; - } - s = s + ""; - // Both single quotes and double quotes (for attributes) - return s.replace( /['"<>&]/g, function( s ) { - switch( s ) { - case "'": - return "'"; - case "\"": - return """; - case "<": - return "<"; - case ">": - return ">"; - case "&": - return "&"; +function sourceFromStacktrace( offset ) { + var error = new Error(); + + // Support: Safari <=7 only, IE <=10 - 11 only + // Not all browsers generate the `stack` property for `new Error()`, see also #636 + if ( !error.stack ) { + try { + throw error; + } catch ( err ) { + error = err; } - }); + } + + return extractStacktrace( error, offset ); } function synchronize( callback, last ) { + if ( QUnit.objectType( callback ) === "array" ) { + while ( callback.length ) { + synchronize( callback.shift() ); + } + return; + } config.queue.push( callback ); if ( config.autorun && !config.blocking ) { @@ -1445,11 +569,17 @@ function process( last ) { function next() { process( last ); } - var start = new Date().getTime(); - config.depth = config.depth ? config.depth + 1 : 1; + var start = now(); + config.depth = ( config.depth || 0 ) + 1; while ( config.queue.length && !config.blocking ) { - if ( !defined.setTimeout || config.updateRate <= 0 || ( ( new Date().getTime() - start ) < config.updateRate ) ) { + if ( !defined.setTimeout || config.updateRate <= 0 || + ( ( now() - start ) < config.updateRate ) ) { + if ( config.current ) { + + // Reset async tracking for each phase of the Test lifecycle + config.current.usedAsync = false; + } config.queue.shift()(); } else { setTimeout( next, 13 ); @@ -1462,6 +592,79 @@ function process( last ) { } } +function begin() { + var i, l, + modulesLog = []; + + // If the test run hasn't officially begun yet + if ( !config.started ) { + + // Record the time of the test run's beginning + config.started = now(); + + verifyLoggingCallbacks(); + + // Delete the loose unnamed module if unused. + if ( config.modules[ 0 ].name === "" && config.modules[ 0 ].tests.length === 0 ) { + config.modules.shift(); + } + + // Avoid unnecessary information by not logging modules' test environments + for ( i = 0, l = config.modules.length; i < l; i++ ) { + modulesLog.push({ + name: config.modules[ i ].name, + tests: config.modules[ i ].tests + }); + } + + // The test run is officially beginning now + runLoggingCallbacks( "begin", { + totalTests: Test.count, + modules: modulesLog + }); + } + + config.blocking = false; + process( true ); +} + +function resumeProcessing() { + runStarted = true; + + // A slight delay to allow this iteration of the event loop to finish (more assertions, etc.) + if ( defined.setTimeout ) { + setTimeout(function() { + if ( config.current && config.current.semaphore > 0 ) { + return; + } + if ( config.timeout ) { + clearTimeout( config.timeout ); + } + + begin(); + }, 13 ); + } else { + begin(); + } +} + +function pauseProcessing() { + config.blocking = true; + + if ( config.testTimeout && defined.setTimeout ) { + clearTimeout( config.timeout ); + config.timeout = setTimeout(function() { + if ( config.current ) { + config.current.semaphore = 0; + QUnit.pushFailure( "Test timed out", sourceFromStacktrace( 2 ) ); + } else { + throw new Error( "Test timed out" ); + } + resumeProcessing(); + }, config.testTimeout ); + } +} + function saveGlobal() { config.pollution = []; @@ -1487,12 +690,12 @@ function checkPollution() { newGlobals = diff( config.pollution, old ); if ( newGlobals.length > 0 ) { - QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join(", ") ); + QUnit.pushFailure( "Introduced global variable(s): " + newGlobals.join( ", " ) ); } deletedGlobals = diff( old, config.pollution ); if ( deletedGlobals.length > 0 ) { - QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join(", ") ); + QUnit.pushFailure( "Deleted global variable(s): " + deletedGlobals.join( ", " ) ); } } @@ -1503,7 +706,7 @@ function diff( a, b ) { for ( i = 0; i < result.length; i++ ) { for ( j = 0; j < b.length; j++ ) { - if ( result[i] === b[j] ) { + if ( result[ i ] === b[ j ] ) { result.splice( i, 1 ); i--; break; @@ -1513,14 +716,15 @@ function diff( a, b ) { return result; } -function extend( a, b ) { +function extend( a, b, undefOnly ) { for ( var prop in b ) { if ( hasOwn.call( b, prop ) ) { + // Avoid "Member not found" error in IE8 caused by messing with window.constructor if ( !( prop === "constructor" && a === window ) ) { if ( b[ prop ] === undefined ) { delete a[ prop ]; - } else { + } else if ( !( undefOnly && typeof a[ prop ] !== "undefined" ) ) { a[ prop ] = b[ prop ]; } } @@ -1530,77 +734,680 @@ function extend( a, b ) { return a; } -/** - * @param {HTMLElement} elem - * @param {string} type - * @param {Function} fn - */ -function addEvent( elem, type, fn ) { - // Standards-based browsers - if ( elem.addEventListener ) { - elem.addEventListener( type, fn, false ); - // IE - } else { - elem.attachEvent( "on" + type, fn ); +function runLoggingCallbacks( key, args ) { + var i, l, callbacks; + + callbacks = config.callbacks[ key ]; + for ( i = 0, l = callbacks.length; i < l; i++ ) { + callbacks[ i ]( args ); } } -/** - * @param {Array|NodeList} elems - * @param {string} type - * @param {Function} fn - */ -function addEvents( elems, type, fn ) { - var i = elems.length; - while ( i-- ) { - addEvent( elems[i], type, fn ); - } -} +// DEPRECATED: This will be removed on 2.0.0+ +// This function verifies if the loggingCallbacks were modified by the user +// If so, it will restore it, assign the given callback and print a console warning +function verifyLoggingCallbacks() { + var loggingCallback, userCallback; -function hasClass( elem, name ) { - return (" " + elem.className + " ").indexOf(" " + name + " ") > -1; -} + for ( loggingCallback in loggingCallbacks ) { + if ( QUnit[ loggingCallback ] !== loggingCallbacks[ loggingCallback ] ) { -function addClass( elem, name ) { - if ( !hasClass( elem, name ) ) { - elem.className += (elem.className ? " " : "") + name; - } -} + userCallback = QUnit[ loggingCallback ]; -function removeClass( elem, name ) { - var set = " " + elem.className + " "; - // Class name may appear multiple times - while ( set.indexOf(" " + name + " ") > -1 ) { - set = set.replace(" " + name + " " , " "); - } - // If possible, trim it for prettiness, but not necessarily - elem.className = typeof set.trim === "function" ? set.trim() : set.replace(/^\s+|\s+$/g, ""); -} + // Restore the callback function + QUnit[ loggingCallback ] = loggingCallbacks[ loggingCallback ]; -function id( name ) { - return !!( typeof document !== "undefined" && document && document.getElementById ) && - document.getElementById( name ); -} + // Assign the deprecated given callback + QUnit[ loggingCallback ]( userCallback ); -function registerLoggingCallback( key ) { - return function( callback ) { - config[key].push( callback ); - }; -} - -// Supports deprecated method of completely overwriting logging callbacks -function runLoggingCallbacks( key, scope, args ) { - var i, callbacks; - if ( QUnit.hasOwnProperty( key ) ) { - QUnit[ key ].call(scope, args ); - } else { - callbacks = config[ key ]; - for ( i = 0; i < callbacks.length; i++ ) { - callbacks[ i ].call( scope, args ); + if ( window.console && window.console.warn ) { + window.console.warn( + "QUnit." + loggingCallback + " was replaced with a new value.\n" + + "Please, check out the documentation on how to apply logging callbacks.\n" + + "Reference: http://api.qunitjs.com/category/callbacks/" + ); + } } } } +// from jquery.js +function inArray( elem, array ) { + if ( array.indexOf ) { + return array.indexOf( elem ); + } + + for ( var i = 0, length = array.length; i < length; i++ ) { + if ( array[ i ] === elem ) { + return i; + } + } + + return -1; +} + +function Test( settings ) { + var i, l; + + ++Test.count; + + extend( this, settings ); + this.assertions = []; + this.semaphore = 0; + this.usedAsync = false; + this.module = config.currentModule; + this.stack = sourceFromStacktrace( 3 ); + + // Register unique strings + for ( i = 0, l = this.module.tests; i < l.length; i++ ) { + if ( this.module.tests[ i ].name === this.testName ) { + this.testName += " "; + } + } + + this.testId = generateHash( this.module.name, this.testName ); + + this.module.tests.push({ + name: this.testName, + testId: this.testId + }); + + if ( settings.skip ) { + + // Skipped tests will fully ignore any sent callback + this.callback = function() {}; + this.async = false; + this.expected = 0; + } else { + this.assert = new Assert( this ); + } +} + +Test.count = 0; + +Test.prototype = { + before: function() { + if ( + + // Emit moduleStart when we're switching from one module to another + this.module !== config.previousModule || + + // They could be equal (both undefined) but if the previousModule property doesn't + // yet exist it means this is the first test in a suite that isn't wrapped in a + // module, in which case we'll just emit a moduleStart event for 'undefined'. + // Without this, reporters can get testStart before moduleStart which is a problem. + !hasOwn.call( config, "previousModule" ) + ) { + if ( hasOwn.call( config, "previousModule" ) ) { + runLoggingCallbacks( "moduleDone", { + name: config.previousModule.name, + tests: config.previousModule.tests, + failed: config.moduleStats.bad, + passed: config.moduleStats.all - config.moduleStats.bad, + total: config.moduleStats.all, + runtime: now() - config.moduleStats.started + }); + } + config.previousModule = this.module; + config.moduleStats = { all: 0, bad: 0, started: now() }; + runLoggingCallbacks( "moduleStart", { + name: this.module.name, + tests: this.module.tests + }); + } + + config.current = this; + + this.testEnvironment = extend( {}, this.module.testEnvironment ); + delete this.testEnvironment.beforeEach; + delete this.testEnvironment.afterEach; + + this.started = now(); + runLoggingCallbacks( "testStart", { + name: this.testName, + module: this.module.name, + testId: this.testId + }); + + if ( !config.pollution ) { + saveGlobal(); + } + }, + + run: function() { + var promise; + + config.current = this; + + if ( this.async ) { + QUnit.stop(); + } + + this.callbackStarted = now(); + + if ( config.notrycatch ) { + promise = this.callback.call( this.testEnvironment, this.assert ); + this.resolvePromise( promise ); + return; + } + + try { + promise = this.callback.call( this.testEnvironment, this.assert ); + this.resolvePromise( promise ); + } catch ( e ) { + this.pushFailure( "Died on test #" + ( this.assertions.length + 1 ) + " " + + this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) ); + + // else next test will carry the responsibility + saveGlobal(); + + // Restart the tests if they're blocking + if ( config.blocking ) { + QUnit.start(); + } + } + }, + + after: function() { + checkPollution(); + }, + + queueHook: function( hook, hookName ) { + var promise, + test = this; + return function runHook() { + config.current = test; + if ( config.notrycatch ) { + promise = hook.call( test.testEnvironment, test.assert ); + test.resolvePromise( promise, hookName ); + return; + } + try { + promise = hook.call( test.testEnvironment, test.assert ); + test.resolvePromise( promise, hookName ); + } catch ( error ) { + test.pushFailure( hookName + " failed on " + test.testName + ": " + + ( error.message || error ), extractStacktrace( error, 0 ) ); + } + }; + }, + + // Currently only used for module level hooks, can be used to add global level ones + hooks: function( handler ) { + var hooks = []; + + // Hooks are ignored on skipped tests + if ( this.skip ) { + return hooks; + } + + if ( this.module.testEnvironment && + QUnit.objectType( this.module.testEnvironment[ handler ] ) === "function" ) { + hooks.push( this.queueHook( this.module.testEnvironment[ handler ], handler ) ); + } + + return hooks; + }, + + finish: function() { + config.current = this; + if ( config.requireExpects && this.expected === null ) { + this.pushFailure( "Expected number of assertions to be defined, but expect() was " + + "not called.", this.stack ); + } else if ( this.expected !== null && this.expected !== this.assertions.length ) { + this.pushFailure( "Expected " + this.expected + " assertions, but " + + this.assertions.length + " were run", this.stack ); + } else if ( this.expected === null && !this.assertions.length ) { + this.pushFailure( "Expected at least one assertion, but none were run - call " + + "expect(0) to accept zero assertions.", this.stack ); + } + + var i, + bad = 0; + + this.runtime = now() - this.started; + config.stats.all += this.assertions.length; + config.moduleStats.all += this.assertions.length; + + for ( i = 0; i < this.assertions.length; i++ ) { + if ( !this.assertions[ i ].result ) { + bad++; + config.stats.bad++; + config.moduleStats.bad++; + } + } + + runLoggingCallbacks( "testDone", { + name: this.testName, + module: this.module.name, + skipped: !!this.skip, + failed: bad, + passed: this.assertions.length - bad, + total: this.assertions.length, + runtime: this.runtime, + + // HTML Reporter use + assertions: this.assertions, + testId: this.testId, + + // DEPRECATED: this property will be removed in 2.0.0, use runtime instead + duration: this.runtime + }); + + // QUnit.reset() is deprecated and will be replaced for a new + // fixture reset function on QUnit 2.0/2.1. + // It's still called here for backwards compatibility handling + QUnit.reset(); + + config.current = undefined; + }, + + queue: function() { + var bad, + test = this; + + if ( !this.valid() ) { + return; + } + + function run() { + + // each of these can by async + synchronize([ + function() { + test.before(); + }, + + test.hooks( "beforeEach" ), + + function() { + test.run(); + }, + + test.hooks( "afterEach" ).reverse(), + + function() { + test.after(); + }, + function() { + test.finish(); + } + ]); + } + + // `bad` initialized at top of scope + // defer when previous test run passed, if storage is available + bad = QUnit.config.reorder && defined.sessionStorage && + +sessionStorage.getItem( "qunit-test-" + this.module.name + "-" + this.testName ); + + if ( bad ) { + run(); + } else { + synchronize( run, true ); + } + }, + + push: function( result, actual, expected, message ) { + var source, + details = { + module: this.module.name, + name: this.testName, + result: result, + message: message, + actual: actual, + expected: expected, + testId: this.testId, + runtime: now() - this.started + }; + + if ( !result ) { + source = sourceFromStacktrace(); + + if ( source ) { + details.source = source; + } + } + + runLoggingCallbacks( "log", details ); + + this.assertions.push({ + result: !!result, + message: message + }); + }, + + pushFailure: function( message, source, actual ) { + if ( !this instanceof Test ) { + throw new Error( "pushFailure() assertion outside test context, was " + + sourceFromStacktrace( 2 ) ); + } + + var details = { + module: this.module.name, + name: this.testName, + result: false, + message: message || "error", + actual: actual || null, + testId: this.testId, + runtime: now() - this.started + }; + + if ( source ) { + details.source = source; + } + + runLoggingCallbacks( "log", details ); + + this.assertions.push({ + result: false, + message: message + }); + }, + + resolvePromise: function( promise, phase ) { + var then, message, + test = this; + if ( promise != null ) { + then = promise.then; + if ( QUnit.objectType( then ) === "function" ) { + QUnit.stop(); + then.call( + promise, + QUnit.start, + function( error ) { + message = "Promise rejected " + + ( !phase ? "during" : phase.replace( /Each$/, "" ) ) + + " " + test.testName + ": " + ( error.message || error ); + test.pushFailure( message, extractStacktrace( error, 0 ) ); + + // else next test will carry the responsibility + saveGlobal(); + + // Unblock + QUnit.start(); + } + ); + } + } + }, + + valid: function() { + var include, + filter = config.filter && config.filter.toLowerCase(), + module = QUnit.urlParams.module && QUnit.urlParams.module.toLowerCase(), + fullName = ( this.module.name + ": " + this.testName ).toLowerCase(); + + // Internally-generated tests are always valid + if ( this.callback && this.callback.validTest ) { + return true; + } + + if ( config.testId.length > 0 && inArray( this.testId, config.testId ) < 0 ) { + return false; + } + + if ( module && ( !this.module.name || this.module.name.toLowerCase() !== module ) ) { + return false; + } + + if ( !filter ) { + return true; + } + + include = filter.charAt( 0 ) !== "!"; + if ( !include ) { + filter = filter.slice( 1 ); + } + + // If the filter matches, we need to honour include + if ( fullName.indexOf( filter ) !== -1 ) { + return include; + } + + // Otherwise, do the opposite + return !include; + } + +}; + +// Resets the test setup. Useful for tests that modify the DOM. +/* +DEPRECATED: Use multiple tests instead of resetting inside a test. +Use testStart or testDone for custom cleanup. +This method will throw an error in 2.0, and will be removed in 2.1 +*/ +QUnit.reset = function() { + + // Return on non-browser environments + // This is necessary to not break on node tests + if ( typeof window === "undefined" ) { + return; + } + + var fixture = defined.document && document.getElementById && + document.getElementById( "qunit-fixture" ); + + if ( fixture ) { + fixture.innerHTML = config.fixture; + } +}; + +QUnit.pushFailure = function() { + if ( !QUnit.config.current ) { + throw new Error( "pushFailure() assertion outside test context, in " + + sourceFromStacktrace( 2 ) ); + } + + // Gets current test obj + var currentTest = QUnit.config.current; + + return currentTest.pushFailure.apply( currentTest, arguments ); +}; + +// Based on Java's String.hashCode, a simple but not +// rigorously collision resistant hashing function +function generateHash( module, testName ) { + var hex, + i = 0, + hash = 0, + str = module + "\x1C" + testName, + len = str.length; + + for ( ; i < len; i++ ) { + hash = ( ( hash << 5 ) - hash ) + str.charCodeAt( i ); + hash |= 0; + } + + // Convert the possibly negative integer hash code into an 8 character hex string, which isn't + // strictly necessary but increases user understanding that the id is a SHA-like hash + hex = ( 0x100000000 + hash ).toString( 16 ); + if ( hex.length < 8 ) { + hex = "0000000" + hex; + } + + return hex.slice( -8 ); +} + +function Assert( testContext ) { + this.test = testContext; +} + +// Assert helpers +QUnit.assert = Assert.prototype = { + + // Specify the number of expected assertions to guarantee that failed test + // (no assertions are run at all) don't slip through. + expect: function( asserts ) { + if ( arguments.length === 1 ) { + this.test.expected = asserts; + } else { + return this.test.expected; + } + }, + + // Increment this Test's semaphore counter, then return a single-use function that + // decrements that counter a maximum of once. + async: function() { + var test = this.test, + popped = false; + + test.semaphore += 1; + test.usedAsync = true; + pauseProcessing(); + + return function done() { + if ( !popped ) { + test.semaphore -= 1; + popped = true; + resumeProcessing(); + } else { + test.pushFailure( "Called the callback returned from `assert.async` more than once", + sourceFromStacktrace( 2 ) ); + } + }; + }, + + // Exports test.push() to the user API + push: function( /* result, actual, expected, message */ ) { + var assert = this, + currentTest = ( assert instanceof Assert && assert.test ) || QUnit.config.current; + + // Backwards compatibility fix. + // Allows the direct use of global exported assertions and QUnit.assert.* + // Although, it's use is not recommended as it can leak assertions + // to other tests from async tests, because we only get a reference to the current test, + // not exactly the test where assertion were intended to be called. + if ( !currentTest ) { + throw new Error( "assertion outside test context, in " + sourceFromStacktrace( 2 ) ); + } + + if ( currentTest.usedAsync === true && currentTest.semaphore === 0 ) { + currentTest.pushFailure( "Assertion after the final `assert.async` was resolved", + sourceFromStacktrace( 2 ) ); + + // Allow this assertion to continue running anyway... + } + + if ( !( assert instanceof Assert ) ) { + assert = currentTest.assert; + } + return assert.test.push.apply( assert.test, arguments ); + }, + + ok: function( result, message ) { + message = message || ( result ? "okay" : "failed, expected argument to be truthy, was: " + + QUnit.dump.parse( result ) ); + this.push( !!result, result, true, message ); + }, + + notOk: function( result, message ) { + message = message || ( !result ? "okay" : "failed, expected argument to be falsy, was: " + + QUnit.dump.parse( result ) ); + this.push( !result, result, false, message ); + }, + + equal: function( actual, expected, message ) { + /*jshint eqeqeq:false */ + this.push( expected == actual, actual, expected, message ); + }, + + notEqual: function( actual, expected, message ) { + /*jshint eqeqeq:false */ + this.push( expected != actual, actual, expected, message ); + }, + + propEqual: function( actual, expected, message ) { + actual = objectValues( actual ); + expected = objectValues( expected ); + this.push( QUnit.equiv( actual, expected ), actual, expected, message ); + }, + + notPropEqual: function( actual, expected, message ) { + actual = objectValues( actual ); + expected = objectValues( expected ); + this.push( !QUnit.equiv( actual, expected ), actual, expected, message ); + }, + + deepEqual: function( actual, expected, message ) { + this.push( QUnit.equiv( actual, expected ), actual, expected, message ); + }, + + notDeepEqual: function( actual, expected, message ) { + this.push( !QUnit.equiv( actual, expected ), actual, expected, message ); + }, + + strictEqual: function( actual, expected, message ) { + this.push( expected === actual, actual, expected, message ); + }, + + notStrictEqual: function( actual, expected, message ) { + this.push( expected !== actual, actual, expected, message ); + }, + + "throws": function( block, expected, message ) { + var actual, expectedType, + expectedOutput = expected, + ok = false, + currentTest = ( this instanceof Assert && this.test ) || QUnit.config.current; + + // 'expected' is optional unless doing string comparison + if ( message == null && typeof expected === "string" ) { + message = expected; + expected = null; + } + + currentTest.ignoreGlobalErrors = true; + try { + block.call( currentTest.testEnvironment ); + } catch (e) { + actual = e; + } + currentTest.ignoreGlobalErrors = false; + + if ( actual ) { + expectedType = QUnit.objectType( expected ); + + // we don't want to validate thrown error + if ( !expected ) { + ok = true; + expectedOutput = null; + + // expected is a regexp + } else if ( expectedType === "regexp" ) { + ok = expected.test( errorString( actual ) ); + + // expected is a string + } else if ( expectedType === "string" ) { + ok = expected === errorString( actual ); + + // expected is a constructor, maybe an Error constructor + } else if ( expectedType === "function" && actual instanceof expected ) { + ok = true; + + // expected is an Error object + } else if ( expectedType === "object" ) { + ok = actual instanceof expected.constructor && + actual.name === expected.name && + actual.message === expected.message; + + // expected is a validation function which returns true if validation passed + } else if ( expectedType === "function" && expected.call( {}, actual ) === true ) { + expectedOutput = null; + ok = true; + } + } + + currentTest.assert.push( ok, actual, expectedOutput, message ); + } +}; + +// Provide an alternative to assert.throws(), for enviroments that consider throws a reserved word +// Known to us are: Closure Compiler, Narwhal +(function() { + /*jshint sub:true */ + Assert.prototype.raises = Assert.prototype[ "throws" ]; +}()); + // Test for equality any JavaScript type. // Author: Philippe Rathé QUnit.equiv = (function() { @@ -1619,22 +1426,26 @@ QUnit.equiv = (function() { // the real equiv function var innerEquiv, + // stack to decide between skip/abort functions callers = [], + // stack to avoiding loops from circular referencing parents = [], parentsB = [], - getProto = Object.getPrototypeOf || function ( obj ) { - /*jshint camelcase:false */ + getProto = Object.getPrototypeOf || function( obj ) { + /* jshint camelcase: false, proto: true */ return obj.__proto__; }, - callbacks = (function () { + callbacks = (function() { // for string, boolean, number and null function useStrictEquality( b, a ) { + /*jshint eqeqeq:false */ if ( b instanceof a.constructor || a instanceof b.constructor ) { + // to catch short annotation VS 'new' annotation of a // declaration // e.g. var i = 1; @@ -1662,10 +1473,13 @@ QUnit.equiv = (function() { "regexp": function( b, a ) { return QUnit.objectType( b ) === "regexp" && + // the regex itself a.source === b.source && + // and its modifiers a.global === b.global && + // (gmi) ... a.ignoreCase === b.ignoreCase && a.multiline === b.multiline && @@ -1676,7 +1490,7 @@ QUnit.equiv = (function() { // - abort otherwise, // initial === would have catch identical references anyway "function": function() { - var caller = callers[callers.length - 1]; + var caller = callers[ callers.length - 1 ]; return caller !== Object && typeof caller !== "undefined"; }, @@ -1700,10 +1514,10 @@ QUnit.equiv = (function() { for ( i = 0; i < len; i++ ) { loop = false; for ( j = 0; j < parents.length; j++ ) { - aCircular = parents[j] === a[i]; - bCircular = parentsB[j] === b[i]; + aCircular = parents[ j ] === a[ i ]; + bCircular = parentsB[ j ] === b[ i ]; if ( aCircular || bCircular ) { - if ( a[i] === b[i] || aCircular && bCircular ) { + if ( a[ i ] === b[ i ] || aCircular && bCircular ) { loop = true; } else { parents.pop(); @@ -1712,7 +1526,7 @@ QUnit.equiv = (function() { } } } - if ( !loop && !innerEquiv(a[i], b[i]) ) { + if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) { parents.pop(); parentsB.pop(); return false; @@ -1724,6 +1538,7 @@ QUnit.equiv = (function() { }, "object": function( b, a ) { + /*jshint forin:false */ var i, j, loop, aCircular, bCircular, // Default to true @@ -1734,11 +1549,12 @@ QUnit.equiv = (function() { // comparing constructors is more strict than using // instanceof if ( a.constructor !== b.constructor ) { + // Allow objects with no prototype to be equivalent to // objects with Object as their constructor. - if ( !(( getProto(a) === null && getProto(b) === Object.prototype ) || - ( getProto(b) === null && getProto(a) === Object.prototype ) ) ) { - return false; + if ( !( ( getProto( a ) === null && getProto( b ) === Object.prototype ) || + ( getProto( b ) === null && getProto( a ) === Object.prototype ) ) ) { + return false; } } @@ -1753,10 +1569,10 @@ QUnit.equiv = (function() { for ( i in a ) { loop = false; for ( j = 0; j < parents.length; j++ ) { - aCircular = parents[j] === a[i]; - bCircular = parentsB[j] === b[i]; + aCircular = parents[ j ] === a[ i ]; + bCircular = parentsB[ j ] === b[ i ]; if ( aCircular || bCircular ) { - if ( a[i] === b[i] || aCircular && bCircular ) { + if ( a[ i ] === b[ i ] || aCircular && bCircular ) { loop = true; } else { eq = false; @@ -1764,8 +1580,8 @@ QUnit.equiv = (function() { } } } - aProperties.push(i); - if ( !loop && !innerEquiv(a[i], b[i]) ) { + aProperties.push( i ); + if ( !loop && !innerEquiv( a[ i ], b[ i ] ) ) { eq = false; break; } @@ -1791,35 +1607,30 @@ QUnit.equiv = (function() { return true; // end transition } - return (function( a, b ) { + return ( (function( a, b ) { if ( a === b ) { return true; // catch the most you can } else if ( a === null || b === null || typeof a === "undefined" || typeof b === "undefined" || - QUnit.objectType(a) !== QUnit.objectType(b) ) { - return false; // don't lose time with error prone cases + QUnit.objectType( a ) !== QUnit.objectType( b ) ) { + + // don't lose time with error prone cases + return false; } else { - return bindCallbacks(a, callbacks, [ b, a ]); + return bindCallbacks( a, callbacks, [ b, a ] ); } // apply transition with (1..n) arguments - }( args[0], args[1] ) && innerEquiv.apply( this, args.splice(1, args.length - 1 )) ); + }( args[ 0 ], args[ 1 ] ) ) && + innerEquiv.apply( this, args.splice( 1, args.length - 1 ) ) ); }; return innerEquiv; }()); -/** - * jsDump Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com | - * http://flesler.blogspot.com Licensed under BSD - * (http://www.opensource.org/licenses/bsd-license.php) Date: 5/15/2008 - * - * @projectDescription Advanced and extensible data dumping for Javascript. - * @version 1.0.0 - * @author Ariel Flesler - * @link {http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html} - */ -QUnit.jsDump = (function() { +// Based on jsDump by Ariel Flesler +// http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html +QUnit.dump = (function() { function quote( str ) { return "\"" + str.toString().replace( /"/g, "\\\"" ) + "\""; } @@ -1827,48 +1638,57 @@ QUnit.jsDump = (function() { return o + ""; } function join( pre, arr, post ) { - var s = jsDump.separator(), - base = jsDump.indent(), - inner = jsDump.indent(1); + var s = dump.separator(), + base = dump.indent(), + inner = dump.indent( 1 ); if ( arr.join ) { arr = arr.join( "," + s + inner ); } if ( !arr ) { return pre + post; } - return [ pre, inner + arr, base + post ].join(s); + return [ pre, inner + arr, base + post ].join( s ); } function array( arr, stack ) { - var i = arr.length, ret = new Array(i); + var i = arr.length, + ret = new Array( i ); + + if ( dump.maxDepth && dump.depth > dump.maxDepth ) { + return "[object Array]"; + } + this.up(); while ( i-- ) { - ret[i] = this.parse( arr[i] , undefined , stack); + ret[ i ] = this.parse( arr[ i ], undefined, stack ); } this.down(); return join( "[", ret, "]" ); } var reName = /^function (\w+)/, - jsDump = { - // type is used mostly internally, you can fix a (custom)type in advance - parse: function( obj, type, stack ) { - stack = stack || [ ]; - var inStack, res, - parser = this.parsers[ type || this.typeOf(obj) ]; + dump = { - type = typeof parser; - inStack = inArray( obj, stack ); + // objType is used mostly internally, you can fix a (custom) type in advance + parse: function( obj, objType, stack ) { + stack = stack || []; + var res, parser, parserType, + inStack = inArray( obj, stack ); if ( inStack !== -1 ) { - return "recursion(" + (inStack - stack.length) + ")"; + return "recursion(" + ( inStack - stack.length ) + ")"; } - if ( type === "function" ) { + + objType = objType || this.typeOf( obj ); + parser = this.parsers[ objType ]; + parserType = typeof parser; + + if ( parserType === "function" ) { stack.push( obj ); res = parser.call( this, obj, stack ); stack.pop(); return res; } - return ( type === "string" ) ? parser : this.parsers.error; + return ( parserType === "string" ) ? parser : this.parsers.error; }, typeOf: function( obj ) { var type; @@ -1876,23 +1696,29 @@ QUnit.jsDump = (function() { type = "null"; } else if ( typeof obj === "undefined" ) { type = "undefined"; - } else if ( QUnit.is( "regexp", obj) ) { + } else if ( QUnit.is( "regexp", obj ) ) { type = "regexp"; - } else if ( QUnit.is( "date", obj) ) { + } else if ( QUnit.is( "date", obj ) ) { type = "date"; - } else if ( QUnit.is( "function", obj) ) { + } else if ( QUnit.is( "function", obj ) ) { type = "function"; - } else if ( typeof obj.setInterval !== undefined && typeof obj.document !== "undefined" && typeof obj.nodeType === "undefined" ) { + } else if ( obj.setInterval !== undefined && + obj.document !== undefined && + obj.nodeType === undefined ) { type = "window"; } else if ( obj.nodeType === 9 ) { type = "document"; } else if ( obj.nodeType ) { type = "node"; } else if ( + // native arrays toString.call( obj ) === "[object Array]" || + // NodeList objects - ( typeof obj.length === "number" && typeof obj.item !== "undefined" && ( obj.length ? obj.item(0) === obj[0] : ( obj.item( 0 ) === null && typeof obj[0] === "undefined" ) ) ) + ( typeof obj.length === "number" && obj.item !== undefined && + ( obj.length ? obj.item( 0 ) === obj[ 0 ] : ( obj.item( 0 ) === null && + obj[ 0 ] === undefined ) ) ) ) { type = "array"; } else if ( obj.constructor === Error.prototype.constructor ) { @@ -1903,7 +1729,7 @@ QUnit.jsDump = (function() { return type; }, separator: function() { - return this.multiline ? this.HTML ? "
      " : "\n" : this.HTML ? " " : " "; + return this.multiline ? this.HTML ? "
      " : "\n" : this.HTML ? " " : " "; }, // extra can be a number, shortcut for increasing-calling-decreasing indent: function( extra ) { @@ -1912,9 +1738,9 @@ QUnit.jsDump = (function() { } var chr = this.indentChar; if ( this.HTML ) { - chr = chr.replace( /\t/g, " " ).replace( / /g, " " ); + chr = chr.replace( /\t/g, " " ).replace( / /g, " " ); } - return new Array( this.depth + ( extra || 0 ) ).join(chr); + return new Array( this.depth + ( extra || 0 ) ).join( chr ); }, up: function( a ) { this.depth += a || 1; @@ -1923,7 +1749,7 @@ QUnit.jsDump = (function() { this.depth -= a || 1; }, setParser: function( name, parser ) { - this.parsers[name] = parser; + this.parsers[ name ] = parser; }, // The next 3 are exposed so you can use them quote: quote, @@ -1931,11 +1757,13 @@ QUnit.jsDump = (function() { join: join, // depth: 1, - // This is the list of parsers, to modify them, use jsDump.setParser + maxDepth: QUnit.config.maxDepth, + + // This is the list of parsers, to modify them, use dump.setParser parsers: { window: "[Window]", document: "[Document]", - error: function(error) { + error: function( error ) { return "Error(\"" + error.message + "\")"; }, unknown: "[Unknown]", @@ -1943,52 +1771,71 @@ QUnit.jsDump = (function() { "undefined": "undefined", "function": function( fn ) { var ret = "function", + // functions never have name in IE - name = "name" in fn ? fn.name : (reName.exec(fn) || [])[1]; + name = "name" in fn ? fn.name : ( reName.exec( fn ) || [] )[ 1 ]; if ( name ) { ret += " " + name; } ret += "( "; - ret = [ ret, QUnit.jsDump.parse( fn, "functionArgs" ), "){" ].join( "" ); - return join( ret, QUnit.jsDump.parse(fn,"functionCode" ), "}" ); + ret = [ ret, dump.parse( fn, "functionArgs" ), "){" ].join( "" ); + return join( ret, dump.parse( fn, "functionCode" ), "}" ); }, array: array, nodelist: array, "arguments": array, object: function( map, stack ) { - /*jshint forin:false */ - var ret = [ ], keys, key, val, i; - QUnit.jsDump.up(); + var keys, key, val, i, nonEnumerableProperties, + ret = []; + + if ( dump.maxDepth && dump.depth > dump.maxDepth ) { + return "[object Object]"; + } + + dump.up(); keys = []; for ( key in map ) { keys.push( key ); } + + // Some properties are not always enumerable on Error objects. + nonEnumerableProperties = [ "message", "name" ]; + for ( i in nonEnumerableProperties ) { + key = nonEnumerableProperties[ i ]; + if ( key in map && inArray( key, keys ) < 0 ) { + keys.push( key ); + } + } keys.sort(); for ( i = 0; i < keys.length; i++ ) { key = keys[ i ]; val = map[ key ]; - ret.push( QUnit.jsDump.parse( key, "key" ) + ": " + QUnit.jsDump.parse( val, undefined, stack ) ); + ret.push( dump.parse( key, "key" ) + ": " + + dump.parse( val, undefined, stack ) ); } - QUnit.jsDump.down(); + dump.down(); return join( "{", ret, "}" ); }, node: function( node ) { var len, i, val, - open = QUnit.jsDump.HTML ? "<" : "<", - close = QUnit.jsDump.HTML ? ">" : ">", + open = dump.HTML ? "<" : "<", + close = dump.HTML ? ">" : ">", tag = node.nodeName.toLowerCase(), ret = open + tag, attrs = node.attributes; if ( attrs ) { for ( i = 0, len = attrs.length; i < len; i++ ) { - val = attrs[i].nodeValue; - // IE6 includes all attributes in .attributes, even ones not explicitly set. - // Those have values like undefined, null, 0, false, "" or "inherit". + val = attrs[ i ].nodeValue; + + // IE6 includes all attributes in .attributes, even ones not explicitly + // set. Those have values like undefined, null, 0, false, "" or + // "inherit". if ( val && val !== "inherit" ) { - ret += " " + attrs[i].nodeName + "=" + QUnit.jsDump.parse( val, "attribute" ); + ret += " " + attrs[ i ].nodeName + "=" + + dump.parse( val, "attribute" ); } } } @@ -2001,6 +1848,7 @@ QUnit.jsDump = (function() { return ret + open + "/" + tag + close; }, + // function calls it internally, it's the arguments part of the function functionArgs: function( fn ) { var args, @@ -2010,10 +1858,11 @@ QUnit.jsDump = (function() { return ""; } - args = new Array(l); + args = new Array( l ); while ( l-- ) { + // 97 is 'a' - args[l] = String.fromCharCode(97+l); + args[ l ] = String.fromCharCode( 97 + l ); } return " " + args.join( ", " ) + " "; }, @@ -2037,176 +1886,1943 @@ QUnit.jsDump = (function() { multiline: true }; - return jsDump; + return dump; }()); -// from jquery.js -function inArray( elem, array ) { - if ( array.indexOf ) { - return array.indexOf( elem ); - } +// back compat +QUnit.jsDump = QUnit.dump; - for ( var i = 0, length = array.length; i < length; i++ ) { - if ( array[ i ] === elem ) { - return i; +// For browser, export only select globals +if ( typeof window !== "undefined" ) { + + // Deprecated + // Extend assert methods to QUnit and Global scope through Backwards compatibility + (function() { + var i, + assertions = Assert.prototype; + + function applyCurrent( current ) { + return function() { + var assert = new Assert( QUnit.config.current ); + current.apply( assert, arguments ); + }; } - } - return -1; + for ( i in assertions ) { + QUnit[ i ] = applyCurrent( assertions[ i ] ); + } + })(); + + (function() { + var i, l, + keys = [ + "test", + "module", + "expect", + "asyncTest", + "start", + "stop", + "ok", + "notOk", + "equal", + "notEqual", + "propEqual", + "notPropEqual", + "deepEqual", + "notDeepEqual", + "strictEqual", + "notStrictEqual", + "throws" + ]; + + for ( i = 0, l = keys.length; i < l; i++ ) { + window[ keys[ i ] ] = QUnit[ keys[ i ] ]; + } + })(); + + window.QUnit = QUnit; } +// For nodejs +if ( typeof module !== "undefined" && module && module.exports ) { + module.exports = QUnit; + + // For consistency with CommonJS environments' exports + module.exports.QUnit = QUnit; +} + +// For CommonJS with exports, but without module.exports, like Rhino +if ( typeof exports !== "undefined" && exports ) { + exports.QUnit = QUnit; +} + +if ( typeof define === "function" && define.amd ) { + define( function() { + return QUnit; + } ); + QUnit.config.autostart = false; +} + +// Get a reference to the global object, like window in browsers +}( (function() { + return this; +})() )); + +/*istanbul ignore next */ +// jscs:disable maximumLineLength /* - * Javascript Diff Algorithm - * By John Resig (http://ejohn.org/) - * Modified by Chu Alan "sprite" + * This file is a modified version of google-diff-match-patch's JavaScript implementation + * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js), + * modifications are licensed as more fully set forth in LICENSE.txt. * - * Released under the MIT license. + * The original source of google-diff-match-patch is attributable and licensed as follows: + * + * Copyright 2006 Google Inc. + * http://code.google.com/p/google-diff-match-patch/ + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. * * More Info: - * http://ejohn.org/projects/javascript-diff-algorithm/ + * https://code.google.com/p/google-diff-match-patch/ * * Usage: QUnit.diff(expected, actual) * - * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) == "the quick brown fox jumped jumps over" + * QUnit.diff( "the quick brown fox jumped over", "the quick fox jumps over" ) === "the quick brown fox jumpsed 0; i-- ) { - if ( n[i].text != null && n[ i - 1 ].text == null && n[i].row > 0 && o[ n[i].row - 1 ].text == null && - n[ i - 1 ] == o[ n[i].row - 1 ]) { + /** + * Find the differences between two texts. Simplifies the problem by stripping + * any common prefix or suffix off the texts before diffing. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {boolean=} optChecklines Optional speedup flag. If present and false, + * then don't run a line-level diff first to identify the changed areas. + * Defaults to true, which does a faster, slightly less optimal diff. + * @param {number} optDeadline Optional time when the diff should be complete + * by. Used internally for recursive calls. Users should set DiffTimeout + * instead. + * @return {!Array.} Array of diff tuples. + */ + DiffMatchPatch.prototype.DiffMain = function( text1, text2, optChecklines, optDeadline ) { + var deadline, checklines, commonlength, + commonprefix, commonsuffix, diffs; + // Set a deadline by which time the diff must be complete. + if ( typeof optDeadline === "undefined" ) { + if ( this.DiffTimeout <= 0 ) { + optDeadline = Number.MAX_VALUE; + } else { + optDeadline = ( new Date() ).getTime() + this.DiffTimeout * 1000; + } + } + deadline = optDeadline; - n[ i - 1 ] = { - text: n[ i - 1 ], - row: n[i].row - 1 - }; - o[ n[i].row - 1 ] = { - text: o[ n[i].row - 1 ], - row: i - 1 - }; - } - } + // Check for null inputs. + if ( text1 === null || text2 === null ) { + throw new Error( "Null input. (DiffMain)" ); + } - return { - o: o, - n: n - }; + // Check for equality (speedup). + if ( text1 === text2 ) { + if ( text1 ) { + return [ + [ DIFF_EQUAL, text1 ] + ]; + } + return []; + } + + if ( typeof optChecklines === "undefined" ) { + optChecklines = true; + } + + checklines = optChecklines; + + // Trim off common prefix (speedup). + commonlength = this.diffCommonPrefix( text1, text2 ); + commonprefix = text1.substring( 0, commonlength ); + text1 = text1.substring( commonlength ); + text2 = text2.substring( commonlength ); + + // Trim off common suffix (speedup). + ///////// + commonlength = this.diffCommonSuffix( text1, text2 ); + commonsuffix = text1.substring( text1.length - commonlength ); + text1 = text1.substring( 0, text1.length - commonlength ); + text2 = text2.substring( 0, text2.length - commonlength ); + + // Compute the diff on the middle block. + diffs = this.diffCompute( text1, text2, checklines, deadline ); + + // Restore the prefix and suffix. + if ( commonprefix ) { + diffs.unshift( [ DIFF_EQUAL, commonprefix ] ); + } + if ( commonsuffix ) { + diffs.push( [ DIFF_EQUAL, commonsuffix ] ); + } + this.diffCleanupMerge( diffs ); + return diffs; + }; + + /** + * Reduce the number of edits by eliminating operationally trivial equalities. + * @param {!Array.} diffs Array of diff tuples. + */ + DiffMatchPatch.prototype.diffCleanupEfficiency = function( diffs ) { + var changes, equalities, equalitiesLength, lastequality, + pointer, preIns, preDel, postIns, postDel; + changes = false; + equalities = []; // Stack of indices where equalities are found. + equalitiesLength = 0; // Keeping our own length var is faster in JS. + /** @type {?string} */ + lastequality = null; + // Always equal to diffs[equalities[equalitiesLength - 1]][1] + pointer = 0; // Index of current position. + // Is there an insertion operation before the last equality. + preIns = false; + // Is there a deletion operation before the last equality. + preDel = false; + // Is there an insertion operation after the last equality. + postIns = false; + // Is there a deletion operation after the last equality. + postDel = false; + while ( pointer < diffs.length ) { + if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) { // Equality found. + if ( diffs[ pointer ][ 1 ].length < this.DiffEditCost && ( postIns || postDel ) ) { + // Candidate found. + equalities[ equalitiesLength++ ] = pointer; + preIns = postIns; + preDel = postDel; + lastequality = diffs[ pointer ][ 1 ]; + } else { + // Not a candidate, and can never become one. + equalitiesLength = 0; + lastequality = null; + } + postIns = postDel = false; + } else { // An insertion or deletion. + if ( diffs[ pointer ][ 0 ] === DIFF_DELETE ) { + postDel = true; + } else { + postIns = true; + } + /* + * Five types to be split: + * ABXYCD + * AXCD + * ABXC + * AXCD + * ABXC + */ + if ( lastequality && ( ( preIns && preDel && postIns && postDel ) || + ( ( lastequality.length < this.DiffEditCost / 2 ) && + ( preIns + preDel + postIns + postDel ) === 3 ) ) ) { + // Duplicate record. + diffs.splice( equalities[equalitiesLength - 1], 0, [ DIFF_DELETE, lastequality ] ); + // Change second copy to insert. + diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT; + equalitiesLength--; // Throw away the equality we just deleted; + lastequality = null; + if (preIns && preDel) { + // No changes made which could affect previous entry, keep going. + postIns = postDel = true; + equalitiesLength = 0; + } else { + equalitiesLength--; // Throw away the previous equality. + pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1; + postIns = postDel = false; + } + changes = true; + } + } + pointer++; + } + + if ( changes ) { + this.diffCleanupMerge( diffs ); + } + }; + + /** + * Convert a diff array into a pretty HTML report. + * @param {!Array.} diffs Array of diff tuples. + * @param {integer} string to be beautified. + * @return {string} HTML representation. + */ + DiffMatchPatch.prototype.diffPrettyHtml = function( diffs ) { + var op, data, x, html = []; + for ( x = 0; x < diffs.length; x++ ) { + op = diffs[x][0]; // Operation (insert, delete, equal) + data = diffs[x][1]; // Text of change. + switch ( op ) { + case DIFF_INSERT: + html[x] = "" + data + ""; + break; + case DIFF_DELETE: + html[x] = "" + data + ""; + break; + case DIFF_EQUAL: + html[x] = "" + data + ""; + break; + } + } + return html.join(""); + }; + + /** + * Determine the common prefix of two strings. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {number} The number of characters common to the start of each + * string. + */ + DiffMatchPatch.prototype.diffCommonPrefix = function( text1, text2 ) { + var pointermid, pointermax, pointermin, pointerstart; + // Quick check for common null cases. + if ( !text1 || !text2 || text1.charAt(0) !== text2.charAt(0) ) { + return 0; + } + // Binary search. + // Performance analysis: http://neil.fraser.name/news/2007/10/09/ + pointermin = 0; + pointermax = Math.min( text1.length, text2.length ); + pointermid = pointermax; + pointerstart = 0; + while ( pointermin < pointermid ) { + if ( text1.substring( pointerstart, pointermid ) === text2.substring( pointerstart, pointermid ) ) { + pointermin = pointermid; + pointerstart = pointermin; + } else { + pointermax = pointermid; + } + pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin ); + } + return pointermid; + }; + + /** + * Determine the common suffix of two strings. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {number} The number of characters common to the end of each string. + */ + DiffMatchPatch.prototype.diffCommonSuffix = function( text1, text2 ) { + var pointermid, pointermax, pointermin, pointerend; + // Quick check for common null cases. + if (!text1 || !text2 || text1.charAt(text1.length - 1) !== text2.charAt(text2.length - 1)) { + return 0; + } + // Binary search. + // Performance analysis: http://neil.fraser.name/news/2007/10/09/ + pointermin = 0; + pointermax = Math.min(text1.length, text2.length); + pointermid = pointermax; + pointerend = 0; + while ( pointermin < pointermid ) { + if (text1.substring( text1.length - pointermid, text1.length - pointerend ) === + text2.substring( text2.length - pointermid, text2.length - pointerend ) ) { + pointermin = pointermid; + pointerend = pointermin; + } else { + pointermax = pointermid; + } + pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin ); + } + return pointermid; + }; + + /** + * Find the differences between two texts. Assumes that the texts do not + * have any common prefix or suffix. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {boolean} checklines Speedup flag. If false, then don't run a + * line-level diff first to identify the changed areas. + * If true, then run a faster, slightly less optimal diff. + * @param {number} deadline Time when the diff should be complete by. + * @return {!Array.} Array of diff tuples. + * @private + */ + DiffMatchPatch.prototype.diffCompute = function( text1, text2, checklines, deadline ) { + var diffs, longtext, shorttext, i, hm, + text1A, text2A, text1B, text2B, + midCommon, diffsA, diffsB; + + if ( !text1 ) { + // Just add some text (speedup). + return [ + [ DIFF_INSERT, text2 ] + ]; + } + + if (!text2) { + // Just delete some text (speedup). + return [ + [ DIFF_DELETE, text1 ] + ]; + } + + longtext = text1.length > text2.length ? text1 : text2; + shorttext = text1.length > text2.length ? text2 : text1; + i = longtext.indexOf( shorttext ); + if ( i !== -1 ) { + // Shorter text is inside the longer text (speedup). + diffs = [ + [ DIFF_INSERT, longtext.substring( 0, i ) ], + [ DIFF_EQUAL, shorttext ], + [ DIFF_INSERT, longtext.substring( i + shorttext.length ) ] + ]; + // Swap insertions for deletions if diff is reversed. + if ( text1.length > text2.length ) { + diffs[0][0] = diffs[2][0] = DIFF_DELETE; + } + return diffs; + } + + if ( shorttext.length === 1 ) { + // Single character string. + // After the previous speedup, the character can't be an equality. + return [ + [ DIFF_DELETE, text1 ], + [ DIFF_INSERT, text2 ] + ]; + } + + // Check to see if the problem can be split in two. + hm = this.diffHalfMatch(text1, text2); + if (hm) { + // A half-match was found, sort out the return data. + text1A = hm[0]; + text1B = hm[1]; + text2A = hm[2]; + text2B = hm[3]; + midCommon = hm[4]; + // Send both pairs off for separate processing. + diffsA = this.DiffMain(text1A, text2A, checklines, deadline); + diffsB = this.DiffMain(text1B, text2B, checklines, deadline); + // Merge the results. + return diffsA.concat([ + [ DIFF_EQUAL, midCommon ] + ], diffsB); + } + + if (checklines && text1.length > 100 && text2.length > 100) { + return this.diffLineMode(text1, text2, deadline); + } + + return this.diffBisect(text1, text2, deadline); + }; + + /** + * Do the two texts share a substring which is at least half the length of the + * longer text? + * This speedup can produce non-minimal diffs. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {Array.} Five element Array, containing the prefix of + * text1, the suffix of text1, the prefix of text2, the suffix of + * text2 and the common middle. Or null if there was no match. + * @private + */ + DiffMatchPatch.prototype.diffHalfMatch = function(text1, text2) { + var longtext, shorttext, dmp, + text1A, text2B, text2A, text1B, midCommon, + hm1, hm2, hm; + if (this.DiffTimeout <= 0) { + // Don't risk returning a non-optimal diff if we have unlimited time. + return null; + } + longtext = text1.length > text2.length ? text1 : text2; + shorttext = text1.length > text2.length ? text2 : text1; + if (longtext.length < 4 || shorttext.length * 2 < longtext.length) { + return null; // Pointless. + } + dmp = this; // 'this' becomes 'window' in a closure. + + /** + * Does a substring of shorttext exist within longtext such that the substring + * is at least half the length of longtext? + * Closure, but does not reference any external variables. + * @param {string} longtext Longer string. + * @param {string} shorttext Shorter string. + * @param {number} i Start index of quarter length substring within longtext. + * @return {Array.} Five element Array, containing the prefix of + * longtext, the suffix of longtext, the prefix of shorttext, the suffix + * of shorttext and the common middle. Or null if there was no match. + * @private + */ + function diffHalfMatchI(longtext, shorttext, i) { + var seed, j, bestCommon, prefixLength, suffixLength, + bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB; + // Start with a 1/4 length substring at position i as a seed. + seed = longtext.substring(i, i + Math.floor(longtext.length / 4)); + j = -1; + bestCommon = ""; + while ((j = shorttext.indexOf(seed, j + 1)) !== -1) { + prefixLength = dmp.diffCommonPrefix(longtext.substring(i), + shorttext.substring(j)); + suffixLength = dmp.diffCommonSuffix(longtext.substring(0, i), + shorttext.substring(0, j)); + if (bestCommon.length < suffixLength + prefixLength) { + bestCommon = shorttext.substring(j - suffixLength, j) + + shorttext.substring(j, j + prefixLength); + bestLongtextA = longtext.substring(0, i - suffixLength); + bestLongtextB = longtext.substring(i + prefixLength); + bestShorttextA = shorttext.substring(0, j - suffixLength); + bestShorttextB = shorttext.substring(j + prefixLength); + } + } + if (bestCommon.length * 2 >= longtext.length) { + return [ bestLongtextA, bestLongtextB, + bestShorttextA, bestShorttextB, bestCommon + ]; + } else { + return null; + } + } + + // First check if the second quarter is the seed for a half-match. + hm1 = diffHalfMatchI(longtext, shorttext, + Math.ceil(longtext.length / 4)); + // Check again based on the third quarter. + hm2 = diffHalfMatchI(longtext, shorttext, + Math.ceil(longtext.length / 2)); + if (!hm1 && !hm2) { + return null; + } else if (!hm2) { + hm = hm1; + } else if (!hm1) { + hm = hm2; + } else { + // Both matched. Select the longest. + hm = hm1[4].length > hm2[4].length ? hm1 : hm2; + } + + // A half-match was found, sort out the return data. + text1A, text1B, text2A, text2B; + if (text1.length > text2.length) { + text1A = hm[0]; + text1B = hm[1]; + text2A = hm[2]; + text2B = hm[3]; + } else { + text2A = hm[0]; + text2B = hm[1]; + text1A = hm[2]; + text1B = hm[3]; + } + midCommon = hm[4]; + return [ text1A, text1B, text2A, text2B, midCommon ]; + }; + + /** + * Do a quick line-level diff on both strings, then rediff the parts for + * greater accuracy. + * This speedup can produce non-minimal diffs. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {number} deadline Time when the diff should be complete by. + * @return {!Array.} Array of diff tuples. + * @private + */ + DiffMatchPatch.prototype.diffLineMode = function(text1, text2, deadline) { + var a, diffs, linearray, pointer, countInsert, + countDelete, textInsert, textDelete, j; + // Scan the text on a line-by-line basis first. + a = this.diffLinesToChars(text1, text2); + text1 = a.chars1; + text2 = a.chars2; + linearray = a.lineArray; + + diffs = this.DiffMain(text1, text2, false, deadline); + + // Convert the diff back to original text. + this.diffCharsToLines(diffs, linearray); + // Eliminate freak matches (e.g. blank lines) + this.diffCleanupSemantic(diffs); + + // Rediff any replacement blocks, this time character-by-character. + // Add a dummy entry at the end. + diffs.push( [ DIFF_EQUAL, "" ] ); + pointer = 0; + countDelete = 0; + countInsert = 0; + textDelete = ""; + textInsert = ""; + while (pointer < diffs.length) { + switch ( diffs[pointer][0] ) { + case DIFF_INSERT: + countInsert++; + textInsert += diffs[pointer][1]; + break; + case DIFF_DELETE: + countDelete++; + textDelete += diffs[pointer][1]; + break; + case DIFF_EQUAL: + // Upon reaching an equality, check for prior redundancies. + if (countDelete >= 1 && countInsert >= 1) { + // Delete the offending records and add the merged ones. + diffs.splice(pointer - countDelete - countInsert, + countDelete + countInsert); + pointer = pointer - countDelete - countInsert; + a = this.DiffMain(textDelete, textInsert, false, deadline); + for (j = a.length - 1; j >= 0; j--) { + diffs.splice( pointer, 0, a[j] ); + } + pointer = pointer + a.length; + } + countInsert = 0; + countDelete = 0; + textDelete = ""; + textInsert = ""; + break; + } + pointer++; + } + diffs.pop(); // Remove the dummy entry at the end. + + return diffs; + }; + + /** + * Find the 'middle snake' of a diff, split the problem in two + * and return the recursively constructed diff. + * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {number} deadline Time at which to bail if not yet complete. + * @return {!Array.} Array of diff tuples. + * @private + */ + DiffMatchPatch.prototype.diffBisect = function(text1, text2, deadline) { + var text1Length, text2Length, maxD, vOffset, vLength, + v1, v2, x, delta, front, k1start, k1end, k2start, + k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2; + // Cache the text lengths to prevent multiple calls. + text1Length = text1.length; + text2Length = text2.length; + maxD = Math.ceil((text1Length + text2Length) / 2); + vOffset = maxD; + vLength = 2 * maxD; + v1 = new Array(vLength); + v2 = new Array(vLength); + // Setting all elements to -1 is faster in Chrome & Firefox than mixing + // integers and undefined. + for (x = 0; x < vLength; x++) { + v1[x] = -1; + v2[x] = -1; + } + v1[vOffset + 1] = 0; + v2[vOffset + 1] = 0; + delta = text1Length - text2Length; + // If the total number of characters is odd, then the front path will collide + // with the reverse path. + front = (delta % 2 !== 0); + // Offsets for start and end of k loop. + // Prevents mapping of space beyond the grid. + k1start = 0; + k1end = 0; + k2start = 0; + k2end = 0; + for (d = 0; d < maxD; d++) { + // Bail out if deadline is reached. + if ((new Date()).getTime() > deadline) { + break; + } + + // Walk the front path one step. + for (k1 = -d + k1start; k1 <= d - k1end; k1 += 2) { + k1Offset = vOffset + k1; + if ( k1 === -d || ( k1 !== d && v1[ k1Offset - 1 ] < v1[ k1Offset + 1 ] ) ) { + x1 = v1[k1Offset + 1]; + } else { + x1 = v1[k1Offset - 1] + 1; + } + y1 = x1 - k1; + while (x1 < text1Length && y1 < text2Length && + text1.charAt(x1) === text2.charAt(y1)) { + x1++; + y1++; + } + v1[k1Offset] = x1; + if (x1 > text1Length) { + // Ran off the right of the graph. + k1end += 2; + } else if (y1 > text2Length) { + // Ran off the bottom of the graph. + k1start += 2; + } else if (front) { + k2Offset = vOffset + delta - k1; + if (k2Offset >= 0 && k2Offset < vLength && v2[k2Offset] !== -1) { + // Mirror x2 onto top-left coordinate system. + x2 = text1Length - v2[k2Offset]; + if (x1 >= x2) { + // Overlap detected. + return this.diffBisectSplit(text1, text2, x1, y1, deadline); + } + } + } + } + + // Walk the reverse path one step. + for (k2 = -d + k2start; k2 <= d - k2end; k2 += 2) { + k2Offset = vOffset + k2; + if ( k2 === -d || (k2 !== d && v2[ k2Offset - 1 ] < v2[ k2Offset + 1 ] ) ) { + x2 = v2[k2Offset + 1]; + } else { + x2 = v2[k2Offset - 1] + 1; + } + y2 = x2 - k2; + while (x2 < text1Length && y2 < text2Length && + text1.charAt(text1Length - x2 - 1) === + text2.charAt(text2Length - y2 - 1)) { + x2++; + y2++; + } + v2[k2Offset] = x2; + if (x2 > text1Length) { + // Ran off the left of the graph. + k2end += 2; + } else if (y2 > text2Length) { + // Ran off the top of the graph. + k2start += 2; + } else if (!front) { + k1Offset = vOffset + delta - k2; + if (k1Offset >= 0 && k1Offset < vLength && v1[k1Offset] !== -1) { + x1 = v1[k1Offset]; + y1 = vOffset + x1 - k1Offset; + // Mirror x2 onto top-left coordinate system. + x2 = text1Length - x2; + if (x1 >= x2) { + // Overlap detected. + return this.diffBisectSplit(text1, text2, x1, y1, deadline); + } + } + } + } + } + // Diff took too long and hit the deadline or + // number of diffs equals number of characters, no commonality at all. + return [ + [ DIFF_DELETE, text1 ], + [ DIFF_INSERT, text2 ] + ]; + }; + + /** + * Given the location of the 'middle snake', split the diff in two parts + * and recurse. + * @param {string} text1 Old string to be diffed. + * @param {string} text2 New string to be diffed. + * @param {number} x Index of split point in text1. + * @param {number} y Index of split point in text2. + * @param {number} deadline Time at which to bail if not yet complete. + * @return {!Array.} Array of diff tuples. + * @private + */ + DiffMatchPatch.prototype.diffBisectSplit = function( text1, text2, x, y, deadline ) { + var text1a, text1b, text2a, text2b, diffs, diffsb; + text1a = text1.substring(0, x); + text2a = text2.substring(0, y); + text1b = text1.substring(x); + text2b = text2.substring(y); + + // Compute both diffs serially. + diffs = this.DiffMain(text1a, text2a, false, deadline); + diffsb = this.DiffMain(text1b, text2b, false, deadline); + + return diffs.concat(diffsb); + }; + + /** + * Reduce the number of edits by eliminating semantically trivial equalities. + * @param {!Array.} diffs Array of diff tuples. + */ + DiffMatchPatch.prototype.diffCleanupSemantic = function(diffs) { + var changes, equalities, equalitiesLength, lastequality, + pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1, + lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2; + changes = false; + equalities = []; // Stack of indices where equalities are found. + equalitiesLength = 0; // Keeping our own length var is faster in JS. + /** @type {?string} */ + lastequality = null; + // Always equal to diffs[equalities[equalitiesLength - 1]][1] + pointer = 0; // Index of current position. + // Number of characters that changed prior to the equality. + lengthInsertions1 = 0; + lengthDeletions1 = 0; + // Number of characters that changed after the equality. + lengthInsertions2 = 0; + lengthDeletions2 = 0; + while (pointer < diffs.length) { + if (diffs[pointer][0] === DIFF_EQUAL) { // Equality found. + equalities[equalitiesLength++] = pointer; + lengthInsertions1 = lengthInsertions2; + lengthDeletions1 = lengthDeletions2; + lengthInsertions2 = 0; + lengthDeletions2 = 0; + lastequality = diffs[pointer][1]; + } else { // An insertion or deletion. + if (diffs[pointer][0] === DIFF_INSERT) { + lengthInsertions2 += diffs[pointer][1].length; + } else { + lengthDeletions2 += diffs[pointer][1].length; + } + // Eliminate an equality that is smaller or equal to the edits on both + // sides of it. + if (lastequality && (lastequality.length <= + Math.max(lengthInsertions1, lengthDeletions1)) && + (lastequality.length <= Math.max(lengthInsertions2, + lengthDeletions2))) { + // Duplicate record. + diffs.splice( equalities[ equalitiesLength - 1 ], 0, [ DIFF_DELETE, lastequality ] ); + // Change second copy to insert. + diffs[equalities[equalitiesLength - 1] + 1][0] = DIFF_INSERT; + // Throw away the equality we just deleted. + equalitiesLength--; + // Throw away the previous equality (it needs to be reevaluated). + equalitiesLength--; + pointer = equalitiesLength > 0 ? equalities[equalitiesLength - 1] : -1; + lengthInsertions1 = 0; // Reset the counters. + lengthDeletions1 = 0; + lengthInsertions2 = 0; + lengthDeletions2 = 0; + lastequality = null; + changes = true; + } + } + pointer++; + } + + // Normalize the diff. + if (changes) { + this.diffCleanupMerge(diffs); + } + + // Find any overlaps between deletions and insertions. + // e.g: abcxxxxxxdef + // -> abcxxxdef + // e.g: xxxabcdefxxx + // -> defxxxabc + // Only extract an overlap if it is as big as the edit ahead or behind it. + pointer = 1; + while (pointer < diffs.length) { + if (diffs[pointer - 1][0] === DIFF_DELETE && + diffs[pointer][0] === DIFF_INSERT) { + deletion = diffs[pointer - 1][1]; + insertion = diffs[pointer][1]; + overlapLength1 = this.diffCommonOverlap(deletion, insertion); + overlapLength2 = this.diffCommonOverlap(insertion, deletion); + if (overlapLength1 >= overlapLength2) { + if (overlapLength1 >= deletion.length / 2 || + overlapLength1 >= insertion.length / 2) { + // Overlap found. Insert an equality and trim the surrounding edits. + diffs.splice( pointer, 0, [ DIFF_EQUAL, insertion.substring( 0, overlapLength1 ) ] ); + diffs[pointer - 1][1] = + deletion.substring(0, deletion.length - overlapLength1); + diffs[pointer + 1][1] = insertion.substring(overlapLength1); + pointer++; + } + } else { + if (overlapLength2 >= deletion.length / 2 || + overlapLength2 >= insertion.length / 2) { + // Reverse overlap found. + // Insert an equality and swap and trim the surrounding edits. + diffs.splice( pointer, 0, [ DIFF_EQUAL, deletion.substring( 0, overlapLength2 ) ] ); + diffs[pointer - 1][0] = DIFF_INSERT; + diffs[pointer - 1][1] = + insertion.substring(0, insertion.length - overlapLength2); + diffs[pointer + 1][0] = DIFF_DELETE; + diffs[pointer + 1][1] = + deletion.substring(overlapLength2); + pointer++; + } + } + pointer++; + } + pointer++; + } + }; + + /** + * Determine if the suffix of one string is the prefix of another. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {number} The number of characters common to the end of the first + * string and the start of the second string. + * @private + */ + DiffMatchPatch.prototype.diffCommonOverlap = function(text1, text2) { + var text1Length, text2Length, textLength, + best, length, pattern, found; + // Cache the text lengths to prevent multiple calls. + text1Length = text1.length; + text2Length = text2.length; + // Eliminate the null case. + if (text1Length === 0 || text2Length === 0) { + return 0; + } + // Truncate the longer string. + if (text1Length > text2Length) { + text1 = text1.substring(text1Length - text2Length); + } else if (text1Length < text2Length) { + text2 = text2.substring(0, text1Length); + } + textLength = Math.min(text1Length, text2Length); + // Quick check for the worst case. + if (text1 === text2) { + return textLength; + } + + // Start by looking for a single character match + // and increase length until no match is found. + // Performance analysis: http://neil.fraser.name/news/2010/11/04/ + best = 0; + length = 1; + while (true) { + pattern = text1.substring(textLength - length); + found = text2.indexOf(pattern); + if (found === -1) { + return best; + } + length += found; + if (found === 0 || text1.substring(textLength - length) === + text2.substring(0, length)) { + best = length; + length++; + } + } + }; + + /** + * Split two texts into an array of strings. Reduce the texts to a string of + * hashes where each Unicode character represents one line. + * @param {string} text1 First string. + * @param {string} text2 Second string. + * @return {{chars1: string, chars2: string, lineArray: !Array.}} + * An object containing the encoded text1, the encoded text2 and + * the array of unique strings. + * The zeroth element of the array of unique strings is intentionally blank. + * @private + */ + DiffMatchPatch.prototype.diffLinesToChars = function(text1, text2) { + var lineArray, lineHash, chars1, chars2; + lineArray = []; // e.g. lineArray[4] === 'Hello\n' + lineHash = {}; // e.g. lineHash['Hello\n'] === 4 + + // '\x00' is a valid character, but various debuggers don't like it. + // So we'll insert a junk entry to avoid generating a null character. + lineArray[0] = ""; + + /** + * Split a text into an array of strings. Reduce the texts to a string of + * hashes where each Unicode character represents one line. + * Modifies linearray and linehash through being a closure. + * @param {string} text String to encode. + * @return {string} Encoded string. + * @private + */ + function diffLinesToCharsMunge(text) { + var chars, lineStart, lineEnd, lineArrayLength, line; + chars = ""; + // Walk the text, pulling out a substring for each line. + // text.split('\n') would would temporarily double our memory footprint. + // Modifying text would create many large strings to garbage collect. + lineStart = 0; + lineEnd = -1; + // Keeping our own length variable is faster than looking it up. + lineArrayLength = lineArray.length; + while (lineEnd < text.length - 1) { + lineEnd = text.indexOf("\n", lineStart); + if (lineEnd === -1) { + lineEnd = text.length - 1; + } + line = text.substring(lineStart, lineEnd + 1); + lineStart = lineEnd + 1; + + if (lineHash.hasOwnProperty ? lineHash.hasOwnProperty(line) : + (lineHash[line] !== undefined)) { + chars += String.fromCharCode( lineHash[ line ] ); + } else { + chars += String.fromCharCode(lineArrayLength); + lineHash[line] = lineArrayLength; + lineArray[lineArrayLength++] = line; + } + } + return chars; + } + + chars1 = diffLinesToCharsMunge(text1); + chars2 = diffLinesToCharsMunge(text2); + return { + chars1: chars1, + chars2: chars2, + lineArray: lineArray + }; + }; + + /** + * Rehydrate the text in a diff from a string of line hashes to real lines of + * text. + * @param {!Array.} diffs Array of diff tuples. + * @param {!Array.} lineArray Array of unique strings. + * @private + */ + DiffMatchPatch.prototype.diffCharsToLines = function( diffs, lineArray ) { + var x, chars, text, y; + for ( x = 0; x < diffs.length; x++ ) { + chars = diffs[x][1]; + text = []; + for ( y = 0; y < chars.length; y++ ) { + text[y] = lineArray[chars.charCodeAt(y)]; + } + diffs[x][1] = text.join(""); + } + }; + + /** + * Reorder and merge like edit sections. Merge equalities. + * Any edit section can move as long as it doesn't cross an equality. + * @param {!Array.} diffs Array of diff tuples. + */ + DiffMatchPatch.prototype.diffCleanupMerge = function(diffs) { + var pointer, countDelete, countInsert, textInsert, textDelete, + commonlength, changes; + diffs.push( [ DIFF_EQUAL, "" ] ); // Add a dummy entry at the end. + pointer = 0; + countDelete = 0; + countInsert = 0; + textDelete = ""; + textInsert = ""; + commonlength; + while (pointer < diffs.length) { + switch ( diffs[ pointer ][ 0 ] ) { + case DIFF_INSERT: + countInsert++; + textInsert += diffs[pointer][1]; + pointer++; + break; + case DIFF_DELETE: + countDelete++; + textDelete += diffs[pointer][1]; + pointer++; + break; + case DIFF_EQUAL: + // Upon reaching an equality, check for prior redundancies. + if (countDelete + countInsert > 1) { + if (countDelete !== 0 && countInsert !== 0) { + // Factor out any common prefixies. + commonlength = this.diffCommonPrefix(textInsert, textDelete); + if (commonlength !== 0) { + if ((pointer - countDelete - countInsert) > 0 && + diffs[pointer - countDelete - countInsert - 1][0] === + DIFF_EQUAL) { + diffs[pointer - countDelete - countInsert - 1][1] += + textInsert.substring(0, commonlength); + } else { + diffs.splice( 0, 0, [ DIFF_EQUAL, + textInsert.substring( 0, commonlength ) + ] ); + pointer++; + } + textInsert = textInsert.substring(commonlength); + textDelete = textDelete.substring(commonlength); + } + // Factor out any common suffixies. + commonlength = this.diffCommonSuffix(textInsert, textDelete); + if (commonlength !== 0) { + diffs[pointer][1] = textInsert.substring(textInsert.length - + commonlength) + diffs[pointer][1]; + textInsert = textInsert.substring(0, textInsert.length - + commonlength); + textDelete = textDelete.substring(0, textDelete.length - + commonlength); + } + } + // Delete the offending records and add the merged ones. + if (countDelete === 0) { + diffs.splice( pointer - countInsert, + countDelete + countInsert, [ DIFF_INSERT, textInsert ] ); + } else if (countInsert === 0) { + diffs.splice( pointer - countDelete, + countDelete + countInsert, [ DIFF_DELETE, textDelete ] ); + } else { + diffs.splice( pointer - countDelete - countInsert, + countDelete + countInsert, [ DIFF_DELETE, textDelete ], [ DIFF_INSERT, textInsert ] ); + } + pointer = pointer - countDelete - countInsert + + (countDelete ? 1 : 0) + (countInsert ? 1 : 0) + 1; + } else if (pointer !== 0 && diffs[pointer - 1][0] === DIFF_EQUAL) { + // Merge this equality with the previous one. + diffs[pointer - 1][1] += diffs[pointer][1]; + diffs.splice(pointer, 1); + } else { + pointer++; + } + countInsert = 0; + countDelete = 0; + textDelete = ""; + textInsert = ""; + break; + } + } + if (diffs[diffs.length - 1][1] === "") { + diffs.pop(); // Remove the dummy entry at the end. + } + + // Second pass: look for single edits surrounded on both sides by equalities + // which can be shifted sideways to eliminate an equality. + // e.g: ABAC -> ABAC + changes = false; + pointer = 1; + // Intentionally ignore the first and last element (don't need checking). + while (pointer < diffs.length - 1) { + if (diffs[pointer - 1][0] === DIFF_EQUAL && + diffs[pointer + 1][0] === DIFF_EQUAL) { + // This is a single edit surrounded by equalities. + if ( diffs[ pointer ][ 1 ].substring( diffs[ pointer ][ 1 ].length - + diffs[ pointer - 1 ][ 1 ].length ) === diffs[ pointer - 1 ][ 1 ] ) { + // Shift the edit over the previous equality. + diffs[pointer][1] = diffs[pointer - 1][1] + + diffs[pointer][1].substring(0, diffs[pointer][1].length - + diffs[pointer - 1][1].length); + diffs[pointer + 1][1] = diffs[pointer - 1][1] + diffs[pointer + 1][1]; + diffs.splice(pointer - 1, 1); + changes = true; + } else if ( diffs[ pointer ][ 1 ].substring( 0, diffs[ pointer + 1 ][ 1 ].length ) === + diffs[ pointer + 1 ][ 1 ] ) { + // Shift the edit over the next equality. + diffs[pointer - 1][1] += diffs[pointer + 1][1]; + diffs[pointer][1] = + diffs[pointer][1].substring(diffs[pointer + 1][1].length) + + diffs[pointer + 1][1]; + diffs.splice(pointer + 1, 1); + changes = true; + } + } + pointer++; + } + // If shifts were made, the diff needs reordering and another shift sweep. + if (changes) { + this.diffCleanupMerge(diffs); + } + }; + + return function(o, n) { + var diff, output, text; + diff = new DiffMatchPatch(); + output = diff.DiffMain(o, n); + //console.log(output); + diff.diffCleanupEfficiency(output); + text = diff.diffPrettyHtml(output); + + return text; + }; +}()); +// jscs:enable + +(function() { + +// Deprecated QUnit.init - Ref #530 +// Re-initialize the configuration options +QUnit.init = function() { + var tests, banner, result, qunit, + config = QUnit.config; + + config.stats = { all: 0, bad: 0 }; + config.moduleStats = { all: 0, bad: 0 }; + config.started = 0; + config.updateRate = 1000; + config.blocking = false; + config.autostart = true; + config.autorun = false; + config.filter = ""; + config.queue = []; + + // Return on non-browser environments + // This is necessary to not break on node tests + if ( typeof window === "undefined" ) { + return; } - return function( o, n ) { - o = o.replace( /\s+$/, "" ); - n = n.replace( /\s+$/, "" ); + qunit = id( "qunit" ); + if ( qunit ) { + qunit.innerHTML = + "

      " + escapeText( document.title ) + "

      " + + "

      " + + "
      " + + "

      " + + "
        "; + } - var i, pre, - str = "", - out = diff( o === "" ? [] : o.split(/\s+/), n === "" ? [] : n.split(/\s+/) ), - oSpace = o.match(/\s+/g), - nSpace = n.match(/\s+/g); + tests = id( "qunit-tests" ); + banner = id( "qunit-banner" ); + result = id( "qunit-testresult" ); - if ( oSpace == null ) { - oSpace = [ " " ]; - } - else { - oSpace.push( " " ); - } + if ( tests ) { + tests.innerHTML = ""; + } - if ( nSpace == null ) { - nSpace = [ " " ]; - } - else { - nSpace.push( " " ); - } + if ( banner ) { + banner.className = ""; + } - if ( out.n.length === 0 ) { - for ( i = 0; i < out.o.length; i++ ) { - str += "" + out.o[i] + oSpace[i] + ""; - } - } - else { - if ( out.n[0].text == null ) { - for ( n = 0; n < out.o.length && out.o[n].text == null; n++ ) { - str += "" + out.o[n] + oSpace[n] + ""; - } - } + if ( result ) { + result.parentNode.removeChild( result ); + } - for ( i = 0; i < out.n.length; i++ ) { - if (out.n[i].text == null) { - str += "" + out.n[i] + nSpace[i] + ""; - } - else { - // `pre` initialized at top of scope - pre = ""; + if ( tests ) { + result = document.createElement( "p" ); + result.id = "qunit-testresult"; + result.className = "result"; + tests.parentNode.insertBefore( result, tests ); + result.innerHTML = "Running...
         "; + } +}; - for ( n = out.n[i].row + 1; n < out.o.length && out.o[n].text == null; n++ ) { - pre += "" + out.o[n] + oSpace[n] + ""; - } - str += " " + out.n[i].text + nSpace[i] + pre; - } - } - } - - return str; - }; -}()); - -// for CommonJS environments, export everything -if ( typeof exports !== "undefined" ) { - extend( exports, QUnit.constructor.prototype ); +// Don't load the HTML Reporter on non-Browser environments +if ( typeof window === "undefined" ) { + return; } -// get at whatever the global object is, like window in browsers -}( (function() {return this;}.call()) )); +var config = QUnit.config, + hasOwn = Object.prototype.hasOwnProperty, + defined = { + document: window.document !== undefined, + sessionStorage: (function() { + var x = "qunit-test-string"; + try { + sessionStorage.setItem( x, x ); + sessionStorage.removeItem( x ); + return true; + } catch ( e ) { + return false; + } + }()) + }, + modulesList = []; + +/** +* Escape text for attribute or text content. +*/ +function escapeText( s ) { + if ( !s ) { + return ""; + } + s = s + ""; + + // Both single quotes and double quotes (for attributes) + return s.replace( /['"<>&]/g, function( s ) { + switch ( s ) { + case "'": + return "'"; + case "\"": + return """; + case "<": + return "<"; + case ">": + return ">"; + case "&": + return "&"; + } + }); +} + +/** + * @param {HTMLElement} elem + * @param {string} type + * @param {Function} fn + */ +function addEvent( elem, type, fn ) { + if ( elem.addEventListener ) { + + // Standards-based browsers + elem.addEventListener( type, fn, false ); + } else if ( elem.attachEvent ) { + + // support: IE <9 + elem.attachEvent( "on" + type, function() { + var event = window.event; + if ( !event.target ) { + event.target = event.srcElement || document; + } + + fn.call( elem, event ); + }); + } +} + +/** + * @param {Array|NodeList} elems + * @param {string} type + * @param {Function} fn + */ +function addEvents( elems, type, fn ) { + var i = elems.length; + while ( i-- ) { + addEvent( elems[ i ], type, fn ); + } +} + +function hasClass( elem, name ) { + return ( " " + elem.className + " " ).indexOf( " " + name + " " ) >= 0; +} + +function addClass( elem, name ) { + if ( !hasClass( elem, name ) ) { + elem.className += ( elem.className ? " " : "" ) + name; + } +} + +function toggleClass( elem, name ) { + if ( hasClass( elem, name ) ) { + removeClass( elem, name ); + } else { + addClass( elem, name ); + } +} + +function removeClass( elem, name ) { + var set = " " + elem.className + " "; + + // Class name may appear multiple times + while ( set.indexOf( " " + name + " " ) >= 0 ) { + set = set.replace( " " + name + " ", " " ); + } + + // trim for prettiness + elem.className = typeof set.trim === "function" ? set.trim() : set.replace( /^\s+|\s+$/g, "" ); +} + +function id( name ) { + return defined.document && document.getElementById && document.getElementById( name ); +} + +function getUrlConfigHtml() { + var i, j, val, + escaped, escapedTooltip, + selection = false, + len = config.urlConfig.length, + urlConfigHtml = ""; + + for ( i = 0; i < len; i++ ) { + val = config.urlConfig[ i ]; + if ( typeof val === "string" ) { + val = { + id: val, + label: val + }; + } + + escaped = escapeText( val.id ); + escapedTooltip = escapeText( val.tooltip ); + + if ( config[ val.id ] === undefined ) { + config[ val.id ] = QUnit.urlParams[ val.id ]; + } + + if ( !val.value || typeof val.value === "string" ) { + urlConfigHtml += ""; + } else { + urlConfigHtml += ""; + } + } + + return urlConfigHtml; +} + +// Handle "click" events on toolbar checkboxes and "change" for select menus. +// Updates the URL with the new state of `config.urlConfig` values. +function toolbarChanged() { + var updatedUrl, value, + field = this, + params = {}; + + // Detect if field is a select menu or a checkbox + if ( "selectedIndex" in field ) { + value = field.options[ field.selectedIndex ].value || undefined; + } else { + value = field.checked ? ( field.defaultValue || true ) : undefined; + } + + params[ field.name ] = value; + updatedUrl = setUrl( params ); + + if ( "hidepassed" === field.name && "replaceState" in window.history ) { + config[ field.name ] = value || false; + if ( value ) { + addClass( id( "qunit-tests" ), "hidepass" ); + } else { + removeClass( id( "qunit-tests" ), "hidepass" ); + } + + // It is not necessary to refresh the whole page + window.history.replaceState( null, "", updatedUrl ); + } else { + window.location = updatedUrl; + } +} + +function setUrl( params ) { + var key, + querystring = "?"; + + params = QUnit.extend( QUnit.extend( {}, QUnit.urlParams ), params ); + + for ( key in params ) { + if ( hasOwn.call( params, key ) ) { + if ( params[ key ] === undefined ) { + continue; + } + querystring += encodeURIComponent( key ); + if ( params[ key ] !== true ) { + querystring += "=" + encodeURIComponent( params[ key ] ); + } + querystring += "&"; + } + } + return location.protocol + "//" + location.host + + location.pathname + querystring.slice( 0, -1 ); +} + +function applyUrlParams() { + var selectedModule, + modulesList = id( "qunit-modulefilter" ), + filter = id( "qunit-filter-input" ).value; + + selectedModule = modulesList ? + decodeURIComponent( modulesList.options[ modulesList.selectedIndex ].value ) : + undefined; + + window.location = setUrl({ + module: ( selectedModule === "" ) ? undefined : selectedModule, + filter: ( filter === "" ) ? undefined : filter, + + // Remove testId filter + testId: undefined + }); +} + +function toolbarUrlConfigContainer() { + var urlConfigContainer = document.createElement( "span" ); + + urlConfigContainer.innerHTML = getUrlConfigHtml(); + addClass( urlConfigContainer, "qunit-url-config" ); + + // For oldIE support: + // * Add handlers to the individual elements instead of the container + // * Use "click" instead of "change" for checkboxes + addEvents( urlConfigContainer.getElementsByTagName( "input" ), "click", toolbarChanged ); + addEvents( urlConfigContainer.getElementsByTagName( "select" ), "change", toolbarChanged ); + + return urlConfigContainer; +} + +function toolbarLooseFilter() { + var filter = document.createElement( "form" ), + label = document.createElement( "label" ), + input = document.createElement( "input" ), + button = document.createElement( "button" ); + + addClass( filter, "qunit-filter" ); + + label.innerHTML = "Filter: "; + + input.type = "text"; + input.value = config.filter || ""; + input.name = "filter"; + input.id = "qunit-filter-input"; + + button.innerHTML = "Go"; + + label.appendChild( input ); + + filter.appendChild( label ); + filter.appendChild( button ); + addEvent( filter, "submit", function( ev ) { + applyUrlParams(); + + if ( ev && ev.preventDefault ) { + ev.preventDefault(); + } + + return false; + }); + + return filter; +} + +function toolbarModuleFilterHtml() { + var i, + moduleFilterHtml = ""; + + if ( !modulesList.length ) { + return false; + } + + modulesList.sort(function( a, b ) { + return a.localeCompare( b ); + }); + + moduleFilterHtml += "" + + ""; + + return moduleFilterHtml; +} + +function toolbarModuleFilter() { + var toolbar = id( "qunit-testrunner-toolbar" ), + moduleFilter = document.createElement( "span" ), + moduleFilterHtml = toolbarModuleFilterHtml(); + + if ( !toolbar || !moduleFilterHtml ) { + return false; + } + + moduleFilter.setAttribute( "id", "qunit-modulefilter-container" ); + moduleFilter.innerHTML = moduleFilterHtml; + + addEvent( moduleFilter.lastChild, "change", applyUrlParams ); + + toolbar.appendChild( moduleFilter ); +} + +function appendToolbar() { + var toolbar = id( "qunit-testrunner-toolbar" ); + + if ( toolbar ) { + toolbar.appendChild( toolbarUrlConfigContainer() ); + toolbar.appendChild( toolbarLooseFilter() ); + } +} + +function appendHeader() { + var header = id( "qunit-header" ); + + if ( header ) { + header.innerHTML = "" + header.innerHTML + " "; + } +} + +function appendBanner() { + var banner = id( "qunit-banner" ); + + if ( banner ) { + banner.className = ""; + } +} + +function appendTestResults() { + var tests = id( "qunit-tests" ), + result = id( "qunit-testresult" ); + + if ( result ) { + result.parentNode.removeChild( result ); + } + + if ( tests ) { + tests.innerHTML = ""; + result = document.createElement( "p" ); + result.id = "qunit-testresult"; + result.className = "result"; + tests.parentNode.insertBefore( result, tests ); + result.innerHTML = "Running...
         "; + } +} + +function storeFixture() { + var fixture = id( "qunit-fixture" ); + if ( fixture ) { + config.fixture = fixture.innerHTML; + } +} + +function appendUserAgent() { + var userAgent = id( "qunit-userAgent" ); + + if ( userAgent ) { + userAgent.innerHTML = ""; + userAgent.appendChild( + document.createTextNode( + "QUnit " + QUnit.version + "; " + navigator.userAgent + ) + ); + } +} + +function appendTestsList( modules ) { + var i, l, x, z, test, moduleObj; + + for ( i = 0, l = modules.length; i < l; i++ ) { + moduleObj = modules[ i ]; + + if ( moduleObj.name ) { + modulesList.push( moduleObj.name ); + } + + for ( x = 0, z = moduleObj.tests.length; x < z; x++ ) { + test = moduleObj.tests[ x ]; + + appendTest( test.name, test.testId, moduleObj.name ); + } + } +} + +function appendTest( name, testId, moduleName ) { + var title, rerunTrigger, testBlock, assertList, + tests = id( "qunit-tests" ); + + if ( !tests ) { + return; + } + + title = document.createElement( "strong" ); + title.innerHTML = getNameHtml( name, moduleName ); + + rerunTrigger = document.createElement( "a" ); + rerunTrigger.innerHTML = "Rerun"; + rerunTrigger.href = setUrl({ testId: testId }); + + testBlock = document.createElement( "li" ); + testBlock.appendChild( title ); + testBlock.appendChild( rerunTrigger ); + testBlock.id = "qunit-test-output-" + testId; + + assertList = document.createElement( "ol" ); + assertList.className = "qunit-assert-list"; + + testBlock.appendChild( assertList ); + + tests.appendChild( testBlock ); +} + +// HTML Reporter initialization and load +QUnit.begin(function( details ) { + var qunit = id( "qunit" ); + + // Fixture is the only one necessary to run without the #qunit element + storeFixture(); + + if ( qunit ) { + qunit.innerHTML = + "

        " + escapeText( document.title ) + "

        " + + "

        " + + "
        " + + "

        " + + "
          "; + } + + appendHeader(); + appendBanner(); + appendTestResults(); + appendUserAgent(); + appendToolbar(); + appendTestsList( details.modules ); + toolbarModuleFilter(); + + if ( qunit && config.hidepassed ) { + addClass( qunit.lastChild, "hidepass" ); + } +}); + +QUnit.done(function( details ) { + var i, key, + banner = id( "qunit-banner" ), + tests = id( "qunit-tests" ), + html = [ + "Tests completed in ", + details.runtime, + " milliseconds.
          ", + "", + details.passed, + " assertions of ", + details.total, + " passed, ", + details.failed, + " failed." + ].join( "" ); + + if ( banner ) { + banner.className = details.failed ? "qunit-fail" : "qunit-pass"; + } + + if ( tests ) { + id( "qunit-testresult" ).innerHTML = html; + } + + if ( config.altertitle && defined.document && document.title ) { + + // show ✖ for good, ✔ for bad suite result in title + // use escape sequences in case file gets loaded with non-utf-8-charset + document.title = [ + ( details.failed ? "\u2716" : "\u2714" ), + document.title.replace( /^[\u2714\u2716] /i, "" ) + ].join( " " ); + } + + // clear own sessionStorage items if all tests passed + if ( config.reorder && defined.sessionStorage && details.failed === 0 ) { + for ( i = 0; i < sessionStorage.length; i++ ) { + key = sessionStorage.key( i++ ); + if ( key.indexOf( "qunit-test-" ) === 0 ) { + sessionStorage.removeItem( key ); + } + } + } + + // scroll back to top to show results + if ( config.scrolltop && window.scrollTo ) { + window.scrollTo( 0, 0 ); + } +}); + +function getNameHtml( name, module ) { + var nameHtml = ""; + + if ( module ) { + nameHtml = "" + escapeText( module ) + ": "; + } + + nameHtml += "" + escapeText( name ) + ""; + + return nameHtml; +} + +QUnit.testStart(function( details ) { + var running, testBlock, bad; + + testBlock = id( "qunit-test-output-" + details.testId ); + if ( testBlock ) { + testBlock.className = "running"; + } else { + + // Report later registered tests + appendTest( details.name, details.testId, details.module ); + } + + running = id( "qunit-testresult" ); + if ( running ) { + bad = QUnit.config.reorder && defined.sessionStorage && + +sessionStorage.getItem( "qunit-test-" + details.module + "-" + details.name ); + + running.innerHTML = ( bad ? + "Rerunning previously failed test:
          " : + "Running:
          " ) + + getNameHtml( details.name, details.module ); + } + +}); + +QUnit.log(function( details ) { + var assertList, assertLi, + message, expected, actual, + testItem = id( "qunit-test-output-" + details.testId ); + + if ( !testItem ) { + return; + } + + message = escapeText( details.message ) || ( details.result ? "okay" : "failed" ); + message = "" + message + ""; + message += "@ " + details.runtime + " ms"; + + // pushFailure doesn't provide details.expected + // when it calls, it's implicit to also not show expected and diff stuff + // Also, we need to check details.expected existence, as it can exist and be undefined + if ( !details.result && hasOwn.call( details, "expected" ) ) { + expected = escapeText( QUnit.dump.parse( details.expected ) ); + actual = escapeText( QUnit.dump.parse( details.actual ) ); + message += ""; + + if ( actual !== expected ) { + message += "" + + ""; + } else { + if ( expected.indexOf( "[object Array]" ) !== -1 || + expected.indexOf( "[object Object]" ) !== -1 ) { + message += ""; + } + } + + if ( details.source ) { + message += ""; + } + + message += "
          Expected:
          " +
          +			expected +
          +			"
          Result:
          " +
          +				actual + "
          Diff:
          " +
          +				QUnit.diff( expected, actual ) + "
          Message: " + + "Diff suppressed as the depth of object is more than current max depth (" + + QUnit.config.maxDepth + ").

          Hint: Use QUnit.dump.maxDepth to " + + " run with a higher max depth or " + + "Rerun without max depth.

          Source:
          " +
          +				escapeText( details.source ) + "
          "; + + // this occours when pushFailure is set and we have an extracted stack trace + } else if ( !details.result && details.source ) { + message += "" + + "" + + "
          Source:
          " +
          +			escapeText( details.source ) + "
          "; + } + + assertList = testItem.getElementsByTagName( "ol" )[ 0 ]; + + assertLi = document.createElement( "li" ); + assertLi.className = details.result ? "pass" : "fail"; + assertLi.innerHTML = message; + assertList.appendChild( assertLi ); +}); + +QUnit.testDone(function( details ) { + var testTitle, time, testItem, assertList, + good, bad, testCounts, skipped, + tests = id( "qunit-tests" ); + + if ( !tests ) { + return; + } + + testItem = id( "qunit-test-output-" + details.testId ); + + assertList = testItem.getElementsByTagName( "ol" )[ 0 ]; + + good = details.passed; + bad = details.failed; + + // store result when possible + if ( config.reorder && defined.sessionStorage ) { + if ( bad ) { + sessionStorage.setItem( "qunit-test-" + details.module + "-" + details.name, bad ); + } else { + sessionStorage.removeItem( "qunit-test-" + details.module + "-" + details.name ); + } + } + + if ( bad === 0 ) { + addClass( assertList, "qunit-collapsed" ); + } + + // testItem.firstChild is the test name + testTitle = testItem.firstChild; + + testCounts = bad ? + "" + bad + ", " + "" + good + ", " : + ""; + + testTitle.innerHTML += " (" + testCounts + + details.assertions.length + ")"; + + if ( details.skipped ) { + testItem.className = "skipped"; + skipped = document.createElement( "em" ); + skipped.className = "qunit-skipped-label"; + skipped.innerHTML = "skipped"; + testItem.insertBefore( skipped, testTitle ); + } else { + addEvent( testTitle, "click", function() { + toggleClass( assertList, "qunit-collapsed" ); + }); + + testItem.className = bad ? "fail" : "pass"; + + time = document.createElement( "span" ); + time.className = "runtime"; + time.innerHTML = details.runtime + " ms"; + testItem.insertBefore( time, assertList ); + } +}); + +if ( defined.document ) { + if ( document.readyState === "complete" ) { + QUnit.load(); + } else { + addEvent( window, "load", QUnit.load ); + } +} else { + config.pageLoaded = true; + config.autorun = true; +} + +})(); diff --git a/vendor/underscore/test/vendor/runner.js b/vendor/underscore/test/vendor/runner.js deleted file mode 100644 index 4b1d38b1b..000000000 --- a/vendor/underscore/test/vendor/runner.js +++ /dev/null @@ -1,127 +0,0 @@ -/* - * QtWebKit-powered headless test runner using PhantomJS - * - * PhantomJS binaries: http://phantomjs.org/download.html - * Requires PhantomJS 1.6+ (1.7+ recommended) - * - * Run with: - * phantomjs runner.js [url-of-your-qunit-testsuite] - * - * e.g. - * phantomjs runner.js http://localhost/qunit/test/index.html - */ - -/*jshint latedef:false */ -/*global phantom:false, require:false, console:false, window:false, QUnit:false */ - -(function() { - 'use strict'; - - var args = require('system').args; - - // arg[0]: scriptName, args[1...]: arguments - if (args.length !== 2) { - console.error('Usage:\n phantomjs runner.js [url-of-your-qunit-testsuite]'); - phantom.exit(1); - } - - var url = args[1], - page = require('webpage').create(); - - // Route `console.log()` calls from within the Page context to the main Phantom context (i.e. current `this`) - page.onConsoleMessage = function(msg) { - console.log(msg); - }; - - page.onInitialized = function() { - page.evaluate(addLogging); - }; - - page.onCallback = function(message) { - var result, - failed; - - if (message) { - if (message.name === 'QUnit.done') { - result = message.data; - failed = !result || result.failed; - - phantom.exit(failed ? 1 : 0); - } - } - }; - - page.open(url, function(status) { - if (status !== 'success') { - console.error('Unable to access network: ' + status); - phantom.exit(1); - } else { - // Cannot do this verification with the 'DOMContentLoaded' handler because it - // will be too late to attach it if a page does not have any script tags. - var qunitMissing = page.evaluate(function() { return (typeof QUnit === 'undefined' || !QUnit); }); - if (qunitMissing) { - console.error('The `QUnit` object is not present on this page.'); - phantom.exit(1); - } - - // Do nothing... the callback mechanism will handle everything! - } - }); - - function addLogging() { - window.document.addEventListener('DOMContentLoaded', function() { - var current_test_assertions = []; - - QUnit.log(function(details) { - var response; - - // Ignore passing assertions - if (details.result) { - return; - } - - response = details.message || ''; - - if (typeof details.expected !== 'undefined') { - if (response) { - response += ', '; - } - - response += 'expected: ' + details.expected + ', but was: ' + details.actual; - if (details.source) { - response += "\n" + details.source; - } - } - - current_test_assertions.push('Failed assertion: ' + response); - }); - - QUnit.testDone(function(result) { - var i, - len, - name = result.module + ': ' + result.name; - - if (result.failed) { - console.log('Test failed: ' + name); - - for (i = 0, len = current_test_assertions.length; i < len; i++) { - console.log(' ' + current_test_assertions[i]); - } - } - - current_test_assertions.length = 0; - }); - - QUnit.done(function(result) { - console.log('Took ' + result.runtime + 'ms to run ' + result.total + ' tests. ' + result.passed + ' passed, ' + result.failed + ' failed.'); - - if (typeof window.callPhantom === 'function') { - window.callPhantom({ - 'name': 'QUnit.done', - 'data': result - }); - } - }); - }, false); - } -})(); diff --git a/vendor/underscore/underscore-min.js b/vendor/underscore/underscore-min.js index d22f881bc..f01025b7b 100644 --- a/vendor/underscore/underscore-min.js +++ b/vendor/underscore/underscore-min.js @@ -1,6 +1,6 @@ -// Underscore.js 1.5.2 +// Underscore.js 1.8.3 // http://underscorejs.org -// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors // Underscore may be freely distributed under the MIT license. -(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,w=Object.keys,_=i.bind,j=function(n){return n instanceof j?n:this instanceof j?(this._wrapped=n,void 0):new j(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=j),exports._=j):n._=j,j.VERSION="1.5.2";var A=j.each=j.forEach=function(n,t,e){if(null!=n)if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a=j.keys(n),u=0,i=a.length;i>u;u++)if(t.call(e,n[a[u]],a[u],n)===r)return};j.map=j.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e.push(t.call(r,n,u,i))}),e)};var E="Reduce of empty array with no initial value";j.reduce=j.foldl=j.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduce===h)return e&&(t=j.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(E);return r},j.reduceRight=j.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduceRight===v)return e&&(t=j.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=j.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(E);return r},j.find=j.detect=function(n,t,r){var e;return O(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},j.filter=j.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&e.push(n)}),e)},j.reject=function(n,t,r){return j.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},j.every=j.all=function(n,t,e){t||(t=j.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var O=j.some=j.any=function(n,t,e){t||(t=j.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};j.contains=j.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:O(n,function(n){return n===t})},j.invoke=function(n,t){var r=o.call(arguments,2),e=j.isFunction(t);return j.map(n,function(n){return(e?t:n[t]).apply(n,r)})},j.pluck=function(n,t){return j.map(n,function(n){return n[t]})},j.where=function(n,t,r){return j.isEmpty(t)?r?void 0:[]:j[r?"find":"filter"](n,function(n){for(var r in t)if(t[r]!==n[r])return!1;return!0})},j.findWhere=function(n,t){return j.where(n,t,!0)},j.max=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.max.apply(Math,n);if(!t&&j.isEmpty(n))return-1/0;var e={computed:-1/0,value:-1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;a>e.computed&&(e={value:n,computed:a})}),e.value},j.min=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.min.apply(Math,n);if(!t&&j.isEmpty(n))return 1/0;var e={computed:1/0,value:1/0};return A(n,function(n,u,i){var a=t?t.call(r,n,u,i):n;ae||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={},i=null==r?j.identity:k(r);return A(t,function(r,a){var o=i.call(e,r,a,t);n(u,o,r)}),u}};j.groupBy=F(function(n,t,r){(j.has(n,t)?n[t]:n[t]=[]).push(r)}),j.indexBy=F(function(n,t,r){n[t]=r}),j.countBy=F(function(n,t){j.has(n,t)?n[t]++:n[t]=1}),j.sortedIndex=function(n,t,r,e){r=null==r?j.identity:k(r);for(var u=r.call(e,t),i=0,a=n.length;a>i;){var o=i+a>>>1;r.call(e,n[o])=0})})},j.difference=function(n){var t=c.apply(e,o.call(arguments,1));return j.filter(n,function(n){return!j.contains(t,n)})},j.zip=function(){for(var n=j.max(j.pluck(arguments,"length").concat(0)),t=new Array(n),r=0;n>r;r++)t[r]=j.pluck(arguments,""+r);return t},j.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},j.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=j.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},j.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},j.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=new Array(e);e>u;)i[u++]=n,n+=r;return i};var R=function(){};j.bind=function(n,t){var r,e;if(_&&n.bind===_)return _.apply(n,o.call(arguments,1));if(!j.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));R.prototype=n.prototype;var u=new R;R.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},j.partial=function(n){var t=o.call(arguments,1);return function(){return n.apply(this,t.concat(o.call(arguments)))}},j.bindAll=function(n){var t=o.call(arguments,1);if(0===t.length)throw new Error("bindAll must be passed function names");return A(t,function(t){n[t]=j.bind(n[t],n)}),n},j.memoize=function(n,t){var r={};return t||(t=j.identity),function(){var e=t.apply(this,arguments);return j.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},j.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},j.defer=function(n){return j.delay.apply(j,[n,1].concat(o.call(arguments,1)))},j.throttle=function(n,t,r){var e,u,i,a=null,o=0;r||(r={});var c=function(){o=r.leading===!1?0:new Date,a=null,i=n.apply(e,u)};return function(){var l=new Date;o||r.leading!==!1||(o=l);var f=t-(l-o);return e=this,u=arguments,0>=f?(clearTimeout(a),a=null,o=l,i=n.apply(e,u)):a||r.trailing===!1||(a=setTimeout(c,f)),i}},j.debounce=function(n,t,r){var e,u,i,a,o;return function(){i=this,u=arguments,a=new Date;var c=function(){var l=new Date-a;t>l?e=setTimeout(c,t-l):(e=null,r||(o=n.apply(i,u)))},l=r&&!e;return e||(e=setTimeout(c,t)),l&&(o=n.apply(i,u)),o}},j.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},j.wrap=function(n,t){return function(){var r=[n];return a.apply(r,arguments),t.apply(this,r)}},j.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},j.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},j.keys=w||function(n){if(n!==Object(n))throw new TypeError("Invalid object");var t=[];for(var r in n)j.has(n,r)&&t.push(r);return t},j.values=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},j.pairs=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},j.invert=function(n){for(var t={},r=j.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},j.functions=j.methods=function(n){var t=[];for(var r in n)j.isFunction(n[r])&&t.push(r);return t.sort()},j.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},j.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},j.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)j.contains(r,u)||(t[u]=n[u]);return t},j.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]===void 0&&(n[r]=t[r])}),n},j.clone=function(n){return j.isObject(n)?j.isArray(n)?n.slice():j.extend({},n):n},j.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof j&&(n=n._wrapped),t instanceof j&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==String(t);case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;var a=n.constructor,o=t.constructor;if(a!==o&&!(j.isFunction(a)&&a instanceof a&&j.isFunction(o)&&o instanceof o))return!1;r.push(n),e.push(t);var c=0,f=!0;if("[object Array]"==u){if(c=n.length,f=c==t.length)for(;c--&&(f=S(n[c],t[c],r,e)););}else{for(var s in n)if(j.has(n,s)&&(c++,!(f=j.has(t,s)&&S(n[s],t[s],r,e))))break;if(f){for(s in t)if(j.has(t,s)&&!c--)break;f=!c}}return r.pop(),e.pop(),f};j.isEqual=function(n,t){return S(n,t,[],[])},j.isEmpty=function(n){if(null==n)return!0;if(j.isArray(n)||j.isString(n))return 0===n.length;for(var t in n)if(j.has(n,t))return!1;return!0},j.isElement=function(n){return!(!n||1!==n.nodeType)},j.isArray=x||function(n){return"[object Array]"==l.call(n)},j.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){j["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),j.isArguments(arguments)||(j.isArguments=function(n){return!(!n||!j.has(n,"callee"))}),"function"!=typeof/./&&(j.isFunction=function(n){return"function"==typeof n}),j.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},j.isNaN=function(n){return j.isNumber(n)&&n!=+n},j.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},j.isNull=function(n){return null===n},j.isUndefined=function(n){return n===void 0},j.has=function(n,t){return f.call(n,t)},j.noConflict=function(){return n._=t,this},j.identity=function(n){return n},j.times=function(n,t,r){for(var e=Array(Math.max(0,n)),u=0;n>u;u++)e[u]=t.call(r,u);return e},j.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))};var I={escape:{"&":"&","<":"<",">":">",'"':""","'":"'"}};I.unescape=j.invert(I.escape);var T={escape:new RegExp("["+j.keys(I.escape).join("")+"]","g"),unescape:new RegExp("("+j.keys(I.unescape).join("|")+")","g")};j.each(["escape","unescape"],function(n){j[n]=function(t){return null==t?"":(""+t).replace(T[n],function(t){return I[n][t]})}}),j.result=function(n,t){if(null==n)return void 0;var r=n[t];return j.isFunction(r)?r.call(n):r},j.mixin=function(n){A(j.functions(n),function(t){var r=j[t]=n[t];j.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(j,n))}})};var N=0;j.uniqueId=function(n){var t=++N+"";return n?n+t:t},j.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var q=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n"," ":"t","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\t|\u2028|\u2029/g;j.template=function(n,t,r){var e;r=j.defaults({},r,j.templateSettings);var u=new RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(D,function(n){return"\\"+B[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=new Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,j);var c=function(n){return e.call(this,n,j)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},j.chain=function(n){return j(n).chain()};var z=function(n){return this._chain?j(n).chain():n};j.mixin(j),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];j.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];j.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),j.extend(j.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}})}).call(this); +(function(){function n(n){function t(t,r,e,u,i,o){for(;i>=0&&o>i;i+=n){var a=u?u[i]:i;e=r(e,t[a],a,t)}return e}return function(r,e,u,i){e=b(e,i,4);var o=!k(r)&&m.keys(r),a=(o||r).length,c=n>0?0:a-1;return arguments.length<3&&(u=r[o?o[c]:c],c+=n),t(r,e,u,o,c,a)}}function t(n){return function(t,r,e){r=x(r,e);for(var u=O(t),i=n>0?0:u-1;i>=0&&u>i;i+=n)if(r(t[i],i,t))return i;return-1}}function r(n,t,r){return function(e,u,i){var o=0,a=O(e);if("number"==typeof i)n>0?o=i>=0?i:Math.max(i+a,o):a=i>=0?Math.min(i+1,a):i+a+1;else if(r&&i&&a)return i=r(e,u),e[i]===u?i:-1;if(u!==u)return i=t(l.call(e,o,a),m.isNaN),i>=0?i+o:-1;for(i=n>0?o:a-1;i>=0&&a>i;i+=n)if(e[i]===u)return i;return-1}}function e(n,t){var r=I.length,e=n.constructor,u=m.isFunction(e)&&e.prototype||a,i="constructor";for(m.has(n,i)&&!m.contains(t,i)&&t.push(i);r--;)i=I[r],i in n&&n[i]!==u[i]&&!m.contains(t,i)&&t.push(i)}var u=this,i=u._,o=Array.prototype,a=Object.prototype,c=Function.prototype,f=o.push,l=o.slice,s=a.toString,p=a.hasOwnProperty,h=Array.isArray,v=Object.keys,g=c.bind,y=Object.create,d=function(){},m=function(n){return n instanceof m?n:this instanceof m?void(this._wrapped=n):new m(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=m),exports._=m):u._=m,m.VERSION="1.8.3";var b=function(n,t,r){if(t===void 0)return n;switch(null==r?3:r){case 1:return function(r){return n.call(t,r)};case 2:return function(r,e){return n.call(t,r,e)};case 3:return function(r,e,u){return n.call(t,r,e,u)};case 4:return function(r,e,u,i){return n.call(t,r,e,u,i)}}return function(){return n.apply(t,arguments)}},x=function(n,t,r){return null==n?m.identity:m.isFunction(n)?b(n,t,r):m.isObject(n)?m.matcher(n):m.property(n)};m.iteratee=function(n,t){return x(n,t,1/0)};var _=function(n,t){return function(r){var e=arguments.length;if(2>e||null==r)return r;for(var u=1;e>u;u++)for(var i=arguments[u],o=n(i),a=o.length,c=0;a>c;c++){var f=o[c];t&&r[f]!==void 0||(r[f]=i[f])}return r}},j=function(n){if(!m.isObject(n))return{};if(y)return y(n);d.prototype=n;var t=new d;return d.prototype=null,t},w=function(n){return function(t){return null==t?void 0:t[n]}},A=Math.pow(2,53)-1,O=w("length"),k=function(n){var t=O(n);return"number"==typeof t&&t>=0&&A>=t};m.each=m.forEach=function(n,t,r){t=b(t,r);var e,u;if(k(n))for(e=0,u=n.length;u>e;e++)t(n[e],e,n);else{var i=m.keys(n);for(e=0,u=i.length;u>e;e++)t(n[i[e]],i[e],n)}return n},m.map=m.collect=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=Array(u),o=0;u>o;o++){var a=e?e[o]:o;i[o]=t(n[a],a,n)}return i},m.reduce=m.foldl=m.inject=n(1),m.reduceRight=m.foldr=n(-1),m.find=m.detect=function(n,t,r){var e;return e=k(n)?m.findIndex(n,t,r):m.findKey(n,t,r),e!==void 0&&e!==-1?n[e]:void 0},m.filter=m.select=function(n,t,r){var e=[];return t=x(t,r),m.each(n,function(n,r,u){t(n,r,u)&&e.push(n)}),e},m.reject=function(n,t,r){return m.filter(n,m.negate(x(t)),r)},m.every=m.all=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(!t(n[o],o,n))return!1}return!0},m.some=m.any=function(n,t,r){t=x(t,r);for(var e=!k(n)&&m.keys(n),u=(e||n).length,i=0;u>i;i++){var o=e?e[i]:i;if(t(n[o],o,n))return!0}return!1},m.contains=m.includes=m.include=function(n,t,r,e){return k(n)||(n=m.values(n)),("number"!=typeof r||e)&&(r=0),m.indexOf(n,t,r)>=0},m.invoke=function(n,t){var r=l.call(arguments,2),e=m.isFunction(t);return m.map(n,function(n){var u=e?t:n[t];return null==u?u:u.apply(n,r)})},m.pluck=function(n,t){return m.map(n,m.property(t))},m.where=function(n,t){return m.filter(n,m.matcher(t))},m.findWhere=function(n,t){return m.find(n,m.matcher(t))},m.max=function(n,t,r){var e,u,i=-1/0,o=-1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],e>i&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(u>o||u===-1/0&&i===-1/0)&&(i=n,o=u)});return i},m.min=function(n,t,r){var e,u,i=1/0,o=1/0;if(null==t&&null!=n){n=k(n)?n:m.values(n);for(var a=0,c=n.length;c>a;a++)e=n[a],i>e&&(i=e)}else t=x(t,r),m.each(n,function(n,r,e){u=t(n,r,e),(o>u||1/0===u&&1/0===i)&&(i=n,o=u)});return i},m.shuffle=function(n){for(var t,r=k(n)?n:m.values(n),e=r.length,u=Array(e),i=0;e>i;i++)t=m.random(0,i),t!==i&&(u[i]=u[t]),u[t]=r[i];return u},m.sample=function(n,t,r){return null==t||r?(k(n)||(n=m.values(n)),n[m.random(n.length-1)]):m.shuffle(n).slice(0,Math.max(0,t))},m.sortBy=function(n,t,r){return t=x(t,r),m.pluck(m.map(n,function(n,r,e){return{value:n,index:r,criteria:t(n,r,e)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=x(r,e),m.each(t,function(e,i){var o=r(e,i,t);n(u,e,o)}),u}};m.groupBy=F(function(n,t,r){m.has(n,r)?n[r].push(t):n[r]=[t]}),m.indexBy=F(function(n,t,r){n[r]=t}),m.countBy=F(function(n,t,r){m.has(n,r)?n[r]++:n[r]=1}),m.toArray=function(n){return n?m.isArray(n)?l.call(n):k(n)?m.map(n,m.identity):m.values(n):[]},m.size=function(n){return null==n?0:k(n)?n.length:m.keys(n).length},m.partition=function(n,t,r){t=x(t,r);var e=[],u=[];return m.each(n,function(n,r,i){(t(n,r,i)?e:u).push(n)}),[e,u]},m.first=m.head=m.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:m.initial(n,n.length-t)},m.initial=function(n,t,r){return l.call(n,0,Math.max(0,n.length-(null==t||r?1:t)))},m.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:m.rest(n,Math.max(0,n.length-t))},m.rest=m.tail=m.drop=function(n,t,r){return l.call(n,null==t||r?1:t)},m.compact=function(n){return m.filter(n,m.identity)};var S=function(n,t,r,e){for(var u=[],i=0,o=e||0,a=O(n);a>o;o++){var c=n[o];if(k(c)&&(m.isArray(c)||m.isArguments(c))){t||(c=S(c,t,r));var f=0,l=c.length;for(u.length+=l;l>f;)u[i++]=c[f++]}else r||(u[i++]=c)}return u};m.flatten=function(n,t){return S(n,t,!1)},m.without=function(n){return m.difference(n,l.call(arguments,1))},m.uniq=m.unique=function(n,t,r,e){m.isBoolean(t)||(e=r,r=t,t=!1),null!=r&&(r=x(r,e));for(var u=[],i=[],o=0,a=O(n);a>o;o++){var c=n[o],f=r?r(c,o,n):c;t?(o&&i===f||u.push(c),i=f):r?m.contains(i,f)||(i.push(f),u.push(c)):m.contains(u,c)||u.push(c)}return u},m.union=function(){return m.uniq(S(arguments,!0,!0))},m.intersection=function(n){for(var t=[],r=arguments.length,e=0,u=O(n);u>e;e++){var i=n[e];if(!m.contains(t,i)){for(var o=1;r>o&&m.contains(arguments[o],i);o++);o===r&&t.push(i)}}return t},m.difference=function(n){var t=S(arguments,!0,!0,1);return m.filter(n,function(n){return!m.contains(t,n)})},m.zip=function(){return m.unzip(arguments)},m.unzip=function(n){for(var t=n&&m.max(n,O).length||0,r=Array(t),e=0;t>e;e++)r[e]=m.pluck(n,e);return r},m.object=function(n,t){for(var r={},e=0,u=O(n);u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},m.findIndex=t(1),m.findLastIndex=t(-1),m.sortedIndex=function(n,t,r,e){r=x(r,e,1);for(var u=r(t),i=0,o=O(n);o>i;){var a=Math.floor((i+o)/2);r(n[a])i;i++,n+=r)u[i]=n;return u};var E=function(n,t,r,e,u){if(!(e instanceof t))return n.apply(r,u);var i=j(n.prototype),o=n.apply(i,u);return m.isObject(o)?o:i};m.bind=function(n,t){if(g&&n.bind===g)return g.apply(n,l.call(arguments,1));if(!m.isFunction(n))throw new TypeError("Bind must be called on a function");var r=l.call(arguments,2),e=function(){return E(n,e,t,this,r.concat(l.call(arguments)))};return e},m.partial=function(n){var t=l.call(arguments,1),r=function(){for(var e=0,u=t.length,i=Array(u),o=0;u>o;o++)i[o]=t[o]===m?arguments[e++]:t[o];for(;e=e)throw new Error("bindAll must be passed function names");for(t=1;e>t;t++)r=arguments[t],n[r]=m.bind(n[r],n);return n},m.memoize=function(n,t){var r=function(e){var u=r.cache,i=""+(t?t.apply(this,arguments):e);return m.has(u,i)||(u[i]=n.apply(this,arguments)),u[i]};return r.cache={},r},m.delay=function(n,t){var r=l.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},m.defer=m.partial(m.delay,m,1),m.throttle=function(n,t,r){var e,u,i,o=null,a=0;r||(r={});var c=function(){a=r.leading===!1?0:m.now(),o=null,i=n.apply(e,u),o||(e=u=null)};return function(){var f=m.now();a||r.leading!==!1||(a=f);var l=t-(f-a);return e=this,u=arguments,0>=l||l>t?(o&&(clearTimeout(o),o=null),a=f,i=n.apply(e,u),o||(e=u=null)):o||r.trailing===!1||(o=setTimeout(c,l)),i}},m.debounce=function(n,t,r){var e,u,i,o,a,c=function(){var f=m.now()-o;t>f&&f>=0?e=setTimeout(c,t-f):(e=null,r||(a=n.apply(i,u),e||(i=u=null)))};return function(){i=this,u=arguments,o=m.now();var f=r&&!e;return e||(e=setTimeout(c,t)),f&&(a=n.apply(i,u),i=u=null),a}},m.wrap=function(n,t){return m.partial(t,n)},m.negate=function(n){return function(){return!n.apply(this,arguments)}},m.compose=function(){var n=arguments,t=n.length-1;return function(){for(var r=t,e=n[t].apply(this,arguments);r--;)e=n[r].call(this,e);return e}},m.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},m.before=function(n,t){var r;return function(){return--n>0&&(r=t.apply(this,arguments)),1>=n&&(t=null),r}},m.once=m.partial(m.before,2);var M=!{toString:null}.propertyIsEnumerable("toString"),I=["valueOf","isPrototypeOf","toString","propertyIsEnumerable","hasOwnProperty","toLocaleString"];m.keys=function(n){if(!m.isObject(n))return[];if(v)return v(n);var t=[];for(var r in n)m.has(n,r)&&t.push(r);return M&&e(n,t),t},m.allKeys=function(n){if(!m.isObject(n))return[];var t=[];for(var r in n)t.push(r);return M&&e(n,t),t},m.values=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},m.mapObject=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=u.length,o={},a=0;i>a;a++)e=u[a],o[e]=t(n[e],e,n);return o},m.pairs=function(n){for(var t=m.keys(n),r=t.length,e=Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},m.invert=function(n){for(var t={},r=m.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},m.functions=m.methods=function(n){var t=[];for(var r in n)m.isFunction(n[r])&&t.push(r);return t.sort()},m.extend=_(m.allKeys),m.extendOwn=m.assign=_(m.keys),m.findKey=function(n,t,r){t=x(t,r);for(var e,u=m.keys(n),i=0,o=u.length;o>i;i++)if(e=u[i],t(n[e],e,n))return e},m.pick=function(n,t,r){var e,u,i={},o=n;if(null==o)return i;m.isFunction(t)?(u=m.allKeys(o),e=b(t,r)):(u=S(arguments,!1,!1,1),e=function(n,t,r){return t in r},o=Object(o));for(var a=0,c=u.length;c>a;a++){var f=u[a],l=o[f];e(l,f,o)&&(i[f]=l)}return i},m.omit=function(n,t,r){if(m.isFunction(t))t=m.negate(t);else{var e=m.map(S(arguments,!1,!1,1),String);t=function(n,t){return!m.contains(e,t)}}return m.pick(n,t,r)},m.defaults=_(m.allKeys,!0),m.create=function(n,t){var r=j(n);return t&&m.extendOwn(r,t),r},m.clone=function(n){return m.isObject(n)?m.isArray(n)?n.slice():m.extend({},n):n},m.tap=function(n,t){return t(n),n},m.isMatch=function(n,t){var r=m.keys(t),e=r.length;if(null==n)return!e;for(var u=Object(n),i=0;e>i;i++){var o=r[i];if(t[o]!==u[o]||!(o in u))return!1}return!0};var N=function(n,t,r,e){if(n===t)return 0!==n||1/n===1/t;if(null==n||null==t)return n===t;n instanceof m&&(n=n._wrapped),t instanceof m&&(t=t._wrapped);var u=s.call(n);if(u!==s.call(t))return!1;switch(u){case"[object RegExp]":case"[object String]":return""+n==""+t;case"[object Number]":return+n!==+n?+t!==+t:0===+n?1/+n===1/t:+n===+t;case"[object Date]":case"[object Boolean]":return+n===+t}var i="[object Array]"===u;if(!i){if("object"!=typeof n||"object"!=typeof t)return!1;var o=n.constructor,a=t.constructor;if(o!==a&&!(m.isFunction(o)&&o instanceof o&&m.isFunction(a)&&a instanceof a)&&"constructor"in n&&"constructor"in t)return!1}r=r||[],e=e||[];for(var c=r.length;c--;)if(r[c]===n)return e[c]===t;if(r.push(n),e.push(t),i){if(c=n.length,c!==t.length)return!1;for(;c--;)if(!N(n[c],t[c],r,e))return!1}else{var f,l=m.keys(n);if(c=l.length,m.keys(t).length!==c)return!1;for(;c--;)if(f=l[c],!m.has(t,f)||!N(n[f],t[f],r,e))return!1}return r.pop(),e.pop(),!0};m.isEqual=function(n,t){return N(n,t)},m.isEmpty=function(n){return null==n?!0:k(n)&&(m.isArray(n)||m.isString(n)||m.isArguments(n))?0===n.length:0===m.keys(n).length},m.isElement=function(n){return!(!n||1!==n.nodeType)},m.isArray=h||function(n){return"[object Array]"===s.call(n)},m.isObject=function(n){var t=typeof n;return"function"===t||"object"===t&&!!n},m.each(["Arguments","Function","String","Number","Date","RegExp","Error"],function(n){m["is"+n]=function(t){return s.call(t)==="[object "+n+"]"}}),m.isArguments(arguments)||(m.isArguments=function(n){return m.has(n,"callee")}),"function"!=typeof/./&&"object"!=typeof Int8Array&&(m.isFunction=function(n){return"function"==typeof n||!1}),m.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},m.isNaN=function(n){return m.isNumber(n)&&n!==+n},m.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"===s.call(n)},m.isNull=function(n){return null===n},m.isUndefined=function(n){return n===void 0},m.has=function(n,t){return null!=n&&p.call(n,t)},m.noConflict=function(){return u._=i,this},m.identity=function(n){return n},m.constant=function(n){return function(){return n}},m.noop=function(){},m.property=w,m.propertyOf=function(n){return null==n?function(){}:function(t){return n[t]}},m.matcher=m.matches=function(n){return n=m.extendOwn({},n),function(t){return m.isMatch(t,n)}},m.times=function(n,t,r){var e=Array(Math.max(0,n));t=b(t,r,1);for(var u=0;n>u;u++)e[u]=t(u);return e},m.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},m.now=Date.now||function(){return(new Date).getTime()};var B={"&":"&","<":"<",">":">",'"':""","'":"'","`":"`"},T=m.invert(B),R=function(n){var t=function(t){return n[t]},r="(?:"+m.keys(n).join("|")+")",e=RegExp(r),u=RegExp(r,"g");return function(n){return n=null==n?"":""+n,e.test(n)?n.replace(u,t):n}};m.escape=R(B),m.unescape=R(T),m.result=function(n,t,r){var e=null==n?void 0:n[t];return e===void 0&&(e=r),m.isFunction(e)?e.call(n):e};var q=0;m.uniqueId=function(n){var t=++q+"";return n?n+t:t},m.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var K=/(.)^/,z={"'":"'","\\":"\\","\r":"r","\n":"n","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\u2028|\u2029/g,L=function(n){return"\\"+z[n]};m.template=function(n,t,r){!t&&r&&(t=r),t=m.defaults({},t,m.templateSettings);var e=RegExp([(t.escape||K).source,(t.interpolate||K).source,(t.evaluate||K).source].join("|")+"|$","g"),u=0,i="__p+='";n.replace(e,function(t,r,e,o,a){return i+=n.slice(u,a).replace(D,L),u=a+t.length,r?i+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'":e?i+="'+\n((__t=("+e+"))==null?'':__t)+\n'":o&&(i+="';\n"+o+"\n__p+='"),t}),i+="';\n",t.variable||(i="with(obj||{}){\n"+i+"}\n"),i="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+i+"return __p;\n";try{var o=new Function(t.variable||"obj","_",i)}catch(a){throw a.source=i,a}var c=function(n){return o.call(this,n,m)},f=t.variable||"obj";return c.source="function("+f+"){\n"+i+"}",c},m.chain=function(n){var t=m(n);return t._chain=!0,t};var P=function(n,t){return n._chain?m(t).chain():t};m.mixin=function(n){m.each(m.functions(n),function(t){var r=m[t]=n[t];m.prototype[t]=function(){var n=[this._wrapped];return f.apply(n,arguments),P(this,r.apply(m,n))}})},m.mixin(m),m.each(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=o[n];m.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!==n&&"splice"!==n||0!==r.length||delete r[0],P(this,r)}}),m.each(["concat","join","slice"],function(n){var t=o[n];m.prototype[n]=function(){return P(this,t.apply(this._wrapped,arguments))}}),m.prototype.value=function(){return this._wrapped},m.prototype.valueOf=m.prototype.toJSON=m.prototype.value,m.prototype.toString=function(){return""+this._wrapped},"function"==typeof define&&define.amd&&define("underscore",[],function(){return m})}).call(this); //# sourceMappingURL=underscore-min.map \ No newline at end of file diff --git a/vendor/underscore/underscore-min.map b/vendor/underscore/underscore-min.map index 4fbe0ba3c..cf356bf9a 100644 --- a/vendor/underscore/underscore-min.map +++ b/vendor/underscore/underscore-min.map @@ -1 +1 @@ -{"version":3,"file":"underscore-min.js","sources":["underscore.js"],"names":["root","this","previousUnderscore","_","breaker","ArrayProto","Array","prototype","ObjProto","Object","FuncProto","Function","push","slice","concat","toString","hasOwnProperty","nativeForEach","forEach","nativeMap","map","nativeReduce","reduce","nativeReduceRight","reduceRight","nativeFilter","filter","nativeEvery","every","nativeSome","some","nativeIndexOf","indexOf","nativeLastIndexOf","lastIndexOf","nativeIsArray","isArray","nativeKeys","keys","nativeBind","bind","obj","_wrapped","exports","module","VERSION","each","iterator","context","length","i","call","collect","results","value","index","list","reduceError","foldl","inject","memo","initial","arguments","TypeError","foldr","find","detect","result","any","select","reject","all","identity","contains","include","target","invoke","method","args","isFunc","isFunction","apply","pluck","key","where","attrs","first","isEmpty","findWhere","max","Math","Infinity","computed","min","shuffle","rand","shuffled","random","sample","n","guard","lookupIterator","sortBy","criteria","sort","left","right","a","b","group","behavior","groupBy","has","indexBy","countBy","sortedIndex","array","low","high","mid","toArray","values","size","head","take","last","rest","tail","drop","compact","flatten","input","shallow","output","isArguments","without","difference","uniq","unique","isSorted","seen","union","intersection","item","other","zip","object","from","hasIndex","range","start","stop","step","ceil","idx","ctor","func","bound","self","partial","bindAll","funcs","Error","f","memoize","hasher","delay","wait","setTimeout","defer","throttle","options","timeout","previous","later","leading","Date","now","remaining","clearTimeout","trailing","debounce","immediate","timestamp","callNow","once","ran","wrap","wrapper","compose","after","times","pairs","invert","functions","methods","names","extend","source","prop","pick","copy","omit","defaults","clone","isObject","tap","interceptor","eq","aStack","bStack","className","String","global","multiline","ignoreCase","aCtor","constructor","bCtor","pop","isEqual","isString","isElement","nodeType","name","isFinite","isNaN","parseFloat","isNumber","isBoolean","isNull","isUndefined","noConflict","accum","floor","entityMap","escape","&","<",">","\"","'","unescape","entityRegexes","RegExp","join","string","replace","match","property","mixin","idCounter","uniqueId","prefix","id","templateSettings","evaluate","interpolate","noMatch","escapes","\\","\r","\n","\t","
","
","escaper","template","text","data","settings","render","matcher","offset","variable","e","chain","_chain"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"underscore-min.js","sources":["underscore.js"],"names":["createReduce","dir","iterator","obj","iteratee","memo","keys","index","length","currentKey","context","optimizeCb","isArrayLike","_","arguments","createPredicateIndexFinder","array","predicate","cb","getLength","createIndexFinder","predicateFind","sortedIndex","item","idx","i","Math","max","min","slice","call","isNaN","collectNonEnumProps","nonEnumIdx","nonEnumerableProps","constructor","proto","isFunction","prototype","ObjProto","prop","has","contains","push","root","this","previousUnderscore","ArrayProto","Array","Object","FuncProto","Function","toString","hasOwnProperty","nativeIsArray","isArray","nativeKeys","nativeBind","bind","nativeCreate","create","Ctor","_wrapped","exports","module","VERSION","func","argCount","value","other","collection","accumulator","apply","identity","isObject","matcher","property","Infinity","createAssigner","keysFunc","undefinedOnly","source","l","key","baseCreate","result","MAX_ARRAY_INDEX","pow","each","forEach","map","collect","results","reduce","foldl","inject","reduceRight","foldr","find","detect","findIndex","findKey","filter","select","list","reject","negate","every","all","some","any","includes","include","fromIndex","guard","values","indexOf","invoke","method","args","isFunc","pluck","where","attrs","findWhere","computed","lastComputed","shuffle","rand","set","shuffled","random","sample","n","sortBy","criteria","sort","left","right","a","b","group","behavior","groupBy","indexBy","countBy","toArray","size","partition","pass","fail","first","head","take","initial","last","rest","tail","drop","compact","flatten","input","shallow","strict","startIndex","output","isArguments","j","len","without","difference","uniq","unique","isSorted","isBoolean","seen","union","intersection","argsLength","zip","unzip","object","findLastIndex","low","high","mid","floor","lastIndexOf","range","start","stop","step","ceil","executeBound","sourceFunc","boundFunc","callingContext","self","TypeError","bound","concat","partial","boundArgs","position","bindAll","Error","memoize","hasher","cache","address","delay","wait","setTimeout","defer","throttle","options","timeout","previous","later","leading","now","remaining","clearTimeout","trailing","debounce","immediate","timestamp","callNow","wrap","wrapper","compose","after","times","before","once","hasEnumBug","propertyIsEnumerable","allKeys","mapObject","pairs","invert","functions","methods","names","extend","extendOwn","assign","pick","oiteratee","omit","String","defaults","props","clone","tap","interceptor","isMatch","eq","aStack","bStack","className","areArrays","aCtor","bCtor","pop","isEqual","isEmpty","isString","isElement","nodeType","type","name","Int8Array","isFinite","parseFloat","isNumber","isNull","isUndefined","noConflict","constant","noop","propertyOf","matches","accum","Date","getTime","escapeMap","&","<",">","\"","'","`","unescapeMap","createEscaper","escaper","match","join","testRegexp","RegExp","replaceRegexp","string","test","replace","escape","unescape","fallback","idCounter","uniqueId","prefix","id","templateSettings","evaluate","interpolate","noMatch","escapes","\\","\r","\n","
","
","escapeChar","template","text","settings","oldSettings","offset","variable","render","e","data","argument","chain","instance","_chain","mixin","valueOf","toJSON","define","amd"],"mappings":"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"} \ No newline at end of file diff --git a/vendor/underscore/underscore.js b/vendor/underscore/underscore.js index b50115df5..ca1cdd332 100644 --- a/vendor/underscore/underscore.js +++ b/vendor/underscore/underscore.js @@ -1,6 +1,6 @@ -// Underscore.js 1.5.2 +// Underscore.js 1.8.3 // http://underscorejs.org -// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// (c) 2009-2017 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors // Underscore may be freely distributed under the MIT license. (function() { @@ -8,41 +8,35 @@ // Baseline setup // -------------- - // Establish the root object, `window` in the browser, or `exports` on the server. - var root = this; + // Establish the root object, `window` (`self`) in the browser, `global` + // on the server, or `this` in some virtual machines. We use `self` + // instead of `window` for `WebWorker` support. + var root = typeof self == 'object' && self.self === self && self || + typeof global == 'object' && global.global === global && global || + this || + {}; // Save the previous value of the `_` variable. var previousUnderscore = root._; - // Establish the object that gets returned to break out of a loop iteration. - var breaker = {}; - // Save bytes in the minified (but not gzipped) version: - var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; + var ArrayProto = Array.prototype, ObjProto = Object.prototype; + var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null; // Create quick reference variables for speed access to core prototypes. - var - push = ArrayProto.push, - slice = ArrayProto.slice, - concat = ArrayProto.concat, - toString = ObjProto.toString, - hasOwnProperty = ObjProto.hasOwnProperty; + var push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; // All **ECMAScript 5** native function implementations that we hope to use // are declared here. - var - nativeForEach = ArrayProto.forEach, - nativeMap = ArrayProto.map, - nativeReduce = ArrayProto.reduce, - nativeReduceRight = ArrayProto.reduceRight, - nativeFilter = ArrayProto.filter, - nativeEvery = ArrayProto.every, - nativeSome = ArrayProto.some, - nativeIndexOf = ArrayProto.indexOf, - nativeLastIndexOf = ArrayProto.lastIndexOf, - nativeIsArray = Array.isArray, - nativeKeys = Object.keys, - nativeBind = FuncProto.bind; + var nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeCreate = Object.create; + + // Naked function reference for surrogate-prototype-swapping. + var Ctor = function(){}; // Create a safe reference to the Underscore object for use below. var _ = function(obj) { @@ -52,11 +46,12 @@ }; // Export the Underscore object for **Node.js**, with - // backwards-compatibility for the old `require()` API. If we're in - // the browser, add `_` as a global object via a string identifier, - // for Closure Compiler "advanced" mode. - if (typeof exports !== 'undefined') { - if (typeof module !== 'undefined' && module.exports) { + // backwards-compatibility for their old module API. If we're in + // the browser, add `_` as a global object. + // (`nodeType` is checked to ensure that `module` + // and `exports` are not HTML elements.) + if (typeof exports != 'undefined' && !exports.nodeType) { + if (typeof module != 'undefined' && !module.nodeType && module.exports) { exports = module.exports = _; } exports._ = _; @@ -65,261 +60,362 @@ } // Current version. - _.VERSION = '1.5.2'; + _.VERSION = '1.8.3'; + + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + var optimizeCb = function(func, context, argCount) { + if (context === void 0) return func; + switch (argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + // The 2-parameter case has been omitted only because no current consumers + // made use of it. + case null: + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + }; + + var builtinIteratee; + + // An internal function to generate callbacks that can be applied to each + // element in a collection, returning the desired result — either `identity`, + // an arbitrary callback, a property matcher, or a property accessor. + var cb = function(value, context, argCount) { + if (_.iteratee !== builtinIteratee) return _.iteratee(value, context); + if (value == null) return _.identity; + if (_.isFunction(value)) return optimizeCb(value, context, argCount); + if (_.isObject(value) && !_.isArray(value)) return _.matcher(value); + return _.property(value); + }; + + // External wrapper for our callback generator. Users may customize + // `_.iteratee` if they want additional predicate/iteratee shorthand styles. + // This abstraction hides the internal-only argCount argument. + _.iteratee = builtinIteratee = function(value, context) { + return cb(value, context, Infinity); + }; + + // Similar to ES6's rest param (http://ariya.ofilabs.com/2013/03/es6-and-rest-parameter.html) + // This accumulates the arguments passed into an array, after a given index. + var restArgs = function(func, startIndex) { + startIndex = startIndex == null ? func.length - 1 : +startIndex; + return function() { + var length = Math.max(arguments.length - startIndex, 0), + rest = Array(length), + index = 0; + for (; index < length; index++) { + rest[index] = arguments[index + startIndex]; + } + switch (startIndex) { + case 0: return func.call(this, rest); + case 1: return func.call(this, arguments[0], rest); + case 2: return func.call(this, arguments[0], arguments[1], rest); + } + var args = Array(startIndex + 1); + for (index = 0; index < startIndex; index++) { + args[index] = arguments[index]; + } + args[startIndex] = rest; + return func.apply(this, args); + }; + }; + + // An internal function for creating a new object that inherits from another. + var baseCreate = function(prototype) { + if (!_.isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; + }; + + var shallowProperty = function(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + }; + + var deepGet = function(obj, path) { + var length = path.length; + for (var i = 0; i < length; i++) { + if (obj == null) return void 0; + obj = obj[path[i]]; + } + return length ? obj : void 0; + }; + + // Helper for collection methods to determine whether a collection + // should be iterated as an array or as an object. + // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + var getLength = shallowProperty('length'); + var isArrayLike = function(collection) { + var length = getLength(collection); + return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX; + }; // Collection Functions // -------------------- // The cornerstone, an `each` implementation, aka `forEach`. - // Handles objects with the built-in `forEach`, arrays, and raw objects. - // Delegates to **ECMAScript 5**'s native `forEach` if available. - var each = _.each = _.forEach = function(obj, iterator, context) { - if (obj == null) return; - if (nativeForEach && obj.forEach === nativeForEach) { - obj.forEach(iterator, context); - } else if (obj.length === +obj.length) { - for (var i = 0, length = obj.length; i < length; i++) { - if (iterator.call(context, obj[i], i, obj) === breaker) return; + // Handles raw objects in addition to array-likes. Treats all + // sparse array-likes as if they were dense. + _.each = _.forEach = function(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); } } else { var keys = _.keys(obj); - for (var i = 0, length = keys.length; i < length; i++) { - if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return; + for (i = 0, length = keys.length; i < length; i++) { + iteratee(obj[keys[i]], keys[i], obj); } } + return obj; }; - // Return the results of applying the iterator to each element. - // Delegates to **ECMAScript 5**'s native `map` if available. - _.map = _.collect = function(obj, iterator, context) { - var results = []; - if (obj == null) return results; - if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); - each(obj, function(value, index, list) { - results.push(iterator.call(context, value, index, list)); - }); + // Return the results of applying the iteratee to each element. + _.map = _.collect = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } return results; }; - var reduceError = 'Reduce of empty array with no initial value'; + // Create a reducing function iterating left or right. + var createReduce = function(dir) { + // Wrap code that reassigns argument variables in a separate function than + // the one that accesses `arguments.length` to avoid a perf hit. (#1991) + var reducer = function(obj, iteratee, memo, initial) { + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + index = dir > 0 ? 0 : length - 1; + if (!initial) { + memo = obj[keys ? keys[index] : index]; + index += dir; + } + for (; index >= 0 && index < length; index += dir) { + var currentKey = keys ? keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + }; + + return function(obj, iteratee, memo, context) { + var initial = arguments.length >= 3; + return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial); + }; + }; // **Reduce** builds up a single result from a list of values, aka `inject`, - // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available. - _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) { - var initial = arguments.length > 2; - if (obj == null) obj = []; - if (nativeReduce && obj.reduce === nativeReduce) { - if (context) iterator = _.bind(iterator, context); - return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator); - } - each(obj, function(value, index, list) { - if (!initial) { - memo = value; - initial = true; - } else { - memo = iterator.call(context, memo, value, index, list); - } - }); - if (!initial) throw new TypeError(reduceError); - return memo; - }; + // or `foldl`. + _.reduce = _.foldl = _.inject = createReduce(1); // The right-associative version of reduce, also known as `foldr`. - // Delegates to **ECMAScript 5**'s native `reduceRight` if available. - _.reduceRight = _.foldr = function(obj, iterator, memo, context) { - var initial = arguments.length > 2; - if (obj == null) obj = []; - if (nativeReduceRight && obj.reduceRight === nativeReduceRight) { - if (context) iterator = _.bind(iterator, context); - return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator); - } - var length = obj.length; - if (length !== +length) { - var keys = _.keys(obj); - length = keys.length; - } - each(obj, function(value, index, list) { - index = keys ? keys[--length] : --length; - if (!initial) { - memo = obj[index]; - initial = true; - } else { - memo = iterator.call(context, memo, obj[index], index, list); - } - }); - if (!initial) throw new TypeError(reduceError); - return memo; - }; + _.reduceRight = _.foldr = createReduce(-1); // Return the first value which passes a truth test. Aliased as `detect`. - _.find = _.detect = function(obj, iterator, context) { - var result; - any(obj, function(value, index, list) { - if (iterator.call(context, value, index, list)) { - result = value; - return true; - } - }); - return result; + _.find = _.detect = function(obj, predicate, context) { + var keyFinder = isArrayLike(obj) ? _.findIndex : _.findKey; + var key = keyFinder(obj, predicate, context); + if (key !== void 0 && key !== -1) return obj[key]; }; // Return all the elements that pass a truth test. - // Delegates to **ECMAScript 5**'s native `filter` if available. // Aliased as `select`. - _.filter = _.select = function(obj, iterator, context) { + _.filter = _.select = function(obj, predicate, context) { var results = []; - if (obj == null) return results; - if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context); - each(obj, function(value, index, list) { - if (iterator.call(context, value, index, list)) results.push(value); + predicate = cb(predicate, context); + _.each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); }); return results; }; // Return all the elements for which a truth test fails. - _.reject = function(obj, iterator, context) { - return _.filter(obj, function(value, index, list) { - return !iterator.call(context, value, index, list); - }, context); + _.reject = function(obj, predicate, context) { + return _.filter(obj, _.negate(cb(predicate)), context); }; // Determine whether all of the elements match a truth test. - // Delegates to **ECMAScript 5**'s native `every` if available. // Aliased as `all`. - _.every = _.all = function(obj, iterator, context) { - iterator || (iterator = _.identity); - var result = true; - if (obj == null) return result; - if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context); - each(obj, function(value, index, list) { - if (!(result = result && iterator.call(context, value, index, list))) return breaker; - }); - return !!result; + _.every = _.all = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; }; // Determine if at least one element in the object matches a truth test. - // Delegates to **ECMAScript 5**'s native `some` if available. // Aliased as `any`. - var any = _.some = _.any = function(obj, iterator, context) { - iterator || (iterator = _.identity); - var result = false; - if (obj == null) return result; - if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context); - each(obj, function(value, index, list) { - if (result || (result = iterator.call(context, value, index, list))) return breaker; - }); - return !!result; + _.some = _.any = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; }; - // Determine if the array or object contains a given value (using `===`). - // Aliased as `include`. - _.contains = _.include = function(obj, target) { - if (obj == null) return false; - if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; - return any(obj, function(value) { - return value === target; - }); + // Determine if the array or object contains a given item (using `===`). + // Aliased as `includes` and `include`. + _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = _.values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return _.indexOf(obj, item, fromIndex) >= 0; }; // Invoke a method (with arguments) on every item in a collection. - _.invoke = function(obj, method) { - var args = slice.call(arguments, 2); - var isFunc = _.isFunction(method); - return _.map(obj, function(value) { - return (isFunc ? method : value[method]).apply(value, args); + _.invoke = restArgs(function(obj, path, args) { + var contextPath, func; + if (_.isFunction(path)) { + func = path; + } else if (_.isArray(path)) { + contextPath = path.slice(0, -1); + path = path[path.length - 1]; + } + return _.map(obj, function(context) { + var method = func; + if (!method) { + if (contextPath && contextPath.length) { + context = deepGet(context, contextPath); + } + if (context == null) return void 0; + method = context[path]; + } + return method == null ? method : method.apply(context, args); }); - }; + }); // Convenience version of a common use case of `map`: fetching a property. _.pluck = function(obj, key) { - return _.map(obj, function(value){ return value[key]; }); + return _.map(obj, _.property(key)); }; // Convenience version of a common use case of `filter`: selecting only objects // containing specific `key:value` pairs. - _.where = function(obj, attrs, first) { - if (_.isEmpty(attrs)) return first ? void 0 : []; - return _[first ? 'find' : 'filter'](obj, function(value) { - for (var key in attrs) { - if (attrs[key] !== value[key]) return false; - } - return true; - }); + _.where = function(obj, attrs) { + return _.filter(obj, _.matcher(attrs)); }; // Convenience version of a common use case of `find`: getting the first object // containing specific `key:value` pairs. _.findWhere = function(obj, attrs) { - return _.where(obj, attrs, true); + return _.find(obj, _.matcher(attrs)); }; - // Return the maximum element or (element-based computation). - // Can't optimize arrays of integers longer than 65,535 elements. - // See [WebKit Bug 80797](https://bugs.webkit.org/show_bug.cgi?id=80797) - _.max = function(obj, iterator, context) { - if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { - return Math.max.apply(Math, obj); + // Return the maximum element (or element-based computation). + _.max = function(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object') && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed > lastComputed || computed === -Infinity && result === -Infinity) { + result = v; + lastComputed = computed; + } + }); } - if (!iterator && _.isEmpty(obj)) return -Infinity; - var result = {computed : -Infinity, value: -Infinity}; - each(obj, function(value, index, list) { - var computed = iterator ? iterator.call(context, value, index, list) : value; - computed > result.computed && (result = {value : value, computed : computed}); - }); - return result.value; + return result; }; // Return the minimum element (or element-based computation). - _.min = function(obj, iterator, context) { - if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { - return Math.min.apply(Math, obj); + _.min = function(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object') && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value != null && value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(v, index, list) { + computed = iteratee(v, index, list); + if (computed < lastComputed || computed === Infinity && result === Infinity) { + result = v; + lastComputed = computed; + } + }); } - if (!iterator && _.isEmpty(obj)) return Infinity; - var result = {computed : Infinity, value: Infinity}; - each(obj, function(value, index, list) { - var computed = iterator ? iterator.call(context, value, index, list) : value; - computed < result.computed && (result = {value : value, computed : computed}); - }); - return result.value; + return result; }; - // Shuffle an array, using the modern version of the - // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + // Shuffle a collection. _.shuffle = function(obj) { - var rand; - var index = 0; - var shuffled = []; - each(obj, function(value) { - rand = _.random(index++); - shuffled[index - 1] = shuffled[rand]; - shuffled[rand] = value; - }); - return shuffled; + return _.sample(obj, Infinity); }; - // Sample **n** random values from an array. - // If **n** is not specified, returns a single random element from the array. + // Sample **n** random values from a collection using the modern version of the + // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + // If **n** is not specified, returns a single random element. // The internal `guard` argument allows it to work with `map`. _.sample = function(obj, n, guard) { - if (arguments.length < 2 || guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = _.values(obj); return obj[_.random(obj.length - 1)]; } - return _.shuffle(obj).slice(0, Math.max(0, n)); + var sample = isArrayLike(obj) ? _.clone(obj) : _.values(obj); + var length = getLength(sample); + n = Math.max(Math.min(n, length), 0); + var last = length - 1; + for (var index = 0; index < n; index++) { + var rand = _.random(index, last); + var temp = sample[index]; + sample[index] = sample[rand]; + sample[rand] = temp; + } + return sample.slice(0, n); }; - // An internal function to generate lookup iterators. - var lookupIterator = function(value) { - return _.isFunction(value) ? value : function(obj){ return obj[value]; }; - }; - - // Sort the object's values by a criterion produced by an iterator. - _.sortBy = function(obj, value, context) { - var iterator = lookupIterator(value); - return _.pluck(_.map(obj, function(value, index, list) { + // Sort the object's values by a criterion produced by an iteratee. + _.sortBy = function(obj, iteratee, context) { + var index = 0; + iteratee = cb(iteratee, context); + return _.pluck(_.map(obj, function(value, key, list) { return { value: value, - index: index, - criteria: iterator.call(context, value, index, list) + index: index++, + criteria: iteratee(value, key, list) }; }).sort(function(left, right) { var a = left.criteria; @@ -333,13 +429,13 @@ }; // An internal function used for aggregate "group by" operations. - var group = function(behavior) { - return function(obj, value, context) { - var result = {}; - var iterator = value == null ? _.identity : lookupIterator(value); - each(obj, function(value, index) { - var key = iterator.call(context, value, index, obj); - behavior(result, key, value); + var group = function(behavior, partition) { + return function(obj, iteratee, context) { + var result = partition ? [[], []] : {}; + iteratee = cb(iteratee, context); + _.each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); }); return result; }; @@ -347,50 +443,48 @@ // Groups the object's values by a criterion. Pass either a string attribute // to group by, or a function that returns the criterion. - _.groupBy = group(function(result, key, value) { - (_.has(result, key) ? result[key] : (result[key] = [])).push(value); + _.groupBy = group(function(result, value, key) { + if (_.has(result, key)) result[key].push(value); else result[key] = [value]; }); // Indexes the object's values by a criterion, similar to `groupBy`, but for // when you know that your index values will be unique. - _.indexBy = group(function(result, key, value) { + _.indexBy = group(function(result, value, key) { result[key] = value; }); // Counts instances of an object that group by a certain criterion. Pass // either a string attribute to count by, or a function that returns the // criterion. - _.countBy = group(function(result, key) { - _.has(result, key) ? result[key]++ : result[key] = 1; + _.countBy = group(function(result, value, key) { + if (_.has(result, key)) result[key]++; else result[key] = 1; }); - // Use a comparator function to figure out the smallest index at which - // an object should be inserted so as to maintain order. Uses binary search. - _.sortedIndex = function(array, obj, iterator, context) { - iterator = iterator == null ? _.identity : lookupIterator(iterator); - var value = iterator.call(context, obj); - var low = 0, high = array.length; - while (low < high) { - var mid = (low + high) >>> 1; - iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid; - } - return low; - }; - + var reStrSymbol = /[^\ud800-\udfff]|[\ud800-\udbff][\udc00-\udfff]|[\ud800-\udfff]/g; // Safely create a real, live array from anything iterable. _.toArray = function(obj) { if (!obj) return []; if (_.isArray(obj)) return slice.call(obj); - if (obj.length === +obj.length) return _.map(obj, _.identity); + if (_.isString(obj)) { + // Keep surrogate pair characters together + return obj.match(reStrSymbol); + } + if (isArrayLike(obj)) return _.map(obj, _.identity); return _.values(obj); }; // Return the number of elements in an object. _.size = function(obj) { if (obj == null) return 0; - return (obj.length === +obj.length) ? obj.length : _.keys(obj).length; + return isArrayLike(obj) ? obj.length : _.keys(obj).length; }; + // Split a collection into two arrays: one whose elements all satisfy the given + // predicate, and one whose elements all do not satisfy the predicate. + _.partition = group(function(result, value, pass) { + result[pass ? 0 : 1].push(value); + }, true); + // Array Functions // --------------- @@ -398,130 +492,154 @@ // values in the array. Aliased as `head` and `take`. The **guard** check // allows it to work with `_.map`. _.first = _.head = _.take = function(array, n, guard) { - if (array == null) return void 0; - return (n == null) || guard ? array[0] : slice.call(array, 0, n); + if (array == null || array.length < 1) return void 0; + if (n == null || guard) return array[0]; + return _.initial(array, array.length - n); }; // Returns everything but the last entry of the array. Especially useful on // the arguments object. Passing **n** will return all the values in - // the array, excluding the last N. The **guard** check allows it to work with - // `_.map`. + // the array, excluding the last N. _.initial = function(array, n, guard) { - return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n)); + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); }; // Get the last element of an array. Passing **n** will return the last N - // values in the array. The **guard** check allows it to work with `_.map`. + // values in the array. _.last = function(array, n, guard) { - if (array == null) return void 0; - if ((n == null) || guard) { - return array[array.length - 1]; - } else { - return slice.call(array, Math.max(array.length - n, 0)); - } + if (array == null || array.length < 1) return void 0; + if (n == null || guard) return array[array.length - 1]; + return _.rest(array, Math.max(0, array.length - n)); }; // Returns everything but the first entry of the array. Aliased as `tail` and `drop`. // Especially useful on the arguments object. Passing an **n** will return - // the rest N values in the array. The **guard** - // check allows it to work with `_.map`. + // the rest N values in the array. _.rest = _.tail = _.drop = function(array, n, guard) { - return slice.call(array, (n == null) || guard ? 1 : n); + return slice.call(array, n == null || guard ? 1 : n); }; // Trim out all falsy values from an array. _.compact = function(array) { - return _.filter(array, _.identity); + return _.filter(array, Boolean); }; // Internal implementation of a recursive `flatten` function. - var flatten = function(input, shallow, output) { - if (shallow && _.every(input, _.isArray)) { - return concat.apply(output, input); - } - each(input, function(value) { - if (_.isArray(value) || _.isArguments(value)) { - shallow ? push.apply(output, value) : flatten(value, shallow, output); - } else { - output.push(value); + var flatten = function(input, shallow, strict, output) { + output = output || []; + var idx = output.length; + for (var i = 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) { + // Flatten current level of array or arguments object. + if (shallow) { + var j = 0, len = value.length; + while (j < len) output[idx++] = value[j++]; + } else { + flatten(value, shallow, strict, output); + idx = output.length; + } + } else if (!strict) { + output[idx++] = value; } - }); + } return output; }; // Flatten out an array, either recursively (by default), or just one level. _.flatten = function(array, shallow) { - return flatten(array, shallow, []); + return flatten(array, shallow, false); }; // Return a version of the array that does not contain the specified value(s). - _.without = function(array) { - return _.difference(array, slice.call(arguments, 1)); - }; + _.without = restArgs(function(array, otherArrays) { + return _.difference(array, otherArrays); + }); // Produce a duplicate-free version of the array. If the array has already // been sorted, you have the option of using a faster algorithm. // Aliased as `unique`. - _.uniq = _.unique = function(array, isSorted, iterator, context) { - if (_.isFunction(isSorted)) { - context = iterator; - iterator = isSorted; + _.uniq = _.unique = function(array, isSorted, iteratee, context) { + if (!_.isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; isSorted = false; } - var initial = iterator ? _.map(array, iterator, context) : array; - var results = []; + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; var seen = []; - each(initial, function(value, index) { - if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) { - seen.push(value); - results.push(array[index]); + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!_.contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!_.contains(result, value)) { + result.push(value); } - }); - return results; + } + return result; }; // Produce an array that contains the union: each distinct element from all of // the passed-in arrays. - _.union = function() { - return _.uniq(_.flatten(arguments, true)); - }; + _.union = restArgs(function(arrays) { + return _.uniq(flatten(arrays, true, true)); + }); // Produce an array that contains every item shared between all the // passed-in arrays. _.intersection = function(array) { - var rest = slice.call(arguments, 1); - return _.filter(_.uniq(array), function(item) { - return _.every(rest, function(other) { - return _.indexOf(other, item) >= 0; - }); - }); + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (_.contains(result, item)) continue; + var j; + for (j = 1; j < argsLength; j++) { + if (!_.contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; }; // Take the difference between one array and a number of other arrays. // Only the elements present in just the first array will remain. - _.difference = function(array) { - var rest = concat.apply(ArrayProto, slice.call(arguments, 1)); - return _.filter(array, function(value){ return !_.contains(rest, value); }); + _.difference = restArgs(function(array, rest) { + rest = flatten(rest, true, true); + return _.filter(array, function(value){ + return !_.contains(rest, value); + }); + }); + + // Complement of _.zip. Unzip accepts an array of arrays and groups + // each array's elements on shared indices. + _.unzip = function(array) { + var length = array && _.max(array, getLength).length || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = _.pluck(array, index); + } + return result; }; // Zip together multiple lists into a single array -- elements that share // an index go together. - _.zip = function() { - var length = _.max(_.pluck(arguments, "length").concat(0)); - var results = new Array(length); - for (var i = 0; i < length; i++) { - results[i] = _.pluck(arguments, '' + i); - } - return results; - }; + _.zip = restArgs(_.unzip); // Converts lists into objects. Pass either a single array of `[key, value]` // pairs, or two parallel arrays of the same length -- one of keys, and one of - // the corresponding values. + // the corresponding values. Passing by pairs is the reverse of _.pairs. _.object = function(list, values) { - if (list == null) return {}; var result = {}; - for (var i = 0, length = list.length; i < length; i++) { + for (var i = 0, length = getLength(list); i < length; i++) { if (values) { result[list[i]] = values[i]; } else { @@ -531,127 +649,183 @@ return result; }; - // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**), - // we need this function. Return the position of the first occurrence of an - // item in an array, or -1 if the item is not included in the array. - // Delegates to **ECMAScript 5**'s native `indexOf` if available. - // If the array is large and already in sort order, pass `true` - // for **isSorted** to use binary search. - _.indexOf = function(array, item, isSorted) { - if (array == null) return -1; - var i = 0, length = array.length; - if (isSorted) { - if (typeof isSorted == 'number') { - i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted); - } else { - i = _.sortedIndex(array, item); - return array[i] === item ? i : -1; + // Generator function to create the findIndex and findLastIndex functions. + var createPredicateIndexFinder = function(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; } - } - if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted); - for (; i < length; i++) if (array[i] === item) return i; - return -1; + return -1; + }; }; - // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available. - _.lastIndexOf = function(array, item, from) { - if (array == null) return -1; - var hasIndex = from != null; - if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) { - return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item); + // Returns the first index on an array-like that passes a predicate test. + _.findIndex = createPredicateIndexFinder(1); + _.findLastIndex = createPredicateIndexFinder(-1); + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + _.sortedIndex = function(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; } - var i = (hasIndex ? from : array.length); - while (i--) if (array[i] === item) return i; - return -1; + return low; }; + // Generator function to create the indexOf and lastIndexOf functions. + var createIndexFinder = function(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), _.isNaN); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; + }; + + // Return the position of the first occurrence of an item in an array, + // or -1 if the item is not included in the array. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex); + _.lastIndexOf = createIndexFinder(-1, _.findLastIndex); + // Generate an integer Array containing an arithmetic progression. A port of // the native Python `range()` function. See // [the Python documentation](http://docs.python.org/library/functions.html#range). _.range = function(start, stop, step) { - if (arguments.length <= 1) { + if (stop == null) { stop = start || 0; start = 0; } - step = arguments[2] || 1; + if (!step) { + step = stop < start ? -1 : 1; + } var length = Math.max(Math.ceil((stop - start) / step), 0); - var idx = 0; - var range = new Array(length); + var range = Array(length); - while(idx < length) { - range[idx++] = start; - start += step; + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; } return range; }; + // Split an **array** into several arrays containing **count** or less elements + // of initial array. + _.chunk = function(array, count) { + if (count == null || count < 1) return []; + + var result = []; + var i = 0, length = array.length; + while (i < length) { + result.push(slice.call(array, i, i += count)); + } + return result; + }; + // Function (ahem) Functions // ------------------ - // Reusable constructor function for prototype setting. - var ctor = function(){}; + // Determines whether to execute a function as a constructor + // or a normal function with the provided arguments. + var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (_.isObject(result)) return result; + return self; + }; // Create a function bound to a given object (assigning `this`, and arguments, // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if // available. - _.bind = function(func, context) { - var args, bound; - if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); - if (!_.isFunction(func)) throw new TypeError; - args = slice.call(arguments, 2); - return bound = function() { - if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments))); - ctor.prototype = func.prototype; - var self = new ctor; - ctor.prototype = null; - var result = func.apply(self, args.concat(slice.call(arguments))); - if (Object(result) === result) return result; - return self; - }; - }; + _.bind = restArgs(function(func, context, args) { + if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function'); + var bound = restArgs(function(callArgs) { + return executeBound(func, bound, context, this, args.concat(callArgs)); + }); + return bound; + }); // Partially apply a function by creating a version that has had some of its - // arguments pre-filled, without changing its dynamic `this` context. - _.partial = function(func) { - var args = slice.call(arguments, 1); - return function() { - return func.apply(this, args.concat(slice.call(arguments))); + // arguments pre-filled, without changing its dynamic `this` context. _ acts + // as a placeholder by default, allowing any combination of arguments to be + // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument. + _.partial = restArgs(function(func, boundArgs) { + var placeholder = _.partial.placeholder; + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); }; - }; + return bound; + }); - // Bind all of an object's methods to that object. Useful for ensuring that - // all callbacks defined on an object belong to it. - _.bindAll = function(obj) { - var funcs = slice.call(arguments, 1); - if (funcs.length === 0) throw new Error("bindAll must be passed function names"); - each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); }); - return obj; - }; + _.partial.placeholder = _; + + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. + _.bindAll = restArgs(function(obj, keys) { + keys = flatten(keys, false, false); + var index = keys.length; + if (index < 1) throw new Error('bindAll must be passed function names'); + while (index--) { + var key = keys[index]; + obj[key] = _.bind(obj[key], obj); + } + }); // Memoize an expensive function by storing its results. _.memoize = function(func, hasher) { - var memo = {}; - hasher || (hasher = _.identity); - return function() { - var key = hasher.apply(this, arguments); - return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments)); + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!_.has(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; }; + memoize.cache = {}; + return memoize; }; // Delays a function for the given number of milliseconds, and then calls // it with the arguments supplied. - _.delay = function(func, wait) { - var args = slice.call(arguments, 2); - return setTimeout(function(){ return func.apply(null, args); }, wait); - }; + _.delay = restArgs(function(func, wait, args) { + return setTimeout(function() { + return func.apply(null, args); + }, wait); + }); // Defers a function, scheduling it to run after the current call stack has // cleared. - _.defer = function(func) { - return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1))); - }; + _.defer = _.partial(_.delay, _, 1); // Returns a function, that, when invoked, will only be triggered at most once // during a given window of time. Normally, the throttled function will run @@ -659,31 +833,44 @@ // but if you'd like to disable the execution on the leading edge, pass // `{leading: false}`. To disable execution on the trailing edge, ditto. _.throttle = function(func, wait, options) { - var context, args, result; - var timeout = null; + var timeout, context, args, result; var previous = 0; - options || (options = {}); + if (!options) options = {}; + var later = function() { - previous = options.leading === false ? 0 : new Date; + previous = options.leading === false ? 0 : _.now(); timeout = null; result = func.apply(context, args); + if (!timeout) context = args = null; }; - return function() { - var now = new Date; + + var throttled = function() { + var now = _.now(); if (!previous && options.leading === false) previous = now; var remaining = wait - (now - previous); context = this; args = arguments; - if (remaining <= 0) { - clearTimeout(timeout); - timeout = null; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } previous = now; result = func.apply(context, args); + if (!timeout) context = args = null; } else if (!timeout && options.trailing !== false) { timeout = setTimeout(later, remaining); } return result; }; + + throttled.cancel = function() { + clearTimeout(timeout); + previous = 0; + timeout = context = args = null; + }; + + return throttled; }; // Returns a function, that, as long as it continues to be invoked, will not @@ -691,67 +878,62 @@ // N milliseconds. If `immediate` is passed, trigger the function on the // leading edge, instead of the trailing. _.debounce = function(func, wait, immediate) { - var timeout, args, context, timestamp, result; - return function() { - context = this; - args = arguments; - timestamp = new Date(); - var later = function() { - var last = (new Date()) - timestamp; - if (last < wait) { - timeout = setTimeout(later, wait - last); - } else { - timeout = null; - if (!immediate) result = func.apply(context, args); - } - }; - var callNow = immediate && !timeout; - if (!timeout) { - timeout = setTimeout(later, wait); - } - if (callNow) result = func.apply(context, args); - return result; - }; - }; + var timeout, result; - // Returns a function that will be executed at most one time, no matter how - // often you call it. Useful for lazy initialization. - _.once = function(func) { - var ran = false, memo; - return function() { - if (ran) return memo; - ran = true; - memo = func.apply(this, arguments); - func = null; - return memo; + var later = function(context, args) { + timeout = null; + if (args) result = func.apply(context, args); }; + + var debounced = restArgs(function(args) { + if (timeout) clearTimeout(timeout); + if (immediate) { + var callNow = !timeout; + timeout = setTimeout(later, wait); + if (callNow) result = func.apply(this, args); + } else { + timeout = _.delay(later, wait, this, args); + } + + return result; + }); + + debounced.cancel = function() { + clearTimeout(timeout); + timeout = null; + }; + + return debounced; }; // Returns the first function passed as an argument to the second, // allowing you to adjust arguments, run code before and after, and // conditionally execute the original function. _.wrap = function(func, wrapper) { + return _.partial(wrapper, func); + }; + + // Returns a negated version of the passed-in predicate. + _.negate = function(predicate) { return function() { - var args = [func]; - push.apply(args, arguments); - return wrapper.apply(this, args); + return !predicate.apply(this, arguments); }; }; // Returns a function that is the composition of a list of functions, each // consuming the return value of the function that follows. _.compose = function() { - var funcs = arguments; + var args = arguments; + var start = args.length - 1; return function() { - var args = arguments; - for (var i = funcs.length - 1; i >= 0; i--) { - args = [funcs[i].apply(this, args)]; - } - return args[0]; + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; }; }; - // Returns a function that will only be executed after being called N times. + // Returns a function that will only be executed on and after the Nth call. _.after = function(times, func) { return function() { if (--times < 1) { @@ -760,15 +942,68 @@ }; }; + // Returns a function that will only be executed up to (but not including) the Nth call. + _.before = function(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; + }; + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + _.once = _.partial(_.before, 2); + + _.restArgs = restArgs; + // Object Functions // ---------------- - // Retrieve the names of an object's properties. - // Delegates to **ECMAScript 5**'s native `Object.keys` - _.keys = nativeKeys || function(obj) { - if (obj !== Object(obj)) throw new TypeError('Invalid object'); + // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. + var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); + var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + + var collectNonEnumProps = function(obj, keys) { + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = _.isFunction(constructor) && constructor.prototype || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) { + keys.push(prop); + } + } + }; + + // Retrieve the names of an object's own properties. + // Delegates to **ECMAScript 5**'s native `Object.keys`. + _.keys = function(obj) { + if (!_.isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); var keys = []; for (var key in obj) if (_.has(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + }; + + // Retrieve all the property names of an object. + _.allKeys = function(obj) { + if (!_.isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); return keys; }; @@ -776,18 +1011,33 @@ _.values = function(obj) { var keys = _.keys(obj); var length = keys.length; - var values = new Array(length); + var values = Array(length); for (var i = 0; i < length; i++) { values[i] = obj[keys[i]]; } return values; }; + // Returns the results of applying the iteratee to each element of the object. + // In contrast to _.map it returns an object. + _.mapObject = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = _.keys(obj), + length = keys.length, + results = {}; + for (var index = 0; index < length; index++) { + var currentKey = keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + }; + // Convert an object into a list of `[key, value]` pairs. + // The opposite of _.object. _.pairs = function(obj) { var keys = _.keys(obj); var length = keys.length; - var pairs = new Array(length); + var pairs = Array(length); for (var i = 0; i < length; i++) { pairs[i] = [keys[i], obj[keys[i]]]; } @@ -805,7 +1055,7 @@ }; // Return a sorted list of the function names available on the object. - // Aliased as `methods` + // Aliased as `methods`. _.functions = _.methods = function(obj) { var names = []; for (var key in obj) { @@ -814,48 +1064,92 @@ return names.sort(); }; - // Extend a given object with all the properties in passed-in object(s). - _.extend = function(obj) { - each(slice.call(arguments, 1), function(source) { - if (source) { - for (var prop in source) { - obj[prop] = source[prop]; + // An internal function for creating assigner functions. + var createAssigner = function(keysFunc, defaults) { + return function(obj) { + var length = arguments.length; + if (defaults) obj = Object(obj); + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!defaults || obj[key] === void 0) obj[key] = source[key]; } } - }); - return obj; + return obj; + }; + }; + + // Extend a given object with all the properties in passed-in object(s). + _.extend = createAssigner(_.allKeys); + + // Assigns a given object with all the own properties in the passed-in object(s). + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + _.extendOwn = _.assign = createAssigner(_.keys); + + // Returns the first key on an object that passes a predicate test. + _.findKey = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = _.keys(obj), key; + for (var i = 0, length = keys.length; i < length; i++) { + key = keys[i]; + if (predicate(obj[key], key, obj)) return key; + } + }; + + // Internal pick helper function to determine if `obj` has key `key`. + var keyInObj = function(value, key, obj) { + return key in obj; }; // Return a copy of the object only containing the whitelisted properties. - _.pick = function(obj) { - var copy = {}; - var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); - each(keys, function(key) { - if (key in obj) copy[key] = obj[key]; - }); - return copy; - }; - - // Return a copy of the object without the blacklisted properties. - _.omit = function(obj) { - var copy = {}; - var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); - for (var key in obj) { - if (!_.contains(keys, key)) copy[key] = obj[key]; + _.pick = restArgs(function(obj, keys) { + var result = {}, iteratee = keys[0]; + if (obj == null) return result; + if (_.isFunction(iteratee)) { + if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]); + keys = _.allKeys(obj); + } else { + iteratee = keyInObj; + keys = flatten(keys, false, false); + obj = Object(obj); } - return copy; - }; + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; + }); + + // Return a copy of the object without the blacklisted properties. + _.omit = restArgs(function(obj, keys) { + var iteratee = keys[0], context; + if (_.isFunction(iteratee)) { + iteratee = _.negate(iteratee); + if (keys.length > 1) context = keys[1]; + } else { + keys = _.map(flatten(keys, false, false), String); + iteratee = function(value, key) { + return !_.contains(keys, key); + }; + } + return _.pick(obj, iteratee, context); + }); // Fill in a given object with default properties. - _.defaults = function(obj) { - each(slice.call(arguments, 1), function(source) { - if (source) { - for (var prop in source) { - if (obj[prop] === void 0) obj[prop] = source[prop]; - } - } - }); - return obj; + _.defaults = createAssigner(_.allKeys, true); + + // Creates an object that inherits from the given prototype object. + // If additional properties are provided then they will be added to the + // created object. + _.create = function(prototype, props) { + var result = baseCreate(prototype); + if (props) _.extendOwn(result, props); + return result; }; // Create a (shallow-cloned) duplicate of an object. @@ -872,109 +1166,136 @@ return obj; }; + // Returns whether an object has a given set of `key:value` pairs. + _.isMatch = function(object, attrs) { + var keys = _.keys(attrs), length = keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + }; + + // Internal recursive comparison function for `isEqual`. - var eq = function(a, b, aStack, bStack) { + var eq, deepEq; + eq = function(a, b, aStack, bStack) { // Identical objects are equal. `0 === -0`, but they aren't identical. // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). - if (a === b) return a !== 0 || 1 / a == 1 / b; - // A strict comparison is necessary because `null == undefined`. - if (a == null || b == null) return a === b; + if (a === b) return a !== 0 || 1 / a === 1 / b; + // `null` or `undefined` only equal to itself (strict comparison). + if (a == null || b == null) return false; + // `NaN`s are equivalent, but non-reflexive. + if (a !== a) return b !== b; + // Exhaust primitive checks + var type = typeof a; + if (type !== 'function' && type !== 'object' && typeof b != 'object') return false; + return deepEq(a, b, aStack, bStack); + }; + + // Internal recursive comparison function for `isEqual`. + deepEq = function(a, b, aStack, bStack) { // Unwrap any wrapped objects. if (a instanceof _) a = a._wrapped; if (b instanceof _) b = b._wrapped; // Compare `[[Class]]` names. var className = toString.call(a); - if (className != toString.call(b)) return false; + if (className !== toString.call(b)) return false; switch (className) { - // Strings, numbers, dates, and booleans are compared by value. + // Strings, numbers, regular expressions, dates, and booleans are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') case '[object String]': // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is // equivalent to `new String("5")`. - return a == String(b); + return '' + a === '' + b; case '[object Number]': - // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for - // other numeric values. - return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b); + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN. + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; case '[object Date]': case '[object Boolean]': // Coerce dates and booleans to numeric primitive values. Dates are compared by their // millisecond representations. Note that invalid dates with millisecond representations // of `NaN` are not equivalent. - return +a == +b; - // RegExps are compared by their source patterns and flags. - case '[object RegExp]': - return a.source == b.source && - a.global == b.global && - a.multiline == b.multiline && - a.ignoreCase == b.ignoreCase; + return +a === +b; + case '[object Symbol]': + return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b); + } + + var areArrays = className === '[object Array]'; + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor && + _.isFunction(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } } - if (typeof a != 'object' || typeof b != 'object') return false; // Assume equality for cyclic structures. The algorithm for detecting cyclic // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; var length = aStack.length; while (length--) { // Linear search. Performance is inversely proportional to the number of // unique nested structures. - if (aStack[length] == a) return bStack[length] == b; - } - // Objects with different constructors are not equivalent, but `Object`s - // from different frames are. - var aCtor = a.constructor, bCtor = b.constructor; - if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) && - _.isFunction(bCtor) && (bCtor instanceof bCtor))) { - return false; + if (aStack[length] === a) return bStack[length] === b; } + // Add the first object to the stack of traversed objects. aStack.push(a); bStack.push(b); - var size = 0, result = true; + // Recursively compare objects and arrays. - if (className == '[object Array]') { + if (areArrays) { // Compare array lengths to determine if a deep comparison is necessary. - size = a.length; - result = size == b.length; - if (result) { - // Deep compare the contents, ignoring non-numeric properties. - while (size--) { - if (!(result = eq(a[size], b[size], aStack, bStack))) break; - } + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; } } else { // Deep compare objects. - for (var key in a) { - if (_.has(a, key)) { - // Count the expected number of properties. - size++; - // Deep compare each member. - if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break; - } - } - // Ensure that both objects contain the same number of properties. - if (result) { - for (key in b) { - if (_.has(b, key) && !(size--)) break; - } - result = !size; + var keys = _.keys(a), key; + length = keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (_.keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = keys[length]; + if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; } } // Remove the first object from the stack of traversed objects. aStack.pop(); bStack.pop(); - return result; + return true; }; // Perform a deep comparison to check if two objects are equal. _.isEqual = function(a, b) { - return eq(a, b, [], []); + return eq(a, b); }; // Is a given array, string, or object empty? // An "empty" object has no enumerable own-properties. _.isEmpty = function(obj) { if (obj == null) return true; - if (_.isArray(obj) || _.isString(obj)) return obj.length === 0; - for (var key in obj) if (_.has(obj, key)) return false; - return true; + if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0; + return _.keys(obj).length === 0; }; // Is a given value a DOM element? @@ -985,49 +1306,52 @@ // Is a given value an array? // Delegates to ECMA5's native Array.isArray _.isArray = nativeIsArray || function(obj) { - return toString.call(obj) == '[object Array]'; + return toString.call(obj) === '[object Array]'; }; // Is a given variable an object? _.isObject = function(obj) { - return obj === Object(obj); + var type = typeof obj; + return type === 'function' || type === 'object' && !!obj; }; - // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp. - each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) { + // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError, isMap, isWeakMap, isSet, isWeakSet. + _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error', 'Symbol', 'Map', 'WeakMap', 'Set', 'WeakSet'], function(name) { _['is' + name] = function(obj) { - return toString.call(obj) == '[object ' + name + ']'; + return toString.call(obj) === '[object ' + name + ']'; }; }); - // Define a fallback version of the method in browsers (ahem, IE), where + // Define a fallback version of the method in browsers (ahem, IE < 9), where // there isn't any inspectable "Arguments" type. if (!_.isArguments(arguments)) { _.isArguments = function(obj) { - return !!(obj && _.has(obj, 'callee')); + return _.has(obj, 'callee'); }; } - // Optimize `isFunction` if appropriate. - if (typeof (/./) !== 'function') { + // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8, + // IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236). + var nodelist = root.document && root.document.childNodes; + if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') { _.isFunction = function(obj) { - return typeof obj === 'function'; + return typeof obj == 'function' || false; }; } // Is a given object a finite number? _.isFinite = function(obj) { - return isFinite(obj) && !isNaN(parseFloat(obj)); + return !_.isSymbol(obj) && isFinite(obj) && !isNaN(parseFloat(obj)); }; - // Is the given value `NaN`? (NaN is the only number which does not equal itself). + // Is the given value `NaN`? _.isNaN = function(obj) { - return _.isNumber(obj) && obj != +obj; + return _.isNumber(obj) && isNaN(obj); }; // Is a given value a boolean? _.isBoolean = function(obj) { - return obj === true || obj === false || toString.call(obj) == '[object Boolean]'; + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; }; // Is a given value equal to null? @@ -1042,8 +1366,19 @@ // Shortcut function for checking if an object has a given property directly // on itself (in other words, not on a prototype). - _.has = function(obj, key) { - return hasOwnProperty.call(obj, key); + _.has = function(obj, path) { + if (!_.isArray(path)) { + return obj != null && hasOwnProperty.call(obj, path); + } + var length = path.length; + for (var i = 0; i < length; i++) { + var key = path[i]; + if (obj == null || !hasOwnProperty.call(obj, key)) { + return false; + } + obj = obj[key]; + } + return !!length; }; // Utility Functions @@ -1056,15 +1391,53 @@ return this; }; - // Keep the identity function around for default iterators. + // Keep the identity function around for default iteratees. _.identity = function(value) { return value; }; + // Predicate-generating functions. Often useful outside of Underscore. + _.constant = function(value) { + return function() { + return value; + }; + }; + + _.noop = function(){}; + + _.property = function(path) { + if (!_.isArray(path)) { + return shallowProperty(path); + } + return function(obj) { + return deepGet(obj, path); + }; + }; + + // Generates a function for a given object that returns a given property. + _.propertyOf = function(obj) { + if (obj == null) { + return function(){}; + } + return function(path) { + return !_.isArray(path) ? obj[path] : deepGet(obj, path); + }; + }; + + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + _.matcher = _.matches = function(attrs) { + attrs = _.extendOwn({}, attrs); + return function(obj) { + return _.isMatch(obj, attrs); + }; + }; + // Run a function **n** times. - _.times = function(n, iterator, context) { + _.times = function(n, iteratee, context) { var accum = Array(Math.max(0, n)); - for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); return accum; }; @@ -1077,52 +1450,57 @@ return min + Math.floor(Math.random() * (max - min + 1)); }; - // List of HTML entities for escaping. - var entityMap = { - escape: { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' - } + // A (possibly faster) way to get the current timestamp as an integer. + _.now = Date.now || function() { + return new Date().getTime(); }; - entityMap.unescape = _.invert(entityMap.escape); - // Regexes containing the keys and values listed immediately above. - var entityRegexes = { - escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'), - unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g') + // List of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' }; + var unescapeMap = _.invert(escapeMap); // Functions for escaping and unescaping strings to/from HTML interpolation. - _.each(['escape', 'unescape'], function(method) { - _[method] = function(string) { - if (string == null) return ''; - return ('' + string).replace(entityRegexes[method], function(match) { - return entityMap[method][match]; - }); + var createEscaper = function(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped. + var source = '(?:' + _.keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; }; - }); - - // If the value of the named `property` is a function then invoke it with the - // `object` as context; otherwise, return it. - _.result = function(object, property) { - if (object == null) return void 0; - var value = object[property]; - return _.isFunction(value) ? value.call(object) : value; }; + _.escape = createEscaper(escapeMap); + _.unescape = createEscaper(unescapeMap); - // Add your own custom functions to the Underscore object. - _.mixin = function(obj) { - each(_.functions(obj), function(name) { - var func = _[name] = obj[name]; - _.prototype[name] = function() { - var args = [this._wrapped]; - push.apply(args, arguments); - return result.call(this, func.apply(_, args)); - }; - }); + // Traverses the children of `obj` along `path`. If a child is a function, it + // is invoked with its parent as context. Returns the value of the final + // child, or `fallback` if any child is undefined. + _.result = function(obj, path, fallback) { + if (!_.isArray(path)) path = [path]; + var length = path.length; + if (!length) { + return _.isFunction(fallback) ? fallback.call(obj) : fallback; + } + for (var i = 0; i < length; i++) { + var prop = obj == null ? void 0 : obj[path[i]]; + if (prop === void 0) { + prop = fallback; + i = length; // Ensure we don't continue iterating. + } + obj = _.isFunction(prop) ? prop.call(obj) : prop; + } + return obj; }; // Generate a unique integer id (unique within the entire client session). @@ -1136,9 +1514,9 @@ // By default, Underscore uses ERB-style template delimiters, change the // following template settings to use alternative delimiters. _.templateSettings = { - evaluate : /<%([\s\S]+?)%>/g, - interpolate : /<%=([\s\S]+?)%>/g, - escape : /<%-([\s\S]+?)%>/g + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g }; // When customizing `templateSettings`, if you don't want to define an @@ -1149,26 +1527,30 @@ // Certain characters need to be escaped so that they can be put into a // string literal. var escapes = { - "'": "'", - '\\': '\\', - '\r': 'r', - '\n': 'n', - '\t': 't', + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', '\u2028': 'u2028', '\u2029': 'u2029' }; - var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g; + var escapeRegExp = /\\|'|\r|\n|\u2028|\u2029/g; + + var escapeChar = function(match) { + return '\\' + escapes[match]; + }; // JavaScript micro-templating, similar to John Resig's implementation. // Underscore templating handles arbitrary delimiters, preserves whitespace, // and correctly escapes quotes within interpolated code. - _.template = function(text, data, settings) { - var render; + // NB: `oldSettings` only exists for backwards compatibility. + _.template = function(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; settings = _.defaults({}, settings, _.templateSettings); // Combine delimiters into one regular expression via alternation. - var matcher = new RegExp([ + var matcher = RegExp([ (settings.escape || noMatch).source, (settings.interpolate || noMatch).source, (settings.evaluate || noMatch).source @@ -1178,19 +1560,18 @@ var index = 0; var source = "__p+='"; text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { - source += text.slice(index, offset) - .replace(escaper, function(match) { return '\\' + escapes[match]; }); + source += text.slice(index, offset).replace(escapeRegExp, escapeChar); + index = offset + match.length; if (escape) { source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; - } - if (interpolate) { + } else if (interpolate) { source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; - } - if (evaluate) { + } else if (evaluate) { source += "';\n" + evaluate + "\n__p+='"; } - index = offset + match.length; + + // Adobe VMs need the match returned to produce the correct offset. return match; }); source += "';\n"; @@ -1200,8 +1581,9 @@ source = "var __t,__p='',__j=Array.prototype.join," + "print=function(){__p+=__j.call(arguments,'');};\n" + - source + "return __p;\n"; + source + 'return __p;\n'; + var render; try { render = new Function(settings.variable || 'obj', '_', source); } catch (e) { @@ -1209,20 +1591,22 @@ throw e; } - if (data) return render(data, _); var template = function(data) { return render.call(this, data, _); }; - // Provide the compiled function source as a convenience for precompilation. - template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}'; + // Provide the compiled source as a convenience for precompilation. + var argument = settings.variable || 'obj'; + template.source = 'function(' + argument + '){\n' + source + '}'; return template; }; - // Add a "chain" function, which will delegate to the wrapper. + // Add a "chain" function. Start chaining a wrapped Underscore object. _.chain = function(obj) { - return _(obj).chain(); + var instance = _(obj); + instance._chain = true; + return instance; }; // OOP @@ -1232,45 +1616,68 @@ // underscore functions. Wrapped objects may be chained. // Helper function to continue chaining intermediate results. - var result = function(obj) { - return this._chain ? _(obj).chain() : obj; + var chainResult = function(instance, obj) { + return instance._chain ? _(obj).chain() : obj; + }; + + // Add your own custom functions to the Underscore object. + _.mixin = function(obj) { + _.each(_.functions(obj), function(name) { + var func = _[name] = obj[name]; + _.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return chainResult(this, func.apply(_, args)); + }; + }); + return _; }; // Add all of the Underscore functions to the wrapper object. _.mixin(_); // Add all mutator Array functions to the wrapper. - each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { var method = ArrayProto[name]; _.prototype[name] = function() { var obj = this._wrapped; method.apply(obj, arguments); - if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0]; - return result.call(this, obj); + if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0]; + return chainResult(this, obj); }; }); // Add all accessor Array functions to the wrapper. - each(['concat', 'join', 'slice'], function(name) { + _.each(['concat', 'join', 'slice'], function(name) { var method = ArrayProto[name]; _.prototype[name] = function() { - return result.call(this, method.apply(this._wrapped, arguments)); + return chainResult(this, method.apply(this._wrapped, arguments)); }; }); - _.extend(_.prototype, { + // Extracts the result from a wrapped and chained object. + _.prototype.value = function() { + return this._wrapped; + }; - // Start chaining a wrapped Underscore object. - chain: function() { - this._chain = true; - return this; - }, + // Provide unwrapping proxy for some methods used in engine operations + // such as arithmetic and JSON stringification. + _.prototype.valueOf = _.prototype.toJSON = _.prototype.value; - // Extracts the result from a wrapped and chained object. - value: function() { - return this._wrapped; - } + _.prototype.toString = function() { + return String(this._wrapped); + }; - }); - -}).call(this); + // AMD registration happens at the end for compatibility with AMD loaders + // that may not enforce next-turn semantics on modules. Even though general + // practice for AMD registration is to be anonymous, underscore registers + // as a named module because, like jQuery, it is a base library that is + // popular enough to be bundled in a third party lib, but not be part of + // an AMD load request. Those cases could generate an error when an + // anonymous define() is called outside of a loader request. + if (typeof define == 'function' && define.amd) { + define('underscore', [], function() { + return _; + }); + } +}());