Orderassets/css/chosen/chosen.min.css000064400000025212147600337620012702 0ustar00/* Chosen v1.3.0 | (c) 2011-2014 by Harvest | MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md */ .chosen-container{position:relative;display:inline-block;vertical-align:middle;font-size:13px;zoom:1;*display:inline;-webkit-user-select:none;-moz-user-select:none;user-select:none}.chosen-container *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.chosen-container .chosen-drop{position:absolute;top:100%;left:-9999px;z-index:1010;width:100%;border:1px solid #aaa;border-top:0;background:#fff;box-shadow:0 4px 5px rgba(0,0,0,.15)}.chosen-container.chosen-with-drop .chosen-drop{left:0}.chosen-container a{cursor:pointer}.chosen-container-single .chosen-single{position:relative;display:block;overflow:hidden;padding:0 0 0 8px;height:25px;border:1px solid #aaa;border-radius:5px;background-color:#fff;background:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#fff),color-stop(50%,#f6f6f6),color-stop(52%,#eee),color-stop(100%,#f4f4f4));background:-webkit-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:-moz-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:-o-linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background:linear-gradient(top,#fff 20%,#f6f6f6 50%,#eee 52%,#f4f4f4 100%);background-clip:padding-box;box-shadow:0 0 3px #fff inset,0 1px 1px rgba(0,0,0,.1);color:#444;text-decoration:none;white-space:nowrap;line-height:24px}.chosen-container-single .chosen-default{color:#999}.chosen-container-single .chosen-single span{display:block;overflow:hidden;margin-right:26px;text-overflow:ellipsis;white-space:nowrap}.chosen-container-single .chosen-single-with-deselect span{margin-right:38px}.chosen-container-single .chosen-single abbr{position:absolute;top:6px;right:26px;display:block;width:12px;height:12px;background:url(../../images/chosen/chosen-sprite.png) -42px 1px no-repeat;font-size:1px}.chosen-container-single .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single.chosen-disabled .chosen-single abbr:hover{background-position:-42px -10px}.chosen-container-single .chosen-single div{position:absolute;top:0;right:0;display:block;width:18px;height:100%}.chosen-container-single .chosen-single div b{display:block;width:100%;height:100%;background:url(../../images/chosen/chosen-sprite.png) no-repeat 0 2px}.chosen-container-single .chosen-search{position:relative;z-index:1010;margin:0;padding:3px 4px;white-space:nowrap}.chosen-container-single .chosen-search input[type=text]{margin:1px 0;padding:4px 20px 4px 5px;width:100%;height:auto;outline:0;border:1px solid #aaa;background:#fff url(../../images/chosen/chosen-sprite.png) no-repeat 100% -20px;background:url(../../images/chosen/chosen-sprite.png) no-repeat 100% -20px;font-size:1em;font-family:sans-serif;line-height:normal;border-radius:0}.chosen-container-single .chosen-drop{margin-top:-1px;border-radius:0 0 4px 4px;background-clip:padding-box}.chosen-container-single.chosen-container-single-nosearch .chosen-search{position:absolute;left:-9999px}.chosen-container .chosen-results{color:#444;position:relative;overflow-x:hidden;overflow-y:auto;margin:0 4px 4px 0;padding:0 0 0 4px;max-height:240px;-webkit-overflow-scrolling:touch}.chosen-container .chosen-results li{display:none;margin:0;padding:5px 6px;list-style:none;line-height:15px;word-wrap:break-word;-webkit-touch-callout:none}.chosen-container .chosen-results li.active-result{display:list-item;cursor:pointer}.chosen-container .chosen-results li.disabled-result{display:list-item;color:#ccc;cursor:default}.chosen-container .chosen-results li.highlighted{background-color:#3875d7;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#3875d7),color-stop(90%,#2a62bc));background-image:-webkit-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:-moz-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:-o-linear-gradient(#3875d7 20%,#2a62bc 90%);background-image:linear-gradient(#3875d7 20%,#2a62bc 90%);color:#fff}.chosen-container .chosen-results li.no-results{color:#777;display:list-item;background:#f4f4f4}.chosen-container .chosen-results li.group-result{display:list-item;font-weight:700;cursor:default}.chosen-container .chosen-results li.group-option{padding-left:15px}.chosen-container .chosen-results li em{font-style:normal;text-decoration:underline}.chosen-container-multi .chosen-choices{position:relative;overflow:hidden;margin:0;padding:0 5px;width:100%;height:auto!important;height:1%;border:1px solid #aaa;background-color:#fff;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(1%,#eee),color-stop(15%,#fff));background-image:-webkit-linear-gradient(#eee 1%,#fff 15%);background-image:-moz-linear-gradient(#eee 1%,#fff 15%);background-image:-o-linear-gradient(#eee 1%,#fff 15%);background-image:linear-gradient(#eee 1%,#fff 15%);cursor:text}.chosen-container-multi .chosen-choices li{float:left;list-style:none}.chosen-container-multi .chosen-choices li.search-field{margin:0;padding:0;white-space:nowrap}.chosen-container-multi .chosen-choices li.search-field input[type=text]{margin:1px 0;padding:0;height:25px;outline:0;border:0!important;background:transparent!important;box-shadow:none;color:#999;font-size:100%;font-family:sans-serif;line-height:normal;border-radius:0}.chosen-container-multi .chosen-choices li.search-choice{position:relative;margin:3px 5px 3px 0;padding:3px 20px 3px 5px;border:1px solid #aaa;max-width:100%;border-radius:3px;background-color:#eee;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),color-stop(100%,#eee));background-image:-webkit-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-moz-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-o-linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:linear-gradient(#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-size:100% 19px;background-repeat:repeat-x;background-clip:padding-box;box-shadow:0 0 2px #fff inset,0 1px 0 rgba(0,0,0,.05);color:#333;line-height:13px;cursor:default}.chosen-container-multi .chosen-choices li.search-choice span{word-wrap:break-word}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close{position:absolute;top:4px;right:3px;display:block;width:12px;height:12px;background:url(../../images/chosen/chosen-sprite.png) -42px 1px no-repeat;font-size:1px}.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover{background-position:-42px -10px}.chosen-container-multi .chosen-choices li.search-choice-disabled{padding-right:5px;border:1px solid #ccc;background-color:#e4e4e4;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#f4f4f4),color-stop(50%,#f0f0f0),color-stop(52%,#e8e8e8),color-stop(100%,#eee));background-image:-webkit-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-moz-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:-o-linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);background-image:linear-gradient(top,#f4f4f4 20%,#f0f0f0 50%,#e8e8e8 52%,#eee 100%);color:#666}.chosen-container-multi .chosen-choices li.search-choice-focus{background:#d4d4d4}.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close{background-position:-42px -10px}.chosen-container-multi .chosen-results{margin:0;padding:0}.chosen-container-multi .chosen-drop .result-selected{display:list-item;color:#ccc;cursor:default}.chosen-container-active .chosen-single{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active.chosen-with-drop .chosen-single{border:1px solid #aaa;-moz-border-radius-bottomright:0;border-bottom-right-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0;background-image:-webkit-gradient(linear,50% 0,50% 100%,color-stop(20%,#eee),color-stop(80%,#fff));background-image:-webkit-linear-gradient(#eee 20%,#fff 80%);background-image:-moz-linear-gradient(#eee 20%,#fff 80%);background-image:-o-linear-gradient(#eee 20%,#fff 80%);background-image:linear-gradient(#eee 20%,#fff 80%);box-shadow:0 1px 0 #fff inset}.chosen-container-active.chosen-with-drop .chosen-single div{border-left:0;background:transparent}.chosen-container-active.chosen-with-drop .chosen-single div b{background-position:-18px 2px}.chosen-container-active .chosen-choices{border:1px solid #5897fb;box-shadow:0 0 5px rgba(0,0,0,.3)}.chosen-container-active .chosen-choices li.search-field input[type=text]{color:#222!important}.chosen-disabled{opacity:.5!important;cursor:default}.chosen-disabled .chosen-single{cursor:default}.chosen-disabled .chosen-choices .search-choice .search-choice-close{cursor:default}.chosen-rtl{text-align:right}.chosen-rtl .chosen-single{overflow:visible;padding:0 8px 0 0}.chosen-rtl .chosen-single span{margin-right:0;margin-left:26px;direction:rtl}.chosen-rtl .chosen-single-with-deselect span{margin-left:38px}.chosen-rtl .chosen-single div{right:auto;left:3px}.chosen-rtl .chosen-single abbr{right:auto;left:26px}.chosen-rtl .chosen-choices li{float:right}.chosen-rtl .chosen-choices li.search-field input[type=text]{direction:rtl}.chosen-rtl .chosen-choices li.search-choice{margin:3px 5px 3px 0;padding:3px 5px 3px 19px}.chosen-rtl .chosen-choices li.search-choice .search-choice-close{right:auto;left:4px}.chosen-rtl.chosen-container-single-nosearch .chosen-search,.chosen-rtl .chosen-drop{left:9999px}.chosen-rtl.chosen-container-single .chosen-results{margin:0 0 4px 4px;padding:0 4px 0 0}.chosen-rtl .chosen-results li.group-option{padding-right:15px;padding-left:0}.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div{border-right:0}.chosen-rtl .chosen-search input[type=text]{padding:4px 5px 4px 20px;background:#fff url(../../images/chosen/chosen-sprite.png) no-repeat -30px -20px;background:url(../../images/chosen/chosen-sprite.png) no-repeat -30px -20px;direction:rtl}.chosen-rtl.chosen-container-single .chosen-single div b{background-position:6px 2px}.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b{background-position:-12px 2px}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min-resolution:144dpi){.chosen-rtl .chosen-search input[type=text],.chosen-container-single .chosen-single abbr,.chosen-container-single .chosen-single div b,.chosen-container-single .chosen-search input[type=text],.chosen-container-multi .chosen-choices .search-choice .search-choice-close,.chosen-container .chosen-results-scroll-down span,.chosen-container .chosen-results-scroll-up span{background-image:url(../../images/chosen/chosen-sprite@2x.png)!important;background-size:52px 37px!important;background-repeat:no-repeat!important}}assets/css/handsontable/handsontable.min.css000064400000056011147600337620015251 0ustar00/*! * (The MIT License) * * Copyright (c) 2012-2014 Marcin Warpechowski * Copyright (c) 2015 Handsoncode sp. z o.o. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * 'Software'), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Version: 6.2.2 * Release date: 19/12/2018 (built at 18/12/2018 14:43:44) */.handsontable .table td,.handsontable .table th{border-top:none}.handsontable tr{background:#fff}.handsontable td{background-color:inherit}.handsontable .table caption+thead tr:first-child td,.handsontable .table caption+thead tr:first-child th,.handsontable .table colgroup+thead tr:first-child td,.handsontable .table colgroup+thead tr:first-child th,.handsontable .table thead:first-child tr:first-child td,.handsontable .table thead:first-child tr:first-child th{border-top:1px solid #ccc}.handsontable .table-bordered{border:0;border-collapse:separate}.handsontable .table-bordered td,.handsontable .table-bordered th{border-left:none}.handsontable .table-bordered td:first-child,.handsontable .table-bordered th:first-child{border-left:1px solid #ccc}.handsontable .table>tbody>tr>td,.handsontable .table>tbody>tr>th,.handsontable .table>tfoot>tr>td,.handsontable .table>tfoot>tr>th,.handsontable .table>thead>tr>td,.handsontable .table>thead>tr>th{line-height:21px;padding:0 4px}.col-lg-1.handsontable,.col-lg-2.handsontable,.col-lg-3.handsontable,.col-lg-4.handsontable,.col-lg-5.handsontable,.col-lg-6.handsontable,.col-lg-7.handsontable,.col-lg-8.handsontable,.col-lg-9.handsontable,.col-lg-10.handsontable,.col-lg-11.handsontable,.col-lg-12.handsontable,.col-md-1.handsontable,.col-md-2.handsontable,.col-md-3.handsontable,.col-md-4.handsontable,.col-md-5.handsontable,.col-md-6.handsontable,.col-md-7.handsontable,.col-md-8.handsontable,.col-md-9.handsontable .col-sm-1.handsontable,.col-md-10.handsontable,.col-md-11.handsontable,.col-md-12.handsontable,.col-sm-2.handsontable,.col-sm-3.handsontable,.col-sm-4.handsontable,.col-sm-5.handsontable,.col-sm-6.handsontable,.col-sm-7.handsontable,.col-sm-8.handsontable,.col-sm-9.handsontable .col-xs-1.handsontable,.col-sm-10.handsontable,.col-sm-11.handsontable,.col-sm-12.handsontable,.col-xs-2.handsontable,.col-xs-3.handsontable,.col-xs-4.handsontable,.col-xs-5.handsontable,.col-xs-6.handsontable,.col-xs-7.handsontable,.col-xs-8.handsontable,.col-xs-9.handsontable,.col-xs-10.handsontable,.col-xs-11.handsontable,.col-xs-12.handsontable{padding-left:0;padding-right:0}.handsontable .table-striped>tbody>tr:nth-of-type(2n){background-color:#fff}.handsontable{position:relative}.handsontable .hide{display:none}.handsontable .relative{position:relative}.handsontable.htAutoSize{visibility:hidden;left:-99000px;position:absolute;top:-99000px}.handsontable .wtHider{width:0}.handsontable .wtSpreader{position:relative;width:0;height:auto}.handsontable div,.handsontable input,.handsontable table,.handsontable tbody,.handsontable td,.handsontable textarea,.handsontable th,.handsontable thead{box-sizing:content-box;-webkit-box-sizing:content-box;-moz-box-sizing:content-box}.handsontable input,.handsontable textarea{min-height:0}.handsontable table.htCore{border-collapse:separate;border-spacing:0;margin:0;border-width:0;table-layout:fixed;width:0;outline-width:0;cursor:default;max-width:none;max-height:none}.handsontable col,.handsontable col.rowHeader{width:50px}.handsontable td,.handsontable th{border-top-width:0;border-left-width:0;border-right:1px solid #ccc;border-bottom:1px solid #ccc;height:22px;empty-cells:show;line-height:21px;padding:0 4px;background-color:#fff;vertical-align:top;overflow:hidden;outline-width:0;white-space:pre-line;background-clip:padding-box}.handsontable td.htInvalid{background-color:#ff4c42!important}.handsontable td.htNoWrap{white-space:nowrap}.handsontable th:last-child{border-right:1px solid #ccc;border-bottom:1px solid #ccc}.handsontable th.htNoFrame,.handsontable th:first-child.htNoFrame,.handsontable tr:first-child th.htNoFrame{border-left-width:0;background-color:#fff;border-color:#fff}.handsontable .htNoFrame+td,.handsontable .htNoFrame+th,.handsontable.htRowHeaders thead tr th:nth-child(2),.handsontable td:first-of-type,.handsontable th:first-child,.handsontable th:nth-child(2){border-left:1px solid #ccc}.handsontable tr:first-child td,.handsontable tr:first-child th{border-top:1px solid #ccc}.ht_master:not(.innerBorderLeft):not(.emptyColumns)~.handsontable:not(.ht_clone_top) thead tr th:first-child,.ht_master:not(.innerBorderLeft):not(.emptyColumns)~.handsontable tbody tr th{border-right-width:0}.ht_master:not(.innerBorderTop) thead tr.lastChild th,.ht_master:not(.innerBorderTop) thead tr:last-child th,.ht_master:not(.innerBorderTop)~.handsontable thead tr.lastChild th,.ht_master:not(.innerBorderTop)~.handsontable thead tr:last-child th{border-bottom-width:0}.handsontable th{background-color:#f0f0f0;color:#222;text-align:center;font-weight:400;white-space:nowrap}.handsontable thead th{padding:0}.handsontable th.active{background-color:#ccc}.handsontable thead th .relative{padding:2px 4px}#hot-display-license-info{font-size:10px;color:#323232;padding:5px 0 3px;font-family:Helvetica,Arial,sans-serif;text-align:left}.handsontable .manualColumnResizer{position:fixed;top:0;cursor:col-resize;z-index:110;width:5px;height:25px}.handsontable .manualRowResizer{position:fixed;left:0;cursor:row-resize;z-index:110;height:5px;width:50px}.handsontable .manualColumnResizer.active,.handsontable .manualColumnResizer:hover,.handsontable .manualRowResizer.active,.handsontable .manualRowResizer:hover{background-color:#34a9db}.handsontable .manualColumnResizerGuide{position:fixed;right:0;top:0;background-color:#34a9db;display:none;width:0;border-right:1px dashed #777;margin-left:5px}.handsontable .manualRowResizerGuide{position:fixed;left:0;bottom:0;background-color:#34a9db;display:none;height:0;border-bottom:1px dashed #777;margin-top:5px}.handsontable .manualColumnResizerGuide.active,.handsontable .manualRowResizerGuide.active{display:block;z-index:199}.handsontable .columnSorting{position:relative}.handsontable .columnSorting.sortAction:hover{text-decoration:underline;cursor:pointer}.handsontable span.colHeader{display:inline-block;line-height:1.1}.handsontable span.colHeader.columnSorting:before{top:50%;margin-top:-6px;padding-left:8px;position:absolute;right:-9px;content:"";height:10px;width:5px;background-size:contain;background-repeat:no-repeat;background-position-x:right}.handsontable span.colHeader.columnSorting.ascending:before{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAMAAADJ7yrpAAAAKlBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKE86IAAAADXRSTlMABBEmRGprlJW72e77tTkTKwAAAFNJREFUeAHtzjkSgCAUBNHPgsoy97+ulGXRqJE5L+xkxoYt2UdsLb5bqFINz+aLuuLn5rIu2RkO3fZpWENimNgiw6iBYRTPMLJjGFxQZ1hxxb/xBI1qC8k39CdKAAAAAElFTkSuQmCC")}.handsontable span.colHeader.columnSorting.descending:before{background-image:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAoCAMAAADJ7yrpAAAAKlBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKE86IAAAADXRSTlMABBEmRGprlJW72e77tTkTKwAAAFJJREFUeAHtzjkSgCAQRNFmQYUZ7n9dKUvru0TmvPAn3br0QfgdZ5xx6x+rQn23GqTYnq1FDcnuzZIO2WmedVqIRVxgGKEyjNgYRjKGkZ1hFIZ3I70LyM0VtU8AAAAASUVORK5CYII=")}.htGhostTable .htCore span.colHeader.columnSorting:not(.indicatorDisabled):after{content:"*";display:inline-block;position:relative;padding-right:20px}.handsontable .wtBorder{position:absolute;font-size:0}.handsontable .wtBorder.hidden{display:none!important}.handsontable .wtBorder.current{z-index:10}.handsontable .wtBorder.area{z-index:8}.handsontable .wtBorder.fill{z-index:6}.handsontable td.area,.handsontable td.area-1,.handsontable td.area-2,.handsontable td.area-3,.handsontable td.area-4,.handsontable td.area-5,.handsontable td.area-6,.handsontable td.area-7{position:relative}.handsontable td.area-1:before,.handsontable td.area-2:before,.handsontable td.area-3:before,.handsontable td.area-4:before,.handsontable td.area-5:before,.handsontable td.area-6:before,.handsontable td.area-7:before,.handsontable td.area:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0;bottom:-100%\9;background:#005eff}@media (-ms-high-contrast:none),screen and (-ms-high-contrast:active){.handsontable td.area-1:before,.handsontable td.area-2:before,.handsontable td.area-3:before,.handsontable td.area-4:before,.handsontable td.area-5:before,.handsontable td.area-6:before,.handsontable td.area-7:before,.handsontable td.area:before{bottom:-100%}}.handsontable td.area:before{opacity:.1}.handsontable td.area-1:before{opacity:.2}.handsontable td.area-2:before{opacity:.27}.handsontable td.area-3:before{opacity:.35}.handsontable td.area-4:before{opacity:.41}.handsontable td.area-5:before{opacity:.47}.handsontable td.area-6:before{opacity:.54}.handsontable td.area-7:before{opacity:.58}.handsontable tbody th.ht__highlight,.handsontable thead th.ht__highlight{background-color:#dcdcdc}.handsontable tbody th.ht__active_highlight,.handsontable thead th.ht__active_highlight{background-color:#8eb0e7;color:#000}.handsontable .wtBorder.corner{font-size:0;cursor:crosshair}.handsontable .htBorder.htFillBorder{background:red;width:1px;height:1px}.handsontableInput{border:none;outline-width:0;margin:0;padding:1px 5px 0;font-family:inherit;line-height:21px;font-size:inherit;box-shadow:inset 0 0 0 2px #5292f7;resize:none;display:block;color:#000;border-radius:0;background-color:#fff}.handsontableInputHolder{position:absolute;top:0;left:0;z-index:104}.htSelectEditor{-webkit-appearance:menulist-button!important;position:absolute;width:auto}.handsontable .htDimmed{color:#777}.handsontable .htSubmenu{position:relative}.handsontable .htSubmenu :after{content:"\25B6";color:#777;position:absolute;right:5px;font-size:9px}.handsontable .htLeft{text-align:left}.handsontable .htCenter{text-align:center}.handsontable .htRight{text-align:right}.handsontable .htJustify{text-align:justify}.handsontable .htTop{vertical-align:top}.handsontable .htMiddle{vertical-align:middle}.handsontable .htBottom{vertical-align:bottom}.handsontable .htPlaceholder{color:#999}.handsontable .htAutocompleteArrow{float:right;font-size:10px;color:#eee;cursor:default;width:16px;text-align:center}.handsontable td .htAutocompleteArrow:hover{color:#777}.handsontable td.area .htAutocompleteArrow{color:#d3d3d3}.handsontable .htCheckboxRendererInput{display:inline-block;vertical-align:middle}.handsontable .htCheckboxRendererInput.noValue{opacity:.5}.handsontable .htCheckboxRendererLabel{cursor:pointer;display:inline-block;width:100%}.handsontable .handsontable.ht_clone_top .wtHider{padding:0 0 5px}.handsontable .autocompleteEditor.handsontable{padding-right:17px}.handsontable .autocompleteEditor.handsontable.htMacScroll{padding-right:15px}.handsontable.listbox{margin:0}.handsontable.listbox .ht_master table{border:1px solid #ccc;border-collapse:separate;background:#fff}.handsontable.listbox td,.handsontable.listbox th,.handsontable.listbox tr:first-child td,.handsontable.listbox tr:first-child th,.handsontable.listbox tr:last-child th{border-color:transparent}.handsontable.listbox td,.handsontable.listbox th{white-space:nowrap;text-overflow:ellipsis}.handsontable.listbox td.htDimmed{cursor:default;color:inherit;font-style:inherit}.handsontable.listbox .wtBorder{visibility:hidden}.handsontable.listbox tr:hover td,.handsontable.listbox tr td.current{background:#eee}.ht_clone_top{z-index:101}.ht_clone_left{z-index:102}.ht_clone_bottom_left_corner,.ht_clone_debug,.ht_clone_top_left_corner{z-index:103}.handsontable td.htSearchResult{background:#fcedd9;color:#583707}.htBordered{border-width:1px}.htBordered.htTopBorderSolid{border-top-style:solid;border-top-color:#000}.htBordered.htRightBorderSolid{border-right-style:solid;border-right-color:#000}.htBordered.htBottomBorderSolid{border-bottom-style:solid;border-bottom-color:#000}.htBordered.htLeftBorderSolid{border-left-style:solid;border-left-color:#000}.handsontable tbody tr th:nth-last-child(2){border-right:1px solid #ccc}.handsontable thead tr:nth-last-child(2) th.htGroupIndicatorContainer{border-bottom:1px solid #ccc;padding-bottom:5px}.ht_clone_top_left_corner thead tr th:nth-last-child(2){border-right:1px solid #ccc}.htCollapseButton{width:10px;height:10px;line-height:10px;text-align:center;border-radius:5px;border:1px solid #f3f3f3;box-shadow:1px 1px 3px rgba(0,0,0,.4);cursor:pointer;margin-bottom:3px;position:relative}.htCollapseButton:after{content:"";height:300%;width:1px;display:block;background:#ccc;margin-left:4px;position:absolute;bottom:10px}thead .htCollapseButton{right:5px;position:absolute;top:5px;background:#fff}thead .htCollapseButton:after{height:1px;width:700%;right:10px;top:4px}.handsontable tr th .htExpandButton{position:absolute;width:10px;height:10px;line-height:10px;text-align:center;border-radius:5px;border:1px solid #f3f3f3;box-shadow:1px 1px 3px rgba(0,0,0,.4);cursor:pointer;top:0;display:none}.handsontable thead tr th .htExpandButton{top:5px}.handsontable tr th .htExpandButton.clickable{display:block}.collapsibleIndicator{position:absolute;top:50%;transform:translateY(-50%);right:5px;border:1px solid #a6a6a6;line-height:10px;color:#222;border-radius:10px;font-size:10px;width:10px;height:10px;cursor:pointer;box-shadow:0 0 0 6px #eee;background:#eee}.handsontable col.hidden{width:0!important}.handsontable table tr th.lightRightBorder{border-right:1px solid #e6e6e6}.handsontable tr.hidden,.handsontable tr.hidden td,.handsontable tr.hidden th{display:none}.ht_clone_bottom,.ht_clone_left,.ht_clone_top,.ht_master{overflow:hidden}.ht_master .wtHolder{overflow:auto}.handsontable .ht_clone_left thead,.handsontable .ht_master thead,.handsontable .ht_master tr th{visibility:hidden}.ht_clone_bottom .wtHolder,.ht_clone_left .wtHolder,.ht_clone_top .wtHolder{overflow:hidden}.handsontable.mobile,.handsontable.mobile .wtHolder{-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:rgba(0,0,0,0);-webkit-overflow-scrolling:touch}.htMobileEditorContainer{display:none;position:absolute;top:0;width:70%;height:54pt;background:#f8f8f8;border-radius:20px;border:1px solid #ebebeb;z-index:999;box-sizing:border-box;-webkit-box-sizing:border-box;-webkit-text-size-adjust:none}.topLeftSelectionHandle-HitArea:not(.ht_master .topLeftSelectionHandle-HitArea),.topLeftSelectionHandle:not(.ht_master .topLeftSelectionHandle){z-index:9999}.bottomRightSelectionHandle,.bottomRightSelectionHandle-HitArea,.topLeftSelectionHandle,.topLeftSelectionHandle-HitArea{left:-10000px;top:-10000px}.htMobileEditorContainer.active{display:block}.htMobileEditorContainer .inputs{position:absolute;right:210pt;bottom:10pt;top:10pt;left:14px;height:34pt}.htMobileEditorContainer .inputs textarea{font-size:13pt;border:1px solid #a1a1a1;-webkit-appearance:none;box-shadow:none;position:absolute;left:14px;right:14px;top:0;bottom:0;padding:7pt}.htMobileEditorContainer .cellPointer{position:absolute;top:-13pt;height:0;width:0;left:30px;border-left:13pt solid transparent;border-right:13pt solid transparent;border-bottom:13pt solid #ebebeb}.htMobileEditorContainer .cellPointer.hidden{display:none}.htMobileEditorContainer .cellPointer:before{content:"";display:block;position:absolute;top:2px;height:0;width:0;left:-13pt;border-left:13pt solid transparent;border-right:13pt solid transparent;border-bottom:13pt solid #f8f8f8}.htMobileEditorContainer .moveHandle{position:absolute;top:10pt;left:5px;width:30px;bottom:0;cursor:move;z-index:9999}.htMobileEditorContainer .moveHandle:after{content:"..\A..\A..\A..";white-space:pre;line-height:10px;font-size:20pt;display:inline-block;margin-top:-8px;color:#ebebeb}.htMobileEditorContainer .positionControls{width:205pt;position:absolute;right:5pt;top:0;bottom:0}.htMobileEditorContainer .positionControls>div{width:50pt;height:100%;float:left}.htMobileEditorContainer .positionControls>div:after{content:" ";display:block;width:15pt;height:15pt;text-align:center;line-height:50pt}.htMobileEditorContainer .downButton:after,.htMobileEditorContainer .leftButton:after,.htMobileEditorContainer .rightButton:after,.htMobileEditorContainer .upButton:after{transform-origin:5pt 5pt;-webkit-transform-origin:5pt 5pt;margin:21pt 0 0 21pt}.htMobileEditorContainer .leftButton:after{border-top:2px solid #288ffe;border-left:2px solid #288ffe;-webkit-transform:rotate(-45deg)}.htMobileEditorContainer .leftButton:active:after{border-color:#cfcfcf}.htMobileEditorContainer .rightButton:after{border-top:2px solid #288ffe;border-left:2px solid #288ffe;-webkit-transform:rotate(135deg)}.htMobileEditorContainer .rightButton:active:after{border-color:#cfcfcf}.htMobileEditorContainer .upButton:after{border-top:2px solid #288ffe;border-left:2px solid #288ffe;-webkit-transform:rotate(45deg)}.htMobileEditorContainer .upButton:active:after{border-color:#cfcfcf}.htMobileEditorContainer .downButton:after{border-top:2px solid #288ffe;border-left:2px solid #288ffe;-webkit-transform:rotate(225deg)}.htMobileEditorContainer .downButton:active:after{border-color:#cfcfcf}.handsontable.hide-tween{animation:opacity-hide .3s;animation-fill-mode:forwards;-webkit-animation-fill-mode:forwards}.handsontable.show-tween{animation:opacity-show .3s;animation-fill-mode:forwards;-webkit-animation-fill-mode:forwards}.htCommentCell{position:relative}.htCommentCell:after{content:"";position:absolute;top:0;right:0;border-left:6px solid transparent;border-top:6px solid #000}.htComments{display:none;z-index:1059;position:absolute}.htCommentTextArea{box-shadow:0 1px 3px rgba(0,0,0,.117647),0 1px 2px rgba(0,0,0,.239216);box-sizing:border-box;border:none;border-left:3px solid #ccc;background-color:#fff;width:215px;height:90px;font-size:12px;padding:5px;outline:0!important;-webkit-appearance:none}.htCommentTextArea:focus{box-shadow:0 1px 3px rgba(0,0,0,.117647),0 1px 2px rgba(0,0,0,.239216),inset 0 0 0 1px #5292f7;border-left:3px solid #5292f7} /*! * Handsontable ContextMenu */.htContextMenu:not(.htGhostTable){display:none;position:absolute;z-index:1060}.htContextMenu .ht_clone_corner,.htContextMenu .ht_clone_debug,.htContextMenu .ht_clone_left,.htContextMenu .ht_clone_top{display:none}.htContextMenu table.htCore{border:1px solid #ccc;border-bottom-width:2px;border-right-width:2px}.htContextMenu .wtBorder{visibility:hidden}.htContextMenu table tbody tr td{background:#fff;border-width:0;padding:4px 6px 0;cursor:pointer;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.htContextMenu table tbody tr td:first-child{border:0}.htContextMenu table tbody tr td.htDimmed{font-style:normal;color:#323232}.htContextMenu table tbody tr td.current,.htContextMenu table tbody tr td.zeroclipboard-is-hover{background:#f3f3f3}.htContextMenu table tbody tr td.htSeparator{border-top:1px solid #e6e6e6;height:0;padding:0;cursor:default}.htContextMenu table tbody tr td.htDisabled{color:#999;cursor:default}.htContextMenu table tbody tr td.htDisabled:hover{background:#fff;color:#999;cursor:default}.htContextMenu table tbody tr.htHidden{display:none}.htContextMenu table tbody tr td .htItemWrapper{margin-left:10px;margin-right:6px}.htContextMenu table tbody tr td div span.selected{margin-top:-2px;position:absolute;left:4px}.htContextMenu .ht_master .wtHolder{overflow:hidden}textarea#HandsontableCopyPaste{position:fixed!important;top:0!important;right:100%!important;overflow:hidden;opacity:0;outline:0 none!important}.htRowHeaders .ht_master.innerBorderLeft~.ht_clone_left td:first-of-type,.htRowHeaders .ht_master.innerBorderLeft~.ht_clone_top_left_corner th:nth-child(2){border-left:0 none}.handsontable.ht__manualColumnMove.after-selection--columns thead th.ht__highlight{cursor:move;cursor:grab}.handsontable.ht__manualColumnMove.on-moving--columns,.handsontable.ht__manualColumnMove.on-moving--columns thead th.ht__highlight{cursor:move;cursor:grabbing}.handsontable.ht__manualColumnMove.on-moving--columns .manualColumnResizer{display:none}.handsontable .ht__manualColumnMove--backlight,.handsontable .ht__manualColumnMove--guideline{position:absolute;height:100%;display:none}.handsontable .ht__manualColumnMove--guideline{background:#757575;width:2px;top:0;margin-left:-1px;z-index:105}.handsontable .ht__manualColumnMove--backlight{background:#343434;background:rgba(52,52,52,.25);display:none;z-index:105;pointer-events:none}.handsontable.on-moving--columns .ht__manualColumnMove--backlight,.handsontable.on-moving--columns.show-ui .ht__manualColumnMove--guideline{display:block}.handsontable .wtHider{position:relative}.handsontable.ht__manualRowMove.after-selection--rows tbody th.ht__highlight{cursor:move;cursor:grab}.handsontable.ht__manualRowMove.on-moving--rows,.handsontable.ht__manualRowMove.on-moving--rows tbody th.ht__highlight{cursor:move;cursor:grabbing}.handsontable.ht__manualRowMove.on-moving--rows .manualRowResizer{display:none}.handsontable .ht__manualRowMove--backlight,.handsontable .ht__manualRowMove--guideline{position:absolute;width:100%;display:none}.handsontable .ht__manualRowMove--guideline{background:#757575;height:2px;left:0;margin-top:-1px;z-index:105}.handsontable .ht__manualRowMove--backlight{background:#343434;background:rgba(52,52,52,.25);display:none;z-index:105;pointer-events:none}.handsontable.on-moving--rows .ht__manualRowMove--backlight,.handsontable.on-moving--rows.show-ui .ht__manualRowMove--guideline{display:block}.handsontable tbody td[rowspan][class*=area][class*=highlight]:not([class*=fullySelectedMergedCell]):before{opacity:0}.handsontable tbody td[rowspan][class*=area][class*=highlight][class*=fullySelectedMergedCell-0]:before,.handsontable tbody td[rowspan][class*=area][class*=highlight][class*=fullySelectedMergedCell-multiple]:before{opacity:.1}.handsontable tbody td[rowspan][class*=area][class*=highlight][class*=fullySelectedMergedCell-1]:before{opacity:.2}.handsontable tbody td[rowspan][class*=area][class*=highlight][class*=fullySelectedMergedCell-2]:before{opacity:.27}.handsontable tbody td[rowspan][class*=area][class*=highlight][class*=fullySelectedMergedCell-3]:before{opacity:.35}.handsontable tbody td[rowspan][class*=area][class*=highlight][class*=fullySelectedMergedCell-4]:before{opacity:.41}.handsontable tbody td[rowspan][class*=area][class*=highlight][class*=fullySelectedMergedCell-5]:before{opacity:.47}.handsontable tbody td[rowspan][class*=area][class*=highlight][class*=fullySelectedMergedCell-6]:before{opacity:.54}.handsontable tbody td[rowspan][class*=area][class*=highlight][class*=fullySelectedMergedCell-7]:before{opacity:.58}assets/css/jsoneditor/img/jsoneditor-icons.svg000064400000074443147600337620015630 0ustar00 JSON Editor Icons image/svg+xml JSON Editor Icons assets/css/jsoneditor/jsoneditor.min.css000064400000102222147600337620014501 0ustar00div.jsoneditor .jsoneditor-search input{height:auto;border:inherit}div.jsoneditor .jsoneditor-search input:focus{border:none!important;box-shadow:none!important}div.jsoneditor table{border-collapse:collapse;width:auto}div.jsoneditor td,div.jsoneditor th{padding:0;display:table-cell;text-align:left;vertical-align:inherit;border-radius:inherit}div.jsoneditor-default,div.jsoneditor-field,div.jsoneditor-readonly,div.jsoneditor-value{border:1px solid transparent;min-height:16px;min-width:32px;padding:2px;margin:1px;word-wrap:break-word;float:left}div.jsoneditor-field p,div.jsoneditor-value p{margin:0}div.jsoneditor-value{word-break:break-word}div.jsoneditor-readonly{min-width:16px;color:grey}div.jsoneditor-empty{border-color:#d3d3d3;border-style:dashed;border-radius:2px}div.jsoneditor-field.jsoneditor-empty::after,div.jsoneditor-value.jsoneditor-empty::after{pointer-events:none;color:#d3d3d3;font-size:8pt}div.jsoneditor-field.jsoneditor-empty::after{content:"field"}div.jsoneditor-value.jsoneditor-empty::after{content:"value"}a.jsoneditor-value.jsoneditor-url,div.jsoneditor-value.jsoneditor-url{color:green;text-decoration:underline}a.jsoneditor-value.jsoneditor-url{display:inline-block;padding:2px;margin:2px}a.jsoneditor-value.jsoneditor-url:focus,a.jsoneditor-value.jsoneditor-url:hover{color:#ee422e}div.jsoneditor td.jsoneditor-separator{padding:3px 0;vertical-align:top;color:grey}div.jsoneditor-field.jsoneditor-highlight,div.jsoneditor-field[contenteditable=true]:focus,div.jsoneditor-field[contenteditable=true]:hover,div.jsoneditor-value.jsoneditor-highlight,div.jsoneditor-value[contenteditable=true]:focus,div.jsoneditor-value[contenteditable=true]:hover{background-color:#ffffab;border:1px solid #ff0;border-radius:2px}div.jsoneditor-field.jsoneditor-highlight-active,div.jsoneditor-field.jsoneditor-highlight-active:focus,div.jsoneditor-field.jsoneditor-highlight-active:hover,div.jsoneditor-value.jsoneditor-highlight-active,div.jsoneditor-value.jsoneditor-highlight-active:focus,div.jsoneditor-value.jsoneditor-highlight-active:hover{background-color:#fe0;border:1px solid #ffc700;border-radius:2px}div.jsoneditor-value.jsoneditor-string{color:#006000}div.jsoneditor-value.jsoneditor-array,div.jsoneditor-value.jsoneditor-object{min-width:16px}div.jsoneditor-value.jsoneditor-number{color:#ee422e}div.jsoneditor-value.jsoneditor-boolean{color:#ff8c00}div.jsoneditor-value.jsoneditor-null{color:#004ed0}div.jsoneditor-value.jsoneditor-invalid{color:#000}div.jsoneditor-default{color:grey;padding-left:10px}div.jsoneditor-tree button.jsoneditor-button{width:24px;height:24px;padding:0;margin:0;border:none;cursor:pointer;background:transparent url(img/jsoneditor-icons.svg)}div.jsoneditor-mode-form tr.jsoneditor-expandable td.jsoneditor-tree,div.jsoneditor-mode-view tr.jsoneditor-expandable td.jsoneditor-tree{cursor:pointer}div.jsoneditor-tree button.jsoneditor-collapsed{background-position:0 -48px}div.jsoneditor-tree button.jsoneditor-expanded{background-position:0 -72px}div.jsoneditor-tree button.jsoneditor-contextmenu{background-position:-48px -72px}div.jsoneditor-tree button.jsoneditor-contextmenu.jsoneditor-selected,div.jsoneditor-tree button.jsoneditor-contextmenu:focus,div.jsoneditor-tree button.jsoneditor-contextmenu:hover,tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-contextmenu{background-position:-48px -48px}div.jsoneditor-tree :focus{outline:0}div.jsoneditor-tree button.jsoneditor-button:focus{background-color:#f5f5f5;outline:#e5e5e5 solid 1px}div.jsoneditor-tree button.jsoneditor-invisible{visibility:hidden;background:0 0}div.jsoneditor-tree div.jsoneditor-show-more{display:inline-block;padding:3px 4px;margin:2px 0;background-color:#e5e5e5;border-radius:3px;color:grey;font-family:arial,sans-serif;font-size:10pt}div.jsoneditor-tree div.jsoneditor-show-more a{display:inline-block;color:grey}div.jsoneditor-tree div.jsoneditor-show-more a:focus,div.jsoneditor-tree div.jsoneditor-show-more a:hover{color:#ee422e}div.jsoneditor-tree div.jsoneditor-color{display:inline-block;width:12px;height:12px;margin:4px;border:1px solid grey;cursor:pointer}div.jsoneditor div.jsoneditor-anchor .picker_wrapper.popup.popup_bottom{top:28px;left:-10px}div.jsoneditor-tree div.jsoneditor-date{background:#a1a1a1;color:#fff;font-family:arial,sans-serif;border-radius:3px;display:inline-block;padding:3px;margin:0 3px}div.jsoneditor{color:#1a1a1a;border:thin solid #3883fa;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;width:100%;height:100%;position:relative;padding:0;line-height:100%}div.jsoneditor-tree table.jsoneditor-tree{border-collapse:collapse;border-spacing:0;width:100%}div.jsoneditor-outer{position:static;width:100%;height:100%;margin:0;padding:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}div.jsoneditor-outer.has-nav-bar{margin-top:-26px;padding-top:26px}div.jsoneditor-outer.has-status-bar{margin-bottom:-26px;padding-bottom:26px}div.jsoneditor-outer.has-main-menu-bar{margin-top:-35px;padding-top:35px}div.jsoneditor-outer.has-nav-bar.has-main-menu-bar{margin-top:-61px;padding-top:61px}.ace-jsoneditor,textarea.jsoneditor-text{min-height:150px}div.jsoneditor-tree{width:100%;height:100%;position:relative;overflow:auto}textarea.jsoneditor-text{width:100%;height:100%;margin:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;outline-width:0;border:none;background-color:#fff;resize:none}tr.jsoneditor-highlight,tr.jsoneditor-selected{background-color:#d3d3d3}tr.jsoneditor-selected button.jsoneditor-contextmenu,tr.jsoneditor-selected button.jsoneditor-dragarea{visibility:hidden}tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-contextmenu,tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-dragarea{visibility:visible}div.jsoneditor-tree button.jsoneditor-dragarea{background:url(img/jsoneditor-icons.svg) -72px -72px;cursor:move}div.jsoneditor-tree button.jsoneditor-dragarea:focus,div.jsoneditor-tree button.jsoneditor-dragarea:hover,tr.jsoneditor-selected.jsoneditor-first button.jsoneditor-dragarea{background-position:-72px -48px}div.jsoneditor td,div.jsoneditor th,div.jsoneditor tr{padding:0;margin:0}div.jsoneditor td{vertical-align:top}div.jsoneditor td.jsoneditor-tree{vertical-align:top}.jsoneditor-schema-error,div.jsoneditor td,div.jsoneditor textarea,div.jsoneditor th,div.jsoneditor-field,div.jsoneditor-value{font-family:"dejavu sans mono","droid sans mono",consolas,monaco,"lucida console","courier new",courier,monospace,sans-serif;font-size:10pt;color:#1a1a1a}.jsoneditor-schema-error{cursor:default;display:inline-block;height:24px;line-height:24px;position:relative;text-align:center;width:24px}div.jsoneditor-tree .jsoneditor-button.jsoneditor-schema-error{width:24px;height:24px;padding:0;margin:0 4px 0 0;background:url(img/jsoneditor-icons.svg) -168px -48px}.jsoneditor-text-errors tr.jump-to-line:hover{text-decoration:underline;cursor:pointer}.jsoneditor-schema-error .jsoneditor-popover{background-color:#4c4c4c;border-radius:3px;box-shadow:0 0 5px rgba(0,0,0,.4);color:#fff;display:none;padding:7px 10px;position:absolute;width:200px;z-index:4}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-above{bottom:32px;left:-98px}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-below{top:32px;left:-98px}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-left{top:-7px;right:32px}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-right{top:-7px;left:32px}.jsoneditor-schema-error .jsoneditor-popover:before{border-right:7px solid transparent;border-left:7px solid transparent;content:'';display:block;left:50%;margin-left:-7px;position:absolute}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-above:before{border-top:7px solid #4c4c4c;bottom:-7px}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-below:before{border-bottom:7px solid #4c4c4c;top:-7px}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-left:before{border-left:7px solid #4c4c4c;border-top:7px solid transparent;border-bottom:7px solid transparent;content:'';top:19px;right:-14px;left:inherit;margin-left:inherit;margin-top:-7px;position:absolute}.jsoneditor-schema-error .jsoneditor-popover.jsoneditor-right:before{border-right:7px solid #4c4c4c;border-top:7px solid transparent;border-bottom:7px solid transparent;content:'';top:19px;left:-14px;margin-left:inherit;margin-top:-7px;position:absolute}.jsoneditor-schema-error:focus .jsoneditor-popover,.jsoneditor-schema-error:hover .jsoneditor-popover{display:block;-webkit-animation:fade-in .3s linear 1,move-up .3s linear 1;-moz-animation:fade-in .3s linear 1,move-up .3s linear 1;-ms-animation:fade-in .3s linear 1,move-up .3s linear 1}@-webkit-keyframes fade-in{from{opacity:0}to{opacity:1}}@-moz-keyframes fade-in{from{opacity:0}to{opacity:1}}@-ms-keyframes fade-in{from{opacity:0}to{opacity:1}}.jsoneditor .jsoneditor-validation-errors-container{max-height:130px;overflow-y:auto}.jsoneditor .jsoneditor-additional-errors{position:absolute;margin:auto;bottom:31px;left:calc(50% - 92px);color:grey;background-color:#ebebeb;padding:7px 15px;border-radius:8px}.jsoneditor .jsoneditor-additional-errors.visible{visibility:visible;opacity:1;transition:opacity 2s linear}.jsoneditor .jsoneditor-additional-errors.hidden{visibility:hidden;opacity:0;transition:visibility 0s 2s,opacity 2s linear}.jsoneditor .jsoneditor-text-errors{width:100%;border-collapse:collapse;border-top:1px solid gold}.jsoneditor .jsoneditor-text-errors td{padding:3px 6px;vertical-align:middle}.jsoneditor .jsoneditor-text-errors tr{background-color:#ffef8b}.jsoneditor .jsoneditor-text-errors tr.parse-error{background-color:#ee2e2e70}.jsoneditor-text-errors .jsoneditor-schema-error{border:none;width:24px;height:24px;padding:0;margin:0 4px 0 0;cursor:pointer}.jsoneditor-text-errors tr .jsoneditor-schema-error{background:url(img/jsoneditor-icons.svg) -168px -48px}.jsoneditor-text-errors tr.parse-error .jsoneditor-schema-error{background:url(img/jsoneditor-icons.svg) -25px 0}.fadein{-webkit-animation:fadein .3s;animation:fadein .3s;-moz-animation:fadein .3s;-o-animation:fadein .3s}@-webkit-keyframes fadein{0%{opacity:0}100%{opacity:1}}@-moz-keyframes fadein{0%{opacity:0}100%{opacity:1}}@keyframes fadein{0%{opacity:0}100%{opacity:1}}@-o-keyframes fadein{0%{opacity:0}100%{opacity:1}}div.jsoneditor-contextmenu-root{position:relative;width:0;height:0}div.jsoneditor-contextmenu{position:absolute;box-sizing:content-box;z-index:99999}div.jsoneditor-contextmenu li,div.jsoneditor-contextmenu ul{box-sizing:content-box;position:relative}div.jsoneditor-contextmenu ul{position:relative;left:0;top:0;width:128px;background:#fff;border:1px solid #d3d3d3;box-shadow:2px 2px 12px rgba(128,128,128,.3);list-style:none;margin:0;padding:0}div.jsoneditor-contextmenu ul li button{position:relative;padding:0 4px 0 0;margin:0;width:128px;height:auto;border:none;cursor:pointer;color:#4d4d4d;background:0 0;font-size:10pt;font-family:arial,sans-serif;box-sizing:border-box;text-align:left}div.jsoneditor-contextmenu ul li button::-moz-focus-inner{padding:0;border:0}div.jsoneditor-contextmenu ul li button:focus,div.jsoneditor-contextmenu ul li button:hover{color:#1a1a1a;background-color:#f5f5f5;outline:0}div.jsoneditor-contextmenu ul li button.jsoneditor-default{width:96px}div.jsoneditor-contextmenu ul li button.jsoneditor-expand{float:right;width:32px;height:24px;border-left:1px solid #e5e5e5}div.jsoneditor-contextmenu div.jsoneditor-icon{position:absolute;top:0;left:0;width:24px;height:24px;border:none;padding:0;margin:0;background-image:url(img/jsoneditor-icons.svg)}div.jsoneditor-contextmenu ul li ul div.jsoneditor-icon{margin-left:24px}div.jsoneditor-contextmenu div.jsoneditor-text{padding:4px 0 4px 24px;word-wrap:break-word}div.jsoneditor-contextmenu div.jsoneditor-text.jsoneditor-right-margin{padding-right:24px}div.jsoneditor-contextmenu ul li button div.jsoneditor-expand{position:absolute;top:0;right:0;width:24px;height:24px;padding:0;margin:0 4px 0 0;background:url(img/jsoneditor-icons.svg) 0 -72px}div.jsoneditor-contextmenu div.jsoneditor-separator{height:0;border-top:1px solid #e5e5e5;padding-top:5px;margin-top:5px}div.jsoneditor-contextmenu button.jsoneditor-remove>div.jsoneditor-icon{background-position:-24px 0}div.jsoneditor-contextmenu button.jsoneditor-append>div.jsoneditor-icon{background-position:0 0}div.jsoneditor-contextmenu button.jsoneditor-insert>div.jsoneditor-icon{background-position:0 0}div.jsoneditor-contextmenu button.jsoneditor-duplicate>div.jsoneditor-icon{background-position:-48px 0}div.jsoneditor-contextmenu button.jsoneditor-sort-asc>div.jsoneditor-icon{background-position:-168px 0}div.jsoneditor-contextmenu button.jsoneditor-sort-desc>div.jsoneditor-icon{background-position:-192px 0}div.jsoneditor-contextmenu button.jsoneditor-transform>div.jsoneditor-icon{background-position:-216px 0}div.jsoneditor-contextmenu ul li button.jsoneditor-selected,div.jsoneditor-contextmenu ul li button.jsoneditor-selected:focus,div.jsoneditor-contextmenu ul li button.jsoneditor-selected:hover{color:#fff;background-color:#ee422e}div.jsoneditor-contextmenu ul li{overflow:hidden}div.jsoneditor-contextmenu ul li ul{display:none;position:relative;left:-10px;top:0;border:none;box-shadow:inset 0 0 10px rgba(128,128,128,.5);padding:0 10px;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}div.jsoneditor-contextmenu ul li ul li button{padding-left:24px;animation:all ease-in-out 1s}div.jsoneditor-contextmenu ul li ul li button:focus,div.jsoneditor-contextmenu ul li ul li button:hover{background-color:#f5f5f5}div.jsoneditor-contextmenu button.jsoneditor-type-string>div.jsoneditor-icon{background-position:-144px 0}div.jsoneditor-contextmenu button.jsoneditor-type-auto>div.jsoneditor-icon{background-position:-120px 0}div.jsoneditor-contextmenu button.jsoneditor-type-object>div.jsoneditor-icon{background-position:-72px 0}div.jsoneditor-contextmenu button.jsoneditor-type-array>div.jsoneditor-icon{background-position:-96px 0}div.jsoneditor-contextmenu button.jsoneditor-type-modes>div.jsoneditor-icon{background-image:none;width:6px}.jsoneditor-modal-overlay{position:absolute!important;background:#010101!important;opacity:.3!important}.jsoneditor-modal{position:absolute!important;max-width:95%!important;width:auto!important;border-radius:2px!important;padding:45px 15px 15px 15px!important;box-shadow:2px 2px 12px rgba(128,128,128,.3)!important;color:#4d4d4d;line-height:1.3em}.jsoneditor-modal.jsoneditor-modal-transform{width:600px!important}.jsoneditor-modal .pico-modal-header{position:absolute;box-sizing:border-box;top:0;left:0;width:100%;padding:0 10px;height:30px;line-height:30px;font-family:arial,sans-serif;font-size:11pt;background:#3883fa;color:#fff}.jsoneditor-modal table{width:100%}.jsoneditor-modal table td,.jsoneditor-modal table th{text-align:left;vertical-align:top;font-weight:400;color:#4d4d4d;border-spacing:0;border-collapse:collapse}.jsoneditor-modal table td{padding:3px 0}.jsoneditor-modal p:first-child{margin-top:0}.jsoneditor-modal a{color:#3883fa}.jsoneditor-modal .jsoneditor-jmespath-block{margin-bottom:10px}.jsoneditor-modal table td.jsoneditor-modal-input{text-align:right;padding-right:0;white-space:nowrap}.jsoneditor-modal table td.jsoneditor-modal-actions{padding-top:15px}.jsoneditor-modal .pico-close{background:0 0!important;font-size:24px!important;top:7px!important;right:7px!important;color:#fff}.jsoneditor-modal #query,.jsoneditor-modal input,.jsoneditor-modal select,.jsoneditor-modal textarea{background:#fff;border:1px solid #d3d3d3;color:#4d4d4d;border-radius:3px;padding:4px}.jsoneditor-modal,.jsoneditor-modal #query,.jsoneditor-modal input,.jsoneditor-modal option,.jsoneditor-modal select,.jsoneditor-modal table td,.jsoneditor-modal table th,.jsoneditor-modal textarea{font-size:10.5pt;font-family:arial,sans-serif}.jsoneditor-modal table th{vertical-align:middle}.jsoneditor-modal #query,.jsoneditor-modal .jsoneditor-transform-preview{font-family:"dejavu sans mono","droid sans mono",consolas,monaco,"lucida console","courier new",courier,monospace,sans-serif;font-size:10pt}.jsoneditor-modal input[type=button],.jsoneditor-modal input[type=submit]{background:#f5f5f5;padding:4px 20px}.jsoneditor-modal input,.jsoneditor-modal select{cursor:pointer}.jsoneditor-modal input{padding:4px}.jsoneditor-modal input[type=text]{cursor:inherit}.jsoneditor-modal input[disabled]{background:#d3d3d3;color:grey}.jsoneditor-modal .jsoneditor-select-wrapper{position:relative;display:inline-block}.jsoneditor-modal .jsoneditor-select-wrapper:after{content:"";width:0;height:0;border-left:5px solid transparent;border-right:5px solid transparent;border-top:6px solid #666;position:absolute;right:8px;top:14px;pointer-events:none}.jsoneditor-modal select{padding:3px 24px 3px 10px;min-width:180px;max-width:350px;-webkit-appearance:none;-moz-appearance:none;appearance:none;text-indent:0;text-overflow:"";font-size:10pt;line-height:1.5em}.jsoneditor-modal select::-ms-expand{display:none}.jsoneditor-modal .jsoneditor-button-group input{padding:4px 10px;margin:0;border-radius:0;border-left-style:none}.jsoneditor-modal .jsoneditor-button-group input.jsoneditor-button-first{border-top-left-radius:3px;border-bottom-left-radius:3px;border-left-style:solid}.jsoneditor-modal .jsoneditor-button-group input.jsoneditor-button-last{border-top-right-radius:3px;border-bottom-right-radius:3px}.jsoneditor-modal .jsoneditor-button-group.jsoneditor-button-group-value-asc input.jsoneditor-button-asc,.jsoneditor-modal .jsoneditor-button-group.jsoneditor-button-group-value-desc input.jsoneditor-button-desc{background:#3883fa;border-color:#3883fa;color:#fff}.jsoneditor-modal #query,.jsoneditor-modal .jsoneditor-transform-preview{width:100%;box-sizing:border-box}.jsoneditor-modal .jsoneditor-transform-preview{background:#f5f5f5;height:200px}.jsoneditor-modal .jsoneditor-transform-preview.jsoneditor-error{color:#ee422e}.jsoneditor-modal .jsoneditor-jmespath-wizard{line-height:1.2em;width:100%;padding:0;border-radius:3px}.jsoneditor-modal .jsoneditor-jmespath-label{font-weight:700;color:#1e90ff;margin-top:20px;margin-bottom:5px}.jsoneditor-modal .jsoneditor-jmespath-wizard-table{width:100%}.jsoneditor-modal .jsoneditor-jmespath-wizard-label{font-style:italic;margin:4px 0 2px 0}.jsoneditor-modal .jsoneditor-inline{position:relative;display:inline-block;width:100%;padding-top:2px;padding-bottom:2px}.jsoneditor-modal .jsoneditor-inline:not(:last-child){padding-right:2px}.jsoneditor-modal .jsoneditor-jmespath-filter{display:flex;flex-wrap:wrap}.jsoneditor-modal .jsoneditor-jmespath-filter-field{width:180px}.jsoneditor-modal .jsoneditor-jmespath-filter-relation{width:100px}.jsoneditor-modal .jsoneditor-jmespath-filter-value{min-width:180px;flex:1}.jsoneditor-modal .jsoneditor-jmespath-sort-field{width:170px}.jsoneditor-modal .jsoneditor-jmespath-sort-order{width:150px}.jsoneditor-modal .jsoneditor-jmespath-select-fields{width:100%}.jsoneditor-modal .selectr-selected{border-color:#d3d3d3;padding:4px 28px 4px 8px}.jsoneditor-modal .selectr-selected .selectr-tag{background-color:#3883fa;border-radius:5px}div.jsoneditor-menu{width:100%;height:35px;padding:2px;margin:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;color:#fff;background-color:#3883fa;border-bottom:1px solid #3883fa}div.jsoneditor-menu>button,div.jsoneditor-menu>div.jsoneditor-modes>button{width:26px;height:26px;margin:2px;padding:0;border-radius:2px;border:1px solid transparent;background:transparent url(img/jsoneditor-icons.svg);color:#fff;opacity:.8;font-family:arial,sans-serif;font-size:10pt;float:left}div.jsoneditor-menu>button:hover,div.jsoneditor-menu>div.jsoneditor-modes>button:hover{background-color:rgba(255,255,255,.2);border:1px solid rgba(255,255,255,.4)}div.jsoneditor-menu>button:active,div.jsoneditor-menu>button:focus,div.jsoneditor-menu>div.jsoneditor-modes>button:active,div.jsoneditor-menu>div.jsoneditor-modes>button:focus{background-color:rgba(255,255,255,.3)}div.jsoneditor-menu>button:disabled,div.jsoneditor-menu>div.jsoneditor-modes>button:disabled{opacity:.5}div.jsoneditor-menu>button.jsoneditor-collapse-all{background-position:0 -96px}div.jsoneditor-menu>button.jsoneditor-expand-all{background-position:0 -120px}div.jsoneditor-menu>button.jsoneditor-sort{background-position:-120px -96px}div.jsoneditor-menu>button.jsoneditor-transform{background-position:-144px -96px}div.jsoneditor.jsoneditor-mode-form>div.jsoneditor-menu>button.jsoneditor-sort,div.jsoneditor.jsoneditor-mode-form>div.jsoneditor-menu>button.jsoneditor-transform,div.jsoneditor.jsoneditor-mode-view>div.jsoneditor-menu>button.jsoneditor-sort,div.jsoneditor.jsoneditor-mode-view>div.jsoneditor-menu>button.jsoneditor-transform{display:none}div.jsoneditor-menu>button.jsoneditor-undo{background-position:-24px -96px}div.jsoneditor-menu>button.jsoneditor-undo:disabled{background-position:-24px -120px}div.jsoneditor-menu>button.jsoneditor-redo{background-position:-48px -96px}div.jsoneditor-menu>button.jsoneditor-redo:disabled{background-position:-48px -120px}div.jsoneditor-menu>button.jsoneditor-compact{background-position:-72px -96px}div.jsoneditor-menu>button.jsoneditor-format{background-position:-72px -120px}div.jsoneditor-menu>button.jsoneditor-repair{background-position:-96px -96px}div.jsoneditor-menu>div.jsoneditor-modes{display:inline-block;float:left}div.jsoneditor-menu>div.jsoneditor-modes>button{background-image:none;width:auto;padding-left:6px;padding-right:6px}div.jsoneditor-menu>button.jsoneditor-separator,div.jsoneditor-menu>div.jsoneditor-modes>button.jsoneditor-separator{margin-left:10px}div.jsoneditor-menu a{font-family:arial,sans-serif;font-size:10pt;color:#fff;opacity:.8;vertical-align:middle}div.jsoneditor-menu a:hover{opacity:1}div.jsoneditor-menu a.jsoneditor-poweredBy{font-size:8pt;position:absolute;right:0;top:0;padding:10px}table.jsoneditor-search div.jsoneditor-results,table.jsoneditor-search input{font-family:arial,sans-serif;font-size:10pt;color:#1a1a1a;background:0 0}table.jsoneditor-search div.jsoneditor-results{color:#fff;padding-right:5px;line-height:24px;padding-top:2px}table.jsoneditor-search{position:absolute;right:4px;top:4px;border-collapse:collapse;border-spacing:0}table.jsoneditor-search div.jsoneditor-frame{border:1px solid transparent;background-color:#fff;padding:0 2px;margin:0}table.jsoneditor-search div.jsoneditor-frame table{border-collapse:collapse}table.jsoneditor-search input{width:120px;border:none;outline:0;margin:1px;line-height:20px}table.jsoneditor-search button{width:16px;height:24px;padding:0;margin:0;border:none;background:url(img/jsoneditor-icons.svg);vertical-align:top}table.jsoneditor-search button:hover{background-color:transparent}table.jsoneditor-search button.jsoneditor-refresh{width:18px;background-position:-99px -73px}table.jsoneditor-search button.jsoneditor-next{cursor:pointer;background-position:-124px -73px}table.jsoneditor-search button.jsoneditor-next:hover{background-position:-124px -49px}table.jsoneditor-search button.jsoneditor-previous{cursor:pointer;background-position:-148px -73px;margin-right:2px}table.jsoneditor-search button.jsoneditor-previous:hover{background-position:-148px -49px}div.jsoneditor div.autocomplete.dropdown{position:absolute;background:#fff;box-shadow:2px 2px 12px rgba(128,128,128,.3);border:1px solid #d3d3d3;z-index:100;overflow-x:hidden;overflow-y:auto;cursor:default;margin:0;padding-left:2pt;padding-right:5pt;text-align:left;outline:0;font-family:"dejavu sans mono","droid sans mono",consolas,monaco,"lucida console","courier new",courier,monospace,sans-serif;font-size:10pt}div.jsoneditor div.autocomplete.dropdown .item{color:#333}div.jsoneditor div.autocomplete.dropdown .item.hover{background-color:#ddd}div.jsoneditor div.autocomplete.hint{color:#aaa;top:4px;left:4px}div.jsoneditor-treepath{padding:0 5px;overflow:hidden;white-space:nowrap;outline:0}div.jsoneditor-treepath.show-all{word-wrap:break-word;white-space:normal;position:absolute;background-color:#ebebeb;z-index:999;box-shadow:2px 2px 12px rgba(128,128,128,.3)}div.jsoneditor-treepath div.jsoneditor-contextmenu-root{position:absolute;left:0}div.jsoneditor-treepath span.jsoneditor-treepath-show-all-btn{position:absolute;background-color:#ebebeb;left:0;height:20px;padding:0 3px;cursor:pointer}div.jsoneditor-treepath.show-all span.jsoneditor-treepath-show-all-btn{display:none}div.jsoneditor-treepath span.jsoneditor-treepath-element{margin:1px;font-family:arial,sans-serif;font-size:10pt}div.jsoneditor-treepath span.jsoneditor-treepath-seperator{margin:2px;font-size:9pt;font-family:arial,sans-serif}div.jsoneditor-treepath span.jsoneditor-treepath-element:hover,div.jsoneditor-treepath span.jsoneditor-treepath-seperator:hover{cursor:pointer;text-decoration:underline}div.jsoneditor-statusbar{line-height:26px;height:26px;margin-top:-1px;color:grey;background-color:#ebebeb;border-top:1px solid #d3d3d3;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;font-size:10pt}div.jsoneditor-statusbar>.jsoneditor-curserinfo-label{margin:0 2px 0 4px}div.jsoneditor-statusbar>.jsoneditor-curserinfo-val{margin-right:12px}div.jsoneditor-statusbar>.jsoneditor-curserinfo-count{margin-left:4px}div.jsoneditor-statusbar>.jsoneditor-validation-error-icon{float:right;width:24px;height:24px;padding:0;margin-top:1px;background:url(img/jsoneditor-icons.svg) -168px -48px;cursor:pointer}div.jsoneditor-statusbar>.jsoneditor-validation-error-count{float:right;margin:0 4px 0 0;cursor:pointer}div.jsoneditor-statusbar>.jsoneditor-parse-error-icon{float:right;width:24px;height:24px;padding:0;margin:1px;background:url(img/jsoneditor-icons.svg) -25px 0}div.jsoneditor-navigation-bar{width:100%;height:26px;line-height:26px;padding:0;margin:0;border-bottom:1px solid #d3d3d3;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;color:grey;background-color:#ebebeb;overflow:hidden;font-family:arial,sans-serif;font-size:10pt}/*! * Selectr 2.4.0 * https://github.com/Mobius1/Selectr * * Released under the MIT license */.selectr-container{position:relative}.selectr-container li{list-style:none}.selectr-hidden{position:absolute;overflow:hidden;clip:rect(0,0,0,0);width:1px;height:1px;margin:-1px;padding:0;border:0 none}.selectr-visible{position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;z-index:11}.selectr-desktop.multiple .selectr-visible{display:none}.selectr-desktop.multiple.native-open .selectr-visible{top:100%;min-height:200px!important;height:auto;opacity:1;display:block}.selectr-container.multiple.selectr-mobile .selectr-selected{z-index:0}.selectr-selected{position:relative;z-index:1;box-sizing:border-box;width:100%;padding:7px 28px 7px 14px;cursor:pointer;border:1px solid #999;border-radius:3px;background-color:#fff}.selectr-selected::before{position:absolute;top:50%;right:10px;width:0;height:0;content:'';-o-transform:rotate(0) translate3d(0,-50%,0);-ms-transform:rotate(0) translate3d(0,-50%,0);-moz-transform:rotate(0) translate3d(0,-50%,0);-webkit-transform:rotate(0) translate3d(0,-50%,0);transform:rotate(0) translate3d(0,-50%,0);border-width:4px 4px 0 4px;border-style:solid;border-color:#6c7a86 transparent transparent}.selectr-container.native-open .selectr-selected::before,.selectr-container.open .selectr-selected::before{border-width:0 4px 4px 4px;border-style:solid;border-color:transparent transparent #6c7a86}.selectr-label{display:none;overflow:hidden;width:100%;white-space:nowrap;text-overflow:ellipsis}.selectr-placeholder{color:#6c7a86}.selectr-tags{margin:0;padding:0;white-space:normal}.has-selected .selectr-tags{margin:0 0 -2px}.selectr-tag{list-style:none;position:relative;float:left;padding:2px 25px 2px 8px;margin:0 2px 2px 0;cursor:default;color:#fff;border:medium none;border-radius:10px;background:#acb7bf none repeat scroll 0 0}.selectr-container.multiple.has-selected .selectr-selected{padding:5px 28px 5px 5px}.selectr-options-container{position:absolute;z-index:10000;top:calc(100% - 1px);left:0;display:none;box-sizing:border-box;width:100%;border-width:0 1px 1px;border-style:solid;border-color:transparent #999 #999;border-radius:0 0 3px 3px;background-color:#fff}.selectr-container.open .selectr-options-container{display:block}.selectr-input-container{position:relative;display:none}.selectr-clear,.selectr-input-clear,.selectr-tag-remove{position:absolute;top:50%;right:22px;width:20px;height:20px;padding:0;cursor:pointer;-o-transform:translate3d(0,-50%,0);-ms-transform:translate3d(0,-50%,0);-moz-transform:translate3d(0,-50%,0);-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0);border:medium none;background-color:transparent;z-index:11}.selectr-clear,.selectr-input-clear{display:none}.selectr-container.has-selected .selectr-clear,.selectr-input-container.active .selectr-input-clear{display:block}.selectr-selected .selectr-tag-remove{right:2px}.selectr-clear::after,.selectr-clear::before,.selectr-input-clear::after,.selectr-input-clear::before,.selectr-tag-remove::after,.selectr-tag-remove::before{position:absolute;top:5px;left:9px;width:2px;height:10px;content:' ';background-color:#6c7a86}.selectr-tag-remove::after,.selectr-tag-remove::before{top:4px;width:3px;height:12px;background-color:#fff}.selectr-clear:before,.selectr-input-clear::before,.selectr-tag-remove::before{-o-transform:rotate(45deg);-ms-transform:rotate(45deg);-moz-transform:rotate(45deg);-webkit-transform:rotate(45deg);transform:rotate(45deg)}.selectr-clear:after,.selectr-input-clear::after,.selectr-tag-remove::after{-o-transform:rotate(-45deg);-ms-transform:rotate(-45deg);-moz-transform:rotate(-45deg);-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.selectr-input-container.active,.selectr-input-container.active .selectr-clear{display:block}.selectr-input{top:5px;left:5px;box-sizing:border-box;width:calc(100% - 30px);margin:10px 15px;padding:7px 30px 7px 9px;border:1px solid #999;border-radius:3px}.selectr-notice{display:none;box-sizing:border-box;width:100%;padding:8px 16px;border-top:1px solid #999;border-radius:0 0 3px 3px;background-color:#fff}.selectr-container.notice .selectr-notice{display:block}.selectr-container.notice .selectr-selected{border-radius:3px 3px 0 0}.selectr-options{position:relative;top:calc(100% + 2px);display:none;overflow-x:auto;overflow-y:scroll;max-height:200px;margin:0;padding:0}.selectr-container.notice .selectr-options-container,.selectr-container.open .selectr-input-container,.selectr-container.open .selectr-options{display:block}.selectr-option{position:relative;display:block;padding:5px 20px;list-style:outside none none;cursor:pointer;font-weight:400}.selectr-options.optgroups>.selectr-option{padding-left:25px}.selectr-optgroup{font-weight:700;padding:0}.selectr-optgroup--label{font-weight:700;margin-top:10px;padding:5px 15px}.selectr-match{text-decoration:underline}.selectr-option.selected{background-color:#ddd}.selectr-option.active{color:#fff;background-color:#5897fb}.selectr-option.disabled{opacity:.4}.selectr-option.excluded{display:none}.selectr-container.open .selectr-selected{border-color:#999 #999 transparent #999;border-radius:3px 3px 0 0}.selectr-container.open .selectr-selected::after{-o-transform:rotate(180deg) translate3d(0,50%,0);-ms-transform:rotate(180deg) translate3d(0,50%,0);-moz-transform:rotate(180deg) translate3d(0,50%,0);-webkit-transform:rotate(180deg) translate3d(0,50%,0);transform:rotate(180deg) translate3d(0,50%,0)}.selectr-disabled{opacity:.6}.has-selected .selectr-placeholder,.selectr-empty{display:none}.has-selected .selectr-label{display:block}.taggable .selectr-selected{padding:4px 28px 4px 4px}.taggable .selectr-selected::after{display:table;content:" ";clear:both}.taggable .selectr-label{width:auto}.taggable .selectr-tags{float:left;display:block}.taggable .selectr-placeholder{display:none}.input-tag{float:left;min-width:90px;width:auto}.selectr-tag-input{border:medium none;padding:3px 10px;width:100%;font-family:inherit;font-weight:inherit;font-size:inherit}.selectr-input-container.loading::after{position:absolute;top:50%;right:20px;width:20px;height:20px;content:'';-o-transform:translate3d(0,-50%,0);-ms-transform:translate3d(0,-50%,0);-moz-transform:translate3d(0,-50%,0);-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0);-o-transform-origin:50% 0 0;-ms-transform-origin:50% 0 0;-moz-transform-origin:50% 0 0;-webkit-transform-origin:50% 0 0;transform-origin:50% 0 0;-moz-animation:.5s linear 0s normal forwards infinite running spin;-webkit-animation:.5s linear 0s normal forwards infinite running spin;animation:.5s linear 0s normal forwards infinite running spin;border-width:3px;border-style:solid;border-color:#aaa #ddd #ddd;border-radius:50%}@-webkit-keyframes spin{0%{-webkit-transform:rotate(0) translate3d(0,-50%,0);transform:rotate(0) translate3d(0,-50%,0)}100%{-webkit-transform:rotate(360deg) translate3d(0,-50%,0);transform:rotate(360deg) translate3d(0,-50%,0)}}@keyframes spin{0%{-webkit-transform:rotate(0) translate3d(0,-50%,0);transform:rotate(0) translate3d(0,-50%,0)}100%{-webkit-transform:rotate(360deg) translate3d(0,-50%,0);transform:rotate(360deg) translate3d(0,-50%,0)}}.selectr-container.open.inverted .selectr-selected{border-color:transparent #999 #999;border-radius:0 0 3px 3px}.selectr-container.inverted .selectr-options-container{border-width:1px 1px 0;border-color:#999 #999 transparent;border-radius:3px 3px 0 0;background-color:#fff}.selectr-container.inverted .selectr-options-container{top:auto;bottom:calc(100% - 1px)}.selectr-container ::-webkit-input-placeholder{color:#6c7a86;opacity:1}.selectr-container ::-moz-placeholder{color:#6c7a86;opacity:1}.selectr-container :-ms-input-placeholder{color:#6c7a86;opacity:1}.selectr-container ::placeholder{color:#6c7a86;opacity:1}assets/css/select2/select2.min.css000064400000035514147600337620013054 0ustar00.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} assets/css/zebra_datepicker/icons.png000064400000000756147600337620013775 0ustar00‰PNG  IHDR6‹WPLTE|||ÿÿÿ   ||||||ÿÿÿFFFW˜œòtRNSòaff.™¹J¤’ÙÈŸÀ¬6å¼–·æ´*†,IDATHÇí•Ýnƒ0 … ]hÆO eÛaïÿœ‹—˜@Cµ‹qɧøˆsSGŠ™ª(*_A+C^×TTó,%*µ(/ƒï f]YpLK>G~8³Näø'[ƺ,k_A둼®©©,/)Q©ý@y¼-hpÑ•Ç´äsä‡׉ÿ$£m£*@Pu}Û^U%ðÏW¨‰ЊqåÁ-‰ÝÁž€_[è$ÇØh¬‰–{D,ÿúÐfÓ7Iz:not(template)~:not(template){--space-y-reverse:0!important;margin-top:calc(0.5rem*(1 - var(--space-y-reverse)))!important;margin-bottom:calc(0.5rem*var(--space-y-reverse))!important}#sa_smart_manager_main .space-y-3>:not(template)~:not(template){--space-y-reverse:0!important;margin-top:calc(0.75rem*(1 - var(--space-y-reverse)))!important;margin-bottom:calc(0.75rem*var(--space-y-reverse))!important}#sa_smart_manager_main .divide-y>:not(template)~:not(template){--divide-y-reverse:0!important;border-top-width:calc(1px*(1 - var(--divide-y-reverse)))!important;border-bottom-width:calc(1px*var(--divide-y-reverse))!important}#sa_smart_manager_main .divide-gray-200>:not(template)~:not(template){--divide-opacity:1!important;border-color:#e5e7eb!important;border-color:rgba(229,231,235,var(--divide-opacity))!important}#sa_smart_manager_main .bg-clip-padding{background-clip:padding-box!important}#sa_smart_manager_main .bg-transparent{background-color:transparent!important}#sa_smart_manager_main .bg-white{--bg-opacity:1!important;background-color:#fff!important;background-color:rgba(255,255,255,var(--bg-opacity))!important}#sa_smart_manager_main .bg-gray-50{--bg-opacity:1!important;background-color:#f9fafb!important;background-color:rgba(249,250,251,var(--bg-opacity))!important}#sa_smart_manager_main .bg-gray-100{--bg-opacity:1!important;background-color:#f4f5f7!important;background-color:rgba(244,245,247,var(--bg-opacity))!important}#sa_smart_manager_main .bg-gray-200{--bg-opacity:1!important;background-color:#e5e7eb!important;background-color:rgba(229,231,235,var(--bg-opacity))!important}#sa_smart_manager_main .bg-gray-300{--bg-opacity:1!important;background-color:#d2d6dc!important;background-color:rgba(210,214,220,var(--bg-opacity))!important}#sa_smart_manager_main .bg-gray-500{--bg-opacity:1!important;background-color:#6b7280!important;background-color:rgba(107,114,128,var(--bg-opacity))!important}#sa_smart_manager_main .bg-indigo-50{--bg-opacity:1!important;background-color:#f0f5ff!important;background-color:rgba(240,245,255,var(--bg-opacity))!important}#sa_smart_manager_main .bg-indigo-100{--bg-opacity:1!important;background-color:#e5edff!important;background-color:rgba(229,237,255,var(--bg-opacity))!important}#sa_smart_manager_main .bg-indigo-600{--bg-opacity:1!important;background-color:#5850ec!important;background-color:rgba(88,80,236,var(--bg-opacity))!important}#sa_smart_manager_main .bg-warning{--bg-opacity:1!important;background-color:#fbe7c6!important;background-color:rgba(251,231,198,var(--bg-opacity))!important}#sa_smart_manager_main .bg-success{--bg-opacity:1!important;background-color:#b7f7c4!important;background-color:rgba(183,247,196,var(--bg-opacity))!important}#sa_smart_manager_main .bg-error{--bg-opacity:1!important;background-color:#ffb7b6!important;background-color:rgba(255,183,182,var(--bg-opacity))!important}#sa_smart_manager_main .hover\:bg-gray-300:hover{--bg-opacity:1!important;background-color:#d2d6dc!important;background-color:rgba(210,214,220,var(--bg-opacity))!important}#sa_smart_manager_main .hover\:bg-indigo-500:hover{--bg-opacity:1!important;background-color:#6875f5!important;background-color:rgba(104,117,245,var(--bg-opacity))!important}#sa_smart_manager_main .focus\:bg-gray-100:focus{--bg-opacity:1!important;background-color:#f4f5f7!important;background-color:rgba(244,245,247,var(--bg-opacity))!important}#sa_smart_manager_main .bg-opacity-75{--bg-opacity:0.75!important}#sa_smart_manager_main .border-transparent{border-color:transparent!important}#sa_smart_manager_main .border-gray-100{--border-opacity:1!important;border-color:#f4f5f7!important;border-color:rgba(244,245,247,var(--border-opacity))!important}#sa_smart_manager_main .border-gray-200{--border-opacity:1!important;border-color:#e5e7eb!important;border-color:rgba(229,231,235,var(--border-opacity))!important}#sa_smart_manager_main .border-gray-400{--border-opacity:1!important;border-color:#9fa6b2!important;border-color:rgba(159,166,178,var(--border-opacity))!important}#sa_smart_manager_main .hover\:border-red-600:hover{--border-opacity:1!important;border-color:#e02424!important;border-color:rgba(224,36,36,var(--border-opacity))!important}#sa_smart_manager_main .hover\:border-green-600:hover{--border-opacity:1!important;border-color:#057a55!important;border-color:rgba(5,122,85,var(--border-opacity))!important}#sa_smart_manager_main .hover\:border-indigo-600:hover{--border-opacity:1!important;border-color:#5850ec!important;border-color:rgba(88,80,236,var(--border-opacity))!important}#sa_smart_manager_main .focus\:border-red-600:focus{--border-opacity:1!important;border-color:#e02424!important;border-color:rgba(224,36,36,var(--border-opacity))!important}#sa_smart_manager_main .focus\:border-green-600:focus{--border-opacity:1!important;border-color:#057a55!important;border-color:rgba(5,122,85,var(--border-opacity))!important}#sa_smart_manager_main .focus\:border-indigo-600:focus{--border-opacity:1!important;border-color:#5850ec!important;border-color:rgba(88,80,236,var(--border-opacity))!important}#sa_smart_manager_main .rounded-none{border-radius:0!important}#sa_smart_manager_main .rounded{border-radius:.25rem!important}#sa_smart_manager_main .rounded-md{border-radius:.375rem!important}#sa_smart_manager_main .rounded-lg{border-radius:.5rem!important}#sa_smart_manager_main .rounded-full{border-radius:9999px!important}#sa_smart_manager_main .rounded-t-md{border-top-left-radius:.375rem!important;border-top-right-radius:.375rem!important}#sa_smart_manager_main .rounded-b-md{border-bottom-right-radius:.375rem!important;border-bottom-left-radius:.375rem!important}#sa_smart_manager_main .border-none{border-style:none!important}#sa_smart_manager_main .border{border-width:1px!important}#sa_smart_manager_main .border-t-2{border-top-width:2px!important}#sa_smart_manager_main .border-t{border-top-width:1px!important}#sa_smart_manager_main .border-b{border-bottom-width:1px!important}#sa_smart_manager_main .box-content{box-sizing:content-box!important}#sa_smart_manager_main .cursor-default{cursor:default!important}#sa_smart_manager_main .inline-block{display:inline-block!important}#sa_smart_manager_main .flex{display:flex!important}#sa_smart_manager_main .inline-flex{display:inline-flex!important}#sa_smart_manager_main .table{display:table!important}#sa_smart_manager_main .grid{display:grid!important}#sa_smart_manager_main .flex-col{flex-direction:column!important}#sa_smart_manager_main .flex-wrap{flex-wrap:wrap!important}#sa_smart_manager_main .items-end{align-items:flex-end!important}#sa_smart_manager_main .items-center{align-items:center!important}#sa_smart_manager_main .items-baseline{align-items:baseline!important}#sa_smart_manager_main .justify-end{justify-content:flex-end!important}#sa_smart_manager_main .justify-center{justify-content:center!important}#sa_smart_manager_main .justify-between{justify-content:space-between!important}#sa_smart_manager_main .flex-1{flex:1 1 0%!important}#sa_smart_manager_main .flex-shrink-0{flex-shrink:0!important}#sa_smart_manager_main .font-medium{font-weight:500!important}#sa_smart_manager_main .font-semibold{font-weight:600!important}#sa_smart_manager_main .font-extrabold{font-weight:800!important}#sa_smart_manager_main .h-4{height:1rem!important}#sa_smart_manager_main .h-5{height:1.25rem!important}#sa_smart_manager_main .h-6{height:1.5rem!important}#sa_smart_manager_main .h-8{height:2rem!important}#sa_smart_manager_main .h-9{height:2.25rem!important}#sa_smart_manager_main .h-15{height:3.75rem!important}#sa_smart_manager_main .h-24{height:6rem!important}#sa_smart_manager_main .h-full{height:100%!important}#sa_smart_manager_main .text-xs{font-size:.75rem!important}#sa_smart_manager_main .text-sm{font-size:.875rem!important}#sa_smart_manager_main .text-base{font-size:1rem!important}#sa_smart_manager_main .text-lg{font-size:1.125rem!important}#sa_smart_manager_main .text-xl{font-size:1.25rem!important}#sa_smart_manager_main .text-2xl{font-size:1.5rem!important}#sa_smart_manager_main .text-3xl{font-size:1.875rem!important}#sa_smart_manager_main .text-4xl{font-size:2.25rem!important}#sa_smart_manager_main .leading-5{line-height:1.25rem!important}#sa_smart_manager_main .leading-6{line-height:1.5rem!important}#sa_smart_manager_main .leading-7{line-height:1.75rem!important}#sa_smart_manager_main .leading-8{line-height:2rem!important}#sa_smart_manager_main .leading-9{line-height:2.25rem!important}#sa_smart_manager_main .leading-none{line-height:1!important}#sa_smart_manager_main .leading-normal{line-height:1.5!important}#sa_smart_manager_main .list-disc{list-style-type:disc!important}#sa_smart_manager_main .m-3{margin:.75rem!important}#sa_smart_manager_main .m-auto{margin:auto!important}#sa_smart_manager_main .my-3{margin-top:.75rem!important;margin-bottom:.75rem!important}#sa_smart_manager_main .mx-auto{margin-left:auto!important;margin-right:auto!important}#sa_smart_manager_main .mt-1{margin-top:.25rem!important}#sa_smart_manager_main .ml-1{margin-left:.25rem!important}#sa_smart_manager_main .mt-2{margin-top:.5rem!important}#sa_smart_manager_main .mr-2{margin-right:.5rem!important}#sa_smart_manager_main .ml-2{margin-left:.5rem!important}#sa_smart_manager_main .mr-3{margin-right:.75rem!important}#sa_smart_manager_main .mb-3{margin-bottom:.75rem!important}#sa_smart_manager_main .ml-3{margin-left:.75rem!important}#sa_smart_manager_main .mt-4{margin-top:1rem!important}#sa_smart_manager_main .ml-4{margin-left:1rem!important}#sa_smart_manager_main .mt-5{margin-top:1.25rem!important}#sa_smart_manager_main .mt-6{margin-top:1.5rem!important}#sa_smart_manager_main .mb-6{margin-bottom:1.5rem!important}#sa_smart_manager_main .mt-8{margin-top:2rem!important}#sa_smart_manager_main .mt-12{margin-top:3rem!important}#sa_smart_manager_main .-mt-1{margin-top:-.25rem!important}#sa_smart_manager_main .max-h-96{max-height:24rem!important}#sa_smart_manager_main .max-h-full{max-height:100%!important}#sa_smart_manager_main .max-w-sm{max-width:24rem!important}#sa_smart_manager_main .max-w-md{max-width:28rem!important}#sa_smart_manager_main .max-w-lg{max-width:32rem!important}#sa_smart_manager_main .max-w-xl{max-width:36rem!important}#sa_smart_manager_main .max-w-2xl{max-width:42rem!important}#sa_smart_manager_main .max-w-3xl{max-width:48rem!important}#sa_smart_manager_main .max-w-4xl{max-width:56rem!important}#sa_smart_manager_main .max-w-full{max-width:100%!important}#sa_smart_manager_main .max-w-screen-xl{max-width:1280px!important}#sa_smart_manager_main .opacity-50{opacity:.5!important}#sa_smart_manager_main .hover\:opacity-75:hover,#sa_smart_manager_main .opacity-75{opacity:.75!important}#sa_smart_manager_main .focus\:opacity-100:focus{opacity:1!important}#sa_smart_manager_main .focus\:outline-none:focus,#sa_smart_manager_main .outline-none{outline:2px solid transparent!important;outline-offset:2px!important}#sa_smart_manager_main .overflow-hidden{overflow:hidden!important}#sa_smart_manager_main .overflow-scroll{overflow:scroll!important}#sa_smart_manager_main .overflow-y-auto{overflow-y:auto!important}#sa_smart_manager_main .overflow-x-hidden{overflow-x:hidden!important}#sa_smart_manager_main .p-1{padding:.25rem!important}#sa_smart_manager_main .p-2{padding:.5rem!important}#sa_smart_manager_main .p-3{padding:.75rem!important}#sa_smart_manager_main .p-4{padding:1rem!important}#sa_smart_manager_main .p-8{padding:2rem!important}#sa_smart_manager_main .py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}#sa_smart_manager_main .px-1{padding-left:.25rem!important;padding-right:.25rem!important}#sa_smart_manager_main .py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}#sa_smart_manager_main .py-3{padding-top:.75rem!important;padding-bottom:.75rem!important}#sa_smart_manager_main .px-3{padding-left:.75rem!important;padding-right:.75rem!important}#sa_smart_manager_main .py-4{padding-top:1rem!important;padding-bottom:1rem!important}#sa_smart_manager_main .px-4{padding-left:1rem!important;padding-right:1rem!important}#sa_smart_manager_main .px-5{padding-left:1.25rem!important;padding-right:1.25rem!important}#sa_smart_manager_main .py-6{padding-top:1.5rem!important;padding-bottom:1.5rem!important}#sa_smart_manager_main .px-6{padding-left:1.5rem!important;padding-right:1.5rem!important}#sa_smart_manager_main .py-8{padding-top:2rem!important;padding-bottom:2rem!important}#sa_smart_manager_main .py-0\.5{padding-top:.125rem!important;padding-bottom:.125rem!important}#sa_smart_manager_main .py-2\.5{padding-top:.625rem!important;padding-bottom:.625rem!important}#sa_smart_manager_main .pl-0{padding-left:0!important}#sa_smart_manager_main .pt-1{padding-top:.25rem!important}#sa_smart_manager_main .pb-2{padding-bottom:.5rem!important}#sa_smart_manager_main .pt-3{padding-top:.75rem!important}#sa_smart_manager_main .pl-3{padding-left:.75rem!important}#sa_smart_manager_main .pt-4{padding-top:1rem!important}#sa_smart_manager_main .pt-6{padding-top:1.5rem!important}#sa_smart_manager_main .pr-8{padding-right:2rem!important}#sa_smart_manager_main .pb-8{padding-bottom:2rem!important}#sa_smart_manager_main .pt-10{padding-top:2.5rem!important}#sa_smart_manager_main .pt-12{padding-top:3rem!important}#sa_smart_manager_main .pb-16{padding-bottom:4rem!important}#sa_smart_manager_main .pointer-events-none{pointer-events:none!important}#sa_smart_manager_main .pointer-events-auto{pointer-events:auto!important}#sa_smart_manager_main .static{position:static!important}#sa_smart_manager_main .fixed{position:fixed!important}#sa_smart_manager_main .absolute{position:absolute!important}#sa_smart_manager_main .relative{position:relative!important}#sa_smart_manager_main .sticky{position:sticky!important}#sa_smart_manager_main .inset-0{top:0!important;bottom:0!important}#sa_smart_manager_main .inset-0,#sa_smart_manager_main .inset-x-0{right:0!important;left:0!important}#sa_smart_manager_main .top-0{top:0!important}#sa_smart_manager_main .bottom-0{bottom:0!important}#sa_smart_manager_main .left-0{left:0!important}#sa_smart_manager_main .bottom-2{bottom:.5rem!important}#sa_smart_manager_main .shadow-xs{box-shadow:0 0 0 1px rgba(0,0,0,.05)!important}#sa_smart_manager_main .shadow{box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)!important}#sa_smart_manager_main .shadow-md{box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)!important}#sa_smart_manager_main .focus\:shadow-lg:focus,#sa_smart_manager_main .hover\:shadow-lg:hover,#sa_smart_manager_main .shadow-lg{box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)!important}#sa_smart_manager_main .focus\:shadow-outline:focus{box-shadow:0 0 0 3px rgba(118,169,250,.45)!important}#sa_smart_manager_main .focus\:shadow-none:focus{box-shadow:none!important}#sa_smart_manager_main .focus\:shadow-outline-green:focus{box-shadow:0 0 0 3px rgba(132,225,188,.45)!important}#sa_smart_manager_main .focus\:shadow-outline-red:focus{box-shadow:0 0 0 3px rgba(248,180,180,.45)!important}#sa_smart_manager_main .focus\:shadow-outline-indigo:focus{box-shadow:0 0 0 3px rgba(180,198,252,.45)!important}#sa_smart_manager_main .table-auto{table-layout:auto!important}#sa_smart_manager_main .text-left{text-align:left!important}#sa_smart_manager_main .text-center{text-align:center!important}#sa_smart_manager_main .text-right{text-align:right!important}#sa_smart_manager_main .text-white{--text-opacity:1!important;color:#fff!important;color:rgba(255,255,255,var(--text-opacity))!important}#sa_smart_manager_main .text-black{--text-opacity:1!important;color:#000!important;color:rgba(0,0,0,var(--text-opacity))!important}#sa_smart_manager_main .text-gray-50{--text-opacity:1!important;color:#f9fafb!important;color:rgba(249,250,251,var(--text-opacity))!important}#sa_smart_manager_main .text-gray-300{--text-opacity:1!important;color:#d2d6dc!important;color:rgba(210,214,220,var(--text-opacity))!important}#sa_smart_manager_main .text-gray-400{--text-opacity:1!important;color:#9fa6b2!important;color:rgba(159,166,178,var(--text-opacity))!important}#sa_smart_manager_main .text-gray-500{--text-opacity:1!important;color:#6b7280!important;color:rgba(107,114,128,var(--text-opacity))!important}#sa_smart_manager_main .text-gray-600{--text-opacity:1!important;color:#4b5563!important;color:rgba(75,85,99,var(--text-opacity))!important}#sa_smart_manager_main .text-gray-700{--text-opacity:1!important;color:#374151!important;color:rgba(55,65,81,var(--text-opacity))!important}#sa_smart_manager_main .text-gray-800{--text-opacity:1!important;color:#252f3f!important;color:rgba(37,47,63,var(--text-opacity))!important}#sa_smart_manager_main .text-gray-900{--text-opacity:1!important;color:#161e2e!important;color:rgba(22,30,46,var(--text-opacity))!important}#sa_smart_manager_main .text-green-500{--text-opacity:1!important;color:#0e9f6e!important;color:rgba(14,159,110,var(--text-opacity))!important}#sa_smart_manager_main .text-indigo-500{--text-opacity:1!important;color:#6875f5!important;color:rgba(104,117,245,var(--text-opacity))!important}#sa_smart_manager_main .text-indigo-600{--text-opacity:1!important;color:#5850ec!important;color:rgba(88,80,236,var(--text-opacity))!important}#sa_smart_manager_main .hover\:text-black:hover{--text-opacity:1!important;color:#000!important;color:rgba(0,0,0,var(--text-opacity))!important}#sa_smart_manager_main .hover\:text-gray-500:hover{--text-opacity:1!important;color:#6b7280!important;color:rgba(107,114,128,var(--text-opacity))!important}#sa_smart_manager_main .hover\:text-gray-700:hover{--text-opacity:1!important;color:#374151!important;color:rgba(55,65,81,var(--text-opacity))!important}#sa_smart_manager_main .hover\:text-red-600:hover{--text-opacity:1!important;color:#e02424!important;color:rgba(224,36,36,var(--text-opacity))!important}#sa_smart_manager_main .hover\:text-green-600:hover{--text-opacity:1!important;color:#057a55!important;color:rgba(5,122,85,var(--text-opacity))!important}#sa_smart_manager_main .hover\:text-indigo-600:hover{--text-opacity:1!important;color:#5850ec!important;color:rgba(88,80,236,var(--text-opacity))!important}#sa_smart_manager_main .focus\:text-gray-500:focus{--text-opacity:1!important;color:#6b7280!important;color:rgba(107,114,128,var(--text-opacity))!important}#sa_smart_manager_main .uppercase{text-transform:uppercase!important}#sa_smart_manager_main .capitalize{text-transform:capitalize!important}#sa_smart_manager_main .hover\:no-underline:hover{text-decoration:none!important}#sa_smart_manager_main .tracking-tight{letter-spacing:-.025em!important}#sa_smart_manager_main .tracking-wide{letter-spacing:.025em!important}#sa_smart_manager_main .invisible{visibility:hidden!important}#sa_smart_manager_main .w-4{width:1rem!important}#sa_smart_manager_main .w-5{width:1.25rem!important}#sa_smart_manager_main .w-6{width:1.5rem!important}#sa_smart_manager_main .w-8{width:2rem!important}#sa_smart_manager_main .w-9{width:2.25rem!important}#sa_smart_manager_main .w-15{width:3.75rem!important}#sa_smart_manager_main .w-20{width:5rem!important}#sa_smart_manager_main .w-24{width:6rem!important}#sa_smart_manager_main .w-48{width:12rem!important}#sa_smart_manager_main .w-1\/4{width:25%!important}#sa_smart_manager_main .w-2\/6{width:33.333333%!important}#sa_smart_manager_main .w-full{width:100%!important}#sa_smart_manager_main .z-10{z-index:10!important}#sa_smart_manager_main .gap-1{grid-gap:.25rem!important;gap:.25rem!important}#sa_smart_manager_main .gap-2{grid-gap:.5rem!important;gap:.5rem!important}#sa_smart_manager_main .gap-4{grid-gap:1rem!important;gap:1rem!important}#sa_smart_manager_main .gap-6{grid-gap:1.5rem!important;gap:1.5rem!important}#sa_smart_manager_main .gap-8{grid-gap:2rem!important;gap:2rem!important}#sa_smart_manager_main .transform{--transform-translate-x:0!important;--transform-translate-y:0!important;--transform-rotate:0!important;--transform-skew-x:0!important;--transform-skew-y:0!important;--transform-scale-x:1!important;--transform-scale-y:1!important;transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))!important}#sa_smart_manager_main .transition-all{transition-property:all!important}#sa_smart_manager_main .transition{transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform!important}#sa_smart_manager_main .transition-opacity{transition-property:opacity!important}#sa_smart_manager_main .ease-in-out{transition-timing-function:cubic-bezier(.4,0,.2,1)!important}#sa_smart_manager_main .duration-150{transition-duration:.15s!important}@keyframes spin{to{transform:rotate(1turn)}}@keyframes ping{75%,to{transform:scale(2);opacity:0}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{transform:translateY(-25%);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{transform:none;animation-timing-function:cubic-bezier(0,0,.2,1)}}@media (min-width:640px){#sa_smart_manager_main .sm\:items-start{align-items:flex-start!important}#sa_smart_manager_main .sm\:justify-end{justify-content:flex-end!important}#sa_smart_manager_main .sm\:float-right{float:right!important}#sa_smart_manager_main .sm\:text-sm{font-size:.875rem!important}#sa_smart_manager_main .sm\:text-4xl{font-size:2.25rem!important}#sa_smart_manager_main .sm\:leading-5{line-height:1.25rem!important}#sa_smart_manager_main .sm\:leading-10{line-height:2.5rem!important}#sa_smart_manager_main .sm\:mt-8{margin-top:2rem!important}#sa_smart_manager_main .sm\:mt-12{margin-top:3rem!important}#sa_smart_manager_main .sm\:mt-16{margin-top:4rem!important}#sa_smart_manager_main .sm\:p-6{padding:1.5rem!important}#sa_smart_manager_main .sm\:p-10{padding:2.5rem!important}#sa_smart_manager_main .sm\:px-6{padding-left:1.5rem!important;padding-right:1.5rem!important}#sa_smart_manager_main .sm\:pt-6{padding-top:1.5rem!important}#sa_smart_manager_main .sm\:pb-6{padding-bottom:1.5rem!important}#sa_smart_manager_main .sm\:pb-8{padding-bottom:2rem!important}#sa_smart_manager_main .sm\:pt-16{padding-top:4rem!important}#sa_smart_manager_main .sm\:pb-20{padding-bottom:5rem!important}#sa_smart_manager_main .sm\:w-3\/4{width:75%!important}}@media (min-width:768px){#sa_smart_manager_main .md\:grid{display:grid!important}#sa_smart_manager_main .md\:mt-0{margin-top:0!important}#sa_smart_manager_main .md\:min-w-full{min-width:100%!important}#sa_smart_manager_main .md\:gap-8{grid-gap:2rem!important;gap:2rem!important}#sa_smart_manager_main .md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))!important}}@media (min-width:1024px){#sa_smart_manager_main .lg\:flex{display:flex!important}#sa_smart_manager_main .lg\:grid{display:grid!important}#sa_smart_manager_main .lg\:items-center{align-items:center!important}#sa_smart_manager_main .lg\:justify-end{justify-content:flex-end!important}#sa_smart_manager_main .lg\:mx-auto{margin-left:auto!important;margin-right:auto!important}#sa_smart_manager_main .lg\:mt-0{margin-top:0!important}#sa_smart_manager_main .lg\:ml-2{margin-left:.5rem!important}#sa_smart_manager_main .lg\:mt-8{margin-top:2rem!important}#sa_smart_manager_main .lg\:mt-12{margin-top:3rem!important}#sa_smart_manager_main .lg\:mt-16{margin-top:4rem!important}#sa_smart_manager_main .lg\:ml-1\/6{margin-left:16.666667%!important}#sa_smart_manager_main .lg\:max-w-5xl{max-width:64rem!important}#sa_smart_manager_main .lg\:py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}#sa_smart_manager_main .lg\:px-8{padding-left:2rem!important;padding-right:2rem!important}#sa_smart_manager_main .lg\:pt-2{padding-top:.5rem!important}#sa_smart_manager_main .lg\:pt-8{padding-top:2rem!important}#sa_smart_manager_main .lg\:pb-8{padding-bottom:2rem!important}#sa_smart_manager_main .lg\:pt-12{padding-top:3rem!important}#sa_smart_manager_main .lg\:pb-12{padding-bottom:3rem!important}#sa_smart_manager_main .lg\:pb-28{padding-bottom:7rem!important}#sa_smart_manager_main .lg\:absolute{position:absolute!important}#sa_smart_manager_main .lg\:inset-0{top:0!important;right:0!important;bottom:0!important;left:0!important}#sa_smart_manager_main .lg\:bottom-0{bottom:0!important}#sa_smart_manager_main .lg\:text-center{text-align:center!important}#sa_smart_manager_main .lg\:w-3\/4{width:75%!important}#sa_smart_manager_main .lg\:gap-5{grid-gap:1.25rem!important;gap:1.25rem!important}#sa_smart_manager_main .lg\:col-gap-8{grid-column-gap:2rem!important;-moz-column-gap:2rem!important;column-gap:2rem!important}#sa_smart_manager_main .lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))!important}#sa_smart_manager_main .lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))!important}#sa_smart_manager_main .lg\:col-span-1{grid-column:span 1/span 1!important}#sa_smart_manager_main .lg\:col-span-2{grid-column:span 2/span 2!important}}@media (min-width:1280px){#sa_smart_manager_main .xl\:px-4{padding-left:1rem!important;padding-right:1rem!important}#sa_smart_manager_main .xl\:px-6{padding-left:1.5rem!important;padding-right:1.5rem!important}}#sa_smart_manager_main input[type=checkbox]:checked:before,#sa_smart_manager_main input[type=radio]:checked:before{display:none}#sa_smart_manager_main .select2-container--default.select2-container--focus .select2-selection--multiple,#sa_smart_manager_main .select2-container--default.select2-container--focus .select2-selection--single,#sa_smart_manager_main .select2-container--default .select2-selection--multiple,#sa_smart_manager_main .select2-container--default .select2-selection--single{border:1px solid #d2d6dc!important}#sa_smart_manager_main .select2-selection__rendered{line-height:36px!important}#sa_smart_manager_main .select2-container .select2-selection--single{height:38px!important;border:1px solid #d2d6dc!important}#sa_smart_manager_main .select2-selection__arrow{height:34px!important}#sa_smart_manager_main .select2-selection__arrow b{border-color:#d2d6dc transparent transparent!important;border-style:solid!important;border-width:5px 4px 0!important}#sa_smart_manager_main .select2-search__field,#sa_smart_manager_main .sm_advanced_search_select2_dropdown{border:1px solid #d2d6dc!important}#sa_smart_manager_main .dashboard-names .select2-search__field{border:none!important}#sa_smart_manager_main a{color:#2271b1;text-decoration:underline}#sa_smart_manager_main .modal{z-index:1055!important;display:flex!important}#sa_smart_manager_main .modal-dialog{margin:.5rem}#sa_smart_manager_main .modal.fade .modal-dialog{transition:transform .3s ease-out!important;transform:translateY(-50px)!important}#sa_smart_manager_main .modal.show .modal-dialog{transform:none!important}#sa_smart_manager_main .modal.modal-static .modal-dialog{transform:scale(1.02)!important}#sa_smart_manager_main .modal-dialog-scrollable{height:calc(100% - 1rem)!important}#sa_smart_manager_main .modal-dialog-scrollable .modal-content{max-height:100%!important;overflow:hidden!important}#sa_smart_manager_main .modal-dialog-scrollable .modal-body{overflow-y:auto!important}#sa_smart_manager_main .modal-dialog-centered{display:flex!important;align-items:center!important;min-height:calc(100% - 1rem)!important}#sa_smart_manager_main .modal-backdrop{position:fixed!important;top:0!important;left:0!important;z-index:1050!important;width:100vw!important;height:100vh!important;background-color:#000!important}#sa_smart_manager_main .modal-backdrop.fade{opacity:0!important}#sa_smart_manager_main .modal-backdrop.show{opacity:.5!important}#sa_smart_manager_main .modal-header .btn-close{padding:.5rem!important;margin:-.5rem -.5rem -.5rem auto!important}#sa_smart_manager_main .modal-body{flex:1 1 auto!important}#sa_smart_manager_main .flex-1.relative.dashboard-names span.select2-selection.select2-selection--multiple{margin:0}#sa_smart_manager_main .flex-1.relative.dashboard-names .select2-selection__rendered{line-height:2em!important;padding:0 .4em}#sa_smart_manager_main .flex-1.relative.dashboard-names .select2-selection__rendered li.select2-search.select2-search--inline{margin:.19em .19em 0 0}#sa_smart_manager_main .flex-1.relative.dashboard-names input.select2-search__field{min-height:1.8em}.man-hrs-section-pricing-page{display:block!important;width:70%!important}.man-hrs-section-pricing-page .sm_claim_discount{margin-top:0!important}assets/css/smart-manager.css000064400000110656147600337620012127 0ustar00#icon-smart-manager { background: url("../images/logo-32x32.png") no-repeat scroll transparent; } :root{ --row-height: 50px; } .icon32 { float: left; height: 34px; margin: 7px 8px 0 0; width: 36px; background-repeat: no-repeat; display: block; } #sm-editor-grid { margin: auto; width: 100%; } .sm_gallery_image_parent { min-height:20em; } .sm_gallery_image { margin: 0.5em; padding: 0.5em; border: 0.1em solid #D3D3D3; } .sm_gallery_image img { padding-bottom: 0.5em; cursor: pointer; } .sm_gallery_image div { cursor: pointer; } .sm_border_red { border: 1px solid #FF5B5E !important; } #sm_view_error_msg, .sm_beta_select_red { color:#FF5B5E !important; } .sm_beta_select_green { color:#03a025 !important; } .sm_beta_select_blue { color:#5850ec !important; } .sm_beta_select_orange { color:#EC8F1C !important; } .sm_beta_select_grey { color:#a29c9c !important; } .sm_beta_select_yellow { color:#d49f2b !important; } .sm_font_bold { font-weight: bold; } #sm_dashboard_kpi, #sm_beta_display_records { /* margin-left: 3em; */ font-size: 1.1em; /* line-height: 1.9em; */ cursor: pointer; } #sm_dashboard_kpi { font-weight: 500; } #sm_dashboard_kpi .sm_separator { color: #D3D3D3; font-weight: bold; padding-left: 0.5em; padding-right: 0.5em; } #sm_promo_valid_msg { text-align: center; padding-left: 0.5em; font-size: 0.8em; float: left; padding-top: 0.25em; font-style: italic; color: #A3B745; } /*Added for WP4.4*/ .sm-h2 { font-size: 1.25em; /* font-weight: 500; */ /* color: #5850ec; */ line-height: 2em; letter-spacing: 0.01em !important; padding-left: 1em; /* text-transform: uppercase; */ } #smart_manager_settings_form{ padding-left: 20px; } .sm_nav_bar_links{ display: flex !important; align-items: center !important; gap: 1.25rem !important; padding-top: 1em; } .sm_nav_bar_links a:focus{ outline: none; } #sm_nav_bar_right svg{ color: #9ca3af; } #sm_nav_bar_right svg{ height: 1.5rem !important; width: 1.5rem !important; margin: 0 auto; } #sm_nav_bar_right svg:hover{ color: #6b7280; } #sm_nav_bar { padding: 0.5em 0 1em 20px; display: flex; background-color: #252f3f !important; color: #fff !important } #sm_nav_bar > .sm_beta_left { width: 95%; display: inherit; } .sm_beta_left > * { margin-right: 2em; } td { border-color: #F0F0F0 !important; /*border-color: #c1c1c1 !important;*/ } th { background-color: #FFF !important; border-color: #F0F0F0 !important; } .sm-grid-dirty-cell { background-color: #f8717152 !important } .multiselect { width: 100%!important; } ul.children{list-style:none outside;margin:0px 0 0 24px} #edit_product_attributes input[type="text"] { line-height: 19px; width: 100%; } #sm_top_bar { margin-bottom: 4em; } #sm_bottom_bar { margin-top: 0.5em; } .sm_beta_left { float:left; margin-top: 0.5em; } .sm_beta_right { float:right; } #sm_top_bar_left { width: 80%; display: flex; } #sm_top_bar_left > * { width: 25%; margin: 0em 1em 0em 1em; display: inherit; } #sm_top_bar_left > *:first-child{ width: 20%; } #sm_top_bar_left > *:nth-child(2){ width: 30%; } #sm_top_bar_left > *:nth-last-child(2){ width: 15%; } #sm_top_bar_left > *:last-child { width: 15%; text-align: right; display: block; } #sm_bottom_bar_left { width: 60%; } #sm_bottom_bar_left, #sm_bottom_bar_right { padding-top: 0; margin: 0; } #sm_bottom_bar_right { width: 40%; /* padding-top: 0.5em; */ } #sm_top_bar_right{ padding-top: 0.25em; } #sm_top_bar_right span, #sm_top_bar_right button{ float: left; color: #3892D3; padding: 3px; cursor: pointer; } #sm_top_bar_action_btns_misc { border-right: 0em !important; } #sm_top_bar_action_btns_basic { width: 25% !important; } .sm_top_bar_action_btns div:not(.sm_beta_dropdown_content) { cursor: pointer; padding: 0.5em; display: flex; color: #4a5568 !important; } /* #sm_custom_views svg { margin: 0 0.5em 0.5em 0.5em; } */ .sm_top_bar_action_btns svg, #sm_advanced_search_icon { margin-right: 0.5em; height: 1.5em; margin-top: 0em; cursor: pointer; color: #5850ec; } .sm-error-icon { color: #FF5B5E !important; } #show_hide_cols_sm_editor_grid, #sm_show_tasks_container { float: right !important; } /* .sm_top_bar_action_btns div:hover:not(.sm_beta_dropdown_content), .sm_top_bar_action_btns div:hover:not(.sm_beta_dropdown_content) .sm_top_bar_action_btns_dashicons, .sm_top_bar_action_btns div:hover:not(.sm_beta_dropdown_content) .sm_error_icon { color: #FFF !important; background-color: #3892D3 !important; } */ #sm_top_bar_action_btns_basic div:nth-child(2), #sm_top_bar_action_btns_update div:nth-child(2), #sm_top_bar_action_btns_misc div:nth-child(2) { padding-top: 0.2em !important; } #sm_top_bar_action_btns_update div:nth-child(2) { padding-bottom: 0.1em !important; } #sm_top_bar_action_btns { margin-right: 2em; } #sm_top_bar_action_btns, #sm_top_bar_search { /*border: 0.1em solid #3892D3;*/ background: #FFF; border-radius: 0.5em; /* min-height: 8em; padding: 1em 0em 1em 1em; margin-bottom: 1em; */ } #sm_nav_bar_search { width: 35%; display: inherit; } #search_content_parent{ width: 70%; overflow-y: auto; padding-left: 1em; } #sm_dashboard_select{ font-size: 2em; } #sm_nav_bar .select2-selection__rendered { line-height: 2.3rem !important; } #sm_nav_bar .select2-results{ color: #4b5563 !important; } /* #sm_nav_bar .select2-selection__rendered:focus { color: #3c434a !important; } */ #sm_nav_bar .select2-container .select2-selection--single { height: 2.5rem !important; /* background-color: #252f3f !important; border: 1px solid #8c8f94; */ } /* #sm_nav_bar .select2-container .select2-selection--single:focus { background-color: #fff !important; color: #3c434a !important; } */ #sm_nav_bar .select2-selection__arrow { height: 2.3rem !important; } #sm_beta_smart_date_filter { width: 30%; height: 7em; padding: 0.25em 0em 0em 1.5em; margin-top: 0; } #sm_editor_grid, #sm_top_bar, #sm_bottom_bar{ margin-left: 1.5em!important; } #wpcontent { padding-left: 0!important; } #sm_beta_display_records { margin: 0em 1em 0em 1em; /* margin-top: 0.5em; */ /* font-weight: 600; */ font-style: italic; line-height: 2em; } .sm-upgrade-notice { background-color: #adff2f21; margin: 1.5em; border-left: 0.5em solid #adff2fc7; } .sm-upgrade-notice p { padding: 1em; } /* #save_sm_editor_grid_btn:hover .save_sm_editor_grid { content: url("../images/jqgrid/save_img-white-16X16.png"); } */ /* #print_invoice_sm_editor_grid_btn:hover .print_invoice_sm_editor_grid { content: url("../images/jqgrid/print-white-15x15.png"); } */ #sm_products_show_variations, #sm_show_tasks, #sm_view_access_public{ margin-right: 0.25em !important; /* height: 1.5em; width: 1.5em; */ } #sm_products_show_variations_span > input[type="checkbox"]:checked::before, #sm_view_access_public_lbl > input[type="checkbox"]:checked::before{ height: 1.5rem; width: 1.5rem; } .sm_plus_icon { color:#3892D3 !important; line-height: 1.2em; cursor:pointer; } /*Reduce the size of checkbox*/ input[type=checkbox] { -ms-transform: scale(0.85); /* IE */ -moz-transform: scale(0.85); /* FF */ -webkit-transform: scale(0.85); /* Safari and Chrome */ -o-transform: scale(0.85); /* Opera */ } /*CSS for the dashboard select*/ /*#sm_dashboard_select { padding:0px 0px 2px 2px; margin: 0; -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; background: #f8f8f8; color: #909090; border:none; background-color:transparent; outline:none; display: inline-block; -webkit-appearance:none; -moz-appearance:none; text-indent: 0.01px; text-overflow: ''; appearance:none; cursor:pointer; line-height: inherit; font-weight:500; }*/ /*#sm_dashboard_select:hover { border-bottom: 0.1em solid #3892D3; } #sm_dashboard_select_lbl { position: relative; background: #FFF; } #sm_dashboard_select_lbl:after { content: "\f347"; font-size:24px; font-family: dashicons; color:#3892D3; right:0px; line-height: 23px; position:absolute; top:5px; float: right; pointer-events:none; } #sm_dashboard_select_lbl:before { content:''; right:6px; top:0px; width:20px; height:20px; background:transparent; position:absolute; pointer-events:none; display:block; } #sm_dashboard_select { font-size: 1.2em !important; }*/ /*For hiding the update notices on subscriptions page*/ .update-nag, .updated, .error { display: none; } .product_page_smart-manager-woo > .ui-widget-overlay { opacity: 0.6 !important; background: none !important; background-color: black !important; } /*CSS for in-app offer*/ #sm_promo_msg_content a { color: #A3B745 !important; } #sm_promo_msg_content .button-primary { background: #a3b745 !important; border-color: #829237 #727f30 #727f30 !important; color: #fff !important; box-shadow: 0 1px 0 #727f30 !important; text-shadow: 0 -1px 1px #727f30, 1px 0 1px #727f30, 0 1px 1px #727f30, -1px 0 1px #727f30 !important; animation-duration: 5s; animation-iteration-count: infinite; animation-name: shake-hv; animation-timing-function: ease-in-out; } @keyframes shake-hv { 0%, 80% { transform: translate(0, 0) rotate(0); } 60%, 70% { transform: translate(0, -0.5px) rotate(2.5deg); } 62%, 72% { transform: translate(0, 1.5px) rotate(-0.5deg); } 65%, 75% { transform: translate(0, -1.5px) rotate(2.5deg); } 67%, 77% { transform: translate(0, 2.5px) rotate(-1.5deg); } } #sm_promo_msg_content input[type=checkbox]:checked:before { color: #A3B745 !important; } /*============================================== OVERRIDING JQGRID CSS ==============================================*/ .ui-jqgrid .ui-jqgrid-pager .ui-pg-div { padding: 1px 0; float: left; position: relative; background-color: #5AB6F8 !important; border-color: #66BEFC !important; color: #ffffff !important; border-radius: 3px; -webkit-border-radius: 3px; } .gbox_sm_editor_grid { max-width: 750px !important; } /*.ui-jqgrid tr.jqgrow td { white-space:nowrap; height: 1px; }*/ .ui-jqgrid .ui-jqgrid-view { font-size: 0.9em; line-height: 2em; } .ui-jqgrid-htable, .ui-jqgrid-bdiv, .ui-jqgrid-btable { width: 100% !important; } .ui-jqgrid-htable { line-height: 1.5em; } .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default{ border: 1px solid #ddd; background: #f6f6f6 url("../images/jqgrid/ui-bg_highlight-soft_100_f6f6f6_1x100.png") 50% 50% repeat-x; font-weight: 100; color: #444; } /*Duplicate BTN CSS*/ .sm_beta_dup_btn { color: white; border: none; outline: none; background: none !important; margin-right: 0.2em !important; } /* Dropdown Content (Hidden by Default) */ .sm_beta_dropdown_content { margin-top: 1.5rem; display: none; position: absolute; border: 1px solid #5850ec; border-bottom: 0px; background-color: #fff; min-width: 165px; z-index: 999; } /* Links inside the dropdown */ .sm_beta_dropdown_content a { color: black !important; padding: 6px 8px; text-decoration: none !important; display: block; } .sm_beta_dropdown_content a{ border-bottom: 1px solid #5850ec !important; } /* Change color of dropdown links on hover */ .sm_beta_dropdown_content a:hover {color: #5850ec !important;} /*============================================== OVERRIDING WP CSS ==============================================*/ #wpbody-content { padding-bottom: 2.5rem !important; } /*============================================== DATEPICKER CSS ==============================================*/ .sm_date_range_container { /*float: left!important;*/ display: inline-block; padding: 0.5em 0.2em 0.5em 0.5em; border: 1px solid #dedede; border-radius: 0.3em !important; vertical-align: middle; color: #a2a2a2; background-color: #fff; /*height: 2em;*/ /*margin-top: 2px;*/ margin-right: 1em; margin-bottom: 1em; min-width: 14em; } .sm_date_range_container .sm_beta_left { width: 84%; height: 100%; } .sm_date_range_container .sm_beta_left div { text-align: center; width: 100%; } .sm_date_range_container .sm_beta_right { width: 15%; height: 6em; border-left: 1px solid #d2d2d2; color: black; } .sm_date_range_container .sm_date_selector { background-color: transparent!important; font-size: 1em; } .sm_date_selector { width: 10em; border: 1px solid transparent; outline: 0; cursor: pointer; padding: 0; color: #656161; } .sm_date_range_container .date-separator { padding: 0px 3px; margin-top: -3px; font-size: 1.2em; text-align: center; width: 100%; } #smartDatesDropdown { margin: 0 auto; } .sm_date_range_container .dropdown { position: relative; display: flex; align-items: center; } .sm_date_range_container .dropdown-menu .pull-left { float: left!important; left: 0; } .sm_date_range_container .dropdown-menu { position: absolute; top: 100%; z-index: 1000; display: none; min-width: 160px; padding: 5px 0; margin: 0.5em 0 0 -9.5em; font-size: 14px; text-align: left; list-style: none; background-color: #fff; background-clip: padding-box; border: 1px solid rgba(0,0,0,.15); border-radius: 4px; box-shadow: 0 6px 12px rgba(0,0,0,.175); } .sm_date_range_container div { float: left; line-height: 1.8em; } .sm_date_range_container .smart-date-icon { /*border-left: 1px solid #d2d2d2;*/ color: #BBBBBB; padding: 0em 0.2em 0 0.2em; margin-left: 0; cursor: pointer; /*font-size: 1.3em!important;*/ line-height: 1.1em!important; } .sm_date_range_container .dropdown-menu li a { display: block; padding: 3px 20px; clear: both; font-weight: 400; line-height: 1.42; color: #333; white-space: nowrap; text-decoration: none; } .sm_date_range_container .dropdown-menu .divider { height: 0.1em; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .sm_date_range_container .dropdown-menu li a:hover { color: #3892D3; } .sm_date_range_container:hover { border: 1px solid #7cc5f9; } .sm_date_range_container .smart-date-icon:hover { color: #3892D3; } td[aria-describedby*="postmeta_meta_key__thumbnail_id_meta_value__thumbnail_id"] { cursor: pointer; } td[aria-describedby*="postmeta_meta_key__thumbnail_id_meta_value__thumbnail_id"] img { vertical-align: middle; } /*For jqgrid*/ .ui-widget-overlay { opacity: 0.6 !important; } .sm_active_highlight { background-color: #b7cff9 !important; } .sm_highlight { background-color: #fff !important; } .sm-ui-state-disabled { opacity: 0.4; } .sm_beta_background_update_progressbar { text-align: center; line-height: 2.5em; height: 2.5em; position: relative; margin: 0 auto; width: 98%; margin-top: 2em; margin-bottom: 2.5em; } .sm_beta_background_update_progressbar_text { /* color: #686868; */ position: absolute; width: 50%; left: 25%; font-size: 1.5em; font-weight: bold; } .sm_beta_batch_update_background_link { text-align: right; cursor: pointer; text-decoration: underline; color: #508991; margin-right: 0.5em; font-size: 1.2em; } /*Column Visibility*/ #sm-column-visibility .sm-sorter-section { width: 50%; margin: 15px 0; float: left; padding: 0 15px; box-sizing: border-box; } #sm-column-visibility .sm-sorter li { border: 1px solid #d2d6dc; padding: 0.1rem 0.5rem; cursor: pointer; text-align: center; border-radius: 0.375rem; color: #6b7280!important; } #sm-column-visibility .sm-sorter .handle { display: inline-block; float: left; font-size: 1.2rem; line-height: 1rem; font-weight: 700; padding-top: 0.25rem; color: #9ca3afad; } #sm-column-visibility h3 { font-size: 1.25em; margin: 0; text-align: center; color: #6b7280c2!important; } #sm_simple_search_box, .sm-search-box, #sm_advanced_search { width: 100%; margin-top: 0em !important; border-radius: 0.375rem !important; height: 2.5rem; } #sm_simple_search_box, #sm_nav_bar .sm-search-box { background-color: #161e2e!important; color: #9fa6b2!important; border: 1px solid #8c8f948c !important; } #sm_simple_search_box:focus{ background-color: #fff !important; border-color: #e5e7eb !important; color: #3c434a !important; } #sm_simple_search_box::placeholder{ color: #fff !important; } .sm-search-box { margin-bottom: 1em !important; padding: 0 8px !important; border: 1px solid #d2d6dc !important; } /*#search_switch { text-transform: capitalize !important; cursor: pointer; color: #3892D3; text-decoration: underline; margin: 0.5em 1em 0em 0.5em; }*/ .mce-container { z-index: 100105 !important; } .Zebra_DatePicker { /* Added for handling datepicker in dialog windows*/ z-index: 120001 !important; } .handsontable th:not(:first-child) { text-align: left; color: #686868; border-left: 0px !important; border-right: 1px solid #F0F0F0 !important; } .handsontable thead th:first-child { border-right: 1px solid #F0F0F0 !important; } .handsontable td { vertical-align: middle !important; } .handsontable th, .sm-sorter-section h3 { /* border: 0 !important; */ border-bottom: 1px solid #F0F0F0 !important; height: var(--row-height) !important; line-height: 26px !important; padding: 5px !important; background-color: #f7fafc !important; color: #718096 !important; font-weight: 700 !important; vertical-align: middle !important; letter-spacing: 0.1em } /* CSS for checkbox column */ /* .handsontable .ht_clone_left th, .sm-sorter-section h3{ border-bottom: 0.1em solid #F0F0F0 !important; } */ .sm-sorter-section h3 { border: 0 !important; } .handsontable tr:first-child td{ border-top: 0 !important; } .handsontable .ht_clone_left tbody tr th{ background-color: #fff !important; } input[type=checkbox] { border-color: rgb(156 163 175) !important; border-radius: 0.25rem !important; height: 1.3em; width: 1.3em; margin: 0 auto !important; } input[type=checkbox]:checked{ content: url("data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M5.707 7.293a1 1 0 0 0-1.414 1.414l2 2a1 1 0 0 0 1.414 0l4-4a1 1 0 0 0-1.414-1.414L7 8.586 5.707 7.293z'/%3e%3c/svg%3e"); border-color: transparent !important; background-size: 100% 100%; background-position: center; background-repeat: no-repeat; background-color: #38b2ac; opacity: 0.8; } .handsontable th input[type=checkbox]:checked, #sm_products_show_variations_span input[type=checkbox]:checked, #sm_show_tasks_container input[type=checkbox]:checked, .sm-settings-table input[type=checkbox]:checked{ background-color: #6366f1; opacity: 0.8; } .handsontable td, .handsontable th { padding-left: 5px !important; border-right: 0 !important; border-left: 0 !important; } .handsontable .wrapper { height: var(--row-height) !important; overflow: hidden; /* Internet Explorer 10 */ display:-ms-flexbox; -ms-flex-align:center; /* Firefox */ display:-moz-box; -moz-box-align:center; /* Safari, Opera, and Chrome */ display:-webkit-box; -webkit-box-align:center; /* W3C */ display:box; box-align:center; } #sm_inline_dialog { padding-right: 0; overflow-y: auto; } /* #sm_custom_views { height: auto; border: 1px solid #5850ec; background-color: white; border-radius: 3px; cursor: pointer; color: #515151; display: flex; padding-top: 0.5rem; margin-left: 2em; width: 10em; } #sm_custom_views > div{ margin-right: 0.2em; min-width: auto; width: inherit; margin-left: -0.1em; } #sm_custom_views > div:not(:first-child) { cursor: pointer; } #sm_custom_views > span{ margin-right: 0.5em; } */ #sm_view_name{ margin-top: 0.5em; } #sm_view_access{ margin-top: 1em; } #sm_view_descrip { margin: 0 0.5em 1em 0 !important; } #sm_view_access p { padding-left: 0.5em; font-style: italic; } @media all and (max-width: 1400px) { #sm_advanced_search_submit { overflow: hidden; text-indent: -50em; width: 2em; } #sm_advanced_search_submit .dashicons { float: left; text-indent: 0; } } .sm-dlg-btn-yes.ui-state-default, .sm-dlg-btn-yes.ui-state-default.ui-state-hover { color: #fff; font-weight: 500 !important; background: #3892D3; border-color: #157DC7 #075F9D #075F9D; box-shadow: 0 1px 0 #075F9D; text-decoration: none; text-shadow: 0 -1px 1px #075F9D, 1px 0 1px #075F9D, 0 1px 1px #075F9D, -1px 0 1px #075F9D; } .VS-search .VS-search-box { line-height: 2em; min-height: 3em !important; border-radius: 0.3em !important; background: white; } #sm_img_preview{ position:absolute; border-radius: 0.2em; border:1px solid #ccc; box-shadow: 0px 0px 7px 3px #ececec; background:#FFF; padding:1em; display:none; color:#fff; max-width: 300px; z-index: 9999; } #sm_img_preview img{ /*padding-bottom: 1em;*/ width: 100%; } #sm_img_preview_text{ /*padding-left: 0.8em;*/ color: #656161; font-size: 1.2em; text-align: center; font-style: italic; font-weight: 500; } .sm_image_thumbnail { margin: 0.5em 0.5em 0 0; max-width: calc(var(--row-height) * 0.95) !important; border-radius: 0.313rem; cursor: pointer; height: calc(var(--row-height) * 0.95) !important; width: calc(var(--row-height) * 0.95) !important; object-fit: contain; } #sm_editor_grid { background: #FFF; } .VS-search .VS-icon-search { width: 1.5em; height: 2.3em; } .VS-search .VS-placeholder { top: 0.5em; } .VS-search .search_parameter { height: 1.5em; } .VS-search .VS-search-inner { margin: 3.5px 20px; min-height: 2em; } .VS-search .VS-icon-cancel { top: 0.9em; } .advanced_search_or_placeholder { top: 0.3em; } .sm-loader-container { height: 100%; width: 100%; background-color: rgba(0,0,0,.2); position: fixed; top: 0; left: 0; z-index: 9999999; /*display: none;*/ } /*.sm-loader { display: inline-block; width: 128px; height: 82px; position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); } .sm-loader div { position: absolute; margin: 0 auto; width: 20px; height: 20px; animation-timing-function: cubic-bezier(0, 1, 1, 0); border-radius: 50%; background: #91649B; }*/ .sm-loader { display: inline-block; width: 128px; height: 82px; position: fixed; top: 50%; left: 50%; } .sm-loader div { animation: sm-loader 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite; transform-origin: 32px 32px; } .sm-loader div:after { content: " "; display: block; position: absolute; width: 8px; height: 8px; border-radius: 50%; background: #5850EC; margin: -3px 0 0 -3px; } .sm-loader div:nth-child(1) { animation-delay: -0.036s; } .sm-loader div:nth-child(1):after { top: 50px; left: 50px; } .sm-loader div:nth-child(2) { animation-delay: -0.072s; } .sm-loader div:nth-child(2):after { top: 54px; left: 45px; } .sm-loader div:nth-child(3) { animation-delay: -0.108s; } .sm-loader div:nth-child(3):after { top: 57px; left: 39px; } .sm-loader div:nth-child(4) { animation-delay: -0.144s; } .sm-loader div:nth-child(4):after { top: 58px; left: 32px; } .sm-loader div:nth-child(5) { animation-delay: -0.18s; } .sm-loader div:nth-child(5):after { top: 57px; left: 25px; } .sm-loader div:nth-child(6) { animation-delay: -0.216s; } .sm-loader div:nth-child(6):after { top: 54px; left: 19px; } .sm-loader div:nth-child(7) { animation-delay: -0.252s; } .sm-loader div:nth-child(7):after { top: 50px; left: 14px; } .sm-loader div:nth-child(8) { animation-delay: -0.288s; } .sm-loader div:nth-child(8):after { top: 45px; left: 10px; } @keyframes sm-loader { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } /* .sm-loader div:nth-child(1) { left: 13px; animation: sm-loader1 .6s infinite; } .sm-loader div:nth-child(2) { left: 24px; animation: sm-loader2 .6s infinite; } .sm-loader div:nth-child(3) { left: 54px; animation: sm-loader2 .6s infinite; } .sm-loader div:nth-child(4) { left: 86px; animation: sm-loader3 .6s infinite; } @keyframes sm-loader1 { 0% { transform: scale(0); } 100% { transform: scale(1); } } @keyframes sm-loader3 { 0% { transform: scale(1); } 100% { transform: scale(0); } } @keyframes sm-loader2 { 0% { transform: translate(0, 0); } 100% { transform: translate(19px, 0); } }*/ .sm_top_bar_right_separator { padding: 0em 0.3em 0em 0.2em !important; border-right: 0.2em solid #D3D3D3; height: 1.7em; margin-top: 0.4em; } .ui-dialog-buttonpane .sm_button { color: #FFFFFF !important; height: 2.5em; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; font-weight: bold !important; cursor: pointer; } .ui-dialog-buttonpane .sm_button.green { background: #4fad43; border-color: #4fad43; } .ui-dialog-buttonpane .sm_button.green:hover { background: #00870c; border-color: #00870c; } /*Checkbox CSS*/ /*#sm_top_bar_action_btns_misc #sm_products_show_variations_span input[type=checkbox] { padding: 0; height: initial; width: initial; margin-bottom: 0; display: none; cursor: pointer; } #sm_top_bar_action_btns_misc #sm_products_show_variations_span label { position: relative; cursor: pointer; color: #515151; } #sm_top_bar_action_btns_misc #sm_products_show_variations_span label:before { content:''; -webkit-appearance: none; background-color: transparent; border: 2px solid #3892D3; padding: 7px; display: inline-block; position: relative; vertical-align: middle; cursor: pointer; margin-right: 5px; } #sm_top_bar_action_btns_misc #sm_products_show_variations_span input:checked + label:after { content: ''; display: block; position: absolute; top: 0.2em; left: 0.5em; width: 0.2em; height: 0.6em; border: solid #3892D3; border-width: 0 0.15em 0.15em 0; transform: rotate(45deg); }*/ /*CSS For advanced search switch*/ #sm_top_bar_advanced_search { display: flex; padding-top: 0.8em; padding-left: 1rem; } #sm_top_bar_advanced_search label { cursor: pointer; vertical-align: middle; padding-left: 0.2em; } /* #sm_top_bar_advanced_search label:after { content: ''; position: absolute; top: 0.25em; left: 0.3em; width: 0.85em; height: 0.85em; background: #fff; border-radius: 1em; transition: 0.3s; } */ #sm_view_access_public{ background-image: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%22-4 -4 8 8%22%3E%3Ccircle r=%223%22 fill=%22%23fff%22/%3E%3C/svg%3E"); background-position: 0; transition: background-position .15s ease-in-out; background-repeat: no-repeat; border-radius: 9999px !important; cursor: pointer; width:2.25rem !important; height: 1.25rem !important; background-color: #161e2e!important; border-color: rgb(156 163 175) !important; float: left; } #sm_view_access_public:checked{ background-size: auto !important; background-image: url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%22-4 -4 8 8%22%3E%3Ccircle r=%223%22 fill=%22%23fff%22/%3E%3C/svg%3E"); background-position: 100%; content: '' !important; } /* #sm_top_bar_advanced_search input:checked + label { background: #bada55; } #sm_top_bar_advanced_search input:checked + label:after { left: calc(100% - 5px); transform: translateX(-100%); } */ @media only screen and (max-width: 1300px) { body { font-size: 0.7em !important; } @media only screen and (max-width: 1150px) { body { font-size: 0.65em !important; } @media only screen and (max-width: 1080px) { body { font-size: 0.8em !important; } #sm_top_bar_action_btns { width: calc(100% - 2em) !important; } #sm_top_bar_search { width: calc(100% - 2em) !important; } @media only screen and (max-width: 600px) { #sm_top_bar_simple_search { width: 100% !important; border-right: 0em !important; } #sm_beta_smart_date_filter { width: 100% !important; padding: 0em !important; } } } } #sm_top_bar_advanced_search label:after { top: 0.2em !important; } #sm_top_bar_advanced_search label { width: 2.2em !important; } .save_sm_editor_grid { margin: -0.2em 0.45em 0em 0.1em !important; } } /*Scrollbar CSS*/ ::-webkit-scrollbar { width: 0.95em; height: 0.95em; } ::-webkit-scrollbar-track { -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3); border-radius: 10px; background-color: #fff } ::-webkit-scrollbar-thumb { border-radius: 10px; -webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3); background-color: rgba(0,0,0,.1) } *:fullscreen *:-ms-fullscreen, *:-webkit-full-screen, *:-moz-full-screen { overflow: auto !important; } .sm_ui_dialog_class { background-color: #fff !important; } /*Code for sorting icon*/ .handsontable span.colHeader.columnSorting:before { font-family: dashicons; background-image: none !important; font-size: 1.2em; color: #6366f1 !important; line-height: 0.9em; font-weight: 600; position: initial !important; } .handsontable span.colHeader{ padding-top: 0.25em; } .handsontable span.colHeader.columnSorting.ascending:before { content: "\f342"; } .handsontable span.colHeader.columnSorting.descending:before { content: "\f346"; } .smSelect2Drop { box-shadow: 0 6px 25px rgba(0, 0, 0, 0.8); } .handsontableInputHolder .select2-selection__rendered { /*line-height: 36px !important;*/ height: cal( var(--row-height) ) !important; /* overflow-y: scroll !important; */ } .handsontableInputHolder .select2-container .select2-selection--single { /* height: cal( var(--row-height) + 12px ) !important; */ height: var(--row-height) !important; } .handsontableInputHolder .select2-selection__arrow { height: var(--row-height) !important; } .handsontableInputHolder .select2-selection__rendered{ word-wrap: break-word !important; text-overflow: inherit !important; white-space: normal !important; } .sm_click_to_copy { cursor: pointer; } div[aria-describedby="sm_inline_dialog"] { overflow: visible !important; } .htSelectEditor { -webkit-appearance: none !important; } /* Advanced search */ /* #sa_smart_manager_main .select2-selection__rendered { line-height: 31px !important; } #sa_smart_manager_main .select2-container .select2-selection--single { height: 35px !important; border: 1px solid #d2d6dc !important; } #sa_smart_manager_main .select2-selection__arrow { height: 34px !important; } #sa_smart_manager_main .select2-selection__arrow b { border-color: #d2d6dc transparent transparent transparent !important; border-style: solid !important; border-width: 5px 4px 0 4px !important; } #sa_smart_manager_main .select2-search__field, #sa_smart_manager_main .sm_advanced_search_select2_dropdown{ border: 1px solid #d2d6dc !important; } */ #sm_advanced_search{ font-size: 1rem; cursor: pointer; } #sm_advanced_search_content { float: left; padding: 0.7em; padding-top: 0em !important; } #sm_advanced_search_icon{ margin-top: 0.7em; color: #fff !important; } .handsontable .manualColumnResizer.active, .handsontable .manualColumnResizer:hover, .handsontable .manualRowResizer.active, .handsontable .manualRowResizer:hover{ background-color: #6366f1; opacity: 0.7; } #sm_editor_grid{ color: #4a5568 !important; } #sm_nav_bar .select2-container--default .select2-selection--single .select2-selection__rendered{ font-weight: 700 !important; } #sm_nav_bar > .select2-container { top: 4.1em !important; } #sm_nav_bar .select2-container--default .select2-results__group{ text-transform: uppercase; } .select2-container--default .select2-selection--single .select2-selection__rendered{ color: #4b5563 !important; } .handsontable td.area-1:before, .handsontable td.area-2:before, .handsontable td.area-3:before, .handsontable td.area-4:before, .handsontable td.area-5:before, .handsontable td.area-6:before, .handsontable td.area-7:before, .handsontable td.area:before{ background: #6366f1; } .handsontable .wtBorder.current{ background-color: #6366f1 !important; opacity: 0.7; } .handsontable .manualColumnResizer{ width: 2px; } .handsontable .manualColumnResizerGuide{ display: none !important; } #sm_pro_to_lite_msg{ margin: 1.5em; } #sm_beta_json_editor{ min-height: 20em; } #sm_beta_json_editor button{ background-color: inherit !important; background-image: url(jsoneditor/img/jsoneditor-icons.svg) } .wp-switch-editor{ padding: 3px 8px 4px !important; } #wp-sm_beta_lonstring_input-wrap input{ padding: 0 8px !important; } #wp-sm_beta_lonstring_input-wrap .mce-caret{ border-top: 6px solid #50575e !important; border-right: 4px solid transparent !important; border-left: 4px solid transparent !important; } #wp-sm_beta_lonstring_input-wrap .mce-btn-group:not(:first-child){ border-left: 1px solid #d9d9d9 !important; } #edit_product_attributes button, #edit_product_attributes input, #edit_product_attributes select, #edit_product_attributes .chosen-container, #sm_view_name, #sm_beta_add_record_count{ border: 1px solid #d2d6dc; padding: 0 10px !important; } #edit_product_attributes .chosen-container{ padding: 0!important; } #sa_smart_manager_main .modal-body input[type="checkbox"]{ border: 1px solid #8c8f94; padding: 0!important; } #edit_product_attributes select{ padding: 0 24px 0 8px !important; } #edit_attributes_toolbar{ margin-top: 2em; padding-top: 2em; border-top: 1px solid #d2d6dc; } #sm_beta_json_editor ul.jsoneditor-menu button{ background-image: inherit !important; } #sm_beta_json_editor div.jsoneditor-contextmenu ul li ul div.jsoneditor-icon{ margin-left: 0px !important; } #sm_beta_json_editor div.jsoneditor-contextmenu div.jsoneditor-separator{ border-top: 1px solid #e5e5e5 !important; } #sm_beta_json_editor div.jsoneditor-contextmenu ul.jsoneditor-menu li ul.jsoneditor-menu{ height: auto!important; } .sm_beta_dashboard_select li{ margin-bottom: 0px !important; } input#scheduled_for{ width: 100%; margin-left: 1.4em; } input#sm_add_title{ width: 100%; } .sm-column-title-editor-icon{ float: right !important; } .sm-column-title-editor-icon svg{ width: 1.25rem !important; height: 1.25rem !important; margin-top: 0.05rem; } .sm-column-title-input{ background-color: transparent !important; text-align: center !important; cursor: pointer !important; } .sm-column-title-input-edit{ background-color: #FFF !important; border: 1px solid #8c8f94 !important; cursor: text !important; } .sm-column-title-input:focus{ box-shadow: none !important; } .sm-column-title-editor-icon:hover{ color: #6B7280 !important; } .sm_docs_settings_link{ display: flex; padding: 0.25em; border-radius: 50%; } #sm_nav_bar .select2-container--default .select2-results__option--highlighted[aria-selected], .select2-container--default .select2-results__option--highlighted[data-selected]{ background-color: #0073aa !important; color: #fff !important; } #sm_nav_bar .select2-dropdown--below, .select2-dropdown{ box-shadow: 0 1px 1px rgba(0,0,0,.1) !important; border-color: #ddd !important; } /* Dropdown Content (Hidden by Default) */ .sm_bulk_edit_dropdown_content { margin-top: 1px !important; border: 1px solid #5850ec !important; border-bottom: 0px !important; text-align: left !important; } .task_title{ margin-right: 3.5em; } .sm_bulk_edit_content, #sm_add_title{ border: 1px solid #d2d6dc !important; padding: 0 10px !important; } .privilege-settings { color: #9ca3af !important; } .sm_beta_dropdown_content.settings { margin-top: 1.6rem !important; right: 0 !important; } #sm_view_access_public{ background-color: #ddd !important; } #sm_view_access_public:checked{ background-color: #5850ec !important; } #search_content_parent:has(#sm_advanced_search){ width: 35% !important; } #sm_custom_views { padding-right: 2rem !important; } #sm_dashboard_select + span.select2.select2-container.select2-container--default { width: 20em !important; } .sm-advanced-search-select + span.select2.select2-container { width: 15em !important; } .handsontable thead th { height: 50px !important; } /* dashboard select2 css */ #select2_childs_section .nested-list { list-style-type: none; padding-left: 0; margin: 0; padding: 0.18rem 0.18rem 0rem 0.18rem; } #select2_childs_section .select2-child-item { cursor: pointer; padding-left: 1rem; padding: 0.375rem; margin-bottom: 0.125rem; padding: 0.3rem 0.3rem; } #select2_childs_section .select2-child-item:hover { background-color: #0073aa !important; color: white !important; } #select2_childs_section .select2-child-item.selected{ background-color: #ddd; } /* Select2 childs floating box */ #select2_childs_section { position: absolute; background-color: #ffffff; border: 0.0625rem solid #ccc; border-radius: 0.25rem; width: 15.6rem; box-shadow: 0.31rem 0.31rem 0.5rem #ccc; z-index: 9999; display: none; max-height: 10rem; overflow-y: auto; } #sm_nav_bar ul.select2-results__options.select2-results__options--nested { display: none; } #sm_nav_bar .select2-results__group{ cursor: pointer; display: flex !important; align-items: center; justify-content: space-between; gap: 0.31rem; } #sm_nav_bar .select2-results__group:hover, #sm_nav_bar .select2-results__group.focus{ background-color:#0073aa4a } #sm_nav_bar .select2-results__group svg { transform: rotate(-90deg); } #sm_nav_bar .select2-group-text{ text-transform: capitalize; } #sm_nav_bar .select2-results__group svg { stroke: rgba(0, 0, 0, 0.5); transition: stroke 0.3s ease; } #sm_nav_bar .select2-results__group.focus svg { stroke: rgba(0, 0, 0, 0.8); } assets/images/chosen/chosen-sprite.png000064400000001032147600337620014067 0ustar00‰PNG  IHDR4%§û^áIDATHÇí—±kSQƯ .-Á‚ÅÍ=ò$èb…oÉ$((T¡Hw»¨*ˆÉý­Å"nupA—@ PˆApqŠJ$p!PôáM1µœ.ú½åòÞ;çÇÇ=ïã¾\D….Y±n0 œ@}ŒDMFß ´Ê>Fb„1¢¼Ä Œcìˆ !6È1r®ûbš%GÙÁË„I¬‘J(v°éõfFyOœ ÔÃH4B cŒ1ø}»Ê^³4£ü5FoÎï¨G£X×Ùv¥U€nÌ(¾R¼sëp›·ƒñvÆó*£”8sP•á¬¼*íc÷OÝTQWŬ©¡j1QóH}™’²ÔT’É+‚´ª}™’Ö•dÉ/´¢‰L¹LcùF6”Ë”Ë7‚Ô,9ʼ1IkJ®(õdJj„ Lc™^ Šz*"Huíj)ü׿¤öË,?<îŒá._1Œa¼ê‰ÙÆâ÷Ø°xÓ /bñ}ûT!Äóñ“Îi?O£u¦ oc\ö½ˆùý“eN‡Æøc:ñ99—\@sü uZ›ÇÚ q“Ÿ|ypÂkê®aÑøÈçâø²å6àñB|Ɇñ1 ‹ÛGñ†ÅgqÑu‡ï­£põ+ÿ€ý[ç*yÒêéIEND®B`‚assets/images/chosen/chosen-sprite@2x.png000064400000001342147600337620014445 0ustar00‰PNG  IHDRhJýqÙ©IDAThÞíš¿oÓ@Ç#ÁP † º‚ÂÈæ?!dèÔ…Ýsft⇿'R§J0µ#[þ„üɈˆ¨+–¬é‡ç³ëäÎöP×íåî{R†W%ö§ïÝ÷Þ‹Óë1“ e,ƒJ4 hØã'ÂYÑ2NyâH%?¤/‘4Šò L¤j„[Ñé -Î85HÜq‘øâH‰†“°Æqȱ’s̬Ú6„C+Ù%0°Öú`QW™X´šª÷O­5§Ö Û]:Ú¿ú„hßÚø€IgÒî²¢¿Î7¢oiÀ£ª× 1n» ´‹°fŠÝÜHnÚ' ì!-º² hjhØl®n­ázH“›ØA÷öojŽâQÅFEæ··ƒÛá¬hH '‹‡wÔ²tŒc •8ÍHÛª/‘4Šò L¤j„Ùø`$´8ãÔ qÇiDâ‹S %NÂÇ9 ÇJÎ1Sp̶;XÝk}\kN[Ž[t½ÏËËËËËËËk›%úÑsúF–ßpª²3ÛKÑX•ÚR~Ñã¯îÉCœgYŠÆ¬€ä,Û9øùæA%w;8QûhÎ HíŸú,à]nì€pùþYÝß>¾$Ïc ôÜ) Æ’“ K®hw~ˆ‡SØʼnšq³íüPý*îwÌÒ¶ÕÁšªƒõXì–y{$¿«ƒu…%»&•ZÕäàä'¼ˆöðóì(Ë8âØœ­©Öœ®béÒáŠ5R6àemP¾0Ï<±Fª-FÄ iî’#ß ­‘z®Hõ|¿Yþ¤JZ\NÆÓIEND®B`‚assets/images/jqgrid/ui-bg_flat_0_eeeeee_40x100.png000064400000000334147600337620015752 0ustar00‰PNG  IHDR(dÿÀ§bKGD:2>£ pHYsHHFÉk>IDATHÇcx‡0Œ Ž Ž Ž Ž Ž Ž Ž ¢èCÊ@j×â%tEXtdate:create2015-05-24T07:35:04+00:00ù€vû%tEXtdate:modify2015-05-24T07:35:04+00:00ˆÝÎGIEND®B`‚assets/images/jqgrid/save_img-blue-16X16.png000064400000002165147600337620014557 0ustar00‰PNG  IHDR(-StEXtSoftwareAdobe ImageReadyqÉe<€iTXtXML:com.adobe.xmp R}uÛPLTEæñùm­Ü°Òë™ÄãJ›Ö9“Ô„ºáÿÿÿ .ƒtRNSÿÿÿÿÿÿÿÞƒ½YSIDATxÚ´A À@&úÿ7»”-í½#A1’dÌLd ”-i ÁBùx ¾Då“@u™v¢-¾µúNøÔÍZ´ÅáG:xˆõ>uª.E2q«Ç IEND®B`‚assets/images/jqgrid/save_img-blue-15X15.png000064400000002165147600337620014555 0ustar00‰PNG  IHDR extEXtSoftwareAdobe ImageReadyqÉe<€iTXtXML:com.adobe.xmp á’…—PLTE¥Ë熺ào®ÜêóúE˜ÕX¤Ú8“Ôÿÿÿ wµçtRNSÿÿÿÿÿÿÿÞƒ½YSIDATxÚ| À0cbõÿ?ž¶£¬ì@ð¢îTf ‰¨²ˆÑÎPµhŸ9½;·n§ì<Æ—6Ó{z!'ør«#Nׯçyì«ÿà`¼‡µÑS ¾IEND®B`‚assets/images/jqgrid/ui-bg_flat_0_aaaaaa_40x100.png000064400000000324147600337620015721 0ustar00‰PNG  IHDR(d›¿5bKGD3„rˆ pHYsHHFÉk>IDAT8ËcX £ÌQæ(s”I. I˜/ZW˜ã%tEXtdate:create2015-05-24T07:35:03+00:00<'Hu%tEXtdate:modify2015-05-24T07:35:03+00:00MzðÉIEND®B`‚assets/images/jqgrid/save_img-white-16X16.png000064400000035163147600337620014754 0ustar00‰PNG  IHDRóÿa pHYs  šœ9¸iTXtXML:com.adobe.xmp xmp.did:941F2BD2117A11E38A3FB732FE438EAF xmp.did:61406F6202D711E597CEFE4A41AD2D5B xmp.iid:c6a600b3-9d95-d745-85ae-6973b5ac4b6b xmp.iid:655aa43c-b3c2-e743-976c-a0fdb7ecdea8 adobe:docid:photoshop:f7c08fe9-02d4-11e5-91a2-88a5b51fa30a saved xmp.iid:c6a600b3-9d95-d745-85ae-6973b5ac4b6b 2019-05-16T17:15:33+05:30 Adobe Photoshop CC 2015.5 (Windows) / Adobe Photoshop CC 2015.5 (Windows) 2019-05-16T17:10:53+05:30 2019-05-16T17:15:33+05:30 2019-05-16T17:15:33+05:30 image/png 3 1 720000/10000 720000/10000 2 65535 16 16 H—œÝ cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF5IDATxÚbø0 atq>…üÆ ¨n©zðø5€–Ð?!ÿÿy©õèݧIEND®B`‚assets/images/jqgrid/print-white-15x15.png000064400000000427147600337620014347 0ustar00‰PNG  IHDRVÎŽWÞIDAT8­Ó=JAÄñß.£™Â&"¨¡·<Š¡xA¼€‡ðfæ‚™Á†‚^@püØ2p‚f™qv‡©¨_½®?Íã5i”dÑ;ÇzGî×] wlt€fØ,qG`i5½¨—ªâ|€£ï?}cŠgD’Ë$ó¬®y’‹$$ÙIòÓr•ä¡În±oõ¡ÏqƒÇ:{Xa´"D~*êQÛ`_p×Ò;ÁÞ¢Ùšâ´¥wÛl!+Üc«ð^—È}`·¨g•¿Åz+Ì`‚ãȤ¾Sf†û´MÃ>ÃZè«£ß_¿ªÍ±RZªIEND®B`‚assets/images/jqgrid/print-15x15.png000064400000000653147600337620013232 0ustar00‰PNG  IHDRVÎŽWsBIT|dˆ pHYsýýâ{ƒ“tEXtSoftwarewww.inkscape.org›î<(IDAT8½“=NÃ@…¿ÙØ A ?¡ -â`‰‹P"²‘À!¸¢¥¦ˆ€HH¡§Á¤IUIDATÓÅÂ!„`„ÑOGô ŠÀã‘W P€xfHÁü»+¯Åñæ‘ð§¹ÈA6²‘t¤ÁÆ'^ñŒÜbÐvôEêÑÕ¨¢”ÿ™œµ‘º²J%tEXtdate:create2015-05-25T05:46:28+00:00p=‘¨%tEXtdate:modify2015-05-25T05:46:28+00:00`)IEND®B`‚assets/images/jqgrid/ui-bg_highlight-soft_25_E2EFF8_1x100.png000064400000000500147600337620017405 0ustar00‰PNG  IHDRd˜ÞtbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk>~IDAT(Ïå1 ÂPDSx.‘ÓÚ™.]º0€¢)’ï—•¬Å†à ¬;ÃìÀpÜÆì±ü &^Ì"ÐÙ(«¸0Š@Ç]”vâ& Z’ã* ’lOM¹c½D÷‘[M;*ú5·–Ÿ%Ÿ ÁÛ]´Æz›Ä™ÄóÛ+ý8Þ¡>NY%œz}%tEXtdate:create2015-05-25T05:35:08+00:00ð8U%tEXtdate:modify2015-05-25T05:35:08+00:00I€éIEND®B`‚assets/images/jqgrid/ui-bg_glass_65_C1DDF1_1x400.png000064400000000516147600337620015577 0ustar00‰PNG  IHDR°ªAÏbKGDÿÿÿÿÿÿ X÷Ü pHYsHHFÉk>ŒIDATHÇíÏ¡Q…ásN3Ê&Ùš1#è®×ÐvF¤n]‘¢+FöK·I¢1” îlDO`'}áO?ªúZÆ0Æóuêªé¾2qÏŒ}1Ç iË ¦Ò‘‘s)a…”(e!°’—ŸÆ” éÆ6réÀˆÎû¦ŠO®1è õÓÆó;Þéí!M¼ý¡™%tEXtdate:create2015-05-25T05:34:35+00:00ðŽ5H%tEXtdate:modify2015-05-25T05:34:35+00:00ÓôIEND®B`‚assets/images/jqgrid/ui-icons_FF5B5E_256x240.png000064400000010705147600337620015010 0ustar00‰PNG  IHDRðØIJùPLTEÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^ÿ[^3ÛYtRNS3P¿‚™/"Uq@f`2Ì !<BHK Z#'1S,…4‡€ÃjÈÏÆ8E¼¸¾|«µ¥Œª¨­²)ýžQ$ï ¢b”J ¯mßœGc?o‘hù@^ñbKGDˆH pHYsHHFÉk>dIDATxÚí] cÛ¶ÉHªé˜’]¹K§±ÖdÎæ%٫뺮Úlmº¤éw]ïÿÿ‘|áp‡‡XÊmã“-ëÀ}<€w( 1$ìº ;ÖFÎ@ïæ%à×?Á ¨ÌÃB,Lh{Œt•šà#¬ðT@Î/?jÔ9 m‘N¯ #€žÎ+`™“`í·«àIç ’Û_º-sâÍ´U0 æM¤˜[ˆ÷ s ð4`x °“šè#€ ÌD<¥~ Ø€K½ Ð.4ü]`ç¸éŽPDDDDDDĈqéžàŽý „Ek@÷„žA³~Â*ðÍ° !Yú ”XÀ`hv3\LX”Ot©J2bí··Ø“l™QI<§‹À ” 6À-XØlÖˆÖ6˜HÌÒ|=j×`EâiqÿùÞCv:„qÝï»C?Ç?èšËïxô,ør*tÈÝ»}|;kP 4ðáê‘dàYÌÓÁ•f¯ÀÛKª¿~[ >‚X:+ŒiÀ«’ŽÄ†QV9\‰ÔÏÃeÀ'€À¯AøtOSÁ:7™³2³Ó½üYsxMÈÛ„ÍBã–Óý&®¡‹zÁ>nÙCþô@‰är@ð‚*a­Óºë»À%Ÿ¾MFDDDDDDÜTôß–ÚÓÍH,»ÑÝEÚüÐàRU ún ب<ÏÖV- @é/NmàÕ©Ìîà¬Ëû¼‘¬Hwý–ø–*à+¬ñ#ðò$o­e³{â% °7\XÍÌÇ€—¿Ä2ݘ~0ÂÙ&n°µsbA,¶Dãì‘ ±Aì©V†Iéô|‹ ¸Og°ðæ™é´‹… °7Ày 7Jf³›ëÚ:_¡w^ÖH v{/Oœ9ÃÞÍ<ÅÀ„Y€`+ôÈ HRÙ°šÁ¡õ[®‘?ÙÞ ›ï à™Ç=°ëçc""""""F˽‹sG…<*k9c»ŽE¸8è–½£þÀàèÏzfm£õr¢1Í N‘­ìø¾ºØnqÓw¬Ö&=O‡\}K` #úôö2ûà~¾»Lò|?€m>Ã\¯fíõ͹à:}ë4ᦋ€Äó¦{â)žn[’ þÌ°E K Y¸ ØDÁÛ‡-¥Ñ ïž+´Kl=¼ÓƒššL`Ñ™ù|¿%¶n aü Þ挋NÉ#è5´ (4ÿàŸ?º†¸îúEDDDD\o¤WüFfq;À·\E½á_¢ÿ˜–¬Ë,¦÷•W!%…zE!Fµ¶. ¯(USHQ0dÆw)T ó ë8#p,ÝxôB·×KýèÌ *Œx–ŠXßÆE€eù”™€ÿ K솎%mKØÀX~sÇFEÃè~…†îÑèÏtdcÉa¡Iµ•Ð1À²Af4æ¯ÛdHøcÈGùS»B`ù¤0àwev`€ÓÑí"Ñ{ É è‹.úGDDDDÜ,dÊOÈ6Ïk"qk¨ÖMeãfS_Ž÷žìU®’KÅŒ&g~>n‰ ·HèŒ})î ‡LÅíä„F%8(Š)röÊÏ!¥[4统qQk¸0ôm[Le¶²µ_§7­žä0™@>1 X0A÷ÚZ…êÀÜVc¤E‘V „Ì  Lt¢kÜ3EJ´®44àZﮊÓN`rtô>`–Ë¥ÿ ö A©ŽHBLHÕ@“ðc—ÀÐUq=j ÑâãòôcMÀÑû¿2¸sçÛï–ÉJ€ÒÿCL€iR õNQŠ¦ýàŽ‚Ó•ê0=ÔóYiÿ-ª|4ÅV§ ”]àî]Ü–B^ùÞž•¯_H€Òÿö½Ý$ä€<’$‡ aàääÄ=À¡d@ê (ZÊAp_}ÿ~sਈ:èN{DC>ÂóóÅmù^¸ ƒ¨ÂÓÓSÐ&Ê, ;œNå›î¥ì&à´B} Éáƒ<_AŽŸB]HøuùÂúN(B0×ú{h‹û¸1¹IKµ€ì°Ds‰˜ jŒ‚Ñ'ó¼½ äMý¹Ó8¡.€Ó«1°h3·df}mq•ï ˆ„nƒU{ææL¦oÝÀ z \=?@ ((Äöe‹|=ơ麄³C¯i¥ý­ê1r<|èOOÁ;¯ `ÛúHép÷Qy›zÔˆu°ÝÆØóZž·çV®ÉþƲ¿!í)¼÷5m“Cò¶õÏ2ÍÀLy‘gù;²Éó½Ö‘³R‘éãjW¼a@ž¬@VšLÏ&W®àÆru=Z åÌ¥í½=UÜÎñ5} ð˜è¯¥­¿òÍÛè7±;b(œ‡ßÊ×nP&¯s†òkƒ4¶¿çâ÷8¾Í¥²0åãÉ1’Uû W¡vök¹18dq²±‹T»ŽÕŒE]qH8 âÉý§ÏîÝGÓF™´ï ·ÇKÀàòõ'¬ rý‰ŒƒOrêû¶rí̧öú6"fp°TÂ^3c³ç" ÀŸá¡nÔMÙ…-à/âñW=¥tJ,à”XÀ)±€…{ÈP Rm|Kêû´’>mXó8v5hýÂ<¹ÿÑù²ë_{ꘀÊY§Fþ|&_G;&Œ>^Ê綾ýW⃀&ºKûæ(“©81âEB@F&ú·;"Lüù'wfwþñE-6Åío&/Ì«'X¨e,>~¬eeûí|§•A ö¥Â=) d’ûQÝ`}P[Œ„«K¨îNŠóË‚èÏøë/ž~)‡¿ù—O[dÿO=ç3Eçl5'YÙ$?ñè´7‘mßã“TzÕ¦.\®Ü.Úó•` WE‡ßð"""""v€)ž˜V®œ²<ÏõÇKÞZX.Exï~Ч)¬åûߚϹšÂW_}ý5|šs ô/!?¬îÁ“'poÕ¤“ýÍtC3ßÐÊô@¼Q¿)‡ÙtúÂ`Àÿåb!,dY9Š6A2°¦Þø‰ö¼þ©ð/튮§²€ nÚt²TK>ÔÁ«Î#]ÇL;zq°JÐÁ•rŒ×ð²[ö \-t†Ò½ü5 @ðÍ·ÏŸûnÏT@±À+;”cË”“QhÃC*ª©ŠTûÚ™šA×Vr”?©fŒ?ÍÇýæ½ –QÂ1ÀT`»†} HËkÿ¸ñ,{ÍVZË‹T”Ï›Ô?I̯uå¨QK“LMée͆î~ÀîqôêÕŠ«ôyËm0Û9Ñ S¼;úõ÷jˆùþõ®5 Þ¼i…šQ÷‡]7k0ÜUêÞ­…×ÕG½kXŸð‹3#¶·ólYò¿ì_Цx£¨ÆÞjÞ¶9ˆÛ`ó# M [z ¨ KuO_zË¿DÜ­¾‹*§®kOJÚ(7•ünòÎ\eÕ I€TýƨÜlÃ/ŒUúëåÅÂÔ߶uw‘.°~ïäÛ;#Ãr‡Íõ.ܤ˜§8 ëo# 5L¦Üh>1Âiƒ€ –Ëåpž®VØM?é/u7ÅÞ0ì X@õÐL©Ã+MÀ+”©ð€Ó{ÃFktÐ{ªÅ§89‰0`ðÓû. Ä€CàR+\µà¢/°Žt ÀR±ýÝç; ÖTÓ²ðòÇ]¶aL³—Œ|âefÄ‘Ùè ‰>ØÛ£úƒG¼|€P`P¦¥8C1KÕ›‘A…Ì<¯2¹ÃÛ‚øÎK†r…l@L Lª´¶Íåå‘êÑ 8@ƒE>`nÆ„¼˜PNÔ,ÿÌp›ë ˜€™E§°Æ†¸Íÿ°ZÀF lÃŽ;¾ ðùŽßF€Ýú7þçÈ®;Òÿ øés´wSz)g7è{rÕs¤ðSžgÈ‹—–(ß„~ÿAWytXÃÿ$íNV¬ÌôÉR½_¿›<6¤p.ÄO…8ÇO[¯OdDk>_«™OäO»}ŽÍýìJSž¨×d¤îmVï›?ÓW(_€Úmà  üj´ä°ù~=H IÔF>T/ýý{*]IGJ@içøŠ«qamìNF|Q¡5ñŽòè0+ï ´çE£S8™:¸vƒ`p~vŽ‡ýj:B‡¤°åÿp96äoäõys%Ÿšˆˆˆˆè ú|@H¦›¨ºÊ]ëë+‡@ŸÉt]W¹k}}åàõ‡¯7‘éFÊ®r×úúÊAÐçÞêùBù†µ\m¥-Ó_µ2PY8Óßêô·ÎúxÓÕŽN’.hû~ÞÁÐ@+7…ˆz5ø⯇òót–_/‘ÛÒñê™ý/í?ÿü³0ÛS>‘¼)Æ‹¬zïi0nË/˜Bþü„€`{DóëW•þÛ#`¾ƒÎB€ío…‚õ[,ÄgêÛFVЀpPß¾ÕÅÄC]Bz»” ù©,Xµùƒ ÏXµfÔƒ¤€ÊîAÕ:HÒúé k¦7ü¸dÕZ9ˆ¡oc}o£]å0†vdú:R]å0†veûºÒ]刈ˆˆˆˆjÇáÒäуüÿÀ°| ?å +(üúOÇê+ Á#‚ ysÉäßßÑnüpÓïÛFru<à.HȺotMÈÿ3hëÐë}•ô߆P}¯”þ¦”ÛÛË—ƒ€víÍÔ×àP}mÇ€¬©?¾â•þWÇúZ@•ÿêêß×®¼þ}ïý¯í€ÖÿêØ@к@éÝüFDŒÿ´ÀŠš‚l»%tEXtdate:create2015-03-11T14:59:12+00:000©i«%tEXtdate:modify2015-03-11T14:59:12+00:00AôÑtEXtSoftwareAdobe ImageReadyqÉe<IEND®B`‚assets/images/jqgrid/ui-icons_3892D3_256x240.png000064400000010705147600337620014730 0ustar00‰PNG  IHDRðØIJùPLTE8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’Ó8’ÓŸCYtRNS3P¿‚™/"Uq@f`2Ì !<BHK Z#'1S,…4‡€ÃjÈÏÆ8E¼¸¾|«µ¥Œª¨­²)ýžQ$ï ¢b”J ¯mßœGc?o‘hù@^ñbKGDˆH pHYsHHFÉk>dIDATxÚí] cÛ¶ÉHªé˜’]¹K§±ÖdÎæ%٫뺮Úlmº¤éw]ïÿÿ‘|áp‡‡XÊmã“-ëÀ}<€w( 1$ìº ;ÖFÎ@ïæ%à×?Á ¨ÌÃB,Lh{Œt•šà#¬ðT@Î/?jÔ9 m‘N¯ #€žÎ+`™“`í·«àIç ’Û_º-sâÍ´U0 æM¤˜[ˆ÷ s ð4`x °“šè#€ ÌD<¥~ Ø€K½ Ð.4ü]`ç¸éŽPDDDDDDĈqéžàŽý „Ek@÷„žA³~Â*ðÍ° !Yú ”XÀ`hv3\LX”Ot©J2bí··Ø“l™QI<§‹À ” 6À-XØlÖˆÖ6˜HÌÒ|=j×`EâiqÿùÞCv:„qÝï»C?Ç?èšËïxô,ør*tÈÝ»}|;kP 4ðáê‘dàYÌÓÁ•f¯ÀÛKª¿~[ >‚X:+ŒiÀ«’ŽÄ†QV9\‰ÔÏÃeÀ'€À¯AøtOSÁ:7™³2³Ó½üYsxMÈÛ„ÍBã–Óý&®¡‹zÁ>nÙCþô@‰är@ð‚*a­Óºë»À%Ÿ¾MFDDDDDDÜTôß–ÚÓÍH,»ÑÝEÚüÐàRU ún ب<ÏÖV- @é/NmàÕ©Ìîà¬Ëû¼‘¬Hwý–ø–*à+¬ñ#ðò$o­e³{â% °7\XÍÌÇ€—¿Ä2ݘ~0ÂÙ&n°µsbA,¶Dãì‘ ±Aì©V†Iéô|‹ ¸Og°ðæ™é´‹… °7Ày 7Jf³›ëÚ:_¡w^ÖH v{/Oœ9ÃÞÍ<ÅÀ„Y€`+ôÈ HRÙ°šÁ¡õ[®‘?ÙÞ ›ï à™Ç=°ëçc""""""F˽‹sG…<*k9c»ŽE¸8è–½£þÀàèÏzfm£õr¢1Í N‘­ìø¾ºØnqÓw¬Ö&=O‡\}K` #úôö2ûà~¾»Lò|?€m>Ã\¯fíõ͹à:}ë4ᦋ€Äó¦{â)žn[’ þÌ°E K Y¸ ØDÁÛ‡-¥Ñ ïž+´Kl=¼ÓƒššL`Ñ™ù|¿%¶n aü Þ挋NÉ#è5´ (4ÿàŸ?º†¸îúEDDDD\o¤WüFfq;À·\E½á_¢ÿ˜–¬Ë,¦÷•W!%…zE!Fµ¶. ¯(USHQ0dÆw)T ó ë8#p,ÝxôB·×KýèÌ *Œx–ŠXßÆE€eù”™€ÿ K솎%mKØÀX~sÇFEÃè~…†îÑèÏtdcÉa¡Iµ•Ð1À²Af4æ¯ÛdHøcÈGùS»B`ù¤0àwev`€ÓÑí"Ñ{ É è‹.úGDDDDÜ,dÊOÈ6Ïk"qk¨ÖMeãfS_Ž÷žìU®’KÅŒ&g~>n‰ ·HèŒ})î ‡LÅíä„F%8(Š)röÊÏ!¥[4统qQk¸0ôm[Le¶²µ_§7­žä0™@>1 X0A÷ÚZ…êÀÜVc¤E‘V „Ì  Lt¢kÜ3EJ´®44àZﮊÓN`rtô>`–Ë¥ÿ ö A©ŽHBLHÕ@“ðc—ÀÐUq=j ÑâãòôcMÀÑû¿2¸sçÛï–ÉJ€ÒÿCL€iR õNQŠ¦ýàŽ‚Ó•ê0=ÔóYiÿ-ª|4ÅV§ ”]àî]Ü–B^ùÞž•¯_H€Òÿö½Ý$ä€<’$‡ aàääÄ=À¡d@ê (ZÊAp_}ÿ~sਈ:èN{DC>ÂóóÅmù^¸ ƒ¨ÂÓÓSÐ&Ê, ;œNå›î¥ì&à´B} Éáƒ<_AŽŸB]HøuùÂúN(B0×ú{h‹û¸1¹IKµ€ì°Ds‰˜ jŒ‚Ñ'ó¼½ äMý¹Ó8¡.€Ó«1°h3·df}mq•ï ˆ„nƒU{ææL¦oÝÀ z \=?@ ((Äöe‹|=ơ麄³C¯i¥ý­ê1r<|èOOÁ;¯ `ÛúHép÷Qy›zÔˆu°ÝÆØóZž·çV®ÉþƲ¿!í)¼÷5m“Cò¶õÏ2ÍÀLy‘gù;²Éó½Ö‘³R‘éãjW¼a@ž¬@VšLÏ&W®àÆru=Z åÌ¥í½=UÜÎñ5} ð˜è¯¥­¿òÍÛè7±;b(œ‡ßÊ×nP&¯s†òkƒ4¶¿çâ÷8¾Í¥²0åãÉ1’Uû W¡vök¹18dq²±‹T»ŽÕŒE]qH8 âÉý§ÏîÝGÓF™´ï ·ÇKÀàòõ'¬ rý‰ŒƒOrêû¶rí̧öú6"fp°TÂ^3c³ç" ÀŸá¡nÔMÙ…-à/âñW=¥tJ,à”XÀ)±€…{ÈP Rm|Kêû´’>mXó8v5hýÂ<¹ÿÑù²ë_{ꘀÊY§Fþ|&_G;&Œ>^Ê綾ýW⃀&ºKûæ(“©81âEB@F&ú·;"Lüù'wfwþñE-6Åío&/Ì«'X¨e,>~¬eeûí|§•A ö¥Â=) d’ûQÝ`}P[Œ„«K¨îNŠóË‚èÏøë/ž~)‡¿ù—O[dÿO=ç3Eçl5'YÙ$?ñè´7‘mßã“TzÕ¦.\®Ü.Úó•` WE‡ßð"""""v€)ž˜V®œ²<ÏõÇKÞZX.Exï~Ч)¬åûߚϹšÂW_}ý5|šs ô/!?¬îÁ“'poÕ¤“ýÍtC3ßÐÊô@¼Q¿)‡ÙtúÂ`Àÿåb!,dY9Š6A2°¦Þø‰ö¼þ©ð/튮§²€ nÚt²TK>ÔÁ«Î#]ÇL;zq°JÐÁ•rŒ×ð²[ö \-t†Ò½ü5 @ðÍ·ÏŸûnÏT@±À+;”cË”“QhÃC*ª©ŠTûÚ™šA×Vr”?©fŒ?ÍÇýæ½ –QÂ1ÀT`»†} HËkÿ¸ñ,{ÍVZË‹T”Ï›Ô?I̯uå¨QK“LMée͆î~ÀîqôêÕŠ«ôyËm0Û9Ñ S¼;úõ÷jˆùþõ®5 Þ¼i…šQ÷‡]7k0ÜUêÞ­…×ÕG½kXŸð‹3#¶·ólYò¿ì_Цx£¨ÆÞjÞ¶9ˆÛ`ó# M [z ¨ KuO_zË¿DÜ­¾‹*§®kOJÚ(7•ünòÎ\eÕ I€TýƨÜlÃ/ŒUúëåÅÂÔ߶uw‘.°~ïäÛ;#Ãr‡Íõ.ܤ˜§8 ëo# 5L¦Üh>1Âiƒ€ –Ëåpž®VØM?é/u7ÅÞ0ì X@õÐL©Ã+MÀ+”©ð€Ó{ÃFktÐ{ªÅ§89‰0`ðÓû. Ä€CàR+\µà¢/°Žt ÀR±ýÝç; ÖTÓ²ðòÇ]¶aL³—Œ|âefÄ‘Ùè ‰>ØÛ£úƒG¼|€P`P¦¥8C1KÕ›‘A…Ì<¯2¹ÃÛ‚øÎK†r…l@L Lª´¶Íåå‘êÑ 8@ƒE>`nÆ„¼˜PNÔ,ÿÌp›ë ˜€™E§°Æ†¸Íÿ°ZÀF lÃŽ;¾ ðùŽßF€Ýú7þçÈ®;Òÿ øés´wSz)g7è{rÕs¤ðSžgÈ‹—–(ß„~ÿAWytXÃÿ$íNV¬ÌôÉR½_¿›<6¤p.ÄO…8ÇO[¯OdDk>_«™OäO»}ŽÍýìJSž¨×d¤îmVï›?ÓW(_€Úmà  üj´ä°ù~=H IÔF>T/ýý{*]IGJ@içøŠ«qamìNF|Q¡5ñŽòè0+ï ´çE£S8™:¸vƒ`p~vŽ‡ýj:B‡¤°åÿp96äoäõys%Ÿšˆˆˆˆè ú|@H¦›¨ºÊ]ëë+‡@ŸÉt]W¹k}}åàõ‡¯7‘éFÊ®r×úúÊAÐçÞêùBù†µ\m¥-Ó_µ2PY8Óßêô·ÎúxÓÕŽN’.hû~ÞÁÐ@+7…ˆz5ø⯇òót–_/‘ÛÒñê™ý/í?ÿü³0ÛS>‘¼)Æ‹¬zïi0nË/˜Bþü„€`{DóëW•þÛ#`¾ƒÎB€ío…‚õ[,ÄgêÛFVЀpPß¾ÕÅÄC]Bz»” ù©,Xµùƒ ÏXµfÔƒ¤€ÊîAÕ:HÒúé k¦7ü¸dÕZ9ˆ¡oc}o£]å0†vdú:R]å0†veûºÒ]刈ˆˆˆˆjÇáÒäуüÿÀ°| ?å +(üúOÇê+ Á#‚ ysÉäßßÑnüpÓïÛFru<à.HȺotMÈÿ3hëÐë}•ô߆P}¯”þ¦”ÛÛË—ƒ€víÍÔ×àP}mÇ€¬©?¾â•þWÇúZ@•ÿêêß×®¼þ}ïý¯í€ÖÿêØ@к@éÝüFDŒÿ´ÀŠš‚l»%tEXtdate:create2015-03-11T14:59:12+00:000©i«%tEXtdate:modify2015-03-11T14:59:12+00:00AôÑtEXtSoftwareAdobe ImageReadyqÉe<IEND®B`‚assets/images/jqgrid/ui-bg_flat_55_ffffff_40x100.png000064400000000320147600337620016045 0ustar00‰PNG  IHDR(dÜO×bKGDÝŠ¤ pHYsHHFÉk>IDAT(Ïcø £ä(IUÊ‘ò³Û.{%tEXtdate:create2015-05-24T07:35:04+00:00ù€vû%tEXtdate:modify2015-05-24T07:35:04+00:00ˆÝÎGIEND®B`‚assets/images/jqgrid/ui-bg_highlight-soft_100_f6f6f6_1x100.png000064400000000425147600337620017611 0ustar00‰PNG  IHDRd2×ÙÿbKGDÿÿ«1Í pHYsHHFÉk>WIDATÓű @P€á?µ$jS(Ô¢SkÌ¢F±…J$æxwïNÄ|ù¸{>Úr—øƒïøŠwxŽ]Ø„ÕXB܈#±@tF4ENdA¤B2Bøñ á>¡ZE®<¾%tEXtdate:create2015-05-24T07:35:04+00:00ù€vû%tEXtdate:modify2015-05-24T07:35:04+00:00ˆÝÎGIEND®B`‚assets/images/jqgrid/ui-bg_flat_75_ffffff_40x100.png000064400000000320147600337620016047 0ustar00‰PNG  IHDR(dÜO×bKGDÝŠ¤ pHYsHHFÉk>IDAT(Ïcø £ä(IUÊ‘ò³Û.{%tEXtdate:create2015-05-24T07:35:03+00:00<'Hu%tEXtdate:modify2015-05-24T07:35:03+00:00MzðÉIEND®B`‚assets/images/visualsearch/search_glyph.png000064400000000304147600337620015167 0ustar00‰PNG  IHDR s;‹IDATÓ@± ‚@þßÝï¨Ö ‹àR÷†]\$ÊI|µ¡ÁSÐAõî¾mÈ“}òHRú€gORrèOóÖÈIJ„bZ¦‘#åci ö–^nª$Y"ÚHÉWs©%å{G ¨p$e©3½Óé —‘Âuè~Æ´g\GñÞ;çü܆ÇNp6Ìáqå»æS(}îð8€îeÿü5Ç/YW¡ZlÖ]ƒŒ¦#Ìüp³pI›lIàPA…RT’Þù‚Ò·×Î z•ýó×éï®0¥aˆuIEND®B`‚assets/images/jeff-smith.png000064400000006370147600337620012073 0ustar00‰PNG  IHDReaø3Ÿë¡PLTEÊ÷—‘ˆéééçé茌ŒîààðóóÛÑÑëéçäáß---Ýàß#WG8-Û´¬ÒÌÂôôô®«¥ûùùÙÔʲ—Š¦‹¥yhòï㬦œ8Ih¿‘ƒË¡‘qe_@1$Óª“i\©°µ‘š ¸³«—˜¿¾¹¶‚qÂÆÆ¡–:)Ÿ£§0%—¢¯Á¦›Ê°ªIZw568`pŠzv ,,,DC?öôèQQN[YV”aIÆÕÕy†›EIMŠU@}T;rK0Íš‚ZelLKGcE+ÎÜÛN/"ºÐÏÿÿÿ©ÈÇùÅÅÊŽqOV[úÓÓí¿§¡qU—M9*tRNSþþ/ÈþI¦t_žÖŽ‹ˆ !¹±Šw ݵ³pVUD3ÌÄ«›ˆ`P@/4Á d ÜIDAThÞì•koÒ`†U6p?èÏh¥kk)´6o³7) iëRZH´!ƒ.C‡E1šè¯ö~ÚrðƒŒyø¶û=¬YÊsñ¹r©K]êRçëz¥R­V+×ï\ùOªìÕv,t¸SÛ«ükľ,åó~­ú½âwÚ¿]ùG YÞ—÷‹½®ÃýÃ\µÊß3v€€@ÀE °’±â\ÿ+ÆÛ!J™¦ 7N ÂÆÙû+GrH £Ûn·Ÿ<‘´‡%lmíüqØöÀX`´‡Ýε™’@k×:]8Pø¶Ýø³hÕä¥4±}¤'ã¾Ï¹ÏÙ<ét ­Jâö@nî‚Pº¢ií]‡‘fYêãçɬs°0/—«vñQRB°@&~6g8ã,‡37IfC‘KŒ&ïܼ°'+ÉÝ$„3J¸#¡Á¾¦áÈÀ\,'€¬$íú0Ï9sÜÄs]×A‚€B!IyrŠ î\,hµuˆüää˜3Oì‰=Ýs8¸v¡~¿›ÏRÆK†…Ϥüa«™V)Þ/oð†É´ô¥€QüŒ£òŽKôZ±òk› ½# P ò”¤…#´zvÐðsÍ$¼¹®[[¤^†€)¾TD®”«8¨wÚëê9óçma aÜ5ŒóA?jù,^–XIY9Ô$ŒmÛ*`<ö? ñåÓÎTA¤†„-)‹¼OúSz˜ d¡Ç0ÙÒãÅ(8ç:SËgR!™P ´š“ÀîõÉË41¦ÓÖĶt—c¾ù'O îºöÎéÖElD¨C©s60¾0aKuÆ\Oу)€hMø2ï¹JqNÏÜ(Æ#vk¸›Ì‡aÔ»Šn*9Cõ:0ïèA`ºÈË‹ …–S¯ž“{¨ì/*ç×o>Ï&ªâ2æ±ñÇ·g©ãgüçih™Ìß•ëõ{"ô² 6æÿÌç¾—,ógéª8pÀOuóŒ;ü,KÏc¯¸âé >ÎŽ;rý®(R—ê8w%lcc³” ¼”<<éLÇs–²V~øøÕdŽÃ|EE²’“”5„·È ìS^pW6ü<ª8‹0 ÝY¢{0긾×ì;,aG5 ¨¦êúÇ'ìêC¢”"ôMiÓ@e.%騨†¢4œ Ù8ºçá¹Ñx‡Z°,5ýœy­¯÷% ´,2cSb$*ca)±.ŠíGS;ÃP÷¦Ížåè¡®êz¨zVlÇvÀ¸kYæä¾Ó%{s-_×~•LsÐ8 &‹=pM0A²lûÓU­(„}ÿ„ôiÃxÑDQ$o°‰‚ñawÒ‹Ãдú-jýÁ F;F1À=ÌKÅŒ¢ÑÈìJ†‘—9eÓĬRãÓÁ. P{ ‹d3âži"R±mãÆ?Æùctú-ˆ5}2*¿ïüÂÜtÀEñÞU F ìÈŒ/-+Y1ɲ¬Ø Cëm"Ì~”uU_ÈâR-A 2`#LßEïÎÞEª Œ5²ré¡ýòåh4:ÐÐ+$ 8o+J)¢ñé)(®«*ìýÀýlÇ\›„Â0N§5ñºï÷ûuI ÅX¡E›h‹YdÔÚ¦©+½lêlu™_ŒQÿlŸ÷@~°vê8£QÎùñÞç@Œ,C‚— ^WŸäL¤r&––\ÍO!•]Äa‘øjEÎåÈ@ª‚$ `Õ'Å ijE©p`f\vÅ“©Y.Ažæ$Uò\zÇŠ$xÏŸde×Ä4ö=æ@{ PYj/\‚x², h(IP ’LöÓY.3Èræ~‚¡sFŽHÆÎü˜uE‰¡«¨¿@¦ÅFQÏÉØ\ÀcìÌë䬺¥5Óübš80ìHͱ}=Ùj4‰ þhETl­æ`ˆ|$*@TÌ4üÈØiA³,ºÕbrnÍóͪvZoZaØl¡’›Ns2\}*¡‚'eLÁTöÊ°ýµdhÍ™RÊs}¿:½F ÃN—&~†°Å£)’ç ¢ª0³Œ¶=fyˆÆ3µR¢3ç—˜s4~‡A ÝÉPw…Ì¡©˜‰×‹#ØÒo9åT5ÜÁÜÒn¤šç¹ùt/ìv»aØ…ˆFà ó€ ~uÃð »×ëéæ5Ò%}–›S·Ñê 6¶•÷4Kz^l ’þr¤ô £gÛ°gLÏâ‘Âôy!,4ä/ò[·;6¢ I&y}!ÝÞG Ÿh0©»Öj­¥/r{ÐùV¬ºãžoOV ‚ R~%2Q|Û÷ý^?ü°¶ÈíI'‰ñæÍÚŽocˆÉFž@€¦G#… ^ƒÛ æ¹ {ýœ|ò Ýô7 %Š€!DH'Lð Pú}Æèù7¸=ëèÇÏØïù [£b%ð±0ûG[Š2d ˜!=¸kïZìùÔ¹c0^TÔU¦@AA_yEŸ‡ âÛg¸ßÒ徑Ë0Zô(¡Ø¿á_a‹ˆ?†ÕW¸ßÔ‰ë=PlÊ$c²QäÙÒ…„€(ŸÇ€½Ø[þ©#Üï뢔¯£PTP9Èç'ŠÝ‡XÇ.q¤#‹ŒÒÛQ¢ žå²T•ÕÕ— ܵCc †ü¡Î.Ù†Bñ½x˜hh;ùj„Û2ð0sñ÷7täÌ1ƒUÇdàÒ97”¾¢;;þ–®.C ìïæÜ\ÚHªþÚÒUî/ëÈ¥ÅSÇ¢U·¾)ˆ÷©¥+3¬øcØÙ'Žpÿõ_ÿõë+Ƙu’Ð^TIEND®B`‚assets/images/menu-icon-16x16.png000064400000002346147600337620012513 0ustar00‰PNG  IHDR(-SgAMA± üa cHRMz&€„ú€èu0ê`:˜pœºQ<%PLTE½Ë¼Ê½Ê½Ê¾È½Ê½Ê»Ê¼Ê¾È¼Ê¿È¼Ê¼Ê½Ê·Í½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê¼É½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ë½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê¼Ë½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê¼Ê¼Ê¼Ê¼Ê½Ê½Ê¿Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½É½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê¼Ê½Ê½Ê½É½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½É½É½Ê½Ê½É½Ê½Ê½Ê½Ê½Ê½É½Ê½Ê¼É½Ê½Ê½Ê½É½Ê½Ê½Ê½Ê½Ê½É½Ê½Ê¼É½Ê½Ê½É¼É½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½Ê½É½Ê½Ê½Ê½Ê½Éÿÿÿp÷¶tRNSµ§™š™¶n¦ 1Œš#ˆЉˆˆŒ˜ˆ‡š§$" @˜$!9p$d@½[ZXp²[ZS™’«fZQ0ªf0Θ° JÅ­201/NŽš] ~£¬AÒ˜Ÿšž•dš*PÆ:ša’}š„aF®:¨b‡‡vb- Š¯;  œr$œ w°: !!E•3h«:cצƒ3,¤#˜bKGD¶ª ñtIMEä :†Ü÷üIDATÓcQ1qFF I)i`’‘• È+(*)«¨ª))©khj´utuõô uuŒ T&¦ffæ–VffÖ6¶v@iFFf3]%FF{G'gW77wO/o_?ÿ€À ¸@pHhX8kD$\ [TtLl\|CbRrJjZzFfVvNn^~CaQqIiYyEeU5{MmC}CcSsKk[{GgWw'Co_ÿ„‰“&O™:múŒ™Ü<Œ ³fÏ™;oþ‚…‹/YÊËtزå+V®Z½fíºõø€|F ‡ù7nÚ¼e«ˆÏ°áG]—@Àà%tEXtdate:create2020-08-13T05:06:58-04:00™VóÛ%tEXtdate:modify2020-08-13T05:06:58-04:00è KgIEND®B`‚assets/images/acrom.png000064400000001703147600337620011133 0ustar00‰PNG  IHDRddG>>ÍÍÍðÓ£îΓ%%%¸ÔcèIDAThÞí™ wÚ0„wlB4¤I“–JË‘³ÇÿÿsÕ´²d[Å.ðü=B’õXkgžCÐîÀ›EìÛö#¯z±`ž¨Jh´Éמ1'Žô›ùosÈŸU UÐ>œ°ð„a!ìÔ*¡pO(â$¨Rð60À"j]Œ­Qâd· ™ˆ?x.ñÊ…¨ü'¦|'v gžEŠ\.¾'‡Þ]­þÑâ¶k(ÜòwM¼E…øg'8¡2'ôþNäÈNœë„…A¢E'\³Ð‰BbBóë$.„Ꭰœø›eDçÔW -®‰©µ#‘¢•{—ñ†;þšïÄ(ÚwhH¸k˜úÂ+ÞÀ—ƒžØ¶CpêÍ<&øf(âd7¡^$ª¸O.Ü™C 3š tæW8ýp‡û¹AâÜEŸÌ$ù*^¢$l$ú½ºtx‘ʲ璉• wa}›È¥¾»6‰¥Ùº—ã.1-|¿ºb¦Ÿ¿Óë3‡g€Æéë­e™Þ€ð%]òwÞÒ ×iO!=Œ“ûé#ü®‹|…Ç8}àÉtˆ"#Xnt‘I"Ù¤35~HÖÉ4±‘¦ˆ‰D¾sÊ"D¢Y]!QD­,Ò™D²NXš:@‘4q‚|'ç YÄÃwBºˆE!UD"Š@èî2SQÄwBÊÉ[fyU‡í8!× \~bV¥N&w–ì •NÙ8pâž®+߉ÆÝ<ÿYL‘Љ&ÜäÆSÐ]ªë³­X؉†”¶p¯×wXú-<ï-Tƒö™uú“[XÁ- Ápæ×Ë£<®ÌE6ý&ÛÀ2ÊždeóDþÖ9\²Ñ‰…;Ú ‡ ø"x`%BîºpwJá.à ÍŸñó­c{r·Ëó.þ)J…ƒvÒ=¹Û#ìÄî õžwØ?˜Ž¶Hîºp×…»ƒˆD]¸ëÂ]î¢áî/€Ž2.‡<+-IEND®B`‚assets/images/logo-32x32.png000064400000004557147600337620011563 0ustar00‰PNG  IHDR szzô 6IDATX VklTÇ>3÷î݇w×külÀ`bÀ¼_i †D¥%”>0QEB£¨M+‚Uû£Æ©jJÒ R)•Q)ðƒöG¢(‰DZ‘TPµ8”g›Œ_»kïÞçô;³kƒ ¯ï;sæœoÎwΙJ)ú*M!Yò¿ï"bW†'YBΓRÖK!JMEùdGö7‡•r / {Wå&+»[[*Dº\–[’²–†|̬ˆ®“Š& )-VRbHÊÁ«^M"±nr,ùö¯âK@Áà®Ýù©hê·¦a|/$aŽx{T>‘—óCszôç°!~÷—«½ÿâõ1 Z´.þ¾³ `ÐxmJ”Å”u $é!IÚkš†i ‰?RÒ÷E,™ 3dÐR0Ðï€nÀ™w ÏyêͶ¶ÿb€AãuÉÈL“Ô[P6Ý4M·$gË/:IäNY”_%ZεQ‘“‚»—WE á¹.)ñ¬%-å!LD¸Z½ÿR÷§cÆ%ÜÔEE-ÆGQ˪Ž—%Ý—o„ZÙ±DÁ7¦U‰x2.sÝ=tìóo߯žê¹oÙÙÙÑÚÝôjIÙørÑ{õ R€D¼¢Ò‘ù :¯–·ø³é®fØhº#&†!×üæ+dT;9Û=ÙsC®_>'÷â†Õ~ý=Sdu*n™¡ÌçmºÞö–Ì«O’i†gΪ#Ñô´—N÷SýôÉòч¶©ä6kÒ¬‰N4p§¸½ ÝÝÉ?÷‡<€Ý›àÕÆÍGæq@å\/R™Rؽ#½´¡.Ž†#$ÁªãÁp†P9t+…Ô™¼­.\nKîC­¯Ñߎ¾¯Žï=J‰º2ìñamî¾ó·ÎÝéfET:J‘`›“e)ºä(±cë&ÅòeáõmG9[ù¾ƒù®'¼þ¼æEÂ8²‘J"a±pötò³9ª<žÙ¾Yì<økê¹ÜCfØ2€Û:ƒmêTæ”cO¨r!’ˆ´…~156Ô”w¥çù "¼ŒŸz9w‡º¥{Šý7 5K7ÐÊ'ÖRúÓë~IEE†—Ï)Äw tX”2dÆ®·vÒª%3‚ºÚ‰‚<ž—ºà0N  KÁj±Œðà)ŸÐuþì%üÆhÔÜyõÔG”i¸wÞ¶µëƒAÈTø¦2ë-+»I9Ú2¿>ˆEB!åã2¦Àq… @ D‡Á€ü@;‡ñ<ü6ýõù7(‹þŽ×¶«(Öb맞Ü}¸CX[t1úƒxœSVD"–î.š9 ÌJ”°E§ÿsŽÿéÊ™›žÜHsg×’[Á Ú;bã[,£‡\I~ È·íàâù«†MtšE›ïfÓ1U\8€TAÆ04&Q1~œ.}2ôñ‰Ótò£SÔøø1uJ5Eb1(vx+CÜC·@2è ©ªª`—PÀôÕŒ}ôO¢Ë `dô@ÁϾy^`)l”Ä$È'Î÷ªòRñÓm[×@„gÉÍeH„£é§õ z”ß&Öœ;‘N´œ¦D²œfÔÕ™ý¹ïø¸þ€ ¶ôLj ,ÏçÛ‘+WyNk‡>‘j§MV7;:Ô¡7©ýï·Ð‡_Xª³/§8 À½&•°}><Û¦O²¥ôÄÇÝJ.zD•/}„<×Éî«æŠMÔTt÷¹é:ÌŸù ÎüpØ:Xœà„GWˆLW—8Úb‹-™)b»M V¬áx…ðQÞ4 @Â÷|@ôÝÙ•tæg?÷MŠ‹ÊîÓ×æÍŒþàðë嬗šwé`Õ}yù¨ ”iEgãC}S(p3¢ü¸ ŠÔÌŽPŒžxoÏ/Ȳ~‰¡0Œj¤xáâ)U__F¸y¡hP.“V¾ƒ”4cBFR¤¢ u³ý<ÍŸUã#€Qˆì“‰ŸùzÁäðçp xNîæf[½õ|?E˜wOs¯ î(³o}xþqÙ£ÎÊ¥,\O±äÍXNW"iBuéÓ°QÏvk³ìÝm4-p›—XÎ}±?½€)‰ÐÇ”ëxb\i‚¾¿fUÖTÀE9Wäùvd Z4ÎÕ áãîffúsï•®}öÔ ¦v„ýa…hø\SS@ŒxíVE懞ëjj±¼‘ƒØˆÊ€–ÕM ¨¼&¦¦”)5ÕþŒ"]g•í‘ÉçH@îNV|äÈÆ17;:†Ã NMZÕäeßÝót<Ù›íÏAB¹p+ª œ"<›£^ž#ÈŒ’ E¼d,l¦ûó»’ooÖc÷¼üîXŠš¾)H¿óÒOpçy­w†ì€Íîäk<^C9ÎàÇ#–™ÈH­ßùx¡jéБn¬wøYPó :”É5ÏíÅ}oA¦?ÿnȈ1dîfÈ  ¾'J,æ=Jg]»vñ&Ç4ÎÓcò£Çè(Yóìéö\fc»WßïÇ ¨×´4Êv‚´;;ãJuV¯hâu_ÒþB¹݆P'IEND®B`‚assets/images/sm-in-app-promo.png000064400000013202147600337620012762 0ustar00‰PNG  IHDR2HðÏ­tEXtSoftwareAdobe ImageReadyqÉe<xiTXtXML:com.adobe.xmp 4‰Vý€PLTEÔãò£µÛ´«(âîöéä–ÌÛíºË媻ÝãØ2³ÃáTl¹uo‡›Ðf|ÁÐÜíKc¶êç¤Zq¼“Íìùû8R®kÃ|‘Ëêöù ˜2M¬ÿÿÿÚÏ)‘¤ÔB[²ÆÕêØåñ%šÝÒ0– )œ <¤öÿÿúýÿãðö˜"™«Ö9£SOÙÎ$.žyŽÉòþþŒ ÒÎÖìßìô&›æóøãèôx‹Ç¾Íæ(›&A§éð÷Ðßï÷üýv‡ÈóñÇÛÐ0-ž6ž8IDATxÚìšûÒÈÚÀ¡,·š:É’2MÀJŠ 0¼eˆ ¥¥‹ P[5·^µcqµvk÷=æ_gB­—ííœýåý¬FÍe.Ï ß<ó\&ºlÛQñ~þx•ãæO×bšýw?\?˜ü`òƒÉ&?˜ü¿d‚úËã# Œ³Ê¿*4ŒKå8-r €¹?õþäœÇd!@…K™Àv_Wþ*’v¯§ŸA}%]Ê~Ò^Þó“›³; ôß2YXyvýú³•…… ô8— ”¼©ƒ:þV`N›¼ªÉÁ¿]ÅýË\Ÿü©r/>‘ÂJV“ÊÅoòû:ÂDéðÓ ÔªŸ5.¬Vá×s…_ÌõB&õíéééõÀóÀó…ç_Cù‚‰Ò)†Òµ¤õ­@|~ÇD _øj´Òb‡Kÿ¹ ŽÕI) ÇÜòi3Á‘EU«K´Z“TœÕÊïÇßÌ•Ó®¨'¿¶·ïNMïMMÝؾqgál& áÊñ¨eAˆ chç;[ÝI_-ÆìWX»d-§aú²‰å\lˆÉ9†„6Æ‘eÃ2r`D‹°†X±;C›`L ’Š˜¤¶§b£ÑîT}Ã9 `¦–@#mãã¸I™Èl,U70Ð0ÓŠIEÃZŽèª dÓ;Ã$OæÊæÐEöä.erƒYy·°·8“‰¡ú±1ÌõC\½©Âú½:Qô†;;5o4ø{jÐ:ŸŠJ Ô-¤±’zÍŽBxw³D˜!I¸yHvŸîö Šäëz#ß7â÷ÂZ§Zç³B#lhåÂË柶z¥(§håfVÀt´HV ¤ôò%§Ø —kGê ¾×³¥¹ýJÛí®gûXŠ–ŒFOz¡)´O8Û‘^ò8å´p"Öì)z¥ŽêýhëMB sm ¥¸—ø´\Ïô;ígw¯VÞMíQ:ç0>©Û éÔâ“L:âz_ä•ùÝ¥Žôpëž$¬æŸT0]ÇË~þh9zx¨ Ň¾LS–h [ÐöfÝ)]­}ð}ðáÎVtô0"†ä×Êgb›z|n¾«f=¾§/¬Òµ„œ½¶63{DÁ¥S|skÁW®óÁ/÷Äñ¼(Áàœ˼çøžPZ}ï‰ËÙï3Ÿ–ÀÙ~çÆÞÝééígwþ¹~cêl&H-æÙšÝÕ~TÇÛïæü}–3ÝnÙrwKx©]´B#Y.Ì›±Œd­­ÉɱõšRÚ¤?[2ßøenµMW„î©›ÉåŒbÜl<òéz ón92§W9*®%‡—•ö\ØÜðØñÅW$²ÑðI{rܾY÷¨à8lb÷©xÚ¸–0ùŒÔYâ0›áÖï Q–yвʙ¸¶œ7.,Ì ò(dó·ÐÜ ›²r“çSS Ïק+ïÖW/d‚[-Ëê{‚L°¥/GdjæoR(©*ZÔÖ’–î‰[㨙[a1lQS€#Å´:‘ejK èË‚CBK©õÌĘšœx @æ推DLÇ0³‡P'ÍÖÀä–ÛÕ+£ýFÍÎŒ§J˜T©Åkñ¨ÄÅJÚº'‚šqŠ`N°è\…bŒf¼…¢|Ë8.ÉU4ïÝ‘Ñ…1[ à)S7žÎñÅH_ŒZÔÂÓ±&ÌÍû$a'¹öšcL×å{Ó:a¢Œ£r%d:úsÛ‡bÓ@Ô±xT+ïš0±Au¾¿ÖÖÔÝçaÚH10e‚¥V­Ø9a"·ö!ÑKKf?¿+u§ßa=9_÷KÖg&N½ÃDg}&òÁ„‰€¿d"«[3t®9þ9^!Ž]øõÕóóâC9î{Ø>a"`uo—÷8z‚\qKa#0&IJlWeÂa£ Æñ„I¢vÂò[Ñ,¾Ù/¹âŸ˜P{ÒèN™Œ ôm˜ÎoNcØ›˜…1)7çötð39Æ'z¢/×-E3¬ØL±ƒáÙL˜~L®߆l_úbÜòjV>§Öé”›fh'›Öã$ æÃåžÙ›í(̱ûfÓ8–‰$ĆYpÈ/’ÝTìp©kîúÎÀ'ó™Xi6fßÈõ¥t/(gGРK÷øðb€Æ\õþ‹ ží ÕžM§gÃL™F#9ïA¥LÉz´èº f$à 21¹[‹HOì}Kuõc³GîedœÁ$ðlzjz!ðk`åÆÂÉ.<œÉÄ »µuõ¸#Z,õúAgxø6;Úÿ]š{k?x’hCó,òÆþL-bñôG|ÝóxÌ‚yÞò¶ìÜà Çôì!î¿uGýÇnïp‚g1´U‘ócÞZ 7SÇ Pž© Ùƒ81ñ6l&­¾W€ÃÁA]Ž¿õñ3Ç%÷A˜?ðµ7‘ÿ‘òñ±´©„„ÚL:zP•®©úx.¹š´ø§)A]‹åk3I|s“w¯îþúlúú½…½;+ÛÓw¶÷>ûã/ó¤õci¥N·œ¦ C‚téé!ÙI¥-¨N*¡Ñä9v 6TÓ:*—t'Ž…;1„†iU5/F|Ôìvš Ô!=‘£EU‘ÑoÛô )B_3X¥šVQ§”v¦a´éàºm³öõÛ쪪*kHÇbÛé“VYqÛ)¦·é¡¢–ÑNÇVÊÎ\u*9&(ˆÆ¹g®Àö?§®ß¸þn…1¹ñloûúÞÓøþ«¼Ø šBm­“ž! ±½ƒežD9yvÒ"öÀJ ˆÙ€Ób°|}Îkþ†SÄNT2=Ĺ£Wb;£9Ušò9ÓEö¤=myRÏúÑËDøI™S|ZËF'_Î:“¼ùOLîÜ]¿±½·²²²ØcñÉ«ëÏî.|Ÿ{J7?­¾NO½»¾>õîÎ;š^_™Þ |iOJß “ÿúùþ'=Y_˜ZugŠþù¸>õqeêÉý›ÿ¾&ï‚ 9ú—ø›÷Oã“ÇRo¼ÀNS5¹ÿó?Ä{Èø.˜ØðèÖgM9÷`Hn·/Þm4ŒÉž§sf§“-ÐÓçÓ[ãóóéõtgÕ˜ö×Ußtÿb‡õ É_uº/k§RO/—0Éaåæý+ ¹Äš)˜&Ìß%çüc›Ç¬ŸæÜmôh†íØVE»Çü;{MŠ‘34Ea ƒ• !‹b Ór Û—"C4™q6àqº:.Ê£-™x%Ç‘8ÌÑB*QHÇVÄÆ%L(”]>÷ïÿE$„{ÔÚh½Œþ‘Ÿººô¨#6黃Ì•4Mzô¨ÓÙÛ=¢mtƒV 6ZMASò· :K¨°¿ßêº~§w»©*JoàHpÁ"ý–»Œyÿ`m—*,©7Ú† {·£CÃÆÕ åœî¨$nGˆ­ÅnI”%ìwÝÁÛ%~äÞèÞîý^}Ôíú#è2&LS~ùlSþ[-Az±Û‰Í/ë(åSÐp+ †[#öòðÆœjIb†2X:R@õC–7Y`»Å~ÌûPË c^äeiIŠ‹|$#bãêr¬]x]Âú–¡YÞ†ÕŸ‹ë•-ªÿÊNQä!ÒW陾Êv…pH j˜Bó(PwMÊžd»ÿ0/÷3É£r0(óbä()rø2&vo_°|&H.s9†â ÉfX¤i–d>azÃòã 4,†‡£3îò~O³*(s"ËÁ8–ŽÆYYÈËÜRTwhÆb•—±Wýf¶ty7j†3i+ÇÓÕ‚Òk«]ê®Eê qx?•6¨Œ—êrŒFéHõ ŽsÞH!‚¥Ô+²Õái^³Ú³ëR&TÅèò9 CrK‡—~xB” òÚÚ˜2QÆ KO˜ìºl÷®óu‹fyKuÅ ý 4jaV…Í^¦ &`#žß*sK‚FÈÎlܬgúö[O†è›-˜…ª\ÊÜÓ-&¥<*~Q-R&0Èo¬T«ËÃØ5Cuwi)‡«M@a»`f·`)#˜L\ ]>çAq´DÕr—3ñÎ4oyv°ò-“êÜã9}²òà Ÿ\÷i÷™½EY¡e)ìíi„1Aéy]X¢F€1¡vˆ1É/• Õ¦9Uñ ÌNµ `øé‡8‹ÌQz†_ä„ÃÒ¬@ˆðp›eª!õuµ¿f#8ˆ€å„¼³TöFõê“ùìfP&a~0Ðјœ@9Ã%3$¿´á¥H˜žlIƒÃ¯ô$‡ JñsÙ‰­áÙ¶?@vÄE¯ñЪ~ˆ>ôä0ÁõT$¼_1ÉÐ<ìuÅ+‘š?T.¿«Ô ¡t­ïöòýM€è-®‘©cP-˜‰¥ºÏÖÊË=næ >Ú¤K8þ‹[× n˜éIsðT¹«09OS$ix…`ÇY;Ô8ÄÀر'Q‡ JótÈa‘sÔ•ôg{o:š~¼›¯,&­2c×Àa_¸+ÇóŠñ“ˆÈôæŘ ¯$óK3y€ÍÊnRû̘ðK©NlS€ö|³RIù97³å3¬ü|£ÒÛ1¨ÉAij?ÔbE¦©9eÒã±q%=9GS[’ƹ«0®ª)ÇEÁ ®0¤&λe3¾oV]<XC9üÐÄV}Þ²Ìl ÉU—ºO;V‰“û[ªeF2}2ék6él†­ÎfA¶ÔÙ< ãÄn±a†ã²Yw˜¨µ>Zȱ;Ì׈eæçt9‘´0/ŽâåL¹³6Ý‹CK{’·ôbÅ4#/-!£¾'l]ÉYšâhIçJHlEØq‰Y„ù§!©uØÖÊÅ1÷tQ[/‰keä|Ay«ü0•&9··i(¿µëbt¸M"JEÜ@JAŒ+†› Ž?Íó£àÆföÿˆšÑ·a~&I×á—ê€pE ëãbŸ ¤ý}0£+øÅ-/ö‘®«åƒGR^LP~®¾ê–{b‚Àà[I¹“?C¹ÿóOâ-^ ‰­ðù|"ÁÓèQ+UC=]!R¾’ˆFKGù<c•¨óÕ_éWÚPŠæK°\©„Z¥h\5ÉÇcùAù™"ù×÷§%g3¡Pv”Ÿ¾Ç…s“‰¦ü›yœïÉ9L˜¦Ü>¸wô]"9 , Éw‰ä\&,/1lû“Ç&çÿ'À"’XÛ }¬êIEND®B`‚assets/images/bryan-batcher.jpeg000064400000007505147600337620012722 0ustar00ÿØÿàJFIFÿÛC    ""ÿÛC  ÿÂddÿÄ ÿÄÿÚ åæ·¡7ÌD­òµÞà6ÜzERÓr4´WT…[語µz5QÐ~ÍQ¤K?Û"O\ù5öÚñ(M³b¦«][Ÿ çm_’. auö’†O`>¹¡6—ˆ1ÕkÍ ïU–‘"Õp§­^JØÈ;Ìãõ6´(Ô˜)¨µÙ7™hõ[ ² ÞïÏŒq”ï@<™èŒU{P Ù‚I×r:®¦Wb•_µ9G_. f°)ÉâóÖ;ü‰"»¯ì}®±a+U‚‘d}°ÿé–Ýi.Ôúøû)¯}KãuoL–3ûxXPmì¦jÕd@ÔkO«]2¹š½¹í>ÇƲ“5òÓ’ö‹CØóIêÄ÷vF©ÌÅúñΓFÙÛõ2š{¹’ªð™Xí©Ç]Ä:kö€CÇV‡­N,e(·Tó˜M°¿šµ)^²_™j¹½AT€„!Ž†‘‚ùçLžX¸ûêˆÈdê¾J!{?#·''bÞo ’ULò§zÛ¸·ÁWÝ–mÜÁáj‰µ6Päã1 GuL‡&kñ7âs&OÛ‰þFužò#Ÿsˆˆ"ˆôùïú=pñž%l‰™²<%…'È×ç¾™@vÔª:Å家åxŠeµ7½×ú ¹Ãhî|B)„.!ŒÈÜõcàTÀ;â3g_oLÚµJÃ~ÓÄÇ®uvòÈrÖsî<»¥u•^AøÉЫ9# HÈôÏŒÉÖÇTRWKc¶Ð²˜Ö/§oÈ\ƒ®p—í}©—¥P6„Kmíñ¢ûM—ÙêßR«¨£maÈ]s?‰Àå1z¼y²]6ÈÕT¾“eNC«0”õ›Î¶Ö·J+Ì”&žu’#YB¥`è“Á¤¿-Ã^)bí¡Üù ub´Dž×³‹Ê€Û­![†«.}…ˆnþ¶XËzœvJµJqMù6IK#fü“§Šøô<Ø•Iäò[+žÅÍ,¡Ãº6Ýݯ™~9Òe­ˆN+P«‡ Ç¥o¯Þñîûq1ôòSAû•‰! ŽNZX¹;šI{ŒëR{n°šûŠ:ô† ÇïÖUá8Ä Úɘ‚uæɽTäa¸éMHä œÒ¥BüË.VY²ŠÛL¡ƒiÅBä<‰æŸïÊý®Ù“½TftA%ñ58õOûÒ»ß|òŒUb³xn¾'»0Pª÷þ^BOuÏ×Ä’Òp±×ßu‰¸•s†NÁ©&†RBx˜f6à*Ä*^+Ž¯^ð2 «ÁYuW–€;¤ øܶâŽ"ßlñ8EBqÀ×þ4Õ°¦"3\Vá“Àag6óµ%âV UÏíB ×Q‹TDIJçä.Þ8ÀmÊN­-.þÿ,ù \GnsöqìT‚šøÒ&}/?ÎôaÖTÏÉ’ú'MA쌼#­ça©\ÀV¶Õ(k.`„6e¤JZñŠ•µ‘Vª˜PÀÿÿÄ3!1A"Qaq2‘R¡±Á Bbr’ÑñÿÚ ?©¬Q×e&”ÁfXÐÔ(º‚´¹¸õÀiŒI®¸=1 ƦšG Á†é\eÞW9•”u=iÀ, \X!ÖBÖ8½oðM$z÷ôÀh¶_jÄ}1 7TÔbÒ•¤™¹k‡²Œrš} 2·qVœ£æLO¦A³¬GÓ €½. îÃ%)«Š€«<*œM™; $Ü-Ï{R•~Ó@…*ˆ¦é‘ áq jâc Æ:¨/¨…•™Ø6‡*·ü?ùô[H=´d™Y#ºÏ¦E…IýO¦*Æ?Z{ÅáÈ ó«ÅJ•°‘ðÆ®q6Õ.ºò,ŒéJ‹.¦JŒ¾(Œ£¥?{†EºÎ>ˆÉ;LDú{mJªáµ&øzbý©Y@ +nÃ! š¯¼'EQ¤ «ŒpTÀhÔ™ï•`Zkæ4P0˜2„ý,6š÷ÕAô(TGSC #A^x4¹€Ð9f»5X~µÂ¹Árd¬ê(ª•*$¹#9ŽôÓÊ à©®K÷¤$„Àê^p ,ÐÔG\ ÒëqÒrœÏ^ÕIJ**&Ęa ÎM–Õh+=ÂY…¥˜’Äævvç(:”ÄùÃ4¬ +.Dè…• w1¿Þ™@k·th*é‹÷u[j3+äïÐS\fjãJ{S‰F¹ éŽ'w%Š“¢¬êzl+Œ`ÎúFËð+„E¶;°Çîiܹ ¡Dëس ñW›î!ôUŸ¨äè£Qç"!¯]úˆèöŽÂ‡(g\F5×É4O2?"Ÿ6S±«Ü%§_†`i¸ÇïE †"¸uf õ\8÷ZNOu³àGÚ®8Kjv™ûEÉNB¯a±$ÀTE 乄ն<ÄÃ^n½‡þTò­¤$Ëéü錄b¶tD30ɾ•w"ÐÐÓµ7 uKN 0 ~dÑâø@¢²<̽ȓE¹ñ·â=†•np†ZÑpÍþ É«²ÄÆaYËØK0*Ô¿s<úŸlfwcè42?ê³ÛÍX•R:C‹E V6¢Ô¨ T j袗@€~àÐ:3À?hôÿÄ(!1AQ "2$aqÁÿÚ?†P…Äáp±s iÜ£}†m;b)-2¢6RLÚLGd˜rnôhO¡™%ñ–æ¤ÐˆhÅ0Í3W£ý™# p±3T9¨1ñè‘ 5AúÆõXÐÁ5Lb¹ÄVòAÒ  Tb‘SJÛžálÙ/l³ ±Ô<39M„ÃÇåák˜CºÜ7psÔ¥_ÛÓÞj5i…l™›Ìdf+Š‰åò•%ÌÇ®fÉô‰¹ÛE±<¯‘l`ãIãü®§pni|ö<Ü4Ç•2‹Cr¦·T4øÌͬú–IæeÊT»y‡&ì‹s «—šLé•1æ6|H»‰žCÊÒìÃï3›m†bZZŒÛ)âh<ž};Xê`ò¥ÐžSRre"ø™ICs9LæaÑ(13g»SÄ|¹2¶Ö1ZÚÏK7YÝó…÷=A‘Ï©‹3ªÕÇeiœ\ΈƒàŸù1-«0|éôÖ‡s!ü6‰€[w(i–R„;˜ÇÇkwÝ üT'nåþ¡êh{ÍC[P‡ƒSJ-îj˜b]³#™pêaMІdìOÓDæî?fxÅ2sdÆ‚,ÿÄ$!1"A2QÿÚ?Ášåšt%¨£°êlqpˆ›"È{ ¶d)Â8)C b#ð„,¶:ÛG2kTc£—Çr@^¾ˆ5“ö¤ŽÂ6Ù] a’†Ðu‘zùB0q+?RÔ²FØ©¼BùD>8bLµaÉÈZÀ^ˆ³sqáz#‡ìË;ÜJ­ÊmOV[[d#©ÉŽÑ̬Öøb_†«³‰ãgÈSø´RÍÏ$?ã'õG']49$;¤¬DìïðY/ßù<‡‚ã^ºXg3ñËxéºû-¦Èº+âÙsÒ‘!•“$V_ì^„1³ÿÙassets/images/image-placeholder.png000064400000004412147600337620013374 0ustar00‰PNG  IHDRddpâ•T pHYsÄÄ•+¼IDATxœíÛsŇ¿sºgW»ºú¨‚`›IUòÿ¿B…¤*eR€!FزKÈrdig§ûä¡{fW ØÂÛýU©JÒÎÎŒú·§Ïul13£R ºê¨œ§ RU¨‚F¤0ª …Q)Œ*HaTA £ RU¨‚F¤0ª …Q)Œ*HaTA £ RU¨‚F¤0ª …Q)Œ*HaTA £ RU¨‚F¤0ª …Q)Œ*HaøUßÀýû{´m @ˆqø½1¢‚EÃÌ!ÐÎ;D`xÖÈ@UbŒég§8§ˆh:pΡ’Ž3Kç‹1C$ZDDxûOo!"/x!Ƚ½}¦ÓuœÓ´v"€a–D9ÿˆ—â}€ˆ "¨*1/®w‚S^–—7F#vI„ô^‡z‡˜±ÿ`Ÿ·ÞŒ8ç^ÔŸþŠ$†´Þ9,/Œ‘Â`é `Y´… ýë‚ V¢Y(¢ ÖÔÎZæÝœ®ë`{{UI¸±±Ál6c:®d Ad 1™L03œs4ÍhIœtŒf¼óøƧíjÉ ¼sˆ*ªŠSÅÌP&“ Þ74ÇÌ8<üž'Ož°{o—_zQ¡ëÂ*V`qï+½zÆ{?|Ú/]Úáoüá7¿¦ˆpõêÚv“ûß‚ÀxŸÿæ×~EDY*š­DÒ÷/ƒƒC¶¶¶l¥¬ö¡ä"™w]þ.ET/³ETÇ £«ž"ÁlpÎzÁ‹ÒuO{ß bçíœÑht¡×ÿµáCD%Oùë"ØÛ{À×÷öR˜#“ɘwßy›ñx|î¸>8=;]i„¥‚`@´ˆñüòðáCöö¿åò•+)©Ä¸uûßüí¯ùñ{H±ñJs(dËZNÞ."KÞÿæ[¶¶¶°¸07U=ztþÚK×+á_)B¾,‚¥âyiÛä7ú`A$ ¾>]çððûsdžðÞK2WI‚¨SŒTÇ/ΩjN ónDˆ1Õº–°PX4º.¬ÜJŠd{káää„Ís¯Ý¹ó%|øÑP|ü%¼üÒU?Î|öO1òðáw\¿qýܱê’K/:äþ1Špê!$g>o[ÖÖQÐçw¾àèÑ [üãŸÿâý÷ßec}ýgÏ÷ꫯ0™L¸ûÕ.'OÎ0‹ŒG#þüÞ;?ØcˆC]¬Šäôô”ñx uš÷tÏîî×<:>a}}Šª²³s‰O?½Ã[o¾ÁææÆÏžóòåK\¾|‰ãÓýC®@*ÏÛRN´ ŠØ²bŒ¨sÂðÝÁ£ÑÉ…Gç[ÛÛ|öù¿ªÞÔo[?…ÅEu ñM­eÁ"˜·sNOOÙ½÷ïFM“šJªhî•llnróÖ'Ìf¿Ü§<¾Ü/ÀÙÙMÓ\ÈyŸ•"I– lïìðÁ‡¡êh·øtç=Þr/dcc“[·?áøøø¹¯Ý—jR_,÷PVH‚¤¤ ¼w¼ví:£QƒS7$ŒC½«_¸í¾Ú½Ïááás];öõ#u,WÌêà"‚åE–:," 3N!Ö&¾¾÷€ƒƒgÅ©æMkõe(DÅ¢§B Á0ˆB$fëè·/UIõ/3¦ëëÜßû†½ûÏtífÔ íáU'…PHØ+’¶-I[H&äÌYòvÒ‡¥êd(·L¦˜Íf¼þ‰_ÿžÙ¬e>oÃÕj;çŠÈEŠ$Ƽ‹ÐíØ’Uô–¢9<í'FÌŒꔵñÿû„»ww¹qãmÛòégw8<<"DcmmL¯ß¸Æï_}HÝÊ#Þ{œ_ýr¬þ0¢Ù FߢE@ F¢-¦Júˆ«ŸÑRUÆã1GÇùò?w¹~í5nÞú˜ÑhÂå+WR™¤ëºÁï¼ÿÞ»9Ï‘ +l>/eø[ò,,$ÆÈ|Þ1›Íhçsæ]GèBƒóT‰SbLÔuédÊl6çƒÿÎÚÚ”¦ñø>—Á{Çt:¥ póæm m“Ñb>¤AÈ:†…(°˜»ê¿º.Ð…0t Ã;GÓxFÏâDD”«¿{‰¦i’ùËòðwŽñ¨a6ܺýñP^ aµ#@PÌ–Å5ÅSBH*ˤ>¹†¡Gž²{M#Dùx$ucˆÃh)’åÄòùé0R)f:YÃ{ÏhÔ`YäUS„ f©âj–vOŠ¨’!«*˜ arˆ‘жKVÄÃ,r—˜ç{ûm0õ=h’}Ú¶-]µDŒ–ÂÏæ†. 9‡™¡¶XP#%s’K}ôåòÏêãÐßè-Ï¢âÂOt]À¹4ÙbøÁ ðª(BH­Ô.š<ŘFFÓˆh?¦c¤L]U‡ù]?n9„¥ba4Éþâ|)ÝeÇ®Á ïýP/K•æ.@¦Aú<£/‹˜åG$gÐyjƒ¶ÅFíËùñƒ4½’ûó"C8;l{ù}-ª¼Ëÿ¢Õ©÷4Gs¢g¤}Þ¡ÃÔHïlCvøª}EÐì/bÈÙùœÎ¹E‚©Ë>ņÚY]¥^ìßüS”!ˆ÷DbÞ÷—êU"‚ó©q¥ùaœ>a\vàÆÂGĘrÍŽß;—Îé4¤uŠJ ‰kO=ã½ã›ï5#ƹ§.ârNbC‹µ/—¤÷ä[·êb,ò3 óñmo ¹èòŒ–Ëa1 ]Hýõ#%üTfÆÉÉ mÛrzv6ô>Âð”“Ò…ÀìlFÂàÔû0v¨qÅ8X@Þôû€:Çx4¢ñnèBÆ9›ÍRT§Êt²Æµk¯­l A* )Tzª …Q)Œ*HaTA £ RU¨‚F¤0ª …Q)Œ*HaTA £ RU¨‚F¤0ª …Q)Œ*HaTA £ RU¨‚F¤0ª …Q)Œ*HaTA £ Rÿh£9{º–LIEND®B`‚assets/js/chosen/chosen.jquery.min.js000064400000065534147600337620013703 0ustar00/* Chosen v1.3.0 | (c) 2011-2014 by Harvest | MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md */ !function(){var a,AbstractChosen,Chosen,SelectParser,b,c={}.hasOwnProperty,d=function(a,b){function d(){this.constructor=a}for(var e in b)c.call(b,e)&&(a[e]=b[e]);return d.prototype=b.prototype,a.prototype=new d,a.__super__=b.prototype,a};SelectParser=function(){function SelectParser(){this.options_index=0,this.parsed=[]}return SelectParser.prototype.add_node=function(a){return"OPTGROUP"===a.nodeName.toUpperCase()?this.add_group(a):this.add_option(a)},SelectParser.prototype.add_group=function(a){var b,c,d,e,f,g;for(b=this.parsed.length,this.parsed.push({array_index:b,group:!0,label:this.escapeExpression(a.label),children:0,disabled:a.disabled,classes:a.className}),f=a.childNodes,g=[],d=0,e=f.length;e>d;d++)c=f[d],g.push(this.add_option(c,b,a.disabled));return g},SelectParser.prototype.add_option=function(a,b,c){return"OPTION"===a.nodeName.toUpperCase()?(""!==a.text?(null!=b&&(this.parsed[b].children+=1),this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,value:a.value,text:a.text,html:a.innerHTML,selected:a.selected,disabled:c===!0?c:a.disabled,group_array_index:b,classes:a.className,style:a.style.cssText})):this.parsed.push({array_index:this.parsed.length,options_index:this.options_index,empty:!0}),this.options_index+=1):void 0},SelectParser.prototype.escapeExpression=function(a){var b,c;return null==a||a===!1?"":/[\&\<\>\"\'\`]/.test(a)?(b={"<":"<",">":">",'"':""","'":"'","`":"`"},c=/&(?!\w+;)|[\<\>\"\'\`]/g,a.replace(c,function(a){return b[a]||"&"})):a},SelectParser}(),SelectParser.select_to_array=function(a){var b,c,d,e,f;for(c=new SelectParser,f=a.childNodes,d=0,e=f.length;e>d;d++)b=f[d],c.add_node(b);return c.parsed},AbstractChosen=function(){function AbstractChosen(a,b){this.form_field=a,this.options=null!=b?b:{},AbstractChosen.browser_is_supported()&&(this.is_multiple=this.form_field.multiple,this.set_default_text(),this.set_default_values(),this.setup(),this.set_up_html(),this.register_observers(),this.on_ready())}return AbstractChosen.prototype.set_default_values=function(){var a=this;return this.click_test_action=function(b){return a.test_active_click(b)},this.activate_action=function(b){return a.activate_field(b)},this.active_field=!1,this.mouse_on_container=!1,this.results_showing=!1,this.result_highlighted=null,this.allow_single_deselect=null!=this.options.allow_single_deselect&&null!=this.form_field.options[0]&&""===this.form_field.options[0].text?this.options.allow_single_deselect:!1,this.disable_search_threshold=this.options.disable_search_threshold||0,this.disable_search=this.options.disable_search||!1,this.enable_split_word_search=null!=this.options.enable_split_word_search?this.options.enable_split_word_search:!0,this.group_search=null!=this.options.group_search?this.options.group_search:!0,this.search_contains=this.options.search_contains||!1,this.single_backstroke_delete=null!=this.options.single_backstroke_delete?this.options.single_backstroke_delete:!0,this.max_selected_options=this.options.max_selected_options||1/0,this.inherit_select_classes=this.options.inherit_select_classes||!1,this.display_selected_options=null!=this.options.display_selected_options?this.options.display_selected_options:!0,this.display_disabled_options=null!=this.options.display_disabled_options?this.options.display_disabled_options:!0},AbstractChosen.prototype.set_default_text=function(){return this.default_text=this.form_field.getAttribute("data-placeholder")?this.form_field.getAttribute("data-placeholder"):this.is_multiple?this.options.placeholder_text_multiple||this.options.placeholder_text||AbstractChosen.default_multiple_text:this.options.placeholder_text_single||this.options.placeholder_text||AbstractChosen.default_single_text,this.results_none_found=this.form_field.getAttribute("data-no_results_text")||this.options.no_results_text||AbstractChosen.default_no_result_text},AbstractChosen.prototype.mouse_enter=function(){return this.mouse_on_container=!0},AbstractChosen.prototype.mouse_leave=function(){return this.mouse_on_container=!1},AbstractChosen.prototype.input_focus=function(){var a=this;if(this.is_multiple){if(!this.active_field)return setTimeout(function(){return a.container_mousedown()},50)}else if(!this.active_field)return this.activate_field()},AbstractChosen.prototype.input_blur=function(){var a=this;return this.mouse_on_container?void 0:(this.active_field=!1,setTimeout(function(){return a.blur_test()},100))},AbstractChosen.prototype.results_option_build=function(a){var b,c,d,e,f;for(b="",f=this.results_data,d=0,e=f.length;e>d;d++)c=f[d],b+=c.group?this.result_add_group(c):this.result_add_option(c),(null!=a?a.first:void 0)&&(c.selected&&this.is_multiple?this.choice_build(c):c.selected&&!this.is_multiple&&this.single_set_selected_text(c.text));return b},AbstractChosen.prototype.result_add_option=function(a){var b,c;return a.search_match?this.include_option_in_results(a)?(b=[],a.disabled||a.selected&&this.is_multiple||b.push("active-result"),!a.disabled||a.selected&&this.is_multiple||b.push("disabled-result"),a.selected&&b.push("result-selected"),null!=a.group_array_index&&b.push("group-option"),""!==a.classes&&b.push(a.classes),c=document.createElement("li"),c.className=b.join(" "),c.style.cssText=a.style,c.setAttribute("data-option-array-index",a.array_index),c.innerHTML=a.search_text,this.outerHTML(c)):"":""},AbstractChosen.prototype.result_add_group=function(a){var b,c;return a.search_match||a.group_match?a.active_options>0?(b=[],b.push("group-result"),a.classes&&b.push(a.classes),c=document.createElement("li"),c.className=b.join(" "),c.innerHTML=a.search_text,this.outerHTML(c)):"":""},AbstractChosen.prototype.results_update_field=function(){return this.set_default_text(),this.is_multiple||this.results_reset_cleanup(),this.result_clear_highlight(),this.results_build(),this.results_showing?this.winnow_results():void 0},AbstractChosen.prototype.reset_single_select_options=function(){var a,b,c,d,e;for(d=this.results_data,e=[],b=0,c=d.length;c>b;b++)a=d[b],a.selected?e.push(a.selected=!1):e.push(void 0);return e},AbstractChosen.prototype.results_toggle=function(){return this.results_showing?this.results_hide():this.results_show()},AbstractChosen.prototype.results_search=function(){return this.results_showing?this.winnow_results():this.results_show()},AbstractChosen.prototype.winnow_results=function(){var a,b,c,d,e,f,g,h,i,j,k,l;for(this.no_results_clear(),d=0,f=this.get_search_text(),a=f.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&"),i=new RegExp(a,"i"),c=this.get_search_regex(a),l=this.results_data,j=0,k=l.length;k>j;j++)b=l[j],b.search_match=!1,e=null,this.include_option_in_results(b)&&(b.group&&(b.group_match=!1,b.active_options=0),null!=b.group_array_index&&this.results_data[b.group_array_index]&&(e=this.results_data[b.group_array_index],0===e.active_options&&e.search_match&&(d+=1),e.active_options+=1),(!b.group||this.group_search)&&(b.search_text=b.group?b.label:b.text,b.search_match=this.search_string_match(b.search_text,c),b.search_match&&!b.group&&(d+=1),b.search_match?(f.length&&(g=b.search_text.search(i),h=b.search_text.substr(0,g+f.length)+""+b.search_text.substr(g+f.length),b.search_text=h.substr(0,g)+""+h.substr(g)),null!=e&&(e.group_match=!0)):null!=b.group_array_index&&this.results_data[b.group_array_index].search_match&&(b.search_match=!0)));return this.result_clear_highlight(),1>d&&f.length?(this.update_results_content(""),this.no_results(f)):(this.update_results_content(this.results_option_build()),this.winnow_results_set_highlight())},AbstractChosen.prototype.get_search_regex=function(a){var b;return b=this.search_contains?"":"^",new RegExp(b+a,"i")},AbstractChosen.prototype.search_string_match=function(a,b){var c,d,e,f;if(b.test(a))return!0;if(this.enable_split_word_search&&(a.indexOf(" ")>=0||0===a.indexOf("["))&&(d=a.replace(/\[|\]/g,"").split(" "),d.length))for(e=0,f=d.length;f>e;e++)if(c=d[e],b.test(c))return!0},AbstractChosen.prototype.choices_count=function(){var a,b,c,d;if(null!=this.selected_option_count)return this.selected_option_count;for(this.selected_option_count=0,d=this.form_field.options,b=0,c=d.length;c>b;b++)a=d[b],a.selected&&(this.selected_option_count+=1);return this.selected_option_count},AbstractChosen.prototype.choices_click=function(a){return a.preventDefault(),this.results_showing||this.is_disabled?void 0:this.results_show()},AbstractChosen.prototype.keyup_checker=function(a){var b,c;switch(b=null!=(c=a.which)?c:a.keyCode,this.search_field_scale(),b){case 8:if(this.is_multiple&&this.backstroke_length<1&&this.choices_count()>0)return this.keydown_backstroke();if(!this.pending_backstroke)return this.result_clear_highlight(),this.results_search();break;case 13:if(a.preventDefault(),this.results_showing)return this.result_select(a);break;case 27:return this.results_showing&&this.results_hide(),!0;case 9:case 38:case 40:case 16:case 91:case 17:break;default:return this.results_search()}},AbstractChosen.prototype.clipboard_event_checker=function(){var a=this;return setTimeout(function(){return a.results_search()},50)},AbstractChosen.prototype.container_width=function(){return null!=this.options.width?this.options.width:""+this.form_field.offsetWidth+"px"},AbstractChosen.prototype.include_option_in_results=function(a){return this.is_multiple&&!this.display_selected_options&&a.selected?!1:!this.display_disabled_options&&a.disabled?!1:a.empty?!1:!0},AbstractChosen.prototype.search_results_touchstart=function(a){return this.touch_started=!0,this.search_results_mouseover(a)},AbstractChosen.prototype.search_results_touchmove=function(a){return this.touch_started=!1,this.search_results_mouseout(a)},AbstractChosen.prototype.search_results_touchend=function(a){return this.touch_started?this.search_results_mouseup(a):void 0},AbstractChosen.prototype.outerHTML=function(a){var b;return a.outerHTML?a.outerHTML:(b=document.createElement("div"),b.appendChild(a),b.innerHTML)},AbstractChosen.browser_is_supported=function(){return"Microsoft Internet Explorer"===window.navigator.appName?document.documentMode>=8:/iP(od|hone)/i.test(window.navigator.userAgent)?!1:/Android/i.test(window.navigator.userAgent)&&/Mobile/i.test(window.navigator.userAgent)?!1:!0},AbstractChosen.default_multiple_text="Select Some Options",AbstractChosen.default_single_text="Select an Option",AbstractChosen.default_no_result_text="No results match",AbstractChosen}(),a=jQuery,a.fn.extend({chosen:function(b){return AbstractChosen.browser_is_supported()?this.each(function(){var c,d;c=a(this),d=c.data("chosen"),"destroy"===b&&d instanceof Chosen?d.destroy():d instanceof Chosen||c.data("chosen",new Chosen(this,b))}):this}}),Chosen=function(c){function Chosen(){return b=Chosen.__super__.constructor.apply(this,arguments)}return d(Chosen,c),Chosen.prototype.setup=function(){return this.form_field_jq=a(this.form_field),this.current_selectedIndex=this.form_field.selectedIndex,this.is_rtl=this.form_field_jq.hasClass("chosen-rtl")},Chosen.prototype.set_up_html=function(){var b,c;return b=["chosen-container"],b.push("chosen-container-"+(this.is_multiple?"multi":"single")),this.inherit_select_classes&&this.form_field.className&&b.push(this.form_field.className),this.is_rtl&&b.push("chosen-rtl"),c={"class":b.join(" "),style:"width: "+this.container_width()+";",title:this.form_field.title},this.form_field.id.length&&(c.id=this.form_field.id.replace(/[^\w]/g,"_")+"_chosen"),this.container=a("
",c),this.is_multiple?this.container.html('
    '):this.container.html(''+this.default_text+'
      '),this.form_field_jq.hide().after(this.container),this.dropdown=this.container.find("div.chosen-drop").first(),this.search_field=this.container.find("input").first(),this.search_results=this.container.find("ul.chosen-results").first(),this.search_field_scale(),this.search_no_results=this.container.find("li.no-results").first(),this.is_multiple?(this.search_choices=this.container.find("ul.chosen-choices").first(),this.search_container=this.container.find("li.search-field").first()):(this.search_container=this.container.find("div.chosen-search").first(),this.selected_item=this.container.find(".chosen-single").first()),this.results_build(),this.set_tab_index(),this.set_label_behavior()},Chosen.prototype.on_ready=function(){return this.form_field_jq.trigger("chosen:ready",{chosen:this})},Chosen.prototype.register_observers=function(){var a=this;return this.container.bind("touchstart.chosen",function(b){a.container_mousedown(b)}),this.container.bind("touchend.chosen",function(b){a.container_mouseup(b)}),this.container.bind("mousedown.chosen",function(b){a.container_mousedown(b)}),this.container.bind("mouseup.chosen",function(b){a.container_mouseup(b)}),this.container.bind("mouseenter.chosen",function(b){a.mouse_enter(b)}),this.container.bind("mouseleave.chosen",function(b){a.mouse_leave(b)}),this.search_results.bind("mouseup.chosen",function(b){a.search_results_mouseup(b)}),this.search_results.bind("mouseover.chosen",function(b){a.search_results_mouseover(b)}),this.search_results.bind("mouseout.chosen",function(b){a.search_results_mouseout(b)}),this.search_results.bind("mousewheel.chosen DOMMouseScroll.chosen",function(b){a.search_results_mousewheel(b)}),this.search_results.bind("touchstart.chosen",function(b){a.search_results_touchstart(b)}),this.search_results.bind("touchmove.chosen",function(b){a.search_results_touchmove(b)}),this.search_results.bind("touchend.chosen",function(b){a.search_results_touchend(b)}),this.form_field_jq.bind("chosen:updated.chosen",function(b){a.results_update_field(b)}),this.form_field_jq.bind("chosen:activate.chosen",function(b){a.activate_field(b)}),this.form_field_jq.bind("chosen:open.chosen",function(b){a.container_mousedown(b)}),this.form_field_jq.bind("chosen:close.chosen",function(b){a.input_blur(b)}),this.search_field.bind("blur.chosen",function(b){a.input_blur(b)}),this.search_field.bind("keyup.chosen",function(b){a.keyup_checker(b)}),this.search_field.bind("keydown.chosen",function(b){a.keydown_checker(b)}),this.search_field.bind("focus.chosen",function(b){a.input_focus(b)}),this.search_field.bind("cut.chosen",function(b){a.clipboard_event_checker(b)}),this.search_field.bind("paste.chosen",function(b){a.clipboard_event_checker(b)}),this.is_multiple?this.search_choices.bind("click.chosen",function(b){a.choices_click(b)}):this.container.bind("click.chosen",function(a){a.preventDefault()})},Chosen.prototype.destroy=function(){return a(this.container[0].ownerDocument).unbind("click.chosen",this.click_test_action),this.search_field[0].tabIndex&&(this.form_field_jq[0].tabIndex=this.search_field[0].tabIndex),this.container.remove(),this.form_field_jq.removeData("chosen"),this.form_field_jq.show()},Chosen.prototype.search_field_disabled=function(){return this.is_disabled=this.form_field_jq[0].disabled,this.is_disabled?(this.container.addClass("chosen-disabled"),this.search_field[0].disabled=!0,this.is_multiple||this.selected_item.unbind("focus.chosen",this.activate_action),this.close_field()):(this.container.removeClass("chosen-disabled"),this.search_field[0].disabled=!1,this.is_multiple?void 0:this.selected_item.bind("focus.chosen",this.activate_action))},Chosen.prototype.container_mousedown=function(b){return this.is_disabled||(b&&"mousedown"===b.type&&!this.results_showing&&b.preventDefault(),null!=b&&a(b.target).hasClass("search-choice-close"))?void 0:(this.active_field?this.is_multiple||!b||a(b.target)[0]!==this.selected_item[0]&&!a(b.target).parents("a.chosen-single").length||(b.preventDefault(),this.results_toggle()):(this.is_multiple&&this.search_field.val(""),a(this.container[0].ownerDocument).bind("click.chosen",this.click_test_action),this.results_show()),this.activate_field())},Chosen.prototype.container_mouseup=function(a){return"ABBR"!==a.target.nodeName||this.is_disabled?void 0:this.results_reset(a)},Chosen.prototype.search_results_mousewheel=function(a){var b;return a.originalEvent&&(b=a.originalEvent.deltaY||-a.originalEvent.wheelDelta||a.originalEvent.detail),null!=b?(a.preventDefault(),"DOMMouseScroll"===a.type&&(b=40*b),this.search_results.scrollTop(b+this.search_results.scrollTop())):void 0},Chosen.prototype.blur_test=function(){return!this.active_field&&this.container.hasClass("chosen-container-active")?this.close_field():void 0},Chosen.prototype.close_field=function(){return a(this.container[0].ownerDocument).unbind("click.chosen",this.click_test_action),this.active_field=!1,this.results_hide(),this.container.removeClass("chosen-container-active"),this.clear_backstroke(),this.show_search_field_default(),this.search_field_scale()},Chosen.prototype.activate_field=function(){return this.container.addClass("chosen-container-active"),this.active_field=!0,this.search_field.val(this.search_field.val()),this.search_field.focus()},Chosen.prototype.test_active_click=function(b){var c;return c=a(b.target).closest(".chosen-container"),c.length&&this.container[0]===c[0]?this.active_field=!0:this.close_field()},Chosen.prototype.results_build=function(){return this.parsing=!0,this.selected_option_count=null,this.results_data=SelectParser.select_to_array(this.form_field),this.is_multiple?this.search_choices.find("li.search-choice").remove():this.is_multiple||(this.single_set_selected_text(),this.disable_search||this.form_field.options.length<=this.disable_search_threshold?(this.search_field[0].readOnly=!0,this.container.addClass("chosen-container-single-nosearch")):(this.search_field[0].readOnly=!1,this.container.removeClass("chosen-container-single-nosearch"))),this.update_results_content(this.results_option_build({first:!0})),this.search_field_disabled(),this.show_search_field_default(),this.search_field_scale(),this.parsing=!1},Chosen.prototype.result_do_highlight=function(a){var b,c,d,e,f;if(a.length){if(this.result_clear_highlight(),this.result_highlight=a,this.result_highlight.addClass("highlighted"),d=parseInt(this.search_results.css("maxHeight"),10),f=this.search_results.scrollTop(),e=d+f,c=this.result_highlight.position().top+this.search_results.scrollTop(),b=c+this.result_highlight.outerHeight(),b>=e)return this.search_results.scrollTop(b-d>0?b-d:0);if(f>c)return this.search_results.scrollTop(c)}},Chosen.prototype.result_clear_highlight=function(){return this.result_highlight&&this.result_highlight.removeClass("highlighted"),this.result_highlight=null},Chosen.prototype.results_show=function(){return this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field_jq.trigger("chosen:maxselected",{chosen:this}),!1):(this.container.addClass("chosen-with-drop"),this.results_showing=!0,this.search_field.focus(),this.search_field.val(this.search_field.val()),this.winnow_results(),this.form_field_jq.trigger("chosen:showing_dropdown",{chosen:this}))},Chosen.prototype.update_results_content=function(a){return this.search_results.html(a)},Chosen.prototype.results_hide=function(){return this.results_showing&&(this.result_clear_highlight(),this.container.removeClass("chosen-with-drop"),this.form_field_jq.trigger("chosen:hiding_dropdown",{chosen:this})),this.results_showing=!1},Chosen.prototype.set_tab_index=function(){var a;return this.form_field.tabIndex?(a=this.form_field.tabIndex,this.form_field.tabIndex=-1,this.search_field[0].tabIndex=a):void 0},Chosen.prototype.set_label_behavior=function(){var b=this;return this.form_field_label=this.form_field_jq.parents("label"),!this.form_field_label.length&&this.form_field.id.length&&(this.form_field_label=a("label[for='"+this.form_field.id+"']")),this.form_field_label.length>0?this.form_field_label.bind("click.chosen",function(a){return b.is_multiple?b.container_mousedown(a):b.activate_field()}):void 0},Chosen.prototype.show_search_field_default=function(){return this.is_multiple&&this.choices_count()<1&&!this.active_field?(this.search_field.val(this.default_text),this.search_field.addClass("default")):(this.search_field.val(""),this.search_field.removeClass("default"))},Chosen.prototype.search_results_mouseup=function(b){var c;return c=a(b.target).hasClass("active-result")?a(b.target):a(b.target).parents(".active-result").first(),c.length?(this.result_highlight=c,this.result_select(b),this.search_field.focus()):void 0},Chosen.prototype.search_results_mouseover=function(b){var c;return c=a(b.target).hasClass("active-result")?a(b.target):a(b.target).parents(".active-result").first(),c?this.result_do_highlight(c):void 0},Chosen.prototype.search_results_mouseout=function(b){return a(b.target).hasClass("active-result")?this.result_clear_highlight():void 0},Chosen.prototype.choice_build=function(b){var c,d,e=this;return c=a("
    • ",{"class":"search-choice"}).html(""+b.html+""),b.disabled?c.addClass("search-choice-disabled"):(d=a("",{"class":"search-choice-close","data-option-array-index":b.array_index}),d.bind("click.chosen",function(a){return e.choice_destroy_link_click(a)}),c.append(d)),this.search_container.before(c)},Chosen.prototype.choice_destroy_link_click=function(b){return b.preventDefault(),b.stopPropagation(),this.is_disabled?void 0:this.choice_destroy(a(b.target))},Chosen.prototype.choice_destroy=function(a){return this.result_deselect(a[0].getAttribute("data-option-array-index"))?(this.show_search_field_default(),this.is_multiple&&this.choices_count()>0&&this.search_field.val().length<1&&this.results_hide(),a.parents("li").first().remove(),this.search_field_scale()):void 0},Chosen.prototype.results_reset=function(){return this.reset_single_select_options(),this.form_field.options[0].selected=!0,this.single_set_selected_text(),this.show_search_field_default(),this.results_reset_cleanup(),this.form_field_jq.trigger("change"),this.active_field?this.results_hide():void 0},Chosen.prototype.results_reset_cleanup=function(){return this.current_selectedIndex=this.form_field.selectedIndex,this.selected_item.find("abbr").remove()},Chosen.prototype.result_select=function(a){var b,c;return this.result_highlight?(b=this.result_highlight,this.result_clear_highlight(),this.is_multiple&&this.max_selected_options<=this.choices_count()?(this.form_field_jq.trigger("chosen:maxselected",{chosen:this}),!1):(this.is_multiple?b.removeClass("active-result"):this.reset_single_select_options(),c=this.results_data[b[0].getAttribute("data-option-array-index")],c.selected=!0,this.form_field.options[c.options_index].selected=!0,this.selected_option_count=null,this.is_multiple?this.choice_build(c):this.single_set_selected_text(c.text),(a.metaKey||a.ctrlKey)&&this.is_multiple||this.results_hide(),this.search_field.val(""),(this.is_multiple||this.form_field.selectedIndex!==this.current_selectedIndex)&&this.form_field_jq.trigger("change",{selected:this.form_field.options[c.options_index].value}),this.current_selectedIndex=this.form_field.selectedIndex,this.search_field_scale())):void 0},Chosen.prototype.single_set_selected_text=function(a){return null==a&&(a=this.default_text),a===this.default_text?this.selected_item.addClass("chosen-default"):(this.single_deselect_control_build(),this.selected_item.removeClass("chosen-default")),this.selected_item.find("span").text(a)},Chosen.prototype.result_deselect=function(a){var b;return b=this.results_data[a],this.form_field.options[b.options_index].disabled?!1:(b.selected=!1,this.form_field.options[b.options_index].selected=!1,this.selected_option_count=null,this.result_clear_highlight(),this.results_showing&&this.winnow_results(),this.form_field_jq.trigger("change",{deselected:this.form_field.options[b.options_index].value}),this.search_field_scale(),!0)},Chosen.prototype.single_deselect_control_build=function(){return this.allow_single_deselect?(this.selected_item.find("abbr").length||this.selected_item.find("span").first().after(''),this.selected_item.addClass("chosen-single-with-deselect")):void 0},Chosen.prototype.get_search_text=function(){return this.search_field.val()===this.default_text?"":a("
      ").text(a.trim(this.search_field.val())).html()},Chosen.prototype.winnow_results_set_highlight=function(){var a,b;return b=this.is_multiple?[]:this.search_results.find(".result-selected.active-result"),a=b.length?b.first():this.search_results.find(".active-result").first(),null!=a?this.result_do_highlight(a):void 0},Chosen.prototype.no_results=function(b){var c;return c=a('
    • '+this.results_none_found+' ""
    • '),c.find("span").first().html(b),this.search_results.append(c),this.form_field_jq.trigger("chosen:no_results",{chosen:this})},Chosen.prototype.no_results_clear=function(){return this.search_results.find(".no-results").remove()},Chosen.prototype.keydown_arrow=function(){var a;return this.results_showing&&this.result_highlight?(a=this.result_highlight.nextAll("li.active-result").first())?this.result_do_highlight(a):void 0:this.results_show()},Chosen.prototype.keyup_arrow=function(){var a;return this.results_showing||this.is_multiple?this.result_highlight?(a=this.result_highlight.prevAll("li.active-result"),a.length?this.result_do_highlight(a.first()):(this.choices_count()>0&&this.results_hide(),this.result_clear_highlight())):void 0:this.results_show()},Chosen.prototype.keydown_backstroke=function(){var a;return this.pending_backstroke?(this.choice_destroy(this.pending_backstroke.find("a").first()),this.clear_backstroke()):(a=this.search_container.siblings("li.search-choice").last(),a.length&&!a.hasClass("search-choice-disabled")?(this.pending_backstroke=a,this.single_backstroke_delete?this.keydown_backstroke():this.pending_backstroke.addClass("search-choice-focus")):void 0)},Chosen.prototype.clear_backstroke=function(){return this.pending_backstroke&&this.pending_backstroke.removeClass("search-choice-focus"),this.pending_backstroke=null},Chosen.prototype.keydown_checker=function(a){var b,c;switch(b=null!=(c=a.which)?c:a.keyCode,this.search_field_scale(),8!==b&&this.pending_backstroke&&this.clear_backstroke(),b){case 8:this.backstroke_length=this.search_field.val().length;break;case 9:this.results_showing&&!this.is_multiple&&this.result_select(a),this.mouse_on_container=!1;break;case 13:this.results_showing&&a.preventDefault();break;case 32:this.disable_search&&a.preventDefault();break;case 38:a.preventDefault(),this.keyup_arrow();break;case 40:a.preventDefault(),this.keydown_arrow()}},Chosen.prototype.search_field_scale=function(){var b,c,d,e,f,g,h,i,j;if(this.is_multiple){for(d=0,h=0,f="position:absolute; left: -1000px; top: -1000px; display:none;",g=["font-size","font-style","font-weight","font-family","line-height","text-transform","letter-spacing"],i=0,j=g.length;j>i;i++)e=g[i],f+=e+":"+this.search_field.css(e)+";";return b=a("
      ",{style:f}),b.text(this.search_field.val()),a("body").append(b),h=b.width()+25,b.remove(),c=this.container.outerWidth(),h>c-10&&(h=c-10),this.search_field.css({width:h+"px"})}},Chosen}(AbstractChosen)}.call(this);assets/js/handsontable/handsontable.full.min.js000064400003325404147600337620015672 0ustar00/*! * (The MIT License) * * Copyright (c) 2012-2014 Marcin Warpechowski * Copyright (c) 2015 Handsoncode sp. z o.o. * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * 'Software'), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * * Version: 6.2.2 * Release date: 19/12/2018 (built at 18/12/2018 14:40:17) */ (function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Handsontable",[],t):"object"==typeof exports?exports.Handsontable=t():e.Handsontable=t()})("undefined"!=typeof self?self:this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var o=n[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,t),o.l=!0,o.exports}var n={};return t.m=e,t.c=n,t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=437)}([function(e,t,n){var r=n(6),o=n(21),i=n(28),a=n(23),s=n(37),l="prototype",u=function(e,t,n){var c,f,h,d,p=e&u.F,g=e&u.G,v=e&u.S,y=e&u.P,m=e&u.B,w=g?r:v?r[t]||(r[t]={}):(r[t]||{})[l],b=g?o:o[t]||(o[t]={}),C=b[l]||(b[l]={});for(c in g&&(n=t),n)f=!p&&w&&void 0!==w[c],h=(f?w:n)[c],d=m&&f?s(h,r):y&&"function"==typeof h?s(Function.call,h):h,w&&a(w,c,h,e&u.U),b[c]!=h&&i(b,c,d),y&&C[c]!=h&&(C[c]=h)};r.core=o,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,e.exports=u},function(e,t,n){"use strict";function r(e){return a(e)||i(e)||o()}function o(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function i(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}function a(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t1&&void 0!==arguments[1]?arguments[1]:0,n=-1,r=null,o=e;null!==o;){if(n===t){r=o;break}o.host&&o.nodeType===Node.DOCUMENT_FRAGMENT_NODE?o=o.host:(n+=1,o=o.parentNode)}return r}function l(e,t,n){for(var r=e;null!==r&&r!==n;){if(r.nodeType===Node.ELEMENT_NODE&&(t.indexOf(r.nodeName)>-1||t.indexOf(r)>-1))return r;r=r.host&&r.nodeType===Node.DOCUMENT_FRAGMENT_NODE?r.host:r.parentNode}return null}function u(e,t,n){for(var r=[],o=e;o&&(o=l(o,t,n),o&&(!n||n.contains(o)));)r.push(o),o=o.host&&o.nodeType===Node.DOCUMENT_FRAGMENT_NODE?o.host:o.parentNode;var i=r.length;return i?r[i-1]:null}function c(e,t){var n=e.parentNode,r=[];for("string"==typeof t?r=Array.prototype.slice.call(document.querySelectorAll(t),0):r.push(t);null!==n;){if(r.indexOf(n)>-1)return!0;n=n.parentNode}return!1}function f(e){function t(e){return e.nodeType===Node.ELEMENT_NODE&&e.nodeName===n.toUpperCase()}for(var n="hot-table",r=!1,o=h(e);null!==o;){if(t(o)){r=!0;break}if(o.host&&o.nodeType===Node.DOCUMENT_FRAGMENT_NODE){if(r=t(o.host),r)break;o=o.host}o=o.parentNode}return r}function h(e){return"undefined"!=typeof Polymer&&"function"==typeof wrap?wrap(e):e}function d(e){return"undefined"!=typeof Polymer&&"function"==typeof unwrap?unwrap(e):e}function p(e){var t=0,n=e;if(n.previousSibling)for(;n=n.previousSibling;)t+=1;return t}function g(e,t){var n=document.querySelector(".ht_clone_".concat(e));return n?n.contains(t):null}function v(e){var t=[];if(!e||!e.length)return t;for(var n=0;e[n];)t.push(e[n]),n+=1;return t}function y(e,t){return Q(e,t)}function m(e,t){return ee(e,t)}function w(e,t){return te(e,t)}function b(e,t){if(3===e.nodeType)t.removeChild(e);else if(["TABLE","THEAD","TBODY","TFOOT","TR"].indexOf(e.nodeName)>-1)for(var n=e.childNodes,r=n.length-1;r>=0;r--)b(n[r],e)}function C(e){for(var t;t=e.lastChild;)e.removeChild(t)}function S(e,t){le.test(t)?e.innerHTML=t:_(e,t)}function _(e,t){var n=e.firstChild;n&&3===n.nodeType&&null===n.nextSibling?ce?n.textContent=t:n.data=t:(C(e),e.appendChild(document.createTextNode(t)))}function E(e){for(var t=e;d(t)!==document.documentElement;){if(null===t)return!1;if(t.nodeType===Node.DOCUMENT_FRAGMENT_NODE){if(t.host){if(t.host.impl)return E(t.host.impl);if(t.host)return E(t.host);throw new Error("Lost in Web Components world")}return!1}if("none"===t.style.display)return!1;t=t.parentNode}return!0}function O(e){var t,n,r,o,i=document.documentElement,a=e;if((0,oe.hasCaptionProblem)()&&a.firstChild&&"CAPTION"===a.firstChild.nodeName)return o=a.getBoundingClientRect(),{top:o.top+(window.pageYOffset||i.scrollTop)-(i.clientTop||0),left:o.left+(window.pageXOffset||i.scrollLeft)-(i.clientLeft||0)};for(t=a.offsetLeft,n=a.offsetTop,r=a;(a=a.offsetParent)&&a!==document.body;)t+=a.offsetLeft,n+=a.offsetTop,r=a;return r&&"fixed"===r.style.position&&(t+=window.pageXOffset||i.scrollLeft,n+=window.pageYOffset||i.scrollTop),{left:t,top:n}}function T(){var e=window.scrollY;return void 0===e&&(e=document.documentElement.scrollTop),e}function R(){var e=window.scrollX;return void 0===e&&(e=document.documentElement.scrollLeft),e}function k(e){return e===window?T():e.scrollTop}function M(e){return e===window?R():e.scrollLeft}function N(e){for(var t,n,r,o=["auto","scroll"],i=e.parentNode,a="",s="",l="",u="";i&&i.style&&document.body!==i;){if(t=i.style.overflow,n=i.style.overflowX,r=i.style.overflowY,"scroll"===t||"scroll"===n||"scroll"===r)return i;if(window.getComputedStyle&&(a=window.getComputedStyle(i),s=a.getPropertyValue("overflow"),l=a.getPropertyValue("overflow-y"),u=a.getPropertyValue("overflow-x"),"scroll"===s||"scroll"===u||"scroll"===l))return i;if(i.clientHeight<=i.scrollHeight+1&&(-1!==o.indexOf(r)||-1!==o.indexOf(t)||-1!==o.indexOf(s)||-1!==o.indexOf(l)))return i;if(i.clientWidth<=i.scrollWidth+1&&(-1!==o.indexOf(n)||-1!==o.indexOf(t)||-1!==o.indexOf(s)||-1!==o.indexOf(u)))return i;i=i.parentNode}return window}function D(e){for(var t=e.parentNode;t&&t.style&&document.body!==t;){if("visible"!==t.style.overflow&&""!==t.style.overflow)return t;var n=P(t),r=["scroll","hidden","auto"],o=n.getPropertyValue("overflow"),i=n.getPropertyValue("overflow-y"),a=n.getPropertyValue("overflow-x");if(r.includes(o)||r.includes(i)||r.includes(a))return t;t=t.parentNode}return window}function A(e,t){if(e){if(e===window)return"width"===t?window.innerWidth+"px":"height"===t?window.innerHeight+"px":void 0;var n,r=e.style[t];return""!==r&&void 0!==r?r:(n=P(e),""!==n[t]&&void 0!==n[t]?n[t]:void 0)}}function P(e){return e.currentStyle||document.defaultView.getComputedStyle(e)}function L(e){return e.offsetWidth}function H(e){return(0,oe.hasCaptionProblem)()&&e.firstChild&&"CAPTION"===e.firstChild.nodeName?e.offsetHeight+e.firstChild.offsetHeight:e.offsetHeight}function x(e){return e.clientHeight||e.innerHeight}function I(e){return e.clientWidth||e.innerWidth}function j(e,t,n){window.addEventListener?e.addEventListener(t,n,!1):e.attachEvent("on"+t,n)}function F(e,t,n){window.removeEventListener?e.removeEventListener(t,n,!1):e.detachEvent("on"+t,n)}function W(e){if(e.selectionStart)return e.selectionStart;if(document.selection){e.focus();var t=document.selection.createRange();if(null==t)return 0;var n=e.createTextRange(),r=n.duplicate();return n.moveToBookmark(t.getBookmark()),r.setEndPoint("EndToStart",n),r.text.length}return 0}function B(e){if(e.selectionEnd)return e.selectionEnd;if(document.selection){var t=document.selection.createRange();if(null==t)return 0;var n=e.createTextRange();return n.text.indexOf(t.text)+t.text.length}return 0}function V(){var e="";return window.getSelection?e=window.getSelection().toString():document.selection&&"Control"!==document.selection.type&&(e=document.selection.createRange().text),e}function Y(e,t,n){if(void 0===n&&(n=t),e.setSelectionRange){e.focus();try{("number" !== e.type) ? e.setSelectionRange(t,n) : ""}catch(i){var r=e.parentNode,o=r.style.display;r.style.display="block",e.setSelectionRange(t,n),r.style.display=o}}else if(e.createTextRange){var i=e.createTextRange();i.collapse(!0),i.moveEnd("character",n),i.moveStart("character",t),i.select()}}function U(){var e=document.createElement("div");e.style.height="200px",e.style.width="100%";var t=document.createElement("div");t.style.boxSizing="content-box",t.style.height="150px",t.style.left="0px",t.style.overflow="hidden",t.style.position="absolute",t.style.top="0px",t.style.width="200px",t.style.visibility="hidden",t.appendChild(e),(document.body||document.documentElement).appendChild(t);var n=e.offsetWidth;t.style.overflow="scroll";var r=e.offsetWidth;return n==r&&(r=t.clientWidth),(document.body||document.documentElement).removeChild(t),n-r}function z(){return void 0===ue&&(ue=U()),ue}function G(e){return e.offsetWidth!==e.clientWidth}function X(e){return e.offsetHeight!==e.clientHeight}function K(e,t,n){(0,re.isIE8)()||(0,re.isIE9)()?(e.style.top=n,e.style.left=t):(0,re.isSafari)()?e.style["-webkit-transform"]="translate3d("+t+","+n+",0)":e.style.transform="translate3d("+t+","+n+",0)"}function q(e){var t;return e.style.transform&&""!==(t=e.style.transform)?["transform",t]:e.style["-webkit-transform"]&&""!==(t=e.style["-webkit-transform"])?["-webkit-transform",t]:-1}function Z(e){e.style.transform&&""!==e.style.transform?e.style.transform="":e.style["-webkit-transform"]&&""!==e.style["-webkit-transform"]&&(e.style["-webkit-transform"]="")}function $(e){var t=["INPUT","SELECT","TEXTAREA"];return e&&(t.indexOf(e.nodeName)>-1||"true"===e.contentEditable)}function J(e){return $(e)&&-1==e.className.indexOf("handsontableInput")&&-1==e.className.indexOf("copyPaste")}t.__esModule=!0,t.getParent=s,t.closest=l,t.closestDown=u,t.isChildOf=c,t.isChildOfWebComponentTable=f,t.polymerWrap=h,t.polymerUnwrap=d,t.index=p,t.overlayContainsElement=g,t.hasClass=y,t.addClass=m,t.removeClass=w,t.removeTextNodes=b,t.empty=C,t.fastInnerHTML=S,t.fastInnerText=_,t.isVisible=E,t.offset=O,t.getWindowScrollTop=T,t.getWindowScrollLeft=R,t.getScrollTop=k,t.getScrollLeft=M,t.getScrollableElement=N,t.getTrimmingContainer=D,t.getStyle=A,t.getComputedStyle=P,t.outerWidth=L,t.outerHeight=H,t.innerHeight=x,t.innerWidth=I,t.addEvent=j,t.removeEvent=F,t.getCaretPosition=W,t.getSelectionEndPosition=B,t.getSelectionText=V,t.setCaretPosition=Y,t.getScrollbarWidth=z,t.hasVerticalScrollbar=G,t.hasHorizontalScrollbar=X,t.setOverlayPosition=K,t.getCssTransform=q,t.resetCssTransform=Z,t.isInput=$,t.isOutsideInput=J,t.HTML_CHARACTERS=void 0;var Q,ee,te,ne,re=n(42),oe=n(47),ie=!!document.documentElement.classList;if(ie){var ae=(ne=document.createElement("div"),ne.classList.add("test","test2"),ne.classList.contains("test2"));Q=function(e,t){return void 0!==e.classList&&"string"==typeof t&&""!==t&&e.classList.contains(t)},ee=function(e,t){var n,o=t;if("string"==typeof o&&(o=o.split(" ")),o=v(o),o.length>0)if(ae)(n=e.classList).add.apply(n,r(o));else for(var i=0;o&&o[i];)e.classList.add(o[i]),i+=1},te=function(e,t){var n,o=t;if("string"==typeof o&&(o=o.split(" ")),o=v(o),o.length>0)if(ae)(n=e.classList).remove.apply(n,r(o));else for(var i=0;o&&o[i];)e.classList.remove(o[i]),i+=1}}else{var se=function(e){return new RegExp("(\\s|^)".concat(e,"(\\s|$)"))};Q=function(e,t){return void 0!==e.className&&se(t).test(e.className)},ee=function(e,t){var n=0,r=e.className,o=t;if("string"==typeof o&&(o=o.split(" ")),""===r)r=o.join(" ");else for(;o&&o[n];)se(o[n]).test(r)||(r+=" ".concat(o[n])),n+=1;e.className=r},te=function(e,t){var n=0,r=e.className,o=t;for("string"==typeof o&&(o=o.split(" "));o&&o[n];)r=r.replace(se(o[n])," ").trim(),n+=1;e.className!==r&&(e.className=r)}}var le=/(<(.*)>|&(.*);)/;t.HTML_CHARACTERS=le;var ue,ce=!!document.createTextNode("test").textContent},function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e){var t;return Array.isArray(e)?t=[]:(t={},g(e,function(e,n){"__children"!==n&&(e&&"object"===o(e)&&!Array.isArray(e)?t[n]=i(e):Array.isArray(e)?e.length&&"object"===o(e[0])&&!Array.isArray(e[0])?t[n]=[i(e[0])]:t[n]=[]:t[n]=null)})),t}function a(e,t){return t.prototype.constructor=t,e.prototype=new t,e.prototype.constructor=e,e}function s(e,t){return g(t,function(t,n){e[n]=t}),e}function l(e,t){g(t,function(n,r){t[r]&&"object"===o(t[r])?(e[r]||(Array.isArray(t[r])?e[r]=[]:"[object Date]"===Object.prototype.toString.call(t[r])?e[r]=t[r]:e[r]={}),l(e[r],t[r])):e[r]=t[r]})}function u(e){return"object"===o(e)?JSON.parse(JSON.stringify(e)):e}function c(e){var t={};return g(e,function(e,n){t[n]=e}),t}function f(e){e.MIXINS||(e.MIXINS=[]);for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r1&&void 0!==arguments[1]?arguments[1]:"value",o="_".concat(n),i=(t={_touched:!1},r(t,o,e),r(t,"isTouched",function(){return this._touched}),t);return Object.defineProperty(i,n,{get:function(){return this[o]},set:function(e){this._touched=!0,this[o]=e},enumerable:!0,configurable:!0}),i}function w(e,t){return Object.prototype.hasOwnProperty.call(e,t)}t.__esModule=!0,t.duckSchema=i,t.inherit=a,t.extend=s,t.deepExtend=l,t.deepClone=u,t.clone=c,t.mixin=f,t.isObjectEqual=h,t.isObject=d,t.defineGetter=p,t.objectEach=g,t.getProperty=v,t.deepObjectSize=y,t.createObjectPropListener=m,t.hasOwnProperty=w;var b=n(3)},function(e,t,n){"use strict";function r(e){for(var t=e.length,n=0;nt?e:t},Array.isArray(e)?e[0]:void 0)}function h(e){return a(e,function(e,t){return e=t&&!1!==n(r););}function s(e,t){return t=parseInt(t.toString().replace("%",""),10),t=parseInt(e*t/100,10),t}t.__esModule=!0,t.isNumeric=o,t.rangeEach=i,t.rangeEachReverse=a,t.valueAccordingPercent=s},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:null;r(this,e),this.context=t||this,this.context.eventListeners||(this.context.eventListeners=[])}return i(e,[{key:"addEventListener",value:function(e,t,n){function r(e){n.call(this,a(i,e))}var o=this,i=this.context;return this.context.eventListeners.push({element:e,event:t,callback:n,callbackProxy:r}),e.addEventListener(t,r,!1),h+=1,function(){o.removeEventListener(e,t,n)}}},{key:"removeEventListener",value:function(e,t,n){for(var r,o=this.context.eventListeners.length;o;)if(o-=1,r=this.context.eventListeners[o],r.event===t&&r.element===e){if(n&&n!==r.callback)continue;this.context.eventListeners.splice(o,1),r.element.removeEventListener(r.event,r.callbackProxy,!1),h-=1}}},{key:"clearEvents",value:function(){if(this.context)for(var e=this.context.eventListeners.length;e;){e-=1;var t=this.context.eventListeners[e];t&&this.removeEventListener(t.element,t.event,t.callback)}}},{key:"clear",value:function(){this.clearEvents()}},{key:"destroy",value:function(){this.clearEvents(),this.context=null}},{key:"fireEvent",value:function(e,t){var n,r={bubbles:!0,cancelable:"mousemove"!==t,view:window,detail:0,screenX:0,screenY:0,clientX:1,clientY:1,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:void 0};document.createEvent?(n=document.createEvent("MouseEvents"),n.initMouseEvent(t,r.bubbles,r.cancelable,r.view,r.detail,r.screenX,r.screenY,r.clientX,r.clientY,r.ctrlKey,r.altKey,r.shiftKey,r.metaKey,r.button,r.relatedTarget||document.body.parentNode)):n=document.createEventObject(),e.dispatchEvent?e.dispatchEvent(n):e.fireEvent("on".concat(t),n)}}]),e}(),p=d;t.default=p},function(e,t,n){"use strict";t.__esModule=!0,t.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE=t.FILTERS_BUTTONS_PLACEHOLDER_VALUE=t.FILTERS_BUTTONS_PLACEHOLDER_SEARCH=t.FILTERS_BUTTONS_CANCEL=t.FILTERS_BUTTONS_OK=t.FILTERS_BUTTONS_CLEAR=t.FILTERS_BUTTONS_SELECT_ALL=t.FILTERS_VALUES_BLANK_CELLS=t.FILTERS_LABELS_DISJUNCTION=t.FILTERS_LABELS_CONJUNCTION=t.FILTERS_DIVS_FILTER_BY_VALUE=t.FILTERS_DIVS_FILTER_BY_CONDITION=t.FILTERS_CONDITIONS_YESTERDAY=t.FILTERS_CONDITIONS_TOMORROW=t.FILTERS_CONDITIONS_TODAY=t.FILTERS_CONDITIONS_BEFORE=t.FILTERS_CONDITIONS_AFTER=t.FILTERS_CONDITIONS_NOT_BETWEEN=t.FILTERS_CONDITIONS_BETWEEN=t.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL=t.FILTERS_CONDITIONS_LESS_THAN=t.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL=t.FILTERS_CONDITIONS_GREATER_THAN=t.FILTERS_CONDITIONS_BY_VALUE=t.FILTERS_CONDITIONS_NOT_CONTAIN=t.FILTERS_CONDITIONS_CONTAINS=t.FILTERS_CONDITIONS_ENDS_WITH=t.FILTERS_CONDITIONS_BEGINS_WITH=t.FILTERS_CONDITIONS_NOT_EQUAL=t.FILTERS_CONDITIONS_EQUAL=t.FILTERS_CONDITIONS_NOT_EMPTY=t.FILTERS_CONDITIONS_EMPTY=t.FILTERS_CONDITIONS_NONE=t.FILTERS_CONDITIONS_NAMESPACE=t.FILTERS_NAMESPACE=t.CONTEXTMENU_ITEMS_SHOW_ROW=t.CONTEXTMENU_ITEMS_HIDE_ROW=t.CONTEXTMENU_ITEMS_SHOW_COLUMN=t.CONTEXTMENU_ITEMS_HIDE_COLUMN=t.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD=t.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD=t.CONTEXTMENU_ITEMS_REMOVE_BORDERS=t.CONTEXTMENU_ITEMS_BORDERS_LEFT=t.CONTEXTMENU_ITEMS_BORDERS_BOTTOM=t.CONTEXTMENU_ITEMS_BORDERS_RIGHT=t.CONTEXTMENU_ITEMS_BORDERS_TOP=t.CONTEXTMENU_ITEMS_BORDERS=t.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM=t.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE=t.CONTEXTMENU_ITEMS_ALIGNMENT_TOP=t.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY=t.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT=t.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER=t.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT=t.CONTEXTMENU_ITEMS_ALIGNMENT=t.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT=t.CONTEXTMENU_ITEMS_REMOVE_COMMENT=t.CONTEXTMENU_ITEMS_EDIT_COMMENT=t.CONTEXTMENU_ITEMS_ADD_COMMENT=t.CONTEXTMENU_ITEMS_UNMERGE_CELLS=t.CONTEXTMENU_ITEMS_MERGE_CELLS=t.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN=t.CONTEXTMENU_ITEMS_FREEZE_COLUMN=t.CONTEXTMENU_ITEMS_CUT=t.CONTEXTMENU_ITEMS_COPY=t.CONTEXTMENU_ITEMS_CLEAR_COLUMN=t.CONTEXTMENU_ITEMS_READ_ONLY=t.CONTEXTMENU_ITEMS_REDO=t.CONTEXTMENU_ITEMS_UNDO=t.CONTEXTMENU_ITEMS_REMOVE_COLUMN=t.CONTEXTMENU_ITEMS_REMOVE_ROW=t.CONTEXTMENU_ITEMS_INSERT_RIGHT=t.CONTEXTMENU_ITEMS_INSERT_LEFT=t.CONTEXTMENU_ITEMS_ROW_BELOW=t.CONTEXTMENU_ITEMS_ROW_ABOVE=t.CONTEXT_MENU_ITEMS_NAMESPACE=void 0;var r="ContextMenu:items";t.CONTEXT_MENU_ITEMS_NAMESPACE=r;var o="".concat(r,".insertRowAbove");t.CONTEXTMENU_ITEMS_ROW_ABOVE=o;var i="".concat(r,".insertRowBelow");t.CONTEXTMENU_ITEMS_ROW_BELOW=i;var a="".concat(r,".insertColumnOnTheLeft");t.CONTEXTMENU_ITEMS_INSERT_LEFT=a;var s="".concat(r,".insertColumnOnTheRight");t.CONTEXTMENU_ITEMS_INSERT_RIGHT=s;var l="".concat(r,".removeRow");t.CONTEXTMENU_ITEMS_REMOVE_ROW=l;var u="".concat(r,".removeColumn");t.CONTEXTMENU_ITEMS_REMOVE_COLUMN=u;var c="".concat(r,".undo");t.CONTEXTMENU_ITEMS_UNDO=c;var f="".concat(r,".redo");t.CONTEXTMENU_ITEMS_REDO=f;var h="".concat(r,".readOnly");t.CONTEXTMENU_ITEMS_READ_ONLY=h;var d="".concat(r,".clearColumn");t.CONTEXTMENU_ITEMS_CLEAR_COLUMN=d;var p="".concat(r,".copy");t.CONTEXTMENU_ITEMS_COPY=p;var g="".concat(r,".cut");t.CONTEXTMENU_ITEMS_CUT=g;var v="".concat(r,".freezeColumn");t.CONTEXTMENU_ITEMS_FREEZE_COLUMN=v;var y="".concat(r,".unfreezeColumn");t.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN=y;var m="".concat(r,".mergeCells");t.CONTEXTMENU_ITEMS_MERGE_CELLS=m;var w="".concat(r,".unmergeCells");t.CONTEXTMENU_ITEMS_UNMERGE_CELLS=w;var b="".concat(r,".addComment");t.CONTEXTMENU_ITEMS_ADD_COMMENT=b;var C="".concat(r,".editComment");t.CONTEXTMENU_ITEMS_EDIT_COMMENT=C;var S="".concat(r,".removeComment");t.CONTEXTMENU_ITEMS_REMOVE_COMMENT=S;var _="".concat(r,".readOnlyComment");t.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT=_;var E="".concat(r,".align");t.CONTEXTMENU_ITEMS_ALIGNMENT=E;var O="".concat(r,".align.left");t.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT=O;var T="".concat(r,".align.center");t.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER=T;var R="".concat(r,".align.right");t.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT=R;var k="".concat(r,".align.justify");t.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY=k;var M="".concat(r,".align.top");t.CONTEXTMENU_ITEMS_ALIGNMENT_TOP=M;var N="".concat(r,".align.middle");t.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE=N;var D="".concat(r,".align.bottom");t.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM=D;var A="".concat(r,".borders");t.CONTEXTMENU_ITEMS_BORDERS=A;var P="".concat(r,".borders.top");t.CONTEXTMENU_ITEMS_BORDERS_TOP=P;var L="".concat(r,".borders.right");t.CONTEXTMENU_ITEMS_BORDERS_RIGHT=L;var H="".concat(r,".borders.bottom");t.CONTEXTMENU_ITEMS_BORDERS_BOTTOM=H;var x="".concat(r,".borders.left");t.CONTEXTMENU_ITEMS_BORDERS_LEFT=x;var I="".concat(r,".borders.remove");t.CONTEXTMENU_ITEMS_REMOVE_BORDERS=I;var j="".concat(r,".nestedHeaders.insertChildRow");t.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD=j;var F="".concat(r,".nestedHeaders.detachFromParent");t.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD=F;var W="".concat(r,".hideColumn");t.CONTEXTMENU_ITEMS_HIDE_COLUMN=W;var B="".concat(r,".showColumn");t.CONTEXTMENU_ITEMS_SHOW_COLUMN=B;var V="".concat(r,".hideRow");t.CONTEXTMENU_ITEMS_HIDE_ROW=V;var Y="".concat(r,".showRow");t.CONTEXTMENU_ITEMS_SHOW_ROW=Y;var U="Filters:";t.FILTERS_NAMESPACE=U;var z="".concat(U,"conditions");t.FILTERS_CONDITIONS_NAMESPACE=z;var G="".concat(z,".none");t.FILTERS_CONDITIONS_NONE=G;var X="".concat(z,".isEmpty");t.FILTERS_CONDITIONS_EMPTY=X;var K="".concat(z,".isNotEmpty");t.FILTERS_CONDITIONS_NOT_EMPTY=K;var q="".concat(z,".isEqualTo");t.FILTERS_CONDITIONS_EQUAL=q;var Z="".concat(z,".isNotEqualTo");t.FILTERS_CONDITIONS_NOT_EQUAL=Z;var $="".concat(z,".beginsWith");t.FILTERS_CONDITIONS_BEGINS_WITH=$;var J="".concat(z,".endsWith");t.FILTERS_CONDITIONS_ENDS_WITH=J;var Q="".concat(z,".contains");t.FILTERS_CONDITIONS_CONTAINS=Q;var ee="".concat(z,".doesNotContain");t.FILTERS_CONDITIONS_NOT_CONTAIN=ee;var te="".concat(z,".byValue");t.FILTERS_CONDITIONS_BY_VALUE=te;var ne="".concat(z,".greaterThan");t.FILTERS_CONDITIONS_GREATER_THAN=ne;var re="".concat(z,".greaterThanOrEqualTo");t.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL=re;var oe="".concat(z,".lessThan");t.FILTERS_CONDITIONS_LESS_THAN=oe;var ie="".concat(z,".lessThanOrEqualTo");t.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL=ie;var ae="".concat(z,".isBetween");t.FILTERS_CONDITIONS_BETWEEN=ae;var se="".concat(z,".isNotBetween");t.FILTERS_CONDITIONS_NOT_BETWEEN=se;var le="".concat(z,".after");t.FILTERS_CONDITIONS_AFTER=le;var ue="".concat(z,".before");t.FILTERS_CONDITIONS_BEFORE=ue;var ce="".concat(z,".today");t.FILTERS_CONDITIONS_TODAY=ce;var fe="".concat(z,".tomorrow");t.FILTERS_CONDITIONS_TOMORROW=fe;var he="".concat(z,".yesterday");t.FILTERS_CONDITIONS_YESTERDAY=he;var de="".concat(U,"labels.filterByCondition");t.FILTERS_DIVS_FILTER_BY_CONDITION=de;var pe="".concat(U,"labels.filterByValue");t.FILTERS_DIVS_FILTER_BY_VALUE=pe;var ge="".concat(U,"labels.conjunction");t.FILTERS_LABELS_CONJUNCTION=ge;var ve="".concat(U,"labels.disjunction");t.FILTERS_LABELS_DISJUNCTION=ve;var ye="".concat(U,"values.blankCells");t.FILTERS_VALUES_BLANK_CELLS=ye;var me="".concat(U,"buttons.selectAll");t.FILTERS_BUTTONS_SELECT_ALL=me;var we="".concat(U,"buttons.clear");t.FILTERS_BUTTONS_CLEAR=we;var be="".concat(U,"buttons.ok");t.FILTERS_BUTTONS_OK=be;var Ce="".concat(U,"buttons.cancel");t.FILTERS_BUTTONS_CANCEL=Ce;var Se="".concat(U,"buttons.placeholder.search");t.FILTERS_BUTTONS_PLACEHOLDER_SEARCH=Se;var _e="".concat(U,"buttons.placeholder.value");t.FILTERS_BUTTONS_PLACEHOLDER_VALUE=_e;var Ee="".concat(U,"buttons.placeholder.secondValue");t.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE=Ee},function(e,t,n){var r=n(93)("wks"),o=n(51),i=n(6).Symbol,a="function"==typeof i,s=e.exports=function(e){return r[e]||(r[e]=a&&i[e]||(a?i:o)("Symbol."+e))};s.store=r},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n=(0,c.toUpperCaseFirst)(e);l.default.getSingleton().add("construct",function(){f.has(this)||f.set(this,{});var e=f.get(this);e[n]||(e[n]=new t(this))}),l.default.getSingleton().add("afterDestroy",function(){if(f.has(this)){var e=f.get(this);(0,u.objectEach)(e,function(e){return e.destroy()}),f.delete(this)}})}function i(e,t){if("string"!=typeof t)throw Error('Only strings can be passed as "plugin" parameter');var n=(0,c.toUpperCaseFirst)(t);if(f.has(e)&&f.get(e)[n])return f.get(e)[n]}function a(e){return f.has(e)?Object.keys(f.get(e)):[]}function s(e,t){var n=null;return f.has(e)&&(0,u.objectEach)(f.get(e),function(e,r){e===t&&(n=r)}),n}t.__esModule=!0,t.registerPlugin=o,t.getPlugin=i,t.getRegistredPluginNames=a,t.getPluginName=s;var l=r(n(22)),u=n(2),c=n(48),f=new WeakMap},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(){var e=i(["\n Your license key of Handsontable Pro has expired.‌‌‌‌ \n Renew your maintenance plan at https://handsontable.com or downgrade to the previous version of the software.\n "]);return o=function(){return e},e}function i(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function s(e){var t;switch(a(e)){case"string":case"number":t="".concat(e);break;case"object":t=null===e?"":e.toString();break;case"undefined":t="";break;default:t=e.toString()}return t}function l(e){return void 0!==e}function u(e){return void 0===e}function c(e){return null===e||""===e||u(e)}function f(e){return"[object RegExp]"===Object.prototype.toString.call(e)}function h(e,t){e=C(e||"");var n="",r=!0,i=d(e),a=_(),s=c(e)||"trial"===e;if(s||i)if(i){var l=Math.floor((0,p.default)("19/12/2018","DD/MM/YYYY").toDate().getTime()/864e5),u=S(e);(u>45e3||u!==parseInt(u,10))&&(n="The license key provided to Handsontable Pro is invalid. Make sure you pass it correctly."),n||(l>u+1&&(n=(0,g.toSingleLine)(o())),r=l>u+15)}else n="Evaluation version of Handsontable Pro. Not licensed for use in a production environment.";else n="The license key provided to Handsontable Pro is invalid. Make sure you pass it correctly.";if(a&&(n=!1,r=!1),n&&!E&&(console[s?"info":"warn"](n),E=!0),r&&t.parentNode){var f=document.createElement("div");f.id="hot-display-license-info", f.appendChild(document.createTextNode("Evaluation version of Handsontable Pro.")),f.appendChild(document.createElement("br")),f.appendChild(document.createTextNode("Not licensed for production use.")),t.parentNode.insertBefore(f,t.nextSibling)}}function d(e){var t=[][v],n=t;if(e[v]!==b("Z"))return!1;for(var r="",o="B>1:r=w(e,i,i?1===o[v]?9:8:6);return n===t}t.__esModule=!0,t.stringify=s,t.isDefined=l,t.isUndefined=u,t.isEmpty=c,t.isRegExp=f,t._injectProductInfo=h;var p=r(n(67)),g=n(58),v="length",y=function(e){return parseInt(e,16)},m=function(e){return parseInt(e,10)},w=function(e,t,n){return e.substr(t,n)},b=function(e){return e.codePointAt(0)-65},C=function(e){return"".concat(e).replace(/\-/g,"")},S=function(e){return y(w(C(e),y("12"),b("F")))/(y(w(C(e),b("B"),~~![][v]))||9)},_=function(){return"undefined"!=typeof location&&/^([a-z0-9\-]+\.)?\x68\x61\x6E\x64\x73\x6F\x6E\x74\x61\x62\x6C\x65\x2E\x63\x6F\x6D$/i.test(location.host)},E=!1},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var n=0;n=0&&f.splice(f.indexOf(this.pluginName),1),f.length||this.hot.runHooks("afterPluginsInitialized"),this.initialized=!0}},{key:"enablePlugin",value:function(){this.enabled=!0}},{key:"disablePlugin",value:function(){this.eventManager&&this.eventManager.clear(),this.clearHooks(),this.enabled=!1}},{key:"addHook",value:function(e,t){c.get(this).hooks[e]=c.get(this).hooks[e]||[];var n=c.get(this).hooks[e];this.hot.addHook(e,t),n.push(t),c.get(this).hooks[e]=n}},{key:"removeHooks",value:function(e){var t=this;(0,s.arrayEach)(c.get(this).hooks[e]||[],function(n){t.hot.removeHook(e,n)})}},{key:"clearHooks",value:function(){var e=this,t=c.get(this).hooks;(0,a.objectEach)(t,function(t,n){return e.removeHooks(n)}),t.length=0}},{key:"callOnPluginsReady",value:function(e){this.isPluginsReady?e():this.pluginsInitializedCallbacks.push(e)}},{key:"onAfterPluginsInitialized",value:function(){(0,s.arrayEach)(this.pluginsInitializedCallbacks,function(e){return e()}),this.pluginsInitializedCallbacks.length=0,this.isPluginsReady=!0}},{key:"onUpdateSettings",value:function(){this.isEnabled&&(this.enabled&&!this.isEnabled()&&this.disablePlugin(),!this.enabled&&this.isEnabled()&&this.enablePlugin(),this.enabled&&this.isEnabled()&&this.updatePlugin())}},{key:"updatePlugin",value:function(){}},{key:"destroy",value:function(){var e=this;this.eventManager&&this.eventManager.destroy(),this.clearHooks(),(0,a.objectEach)(this,function(t,n){"hot"!==n&&"t"!==n&&(e[n]=null)}),delete this.t,delete this.hot}}]),e}(),d=h;t.default=d},function(e,t,n){var r=n(33),o=Math.min;e.exports=function(e){return e>0?o(r(e),9007199254740991):0}},function(e,t,n){var r=n(5),o=n(130),i=n(44),a=Object.defineProperty;t.f=n(20)?Object.defineProperty:function(e,t,n){if(r(e),t=i(t,!0),r(n),o)try{return a(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},function(e,t,n){"use strict";function r(e){e.isImmediatePropagationEnabled=!1,e.cancelBubble=!0}function o(e){return!1===e.isImmediatePropagationEnabled}function i(e){"function"==typeof e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function a(e){return e.pageX?e.pageX:e.clientX+(0,c.getWindowScrollLeft)()}function s(e){return e.pageY?e.pageY:e.clientY+(0,c.getWindowScrollTop)()}function l(e){return 2===e.button}function u(e){return 0===e.button}t.__esModule=!0,t.stopImmediatePropagation=r,t.isImmediatePropagationStopped=o,t.stopPropagation=i,t.pageX=a,t.pageY=s,t.isRightClick=l,t.isLeftClick=u;var c=n(1)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){if("function"==typeof e)return e;if(!v(e))throw Error('No registered renderer found under "'.concat(e,'" name'));return g(e)}t.__esModule=!0,t.getRenderer=o,t.getRegisteredRenderers=t.getRegisteredRendererNames=t.hasRenderer=t.registerRenderer=void 0;var i=r(n(46)),a=r(n(624)),s=r(n(625)),l=r(n(626)),u=r(n(627)),c=r(n(628)),f=r(n(629)),h=r(n(630)),d=(0,i.default)("renderers"),p=d.register,g=d.getItem,v=d.hasItem,y=d.getNames,m=d.getValues;t.getRegisteredRenderers=m,t.getRegisteredRendererNames=y,t.hasRenderer=v,t.registerRenderer=p,p("base",a.default),p("autocomplete",s.default),p("checkbox",l.default),p("html",u.default),p("numeric",c.default),p("password",f.default),p("text",h.default)},function(e,t,n){e.exports=!n(4)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(e,t){var n=e.exports={version:"2.6.1"};"number"==typeof __e&&(__e=n)},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:null;return e?(e.pluginHookBucket||(e.pluginHookBucket=this.createEmptyBucket()),e.pluginHookBucket):this.globalBucket}},{key:"add",value:function(e,t){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;if(Array.isArray(t))(0,s.arrayEach)(t,function(t){return n.add(e,t,r)});else{var o=this.getBucket(r);if(void 0===o[e]&&(this.register(e),o[e]=[]),t.skip=!1,-1===o[e].indexOf(t)){var i=!1;t.initialHook&&(0,s.arrayEach)(o[e],function(n,r){if(n.initialHook)return o[e][r]=t,i=!0,!1}),i||o[e].push(t)}}return this}},{key:"once",value:function(e,t){var n=this,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;Array.isArray(t)?(0,s.arrayEach)(t,function(t){return n.once(e,t,r)}):(t.runOnce=!0,this.add(e,t,r))}},{key:"remove",value:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,r=this.getBucket(n);return void 0!==r[e]&&r[e].indexOf(t)>=0&&(t.skip=!0,!0)}},{key:"has",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=this.getBucket(t);return!(void 0===n[e]||!n[e].length)}},{key:"run",value:function(e,t,n,r,o,i,a,s){var l=this.globalBucket[t],u=l?l.length:0,c=0;if(u)for(;c0&&void 0!==arguments[0]?arguments[0]:null;(0,l.objectEach)(this.getBucket(e),function(e,t,n){return n[t].length=0})}},{key:"register",value:function(e){this.isRegistered(e)||u.push(e)}},{key:"deregister",value:function(e){this.isRegistered(e)&&u.splice(u.indexOf(e),1)}},{key:"isRegistered",value:function(e){return u.indexOf(e)>=0}},{key:"getRegistered",value:function(){return u}}]),e}(),f=new c,h=c;t.default=h},function(e,t,n){var r=n(6),o=n(28),i=n(27),a=n(51)("src"),s="toString",l=Function[s],u=(""+l).split(s);n(21).inspectSource=function(e){return l.call(e)},(e.exports=function(e,t,n,s){var l="function"==typeof n;l&&(i(n,"name")||o(n,"name",t)),e[t]!==n&&(l&&(i(n,a)||o(n,a,e[t]?""+e[t]:u.join(String(t)))),e===r?e[t]=n:s?e[t]?e[t]=n:o(e,t,n):(delete e[t],o(e,t,n)))})(Function.prototype,s,function(){return"function"==typeof this&&this[a]||l.call(this)})},function(e,t,n){var r=n(40);e.exports=function(e){return Object(r(e))}},function(e,t,n){var r=n(0),o=n(4),i=n(40),a=/"/g,s=function(e,t,n,r){var o=String(i(e)),s="<"+t;return""!==n&&(s+=" "+n+'="'+String(r).replace(a,""")+'"'),s+">"+o+""};e.exports=function(e,t){var n={};n[e]=t(s),r(r.P+r.F*o(function(){var t=""[e]('"');return t!==t.toLowerCase()||t.split('"').length>3}),"String",n)}},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){var t={},n=e;this.getConstructor=function(){return e},this.getInstance=function(e){return e.guid in t||(t[e.guid]=new n(e)),t[e.guid]},u.default.getSingleton().add("afterDestroy",function(){t[this.guid]=null})}function i(e,t){var n;if("function"==typeof e)b.get(e)||s(null,e),n=b.get(e);else{if("string"!=typeof e)throw Error('Only strings and functions can be passed as "editor" parameter');n=_(e)}if(!n)throw Error('No editor registered under name "'.concat(e,'"'));return n.getInstance(t)}function a(e){if(!E(e))throw Error('No registered editor found under "'.concat(e,'" name'));return _(e).getConstructor()}function s(e,t){var n=new o(t);"string"==typeof e&&S(e,n),b.set(t,n)}t.__esModule=!0,t.RegisteredEditor=o,t.getEditorInstance=t._getEditorInstance=i,t.registerEditor=s,t.getEditor=a,t.getRegisteredEditors=t.getRegisteredEditorNames=t.hasEditor=void 0;var l=r(n(46)),u=r(n(22)),c=r(n(74)),f=r(n(294)),h=r(n(614)),d=r(n(615)),p=r(n(620)),g=r(n(295)),v=r(n(621)),y=r(n(622)),m=r(n(623)),w=r(n(77)),b=new WeakMap,C=(0,l.default)("editors"),S=C.register,_=C.getItem,E=C.hasItem,O=C.getNames,T=C.getValues;t.getRegisteredEditors=T,t.getRegisteredEditorNames=O,t.hasEditor=E,s("base",c.default),s("autocomplete",f.default),s("checkbox",h.default),s("date",d.default),s("dropdown",p.default),s("handsontable",g.default),s("numeric",v.default),s("password",y.default),s("select",m.default),s("text",w.default)},function(e,t){var n={}.hasOwnProperty;e.exports=function(e,t){return n.call(e,t)}},function(e,t,n){var r=n(17),o=n(50);e.exports=n(20)?function(e,t,n){return r.f(e,t,o(1,n))}:function(e,t,n){return e[t]=n,e}},function(e,t,n){var r=n(70),o=n(40);e.exports=function(e){return r(o(e))}},function(e,t,n){"use strict";function r(e){return(0,C.arrayMap)(e,function(e){return{start:e.getTopLeftCorner(),end:e.getBottomRightCorner()}})}function o(e){return(0,S.hasClass)(e,"htSeparator")}function i(e){return(0,S.hasClass)(e,"htSubmenu")}function a(e){return(0,S.hasClass)(e,"htDisabled")}function s(e){return(0,S.hasClass)(e,"htSelectionDisabled")}function l(e){var t=e.getSelected();return t?t[0]<0?null:t:null}function u(e,t){if(-1!==e.indexOf(t))return e;var n=e.replace("htTop","").replace("htMiddle","").replace("htBottom","").replace(" ","");return"".concat(n," ").concat(t)}function c(e,t){if(-1!==e.indexOf(t))return e;var n=e.replace("htLeft","").replace("htCenter","").replace("htRight","").replace("htJustify","").replace(" ","");return"".concat(n," ").concat(t)}function f(e,t){var n={};return(0,C.arrayEach)(e,function(e){for(var r=e.from,o=e.to,i=r.row;i<=o.row;i++)for(var a=r.col;a<=o.col;a++)n[i]||(n[i]=[]),n[i][a]=t(i,a)}),n}function h(e,t,n,r,o){(0,C.arrayEach)(e,function(e){var i=e.from,a=e.to;if(i.row===a.row&&i.col===a.col)d(i.row,i.col,t,n,r,o);else for(var s=i.row;s<=a.row;s++)for(var l=i.col;l<=a.col;l++)d(s,l,t,n,r,o)})}function d(e,t,n,r,o,i){var a=o(e,t),s=r;a.className&&(s="vertical"===n?u(a.className,r):c(a.className,r)),i(e,t,"className",s)}function p(e,t){var n=!1;return Array.isArray(e)&&(0,C.arrayEach)(e,function(e){return e.forAll(function(e,r){if(t(e,r))return n=!0,!1}),n}),n}function g(e){return''.concat(String.fromCharCode(10003),"").concat(e)}function v(e,t){return!e.hidden||!("function"==typeof e.hidden&&e.hidden.call(t))}function y(e,t){for(var n=e.slice(0),r=0;r0?t[t.length-1].name!==e.name&&t.push(e):t.push(e)}),t}function b(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:_.KEY,n=e.slice(0);return n=y(n,t),n=m(n,t),n=w(n),n}t.__esModule=!0,t.normalizeSelection=r,t.isSeparator=o,t.hasSubMenu=i,t.isDisabled=a,t.isSelectionDisabled=s,t.getValidSelection=l,t.prepareVerticalAlignClass=u,t.prepareHorizontalAlignClass=c,t.getAlignmentClasses=f,t.align=h,t.checkSelectionConsistency=p,t.markLabelAsSelected=g,t.isItemHidden=v,t.filterSeparators=b;var C=n(3),S=n(1),_=n(126)},function(e,t,n){"use strict";var r=n(4);e.exports=function(e,t){return!!e&&r(function(){t?e.call(null,function(){},1):e.call(null)})}},function(e,t,n){"use strict";function r(e){return 32===e||e>=48&&e<=57||e>=96&&e<=111||e>=186&&e<=192||e>=219&&e<=222||e>=226||e>=65&&e<=90}function o(e){var t=[u.ARROW_DOWN,u.ARROW_UP,u.ARROW_LEFT,u.ARROW_RIGHT,u.HOME,u.END,u.DELETE,u.BACKSPACE,u.F1,u.F2,u.F3,u.F4,u.F5,u.F6,u.F7,u.F8,u.F9,u.F10,u.F11,u.F12,u.TAB,u.PAGE_DOWN,u.PAGE_UP,u.ENTER,u.ESCAPE,u.SHIFT,u.CAPS_LOCK,u.ALT];return-1!==t.indexOf(e)}function i(e){var t=[];return window.navigator.platform.includes("Mac")?t.push(u.COMMAND_LEFT,u.COMMAND_RIGHT,u.COMMAND_FIREFOX):t.push(u.CONTROL),t.includes(e)}function a(e){return[u.CONTROL,u.COMMAND_LEFT,u.COMMAND_RIGHT,u.COMMAND_FIREFOX].includes(e)}function s(e,t){var n=t.split("|"),r=!1;return(0,l.arrayEach)(n,function(t){if(e===u[t])return r=!0,!1}),r}t.__esModule=!0,t.isPrintableChar=r,t.isMetaKey=o,t.isCtrlKey=i,t.isCtrlMetaKey=a,t.isKey=s,t.KEY_CODES=void 0;var l=n(3),u={MOUSE_LEFT:1,MOUSE_RIGHT:3,MOUSE_MIDDLE:2,BACKSPACE:8,COMMA:188,INSERT:45,DELETE:46,END:35,ENTER:13,ESCAPE:27,CONTROL:17,COMMAND_LEFT:91,COMMAND_RIGHT:93,COMMAND_FIREFOX:224,ALT:18,HOME:36,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,SPACE:32,SHIFT:16,CAPS_LOCK:20,TAB:9,ARROW_RIGHT:39,ARROW_LEFT:37,ARROW_UP:38,ARROW_DOWN:40,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,A:65,C:67,D:68,F:70,L:76,O:79,P:80,S:83,V:86,X:88};t.KEY_CODES=u},function(e,t){var n=Math.ceil,r=Math.floor;e.exports=function(e){return isNaN(e=+e)?0:(e>0?r:n)(e)}},function(e,t,n){var r=n(71),o=n(50),i=n(29),a=n(44),s=n(27),l=n(130),u=Object.getOwnPropertyDescriptor;t.f=n(20)?u:function(e,t){if(e=i(e),t=a(t,!0),l)try{return u(e,t)}catch(e){}if(s(e,t))return o(!r.f.call(e,t),e[t])}},function(e,t,n){var r=n(0),o=n(21),i=n(4);e.exports=function(e,t){var n=(o.Object||{})[e]||Object[e],a={};a[e]=t(n),r(r.S+r.F*i(function(){n(1)}),"Object",a)}},function(e,t,n){var r=n(37),o=n(70),i=n(24),a=n(16),s=n(529);e.exports=function(e,t){var n=1==e,l=2==e,u=3==e,c=4==e,f=6==e,h=5==e||f,d=t||s;return function(t,s,p){for(var g,v,y=i(t),m=o(y),w=r(s,p,3),b=a(m.length),C=0,S=n?d(t,b):l?d(t,0):void 0;b>C;C++)if((h||C in m)&&(g=m[C],v=w(g,C,y),e))if(n)S[C]=v;else if(v)switch(e){case 3:return!0;case 5:return g;case 6:return C;case 2:S.push(g)}else if(c)return!1;return f?-1:u||c?c:S}}},function(e,t,n){var r=n(38);e.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}}},function(e,t){e.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},function(e,t){var n={}.toString;e.exports=function(e){return n.call(e).slice(8,-1)}},function(e,t){e.exports=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e}},function(e,t,n){"use strict";if(n(20)){var r=n(52),o=n(6),i=n(4),a=n(0),s=n(89),l=n(118),u=n(37),c=n(64),f=n(50),h=n(28),d=n(65),p=n(33),g=n(16),v=n(156),y=n(54),m=n(44),w=n(27),b=n(72),C=n(7),S=n(24),_=n(110),E=n(55),O=n(57),T=n(56).f,R=n(112),k=n(51),M=n(12),N=n(36),D=n(79),A=n(73),P=n(114),L=n(61),H=n(82),x=n(63),I=n(113),j=n(147),F=n(17),W=n(34),B=F.f,V=W.f,Y=o.RangeError,U=o.TypeError,z=o.Uint8Array,G="ArrayBuffer",X="Shared"+G,K="BYTES_PER_ELEMENT",q="prototype",Z=Array[q],$=l.ArrayBuffer,J=l.DataView,Q=N(0),ee=N(2),te=N(3),ne=N(4),re=N(5),oe=N(6),ie=D(!0),ae=D(!1),se=P.values,le=P.keys,ue=P.entries,ce=Z.lastIndexOf,fe=Z.reduce,he=Z.reduceRight,de=Z.join,pe=Z.sort,ge=Z.slice,ve=Z.toString,ye=Z.toLocaleString,me=M("iterator"),we=M("toStringTag"),be=k("typed_constructor"),Ce=k("def_constructor"),Se=s.CONSTR,_e=s.TYPED,Ee=s.VIEW,Oe="Wrong length!",Te=N(1,function(e,t){return De(A(e,e[Ce]),t)}),Re=i(function(){return 1===new z(new Uint16Array([1]).buffer)[0]}),ke=!!z&&!!z[q].set&&i(function(){new z(1).set({})}),Me=function(e,t){var n=p(e);if(n<0||n%t)throw Y("Wrong offset!");return n},Ne=function(e){if(C(e)&&_e in e)return e;throw U(e+" is not a typed array!")},De=function(e,t){if(!(C(e)&&be in e))throw U("It is not a typed array constructor!");return new e(t)},Ae=function(e,t){return Pe(A(e,e[Ce]),t)},Pe=function(e,t){for(var n=0,r=t.length,o=De(e,r);r>n;)o[n]=t[n++];return o},Le=function(e,t,n){B(e,t,{get:function(){return this._d[n]}})},He=function(e){var t,n,r,o,i,a,s=S(e),l=arguments.length,c=l>1?arguments[1]:void 0,f=void 0!==c,h=R(s);if(null!=h&&!_(h)){for(a=h.call(s),r=[],t=0;!(i=a.next()).done;t++)r.push(i.value);s=r}for(f&&l>2&&(c=u(c,arguments[2],2)),t=0,n=g(s.length),o=De(this,n);n>t;t++)o[t]=f?c(s[t],t):s[t];return o},xe=function(){for(var e=0,t=arguments.length,n=De(this,t);t>e;)n[e]=arguments[e++];return n},Ie=!!z&&i(function(){ye.call(new z(1))}),je=function(){return ye.apply(Ie?ge.call(Ne(this)):Ne(this),arguments)},Fe={copyWithin:function(e,t){return j.call(Ne(this),e,t,arguments.length>2?arguments[2]:void 0)},every:function(e){return ne(Ne(this),e,arguments.length>1?arguments[1]:void 0)},fill:function(e){return I.apply(Ne(this),arguments)},filter:function(e){return Ae(this,ee(Ne(this),e,arguments.length>1?arguments[1]:void 0))},find:function(e){return re(Ne(this),e,arguments.length>1?arguments[1]:void 0)},findIndex:function(e){return oe(Ne(this),e,arguments.length>1?arguments[1]:void 0)},forEach:function(e){Q(Ne(this),e,arguments.length>1?arguments[1]:void 0)},indexOf:function(e){return ae(Ne(this),e,arguments.length>1?arguments[1]:void 0)},includes:function(e){return ie(Ne(this),e,arguments.length>1?arguments[1]:void 0)},join:function(e){return de.apply(Ne(this),arguments)},lastIndexOf:function(e){return ce.apply(Ne(this),arguments)},map:function(e){return Te(Ne(this),e,arguments.length>1?arguments[1]:void 0)},reduce:function(e){return fe.apply(Ne(this),arguments)},reduceRight:function(e){return he.apply(Ne(this),arguments)},reverse:function(){for(var e,t=this,n=Ne(t).length,r=Math.floor(n/2),o=0;o1?arguments[1]:void 0)},sort:function(e){return pe.call(Ne(this),e)},subarray:function(e,t){var n=Ne(this),r=n.length,o=y(e,r);return new(A(n,n[Ce]))(n.buffer,n.byteOffset+o*n.BYTES_PER_ELEMENT,g((void 0===t?r:y(t,r))-o))}},We=function(e,t){return Ae(this,ge.call(Ne(this),e,t))},Be=function(e){Ne(this);var t=Me(arguments[1],1),n=this.length,r=S(e),o=g(r.length),i=0;if(o+t>n)throw Y(Oe);for(;i255?255:255&r),o.v[d](n*t+o.o,r,Re)},M=function(e,t){B(e,t,{get:function(){return R(this,t)},set:function(e){return k(this,t,e)},enumerable:!0})};w?(p=n(function(e,n,r,o){c(e,p,u,"_d");var i,a,s,l,f=0,d=0;if(C(n)){if(!(n instanceof $||(l=b(n))==G||l==X))return _e in n?Pe(p,n):He.call(p,n);i=n,d=Me(r,t);var y=n.byteLength;if(void 0===o){if(y%t)throw Y(Oe);if(a=y-d,a<0)throw Y(Oe)}else if(a=g(o)*t,a+d>y)throw Y(Oe);s=a/t}else s=v(n),a=s*t,i=new $(a);for(h(e,"_d",{b:i,o:d,l:a,e:s,v:new J(i)});f0&&void 0!==arguments[0]?arguments[0]:{},t=e.userAgent,n=void 0===t?navigator.userAgent:t,r=e.vendor,o=void 0===r?navigator.vendor:r;(0,h.objectEach)(p,function(e){var t=e.test;t(n,o)})}function o(){return p.chrome.value}function i(){return p.edge.value}function a(){return p.ie.value}function s(){return p.ie8.value}function l(){return p.ie9.value}function u(){return p.ie.value||p.edge.value}function c(){return p.mobile.value}function f(){return p.safari.value}t.__esModule=!0,t.setBrowserMeta=r,t.isChrome=o,t.isEdge=i,t.isIE=a,t.isIE8=s,t.isIE9=l,t.isMSBrowser=u,t.isMobileBrowser=c,t.isSafari=f;var h=n(2),d=function(e){var t={value:!1,test:function(n,r){t.value=e(n,r)}};return t},p={chrome:d(function(e,t){return/Chrome/.test(e)&&/Google/.test(t)}),edge:d(function(e){return/Edge/.test(e)}),ie:d(function(e){return/Trident/.test(e)}),ie8:d(function(){return!document.createTextNode("test").textContent}),ie9:d(function(){return!!document.documentMode}),mobile:d(function(e){return/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(e)}),safari:d(function(e,t){return/Safari/.test(e)&&/Apple Computer/.test(t)})};r()},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0],t=this.shouldBeRendered();this.clone&&(this.needFullRender||t)&&this.clone.draw(e),this.needFullRender=t}},{key:"reset",value:function(){if(this.clone){var e=this.clone.wtTable.holder,t=this.clone.wtTable.hider,n=e.style,r=t.style,o=e.parentNode.style;(0,u.arrayEach)([n,r,o],function(e){e.width="",e.height=""})}}},{key:"destroy",value:function(){new c.default(this.clone).destroy()}}]),e}(),p=d;t.default=p},function(e,t,n){var r=n(7);e.exports=function(e,t){if(!r(e))return e;var n,o;if(t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;if("function"==typeof(n=e.valueOf)&&!r(o=n.call(e)))return o;if(!t&&"function"==typeof(n=e.toString)&&!r(o=n.call(e)))return o;throw TypeError("Can't convert object to primitive value")}},function(e,t,n){var r=n(51)("meta"),o=n(7),i=n(27),a=n(17).f,s=0,l=Object.isExtensible||function(){return!0},u=!n(4)(function(){return l(Object.preventExtensions({}))}),c=function(e){a(e,r,{value:{i:"O"+ ++s,w:{}}})},f=function(e,t){if(!o(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!i(e,r)){if(!l(e))return"F";if(!t)return"E";c(e)}return e[r].i},h=function(e,t){if(!i(e,r)){if(!l(e))return!0;if(!t)return!1;c(e)}return e[r].w},d=function(e){return u&&p.NEED&&l(e)&&!i(e,r)&&c(e),e},p=e.exports={KEY:r,NEED:!1,fastKey:f,getWeak:h,onFreeze:d}},function(e,t,n){"use strict";function r(e){return a(e)||i(e)||o()}function o(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function i(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}function a(e){if(Array.isArray(e)){ for(var t=0,n=new Array(e.length);t0&&void 0!==arguments[0]?arguments[0]:"common";l.has(a)||l.set(a,new Map);var s=l.get(a);return{register:e,getItem:t,hasItem:n,getNames:o,getValues:i}}t.__esModule=!0,t.default=s,t.collection=void 0;var l=new Map;t.collection=l},function(e,t,n){"use strict";function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function o(e){return g.call(window,e)}function i(e){v.call(window,e)}function a(){return"ontouchstart"in window}function s(){var e=document.createElement("div");return!(!e.createShadowRoot||!e.createShadowRoot.toString().match(/\[native code\]/))}function l(){var e=document.createElement("TABLE");e.style.borderSpacing="0",e.style.borderWidth="0",e.style.padding="0";var t=document.createElement("TBODY");e.appendChild(t),t.appendChild(document.createElement("TR")),t.firstChild.appendChild(document.createElement("TD")),t.firstChild.firstChild.innerHTML="t
      t";var n=document.createElement("CAPTION");n.innerHTML="c
      c
      c
      c",n.style.padding="0",n.style.margin="0",e.insertBefore(n,t),document.body.appendChild(e),f=e.offsetHeight<2*e.lastChild.offsetHeight,document.body.removeChild(e)}function u(){return void 0===f&&l(),f}function c(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return h||(h="object"===("undefined"==typeof Intl?"undefined":r(Intl))?new Intl.Collator(e,t).compare:"function"==typeof String.prototype.localeCompare?function(e,t){return"".concat(e).localeCompare(t)}:function(e,t){return e===t?0:e>t?-1:1},h)}t.__esModule=!0,t.requestAnimationFrame=o,t.cancelAnimationFrame=i,t.isTouchSupported=a,t.isWebComponentSupportedNatively=s,t.hasCaptionProblem=u,t.getComparisonFunction=c;for(var f,h,d=0,p=["ms","moz","webkit","o"],g=window.requestAnimationFrame,v=window.cancelAnimationFrame,y=0;y1&&void 0!==arguments[1]?arguments[1]:{};return"".concat(e).replace(/(?:\\)?\[([^[\]]+)]/g,function(e,n){return"\\"===e.charAt(0)?e.substr(1,e.length-1):void 0===t[n]?"":t[n]})}function l(e){return"".concat(e).replace(c,"")}t.__esModule=!0,t.toUpperCaseFirst=r,t.equalsIgnoreCase=o,t.randomString=i,t.isPercentValue=a,t.substitute=s,t.stripTags=l;var u=n(14),c=/<\/?\w+\/?>|<\w+[\s|/][^>]*>/gi},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){if("function"==typeof e)return e;if(!d(e))throw Error('No registered validator found under "'.concat(e,'" name'));return h(e)}t.__esModule=!0,t.getValidator=o,t.getRegisteredValidators=t.getRegisteredValidatorNames=t.hasValidator=t.registerValidator=void 0;var i=r(n(46)),a=r(n(631)),s=r(n(632)),l=r(n(633)),u=r(n(634)),c=(0,i.default)("validators"),f=c.register,h=c.getItem,d=c.hasItem,p=c.getNames,g=c.getValues;t.getRegisteredValidators=g,t.getRegisteredValidatorNames=p,t.hasValidator=d,t.registerValidator=f,f("autocomplete",a.default),f("date",s.default),f("numeric",l.default),f("time",u.default)},function(e,t){e.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},function(e,t){var n=0,r=Math.random();e.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++n+r).toString(36))}},function(e,t){e.exports=!1},function(e,t,n){var r=n(132),o=n(96);e.exports=Object.keys||function(e){return r(e,o)}},function(e,t,n){var r=n(33),o=Math.max,i=Math.min;e.exports=function(e,t){return e=r(e),e<0?o(e+t,0):i(e,t)}},function(e,t,n){var r=n(5),o=n(133),i=n(96),a=n(95)("IE_PROTO"),s=function(){},l="prototype",u=function(){var e,t=n(92)("iframe"),r=i.length,o="<",a=">";for(t.style.display="none",n(98).appendChild(t),t.src="javascript:",e=t.contentWindow.document,e.open(),e.write(o+"script"+a+"document.F=Object"+o+"/script"+a),e.close(),u=e.F;r--;)delete u[l][i[r]];return u()};e.exports=Object.create||function(e,t){var n;return null!==e?(s[l]=r(e),n=new s,s[l]=null,n[a]=e):n=u(),void 0===t?n:o(n,t)}},function(e,t,n){var r=n(132),o=n(96).concat("length","prototype");t.f=Object.getOwnPropertyNames||function(e){return r(e,o)}},function(e,t,n){var r=n(27),o=n(24),i=n(95)("IE_PROTO"),a=Object.prototype;e.exports=Object.getPrototypeOf||function(e){return e=o(e),r(e,i)?e[i]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?a:null}},function(e,t,n){"use strict";function r(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r1&&void 0!==arguments[1]?arguments[1]:200,r=0,o={lastCallThrottled:!0},i=null;return t}function i(e){function t(){s=i}function n(){for(var t=arguments.length,n=new Array(t),r=0;r1&&void 0!==arguments[1]?arguments[1]:200,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:10,a=o(e,r),s=i;return n.clearHits=t,n}function a(e){function t(){for(var t=this,i=arguments.length,a=new Array(i),s=0;s1&&void 0!==arguments[1]?arguments[1]:200,o=null;return t}function s(){for(var e=arguments.length,t=new Array(e),n=0;n1?t-1:0),r=1;r=n?e.apply(this,l):t(l),s}}var n=e.length;return t([])}function c(e){function t(r){return function(){for(var o=arguments.length,i=new Array(o),a=0;a=n?e.apply(this,l):t(l),s}}var n=e.length;return t([])}t.__esModule=!0,t.isFunction=r,t.throttle=o,t.throttleAfterHits=i,t.debounce=a,t.pipe=s,t.partial=l,t.curry=u,t.curryRight=c;var f=n(3)},function(e,t,n){var r=n(17).f,o=n(27),i=n(12)("toStringTag");e.exports=function(e,t,n){e&&!o(e=n?e:e.prototype,i)&&r(e,i,{configurable:!0,value:t})}},function(e,t){e.exports={}},function(e,t,n){var r=n(12)("unscopables"),o=Array.prototype;null==o[r]&&n(28)(o,r,{}),e.exports=function(e){o[r][e]=!0}},function(e,t,n){"use strict";var r=n(6),o=n(17),i=n(20),a=n(12)("species");e.exports=function(e){var t=r[e];i&&t&&!t[a]&&o.f(t,a,{configurable:!0,get:function(){return this}})}},function(e,t){e.exports=function(e,t,n,r){if(!(e instanceof t)||void 0!==r&&r in e)throw TypeError(n+": incorrect invocation!");return e}},function(e,t,n){var r=n(23);e.exports=function(e,t,n){for(var o in t)r(e,o,t[o],n);return e}},function(e,t,n){var r=n(7);e.exports=function(e,t){if(!r(e)||e._t!==t)throw TypeError("Incompatible receiver, "+t+" required!");return e}},function(e,t,n){(function(e){var t;t=function(){"use strict";function t(){return Mr.apply(null,arguments)}function r(e){Mr=e}function o(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function i(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function a(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;var t;for(t in e)if(e.hasOwnProperty(t))return!1;return!0}function s(e){return void 0===e}function l(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function u(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function c(e,t){var n,r=[];for(n=0;n0)for(n=0;n0?"future":"past"];return R(n)?n(t):n.replace(/%s/i,t)}function I(e,t){var n=e.toLowerCase();Br[n]=Br[n+"s"]=Br[t]=e}function j(e){return"string"==typeof e?Br[e]||Br[e.toLowerCase()]:void 0}function F(e){var t,n,r={};for(n in e)f(e,n)&&(t=j(n),t&&(r[t]=e[n]));return r}function W(e,t){Vr[e]=t}function B(e){var t=[];for(var n in e)t.push({unit:n,priority:Vr[n]});return t.sort(function(e,t){return e.priority-t.priority}),t}function V(e,t,n){var r=""+Math.abs(e),o=t-r.length,i=e>=0;return(i?n?"+":"":"-")+Math.pow(10,Math.max(0,o)).toString().substr(1)+r}function Y(e,t,n,r){var o=r;"string"==typeof r&&(o=function(){return this[r]()}),e&&(Gr[e]=o),t&&(Gr[t[0]]=function(){return V(o.apply(this,arguments),t[1],t[2])}),n&&(Gr[n]=function(){return this.localeData().ordinal(o.apply(this,arguments),e)})}function U(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function z(e){var t,n,r=e.match(Yr);for(t=0,n=r.length;t=0&&Ur.test(e);)e=e.replace(Ur,n),Ur.lastIndex=0,r-=1;return e}function K(e,t,n){co[e]=R(t)?t:function(e,r){return e&&n?n:t}}function q(e,t){return f(co,e)?co[e](t._strict,t._locale):new RegExp(Z(e))}function Z(e){return $(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,n,r,o){return t||n||r||o}))}function $(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function J(e,t){var n,r=t;for("string"==typeof e&&(e=[e]),l(t)&&(r=function(e,n){n[t]=S(e)}),n=0;n=0&&isFinite(s.getFullYear())&&s.setFullYear(e),s}function Se(e){var t=new Date(Date.UTC.apply(null,arguments));return e<100&&e>=0&&isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e),t}function _e(e,t,n){var r=7+t-n,o=(7+Se(e,0,r).getUTCDay()-t)%7;return-o+r-1}function Ee(e,t,n,r,o){var i,a,s=(7+n-r)%7,l=_e(e,r,o),u=1+7*(t-1)+s+l;return u<=0?(i=e-1,a=te(i)+u):u>te(e)?(i=e+1,a=u-te(e)):(i=e,a=u),{year:i,dayOfYear:a}}function Oe(e,t,n){var r,o,i=_e(e.year(),t,n),a=Math.floor((e.dayOfYear()-i-1)/7)+1;return a<1?(o=e.year()-1,r=a+Te(o,t,n)):a>Te(e.year(),t,n)?(r=a-Te(e.year(),t,n),o=e.year()+1):(o=e.year(),r=a),{week:r,year:o}}function Te(e,t,n){var r=_e(e,t,n),o=_e(e+1,t,n);return(te(e)-r+o)/7}function Re(e){return Oe(e,this._week.dow,this._week.doy).week}function ke(){return this._week.dow}function Me(){return this._week.doy}function Ne(e){var t=this.localeData().week(this);return null==e?t:this.add(7*(e-t),"d")}function De(e){var t=Oe(this,1,4).week;return null==e?t:this.add(7*(e-t),"d")}function Ae(e,t){return"string"!=typeof e?e:isNaN(e)?(e=t.weekdaysParse(e),"number"==typeof e?e:null):parseInt(e,10)}function Pe(e,t){return"string"==typeof e?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}function Le(e,t){return e?o(this._weekdays)?this._weekdays[e.day()]:this._weekdays[this._weekdays.isFormat.test(t)?"format":"standalone"][e.day()]:o(this._weekdays)?this._weekdays:this._weekdays.standalone}function He(e){return e?this._weekdaysShort[e.day()]:this._weekdaysShort}function xe(e){return e?this._weekdaysMin[e.day()]:this._weekdaysMin}function Ie(e,t,n){var r,o,i,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],r=0;r<7;++r)i=d([2e3,1]).day(r),this._minWeekdaysParse[r]=this.weekdaysMin(i,"").toLocaleLowerCase(),this._shortWeekdaysParse[r]=this.weekdaysShort(i,"").toLocaleLowerCase(),this._weekdaysParse[r]=this.weekdays(i,"").toLocaleLowerCase();return n?"dddd"===t?(o=So.call(this._weekdaysParse,a),-1!==o?o:null):"ddd"===t?(o=So.call(this._shortWeekdaysParse,a),-1!==o?o:null):(o=So.call(this._minWeekdaysParse,a),-1!==o?o:null):"dddd"===t?(o=So.call(this._weekdaysParse,a),-1!==o?o:(o=So.call(this._shortWeekdaysParse,a),-1!==o?o:(o=So.call(this._minWeekdaysParse,a),-1!==o?o:null))):"ddd"===t?(o=So.call(this._shortWeekdaysParse,a),-1!==o?o:(o=So.call(this._weekdaysParse,a),-1!==o?o:(o=So.call(this._minWeekdaysParse,a),-1!==o?o:null))):(o=So.call(this._minWeekdaysParse,a),-1!==o?o:(o=So.call(this._weekdaysParse,a),-1!==o?o:(o=So.call(this._shortWeekdaysParse,a),-1!==o?o:null)))}function je(e,t,n){var r,o,i;if(this._weekdaysParseExact)return Ie.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),r=0;r<7;r++){if(o=d([2e3,1]).day(r),n&&!this._fullWeekdaysParse[r]&&(this._fullWeekdaysParse[r]=new RegExp("^"+this.weekdays(o,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[r]=new RegExp("^"+this.weekdaysShort(o,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[r]=new RegExp("^"+this.weekdaysMin(o,"").replace(".",".?")+"$","i")),this._weekdaysParse[r]||(i="^"+this.weekdays(o,"")+"|^"+this.weekdaysShort(o,"")+"|^"+this.weekdaysMin(o,""),this._weekdaysParse[r]=new RegExp(i.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[r].test(e))return r;if(n&&"ddd"===t&&this._shortWeekdaysParse[r].test(e))return r;if(n&&"dd"===t&&this._minWeekdaysParse[r].test(e))return r;if(!n&&this._weekdaysParse[r].test(e))return r}}function Fe(e){if(!this.isValid())return null!=e?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=e?(e=Ae(e,this.localeData()),this.add(e-t,"d")):t}function We(e){if(!this.isValid())return null!=e?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return null==e?t:this.add(e-t,"d")}function Be(e){if(!this.isValid())return null!=e?this:NaN;if(null!=e){var t=Pe(e,this.localeData());return this.day(this.day()%7?t:t-7)}return this.day()||7}function Ve(e){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||ze.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(f(this,"_weekdaysRegex")||(this._weekdaysRegex=Po),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)}function Ye(e){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||ze.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(f(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Lo),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Ue(e){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||ze.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(f(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Ho),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function ze(){function e(e,t){return t.length-e.length}var t,n,r,o,i,a=[],s=[],l=[],u=[];for(t=0;t<7;t++)n=d([2e3,1]).day(t),r=this.weekdaysMin(n,""),o=this.weekdaysShort(n,""),i=this.weekdays(n,""),a.push(r),s.push(o),l.push(i),u.push(r),u.push(o),u.push(i);for(a.sort(e),s.sort(e),l.sort(e),u.sort(e),t=0;t<7;t++)s[t]=$(s[t]),l[t]=$(l[t]),u[t]=$(u[t]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function Ge(){return this.hours()%12||12}function Xe(){return this.hours()||24}function Ke(e,t){Y(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function qe(e,t){return t._meridiemParse}function Ze(e){return"p"===(e+"").toLowerCase().charAt(0)}function $e(e,t,n){return e>11?n?"pm":"PM":n?"am":"AM"}function Je(e){return e?e.toLowerCase().replace("_","-"):e}function Qe(e){for(var t,n,r,o,i=0;i0;){if(r=et(o.slice(0,t).join("-")),r)return r;if(n&&n.length>=t&&_(o,n,!0)>=t-1)break;t--}i++}return null}function et(t){var r=null;if(!Wo[t]&&void 0!==e&&e&&e.exports)try{r=xo._abbr;n(606)("./"+t),tt(r)}catch(e){}return Wo[t]}function tt(e,t){var n;return e&&(n=s(t)?ot(e):nt(e,t),n&&(xo=n)),xo._abbr}function nt(e,t){if(null!==t){var n=Fo;if(t.abbr=e,null!=Wo[e])T("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),n=Wo[e]._config;else if(null!=t.parentLocale){if(null==Wo[t.parentLocale])return Bo[t.parentLocale]||(Bo[t.parentLocale]=[]),Bo[t.parentLocale].push({name:e,config:t}),null;n=Wo[t.parentLocale]._config}return Wo[e]=new N(M(n,t)),Bo[e]&&Bo[e].forEach(function(e){nt(e.name,e.config)}),tt(e),Wo[e]}return delete Wo[e],null}function rt(e,t){if(null!=t){var n,r,o=Fo;r=et(e),null!=r&&(o=r._config),t=M(o,t),n=new N(t),n.parentLocale=Wo[e],Wo[e]=n,tt(e)}else null!=Wo[e]&&(null!=Wo[e].parentLocale?Wo[e]=Wo[e].parentLocale:null!=Wo[e]&&delete Wo[e]);return Wo[e]}function ot(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return xo;if(!o(e)){if(t=et(e),t)return t;e=[e]}return Qe(e)}function it(){return Dr(Wo)}function at(e){var t,n=e._a;return n&&-2===g(e).overflow&&(t=n[po]<0||n[po]>11?po:n[go]<1||n[go]>ce(n[ho],n[po])?go:n[vo]<0||n[vo]>24||24===n[vo]&&(0!==n[yo]||0!==n[mo]||0!==n[wo])?vo:n[yo]<0||n[yo]>59?yo:n[mo]<0||n[mo]>59?mo:n[wo]<0||n[wo]>999?wo:-1,g(e)._overflowDayOfYear&&(tgo)&&(t=go),g(e)._overflowWeeks&&-1===t&&(t=bo),g(e)._overflowWeekday&&-1===t&&(t=Co),g(e).overflow=t),e}function st(e,t,n){return null!=e?e:null!=t?t:n}function lt(e){var n=new Date(t.now());return e._useUTC?[n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate()]:[n.getFullYear(),n.getMonth(),n.getDate()]}function ut(e){var t,n,r,o,i,a=[];if(!e._d){for(r=lt(e),e._w&&null==e._a[go]&&null==e._a[po]&&ct(e),null!=e._dayOfYear&&(i=st(e._a[ho],r[ho]),(e._dayOfYear>te(i)||0===e._dayOfYear)&&(g(e)._overflowDayOfYear=!0),n=Se(i,0,e._dayOfYear),e._a[po]=n.getUTCMonth(),e._a[go]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=a[t]=r[t];for(;t<7;t++)e._a[t]=a[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[vo]&&0===e._a[yo]&&0===e._a[mo]&&0===e._a[wo]&&(e._nextDay=!0,e._a[vo]=0),e._d=(e._useUTC?Se:Ce).apply(null,a),o=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[vo]=24),e._w&&void 0!==e._w.d&&e._w.d!==o&&(g(e).weekdayMismatch=!0)}}function ct(e){var t,n,r,o,i,a,s,l;if(t=e._w,null!=t.GG||null!=t.W||null!=t.E)i=1,a=4,n=st(t.GG,e._a[ho],Oe(Rt(),1,4).year),r=st(t.W,1),o=st(t.E,1),(o<1||o>7)&&(l=!0);else{i=e._locale._week.dow,a=e._locale._week.doy;var u=Oe(Rt(),i,a);n=st(t.gg,e._a[ho],u.year),r=st(t.w,u.week),null!=t.d?(o=t.d,(o<0||o>6)&&(l=!0)):null!=t.e?(o=t.e+i,(t.e<0||t.e>6)&&(l=!0)):o=i}r<1||r>Te(n,i,a)?g(e)._overflowWeeks=!0:null!=l?g(e)._overflowWeekday=!0:(s=Ee(n,r,o,i,a),e._a[ho]=s.year,e._dayOfYear=s.dayOfYear)}function ft(e){var t,n,r,o,i,a,s=e._i,l=Vo.exec(s)||Yo.exec(s);if(l){for(g(e).iso=!0,t=0,n=zo.length;t0&&g(e).unusedInput.push(a),s=s.slice(s.indexOf(r)+r.length),u+=r.length),Gr[i]?(r?g(e).empty=!1:g(e).unusedTokens.push(i),ee(i,r,e)):e._strict&&!r&&g(e).unusedTokens.push(i);g(e).charsLeftOver=l-u,s.length>0&&g(e).unusedInput.push(s),e._a[vo]<=12&&!0===g(e).bigHour&&e._a[vo]>0&&(g(e).bigHour=void 0),g(e).parsedDateParts=e._a.slice(0),g(e).meridiem=e._meridiem,e._a[vo]=bt(e._locale,e._a[vo],e._meridiem),ut(e),at(e)}else yt(e);else ft(e)}function bt(e,t,n){var r;return null==n?t:null!=e.meridiemHour?e.meridiemHour(t,n):null!=e.isPM?(r=e.isPM(n),r&&t<12&&(t+=12),r||12!==t||(t=0),t):t}function Ct(e){var t,n,r,o,i;if(0===e._f.length)return g(e).invalidFormat=!0,void(e._d=new Date(NaN));for(o=0;othis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Kt(){if(!s(this._isDSTShifted))return this._isDSTShifted;var e={};if(m(e,this),e=Et(e),e._a){var t=e._isUTC?d(e._a):Rt(e._a);this._isDSTShifted=this.isValid()&&_(e._a,t.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function qt(){return!!this.isValid()&&!this._isUTC}function Zt(){return!!this.isValid()&&this._isUTC}function $t(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Jt(e,t){var n,r,o,i=e,a=null;return Ht(e)?i={ms:e._milliseconds,d:e._days,M:e._months}:l(e)?(i={},t?i[t]=e:i.milliseconds=e):(a=ti.exec(e))?(n="-"===a[1]?-1:1,i={y:0,d:S(a[go])*n,h:S(a[vo])*n,m:S(a[yo])*n,s:S(a[mo])*n,ms:S(xt(1e3*a[wo]))*n}):(a=ni.exec(e))?(n="-"===a[1]?-1:(a[1],1),i={y:Qt(a[2],n),M:Qt(a[3],n),w:Qt(a[4],n),d:Qt(a[5],n),h:Qt(a[6],n),m:Qt(a[7],n),s:Qt(a[8],n)}):null==i?i={}:"object"==typeof i&&("from"in i||"to"in i)&&(o=tn(Rt(i.from),Rt(i.to)),i={},i.ms=o.milliseconds,i.M=o.months),r=new Lt(i),Ht(e)&&f(e,"_locale")&&(r._locale=e._locale),r}function Qt(e,t){var n=e&&parseFloat(e.replace(",","."));return(isNaN(n)?0:n)*t}function en(e,t){var n={milliseconds:0,months:0};return n.months=t.month()-e.month()+12*(t.year()-e.year()),e.clone().add(n.months,"M").isAfter(t)&&--n.months,n.milliseconds=+t-+e.clone().add(n.months,"M"),n}function tn(e,t){var n;return e.isValid()&&t.isValid()?(t=Ft(t,e),e.isBefore(t)?n=en(e,t):(n=en(t,e),n.milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function nn(e,t){return function(n,r){var o,i;return null===r||isNaN(+r)||(T(t,"moment()."+t+"(period, number) is deprecated. Please use moment()."+t+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),i=n,n=r,r=i),n="string"==typeof n?+n:n,o=Jt(n,r),rn(this,o,e),this}}function rn(e,n,r,o){var i=n._milliseconds,a=xt(n._days),s=xt(n._months);e.isValid()&&(o=null==o||o,s&&ge(e,ie(e,"Month")+s*r),a&&ae(e,"Date",ie(e,"Date")+a*r),i&&e._d.setTime(e._d.valueOf()+i*r),o&&t.updateOffset(e,a||s))}function on(e,t){var n=e.diff(t,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"}function an(e,n){var r=e||Rt(),o=Ft(r,this).startOf("day"),i=t.calendarFormat(this,o)||"sameElse",a=n&&(R(n[i])?n[i].call(this,r):n[i]);return this.format(a||this.localeData().calendar(i,this,Rt(r)))}function sn(){return new w(this)}function ln(e,t){var n=b(e)?e:Rt(e);return!(!this.isValid()||!n.isValid())&&(t=j(s(t)?"millisecond":t),"millisecond"===t?this.valueOf()>n.valueOf():n.valueOf()9999?G(n,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):R(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this._d.valueOf()).toISOString().replace("Z",G(n,"Z")):G(n,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function mn(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="";this.isLocal()||(e=0===this.utcOffset()?"moment.utc":"moment.parseZone",t="Z");var n="["+e+'("]',r=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",o="-MM-DD[T]HH:mm:ss.SSS",i=t+'[")]';return this.format(n+r+o+i)}function wn(e){e||(e=this.isUtc()?t.defaultFormatUtc:t.defaultFormat);var n=G(this,e);return this.localeData().postformat(n)}function bn(e,t){return this.isValid()&&(b(e)&&e.isValid()||Rt(e).isValid())?Jt({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function Cn(e){return this.from(Rt(),e)}function Sn(e,t){return this.isValid()&&(b(e)&&e.isValid()||Rt(e).isValid())?Jt({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function _n(e){return this.to(Rt(),e)}function En(e){var t;return void 0===e?this._locale._abbr:(t=ot(e),null!=t&&(this._locale=t),this)}function On(){return this._locale}function Tn(e){switch(e=j(e),e){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===e&&this.weekday(0),"isoWeek"===e&&this.isoWeekday(1),"quarter"===e&&this.month(3*Math.floor(this.month()/3)),this}function Rn(e){return e=j(e),void 0===e||"millisecond"===e?this:("date"===e&&(e="day"),this.startOf(e).add(1,"isoWeek"===e?"week":e).subtract(1,"ms"))}function kn(){return this._d.valueOf()-6e4*(this._offset||0)}function Mn(){return Math.floor(this.valueOf()/1e3)}function Nn(){return new Date(this.valueOf())}function Dn(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]}function An(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}}function Pn(){return this.isValid()?this.toISOString():null}function Ln(){return v(this)}function Hn(){return h({},g(this))}function xn(){return g(this).overflow}function In(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function jn(e,t){Y(0,[e,e.length],0,t)}function Fn(e){return Yn.call(this,e,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Wn(e){return Yn.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)}function Bn(){return Te(this.year(),1,4)}function Vn(){var e=this.localeData()._week;return Te(this.year(),e.dow,e.doy)}function Yn(e,t,n,r,o){var i;return null==e?Oe(this,r,o).year:(i=Te(e,r,o),t>i&&(t=i),Un.call(this,e,t,n,r,o))}function Un(e,t,n,r,o){var i=Ee(e,t,n,r,o),a=Se(i.year,0,i.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}function zn(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)}function Gn(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==e?t:this.add(e-t,"d")}function Xn(e,t){t[wo]=S(1e3*("0."+e))}function Kn(){return this._isUTC?"UTC":""}function qn(){return this._isUTC?"Coordinated Universal Time":""}function Zn(e){return Rt(1e3*e)}function $n(){return Rt.apply(null,arguments).parseZone()}function Jn(e){return e}function Qn(e,t,n,r){var o=ot(),i=d().set(r,t);return o[n](i,e)}function er(e,t,n){if(l(e)&&(t=e,e=void 0),e=e||"",null!=t)return Qn(e,t,n,"month");var r,o=[];for(r=0;r<12;r++)o[r]=Qn(e,r,n,"month");return o}function tr(e,t,n,r){"boolean"==typeof e?(l(t)&&(n=t,t=void 0),t=t||""):(t=e,n=t,e=!1,l(t)&&(n=t,t=void 0),t=t||"");var o,i=ot(),a=e?i._week.dow:0;if(null!=n)return Qn(t,(n+a)%7,r,"day");var s=[];for(o=0;o<7;o++)s[o]=Qn(t,(o+a)%7,r,"day");return s}function nr(e,t){return er(e,t,"months")}function rr(e,t){return er(e,t,"monthsShort")}function or(e,t,n){return tr(e,t,n,"weekdays")}function ir(e,t,n){return tr(e,t,n,"weekdaysShort")}function ar(e,t,n){return tr(e,t,n,"weekdaysMin")}function sr(){var e=this._data;return this._milliseconds=di(this._milliseconds),this._days=di(this._days),this._months=di(this._months),e.milliseconds=di(e.milliseconds),e.seconds=di(e.seconds),e.minutes=di(e.minutes),e.hours=di(e.hours),e.months=di(e.months),e.years=di(e.years),this}function lr(e,t,n,r){var o=Jt(t,n);return e._milliseconds+=r*o._milliseconds,e._days+=r*o._days,e._months+=r*o._months,e._bubble()}function ur(e,t){return lr(this,e,t,1)}function cr(e,t){return lr(this,e,t,-1)}function fr(e){return e<0?Math.floor(e):Math.ceil(e)}function hr(){var e,t,n,r,o,i=this._milliseconds,a=this._days,s=this._months,l=this._data;return i>=0&&a>=0&&s>=0||i<=0&&a<=0&&s<=0||(i+=864e5*fr(pr(s)+a),a=0,s=0),l.milliseconds=i%1e3,e=C(i/1e3),l.seconds=e%60,t=C(e/60),l.minutes=t%60,n=C(t/60),l.hours=n%24,a+=C(n/24),o=C(dr(a)),s+=o,a-=fr(pr(o)),r=C(s/12),s%=12,l.days=a,l.months=s,l.years=r,this}function dr(e){return 4800*e/146097}function pr(e){return 146097*e/4800}function gr(e){if(!this.isValid())return NaN;var t,n,r=this._milliseconds;if(e=j(e),"month"===e||"year"===e)return t=this._days+r/864e5,n=this._months+dr(t),"month"===e?n:n/12;switch(t=this._days+Math.round(pr(this._months)),e){case"week":return t/7+r/6048e5;case"day":return t+r/864e5;case"hour":return 24*t+r/36e5;case"minute":return 1440*t+r/6e4;case"second":return 86400*t+r/1e3;case"millisecond":return Math.floor(864e5*t)+r;default:throw new Error("Unknown unit "+e)}}function vr(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*S(this._months/12):NaN}function yr(e){return function(){return this.as(e)}}function mr(){return Jt(this)}function wr(e){return e=j(e),this.isValid()?this[e+"s"]():NaN}function br(e){return function(){return this.isValid()?this._data[e]:NaN}}function Cr(){return C(this.days()/7)}function Sr(e,t,n,r,o){return o.relativeTime(t||1,!!n,e,r)}function _r(e,t,n){var r=Jt(e).abs(),o=Mi(r.as("s")),i=Mi(r.as("m")),a=Mi(r.as("h")),s=Mi(r.as("d")),l=Mi(r.as("M")),u=Mi(r.as("y")),c=o<=Ni.ss&&["s",o]||o0,c[4]=n,Sr.apply(null,c)}function Er(e){return void 0===e?Mi:"function"==typeof e&&(Mi=e,!0)}function Or(e,t){return void 0!==Ni[e]&&(void 0===t?Ni[e]:(Ni[e]=t,"s"===e&&(Ni.ss=t-1),!0))}function Tr(e){if(!this.isValid())return this.localeData().invalidDate();var t=this.localeData(),n=_r(this,!e,t);return e&&(n=t.pastFuture(+this,n)),t.postformat(n)}function Rr(e){return(e>0)-(e<0)||+e}function kr(){if(!this.isValid())return this.localeData().invalidDate();var e,t,n,r=Di(this._milliseconds)/1e3,o=Di(this._days),i=Di(this._months);e=C(r/60),t=C(e/60),r%=60,e%=60,n=C(i/12),i%=12;var a=n,s=i,l=o,u=t,c=e,f=r?r.toFixed(3).replace(/\.?0+$/,""):"",h=this.asSeconds();if(!h)return"P0D";var d=h<0?"-":"",p=Rr(this._months)!==Rr(h)?"-":"",g=Rr(this._days)!==Rr(h)?"-":"",v=Rr(this._milliseconds)!==Rr(h)?"-":"";return d+"P"+(a?p+a+"Y":"")+(s?p+s+"M":"")+(l?g+l+"D":"")+(u||c||f?"T":"")+(u?v+u+"H":"")+(c?v+c+"M":"")+(f?v+f+"S":"")}var Mr,Nr;Nr=Array.prototype.some?Array.prototype.some:function(e){for(var t=Object(this),n=t.length>>>0,r=0;r68?1900:2e3)};var So,_o=oe("FullYear",!0);So=Array.prototype.indexOf?Array.prototype.indexOf:function(e){var t;for(t=0;tthis?this:e:y()}),Jo=function(){return Date.now?Date.now():+new Date},Qo=["year","quarter","month","week","day","hour","minute","second","millisecond"];It("Z",":"),It("ZZ",""),K("Z",so),K("ZZ",so),J(["Z","ZZ"],function(e,t,n){n._useUTC=!0,n._tzm=jt(so,e)});var ei=/([\+\-]|\d\d)/gi;t.updateOffset=function(){};var ti=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,ni=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;Jt.fn=Lt.prototype,Jt.invalid=Pt;var ri=nn(1,"add"),oi=nn(-1,"subtract");t.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",t.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var ii=O("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return void 0===e?this.localeData():this.locale(e)});Y(0,["gg",2],0,function(){return this.weekYear()%100}),Y(0,["GG",2],0,function(){return this.isoWeekYear()%100}),jn("gggg","weekYear"),jn("ggggg","weekYear"),jn("GGGG","isoWeekYear"),jn("GGGGG","isoWeekYear"),I("weekYear","gg"),I("isoWeekYear","GG"),W("weekYear",1),W("isoWeekYear",1),K("G",io),K("g",io),K("GG",Jr,Kr),K("gg",Jr,Kr),K("GGGG",no,Zr),K("gggg",no,Zr),K("GGGGG",ro,$r),K("ggggg",ro,$r),Q(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,r){t[r.substr(0,2)]=S(e)}),Q(["gg","GG"],function(e,n,r,o){n[o]=t.parseTwoDigitYear(e)}),Y("Q",0,"Qo","quarter"),I("quarter","Q"),W("quarter",7),K("Q",Xr),J("Q",function(e,t){t[po]=3*(S(e)-1)}),Y("D",["DD",2],"Do","date"),I("date","D"),W("date",9),K("D",Jr),K("DD",Jr,Kr),K("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),J(["D","DD"],go),J("Do",function(e,t){t[go]=S(e.match(Jr)[0])});var ai=oe("Date",!0);Y("DDD",["DDDD",3],"DDDo","dayOfYear"),I("dayOfYear","DDD"),W("dayOfYear",4),K("DDD",to),K("DDDD",qr),J(["DDD","DDDD"],function(e,t,n){n._dayOfYear=S(e)}),Y("m",["mm",2],0,"minute"),I("minute","m"),W("minute",14),K("m",Jr),K("mm",Jr,Kr),J(["m","mm"],yo);var si=oe("Minutes",!1);Y("s",["ss",2],0,"second"),I("second","s"),W("second",15),K("s",Jr),K("ss",Jr,Kr),J(["s","ss"],mo);var li,ui=oe("Seconds",!1);for(Y("S",0,0,function(){return~~(this.millisecond()/100)}),Y(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),Y(0,["SSS",3],0,"millisecond"),Y(0,["SSSS",4],0,function(){return 10*this.millisecond()}),Y(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),Y(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),Y(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),Y(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),Y(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),I("millisecond","ms"),W("millisecond",16),K("S",to,Xr),K("SS",to,Kr),K("SSS",to,qr),li="SSSS";li.length<=9;li+="S")K(li,oo);for(li="S";li.length<=9;li+="S")J(li,Xn);var ci=oe("Milliseconds",!1);Y("z",0,0,"zoneAbbr"),Y("zz",0,0,"zoneName");var fi=w.prototype;fi.add=ri,fi.calendar=an,fi.clone=sn,fi.diff=pn,fi.endOf=Rn,fi.format=wn,fi.from=bn,fi.fromNow=Cn,fi.to=Sn,fi.toNow=_n,fi.get=se,fi.invalidAt=xn,fi.isAfter=ln,fi.isBefore=un,fi.isBetween=cn,fi.isSame=fn,fi.isSameOrAfter=hn,fi.isSameOrBefore=dn,fi.isValid=Ln,fi.lang=ii,fi.locale=En,fi.localeData=On,fi.max=$o,fi.min=Zo,fi.parsingFlags=Hn,fi.set=le,fi.startOf=Tn,fi.subtract=oi,fi.toArray=Dn,fi.toObject=An,fi.toDate=Nn,fi.toISOString=yn,fi.inspect=mn,fi.toJSON=Pn,fi.toString=vn,fi.unix=Mn,fi.valueOf=kn,fi.creationData=In,fi.year=_o,fi.isLeapYear=re,fi.weekYear=Fn,fi.isoWeekYear=Wn,fi.quarter=fi.quarters=zn,fi.month=ve,fi.daysInMonth=ye,fi.week=fi.weeks=Ne,fi.isoWeek=fi.isoWeeks=De,fi.weeksInYear=Vn,fi.isoWeeksInYear=Bn,fi.date=ai,fi.day=fi.days=Fe,fi.weekday=We,fi.isoWeekday=Be,fi.dayOfYear=Gn,fi.hour=fi.hours=jo,fi.minute=fi.minutes=si,fi.second=fi.seconds=ui,fi.millisecond=fi.milliseconds=ci,fi.utcOffset=Bt,fi.utc=Yt,fi.local=Ut,fi.parseZone=zt,fi.hasAlignedHourOffset=Gt,fi.isDST=Xt,fi.isLocal=qt,fi.isUtcOffset=Zt,fi.isUtc=$t,fi.isUTC=$t,fi.zoneAbbr=Kn,fi.zoneName=qn,fi.dates=O("dates accessor is deprecated. Use date instead.",ai),fi.months=O("months accessor is deprecated. Use month instead",ve),fi.years=O("years accessor is deprecated. Use year instead",_o),fi.zone=O("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",Vt),fi.isDSTShifted=O("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Kt);var hi=N.prototype;hi.calendar=D,hi.longDateFormat=A,hi.invalidDate=P,hi.ordinal=L,hi.preparse=Jn,hi.postformat=Jn,hi.relativeTime=H,hi.pastFuture=x,hi.set=k,hi.months=fe,hi.monthsShort=he,hi.monthsParse=pe,hi.monthsRegex=we,hi.monthsShortRegex=me,hi.week=Re,hi.firstDayOfYear=Me,hi.firstDayOfWeek=ke,hi.weekdays=Le,hi.weekdaysMin=xe,hi.weekdaysShort=He,hi.weekdaysParse=je,hi.weekdaysRegex=Ve,hi.weekdaysShortRegex=Ye,hi.weekdaysMinRegex=Ue,hi.isPM=Ze,hi.meridiem=$e,tt("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10,n=1===S(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+n}}),t.lang=O("moment.lang is deprecated. Use moment.locale instead.",tt),t.langData=O("moment.langData is deprecated. Use moment.localeData instead.",ot);var di=Math.abs,pi=yr("ms"),gi=yr("s"),vi=yr("m"),yi=yr("h"),mi=yr("d"),wi=yr("w"),bi=yr("M"),Ci=yr("y"),Si=br("milliseconds"),_i=br("seconds"),Ei=br("minutes"),Oi=br("hours"),Ti=br("days"),Ri=br("months"),ki=br("years"),Mi=Math.round,Ni={ss:44,s:45,m:45,h:22,d:26,M:11},Di=Math.abs,Ai=Lt.prototype;return Ai.isValid=At,Ai.abs=sr,Ai.add=ur,Ai.subtract=cr,Ai.as=gr,Ai.asMilliseconds=pi,Ai.asSeconds=gi,Ai.asMinutes=vi,Ai.asHours=yi,Ai.asDays=mi,Ai.asWeeks=wi,Ai.asMonths=bi,Ai.asYears=Ci,Ai.valueOf=vr,Ai._bubble=hr,Ai.clone=mr,Ai.get=wr,Ai.milliseconds=Si,Ai.seconds=_i,Ai.minutes=Ei,Ai.hours=Oi,Ai.days=Ti,Ai.weeks=Cr,Ai.months=Ri,Ai.years=ki,Ai.humanize=Tr,Ai.toISOString=kr,Ai.toString=kr,Ai.toJSON=kr,Ai.locale=En,Ai.localeData=On,Ai.toIsoString=O("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",kr),Ai.lang=ii,Y("X",0,0,"unix"),Y("x",0,0,"valueOf"),K("x",io),K("X",lo),J("X",function(e,t,n){n._d=new Date(1e3*parseFloat(e,10))}),J("x",function(e,t,n){n._d=new Date(S(e))}),t.version="2.20.1",r(Rt),t.fn=fi,t.min=Mt,t.max=Nt,t.now=Jo,t.utc=d,t.unix=Zn,t.months=nr,t.isDate=u,t.locale=tt,t.invalid=y,t.duration=Jt,t.isMoment=b,t.weekdays=or,t.parseZone=$n,t.localeData=ot,t.isDuration=Ht,t.monthsShort=rr,t.weekdaysMin=ar,t.defineLocale=nt,t.updateLocale=rt,t.locales=it,t.weekdaysShort=ir,t.normalizeUnits=j,t.relativeTimeRounding=Er,t.relativeTimeThreshold=Or,t.calendarFormat=on,t.prototype=fi,t.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"YYYY-[W]WW",MONTH:"YYYY-MM"},t},e.exports=t(),window.moment=n(67)}).call(t,n(166)(e))},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var r=n(3),o=n(2),i="localHooks",a={_localHooks:Object.create(null),addLocalHook:function(e,t){return this._localHooks[e]||(this._localHooks[e]=[]),this._localHooks[e].push(t),this},runLocalHooks:function(e){for(var t=this,n=arguments.length,o=new Array(n>1?n-1:0),i=1;i'.concat(String.fromCharCode(10003),"").concat(e)}t.__esModule=!0,t.createId=r,t.createDefaultCustomBorder=o,t.createSingleEmptyBorder=i,t.createDefaultHtBorder=a,t.createEmptyBorders=s,t.extendDefaultBorder=l,t.checkSelectionBorders=u,t.markSelected=c;var f=n(2),h=n(3)},function(e,t,n){var r=n(39);e.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==r(e)?e.split(""):Object(e)}},function(e,t){t.f={}.propertyIsEnumerable},function(e,t,n){var r=n(39),o=n(12)("toStringTag"),i="Arguments"==r(function(){return arguments}()),a=function(e,t){try{return e[t]}catch(e){}};e.exports=function(e){var t,n,s;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=a(t=Object(e),o))?n:i?r(t):"Object"==(s=r(t))&&"function"==typeof t.callee?"Arguments":s}},function(e,t,n){var r=n(5),o=n(38),i=n(12)("species");e.exports=function(e,t){var n,a=r(e).constructor;return void 0===a||null==(n=r(a)[i])?t:o(n)}},function(e,t,n){"use strict";function r(e){this.instance=e, this.state=a.VIRGIN,this._opened=!1,this._fullEditMode=!1,this._closeCallback=null,this.init()}t.__esModule=!0,t.default=t.EditorState=void 0;var o=n(8),i=n(14),a={VIRGIN:"STATE_VIRGIN",EDITING:"STATE_EDITING",WAITING:"STATE_WAITING",FINISHED:"STATE_FINISHED"};t.EditorState=a,r.prototype._fireCallbacks=function(e){this._closeCallback&&(this._closeCallback(e),this._closeCallback=null)},r.prototype.init=function(){},r.prototype.getValue=function(){throw Error("Editor getValue() method unimplemented")},r.prototype.setValue=function(){throw Error("Editor setValue() method unimplemented")},r.prototype.open=function(){throw Error("Editor open() method unimplemented")},r.prototype.close=function(){throw Error("Editor close() method unimplemented")},r.prototype.prepare=function(e,t,n,r,o,i){this.TD=r,this.row=e,this.col=t,this.prop=n,this.originalValue=o,this.cellProperties=i,this.state=a.VIRGIN},r.prototype.extend=function(){function e(){for(var e=arguments.length,t=new Array(e),r=0;rn[2]&&(r=n[0],n[0]=n[2],n[2]=r),n[1]>n[3]&&(r=n[1],n[1]=n[3],n[3]=r)):n=[this.row,this.col,null,null],this.instance.populateFromArray(n[0],n[1],e,n[2],n[3],"edit")},r.prototype.beginEditing=function(e,t){if(this.state===a.VIRGIN){if(this.instance.view.scrollViewport(new o.CellCoords(this.row,this.col)),this.state=a.EDITING,this.isInFullEditMode()){var n="string"==typeof e?e:(0,i.stringify)(this.originalValue);this.setValue(n)}this.open(t),this._opened=!0,this.focus(),this.instance.view.render(),this.instance.runHooks("afterBeginEditing",this.row,this.col)}},r.prototype.finishEditing=function(e,t,n){var r,o=this;if(n){var i=this._closeCallback;this._closeCallback=function(e){i&&i(e),n(e),o.instance.view.render()}}if(!this.isWaiting())if(this.state!==a.VIRGIN){if(this.state===a.EDITING){if(e)return this.cancelChanges(),void this.instance.view.render();var s=this.getValue();r=this.instance.getSettings().trimWhitespace?[["string"==typeof s?String.prototype.trim.call(s||""):s]]:[[s]],this.state=a.WAITING,this.saveValue(r,t),this.instance.getCellValidator(this.cellProperties)?this.instance.addHookOnce("postAfterValidate",function(e){o.state=a.FINISHED,o.discardEditor(e)}):(this.state=a.FINISHED,this.discardEditor(!0))}}else this.instance._registerTimeout(function(){o._fireCallbacks(!0)})},r.prototype.cancelChanges=function(){this.state=a.FINISHED,this.discardEditor()},r.prototype.discardEditor=function(e){this.state===a.FINISHED&&(!1===e&&!0!==this.cellProperties.allowInvalid?(this.instance.selectCell(this.row,this.col),this.focus(),this.state=a.EDITING,this._fireCallbacks(!1)):(this.close(),this._opened=!1,this._fullEditMode=!1,this.state=a.VIRGIN,this._fireCallbacks(!0)))},r.prototype.enableFullEditMode=function(){this._fullEditMode=!0},r.prototype.isInFullEditMode=function(){return this._fullEditMode},r.prototype.isOpened=function(){return this._opened},r.prototype.isWaiting=function(){return this.state===a.WAITING},r.prototype.checkEditorSection=function(){var e=this.instance.countRows(),t="";return this.row=e-this.instance.getSettings().fixedRowsBottom?t=this.col=e.getSetting("totalRows")||this.col>=e.getSetting("totalColumns"))}},{key:"isEqual",value:function(e){return e===this||this.row===e.row&&this.col===e.col}},{key:"isSouthEastOf",value:function(e){return this.row>=e.row&&this.col>=e.col}},{key:"isNorthWestOf",value:function(e){return this.row<=e.row&&this.col<=e.col}},{key:"isSouthWestOf",value:function(e){return this.row>=e.row&&this.col<=e.col}},{key:"isNorthEastOf",value:function(e){return this.row<=e.row&&this.col>=e.col}},{key:"toObject",value:function(){return{row:this.row,col:this.col}}}]),e}(),s=a;t.default=s},function(e,t,n){"use strict";function r(){var e;(0,s.isDefined)(console)&&(e=console).log.apply(e,arguments)}function o(){var e;(0,s.isDefined)(console)&&(e=console).warn.apply(e,arguments)}function i(){var e;(0,s.isDefined)(console)&&(e=console).info.apply(e,arguments)}function a(){var e;(0,s.isDefined)(console)&&(e=console).error.apply(e,arguments)}t.__esModule=!0,t.log=r,t.warn=o,t.info=i,t.error=a;var s=n(14)},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0,t.default=void 0;var i=n(1),a=o(n(613)),s=n(42),l=r(n(74)),u=o(n(10)),c=n(32),f=n(18),h=l.default.prototype.extend();h.prototype.init=function(){var e=this;this.createElements(),this.eventManager=new u.default(this),this.bindEvents(),this.autoResize=(0,a.default)(),this.holderZIndex=-1,this.instance.addHook("afterDestroy",function(){e.destroy()})},h.prototype.prepare=function(e,t,n,r,o,i){for(var a=this,u=this.state,c=arguments.length,f=new Array(c>6?c-6:0),h=6;h=0?this.holderZIndex:"",this.textareaParentStyle.position=""},h.prototype.getValue=function(){return this.TEXTAREA.value},h.prototype.setValue=function(e){this.TEXTAREA.value=e},h.prototype.beginEditing=function(){if(this.state===l.EditorState.VIRGIN){this.TEXTAREA.value="";for(var e=arguments.length,t=new Array(e),n=0;n0&&void 0!==arguments[0]&&arguments[0];if(this.state===l.EditorState.EDITING||e)if(this.TD=this.getEditedCell(),this.TD){var t,n=(0,i.offset)(this.TD),r=(0,i.offset)(this.instance.rootElement),o=this.instance.view.wt.wtOverlays.topOverlay.mainTableScrollableElement,a=this.instance.view.wt.wtOverlays.leftOverlay.mainTableScrollableElement,s=this.instance.countRows(),u=o!==window?o.scrollTop:0,c=a!==window?a.scrollLeft:0,f=this.checkEditorSection(),h=["","left"].includes(f)?u:0,d=["","top","bottom"].includes(f)?c:0,p=n.top===r.top?0:1,g=this.instance.getSettings(),v=this.instance.hasColHeaders(),y=this.TD.style.backgroundColor,m=n.top-r.top-p-h,w=n.left-r.left-1-d;switch(f){case"top":t=(0,i.getCssTransform)(this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.holder.parentNode);break;case"left":t=(0,i.getCssTransform)(this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.holder.parentNode);break;case"top-left-corner":t=(0,i.getCssTransform)(this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.holder.parentNode);break;case"bottom-left-corner":t=(0,i.getCssTransform)(this.instance.view.wt.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.holder.parentNode);break;case"bottom":t=(0,i.getCssTransform)(this.instance.view.wt.wtOverlays.bottomOverlay.clone.wtTable.holder.parentNode)}(v&&0===this.instance.getSelectedLast()[0]||g.fixedRowsBottom&&this.instance.getSelectedLast()[0]===s-g.fixedRowsBottom)&&(m+=1),0===this.instance.getSelectedLast()[1]&&(w+=1),t&&-1!==t?this.textareaParentStyle[t[0]]=t[1]:(0,i.resetCssTransform)(this.TEXTAREA_PARENT),this.textareaParentStyle.top="".concat(m,"px"),this.textareaParentStyle.left="".concat(w,"px"),this.showEditableElement();var b=this.instance.view.wt.wtViewport.rowsRenderCalculator.startPosition,C=this.instance.view.wt.wtViewport.columnsRenderCalculator.startPosition,S=this.instance.view.wt.wtOverlays.leftOverlay.getScrollPosition(),_=this.instance.view.wt.wtOverlays.topOverlay.getScrollPosition(),E=(0,i.getScrollbarWidth)(),O=this.TD.offsetTop+b-_,T=this.TD.offsetLeft+C-S,R=(0,i.innerWidth)(this.TD)-8,k=(0,i.hasVerticalScrollbar)(o)?E:0,M=(0,i.hasHorizontalScrollbar)(a)?E:0,N=this.instance.view.maximumVisibleElementWidth(T)-9-k,D=this.TD.scrollHeight+1,A=Math.max(this.instance.view.maximumVisibleElementHeight(O)-M,23),P=(0,i.getComputedStyle)(this.TD);this.TEXTAREA.style.fontSize=P.fontSize,this.TEXTAREA.style.fontFamily=P.fontFamily,this.TEXTAREA.style.backgroundColor=y,this.autoResize.init(this.TEXTAREA,{minHeight:Math.min(D,A),maxHeight:A,minWidth:Math.min(R,N),maxWidth:N},!0)}else e||this.close(!0)},h.prototype.bindEvents=function(){var e=this;this.eventManager.addEventListener(this.TEXTAREA,"cut",function(e){(0,f.stopPropagation)(e)}),this.eventManager.addEventListener(this.TEXTAREA,"paste",function(e){(0,f.stopPropagation)(e)}),this.instance.addHook("afterScrollHorizontally",function(){e.refreshDimensions()}),this.instance.addHook("afterScrollVertically",function(){e.refreshDimensions()}),this.instance.addHook("afterColumnResize",function(){e.refreshDimensions(),e.focus()}),this.instance.addHook("afterRowResize",function(){e.refreshDimensions(),e.focus()}),this.instance.addHook("afterDestroy",function(){e.eventManager.destroy()})},h.prototype.destroy=function(){this.eventManager.destroy()};var p=h;t.default=p},function(e,t,n){"use strict";t.__esModule=!0;var r=n(433);t.registerRootComparator=r.registerRootComparator,t.getRootComparator=r.getRootComparator,t.getCompareFunctionFactory=r.getCompareFunctionFactory;var o=n(679);t.FIRST_AFTER_SECOND=o.FIRST_AFTER_SECOND,t.FIRST_BEFORE_SECOND=o.FIRST_BEFORE_SECOND,t.DO_NOT_SWAP=o.DO_NOT_SWAP,t.sort=o.sort},function(e,t,n){var r=n(29),o=n(16),i=n(54);e.exports=function(e){return function(t,n,a){var s,l=r(t),u=o(l.length),c=i(a,u);if(e&&n!=n){for(;u>c;)if(s=l[c++],s!=s)return!0}else for(;u>c;c++)if((e||c in l)&&l[c]===n)return e||c||0;return!e&&-1}}},function(e,t){t.f=Object.getOwnPropertySymbols},function(e,t,n){var r=n(0),o=n(40),i=n(4),a=n(100),s="["+a+"]",l="​…",u=RegExp("^"+s+s+"*"),c=RegExp(s+s+"*$"),f=function(e,t,n){var o={},s=i(function(){return!!a[e]()||l[e]()!=l}),u=o[e]=s?t(h):a[e];n&&(o[n]=u),r(r.P+r.F*s,"String",o)},h=f.trim=function(e,t){return e=String(o(e)),1&t&&(e=e.replace(u,"")),2&t&&(e=e.replace(c,"")),e};e.exports=f},function(e,t,n){var r=n(12)("iterator"),o=!1;try{var i=[7][r]();i.return=function(){o=!0},Array.from(i,function(){throw 2})}catch(e){}e.exports=function(e,t){if(!t&&!o)return!1;var n=!1;try{var i=[7],a=i[r]();a.next=function(){return{done:n=!0}},i[r]=function(){return a},e(i)}catch(e){}return n}},function(e,t,n){"use strict";var r=n(5);e.exports=function(){var e=r(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t}},function(e,t,n){"use strict";var r=n(72),o=RegExp.prototype.exec;e.exports=function(e,t){var n=e.exec;if("function"==typeof n){var i=n.call(e,t);if("object"!=typeof i)throw new TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==r(e))throw new TypeError("RegExp#exec called on incompatible receiver");return o.call(e,t)}},function(e,t,n){"use strict";n(149);var r=n(23),o=n(28),i=n(4),a=n(40),s=n(12),l=n(115),u=s("species"),c=!i(function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$
      ")}),f=function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2===n.length&&"a"===n[0]&&"b"===n[1]}();e.exports=function(e,t,n){var h=s(e),d=!i(function(){var t={};return t[h]=function(){return 7},7!=""[e](t)}),p=d?!i(function(){var t=!1,n=/a/;return n.exec=function(){return t=!0,null},"split"===e&&(n.constructor={},n.constructor[u]=function(){return n}),n[h](""),!t}):void 0;if(!d||!p||"replace"===e&&!c||"split"===e&&!f){var g=/./[h],v=n(a,h,""[e],function(e,t,n,r,o){return t.exec===l?d&&!o?{done:!0,value:g.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),y=v[0],m=v[1];r(String.prototype,e,y),o(RegExp.prototype,h,2==t?function(e,t){return m.call(e,this,t)}:function(e){return m.call(e,this)})}}},function(e,t,n){var r=n(37),o=n(145),i=n(110),a=n(5),s=n(16),l=n(112),u={},c={};t=e.exports=function(e,t,n,f,h){var d,p,g,v,y=h?function(){return e}:l(e),m=r(n,f,t?2:1),w=0;if("function"!=typeof y)throw TypeError(e+" is not iterable!");if(i(y)){for(d=s(e.length);d>w;w++)if(v=t?m(a(p=e[w])[0],p[1]):m(e[w]),v===u||v===c)return v}else for(g=y.call(e);!(p=g.next()).done;)if(v=o(g,m,p.value,t),v===u||v===c)return v};t.BREAK=u,t.RETURN=c},function(e,t,n){var r=n(6),o=r.navigator;e.exports=o&&o.userAgent||""},function(e,t,n){"use strict";var r=n(6),o=n(0),i=n(23),a=n(65),s=n(45),l=n(86),u=n(64),c=n(7),f=n(4),h=n(82),d=n(60),p=n(101);e.exports=function(e,t,n,g,v,y){var m=r[e],w=m,b=v?"set":"add",C=w&&w.prototype,S={},_=function(e){var t=C[e];i(C,e,"delete"==e?function(e){return!(y&&!c(e))&&t.call(this,0===e?0:e)}:"has"==e?function(e){return!(y&&!c(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return y&&!c(e)?void 0:t.call(this,0===e?0:e)}:"add"==e?function(e){return t.call(this,0===e?0:e),this}:function(e,n){return t.call(this,0===e?0:e,n),this})};if("function"==typeof w&&(y||C.forEach&&!f(function(){(new w).entries().next()}))){var E=new w,O=E[b](y?{}:-0,1)!=E,T=f(function(){E.has(1)}),R=h(function(e){new w(e)}),k=!y&&f(function(){for(var e=new w,t=5;t--;)e[b](t,t);return!e.has(-0)});R||(w=t(function(t,n){u(t,w,e);var r=p(new m,t,w);return null!=n&&l(n,v,r[b],r),r}),w.prototype=C,C.constructor=w),(T||k)&&(_("delete"),_("has"),v&&_("get")),(k||O)&&_(b),y&&C.clear&&delete C.clear}else w=g.getConstructor(t,e,v,b),a(w.prototype,n),s.NEED=!0;return d(w,e),S[e]=w,o(o.G+o.W+o.F*(w!=m),S),y||g.setStrong(w,e,v),w}},function(e,t,n){for(var r,o=n(6),i=n(28),a=n(51),s=a("typed_array"),l=a("view"),u=!(!o.ArrayBuffer||!o.DataView),c=u,f=0,h=9,d="Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array".split(",");f1&&void 0!==arguments[1]?arguments[1]:S;if(t!==S&&t!==_)throw new Error("The second argument is used internally only and cannot be overwritten.");var n=Array.isArray(e),r=t===S,o=v;if(n){var i=e[0];if(0===e.length)o=y;else if(r&&i instanceof d.CellRange)o=w;else if(r&&Array.isArray(i))o=l(i,_);else if(e.length>=2&&e.length<=4){var a=!e.some(function(e,t){return!C[t].includes(s(e))});a&&(o=m)}}return o}function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.keepDirection,r=void 0!==n&&n,o=t.propToCol;if(!b.includes(e))throw new Error("Unsupported selection ranges schema type was provided.");return function(t){var n=e===w,i=n?t.from.row:t[0],a=n?t.from.col:t[1],s=n?t.to.row:t[2],l=n?t.to.col:t[3];if("function"==typeof o&&("string"==typeof a&&(a=o(a)),"string"==typeof l&&(l=o(l))),(0,g.isUndefined)(s)&&(s=i),(0,g.isUndefined)(l)&&(l=a),!r){var u=i,c=a,f=s,h=l;i=Math.min(u,f),a=Math.min(c,h),s=Math.max(u,f),l=Math.max(c,h)}return[i,a,s,l]}}function c(e){var t=l(e);if(t===v||t===y)return[];var n=u(t),o=new Set;(0,p.arrayEach)(e,function(e){var t=n(e),i=r(t,4),a=i[1],s=i[3],l=s-a+1;(0,p.arrayEach)(Array.from(new Array(l),function(e,t){return a+t}),function(e){o.has(e)||o.add(e)})});var i=Array.from(o).sort(function(e,t){return e-t}),a=(0,p.arrayReduce)(i,function(e,t,n,r){return 0!==n&&t===r[n-1]+1?e[e.length-1][1]+=1:e.push([t,1]),e},[]);return a}function f(e){var t=l(e);if(t===v||t===y)return[];var n=u(t),o=new Set;(0,p.arrayEach)(e,function(e){var t=n(e),i=r(t,3),a=i[0],s=i[2],l=s-a+1;(0,p.arrayEach)(Array.from(new Array(l),function(e,t){return a+t}),function(e){o.has(e)||o.add(e)})});var i=Array.from(o).sort(function(e,t){return e-t}),a=(0,p.arrayReduce)(i,function(e,t,n,r){return 0!==n&&t===r[n-1]+1?e[e.length-1][1]+=1:e.push([t,1]),e},[]);return a}function h(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1/0;return"number"==typeof e&&e>=0&&e0;(i>>>=1)&&(t+=t))1&i&&(n+=t);return n}},function(e,t){e.exports=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1}},function(e,t){var n=Math.expm1;e.exports=!n||n(10)>22025.465794806718||n(10)<22025.465794806718||-2e-17!=n(-2e-17)?function(e){return 0==(e=+e)?e:e>-1e-6&&e<1e-6?e+e*e/2:Math.exp(e)-1}:n},function(e,t,n){var r=n(33),o=n(40);e.exports=function(e){return function(t,n){var i,a,s=String(o(t)),l=r(n),u=s.length;return l<0||l>=u?e?"":void 0:(i=s.charCodeAt(l),i<55296||i>56319||l+1===u||(a=s.charCodeAt(l+1))<56320||a>57343?e?s.charAt(l):i:e?s.slice(l,l+2):a-56320+(i-55296<<10)+65536)}}},function(e,t,n){"use strict";var r=n(52),o=n(0),i=n(23),a=n(28),s=n(61),l=n(144),u=n(60),c=n(57),f=n(12)("iterator"),h=!([].keys&&"next"in[].keys()),d="@@iterator",p="keys",g="values",v=function(){return this};e.exports=function(e,t,n,y,m,w,b){l(n,t,y);var C,S,_,E=function(e){if(!h&&e in k)return k[e];switch(e){case p:case g:return function(){return new n(this,e)}}return function(){return new n(this,e)}},O=t+" Iterator",T=m==g,R=!1,k=e.prototype,M=k[f]||k[d]||m&&k[m],N=M||E(m),D=m?T?E("entries"):N:void 0,A="Array"==t&&k.entries||M;if(A&&(_=c(A.call(new e)),_!==Object.prototype&&_.next&&(u(_,O,!0),r||"function"==typeof _[f]||a(_,f,v))),T&&M&&M.name!==g&&(R=!0,N=function(){return M.call(this)}),r&&!b||!h&&!R&&k[f]||a(k,f,N),s[t]=N,s[O]=v,m)if(C={values:T?N:E(g),keys:w?N:E(p),entries:D},b)for(S in C)S in k||i(k,S,C[S]);else o(o.P+o.F*(h||R),t,C);return C}},function(e,t,n){var r=n(108),o=n(40);e.exports=function(e,t,n){if(r(t))throw TypeError("String#"+n+" doesn't accept regex!");return String(o(e))}},function(e,t,n){var r=n(7),o=n(39),i=n(12)("match");e.exports=function(e){var t;return r(e)&&(void 0!==(t=e[i])?!!t:"RegExp"==o(e))}},function(e,t,n){var r=n(12)("match");e.exports=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[r]=!1,!"/./"[e](t)}catch(e){}}return!0}},function(e,t,n){var r=n(61),o=n(12)("iterator"),i=Array.prototype;e.exports=function(e){return void 0!==e&&(r.Array===e||i[o]===e)}},function(e,t,n){"use strict";var r=n(17),o=n(50);e.exports=function(e,t,n){t in e?r.f(e,t,o(0,n)):e[t]=n}},function(e,t,n){var r=n(72),o=n(12)("iterator"),i=n(61);e.exports=n(21).getIteratorMethod=function(e){if(null!=e)return e[o]||e["@@iterator"]||i[r(e)]}},function(e,t,n){"use strict";var r=n(24),o=n(54),i=n(16);e.exports=function(e){for(var t=r(this),n=i(t.length),a=arguments.length,s=o(a>1?arguments[1]:void 0,n),l=a>2?arguments[2]:void 0,u=void 0===l?n:o(l,n);u>s;)t[s++]=e;return t}},function(e,t,n){"use strict";var r=n(62),o=n(148),i=n(61),a=n(29);e.exports=n(106)(Array,"Array",function(e,t){this._t=a(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,o(1)):o(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},function(e,t,n){"use strict";var r,o,i=n(83),a=RegExp.prototype.exec,s=String.prototype.replace,l=a,u="lastIndex",c=(r=/a/,o=/b*/g,a.call(r,"a"),a.call(o,"a"),0!==r[u]||0!==o[u]),f=void 0!==/()??/.exec("")[1],h=c||f;h&&(l=function(e){var t,n,r,o,l=this;return f&&(n=new RegExp("^"+l.source+"$(?!\\s)",i.call(l))),c&&(t=l[u]),r=a.call(l,e),c&&r&&(l[u]=l.global?r.index+r[0].length:t),f&&r&&r.length>1&&s.call(r[0],n,function(){for(o=1;on;)t.push(arguments[n++]);return y[++v]=function(){s("function"==typeof e?e:Function(e),t)},r(v),v},d=function(e){delete y[e]},"process"==n(39)(f)?r=function(e){f.nextTick(a(w,e,1))}:g&&g.now?r=function(e){g.now(a(w,e,1))}:p?(o=new p,i=o.port2,o.port1.onmessage=b,r=a(i.postMessage,i,1)):c.addEventListener&&"function"==typeof postMessage&&!c.importScripts?(r=function(e){c.postMessage(e+"","*")},c.addEventListener("message",b,!1)):r=m in u("script")?function(e){l.appendChild(u("script"))[m]=function(){l.removeChild(this),w.call(e)}}:function(e){setTimeout(a(w,e,1),0)}),e.exports={set:h,clear:d}},function(e,t,n){"use strict";function r(e,t,n){var r,o,i,a=new Array(n),s=8*n-t-1,l=(1<>1,c=23===t?B(2,-24)-B(2,-77):0,f=0,h=e<0||0===e&&1/e<0?1:0;for(e=W(e),e!=e||e===j?(o=e!=e?1:0,r=l):(r=V(Y(e)/U),e*(i=B(2,-r))<1&&(r--,i*=2),e+=r+u>=1?c/i:c*B(2,1-u),e*i>=2&&(r++,i/=2),r+u>=l?(o=0,r=l):r+u>=1?(o=(e*i-1)*B(2,t),r+=u):(o=e*B(2,u-1)*B(2,t),r=0));t>=8;a[f++]=255&o,o/=256,t-=8);for(r=r<0;a[f++]=255&r,r/=256,s-=8);return a[--f]|=128*h,a}function o(e,t,n){var r,o=8*n-t-1,i=(1<>1,s=o-7,l=n-1,u=e[l--],c=127&u;for(u>>=7;s>0;c=256*c+e[l],l--,s-=8);for(r=c&(1<<-s)-1,c>>=-s,s+=t;s>0;r=256*r+e[l],l--,s-=8);if(0===c)c=1-a;else{if(c===i)return r?NaN:u?-j:j;r+=B(2,t),c-=a}return(u?-1:1)*r*B(2,c-t)}function i(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]}function a(e){return[255&e]}function s(e){return[255&e,e>>8&255]}function l(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]}function u(e){return r(e,52,8)}function c(e){return r(e,23,4)}function f(e,t,n){T(e[D],t,{get:function(){return this[n]}})}function h(e,t,n,r){var o=+n,i=E(o);if(i+t>e[q])throw I(P);var a=e[K]._b,s=i+e[Z],l=a.slice(s,s+t);return r?l:l.reverse()}function d(e,t,n,r,o,i){var a=+n,s=E(a);if(s+t>e[q])throw I(P);for(var l=e[K]._b,u=s+e[Z],c=r(+o),f=0;fee;)($=Q[ee++])in L||m(L,$,F[$]);v||(J.constructor=L)}var te=new H(new L(2)),ne=H[D].setInt8;te.setInt8(0,2147483648),te.setInt8(1,2147483649),!te.getInt8(0)&&te.getInt8(1)||w(H[D],{setInt8:function(e,t){ne.call(this,e,t<<24>>24)},setUint8:function(e,t){ne.call(this,e,t<<24>>24)}},!0)}else L=function(e){C(this,L,M);var t=E(e);this._b=R.call(new Array(t),0),this[q]=t},H=function(e,t,n){C(this,H,N),C(e,L,N);var r=e[q],o=S(t);if(o<0||o>r)throw I("Wrong offset!");if(n=void 0===n?r-o:_(n),o+n>r)throw I(A);this[K]=e,this[Z]=o,this[q]=n},g&&(f(L,G,"_l"),f(H,z,"_b"),f(H,G,"_l"),f(H,X,"_o")),w(H[D],{getInt8:function(e){return h(this,1,e)[0]<<24>>24},getUint8:function(e){return h(this,1,e)[0]},getInt16:function(e){var t=h(this,2,e,arguments[1]);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=h(this,2,e,arguments[1]);return t[1]<<8|t[0]},getInt32:function(e){return i(h(this,4,e,arguments[1]))},getUint32:function(e){return i(h(this,4,e,arguments[1]))>>>0},getFloat32:function(e){return o(h(this,4,e,arguments[1]),23,4)},getFloat64:function(e){return o(h(this,8,e,arguments[1]),52,8)},setInt8:function(e,t){d(this,1,e,a,t)},setUint8:function(e,t){d(this,1,e,a,t)},setInt16:function(e,t){ d(this,2,e,s,t,arguments[2])},setUint16:function(e,t){d(this,2,e,s,t,arguments[2])},setInt32:function(e,t){d(this,4,e,l,t,arguments[2])},setUint32:function(e,t){d(this,4,e,l,t,arguments[2])},setFloat32:function(e,t){d(this,4,e,c,t,arguments[2])},setFloat64:function(e,t){d(this,8,e,u,t,arguments[2])}});k(L,M),k(H,N),m(H[D],y.VIEW,!0),t[M]=L,t[N]=H},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){if(!S(e))throw Error('You declared cell type "'.concat(e,'" as a string that is not mapped to a known object.\n Cell type must be an object or a string mapped to an object registered by "Handsontable.cellTypes.registerCellType" method'));return C(e)}function i(e,t){var n=t.editor,r=t.renderer,o=t.validator;n&&(0,s.registerEditor)(e,n),r&&(0,l.registerRenderer)(e,r),o&&(0,u.registerValidator)(e,o),b(e,t)}t.__esModule=!0,t.registerCellType=i,t.getCellType=o,t.getRegisteredCellTypes=t.getRegisteredCellTypeNames=t.hasCellType=void 0;var a=r(n(46)),s=n(26),l=n(19),u=n(49),c=r(n(635)),f=r(n(636)),h=r(n(637)),d=r(n(638)),p=r(n(639)),g=r(n(640)),v=r(n(641)),y=r(n(642)),m=r(n(643)),w=(0,a.default)("cellTypes"),b=w.register,C=w.getItem,S=w.hasItem,_=w.getNames,E=w.getValues;t.getRegisteredCellTypes=E,t.getRegisteredCellTypeNames=_,t.hasCellType=S,i("autocomplete",c.default),i("checkbox",f.default),i("date",h.default),i("dropdown",d.default),i("handsontable",p.default),i("numeric",g.default),i("password",v.default),i("text",y.default),i("time",m.default)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(){var e=i(["Deprecation warning: This method is going to be removed in the next release.\n If you want to select a cell using props, please use the `selectCell` method."],["Deprecation warning: This method is going to be removed in the next release.\n If you want to select a cell using props, please use the \\`selectCell\\` method."]);return o=function(){return e},e}function i(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function a(e){return a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a(e)}function s(e,t){return c(e)||u(e,t)||l()}function l(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function u(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{r||null==s.return||s.return()}finally{if(o)throw i}}return n}function c(e){if(Array.isArray(e))return e}function f(e){return p(e)||d(e)||h()}function h(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function d(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}function p(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t0&&/^\s*[+-.]?\s*(?:(?:\d+(?:(\.|,)\d+)?(?:e[+-]?\d+)?)|(?:0x[a-f\d]+))\s*$/.test(e)};a.onQueueEmpty=o;for(var u=e.length-1;u>=0;u--)if(null===e[u])e.splice(u,1);else{var c=s(e[u],4),f=c[0],h=c[1],d=c[3],p=g.propToCol(h),y=ee.getCellMeta(f,p);"numeric"===y.type&&"string"==typeof d&&l(d)&&(e[u][3]=i(d)),ee.getCellValidator(y)&&(a.addValidatorToQueue(),ee.validateCell(e[u][3],y,function(t,n){return function(r){if("boolean"!=typeof r)throw new Error("Validation error: result is not boolean");if(!1===r&&!1===n.allowInvalid){e.splice(t,1),n.valid=!0;var o=ee.getCell(n.visualRow,n.visualCol);null!==o&&(0,v.removeClass)(o,ee.getSettings().invalidCellClassName)}a.removeValidatorFormQueue()}}(u,y),t))}a.checkIfQueueIsEmpty()}function u(e,t){var n=e.length-1;if(!(n<0)){for(;n>=0;n--){var r=!1;if(null!==e[n]){if(null!==e[n][2]&&void 0!==e[n][2]||null!==e[n][3]&&void 0!==e[n][3]){if(p.settings.allowInsertRow)for(;e[n][0]>ee.countRows()-1;){var o=g.createRow(void 0,void 0,t);if(0===o){r=!0;break}}if(!r){if("array"===ee.dataType&&(!p.settings.columns||0===p.settings.columns.length)&&p.settings.allowInsertColumn)for(;g.propToCol(e[n][1])>ee.countCols()-1;)g.createCol(void 0,void 0,t);g.set(e[n][0],e[n][1],e[n][3])}}}else e.splice(n,1)}ee.forceFullRender=!0,q.adjustRowsAndCols(),ee.runHooks("beforeChangeRender",e,t),Z.lockEditor(),ee._refreshBorders(null),Z.unlockEditor(),ee.view.wt.wtOverlays.adjustElementsSize(),ee.runHooks("afterChange",e,t||"edit");var i=ee.getActiveEditor();i&&(0,b.isDefined)(i.refreshValue)&&i.refreshValue()}}function c(e,t,n){return"object"===a(e)?e:[[e,t,n]]}function h(e){if((0,O.hasOwnProperty)(e,"type")){var t,n={};for(var r in"object"===a(e.type)?t=e.type:"string"==typeof e.type&&(t=(0,B.getCellType)(e.type)),t)(0,O.hasOwnProperty)(t,r)&&!(0,O.hasOwnProperty)(e,r)&&(n[r]=t[r]);return n}}function d(e){return function(){throw new Error('The "'.concat(e,'" method cannot be called because this Handsontable instance has been destroyed'))}}var p,g,K,q,Z,$=this,J=arguments.length>2&&void 0!==arguments[2]&&arguments[2],Q=!1,ee=this,te=function(){},ne=new E.default(ee);(0,O.extend)(te.prototype,W.default.prototype),(0,O.extend)(te.prototype,t),(0,O.extend)(te.prototype,h(t)),(0,U.applyLanguageSetting)(te.prototype,t.language),(0,I.hasValidParameter)(J)&&(0,I.registerAsRootInstance)(this),(0,z.startObserving)(),this.isDestroyed=!1,this.rootElement=e,this.isHotTableEnv=(0,v.isChildOfWebComponentTable)(this.rootElement),E.default.isHotTableEnv=this.isHotTableEnv,this.container=document.createElement("div"),this.renderCall=!1,e.insertBefore(this.container,e.firstChild),this.guid="ht_".concat((0,D.randomString)());var re=(0,x.getTranslator)(ee);K=new L.default(ee),this.rootElement.id&&"ht_"!==this.rootElement.id.substring(0,3)||(this.rootElement.id=this.guid),p={cellSettings:[],columnSettings:[],columnsSettingConflicts:["data","width","language"],settings:new te,selRange:null,isPopulated:null,scrollable:null,firstRun:!0};var oe=new G.Selection(p.settings,{countCols:function(){return ee.countCols()},countRows:function(){return ee.countRows()},propToCol:function(e){return g.propToCol(e)},isEditorOpened:function(){return!!ee.getActiveEditor()&&ee.getActiveEditor().isOpened()}});this.selection=oe,this.selection.addLocalHook("beforeSetRangeStart",function(e){$.runHooks("beforeSetRangeStart",e)}),this.selection.addLocalHook("beforeSetRangeStartOnly",function(e){$.runHooks("beforeSetRangeStartOnly",e)}),this.selection.addLocalHook("beforeSetRangeEnd",function(e){$.runHooks("beforeSetRangeEnd",e),e.row<0&&(e.row=$.view.wt.wtTable.getFirstVisibleRow()),e.col<0&&(e.col=$.view.wt.wtTable.getFirstVisibleColumn())}),this.selection.addLocalHook("afterSetRangeEnd",function(e){var t=(0,O.createObjectPropListener)(!1),n=$.selection.getSelectedRange(),r=n.current(),o=r.from,i=r.to,a=n.size()-1;$.runHooks("afterSelection",o.row,o.col,i.row,i.col,t,a),$.runHooks("afterSelectionByProp",o.row,ee.colToProp(o.col),i.row,ee.colToProp(i.col),t,a);var s=$.selection.isSelectedByAnyHeader(),l=$.selection.selectedRange.current(),u=!0;Q&&(u=!1),t.isTouched()&&(u=!t.value);var c=$.selection.isSelectedByRowHeader(),f=$.selection.isSelectedByColumnHeader();!1!==u&&(s?c?$.view.scrollViewportVertically(e.row):f&&$.view.scrollViewportHorizontally(e.col):l&&!$.selection.isMultiple()?$.view.scrollViewport(l.from):$.view.scrollViewport(e)),c&&f?(0,v.addClass)($.rootElement,["ht__selection--rows","ht__selection--columns"]):c?((0,v.removeClass)($.rootElement,"ht__selection--columns"),(0,v.addClass)($.rootElement,"ht__selection--rows")):f?((0,v.removeClass)($.rootElement,"ht__selection--rows"),(0,v.addClass)($.rootElement,"ht__selection--columns")):(0,v.removeClass)($.rootElement,["ht__selection--rows","ht__selection--columns"]),$._refreshBorders(null)}),this.selection.addLocalHook("afterSelectionFinished",function(e){var t=e.length-1,n=e[t],r=n.from,o=n.to;$.runHooks("afterSelectionEnd",r.row,r.col,o.row,o.col,t),$.runHooks("afterSelectionEndByProp",r.row,ee.colToProp(r.col),o.row,ee.colToProp(o.col),t)}),this.selection.addLocalHook("afterIsMultipleSelection",function(e){var t=$.runHooks("afterIsMultipleSelection",e.value);e.value&&(e.value=t)}),this.selection.addLocalHook("beforeModifyTransformStart",function(e){$.runHooks("modifyTransformStart",e)}),this.selection.addLocalHook("afterModifyTransformStart",function(e,t,n){$.runHooks("afterModifyTransformStart",e,t,n)}),this.selection.addLocalHook("beforeModifyTransformEnd",function(e){$.runHooks("modifyTransformEnd",e)}),this.selection.addLocalHook("afterModifyTransformEnd",function(e,t,n){$.runHooks("afterModifyTransformEnd",e,t,n)}),this.selection.addLocalHook("afterDeselect",function(){Z.destroyEditor(),$._refreshBorders(),(0,v.removeClass)($.rootElement,["ht__selection--rows","ht__selection--columns"]),$.runHooks("afterDeselect")}),this.selection.addLocalHook("insertRowRequire",function(e){$.alter("insert_row",e,1,"auto")}),this.selection.addLocalHook("insertColRequire",function(e){$.alter("insert_col",e,1,"auto")}),q={alter:function(e,t){function n(e,t,n,r){var o=function(){var e;return"array"===r?e=[]:"object"===r&&(e={}),e},i=(0,T.arrayMap)(new Array(n),function(){return o()});i.unshift(t,0),e.splice.apply(e,f(i))}var r,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,i=arguments.length>3?arguments[3]:void 0,a=arguments.length>4?arguments[4]:void 0,l=function(e){if(0===e.length)return[];var t=f(e);t.sort(function(e,t){var n=s(e,1),r=n[0],o=s(t,1),i=o[0];return r===i?0:r>i?1:-1});var n=(0,T.arrayReduce)(t,function(e,t){var n=s(t,2),r=n[0],o=n[1],i=e[e.length-1],a=s(i,2),l=a[0],u=a[1],c=l+u;if(r<=c){var f=Math.max(o-(c-r),0);i[1]+=f}else e.push([r,o]);return e},[t[0]]);return n};switch(e){case"insert_row":var u=ee.countSourceRows();if(ee.getSettings().maxRows===u)return;t=(0,b.isDefined)(t)?t:u,r=g.createRow(t,o,i),n(p.cellSettings,t,o,"array"),r&&(oe.isSelected()&&oe.selectedRange.current().from.row>=t?(oe.selectedRange.current().from.row+=r,oe.transformEnd(r,0)):ee._refreshBorders());break;case"insert_col":r=g.createCol(t,o,i);for(var c=0,h=ee.countSourceRows();c=t?(oe.selectedRange.current().from.col+=r,oe.transformEnd(0,r)):ee._refreshBorders()}break;case"remove_row":var v=function(e){var t=0;(0,T.arrayEach)(e,function(e){var n=s(e,2),r=n[0],a=n[1],l=(0,b.isEmpty)(r)?ee.countRows()-1:Math.max(r-t,0);Number.isInteger(r)&&(r=Math.max(r-t,0)),g.removeRow(r,a,i),p.cellSettings.splice(l,o);var u=ee.countRows(),c=ee.getSettings().fixedRowsTop;c>=l+1&&(ee.getSettings().fixedRowsTop-=Math.min(a,c-l));var f=ee.getSettings().fixedRowsBottom;f&&l>=u-f&&(ee.getSettings().fixedRowsBottom-=Math.min(a,f)),t+=a})};Array.isArray(t)?v(l(t)):v([[t,o]]),q.adjustRowsAndCols(),ee._refreshBorders();break;case"remove_col":var y=function(e){var t=0;(0,T.arrayEach)(e,function(e){var n=s(e,2),r=n[0],o=n[1],a=(0,b.isEmpty)(r)?ee.countCols()-1:Math.max(r-t,0),l=re.toPhysicalColumn(a);Number.isInteger(r)&&(r=Math.max(r-t,0)),g.removeCol(r,o,i);for(var u=0,c=ee.countSourceRows();u=a+1&&(ee.getSettings().fixedColumnsLeft-=Math.min(o,f-a)),Array.isArray(ee.getSettings().colHeaders)&&(void 0===l&&(l=-1),ee.getSettings().colHeaders.splice(l,o)),t+=o})};Array.isArray(t)?y(l(t)):y([[t,o]]),q.adjustRowsAndCols(),ee._refreshBorders();break;default:throw new Error('There is no such action "'.concat(e,'"'))}a||q.adjustRowsAndCols()},adjustRowsAndCols:function(){if(p.settings.minRows){var e=ee.countRows();if(ei-1?(n=i-1,t=!0,o>n&&(o=n)):o>i-1&&(o=i-1,t=!0,n>o&&(n=o)),r>a-1?(r=a-1,t=!0,s>r&&(s=r)):s>a-1&&(s=a-1,t=!0,r>s&&(r=s)),t&&ee.selectCell(n,r,o,s)}),ee.view&&ee.view.wt.wtOverlays.adjustElementsSize()},populateFromArray:function(e,t,n,r,o,i,s){var l,u,c,h,d,g,v,y,m=[],w={};if(u=t.length,0===u)return!1;switch(o){case"shift_down":for(d=n?n.col-e.col+1:0,g=n?n.row-e.row+1:0,t=(0,H.translateRowsToColumns)(t),c=0,h=t.length,v=Math.max(h,d);c1&&void 0!==arguments[1]?arguments[1]:null,r=t[e%t.length];return null!==n?r[n%r.length]:r},A=t.length,P=n?n.row-e.row+1:0;for(u=n?P:Math.max(A,P),l=0;ln.row&&P>A||!p.settings.allowInsertRow&&w.row>ee.countRows()-1||w.row>=p.settings.maxRows);l++){var L=l-k,x=D(L).length,I=n?n.col-e.col+1:0;if(h=n?I:Math.max(x,I),w.col=e.col,T=ee.getCellMeta(w.row,w.col),"CopyPaste.paste"!==r&&"Autofill.autofill"!==r||!T.skipRowOnPaste){for(M=0,c=0;cn.col&&I>x||!p.settings.allowInsertColumn&&w.col>ee.countCols()-1||w.col>=p.settings.maxCols);c++)if(T=ee.getCellMeta(w.row,w.col),"CopyPaste.paste"!==r&&"Autofill.fill"!==r||!T.skipColumnOnPaste)if(T.readOnly)w.col+=1;else{var j=c-M,F=D(L,j),W=ee.getDataAtCell(w.row,w.col),B={row:L,col:j};if("Autofill.fill"===r){var V=ee.runHooks("beforeAutofillInsidePopulate",B,i,t,s,{},R);V&&(F=(0,b.isUndefined)(V.value)?F:V.value)}if(null!==F&&"object"===a(F))if(null===W||"object"!==a(W))N=!1;else{var Y=(0,O.duckSchema)(W[0]||W),U=(0,O.duckSchema)(F[0]||F);(0,O.isObjectEqual)(Y,U)?F=(0,O.deepClone)(F):N=!1}else null!==W&&"object"===a(W)&&(N=!1);N&&m.push([w.row,w.col,F]),N=!0,w.col+=1}else M+=1,w.col+=1,h+=1;w.row+=1}else k+=1,w.row+=1,u+=1}ee.setDataAtCell(m,null,null,r||"populateFromArray")}}},this.init=function(){K.setData(p.settings.data),ee.runHooks("beforeInit"),(0,C.isMobileBrowser)()&&(0,v.addClass)(ee.rootElement,"mobile"),this.updateSettings(p.settings,!0),this.view=new P.default(this),Z=_.default.getInstance(ee,p,oe,g),this.forceFullRender=!0,ee.runHooks("init"),this.view.render(),"object"===a(p.firstRun)&&(ee.runHooks("afterChange",p.firstRun[0],p.firstRun[1]),p.firstRun=!1),ee.runHooks("afterInit")},this.validateCell=function(e,t,n,r){function o(e){var r=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(r&&!0!==t.hidden){var o=t.visualCol,i=t.visualRow,a=ee.getCell(i,o,!0);a&&"TH"!==a.nodeName&&ee.view.wt.wtSettings.settings.cellRenderer(i,o,a),n(e)}else n(e)}var i,a=ee.getCellValidator(t);(0,b.isRegExp)(a)&&(i=a,a=function(e,t){t(i.test(e))}),(0,m.isFunction)(a)?(e=ee.runHooks("beforeValidate",e,t.visualRow,t.prop,r),ee._registerTimeout(setTimeout(function(){a.call(t,e,function(n){n=ee.runHooks("afterValidate",n,e,t.visualRow,t.prop,r),t.valid=n,o(n),ee.runHooks("postAfterValidate",n,e,t.visualRow,t.prop,r)})},0))):ee._registerTimeout(setTimeout(function(){t.valid=!0,o(t.valid,!1)},0))},this.setDataAtCell=function(e,t,n,r){var o,i,s,f=c(e,t,n),h=[],d=r;for(o=0,i=f.length;o0&&void 0!==arguments[0])||arguments[0];if(e){var t=!document.activeElement||document.activeElement&&void 0===document.activeElement.nodeName;document.activeElement&&document.activeElement!==document.body&&!t?document.activeElement.blur():t&&document.body.focus()}ee&&!ee.isListening()&&(X=ee.guid,ee.runHooks("afterListen"))},this.unlisten=function(){this.isListening()&&(X=null,ee.runHooks("afterUnlisten"))},this.isListening=function(){return X===ee.guid},this.destroyEditor=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];ee._refreshBorders(e,t)},this.populateFromArray=function(e,t,n,r,o,i,s,l,u){if("object"!==a(n)||"object"!==a(n[0]))throw new Error("populateFromArray parameter `input` must be an array of arrays");var c="number"==typeof r?new j.CellCoords(r,o):null;return q.populateFromArray(new j.CellCoords(e,t),n,c,i,s,l,u)},this.spliceCol=function(e,t,n){for(var r,o=arguments.length,i=new Array(o>3?o-3:0),a=3;a3?o-3:0),a=3;a0&&(e=t[t.length-1]),e},this.getSelectedRange=function(){if(oe.isSelected())return Array.from(oe.getSelectedRange())},this.getSelectedRangeLast=function(){var e,t=this.getSelectedRange();return t&&t.length>0&&(e=t[t.length-1]),e},this.emptySelectedCells=function(){var e=this;if(oe.isSelected()){var t=[];(0,T.arrayEach)(oe.getSelectedRange(),function(n){var r=n.getTopLeftCorner(),o=n.getBottomRightCorner();(0,A.rangeEach)(r.row,o.row,function(n){(0,A.rangeEach)(r.col,o.col,function(r){e.getCellMeta(n,r).readOnly||t.push([n,r,""])})})}),t.length>0&&this.setDataAtCell(t)}},this.render=function(){ee.view&&(ee.renderCall=!0,ee.forceFullRender=!0,Z.lockEditor(),ee._refreshBorders(null),Z.unlockEditor())},this.loadData=function(e,t=!0){function n(){p.cellSettings.length=0}if(Array.isArray(p.settings.dataSchema)?ee.dataType="array":(0,m.isFunction)(p.settings.dataSchema)?ee.dataType="function":ee.dataType="object",g&&g.destroy(),g=new S.default(ee,p,te),"object"===a(e)&&null!==e)e.push&&e.splice||(e=[e]);else{if(null!==e)throw new Error("loadData only accepts array of objects or array of arrays (".concat(a(e)," given)"));var r,o=g.getSchema();e=[];var i=0,s=0;for(i=0,s=p.settings.startRows;i1&&void 0!==arguments[1]&&arguments[1],a=!1;if((0,b.isDefined)(e.rows))throw new Error('"rows" setting is no longer supported. do you mean startRows, minRows or maxRows?');if((0,b.isDefined)(e.cols))throw new Error('"cols" setting is no longer supported. do you mean startCols, minCols or maxCols?');for(t in e)"data"!==t&&("language"!==t?F.default.getSingleton().getRegistered().indexOf(t)>-1?((0,m.isFunction)(e[t])||Array.isArray(e[t]))&&(e[t].initialHook=!0,ee.addHook(t,e[t])):!i&&(0,O.hasOwnProperty)(e,t)&&(te.prototype[t]=e[t]):n(e.language));if(void 0===e.data&&void 0===p.settings.data)ee.loadData(null);else if(void 0!==e.data){let t=!!e.hasOwnProperty("forceRender")&&e.forceRender;ee.loadData(e.data,t)}else void 0!==e.columns&&g.createMap();o=ee.countCols();var s,l,u=e.columns||te.prototype.columns;if(u&&(0,m.isFunction)(u)&&(o=ee.countSourceCols(),a=!0),void 0===e.cell&&void 0===e.cells&&void 0===e.columns||(p.cellSettings.length=0),o>0)for(t=0,r=0;t-1||w.indexOf("overflow")>-1)?ee.rootElement.setAttribute("style",w):(ee.rootElement.style.height="",ee.rootElement.style.overflow="")}else void 0!==f&&(ee.rootElement.style.height="".concat(f,"px"),ee.rootElement.style.overflow="hidden");if(void 0!==e.width){var C=e.width;(0,m.isFunction)(C)&&(C=C()),ee.rootElement.style.width="".concat(C,"px")}i||(g.clearLengthCache(),ee.view&&ee.view.wt.wtViewport.resetHasOversizedColumnHeadersMarked(),ee.runHooks("afterUpdateSettings",e)),q.adjustRowsAndCols(),ee.view&&!p.firstRun&&(ee.forceFullRender=!0,Z.lockEditor(),ee._refreshBorders(null),Z.unlockEditor()),i||!ee.view||""!==c&&""!==f&&void 0!==f||c===f||ee.view.wt.wtOverlays.updateMainScrollableElements()},this.getValue=function(){var e=ee.getSelectedLast();if(te.prototype.getValue){if((0,m.isFunction)(te.prototype.getValue))return te.prototype.getValue.call(ee);if(e)return ee.getData()[e[0][0]][te.prototype.getValue]}else if(e)return ee.getDataAtCell(e[0],e[1])},this.getSettings=function(){return p.settings},this.clear=function(){this.selectAll(),this.emptySelectedCells()},this.alter=function(e,t,n,r,o){q.alter(e,t,n,r,o)},this.getCell=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return ee.view.getCellAtCoords(new j.CellCoords(e,t),n)},this.getCoords=function(e){return this.view.wt.wtTable.getCoords.call(this.view.wt.wtTable,e)},this.colToProp=function(e){return g.colToProp(e)},this.propToCol=function(e){return g.propToCol(e)},this.toVisualRow=function(e){return re.toVisualRow(e)},this.toVisualColumn=function(e){return re.toVisualColumn(e)},this.toPhysicalRow=function(e){return re.toPhysicalRow(e)},this.toPhysicalColumn=function(e){return re.toPhysicalColumn(e)},this.getDataAtCell=function(e,t){return g.get(e,g.colToProp(t))},this.getDataAtRowProp=function(e,t){return g.get(e,t)},this.getDataAtCol=function(e){var t;return(t=[]).concat.apply(t,f(g.getRange(new j.CellCoords(0,e),new j.CellCoords(p.settings.data.length-1,e),g.DESTINATION_RENDERER)))},this.getDataAtProp=function(e){var t,n=g.getRange(new j.CellCoords(0,g.propToCol(e)),new j.CellCoords(p.settings.data.length-1,g.propToCol(e)),g.DESTINATION_RENDERER);return(t=[]).concat.apply(t,f(n))},this.getSourceData=function(e,t,n,r){var o;return o=void 0===e?K.getData():K.getByRange(new j.CellCoords(e,t),new j.CellCoords(n,r)),o},this.getSourceDataArray=function(e,t,n,r){var o;return o=void 0===e?K.getData(!0):K.getByRange(new j.CellCoords(e,t),new j.CellCoords(n,r),!0),o},this.getSourceDataAtCol=function(e){return K.getAtColumn(e)},this.getSourceDataAtRow=function(e){return K.getAtRow(e)},this.getSourceDataAtCell=function(e,t){return K.getAtCell(e,t)},this.getDataAtRow=function(e){var t=g.getRange(new j.CellCoords(e,0),new j.CellCoords(e,this.countCols()-1),g.DESTINATION_RENDERER);return t[0]||[]},this.getDataType=function(e,t,n,r){var o=this,i=void 0===e?[0,0,this.countRows(),this.countCols()]:[e,t,n,r],a=i[0],s=i[1],l=i[2],u=i[3],c=null,f=null;void 0===l&&(l=a),void 0===u&&(u=s);var h="mixed";return(0,A.rangeEach)(Math.min(a,l),Math.max(a,l),function(e){var t=!0;return(0,A.rangeEach)(Math.min(s,u),Math.max(s,u),function(n){var r=o.getCellMeta(e,n);return f=r.type,c?t=c===f:c=f,t}),h=t?f:"mixed",t}),h},this.removeCellMeta=function(e,t,n){var r=re.toPhysical(e,t),o=s(r,2),i=o[0],a=o[1],l=p.cellSettings[i][a][n],u=ee.runHooks("beforeRemoveCellMeta",e,t,n,l);!1!==u&&(delete p.cellSettings[i][a][n],ee.runHooks("afterRemoveCellMeta",e,t,n,l)),l=null},this.spliceCellsMeta=function(e,t){for(var n,r=arguments.length,o=new Array(r>2?r-2:0),i=2;i=0;)if(void 0===t||-1!==t.indexOf(i)){for(var a=ee.countCols()-1;a>=0;)void 0===n||-1!==n.indexOf(a)?(o.addValidatorToQueue(),ee.validateCell(ee.getDataAtCell(i,a),ee.getCellMeta(i,a),function(e){if("boolean"!=typeof e)throw new Error("Validation error: result is not boolean");!1===e&&(o.valid=!1),o.removeValidatorFormQueue()},"validateCells"),a-=1):a-=1;i-=1}else i-=1;o.checkIfQueueIsEmpty()},this.getRowHeader=function(e){var t=p.settings.rowHeaders,n=e;return void 0!==n&&(n=ee.runHooks("modifyRowHeader",n)),void 0===n?(t=[],(0,A.rangeEach)(ee.countRows()-1,function(e){t.push(ee.getRowHeader(e))})):Array.isArray(t)&&void 0!==t[n]?t=t[n]:(0,m.isFunction)(t)?t=t(n):t&&"string"!=typeof t&&"number"!=typeof t&&(t=n+1),t},this.hasRowHeaders=function(){return!!p.settings.rowHeaders},this.hasColHeaders=function(){if(void 0!==p.settings.colHeaders&&null!==p.settings.colHeaders)return!!p.settings.colHeaders;for(var e=0,t=ee.countCols();e0&&void 0!==arguments[0]&&arguments[0],t=0;return(0,A.rangeEachReverse)(ee.countRows()-1,function(n){if(ee.isEmptyRow(n))t+=1;else if(!0===e)return!1}),t},this.countEmptyCols=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(ee.countRows()<1)return 0;var t=0;return(0,A.rangeEachReverse)(ee.countCols()-1,function(n){if(ee.isEmptyCol(n))t+=1;else if(!0===e)return!1}),t},this.isEmptyRow=function(e){return p.settings.isEmptyRow.call(ee,e)},this.isEmptyCol=function(e){return p.settings.isEmptyCol.call(ee,e)},this.selectCell=function(e,t,n,r){var o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],i=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];return!(0,b.isUndefined)(e)&&!(0,b.isUndefined)(t)&&this.selectCells([[e,t,n,r]],o,i)},this.selectCells=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[[]],t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];!1===t&&(Q=!0);var r=oe.selectCells(e);return r&&n&&ee.listen(),Q=!1,r},this.selectCellByProp=function(e,t,n,r){var i=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];return(0,w.warn)((0,R.toSingleLine)(o())),this.selectCells([[e,t,n,r]],i,a)},this.selectColumns=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;return oe.selectColumns(e,t)},this.selectRows=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;return oe.selectRows(e,t)},this.deselectCell=function(){oe.deselect()},this.selectAll=function(){Q=!0,oe.selectAll(),Q=!1},this.scrollViewportTo=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=arguments.length>3&&void 0!==arguments[3]&&arguments[3],o=!n,i=!r,a=!1;return void 0!==e&&void 0!==t&&(a=ee.view.scrollViewport(new j.CellCoords(e,t),o,r,n,i)),"number"==typeof e&&"number"!=typeof t&&(a=ee.view.scrollViewportVertically(e,o,n)),"number"==typeof t&&"number"!=typeof e&&(a=ee.view.scrollViewportHorizontally(t,r,i)),a},this.destroy=function(){ee._clearTimeouts(),ee._clearImmediates(),ee.view&&ee.view.destroy(),K&&K.destroy(),K=null,(0,z.stopObserving)(),(0,v.empty)(ee.rootElement),ne.destroy(),Z&&Z.destroy(),ee.runHooks("afterDestroy"),F.default.getSingleton().destroy(ee),(0,O.objectEach)(ee,function(e,t,n){(0,m.isFunction)(e)?n[t]=d(t):"guid"!==t&&(n[t]=null)}),ee.isDestroyed=!0,g&&g.destroy(),g=null,p=null,q=null,oe=null,Z=null,ee=null,te=null},this.getActiveEditor=function(){return Z.getActiveEditor()},this.getPlugin=function(e){return(0,k.getPlugin)(this,e)},this.getInstance=function(){return ee},this.addHook=function(e,t){F.default.getSingleton().add(e,t,ee)},this.hasHook=function(e){return F.default.getSingleton().has(e,ee)},this.addHookOnce=function(e,t){F.default.getSingleton().once(e,t,ee)},this.removeHook=function(e,t){F.default.getSingleton().remove(e,t,ee)},this.runHooks=function(e,t,n,r,o,i,a){return F.default.getSingleton().run(ee,e,t,n,r,o,i,a)},this.getTranslatedPhrase=function(e,t){return(0,V.getTranslatedPhrase)(p.settings.language,e,t)},this.timeouts=[],this._registerTimeout=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=e;"function"==typeof n&&(n=setTimeout(n,t)),this.timeouts.push(n)},this._clearTimeouts=function(){(0,T.arrayEach)(this.timeouts,function(e){clearTimeout(e)})},this.immediates=[],this._registerImmediate=function(e){this.immediates.push(setImmediate(e))},this._clearImmediates=function(){(0,T.arrayEach)(this.immediates,function(e){clearImmediate(e)})},this._refreshBorders=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];Z.destroyEditor(e),ee.view.render(),t&&oe.isSelected()&&Z.prepareEditor()},F.default.getSingleton().run(ee,"construct")}t.__esModule=!0,t.default=g;var v=n(1),y=n(121),m=n(59),w=n(76),b=n(14),C=n(42),S=r(n(644)),_=r(n(647)),E=r(n(10)),O=n(2),T=n(3),R=n(58),k=n(13),M=n(19),N=n(49),D=n(48),A=n(9),P=r(n(648)),L=r(n(649)),H=n(122),x=n(424),I=n(425),j=n(8),F=r(n(22)),W=r(n(426)),B=n(119),V=n(427),Y=n(90),U=n(428),z=n(123),G=n(429),X=null},function(e,t,n){"use strict";function r(e,t){function n(){}(0,o.inherit)(n,e);for(var r=0,i=t.length;r0;)t=(n-1)%d,r=String.fromCharCode(65+t)+r,n=parseInt((n-t)/d,10);return r}function o(e){var t=0;if(e)for(var n=0,r=e.length-1;n0&&void 0!==arguments[0]?arguments[0]:100,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:4,i=[];for(e=0;e0&&void 0!==arguments[0]?arguments[0]:100,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:4,i=[];for(e=0;e0&&(p-=1),0===p&&a()}function a(){h.clearEvents(),d.clear(),p=0}function s(e){return Array.from(d.values()).some(function(t){return(0,f.isKey)(t,e)})}function l(){var e=Array.from(d.values());return e.some(function(e){return(0,f.isCtrlMetaKey)(e)})}function u(){return p}t.__esModule=!0,t._getRefCount=u,t._resetState=a,t.isPressed=s,t.isPressedCtrlKey=l,t.startObserving=o,t.stopObserving=i;var c=r(n(10)),f=n(32),h=new c.default,d=new Set,p=0},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:null;this.injected||((e||this.hot.rootElement).appendChild(this.container.fragment),this.injected=!0)}},{key:"removeTable",value:function(){this.injected&&this.container.container.parentNode&&(this.container.container.parentNode.removeChild(this.container.container),this.container=null,this.injected=!1)}},{key:"createColElement",value:function(e){var t=document,n=t.createElement("col");return n.style.width="".concat(this.hot.view.wt.wtTable.getStretchedColumnWidth(e),"px"),n}},{key:"createTable",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=document,n=t.createDocumentFragment(),r=t.createElement("table"),o=t.createElement("thead"),i=t.createElement("tbody"),s=t.createElement("colgroup"),l=t.createElement("tr"),u=t.createElement("th");return this.isVertical()&&r.appendChild(s),this.isHorizontal()&&(l.appendChild(u),o.appendChild(l),r.style.tableLayout="auto",r.style.width="auto"),r.appendChild(o),this.isVertical()&&i.appendChild(l),r.appendChild(i),(0,a.addClass)(r,e),n.appendChild(r),{fragment:n,table:r,tHead:o,tBody:i,colGroup:s,tr:l,th:u}}},{key:"createContainer",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=document,n=t.createDocumentFragment(),r=t.createElement("div"),o="htGhostTable htAutoSize ".concat(e.trim());return(0,a.addClass)(r,o),n.appendChild(r),{fragment:n,container:r}}},{key:"isVertical",value:function(){return!(!this.rows.length||this.columns.length)}},{key:"isHorizontal",value:function(){return!(!this.columns.length||this.rows.length)}}]),e}(),u=l;t.default=u},function(e,t,n){"use strict";function r(e){return a(e)||i(e)||o()}function o(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function i(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}function a(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t1&&void 0!==arguments[1]?arguments[1]:1,r=(0,s.arrayMax)(this._arrayMap)+1,o=[];return(0,u.rangeEach)(n-1,function(n){o.push(t._arrayMap.splice(e+n,0,r+n))}),o},removeItems:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,n=[];if(Array.isArray(e)){var r=[].concat(this._arrayMap);e.sort(function(e,t){return t-e});for(var o=0,i=e.length;on&&(r+=1),r},0)}var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,r=this.removeItems(e,n);this._arrayMap=(0,s.arrayMap)(this._arrayMap,function(e){var n=e,r=t(n);return r&&(n-=r),n})},shiftItems:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;this._arrayMap=(0,s.arrayMap)(this._arrayMap,function(t){var r=t;return r>=e&&(r+=n),r}),(0,u.rangeEach)(n-1,function(n){t._arrayMap.splice(e+n,0,e+n)})},swapIndexes:function(e,t){var n;(n=this._arrayMap).splice.apply(n,[t,0].concat(r(this._arrayMap.splice(e,1))))},clearMap:function(){this._arrayMap.length=0}};(0,l.defineGetter)(f,"MIXIN_NAME",c,{writable:!1,enumerable:!1});var h=f;t.default=h},function(e,t,n){"use strict";function r(){return{name:o}}t.__esModule=!0,t.default=r,t.KEY=void 0;var o="---------";t.KEY=o},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(){var e={};return(0,s.objectEach)(S,function(t,n){e[n]=t()}),e}function a(e,t){-1===C.indexOf(e)&&(S[e]=t)}t.__esModule=!0,t.predefinedItems=i,t.addItem=a,t.ITEMS=t.UNDO=t.SEPARATOR=t.ROW_BELOW=t.ROW_ABOVE=t.REMOVE_ROW=t.REMOVE_COLUMN=t.REDO=t.READ_ONLY=t.COLUMN_RIGHT=t.COLUMN_LEFT=t.CLEAR_COLUMN=t.ALIGNMENT=void 0;var s=n(2),l=r(n(689));t.ALIGNMENT=l.KEY;var u=r(n(690));t.CLEAR_COLUMN=u.KEY;var c=r(n(691));t.COLUMN_LEFT=c.KEY;var f=r(n(692));t.COLUMN_RIGHT=f.KEY;var h=r(n(693));t.READ_ONLY=h.KEY;var d=r(n(694));t.REDO=d.KEY;var p=r(n(695));t.REMOVE_COLUMN=p.KEY;var g=r(n(696));t.REMOVE_ROW=g.KEY;var v=r(n(697));t.ROW_ABOVE=v.KEY;var y=r(n(698));t.ROW_BELOW=y.KEY;var m=r(n(126));t.SEPARATOR=m.KEY;var w,b=r(n(699));t.UNDO=b.KEY;var C=[v.KEY,y.KEY,c.KEY,f.KEY,u.KEY,g.KEY,p.KEY,b.KEY,d.KEY,h.KEY,l.KEY,m.KEY];t.ITEMS=C;var S=(w={},o(w,m.KEY,m.default),o(w,v.KEY,v.default),o(w,y.KEY,y.default),o(w,c.KEY,c.default),o(w,f.KEY,f.default),o(w,u.KEY,u.default),o(w,g.KEY,g.default),o(w,p.KEY,p.default),o(w,b.KEY,b.default),o(w,d.KEY,d.default),o(w,h.KEY,h.default),o(w,l.KEY,l.default),w)},function(e,t,n){"use strict";function r(){var e=s(["The merged cell declared at [",", ",'] has "rowspan" or "colspan" declared as \n "0", which is not supported. It cannot be added to the collection.']);return r=function(){return e},e}function o(){var e=s(["The merged cell declared at [",", ",'] has both "rowspan" \n and "colspan" declared as "1", which makes it a single cell. It cannot be added to the collection.']);return o=function(){return e},e}function i(){var e=s(["The merged cell declared at [",", ","] is positioned (or positioned partially) \n outside of the table range. It was not added to the table, please fix your setup."]);return i=function(){return e},e}function a(){var e=s(["The merged cell declared with {row: ",", col: ",", rowspan: \n ",", colspan: ","} contains negative values, which is not supported. It \n will not be added to the collection."]);return a=function(){return e},e}function s(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function l(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function u(e,t){for(var n=0;nt-1&&(this.row=t-1),this.col<0?this.col=0:this.col>n-1&&(this.col=n-1),this.row+this.rowspan>t-1&&(this.rowspan=t-this.row),this.col+this.colspan>n-1&&(this.colspan=n-this.col)}},{key:"includes",value:function(e,t){return this.row<=e&&this.col<=t&&this.row+this.rowspan-1>=e&&this.col+this.colspan-1>=t}},{key:"includesHorizontally",value:function(e){return this.col<=e&&this.col+this.colspan-1>=e}},{key:"includesVertically",value:function(e){return this.row<=e&&this.row+this.rowspan-1>=e}},{key:"shift",value:function(e,t){var n=e[0]||e[1],r=t+Math.abs(e[0]||e[1])-1,o=e[0]?"colspan":"rowspan",i=e[0]?"col":"row",a=Math.min(t,r),s=Math.max(t,r),l=this[i],u=this[i]+this[o]-1;if(l>=t&&(this[i]+=n),n>0)t<=u&&t>l&&(this[o]+=n);else if(n<0){if(a<=l&&s>=u)return this.removed=!0,!1;if(l>=a&&l<=s){var c=s-l+1,f=Math.abs(n)-c;this[i]-=f+n,this[o]-=c}else if(l<=a&&u>=s)this[o]+=n;else if(l<=a&&u>=a&&uthis.row:"right"===t?e.col+e.colspan-1this.col:null)}},{key:"getLastRow",value:function(){return this.row+this.rowspan-1}},{key:"getLastColumn",value:function(){return this.col+this.colspan-1}},{key:"getRange",value:function(){return new f.CellRange(new f.CellCoords(this.row,this.col),new f.CellCoords(this.row,this.col),new f.CellCoords(this.getLastRow(),this.getLastColumn()))}}],[{key:"NEGATIVE_VALUES_WARNING",value:function(e){return(0,h.toSingleLine)(a(),e.row,e.col,e.rowspan,e.colspan)}},{key:"IS_OUT_OF_BOUNDS_WARNING",value:function(e){return(0,h.toSingleLine)(i(),e.row,e.col)}},{key:"IS_SINGLE_CELL",value:function(e){return(0,h.toSingleLine)(o(),e.row,e.col)}},{key:"ZERO_SPAN_WARNING",value:function(e){return(0,h.toSingleLine)(r(),e.row,e.col)}},{key:"containsNegativeValues",value:function(e){return e.row<0||e.col<0||e.rowspan<0||e.colspan<0}},{key:"isSingleCell",value:function(e){return 1===e.colspan&&1===e.rowspan}},{key:"containsZeroSpan",value:function(e){return 0===e.colspan||0===e.rowspan}},{key:"isOutOfBounds",value:function(e,t,n){return e.row<0||e.col<0||e.row>=t||e.row+e.rowspan-1>=t||e.col>=n||e.col+e.colspan-1>=n}}]),e}(),p=d;t.default=p},function(e,t,n){"use strict";n(438),n(581),n(583),n(585),n(587),n(589),n(591),n(593),n(595),n(597),n(601)},function(e,t,n){e.exports=!n(20)&&!n(4)(function(){return 7!=Object.defineProperty(n(92)("div"),"a",{get:function(){return 7}}).a})},function(e,t,n){var r=n(6),o=n(21),i=n(52),a=n(94),s=n(17).f;e.exports=function(e){var t=o.Symbol||(o.Symbol=i?{}:r.Symbol||{});"_"==e.charAt(0)||e in t||s(t,e,{value:a.f(e)})}},function(e,t,n){var r=n(27),o=n(29),i=n(79)(!1),a=n(95)("IE_PROTO");e.exports=function(e,t){var n,s=o(e),l=0,u=[];for(n in s)n!=a&&r(s,n)&&u.push(n);for(;t.length>l;)r(s,n=t[l++])&&(~i(u,n)||u.push(n));return u}},function(e,t,n){var r=n(17),o=n(5),i=n(53);e.exports=n(20)?Object.defineProperties:function(e,t){o(e);for(var n,a=i(t),s=a.length,l=0;s>l;)r.f(e,n=a[l++],t[n]);return e}},function(e,t,n){var r=n(29),o=n(56).f,i={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],s=function(e){try{return o(e)}catch(e){return a.slice()}};e.exports.f=function(e){return a&&"[object Window]"==i.call(e)?s(e):o(r(e))}},function(e,t,n){"use strict";var r=n(53),o=n(80),i=n(71),a=n(24),s=n(70),l=Object.assign;e.exports=!l||n(4)(function(){var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach(function(e){t[e]=e}),7!=l({},e)[n]||Object.keys(l({},t)).join("")!=r})?function(e,t){for(var n=a(e),l=arguments.length,u=1,c=o.f,f=i.f;l>u;)for(var h,d=s(arguments[u++]),p=c?r(d).concat(c(d)):r(d),g=p.length,v=0;g>v;)f.call(d,h=p[v++])&&(n[h]=d[h]);return n}:l},function(e,t){e.exports=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}},function(e,t,n){"use strict";var r=n(38),o=n(7),i=n(138),a=[].slice,s={},l=function(e,t,n){if(!(t in s)){for(var r=[],o=0;o>>0||(a.test(n)?16:10))}:r},function(e,t,n){var r=n(6).parseFloat,o=n(81).trim;e.exports=1/r(n(100)+"-0")!=-1/0?function(e){var t=o(String(e),3),n=r(t);return 0===n&&"-"==t.charAt(0)?-0:n}:r},function(e,t,n){var r=n(39);e.exports=function(e,t){if("number"!=typeof e&&"Number"!=r(e))throw TypeError(t);return+e}},function(e,t,n){var r=n(7),o=Math.floor;e.exports=function(e){return!r(e)&&isFinite(e)&&o(e)===e}},function(e,t){e.exports=Math.log1p||function(e){return(e=+e)>-1e-8&&e<1e-8?e-e*e/2:Math.log(1+e)}},function(e,t,n){"use strict";var r=n(55),o=n(50),i=n(60),a={};n(28)(a,n(12)("iterator"),function(){return this}),e.exports=function(e,t,n){e.prototype=r(a,{next:o(1,n)}),i(e,t+" Iterator")}},function(e,t,n){var r=n(5);e.exports=function(e,t,n,o){try{return o?t(r(n)[0],n[1]):t(n)}catch(t){var i=e.return;throw void 0!==i&&r(i.call(e)),t}}},function(e,t,n){var r=n(38),o=n(24),i=n(70),a=n(16);e.exports=function(e,t,n,s,l){r(t);var u=o(e),c=i(u),f=a(u.length),h=l?f-1:0,d=l?-1:1;if(n<2)for(;;){if(h in c){s=c[h],h+=d;break}if(h+=d,l?h<0:f<=h)throw TypeError("Reduce of empty array with no initial value")}for(;l?h>=0:f>h;h+=d)h in c&&(s=t(s,c[h],h,u));return s}},function(e,t,n){"use strict";var r=n(24),o=n(54),i=n(16);e.exports=[].copyWithin||function(e,t){var n=r(this),a=i(n.length),s=o(e,a),l=o(t,a),u=arguments.length>2?arguments[2]:void 0,c=Math.min((void 0===u?a:o(u,a))-l,a-s),f=1;for(l0;)l in n?n[s]=n[l]:delete n[s],s+=f,l+=f;return n}},function(e,t){e.exports=function(e,t){return{value:t,done:!!e}}},function(e,t,n){"use strict";var r=n(115);n(0)({target:"RegExp",proto:!0,forced:r!==/./.exec},{exec:r})},function(e,t,n){n(20)&&"g"!=/./g.flags&&n(17).f(RegExp.prototype,"flags",{configurable:!0,get:n(83)})},function(e,t,n){"use strict";var r,o,i,a,s=n(52),l=n(6),u=n(37),c=n(72),f=n(0),h=n(7),d=n(38),p=n(64),g=n(86),v=n(73),y=n(117).set,m=n(550)(),w=n(152),b=n(551),C=n(87),S=n(153),_="Promise",E=l.TypeError,O=l.process,T=O&&O.versions,R=T&&T.v8||"",k=l[_],M="process"==c(O),N=function(){},D=o=w.f,A=!!function(){try{var e=k.resolve(1),t=(e.constructor={})[n(12)("species")]=function(e){e(N,N)};return(M||"function"==typeof PromiseRejectionEvent)&&e.then(N)instanceof t&&0!==R.indexOf("6.6")&&-1===C.indexOf("Chrome/66")}catch(e){}}(),P=function(e){var t;return!(!h(e)||"function"!=typeof(t=e.then))&&t},L=function(e,t){if(!e._n){e._n=!0;var n=e._c;m(function(){for(var r=e._v,o=1==e._s,i=0,a=function(t){var n,i,a,s=o?t.ok:t.fail,l=t.resolve,u=t.reject,c=t.domain;try{s?(o||(2==e._h&&I(e),e._h=1),!0===s?n=r:(c&&c.enter(),n=s(r),c&&(c.exit(),a=!0)),n===t.promise?u(E("Promise-chain cycle")):(i=P(n))?i.call(n,l,u):l(n)):u(r)}catch(e){c&&!a&&c.exit(),u(e)}};n.length>i;)a(n[i++]);e._c=[],e._n=!1,t&&!e._h&&H(e)})}},H=function(e){y.call(l,function(){var t,n,r,o=e._v,i=x(e);if(i&&(t=b(function(){M?O.emit("unhandledRejection",o,e):(n=l.onunhandledrejection)?n({promise:e,reason:o}):(r=l.console)&&r.error&&r.error("Unhandled promise rejection",o)}),e._h=M||x(e)?2:1),e._a=void 0,i&&t.e)throw t.v})},x=function(e){return 1!==e._h&&0===(e._a||e._c).length},I=function(e){y.call(l,function(){var t;M?O.emit("rejectionHandled",e):(t=l.onrejectionhandled)&&t({promise:e,reason:e._v})})},j=function(e){var t=this;t._d||(t._d=!0,t=t._w||t,t._v=e,t._s=2,t._a||(t._a=t._c.slice()),L(t,!0))},F=function(e){var t,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===e)throw E("Promise can't be resolved itself");(t=P(e))?m(function(){var r={_w:n,_d:!1};try{t.call(e,u(F,r,1),u(j,r,1))}catch(e){j.call(r,e)}}):(n._v=e,n._s=1,L(n,!1))}catch(e){j.call({_w:n,_d:!1},e)}}};A||(k=function(e){p(this,k,_,"_h"),d(e),r.call(this);try{e(u(F,this,1),u(j,this,1))}catch(e){j.call(this,e)}},r=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},r.prototype=n(65)(k.prototype,{then:function(e,t){var n=D(v(this,k));return n.ok="function"!=typeof e||e,n.fail="function"==typeof t&&t,n.domain=M?O.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&L(this,!1),n.promise},catch:function(e){return this.then(void 0,e)}}),i=function(){var e=new r;this.promise=e,this.resolve=u(F,e,1),this.reject=u(j,e,1)},w.f=D=function(e){return e===k||e===a?new i(e):o(e)}),f(f.G+f.W+f.F*!A,{Promise:k}),n(60)(k,_),n(63)(_),a=n(21)[_],f(f.S+f.F*!A,_,{reject:function(e){var t=D(this),n=t.reject;return n(e),t.promise}}),f(f.S+f.F*(s||!A),_,{resolve:function(e){return S(s&&this===a?k:this,e)}}),f(f.S+f.F*!(A&&n(82)(function(e){k.all(e).catch(N)})),_,{all:function(e){var t=this,n=D(t),r=n.resolve,o=n.reject,i=b(function(){var n=[],i=0,a=1;g(e,!1,function(e){var s=i++,l=!1;n.push(void 0),a++,t.resolve(e).then(function(e){l||(l=!0,n[s]=e,--a||r(n))},o)}),--a||r(n)});return i.e&&o(i.v),n.promise},race:function(e){var t=this,n=D(t),r=n.reject,o=b(function(){g(e,!1,function(e){t.resolve(e).then(n.resolve,r)})});return o.e&&r(o.v),n.promise}})},function(e,t,n){"use strict";function r(e){var t,n;this.promise=new e(function(e,r){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=r}),this.resolve=o(t),this.reject=o(n)}var o=n(38);e.exports.f=function(e){return new r(e)}},function(e,t,n){var r=n(5),o=n(7),i=n(152);e.exports=function(e,t){if(r(e),o(t)&&t.constructor===e)return t;var n=i.f(e),a=n.resolve;return a(t),n.promise}},function(e,t,n){"use strict";var r=n(17).f,o=n(55),i=n(65),a=n(37),s=n(64),l=n(86),u=n(106),c=n(148),f=n(63),h=n(20),d=n(45).fastKey,p=n(66),g=h?"_s":"size",v=function(e,t){var n,r=d(t);if("F"!==r)return e._i[r];for(n=e._f;n;n=n.n)if(n.k==t)return n};e.exports={getConstructor:function(e,t,n,u){var c=e(function(e,r){s(e,c,t,"_i"),e._t=t,e._i=o(null),e._f=void 0,e._l=void 0,e[g]=0,null!=r&&l(r,n,e[u],e)});return i(c.prototype,{clear:function(){for(var e=p(this,t),n=e._i,r=e._f;r;r=r.n)r.r=!0,r.p&&(r.p=r.p.n=void 0),delete n[r.i];e._f=e._l=void 0,e[g]=0},delete:function(e){var n=p(this,t),r=v(n,e);if(r){var o=r.n,i=r.p;delete n._i[r.i],r.r=!0,i&&(i.n=o),o&&(o.p=i),n._f==r&&(n._f=o),n._l==r&&(n._l=i),n[g]--}return!!r},forEach:function(e){p(this,t);for(var n,r=a(e,arguments.length>1?arguments[1]:void 0,3);n=n?n.n:this._f;)for(r(n.v,n.k,this);n&&n.r;)n=n.p},has:function(e){return!!v(p(this,t),e)}}),h&&r(c.prototype,"size",{get:function(){return p(this,t)[g]}}),c},def:function(e,t,n){var r,o,i=v(e,t);return i?i.v=n:(e._l=i={i:o=d(t,!0),k:t,v:n,p:r=e._l,n:void 0,r:!1},e._f||(e._f=i),r&&(r.n=i),e[g]++,"F"!==o&&(e._i[o]=i)),e},getEntry:v,setStrong:function(e,t,n){u(e,t,function(e,n){this._t=p(e,t),this._k=n,this._l=void 0},function(){for(var e=this,t=e._k,n=e._l;n&&n.r;)n=n.p;return e._t&&(e._l=n=n?n.n:e._t._f)?c(0,"keys"==t?n.k:"values"==t?n.v:[n.k,n.v]):(e._t=void 0,c(1))},n?"entries":"values",!n,!0),f(t)}}},function(e,t,n){"use strict" ;var r=n(65),o=n(45).getWeak,i=n(5),a=n(7),s=n(64),l=n(86),u=n(36),c=n(27),f=n(66),h=u(5),d=u(6),p=0,g=function(e){return e._l||(e._l=new v)},v=function(){this.a=[]},y=function(e,t){return h(e.a,function(e){return e[0]===t})};v.prototype={get:function(e){var t=y(this,e);if(t)return t[1]},has:function(e){return!!y(this,e)},set:function(e,t){var n=y(this,e);n?n[1]=t:this.a.push([e,t])},delete:function(e){var t=d(this.a,function(t){return t[0]===e});return~t&&this.a.splice(t,1),!!~t}},e.exports={getConstructor:function(e,t,n,i){var u=e(function(e,r){s(e,u,t,"_i"),e._t=t,e._i=p++,e._l=void 0,null!=r&&l(r,n,e[i],e)});return r(u.prototype,{delete:function(e){if(!a(e))return!1;var n=o(e);return!0===n?g(f(this,t)).delete(e):n&&c(n,this._i)&&delete n[this._i]},has:function(e){if(!a(e))return!1;var n=o(e);return!0===n?g(f(this,t)).has(e):n&&c(n,this._i)}}),u},def:function(e,t,n){var r=o(i(t),!0);return!0===r?g(e).set(t,n):r[e._i]=n,e},ufstore:g}},function(e,t,n){var r=n(33),o=n(16);e.exports=function(e){if(void 0===e)return 0;var t=r(e),n=o(t);if(t!==n)throw RangeError("Wrong length!");return n}},function(e,t,n){var r=n(56),o=n(80),i=n(5),a=n(6).Reflect;e.exports=a&&a.ownKeys||function(e){var t=r.f(i(e)),n=o.f;return n?t.concat(n(e)):t}},function(e,t,n){var r=n(16),o=n(102),i=n(40);e.exports=function(e,t,n,a){var s=String(i(e)),l=s.length,u=void 0===n?" ":String(n),c=r(t);if(c<=l||""==u)return s;var f=c-l,h=o.call(u,Math.ceil(f/u.length));return h.length>f&&(h=h.slice(0,f)),a?h+s:s+h}},function(e,t,n){var r=n(53),o=n(29),i=n(71).f;e.exports=function(e){return function(t){for(var n,a=o(t),s=r(a),l=s.length,u=0,c=[];l>u;)i.call(a,n=s[u++])&&c.push(e?[n,a[n]]:a[n]);return c}}},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var n=0;n7&&void 0!==arguments[7]?arguments[7]:function(e){return e};r(this,e),a.set(this,{viewportWidth:t,scrollOffset:n,totalColumns:o,columnWidthFn:i,overrideFn:s,onlyFullyVisible:l,stretchingColumnWidthFn:c}),this.count=0,this.startColumn=null,this.endColumn=null,this.startPosition=null,this.stretchAllRatio=0,this.stretchLastWidth=0,this.stretch=u,this.totalTargetWidth=0,this.needVerifyLastColumnWidth=!0,this.stretchAllColumnsWidth=[],this.calculate()}return i(e,null,[{key:"DEFAULT_WIDTH",get:function(){return 50}}]),i(e,[{key:"calculate",value:function(){for(var e,t=0,n=!0,r=[],o=a.get(this),i=o.onlyFullyVisible,s=o.overrideFn,l=o.scrollOffset,u=o.totalColumns,c=o.viewportWidth,f=0;f0?c+1:c;if(t>=l&&t+e<=l+h&&(null!==this.startColumn&&void 0!==this.startColumn||(this.startColumn=f),this.endColumn=f),r.push(t),t+=e,i||(this.endColumn=f),t>=l+c){n=!1;break}}if(this.endColumn===u-1&&n)for(this.startColumn=this.endColumn;this.startColumn>0;){var d=r[this.endColumn]+e-r[this.startColumn-1];if((d<=c||!i)&&(this.startColumn-=1),d>c)break}null!==this.startColumn&&s&&s(this),this.startPosition=r[this.startColumn],void 0===this.startPosition&&(this.startPosition=null),null!==this.startColumn&&(this.count=this.endColumn-this.startColumn+1)}},{key:"refreshStretching",value:function(e){if("none"!==this.stretch){var t=e;this.totalTargetWidth=t;for(var n=a.get(this),r=n.totalColumns,o=0,i=0;i0)this.stretchAllRatio=t/o,this.stretchAllColumnsWidth=[],this.needVerifyLastColumnWidth=!0;else if("last"===this.stretch&&t!==1/0){var c=this._getColumnWidth(r-1),f=u+c;this.stretchLastWidth=f>=0?f:c}}}},{key:"getStretchedColumnWidth",value:function(e,t){var n=null;return"all"===this.stretch&&0!==this.stretchAllRatio?n=this._getStretchedAllColumnWidth(e,t):"last"===this.stretch&&0!==this.stretchLastWidth&&(n=this._getStretchedLastColumnWidth(e)),n}},{key:"_getStretchedAllColumnWidth",value:function(e,t){var n=0,r=a.get(this),o=r.totalColumns;if(!this.stretchAllColumnsWidth[e]){var i=Math.round(t*this.stretchAllRatio),s=r.stretchingColumnWidthFn(i,e);this.stretchAllColumnsWidth[e]=void 0===s?i:isNaN(s)?this._getColumnWidth(e):s}if(this.stretchAllColumnsWidth.length===o&&this.needVerifyLastColumnWidth){this.needVerifyLastColumnWidth=!1;for(var l=0;l=c&&n+t<=c+h-d&&(null===this.startRow&&(this.startRow=p),this.endRow=p),o.push(n),n+=t,s||(this.endRow=p),n>=c+h-d){r=!1;break}if(this.endRow===f-1&&r)for(this.startRow=this.endRow;this.startRow>0;){var g=o[this.endRow]+t-o[this.startRow-1];if((g<=h-d||!s)&&(this.startRow-=1),g>=h-d)break}null!==this.startRow&&l&&l(this),this.startPosition=o[this.startRow],void 0===this.startPosition&&(this.startPosition=null),null!==this.startRow&&(this.count=this.endRow-this.startRow+1)}}]),e}(),l=s;t.default=l},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:t,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t;o(this,e),this.highlight=t,this.from=n,this.to=r}return a(e,[{key:"setHighlight",value:function(e){return this.highlight=e,this}},{key:"setFrom",value:function(e){return this.from=e,this}},{key:"setTo",value:function(e){return this.to=e,this}},{key:"isValid",value:function(e){return this.from.isValid(e)&&this.to.isValid(e)}},{key:"isSingle",value:function(){return this.from.row===this.to.row&&this.from.col===this.to.col}},{key:"getHeight",value:function(){return Math.max(this.from.row,this.to.row)-Math.min(this.from.row,this.to.row)+1}},{key:"getWidth",value:function(){return Math.max(this.from.col,this.to.col)-Math.min(this.from.col,this.to.col)+1}},{key:"includes",value:function(e){var t=e.row,n=e.col,r=this.getTopLeftCorner(),o=this.getBottomRightCorner();return r.row<=t&&o.row>=t&&r.col<=n&&o.col>=n}},{key:"includesRange",value:function(e){return this.includes(e.getTopLeftCorner())&&this.includes(e.getBottomRightCorner())}},{key:"isEqual",value:function(e){return Math.min(this.from.row,this.to.row)===Math.min(e.from.row,e.to.row)&&Math.max(this.from.row,this.to.row)===Math.max(e.from.row,e.to.row)&&Math.min(this.from.col,this.to.col)===Math.min(e.from.col,e.to.col)&&Math.max(this.from.col,this.to.col)===Math.max(e.from.col,e.to.col)}},{key:"overlaps",value:function(e){return e.isSouthEastOf(this.getTopLeftCorner())&&e.isNorthWestOf(this.getBottomRightCorner())}},{key:"isSouthEastOf",value:function(e){return this.getTopLeftCorner().isSouthEastOf(e)||this.getBottomRightCorner().isSouthEastOf(e)}},{key:"isNorthWestOf",value:function(e){return this.getTopLeftCorner().isNorthWestOf(e)||this.getBottomRightCorner().isNorthWestOf(e)}},{key:"isOverlappingHorizontally",value:function(e){return this.getTopRightCorner().col>=e.getTopLeftCorner().col&&this.getTopRightCorner().col<=e.getTopRightCorner().col||this.getTopLeftCorner().col<=e.getTopRightCorner().col&&this.getTopLeftCorner().col>=e.getTopLeftCorner().col}},{key:"isOverlappingVertically",value:function(e){return this.getBottomRightCorner().row>=e.getTopRightCorner().row&&this.getBottomRightCorner().row<=e.getBottomRightCorner().row||this.getTopRightCorner().row<=e.getBottomRightCorner().row&&this.getTopRightCorner().row>=e.getTopRightCorner().row}},{key:"expand",value:function(e){var t=this.getTopLeftCorner(),n=this.getBottomRightCorner();return(e.rown.row||e.col>n.col)&&(this.from=new s.default(Math.min(t.row,e.row),Math.min(t.col,e.col)),this.to=new s.default(Math.max(n.row,e.row),Math.max(n.col,e.col)),!0)}},{key:"expandByRange",value:function(e){if(this.includesRange(e)||!this.overlaps(e))return!1;var t=this.getTopLeftCorner(),n=this.getBottomRightCorner(),r=this.getDirection(),o=e.getTopLeftCorner(),i=e.getBottomRightCorner(),a=Math.min(t.row,o.row),l=Math.min(t.col,o.col),u=Math.max(n.row,i.row),c=Math.max(n.col,i.col),f=new s.default(a,l),h=new s.default(u,c);return this.from=f,this.to=h,this.setDirection(r),this.highlight.row===this.getBottomRightCorner().row&&"N-S"===this.getVerticalDirection()&&this.flipDirectionVertically(),this.highlight.col===this.getTopRightCorner().col&&"W-E"===this.getHorizontalDirection()&&this.flipDirectionHorizontally(),!0}},{key:"getDirection",value:function(){return this.from.isNorthWestOf(this.to)?"NW-SE":this.from.isNorthEastOf(this.to)?"NE-SW":this.from.isSouthEastOf(this.to)?"SE-NW":this.from.isSouthWestOf(this.to)?"SW-NE":void 0}},{key:"setDirection",value:function(e){switch(e){case"NW-SE":var t=[this.getTopLeftCorner(),this.getBottomRightCorner()];this.from=t[0],this.to=t[1];break;case"NE-SW":var n=[this.getTopRightCorner(),this.getBottomLeftCorner()];this.from=n[0],this.to=n[1];break;case"SE-NW":var r=[this.getBottomRightCorner(),this.getTopLeftCorner()];this.from=r[0],this.to=r[1];break;case"SW-NE":var o=[this.getBottomLeftCorner(),this.getTopRightCorner()];this.from=o[0],this.to=o[1]}}},{key:"getVerticalDirection",value:function(){return["NE-SW","NW-SE"].indexOf(this.getDirection())>-1?"N-S":"S-N"}},{key:"getHorizontalDirection",value:function(){return["NW-SE","SW-NE"].indexOf(this.getDirection())>-1?"W-E":"E-W"}},{key:"flipDirectionVertically",value:function(){var e=this.getDirection();switch(e){case"NW-SE":this.setDirection("SW-NE");break;case"NE-SW":this.setDirection("SE-NW");break;case"SE-NW":this.setDirection("NE-SW");break;case"SW-NE":this.setDirection("NW-SE")}}},{key:"flipDirectionHorizontally",value:function(){var e=this.getDirection();switch(e){case"NW-SE":this.setDirection("NE-SW");break;case"NE-SW":this.setDirection("NW-SE");break;case"SE-NW":this.setDirection("SW-NE");break;case"SW-NE":this.setDirection("SE-NW")}}},{key:"getTopLeftCorner",value:function(){return new s.default(Math.min(this.from.row,this.to.row),Math.min(this.from.col,this.to.col))}},{key:"getBottomRightCorner",value:function(){return new s.default(Math.max(this.from.row,this.to.row),Math.max(this.from.col,this.to.col))}},{key:"getTopRightCorner",value:function(){return new s.default(Math.min(this.from.row,this.to.row),Math.max(this.from.col,this.to.col))}},{key:"getBottomLeftCorner",value:function(){return new s.default(Math.max(this.from.row,this.to.row),Math.min(this.from.col,this.to.col))}},{key:"isCorner",value:function(e,t){return!!(t&&t.includes(e)&&(this.getTopLeftCorner().isEqual(new s.default(t.from.row,t.from.col))||this.getTopRightCorner().isEqual(new s.default(t.from.row,t.to.col))||this.getBottomLeftCorner().isEqual(new s.default(t.to.row,t.from.col))||this.getBottomRightCorner().isEqual(new s.default(t.to.row,t.to.col))))||(e.isEqual(this.getTopLeftCorner())||e.isEqual(this.getTopRightCorner())||e.isEqual(this.getBottomLeftCorner())||e.isEqual(this.getBottomRightCorner()))}},{key:"getOppositeCorner",value:function(e,t){if(!(e instanceof s.default))return!1;if(t&&t.includes(e)){if(this.getTopLeftCorner().isEqual(new s.default(t.from.row,t.from.col)))return this.getBottomRightCorner();if(this.getTopRightCorner().isEqual(new s.default(t.from.row,t.to.col)))return this.getBottomLeftCorner();if(this.getBottomLeftCorner().isEqual(new s.default(t.to.row,t.from.col)))return this.getTopRightCorner();if(this.getBottomRightCorner().isEqual(new s.default(t.to.row,t.to.col)))return this.getTopLeftCorner()}return e.isEqual(this.getBottomRightCorner())?this.getTopLeftCorner():e.isEqual(this.getTopLeftCorner())?this.getBottomRightCorner():e.isEqual(this.getTopRightCorner())?this.getBottomLeftCorner():e.isEqual(this.getBottomLeftCorner())?this.getTopRightCorner():void 0}},{key:"getBordersSharedWith",value:function(e){if(!this.includesRange(e))return[];var t={top:Math.min(this.from.row,this.to.row),bottom:Math.max(this.from.row,this.to.row),left:Math.min(this.from.col,this.to.col),right:Math.max(this.from.col,this.to.col)},n={top:Math.min(e.from.row,e.to.row),bottom:Math.max(e.from.row,e.to.row),left:Math.min(e.from.col,e.to.col),right:Math.max(e.from.col,e.to.col)},r=[];return t.top===n.top&&r.push("top"),t.right===n.right&&r.push("right"),t.bottom===n.bottom&&r.push("bottom"),t.left===n.left&&r.push("left"),r}},{key:"getInner",value:function(){for(var e=this.getTopLeftCorner(),t=this.getBottomRightCorner(),n=[],r=e.row;r<=t.row;r++)for(var o=e.col;o<=t.col;o++)this.from.row===r&&this.from.col===o||this.to.row===r&&this.to.col===o||n.push(new s.default(r,o));return n}},{key:"getAll",value:function(){for(var e=this.getTopLeftCorner(),t=this.getBottomRightCorner(),n=[],r=e.row;r<=t.row;r++)for(var o=e.col;o<=t.col;o++)e.row===r&&e.col===o?n.push(e):t.row===r&&t.col===o?n.push(t):n.push(new s.default(r,o));return n}},{key:"forAll",value:function(e){for(var t=this.getTopLeftCorner(),n=this.getBottomRightCorner(),r=t.row;r<=n.row;r++)for(var o=t.col;o<=n.col;o++){var i=e(r,o);if(!1===i)return}}},{key:"toObject",value:function(){return{from:this.from.toObject(),to:this.to.toObject()}}}]),e}(),u=l;t.default=u},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var n=0;n0&&void 0!==arguments[0]&&arguments[0];return this.drawInterrupted=!1,e||(0,s.isVisible)(this.wtTable.TABLE)?this.wtTable.draw(e):this.drawInterrupted=!0,this}},{key:"getCell",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(!t)return this.wtTable.getCell(e);var n=this.wtSettings.getSetting("totalRows"),r=this.wtSettings.getSetting("fixedRowsTop"),o=this.wtSettings.getSetting("fixedRowsBottom"),i=this.wtSettings.getSetting("fixedColumnsLeft");if(e.row=n-o){if(this.wtOverlays.bottomLeftCornerOverlay&&this.wtOverlays.bottomLeftCornerOverlay.clone)return this.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.getCell(e)}else{if(e.coln-o&&this.wtOverlays.bottomOverlay&&this.wtOverlays.bottomOverlay.clone)return this.wtOverlays.bottomOverlay.clone.wtTable.getCell(e)}return this.wtTable.getCell(e)}},{key:"update",value:function(e,t){return this.wtSettings.update(e,t)}},{key:"scrollViewport",value:function(e,t,n,r,o){return this.wtScroll.scrollViewport(e,t,n,r,o)}},{key:"scrollViewportHorizontally",value:function(e,t,n){return this.wtScroll.scrollViewportHorizontally(e,t,n)}},{key:"scrollViewportVertically",value:function(e,t,n){return this.wtScroll.scrollViewportVertically(e,t,n)}},{key:"getViewport",value:function(){return[this.wtTable.getFirstVisibleRow(),this.wtTable.getFirstVisibleColumn(),this.wtTable.getLastVisibleRow(),this.wtTable.getLastVisibleColumn()]}},{key:"getOverlayName",value:function(){return this.cloneOverlay?this.cloneOverlay.type:"master"}},{key:"isOverlayName",value:function(e){return!!this.cloneOverlay&&this.cloneOverlay.type===e}},{key:"exportSettingsAsClassNames",value:function(){var e=this,t={rowHeaders:["array"],columnHeaders:["array"]},n=[],r=[];(0,l.objectEach)(t,function(t,o){t.indexOf("array")>-1&&e.getSetting(o).length&&r.push("ht".concat((0,u.toUpperCaseFirst)(o))),n.push("ht".concat((0,u.toUpperCaseFirst)(o)))}),(0,s.removeClass)(this.wtTable.wtRootElement.parentNode,n),(0,s.addClass)(this.wtTable.wtRootElement.parentNode,r)}},{key:"getSetting",value:function(e,t,n,r,o){return this.wtSettings.getSetting(e,t,n,r,o)}},{key:"hasSetting",value:function(e){return this.wtSettings.has(e)}},{key:"destroy",value:function(){this.wtOverlays.destroy(),this.wtEvent.destroy()}}]),e}(),y=v;t.default=y},function(e,t){e.exports=function(e){return e.webpackPolyfill||(e.deprecate=function(){},e.paths=[],e.children||(e.children=[]),Object.defineProperty(e,"loaded",{enumerable:!0,get:function(){return e.l}}),Object.defineProperty(e,"id",{enumerable:!0,get:function(){return e.i}}),e.webpackPolyfill=1),e}},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t){},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var n=0;n-1)this.instance.selections.selectedRows.splice(e,1);else{let e=this.instance.wtTable.getFirstRenderedRow(),t=this.instance.wtTable.getLastRenderedRow();this.instance.selections.selectedRows=[];for(let n=e;n<=t;n++)n!=i.coords.row&&this.instance.selections.selectedRows.push(n);let n=document.querySelector(".ht_clone_top_left_corner"),r=n.querySelector("tr");if(r){let e=r.querySelector("input[type=checkbox]");e&&(e.checked=!1)}}return}if(e){let e=document.querySelector(".ht_clone_left"),t=e.querySelectorAll("tr");if(t)for(let e=1;e1;for(o||!(0,c.isChrome)()?r.push([this.instance.wtTable.wtRootElement.parentNode,"wheel",function(t){return e.onCloneWheel(t)}]):(this.topOverlay.needFullRender&&r.push([this.topOverlay.clone.wtTable.holder,"wheel",function(t){return e.onCloneWheel(t)}]),this.bottomOverlay.needFullRender&&r.push([this.bottomOverlay.clone.wtTable.holder,"wheel",function(t){return e.onCloneWheel(t)}]),this.leftOverlay.needFullRender&&r.push([this.leftOverlay.clone.wtTable.holder,"wheel",function(t){return e.onCloneWheel(t)}]),this.topLeftCornerOverlay&&this.topLeftCornerOverlay.needFullRender&&r.push([this.topLeftCornerOverlay.clone.wtTable.holder,"wheel",function(t){return e.onCloneWheel(t)}]),this.bottomLeftCornerOverlay&&this.bottomLeftCornerOverlay.needFullRender&&r.push([this.bottomLeftCornerOverlay.clone.wtTable.holder,"wheel",function(t){return e.onCloneWheel(t)}])),this.topOverlay.trimmingContainer!==window&&this.leftOverlay.trimmingContainer!==window&&r.push([window,"wheel",function(t){var n,r=t.wheelDeltaY||t.deltaY,o=t.wheelDeltaX||t.deltaX;e.topOverlay.clone.wtTable.holder.contains(t.realTarget)?n="top":e.bottomOverlay.clone&&e.bottomOverlay.clone.wtTable.holder.contains(t.realTarget)?n="bottom":e.leftOverlay.clone.wtTable.holder.contains(t.realTarget)?n="left":e.topLeftCornerOverlay&&e.topLeftCornerOverlay.clone&&e.topLeftCornerOverlay.clone.wtTable.holder.contains(t.realTarget)?n="topLeft":e.bottomLeftCornerOverlay&&e.bottomLeftCornerOverlay.clone&&e.bottomLeftCornerOverlay.clone.wtTable.holder.contains(t.realTarget)&&(n="bottomLeft"),("top"===n&&0!==r||"left"===n&&0!==o||"bottom"===n&&0!==r||("topLeft"===n||"bottomLeft"===n)&&(0!==r||0!==o))&&t.preventDefault()}]);r.length;){var i=r.pop();this.eventManager.addEventListener(i[0],i[1],i[2]),this.registeredListeners.push(i)}}},{key:"deregisterListeners",value:function(){for(;this.registeredListeners.length;){var e=this.registeredListeners.pop();this.eventManager.removeEventListener(e[0],e[1],e[2])}}},{key:"onTableScroll",value:function(e){var t=this.leftOverlay.mainTableScrollableElement,n=this.topOverlay.mainTableScrollableElement,r=e.target;this.keyPressed&&(n!==window&&r!==window&&!e.target.contains(n)||t!==window&&r!==window&&!e.target.contains(t))||this.syncScrollPositions(e)}},{key:"onCloneWheel",value:function(e){this.scrollableElement!==window&&e.preventDefault();var t=this.leftOverlay.mainTableScrollableElement,n=this.topOverlay.mainTableScrollableElement,r=e.target,o=n!==window&&r!==window&&!e.target.contains(n),i=t!==window&&r!==window&&!e.target.contains(t);this.keyPressed&&(o||i)||this.translateMouseWheelToScroll(e)}},{key:"onKeyDown",value:function(e){this.keyPressed=(0,u.isKey)(e.keyCode,"ARROW_UP|ARROW_RIGHT|ARROW_DOWN|ARROW_LEFT")}},{key:"onKeyUp",value:function(){this.keyPressed=!1}},{key:"translateMouseWheelToScroll",value:function(e){var t=isNaN(e.deltaY)?-1*e.wheelDeltaY:e.deltaY,n=isNaN(e.deltaX)?-1*e.wheelDeltaX:e.deltaX;return 1===e.deltaMode&&(n+=n*this.browserLineHeight,t+=t*this.browserLineHeight),this.scrollVertically(t),this.scrollHorizontally(n),!1}},{key:"scrollVertically",value:function(e){if(0===e)return 0;this.scrollableElement.scrollTop+=e}},{key:"scrollHorizontally",value:function(e){if(0===e)return 0;this.scrollableElement.scrollLeft+=e}},{key:"syncScrollPositions",value:function(){if(!this.destroyed){var e=this.topOverlay.clone.wtTable.holder,t=this.leftOverlay.clone.wtTable.holder,n=[this.scrollableElement.scrollLeft,this.scrollableElement.scrollTop],r=n[0],o=n[1];if(this.horizontalScrolling=e.scrollLeft!==r,this.verticalScrolling=t.scrollTop!==o,this.horizontalScrolling){e.scrollLeft=r;var i=this.bottomOverlay.needFullRender?this.bottomOverlay.clone.wtTable.holder:null;i&&(i.scrollLeft=r)}this.verticalScrolling&&(t.scrollTop=o),this.refreshAll()}}},{key:"syncScrollWithMaster",value:function(){var e=this.topOverlay.mainTableScrollableElement,t=e.scrollLeft,n=e.scrollTop;this.topOverlay.needFullRender&&(this.topOverlay.clone.wtTable.holder.scrollLeft=t),this.bottomOverlay.needFullRender&&(this.bottomOverlay.clone.wtTable.holder.scrollLeft=t),this.leftOverlay.needFullRender&&(this.leftOverlay.clone.wtTable.holder.scrollTop=n)}},{key:"updateMainScrollableElements",value:function(){this.deregisterListeners(),this.leftOverlay.updateMainScrollableElement(),this.topOverlay.updateMainScrollableElement(),this.bottomOverlay.needFullRender&&this.bottomOverlay.updateMainScrollableElement(),this.scrollableElement=(0,s.getScrollableElement)(this.wot.wtTable.TABLE),this.registerListeners()}},{key:"destroy",value:function(){this.eventManager.destroy(),this.topOverlay.destroy(),this.bottomOverlay.clone&&this.bottomOverlay.destroy(),this.leftOverlay.destroy(),this.topLeftCornerOverlay&&this.topLeftCornerOverlay.destroy(),this.bottomLeftCornerOverlay&&this.bottomLeftCornerOverlay.clone&&this.bottomLeftCornerOverlay.destroy(),this.debug&&this.debug.destroy(),this.destroyed=!0}},{key:"refresh",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(this.topOverlay.areElementSizesAdjusted&&this.leftOverlay.areElementSizesAdjusted){var t=this.wot.wtTable.wtRootElement.parentNode||this.wot.wtTable.wtRootElement,n=t.clientWidth,r=t.clientHeight;n===this.spreaderLastSize.width&&r===this.spreaderLastSize.height||(this.spreaderLastSize.width=n,this.spreaderLastSize.height=r,this.adjustElementsSize())}this.bottomOverlay.clone&&this.bottomOverlay.refresh(e),this.leftOverlay.refresh(e),this.topOverlay.refresh(e),this.topLeftCornerOverlay&&this.topLeftCornerOverlay.refresh(e),this.bottomLeftCornerOverlay&&this.bottomLeftCornerOverlay.clone&&this.bottomLeftCornerOverlay.refresh(e),this.debug&&this.debug.refresh(e)}},{key:"adjustElementsSize",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.wot.getSetting("totalColumns"),n=this.wot.getSetting("totalRows"),r=this.wot.wtViewport.getRowHeaderWidth(),o=this.wot.wtViewport.getColumnHeaderHeight(),i=this.wot.wtTable.hider.style;i.width="".concat(r+this.leftOverlay.sumCellSizes(0,t),"px"),i.height="".concat(o+this.topOverlay.sumCellSizes(0,n)+1,"px"),this.topOverlay.adjustElementsSize(e),this.leftOverlay.adjustElementsSize(e),this.bottomOverlay.clone&&this.bottomOverlay.adjustElementsSize(e)}},{key:"applyToDOM",value:function(){this.topOverlay.areElementSizesAdjusted&&this.leftOverlay.areElementSizesAdjusted||this.adjustElementsSize(),this.topOverlay.applyToDOM(),this.bottomOverlay.clone&&this.bottomOverlay.applyToDOM(),this.leftOverlay.applyToDOM()}},{key:"getParentOverlay",value:function(e){if(!e)return null;var t=[this.topOverlay,this.leftOverlay,this.bottomOverlay,this.topLeftCornerOverlay,this.bottomLeftCornerOverlay],n=null;return(0,l.arrayEach)(t,function(t){t&&t.clone&&t.clone.wtTable.TABLE.contains(e)&&(n=t.clone)}),n}}]),e}(),p=d;t.default=p},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var n=0;n=0&&e<=Math.max(a-1,0)&&(e>=o&&(ethis.getLastVisibleColumn()||t)&&(s=i.scrollTo(e,!0))),s}},{key:"scrollViewportVertically",value:function(e,t,n){if(!this.wot.drawn)return!1;var r=this._getVariables(),o=r.fixedRowsBottom,i=r.fixedRowsTop,a=r.topOverlay,s=r.totalRows,l=!1;return e>=0&&e<=Math.max(s-1,0)&&(e>=i&&(ethis.getLastVisibleRow()&&ec){var f=r.getColumnHeaderHeight();(0,s.rangeEach)(1,o,function(e){if(f+=t.sumCellSizes(e-1,e),l.top+f-c>=u)return i=e-2,!1})}}return i}},{key:"getFirstVisibleColumn",value:function(){var e=this._getVariables(),t=e.leftOverlay,n=e.wtTable,r=e.wtViewport,o=e.totalColumns,i=n.getFirstVisibleColumn();if(t.mainTableScrollableElement===window){var l=(0,a.offset)(n.wtRootElement),u=(0,a.innerWidth)(n.hider),c=(0,a.innerWidth)(window),f=(0,a.getScrollLeft)(window);if(l.left+u-c<=f){var h=r.getRowHeaderWidth();(0,s.rangeEachReverse)(o,1,function(e){if(h+=t.sumCellSizes(e-1,e),l.left+u-h<=f)return i=e,!1})}}return i}},{key:"getLastVisibleColumn",value:function(){var e=this._getVariables(),t=e.leftOverlay,n=e.wtTable,r=e.wtViewport,o=e.totalColumns,i=n.getLastVisibleColumn();if(t.mainTableScrollableElement===window){var l=(0,a.offset)(n.wtRootElement),u=(0,a.innerWidth)(window),c=(0,a.getScrollLeft)(window);if(l.left>c){var f=r.getRowHeaderWidth();(0,s.rangeEach)(1,o,function(e){if(f+=t.sumCellSizes(e-1,e),l.left+f-c>=u)return i=e-2,!1})}}return i}},{key:"_getVariables",value:function(){var e=this.wot,t=e.wtOverlays.topOverlay,n=e.wtOverlays.leftOverlay,r=e.wtTable,o=e.wtViewport,i=e.getSetting("totalRows"),a=e.getSetting("totalColumns"),s=e.getSetting("fixedRowsTop"),l=e.getSetting("fixedRowsBottom"),u=e.getSetting("fixedColumnsLeft");return{topOverlay:t,leftOverlay:n,wtTable:r,wtViewport:o,totalRows:i,totalColumns:a,fixedRowsTop:s,fixedRowsBottom:l,fixedColumnsLeft:u}}}]),e}(),u=l;t.default=u},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var n=0;n0,h!==this.correctHeaderWidth&&(c=!1)}(this.isWorkingOnClone()||(u=o.prepareOverlays()),c)?(this.isWorkingOnClone()||i.createVisibleCalculators(),o&&o.refresh(!0)):(this.isWorkingOnClone()?this.tableOffset=this.wot.cloneSource.wtTable.tableOffset:this.tableOffset=(0,v.offset)(this.TABLE),t=S.default.isOverlayTypeOf(this.wot.cloneOverlay,S.default.CLONE_DEBUG)||S.default.isOverlayTypeOf(this.wot.cloneOverlay,S.default.CLONE_TOP)||S.default.isOverlayTypeOf(this.wot.cloneOverlay,S.default.CLONE_TOP_LEFT_CORNER)?0:S.default.isOverlayTypeOf(this.instance.cloneOverlay,S.default.CLONE_BOTTOM)||S.default.isOverlayTypeOf(this.instance.cloneOverlay,S.default.CLONE_BOTTOM_LEFT_CORNER)?Math.max(a-this.wot.getSetting("fixedRowsBottom"),0):i.rowsRenderCalculator.startRow,n=S.default.isOverlayTypeOf(this.wot.cloneOverlay,S.default.CLONE_DEBUG)||S.default.isOverlayTypeOf(this.wot.cloneOverlay,S.default.CLONE_LEFT)||S.default.isOverlayTypeOf(this.wot.cloneOverlay,S.default.CLONE_TOP_LEFT_CORNER)||S.default.isOverlayTypeOf(this.wot.cloneOverlay,S.default.CLONE_BOTTOM_LEFT_CORNER)?0:i.columnsRenderCalculator.startColumn,this.rowFilter=new b.default(t,a,l),this.columnFilter=new w.default(n,this.wot.getSetting("totalColumns"),s),this.alignOverlaysWithTrimmingContainer(),this._doDraw());return this.refreshSelections(c),this.isWorkingOnClone()||(o.topOverlay.resetFixedPosition(),o.bottomOverlay.clone&&o.bottomOverlay.resetFixedPosition(),o.leftOverlay.resetFixedPosition(),o.topLeftCornerOverlay&&o.topLeftCornerOverlay.resetFixedPosition(),o.bottomLeftCornerOverlay&&o.bottomLeftCornerOverlay.clone&&o.bottomLeftCornerOverlay.resetFixedPosition()),u&&o.syncScrollWithMaster(),this.wot.drawn=!0,this}},{key:"_doDraw",value:function(){var e=new C.default(this);e.render()}},{key:"removeClassFromCells",value:function(e){for(var t=this.TABLE.querySelectorAll(".".concat(e)),n=0,r=t.length;n1&&void 0!==arguments[1]?arguments[1]:0,n=this.THEAD.childNodes[t];if(n)return n.childNodes[this.columnFilter.sourceColumnToVisibleRowHeadedColumn(e)]}},{key:"getRowHeader",value:function(e){if(0===this.columnFilter.sourceColumnToVisibleRowHeadedColumn(0))return null;var t=this.TBODY.childNodes[this.rowFilter.sourceToRendered(e)];return t?t.childNodes[0]:void 0}},{key:"getCoords",value:function(e){var t=e;if("TD"!==t.nodeName&&"TH"!==t.nodeName&&(t=(0,v.closest)(t,["TD","TH"])),null===t)return null;var n=t.parentNode,r=n.parentNode,o=(0,v.index)(n),i=t.cellIndex;return(0,v.overlayContainsElement)(S.default.CLONE_TOP_LEFT_CORNER,t)||(0,v.overlayContainsElement)(S.default.CLONE_TOP,t)?"THEAD"===r.nodeName&&(o-=r.childNodes.length):o=r===this.THEAD?this.rowFilter.visibleColHeadedRowToSourceRow(o):this.rowFilter.renderedToSource(o),i=(0,v.overlayContainsElement)(S.default.CLONE_TOP_LEFT_CORNER,t)||(0,v.overlayContainsElement)(S.default.CLONE_LEFT,t)?this.columnFilter.offsettedTH(i):this.columnFilter.visibleRowHeadedColumnToSourceColumn(i),new m.default(o,i)}},{key:"getTrForRow",value:function(e){return this.TBODY.childNodes[this.rowFilter.sourceToRendered(e)]}},{key:"getFirstRenderedRow",value:function(){return this.wot.wtViewport.rowsRenderCalculator.startRow}},{key:"getFirstVisibleRow",value:function(){return this.wot.wtViewport.rowsVisibleCalculator.startRow}},{key:"getFirstRenderedColumn",value:function(){return this.wot.wtViewport.columnsRenderCalculator.startColumn}},{key:"getFirstVisibleColumn",value:function(){return this.wot.wtViewport.columnsVisibleCalculator.startColumn}},{key:"getLastRenderedRow",value:function(){return this.wot.wtViewport.rowsRenderCalculator.endRow}},{key:"getLastVisibleRow",value:function(){return this.wot.wtViewport.rowsVisibleCalculator.endRow}},{key:"getLastRenderedColumn",value:function(){return this.wot.wtViewport.columnsRenderCalculator.endColumn}},{key:"getLastVisibleColumn",value:function(){return this.wot.wtViewport.columnsVisibleCalculator.endColumn}},{key:"isRowBeforeRenderedRows",value:function(e){return this.rowFilter&&this.rowFilter.sourceToRendered(e)<0&&e>=0}},{key:"isRowAfterViewport",value:function(e){return this.rowFilter&&this.rowFilter.sourceToRendered(e)>this.getLastVisibleRow()}},{key:"isRowAfterRenderedRows",value:function(e){return this.rowFilter&&this.rowFilter.sourceToRendered(e)>this.getLastRenderedRow()}},{key:"isColumnBeforeViewport",value:function(e){return this.columnFilter&&this.columnFilter.sourceToRendered(e)<0&&e>=0}},{key:"isColumnAfterViewport",value:function(e){return this.columnFilter&&this.columnFilter.sourceToRendered(e)>this.getLastVisibleColumn()}},{key:"isLastRowFullyVisible",value:function(){return this.getLastVisibleRow()===this.getLastRenderedRow()}},{key:"isLastColumnFullyVisible",value:function(){return this.getLastVisibleColumn()===this.getLastRenderedColumn()}},{key:"getRenderedColumnsCount",value:function(){var e=this.wot.wtViewport.columnsRenderCalculator.count,t=this.wot.getSetting("totalColumns");if(this.wot.isOverlayName(S.default.CLONE_DEBUG))e=t;else if(this.wot.isOverlayName(S.default.CLONE_LEFT)||this.wot.isOverlayName(S.default.CLONE_TOP_LEFT_CORNER)||this.wot.isOverlayName(S.default.CLONE_BOTTOM_LEFT_CORNER))return Math.min(this.wot.getSetting("fixedColumnsLeft"),t);return e}},{key:"getRenderedRowsCount",value:function(){var e=this.wot.wtViewport.rowsRenderCalculator.count,t=this.wot.getSetting("totalRows");return this.wot.isOverlayName(S.default.CLONE_DEBUG)?e=t:this.wot.isOverlayName(S.default.CLONE_TOP)||this.wot.isOverlayName(S.default.CLONE_TOP_LEFT_CORNER)?e=Math.min(this.wot.getSetting("fixedRowsTop"),t):(this.wot.isOverlayName(S.default.CLONE_BOTTOM)||this.wot.isOverlayName(S.default.CLONE_BOTTOM_LEFT_CORNER))&&(e=Math.min(this.wot.getSetting("fixedRowsBottom"),t)),e}},{key:"getVisibleRowsCount",value:function(){return this.wot.wtViewport.rowsVisibleCalculator.count}},{key:"allRowsInViewport",value:function(){return this.wot.getSetting("totalRows")===this.getVisibleRowsCount()}},{key:"getRowHeight",value:function(e){var t=this.wot.wtSettings.settings.rowHeight(e),n=this.wot.wtViewport.oversizedRows[e];return void 0!==n&&(t=void 0===t?n:Math.max(t,n)),t}},{key:"getColumnHeaderHeight",value:function(e){var t=this.wot.wtSettings.settings.defaultRowHeight,n=this.wot.wtViewport.oversizedColumnHeaders[e];return void 0!==n&&(t=t?Math.max(t,n):n),t}},{key:"getVisibleColumnsCount",value:function(){return this.wot.wtViewport.columnsVisibleCalculator.count}},{key:"allColumnsInViewport",value:function(){return this.wot.getSetting("totalColumns")===this.getVisibleColumnsCount()}},{key:"getColumnWidth",value:function(e){var t=this.wot.wtSettings.settings.columnWidth;return"function"==typeof t?t=t(e):"object"===l(t)&&(t=t[e]),t||this.wot.wtSettings.settings.defaultColumnWidth}},{key:"getStretchedColumnWidth",value:function(e){var t=this.getColumnWidth(e),n=null==t?this.instance.wtSettings.settings.defaultColumnWidth:t,r=this.wot.wtViewport.columnsRenderCalculator;if(r){var o=r.getStretchedColumnWidth(e,n);o&&(n=o)}return n}},{key:"_modifyRowHeaderWidth",value:function(e){var t=(0,y.isFunction)(e)?e():null;return Array.isArray(t)?(t=o(t),t[t.length-1]=this._correctRowHeaderWidth(t[t.length-1])):t=this._correctRowHeaderWidth(t),t}},{key:"_correctRowHeaderWidth",value:function(e){var t=e;return"number"!=typeof e&&(t=this.wot.getSetting("defaultColumnWidth")),this.correctHeaderWidth&&(t+=1),t}}]),e}(),E=_;t.default=E},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(){var e=i(['Performance tip: Handsontable rendered more than 1000 visible rows. Consider limiting the number \n of rendered rows by specifying the table height and/or turning off the "renderAllRows" option.']);return o=function(){return e},e}function i(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function s(e,t){for(var n=0;n=0&&(this.adjustAvailableNodes(),a=!0,this.renderColumnHeaders(),this.renderRows(i,r,n),this.wtTable.isWorkingOnClone()||(t=this.wot.wtViewport.getWorkspaceWidth(),this.wot.wtViewport.containerWidth=null),this.adjustColumnWidths(n), this.markOversizedColumnHeaders(),this.adjustColumnHeaderHeights()),a||this.adjustAvailableNodes(),this.removeRedundantRows(r),this.wtTable.isWorkingOnClone()&&!this.wot.isOverlayName(p.default.CLONE_BOTTOM)||this.markOversizedRows(),this.wtTable.isWorkingOnClone())this.wot.isOverlayName(p.default.CLONE_BOTTOM)&&this.wot.cloneSource.wtOverlays.adjustElementsSize();else{this.wot.wtViewport.createVisibleCalculators(),this.wot.wtOverlays.refresh(!1),this.wot.wtOverlays.applyToDOM();var s=(0,f.outerWidth)(this.wtTable.hider),l=(0,f.outerWidth)(this.wtTable.TABLE);if(0!==s&&l!==s&&this.adjustColumnWidths(n),t!==this.wot.wtViewport.getWorkspaceWidth()){this.wot.wtViewport.containerWidth=null;var u=this.wtTable.getFirstRenderedColumn(),c=this.wtTable.getLastRenderedColumn(),h=this.wot.getSetting("defaultColumnWidth"),d=this.wot.getSetting("rowHeaderWidth");if(d=this.instance.getSetting("onModifyRowHeaderWidth",d),null!=d)for(var g=0;ge;)this.TBODY.removeChild(this.TBODY.lastChild),this.wtTable.tbodyChildrenLength-=1}},{key:"renderRows",value:function(e,t,n){for(var r,i=0,a=this.rowFilter.renderedToSource(i),s=this.wtTable.isWorkingOnClone();a=0&&(!g&&i>1e3&&(g=!0,(0,h.warn)((0,d.toSingleLine)(o()))),void 0===t||i!==t);){if(r=this.getOrCreateTrForRow(i,r),this.renderRowHeaders(a,r),this.adjustColumns(r,n+this.rowHeaderCount),this.renderCells(a,r,n),s&&!this.wot.isOverlayName(p.default.CLONE_BOTTOM)||this.resetOversizedRow(a),r.firstChild){var l=this.wot.wtTable.getRowHeight(a);l?(l-=1,r.firstChild.style.height="".concat(l,"px")):r.firstChild.style.height=""}i+=1,a=this.rowFilter.renderedToSource(i)}}},{key:"resetOversizedRow",value:function(e){this.wot.getSetting("externalRowCalculator")||this.wot.wtViewport.oversizedRows&&this.wot.wtViewport.oversizedRows[e]&&(this.wot.wtViewport.oversizedRows[e]=void 0)}},{key:"markOversizedRows",value:function(){if(!this.wot.getSetting("externalRowCalculator")){var e,t,n,r,o,i=this.instance.wtTable.TBODY.childNodes.length,a=i*this.instance.wtSettings.settings.defaultRowHeight,s=(0,f.innerHeight)(this.instance.wtTable.TBODY)-1;if(a!==s||this.instance.getSetting("fixedRowsBottom"))for(;i;)i-=1,n=this.instance.wtTable.rowFilter.renderedToSource(i),e=this.instance.wtTable.getRowHeight(n),r=this.instance.wtTable.getTrForRow(n),o=r.querySelector("th"),t=o?(0,f.innerHeight)(o):(0,f.innerHeight)(r)-1,(!e&&this.instance.wtSettings.settings.defaultRowHeight=this.wtTable.tbodyChildrenLength?(n=this.createRow(),this.appendToTbody(n)):n=0===e?this.TBODY.firstChild:t.nextSibling,n.className&&n.removeAttribute("class"),n}},{key:"createRow",value:function(){for(var e=document.createElement("TR"),t=0;te+this.rowHeaderCount;)this.COLGROUP.removeChild(this.COLGROUP.lastChild),this.wtTable.colgroupChildrenLength-=1;this.rowHeaderCount&&(0,f.addClass)(this.COLGROUP.childNodes[0],"rowHeader")}},{key:"adjustThead",value:function(){var e=this.wtTable.getRenderedColumnsCount(),t=this.THEAD.firstChild;if(this.columnHeaders.length){for(var n=0,r=this.columnHeaders.length;ne+this.rowHeaderCount;)t.removeChild(t.lastChild),this.theadChildrenLength-=1}var o=this.THEAD.childNodes.length;if(o>this.columnHeaders.length)for(var i=this.columnHeaders.length;it;)e.removeChild(e.lastChild),n-=1}},{key:"removeRedundantColumns",value:function(e){for(;this.wtTable.tbodyChildrenLength>e;)this.TBODY.removeChild(this.TBODY.lastChild),this.wtTable.tbodyChildrenLength-=1}}]),e}(),y=v;t.default=y},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var n=0;n0&&t.clientHeight>0?t.clientHeight:1/0),n}},{key:"getWorkspaceWidth",value:function(){var e,t,n=this.wot.getSetting("totalColumns"),r=this.instance.wtOverlays.leftOverlay.trimmingContainer,o=this.wot.getSetting("stretchH"),i=document.documentElement.offsetWidth,a=this.wot.getSetting("preventOverflow");return a?(0,s.outerWidth)(this.instance.wtTable.wtRootElement):(e=this.wot.getSetting("freezeOverlays")?Math.min(i-this.getWorkspaceOffset().left,i):Math.min(this.getContainerFillWidth(),i-this.getWorkspaceOffset().left,i),r===window&&n>0&&this.sumColumnWidths(0,n-1)>e?document.documentElement.clientWidth:r!==window&&(t=(0,s.getStyle)(this.instance.wtOverlays.leftOverlay.trimmingContainer,"overflow"),"scroll"===t||"hidden"===t||"auto"===t)?Math.max(e,r.clientWidth):"none"!==o&&o?e:Math.max(e,(0,s.outerWidth)(this.instance.wtTable.TABLE)))}},{key:"hasVerticalScroll",value:function(){return this.getWorkspaceActualHeight()>this.getWorkspaceHeight()}},{key:"hasHorizontalScroll",value:function(){return this.getWorkspaceActualWidth()>this.getWorkspaceWidth()}},{key:"sumColumnWidths",value:function(e,t){for(var n=this.wot.wtTable,r=0,o=e;o0&&(e-=t),e}},{key:"getRowHeaderWidth",value:function(){var e=this.instance.getSetting("rowHeaderWidth"),t=this.instance.getSetting("rowHeaders");if(e){this.rowHeaderWidth=0;for(var n=0,r=t.length;n0?e-t:e}},{key:"createRowsCalculator",value:function(){var e,t,n,r=this,o=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.rowHeaderWidth=NaN,e=this.wot.wtSettings.settings.renderAllRows&&!o?1/0:this.getViewportHeight();var i=this.wot.wtOverlays.topOverlay.getScrollPosition()-this.wot.wtOverlays.topOverlay.getTableParentOffset();i<0&&(i=0);var a=this.wot.getSetting("fixedRowsTop"),l=this.wot.getSetting("fixedRowsBottom"),u=this.wot.getSetting("totalRows");return a&&(n=this.wot.wtOverlays.topOverlay.sumCellSizes(0,a),i+=n,e-=n),l&&this.wot.wtOverlays.bottomOverlay.clone&&(n=this.wot.wtOverlays.bottomOverlay.sumCellSizes(u-l,u),e-=n),t=this.wot.wtTable.holder.clientHeight===this.wot.wtTable.holder.offsetHeight?0:(0,s.getScrollbarWidth)(),new f.default(e,i,this.wot.getSetting("totalRows"),function(e){return r.wot.wtTable.getRowHeight(e)},o?null:this.wot.wtSettings.settings.viewportRowCalculatorOverride,o,t)}},{key:"createColumnsCalculator",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=this.getViewportWidth(),r=this.wot.wtOverlays.leftOverlay.getScrollPosition()-this.wot.wtOverlays.leftOverlay.getTableParentOffset();this.columnHeaderHeight=NaN,r<0&&(r=0);var o=this.wot.getSetting("fixedColumnsLeft");if(o){var i=this.wot.wtOverlays.leftOverlay.sumCellSizes(0,o);r+=i,n-=i}return this.wot.wtTable.holder.clientWidth!==this.wot.wtTable.holder.offsetWidth&&(n-=(0,s.getScrollbarWidth)()),new c.default(n,r,this.wot.getSetting("totalColumns"),function(t){return e.wot.wtTable.getColumnWidth(t)},t?null:this.wot.wtSettings.settings.viewportColumnCalculatorOverride,t,this.wot.getSetting("stretchH"),function(t,n){return e.wot.getSetting("onBeforeStretchingColumnWidth",t,n)})}},{key:"createRenderCalculators",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=e;if(t){var n=this.createRowsCalculator(!0),r=this.createColumnsCalculator(!0);this.areAllProposedVisibleRowsAlreadyRendered(n)&&this.areAllProposedVisibleColumnsAlreadyRendered(r)||(t=!1)}return t||(this.rowsRenderCalculator=this.createRowsCalculator(),this.columnsRenderCalculator=this.createColumnsCalculator()),this.rowsVisibleCalculator=null,this.columnsVisibleCalculator=null,t}},{key:"createVisibleCalculators",value:function(){this.rowsVisibleCalculator=this.createRowsCalculator(!0),this.columnsVisibleCalculator=this.createColumnsCalculator(!0)}},{key:"areAllProposedVisibleRowsAlreadyRendered",value:function(e){return!!this.rowsVisibleCalculator&&(!(e.startRow0)&&!(e.endRow>this.rowsRenderCalculator.endRow||e.endRow===this.rowsRenderCalculator.endRow&&e.endRow0)&&!(e.endColumn>this.columnsRenderCalculator.endColumn||e.endColumn===this.columnsRenderCalculator.endColumn&&e.endColumnMath.ceil(i.top+i.height)||(e.clientXMath.ceil(i.left+i.width)||void 0)))}function r(e){n(e)&&(o.eventManager.removeEventListener(document.body,"mousemove",r),t.style.display="block")}if(this.mouseDown&&this.wot.getSetting("hideBorderOnMouseDownOver")){e.preventDefault(),(0,h.stopImmediatePropagation)(e);var o=this,i=t.getBoundingClientRect();t.style.display="none",this.eventManager.addEventListener(document.body,"mousemove",r)}}},{key:"createBorders",value:function(e){this.main=document.createElement("div");var t=["top","left","bottom","right","corner"],n=this.main.style;n.position="absolute",n.top=0,n.left=0;for(var r=0;r<5;r++){var o=t[r],i=document.createElement("div");i.className="wtBorder ".concat(this.settings.className||""),this.settings[o]&&this.settings[o].hide&&(i.className+=" hidden"),n=i.style,n.backgroundColor=this.settings[o]&&this.settings[o].color?this.settings[o].color:e.border.color,n.height=this.settings[o]&&this.settings[o].width?"".concat(this.settings[o].width,"px"):"".concat(e.border.width,"px"),n.width=this.settings[o]&&this.settings[o].width?"".concat(this.settings[o].width,"px"):"".concat(e.border.width,"px"),this.main.appendChild(i)}this.top=this.main.childNodes[0],this.left=this.main.childNodes[1],this.bottom=this.main.childNodes[2],this.right=this.main.childNodes[3],this.topStyle=this.top.style,this.leftStyle=this.left.style,this.bottomStyle=this.bottom.style,this.rightStyle=this.right.style,this.corner=this.main.childNodes[4],this.corner.className+=" corner",this.cornerStyle=this.corner.style,this.cornerStyle.width=this.cornerDefaultStyle.width,this.cornerStyle.height=this.cornerDefaultStyle.height,this.cornerStyle.border=[this.cornerDefaultStyle.borderWidth,this.cornerDefaultStyle.borderStyle,this.cornerDefaultStyle.borderColor].join(" "),(0,p.isMobileBrowser)()&&this.createMultipleSelectorHandles(),this.disappear();var a=this.wot.wtTable.bordersHolder;a||(a=document.createElement("div"),a.className="htBorders",this.wot.wtTable.bordersHolder=a,this.wot.wtTable.spreader.appendChild(a)),a.appendChild(this.main)}},{key:"createMultipleSelectorHandles",value:function(){var e=this;this.selectionHandles={topLeft:document.createElement("DIV"),topLeftHitArea:document.createElement("DIV"),bottomRight:document.createElement("DIV"),bottomRightHitArea:document.createElement("DIV")};var t=10,n=40;this.selectionHandles.topLeft.className="topLeftSelectionHandle",this.selectionHandles.topLeftHitArea.className="topLeftSelectionHandle-HitArea",this.selectionHandles.bottomRight.className="bottomRightSelectionHandle",this.selectionHandles.bottomRightHitArea.className="bottomRightSelectionHandle-HitArea",this.selectionHandles.styles={topLeft:this.selectionHandles.topLeft.style,topLeftHitArea:this.selectionHandles.topLeftHitArea.style,bottomRight:this.selectionHandles.bottomRight.style,bottomRightHitArea:this.selectionHandles.bottomRightHitArea.style};var r={position:"absolute",height:"".concat(n,"px"),width:"".concat(n,"px"),"border-radius":"".concat(parseInt(n/1.5,10),"px")};(0,d.objectEach)(r,function(t,n){e.selectionHandles.styles.bottomRightHitArea[n]=t,e.selectionHandles.styles.topLeftHitArea[n]=t});var o={position:"absolute",height:"".concat(t,"px"),width:"".concat(t,"px"),"border-radius":"".concat(parseInt(t/1.5,10),"px"),background:"#F5F5FF",border:"1px solid #4285c8"};(0,d.objectEach)(o,function(t,n){e.selectionHandles.styles.bottomRight[n]=t,e.selectionHandles.styles.topLeft[n]=t}),this.main.appendChild(this.selectionHandles.topLeft),this.main.appendChild(this.selectionHandles.bottomRight),this.main.appendChild(this.selectionHandles.topLeftHitArea),this.main.appendChild(this.selectionHandles.bottomRightHitArea)}},{key:"isPartRange",value:function(e,t){var n=this.wot.selections.createOrGetArea();return!(!n.cellRange||e===n.cellRange.to.row&&t===n.cellRange.to.col)}},{key:"updateMultipleSelectionHandlesPosition",value:function(e,t,n,r,o,i){var a=parseInt(this.selectionHandles.styles.topLeft.width,10),s=parseInt(this.selectionHandles.styles.topLeftHitArea.width,10);this.selectionHandles.styles.topLeft.top="".concat(parseInt(n-a,10),"px"),this.selectionHandles.styles.topLeft.left="".concat(parseInt(r-a,10),"px"),this.selectionHandles.styles.topLeftHitArea.top="".concat(parseInt(n-s/4*3,10),"px"),this.selectionHandles.styles.topLeftHitArea.left="".concat(parseInt(r-s/4*3,10),"px"),this.selectionHandles.styles.bottomRight.top="".concat(parseInt(n+i,10),"px"),this.selectionHandles.styles.bottomRight.left="".concat(parseInt(r+o,10),"px"),this.selectionHandles.styles.bottomRightHitArea.top="".concat(parseInt(n+i-s/4,10),"px"),this.selectionHandles.styles.bottomRightHitArea.left="".concat(parseInt(r+o-s/4,10),"px"),this.settings.border.cornerVisible&&this.settings.border.cornerVisible()?(this.selectionHandles.styles.topLeft.display="block",this.selectionHandles.styles.topLeftHitArea.display="block",this.isPartRange(e,t)?(this.selectionHandles.styles.bottomRight.display="none",this.selectionHandles.styles.bottomRightHitArea.display="none"):(this.selectionHandles.styles.bottomRight.display="block",this.selectionHandles.styles.bottomRightHitArea.display="block")):(this.selectionHandles.styles.topLeft.display="none",this.selectionHandles.styles.bottomRight.display="none",this.selectionHandles.styles.topLeftHitArea.display="none",this.selectionHandles.styles.bottomRightHitArea.display="none"),e===this.wot.wtSettings.getSetting("fixedRowsTop")||t===this.wot.wtSettings.getSetting("fixedColumnsLeft")?(this.selectionHandles.styles.topLeft.zIndex="9999",this.selectionHandles.styles.topLeftHitArea.zIndex="9999"):(this.selectionHandles.styles.topLeft.zIndex="",this.selectionHandles.styles.topLeftHitArea.zIndex="")}},{key:"appear",value:function(e){if(!this.disabled){for(var t,n,r,i,a=this.wot.wtTable.getRenderedRowsCount(),s=0;s=e[0]&&l<=e[2]){t=l;break}}for(var u=a-1;u>=0;u-=1){var c=this.wot.wtTable.rowFilter.renderedToSource(u);if(c>=e[0]&&c<=e[2]){n=c;break}}for(var h=this.wot.wtTable.getRenderedColumnsCount(),d=0;d=e[1]&&g<=e[3]){r=g;break}}for(var y=h-1;y>=0;y-=1){var m=this.wot.wtTable.columnFilter.renderedToSource(y);if(m>=e[1]&&m<=e[3]){i=m;break}}if(void 0!==t&&void 0!==r){var w=this.wot.wtTable.getCell(new v.default(t,r)),b=t!==n||r!==i,C=b?this.wot.wtTable.getCell(new v.default(n,i)):w,S=(0,f.offset)(w),_=b?(0,f.offset)(C):S,E=(0,f.offset)(this.wot.wtTable.TABLE),O=S.top,T=S.left,R=T-E.left-1,k=_.left+(0,f.outerWidth)(C)-T;if(this.isEntireColumnSelected(t,n)){var M=this.getDimensionsFromHeader("columns",r,i,E),N=null;if(M){var D=o(M,3);N=D[0],R=D[1],k=D[2]}N&&(w=N)}var A=O-E.top-1,P=_.top+(0,f.outerHeight)(C)-O;if(this.isEntireRowSelected(r,i)){var L=this.getDimensionsFromHeader("rows",t,n,E),H=null;if(L){var x=o(L,3);H=x[0],A=x[1],P=x[2]}H&&(w=H)}var I=(0,f.getComputedStyle)(w);parseInt(I.borderTopWidth,10)>0&&(A+=1,P=P>0?P-1:0),parseInt(I.borderLeftWidth,10)>0&&(R+=1,k=k>0?k-1:0),this.topStyle.top="".concat(A,"px"),this.topStyle.left="".concat(R,"px"),this.topStyle.width="".concat(k,"px"),this.topStyle.display="block",this.leftStyle.top="".concat(A,"px"),this.leftStyle.left="".concat(R,"px"),this.leftStyle.height="".concat(P,"px"),this.leftStyle.display="block";var j=Math.floor(this.settings.border.width/2);this.bottomStyle.top="".concat(A+P-j,"px"),this.bottomStyle.left="".concat(R,"px"),this.bottomStyle.width="".concat(k,"px"),this.bottomStyle.display="block",this.rightStyle.top="".concat(A,"px"),this.rightStyle.left="".concat(R+k-j,"px"),this.rightStyle.height="".concat(P+1,"px"),this.rightStyle.display="block";var F=this.settings.border.cornerVisible;F="function"==typeof F?F(this.settings.layerLevel):F;var W=this.wot.getSetting("onModifyGetCellCoords",n,i),B=n,V=i;if(W&&Array.isArray(W)){var Y=o(W,4);B=Y[2],V=Y[3]}if((0,p.isMobileBrowser)()||!F||this.isPartRange(B,V))this.cornerStyle.display="none";else{this.cornerStyle.top="".concat(A+P-4,"px"),this.cornerStyle.left="".concat(R+k-4,"px"),this.cornerStyle.borderRightWidth=this.cornerDefaultStyle.borderWidth,this.cornerStyle.width=this.cornerDefaultStyle.width,this.cornerStyle.display="none";var U=(0,f.getTrimmingContainer)(this.wot.wtTable.TABLE),z=U===window;if(z&&(U=document.documentElement),i===this.wot.getSetting("totalColumns")-1){var G=z?C.getBoundingClientRect().left:C.offsetLeft,X=G+(0,f.outerWidth)(C)+parseInt(this.cornerDefaultStyle.width,10)/2,K=X>=(0,f.innerWidth)(U);K&&(this.cornerStyle.left="".concat(Math.floor(R+k-3-parseInt(this.cornerDefaultStyle.width,10)/2),"px"),this.cornerStyle.borderRightWidth=0)}if(n===this.wot.getSetting("totalRows")-1){var q=z?C.getBoundingClientRect().top:C.offsetTop,Z=q+(0,f.outerHeight)(C)+parseInt(this.cornerDefaultStyle.height,10)/2,$=Z>=(0,f.innerHeight)(U);$&&(this.cornerStyle.top="".concat(Math.floor(A+P-3-parseInt(this.cornerDefaultStyle.height,10)/2),"px"),this.cornerStyle.borderBottomWidth=0)}this.cornerStyle.display="block"}(0,p.isMobileBrowser)()&&this.updateMultipleSelectionHandlesPosition(n,i,A,R,k,P)}else this.disappear()}}},{key:"isEntireColumnSelected",value:function(e,t){return e===this.wot.wtTable.getFirstRenderedRow()&&t===this.wot.wtTable.getLastRenderedRow()}},{key:"isEntireRowSelected",value:function(e,t){return e===this.wot.wtTable.getFirstRenderedColumn()&&t===this.wot.wtTable.getLastRenderedColumn()}},{key:"getDimensionsFromHeader",value:function(e,t,n,r){var o=this,i=this.wot.wtTable.wtRootElement.parentNode,a=null,s=null,l=null,u=null,c=null,h=null,d=null,p=null;switch(e){case"rows":a=function(){var e;return(e=o.wot.wtTable).getRowHeader.apply(e,arguments)},s=function(){return f.outerHeight.apply(void 0,arguments)},l="ht__selection--rows",h="top";break;case"columns":a=function(){var e;return(e=o.wot.wtTable).getColumnHeader.apply(e,arguments)},s=function(){return f.outerWidth.apply(void 0,arguments)},l="ht__selection--columns",h="left"}if(i.className.includes(l)){var g=this.wot.getSetting("columnHeaders").length;if(d=a(t,g-1),p=a(n,g-1),!d||!p)return!1;var v=(0,f.offset)(d),y=(0,f.offset)(p);return d&&p&&(u=v[h]-r[h]-1,c=y[h]+s(p)-v[h]),[d,u,c]}return!1}},{key:"changeBorderStyle",value:function(e,t){var n=this[e].style,r=t[e];!r||r.hide?(0,f.addClass)(this[e],"hidden"):((0,f.hasClass)(this[e],"hidden")&&(0,f.removeClass)(this[e],"hidden"),n.backgroundColor=r.color,"top"!==e&&"bottom"!==e||(n.height="".concat(r.width,"px")),"right"!==e&&"left"!==e||(n.width="".concat(r.width,"px")))}},{key:"changeBorderToDefaultStyle",value:function(e){var t={width:1,color:"#000"},n=this[e].style;n.backgroundColor=t.color,n.width="".concat(t.width,"px"),n.height="".concat(t.width,"px")}},{key:"toggleHiddenClass",value:function(e,t){this.changeBorderToDefaultStyle(e),t?(0,f.addClass)(this[e],"hidden"):(0,f.removeClass)(this[e],"hidden")}},{key:"disappear",value:function(){this.topStyle.display="none",this.leftStyle.display="none",this.bottomStyle.display="none",this.rightStyle.display="none",this.cornerStyle.display="none",(0,p.isMobileBrowser)()&&(this.selectionHandles.styles.topLeft.display="none",this.selectionHandles.styles.bottomRight.display="none")}}]),e}(),m=y;t.default=m},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){h=!1;var t=this.getActiveEditor();if((0,i.isPrintableChar)(e.keyCode)||e.keyCode===i.KEY_CODES.BACKSPACE||e.keyCode===i.KEY_CODES.DELETE||e.keyCode===i.KEY_CODES.INSERT){var n=0;if(e.keyCode===i.KEY_CODES.C&&(e.ctrlKey||e.metaKey))return;t.isOpened()||(n+=10),t.htEditor&&t.instance._registerTimeout(function(){t.queryChoices(t.TEXTAREA.value),h=!0},n)}}t.__esModule=!0,t.default=void 0;var i=n(32),a=n(14),s=n(48),l=n(3),u=n(1),c=r(n(295)),f=c.default.prototype.extend();f.prototype.init=function(){for(var e=arguments.length,t=new Array(e),n=0;n".concat(l,"")))),e.innerHTML=h},autoColumnSize:!0,modifyColWidth:function(e,t){ var n=this.getPlugin("autoColumnSize").widths,r=e;return n[t]&&(r=n[t]),s?r:r+15}}),this.htEditor.view.wt.wtTable.holder.parentNode.style["padding-right"]="".concat((0,u.getScrollbarWidth)()+2,"px"),h&&(h=!1),i.instance._registerTimeout(function(){i.queryChoices(i.TEXTAREA.value)})},f.prototype.queryChoices=function(e){var t=this;this.query=e;var n=this.cellProperties.source;"function"==typeof n?n.call(this.cellProperties,e,function(e){t.rawChoices=e,t.updateChoicesList(t.stripValuesIfNeeded(e))}):Array.isArray(n)?(this.rawChoices=n,this.updateChoicesList(this.stripValuesIfNeeded(n))):this.updateChoicesList([])},f.prototype.updateChoicesList=function(e){var t=(0,u.getCaretPosition)(this.TEXTAREA),n=(0,u.getSelectionEndPosition)(this.TEXTAREA),r=this.cellProperties.sortByRelevance,o=this.cellProperties.filter,i=null,a=null,s=e;r&&(i=f.sortByRelevance(this.stripValueIfNeeded(this.getValue()),s,this.cellProperties.filteringCaseSensitive));var c=Array.isArray(i)?i.length:0;if(!1===o)c&&(a=i[0]);else{for(var h=[],d=0,p=s.length;dl&&s>l;return c?this.flipDropdown(n):this.unflipDropdown(),this.limitDropdownIfNeeded(c?s:l,n),c},f.prototype.limitDropdownIfNeeded=function(e,t){if(t>e){var n=0,r=0,o=0,i=null;do{o=this.htEditor.getRowHeight(r)||this.htEditor.view.wt.wtSettings.settings.defaultRowHeight,n+=o,r+=1}while(n1?t-1:0),r=1;rt.charsLeft)return 1}return 0}),l=0,h=u.length;l=t?t*e:this.strippedChoices.length*e+8},f.prototype.stripValueIfNeeded=function(e){return this.stripValuesIfNeeded([e])[0]},f.prototype.stripValuesIfNeeded=function(e){var t=this.cellProperties.allowHtml,n=(0,l.arrayMap)(e,function(e){return(0,a.stringify)(e)}),r=(0,l.arrayMap)(n,function(e){return t?e:(0,s.stripTags)(e)});return r},f.prototype.allowKeyEventPropagation=function(e){var t=this.htEditor.getSelectedRangeLast(),n={row:t?t.from.row:-1},r=!1;return e===i.KEY_CODES.ARROW_DOWN&&n.row>0&&n.row-1&&(r=!0),r},f.prototype.close=function(){this.instance.removeHook("beforeKeyDown",o);for(var e=arguments.length,t=new Array(e),n=0;n6?s-6:0),c=6;ci.countRows()-1?i.deselectCell():i.selectCell(t,0),i.getData().length&&(e.preventDefault(),(0,s.stopImmediatePropagation)(e),r.instance.listen(),r.TEXTAREA.focus()))}};u.prototype.open=function(){this.instance.addHook("beforeKeyDown",c);for(var e=arguments.length,t=new Array(e),n=0;n15&&N(L,m,e),a=!1):u.s=45===l.charCodeAt(0)?(l=l.slice(1),-1):1,l=h(l,10,n,u.s)}else{if(e instanceof t)return u.s=e.s,u.e=e.e,u.c=(e=e.c)?e.slice():e,void(L=0);if((a="number"==typeof e)&&0*e==0){if(u.s=1/e<0?(e=-e,-1):1,e===~~e){for(o=0,i=e;i>=10;i/=10,o++);return u.e=o,u.c=[e],void(L=0)}l=e+""}else{if(!d.test(l=e+""))return P(u,l,a);u.s=45===l.charCodeAt(0)?(l=l.slice(1),-1):1}}for((o=l.indexOf("."))>-1&&(l=l.replace(".","")),(i=l.search(/e/i))>0?(o<0&&(o=i),o+=+l.slice(i+1),l=l.substring(0,i)):o<0&&(o=l.length),i=0;48===l.charCodeAt(i);i++);for(s=l.length;48===l.charCodeAt(--s););if(l=l.slice(i,s+1))if(s=l.length,a&&Y&&s>15&&(e>S||e!==g(e))&&N(L,m,u.s*e),(o=o-i-1)>V)u.c=u.e=null;else if(o=0&&(u=X,X=0,e=e.replace(".",""),h=(p=new t(r)).pow(e.length-g),X=u,p.c=l(c(o(h.c),h.e),10,n),p.e=p.c.length),s=u=(d=l(e,r,n)).length;0==d[--u];d.pop());if(!d[0])return"0";if(g<0?--s:(h.c=d,h.e=s,h.s=i,d=(h=A(h,p,v,y,n)).c,f=h.r,s=h.e),a=s+v+1,g=d[a],u=n/2,f=f||a<0||null!=d[a+1],f=y<4?(null!=g||f)&&(0==y||y==(h.s<0?3:2)):g>u||g==u&&(4==y||f||6==y&&1&d[a-1]||y==(h.s<0?8:7)),a<1||!d[0])e=f?c("1",-v):"0";else{if(d.length=a,f)for(--n;++d[--a]>n;)d[a]=0,a||(++s,d=[1].concat(d));for(u=d.length;!d[--u];);for(g=0,e="";g<=u;e+=w.charAt(d[g++]));e=c(e,s)}return e}function T(e,n,r,i){var a,s,l,f,h;if(r=null!=r&&U(r,0,8,i,y)?0|r:j,!e.c)return e.toString();if(a=e.c[0],l=e.e,null==n)h=o(e.c),h=19==i||24==i&&l<=F?u(h,l):c(h,l);else if(e=D(new t(e),n,r),s=e.e,h=o(e.c),f=h.length,19==i||24==i&&(n<=s||s<=F)){for(;ff){if(--n>0)for(h+=".";n--;h+="0");}else if((n+=s-f)>0)for(s+1==f&&(h+=".");n--;h+="0");return e.s<0&&a?"-"+h:h}function R(e,n){var r,o,i=0;for(s(e[0])&&(e=e[0]),r=new t(e[0]);++in||e!=f(e))&&N(r,(o||"decimal places")+(en?" out of range":" not an integer"),e),!0}function M(e,t,n){for(var r=1,o=t.length;!t[--o];t.pop());for(o=t[0];o>=10;o/=10,r++);return(n=r+n*C-1)>V?e.c=e.e=null:n=10;s/=10,o++);if((i=t-o)<0)i+=C,a=t,c=(l=f[u=0])/h[o-a-1]%10|0;else if((u=p((i+1)/C))>=f.length){if(!r)break e;for(;f.length<=u;f.push(0));l=c=0,o=1,a=(i%=C)-C+1}else{for(l=s=f[u],o=1;s>=10;s/=10,o++);c=(a=(i%=C)-C+o)<0?0:l/h[o-a-1]%10|0}if(r=r||t<0||null!=f[u+1]||(a<0?l:l%h[o-a-1]),r=n<4?(c||r)&&(0==n||n==(e.s<0?3:2)):c>5||5==c&&(4==n||r||6==n&&(i>0?a>0?l/h[o-a]:0:f[u-1])%10&1||n==(e.s<0?8:7)),t<1||!f[0])return f.length=0,r?(t-=e.e+1,f[0]=h[(C-t%C)%C],e.e=-t||0):f[0]=e.e=0,e;if(0==i?(f.length=u,s=1,u--):(f.length=u+1,s=h[C-i],f[u]=a>0?g(l/h[o-a]%h[a])*s:0),r)for(;;){if(0==u){for(i=1,a=f[0];a>=10;a/=10,i++);for(a=f[0]+=s,s=1;a>=10;a/=10,s++);i!=s&&(e.e++,f[0]==b&&(f[0]=1));break}if(f[u]+=s,f[u]!=b)break;f[u--]=0,s=1}for(i=f.length;0===f[--i];f.pop());}e.e>V?e.c=e.e=null:e.en)return null!=(e=o[n++])};return l(t="DECIMAL_PLACES")&&U(e,0,O,2,t)&&(I=0|e),r[t]=I,l(t="ROUNDING_MODE")&&U(e,0,8,2,t)&&(j=0|e),r[t]=j,l(t="EXPONENTIAL_AT")&&(s(e)?U(e[0],-O,0,2,t)&&U(e[1],0,O,2,t)&&(F=0|e[0],W=0|e[1]):U(e,-O,O,2,t)&&(F=-(W=0|(e<0?-e:e)))),r[t]=[F,W],l(t="RANGE")&&(s(e)?U(e[0],-O,-1,2,t)&&U(e[1],1,O,2,t)&&(B=0|e[0],V=0|e[1]):U(e,-O,O,2,t)&&(0|e?B=-(V=0|(e<0?-e:e)):Y&&N(2,t+" cannot be zero",e))),r[t]=[B,V],l(t="ERRORS")&&(e===!!e||1===e||0===e?(L=0,U=(Y=!!e)?k:a):Y&&N(2,t+v,e)),r[t]=Y,l(t="CRYPTO")&&(!0===e||!1===e||1===e||0===e?e?!(e="undefined"==typeof crypto)&&crypto&&(crypto.getRandomValues||crypto.randomBytes)?z=!0:Y?N(2,"crypto unavailable",e?void 0:crypto):z=!1:z=!1:Y&&N(2,t+v,e)),r[t]=z,l(t="MODULO_MODE")&&U(e,0,9,2,t)&&(G=0|e),r[t]=G,l(t="POW_PRECISION")&&U(e,0,O,2,t)&&(X=0|e),r[t]=X,l(t="FORMAT")&&("object"==typeof e?K=e:Y&&N(2,t+" not an object",e)),r[t]=K,r},t.max=function(){return R(arguments,H.lt)},t.min=function(){return R(arguments,H.gt)},t.random=function(){var e=9007199254740992*Math.random()&2097151?function(){return g(9007199254740992*Math.random())}:function(){return 8388608*(1073741824*Math.random()|0)+(8388608*Math.random()|0)};return function(n){var r,o,i,a,s,l=0,u=[],c=new t(x);if(n=null!=n&&U(n,0,O,14)?0|n:I,a=p(n/C),z)if(crypto.getRandomValues){for(r=crypto.getRandomValues(new Uint32Array(a*=2));l>>11))>=9e15?(o=crypto.getRandomValues(new Uint32Array(2)),r[l]=o[0],r[l+1]=o[1]):(u.push(s%1e14),l+=2);l=a/2}else if(crypto.randomBytes){for(r=crypto.randomBytes(a*=7);l=9e15?crypto.randomBytes(7).copy(r,l):(u.push(s%1e14),l+=7);l=a/7}else z=!1,Y&&N(14,"crypto unavailable",crypto);if(!z)for(;l=10;s/=10,l++);lr?1:-1;else for(o=i=0;ot[o]?1:-1;break}return i}function o(e,t,n,r){for(var o=0;n--;)e[n]-=o,o=e[n]1;e.splice(0,1));}return function(i,a,s,l,u){var c,f,h,d,p,v,y,m,w,S,_,E,O,T,R,k,M,N=i.s==a.s?1:-1,A=i.c,P=a.c;if(!(A&&A[0]&&P&&P[0]))return new t(i.s&&a.s&&(A?!P||A[0]!=P[0]:P)?A&&0==A[0]||!P?0*N:N/0:NaN);for(w=(m=new t(N)).c=[],N=s+(f=i.e-a.e)+1,u||(u=b,f=r(i.e/C)-r(a.e/C),N=N/C|0),h=0;P[h]==(A[h]||0);h++);if(P[h]>(A[h]||0)&&f--,N<0)w.push(1),d=!0;else{for(T=A.length,k=P.length,h=0,N+=2,(p=g(u/(P[0]+1)))>1&&(P=e(P,p,u),A=e(A,p,u),k=P.length,T=A.length),O=k,_=(S=A.slice(0,k)).length;_=u/2&&R++;do{if(p=0,(c=n(P,S,k,_))<0){if(E=S[0],k!=_&&(E=E*u+(S[1]||0)),(p=g(E/R))>1)for(p>=u&&(p=u-1),y=(v=e(P,p,u)).length,_=S.length;1==n(v,S,y,_);)p--,o(v,k=10;N/=10,h++);D(m,s+(m.e=h+f*C-1)+1,l,d)}else m.e=f,m.r=+d;return m}}(),P=function(){var e=/^(-?)0([xbo])(?=\w[\w.]*$)/i,n=/^([^.]+)\.$/,r=/^\.([^.]+)$/,o=/^-?(Infinity|NaN)$/,i=/^\s*\+(?=[\w.])|^\s+|\s+$/g;return function(a,s,l,u){var c,f=l?s:s.replace(i,"");if(o.test(f))a.s=isNaN(f)?null:f<0?-1:1;else{if(!l&&(f=f.replace(e,function(e,t,n){return c="x"==(n=n.toLowerCase())?16:"b"==n?2:8,u&&u!=c?e:t}),u&&(c=u,f=f.replace(n,"$1").replace(r,"0.$1")),s!=f))return new t(f,c);Y&&N(L,"not a"+(u?" base "+u:"")+" number",s),a.s=null}a.c=a.e=null,L=0}}(),H.absoluteValue=H.abs=function(){var e=new t(this);return e.s<0&&(e.s=1),e},H.ceil=function(){return D(new t(this),this.e+1,2)},H.comparedTo=H.cmp=function(e,n){return L=1,i(this,new t(e,n))},H.decimalPlaces=H.dp=function(){var e,t,n=this.c;if(!n)return null;if(e=((t=n.length-1)-r(this.e/C))*C,t=n[t])for(;t%10==0;t/=10,e--);return e<0&&(e=0),e},H.dividedBy=H.div=function(e,n){return L=3,A(this,new t(e,n),I,j)},H.dividedToIntegerBy=H.divToInt=function(e,n){return L=4,A(this,new t(e,n),0,1)},H.equals=H.eq=function(e,n){return L=5,0===i(this,new t(e,n))},H.floor=function(){return D(new t(this),this.e+1,3)},H.greaterThan=H.gt=function(e,n){return L=6,i(this,new t(e,n))>0},H.greaterThanOrEqualTo=H.gte=function(e,n){return L=7,1===(n=i(this,new t(e,n)))||0===n},H.isFinite=function(){return!!this.c},H.isInteger=H.isInt=function(){return!!this.c&&r(this.e/C)>this.c.length-2},H.isNaN=function(){return!this.s},H.isNegative=H.isNeg=function(){return this.s<0},H.isZero=function(){return!!this.c&&0==this.c[0]},H.lessThan=H.lt=function(e,n){return L=8,i(this,new t(e,n))<0},H.lessThanOrEqualTo=H.lte=function(e,n){return L=9,-1===(n=i(this,new t(e,n)))||0===n},H.minus=H.sub=function(e,n){var o,i,a,s,l=this,u=l.s;if(L=10,e=new t(e,n),n=e.s,!u||!n)return new t(NaN);if(u!=n)return e.s=-n,l.plus(e);var c=l.e/C,f=e.e/C,h=l.c,d=e.c;if(!c||!f){if(!h||!d)return h?(e.s=-n,e):new t(d?l:NaN);if(!h[0]||!d[0])return d[0]?(e.s=-n,e):new t(h[0]?l:3==j?-0:0)}if(c=r(c),f=r(f),h=h.slice(),u=c-f){for((s=u<0)?(u=-u,a=h):(f=c,a=d),a.reverse(),n=u;n--;a.push(0));a.reverse()}else for(i=(s=(u=h.length)<(n=d.length))?u:n,u=n=0;n0)for(;n--;h[o++]=0);for(n=b-1;i>u;){if(h[--i]0?(l=s,o=c):(a=-a,o=u),o.reverse();a--;o.push(0));o.reverse()}for((a=u.length)-(n=c.length)<0&&(o=c,c=u,u=o,n=a),a=0;n;)a=(u[--n]=u[n]+c[n]+a)/b|0,u[n]=b===u[n]?0:u[n]%b;return a&&(u=[a].concat(u),++l),M(e,u,l)},H.precision=H.sd=function(e){var t,n,r=this,o=r.c;if(null!=e&&e!==!!e&&1!==e&&0!==e&&(Y&&N(13,"argument"+v,e),e!=!!e&&(e=null)),!o)return null;if(n=o.length-1,t=n*C+1,n=o[n]){for(;n%10==0;n/=10,t--);for(n=o[0];n>=10;n/=10,t++);}return e&&r.e+1>t&&(t=r.e+1),t},H.round=function(e,n){var r=new t(this);return(null==e||U(e,0,O,15))&&D(r,~~e+this.e+1,null!=n&&U(n,0,8,15,y)?0|n:j),r},H.shift=function(e){var n=this;return U(e,-S,S,16,"argument")?n.times("1e"+f(e)):new t(n.c&&n.c[0]&&(e<-S||e>S)?n.s*(e<0?0:1/0):n)},H.squareRoot=H.sqrt=function(){var e,n,i,a,s,l=this,u=l.c,c=l.s,f=l.e,h=I+4,d=new t("0.5");if(1!==c||!u||!u[0])return new t(!c||c<0&&(!u||u[0])?NaN:u?l:1/0);if(0==(c=Math.sqrt(+l))||c==1/0?(((n=o(u)).length+f)%2==0&&(n+="0"),c=Math.sqrt(n),f=r((f+1)/2)-(f<0||f%2),i=new t(n=c==1/0?"1e"+f:(n=c.toExponential()).slice(0,n.indexOf("e")+1)+f)):i=new t(c+""),i.c[0])for((c=(f=i.e)+h)<3&&(c=0);;)if(s=i,i=d.times(s.plus(A(l,s,h,1))),o(s.c).slice(0,c)===(n=o(i.c)).slice(0,c)){if(i.e=0;){for(o=0,p=_[a]%m,g=_[a]/m|0,s=a+(l=c);s>a;)o=((f=p*(f=S[--l]%m)+(u=g*f+(h=S[l]/m|0)*p)%m*m+v[s]+o)/y|0)+(u/m|0)+g*h,v[s--]=f%y;v[s]=o}return o?++i:v.splice(0,1),M(e,v,i)},H.toDigits=function(e,n){var r=new t(this);return e=null!=e&&U(e,1,O,18,"precision")?0|e:null,n=null!=n&&U(n,0,8,18,y)?0|n:j,e?D(r,e,n):r},H.toExponential=function(e,t){return T(this,null!=e&&U(e,0,O,19)?1+~~e:null,t,19)},H.toFixed=function(e,t){return T(this,null!=e&&U(e,0,O,20)?~~e+this.e+1:null,t,20)},H.toFormat=function(e,t){var n=T(this,null!=e&&U(e,0,O,21)?~~e+this.e+1:null,t,21);if(this.c){var r,o=n.split("."),i=+K.groupSize,a=+K.secondaryGroupSize,s=K.groupSeparator,l=o[0],u=o[1],c=this.s<0,f=c?l.slice(1):l,h=f.length;if(a&&(r=i,i=a,a=r,h-=r),i>0&&h>0){for(r=h%i||i,l=f.substr(0,r);r0&&(l+=s+f.slice(r)),c&&(l="-"+l)}n=u?l+K.decimalSeparator+((a=+K.fractionGroupSize)?u.replace(new RegExp("\\d{"+a+"}\\B","g"),"$&"+K.fractionGroupSeparator):u):l}return n},H.toFraction=function(e){var n,r,i,a,s,l,u,c,f,h=Y,d=this,p=d.c,g=new t(x),v=r=new t(x),y=u=new t(x);if(null!=e&&(Y=!1,l=new t(e),Y=h,(h=l.isInt())&&!l.lt(x)||(Y&&N(22,"max denominator "+(h?"out of range":"not an integer"),e),e=!h&&l.c&&D(l,l.e+1,1).gte(x)?l:null)),!p)return d.toString();for(f=o(p),a=g.e=f.length-d.e-1,g.c[0]=_[(s=a%C)<0?C+s:s],e=!e||l.cmp(g)>0?a>0?g:v:l,s=V,V=1/0,l=new t(f),u.c[0]=0;c=A(l,g,0,1),1!=(i=r.plus(c.times(y))).cmp(e);)r=y,y=i,v=u.plus(c.times(i=v)),u=i,g=l.minus(c.times(i=g)),l=i;return i=A(e.minus(r),y,0,1),u=u.plus(i.times(v)),r=r.plus(i.times(y)),u.s=v.s=d.s,a*=2,n=A(v,y,a,j).minus(d).abs().cmp(A(u,r,a,j).minus(d).abs())<1?[v.toString(),y.toString()]:[u.toString(),r.toString()],V=s,n},H.toNumber=function(){return+this},H.toPower=H.pow=function(e,n){var r,o,i,a=g(e<0?-e:+e),s=this;if(null!=n&&(L=23,n=new t(n)),!U(e,-S,S,23,"exponent")&&(!isFinite(e)||a>S&&(e/=0)||parseFloat(e)!=e&&!(e=NaN))||0==e)return r=Math.pow(+s,e),new t(n?r%n:r);for(n?e>1&&s.gt(x)&&s.isInt()&&n.gt(x)&&n.isInt()?s=s.mod(n):(i=n,n=null):X&&(r=p(X/C+2)),o=new t(x);;){if(a%2){if(!(o=o.times(s)).c)break;r?o.c.length>r&&(o.c.length=r):n&&(o=o.mod(n))}if(!(a=g(a/2)))break;s=s.times(s),r?s.c&&s.c.length>r&&(s.c.length=r):n&&(s=s.mod(n))}return n?o:(e<0&&(o=x.div(o)),i?o.mod(i):r?D(o,X,j):o)},H.toPrecision=function(e,t){return T(this,null!=e&&U(e,1,O,24,"precision")?0|e:null,t,24)},H.toString=function(e){var t,n=this,r=n.s,i=n.e;return null===i?r?(t="Infinity",r<0&&(t="-"+t)):t="NaN":(t=o(n.c),t=null!=e&&U(e,2,64,25,"base")?h(c(t,i),0|e,10,r):i<=F||i>=W?u(t,i):c(t,i),r<0&&n.c[0]&&(t="-"+t)),t},H.truncated=H.trunc=function(){return D(new t(this),this.e+1,1)},H.valueOf=H.toJSON=function(){var e,t=this,n=t.e;return null===n?t.toString():(e=o(t.c),e=n<=F||n>=W?u(e,n):c(e,n),t.s<0?"-"+e:e)},H.isBigNumber=!0,null!=e&&t.config(e),t}function r(e){var t=0|e;return e>0||e===t?t:t-1}function o(e){for(var t,n,r=1,o=e.length,i=e[0]+"";ru^n?1:-1;for(s=(l=o.length)<(u=i.length)?l:u,a=0;ai[a]^n?1:-1;return l==u?0:l>u^n?1:-1}function a(e,t,n){return(e=f(e))>=t&&e<=n}function s(e){return"[object Array]"==Object.prototype.toString.call(e)}function l(e,t,n){for(var r,o,i=[0],a=0,s=e.length;an-1&&(null==i[r+1]&&(i[r+1]=0),i[r+1]+=i[r]/n|0,i[r]%=n)}return i.reverse()}function u(e,t){return(e.length>1?e.charAt(0)+"."+e.slice(1):e)+(t<0?"e":"e+")+t}function c(e,t){var n,r;if(t<0){for(r="0.";++t;r+="0");e=r+e}else if(n=e.length,++t>n){for(r="0",t-=n;--t;r+="0");e+=r}else t1&&void 0!==arguments[1]?arguments[1]:{},n=arguments[2];if("string"==typeof t&&(t=A.parseFormat(t)),!D.validateFormat(t))return"ERROR: invalid format";var r=t.prefix||"",i=t.postfix||"",a=o(e,t,n);return a=O(a,r),T(a,i)}function o(e,t,n){switch(t.output){case"currency":return t=k(t,N.currentCurrencyDefaultFormat()),d(e,t,N);case"percent":return t=k(t,N.currentPercentageDefaultFormat()),h(e,t,N,n);case"byte":return t=k(t,N.currentByteDefaultFormat()),u(e,t,N,n);case"time":return t=k(t,N.currentTimeDefaultFormat()),f(e);case"ordinal":return t=k(t,N.currentOrdinalDefaultFormat()),c(e,t,N);case"number":default:return R({instance:e,providedFormat:t,numbro:n})}}function i(e){var t=L.decimal;return l(e._value,t.suffixes,t.scale).suffix}function a(e){var t=L.binary;return l(e._value,t.suffixes,t.scale).suffix}function s(e){var t=L.general;return l(e._value,t.suffixes,t.scale).suffix}function l(e,t,n){var r=t[0],o=Math.abs(e);if(o>=n){for(var i=1;i=a&&o=Math.pow(10,12)&&!n||"trillion"===n?(l=r.trillion,t/=Math.pow(10,12)):u=Math.pow(10,9)&&!n||"billion"===n?(l=r.billion,t/=Math.pow(10,9)):u=Math.pow(10,6)&&!n||"million"===n?(l=r.million,t/=Math.pow(10,6)):(u=Math.pow(10,3)&&!n||"thousand"===n)&&(l=r.thousand,t/=Math.pow(10,3));var f=i?" ":"";if(l&&(l=f+l),s){ var h=t.toString().split(".")[0];c=Math.max(s-h.length,0)}return{value:t,abbreviation:l,mantissaPrecision:c}}function g(e){var t=e.value,n=e.characteristicPrecision,r=void 0===n?0:n,o=t.toExponential().split("e"),i=M(o,2),a=i[0],s=i[1],l=+a;return r?(1=0?"+"+s:s),{value:l,abbreviation:"e"+s}):{value:l,abbreviation:"e"+s}}function v(e){for(var t="",n=0;n0)n=u+f+v(a-f.length);else{var h=".";h=+u<0?"-0"+h:"0"+h;var d=(v(-a-1)+Math.abs(u)+f).substr(0,t);d.length0&&t>0&&(n+="."+v(t)),n}function m(e,t){return-1!==e.toString().indexOf("e")?y(e,t):(Math.round(+(e+"e+"+t))/Math.pow(10,t)).toFixed(t)}function w(e,t,n,r,o){if(-1===r)return e;var i=m(t,r),a=i.toString().split("."),s=M(a,2),l=s[0],u=s[1],c=void 0===u?"":u;if(c.match(/^0+$/)&&(n||o))return l;var f=c.match(/0+$/);return o&&f?l+"."+c.toString().slice(0,f.index):i.toString()}function b(e,t,n,r){var o=e,i=o.toString().split("."),a=M(i,2),s=a[0],l=a[1];if(s.match(/^-?0$/)&&n)return l?s.replace("0","")+"."+l:s.replace("0","");if(s.length0;o--)r===t&&(n.unshift(o),r=0),r++;return n}function S(e,t,n,r,o){var i=r.currentDelimiters(),a=i.thousands;o=o||i.decimal;var s=i.thousandsSize||3,l=e.toString(),u=l.split(".")[0],c=l.split(".")[1];return n&&(t<0&&(u=u.slice(1)),C(u.length,s).forEach(function(e,t){u=u.slice(0,e+t)+a+u.slice(e+t)}),t<0&&(u="-"+u)),c?u+o+c:u}function _(e,t){return e+t}function E(e,t,n){return 0===t?e:0==+e?e.replace("-",""):t>0?"+"+e:"sign"===n?e:"("+e.replace("-","")+")"}function O(e,t){return t+e}function T(e,t){return e+t}function R(e){var t=e.instance,n=e.providedFormat,r=e.state,o=void 0===r?N:r,i=e.decimalSeparator,a=e.defaults,s=void 0===a?o.currentDefaults():a,l=t._value;if(0===l&&o.hasZeroFormat())return o.getZeroFormat();if(!isFinite(l))return l.toString();var u=Object.assign({},H,s,n),c=u.totalLength,f=c?0:u.characteristic,h=u.optionalCharacteristic,d=u.forceAverage,v=!!c||!!d||u.average,y=c?-1:v&&void 0===n.mantissa?0:u.mantissa,m=!c&&(void 0===n.optionalMantissa?-1===y:u.optionalMantissa),C=u.trimMantissa,O=u.thousandSeparated,T=u.spaceSeparated,R=u.negative,k=u.forceSign,M=u.exponential,D="";if(v){var A=p({value:l,forceAverage:d,abbreviations:o.currentAbbreviations(),spaceSeparated:T,totalLength:c});l=A.value,D+=A.abbreviation,c&&(y=A.mantissaPrecision)}if(M){var P=g({value:l,characteristicPrecision:f});l=P.value,D=P.abbreviation+D}var L=w(l.toString(),l,m,y,C);return L=b(L,l,h,f),L=S(L,l,O,o,i),(v||M)&&(L=_(L,D)),(k||l<0)&&(L=E(L,l,R)),L}function k(e,t){if(!e)return t;var n=Object.keys(e);return 1===n.length&&"output"===n[0]?t:e}var M=function(){function e(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&s.return&&s.return()}finally{if(o)throw i}}return n}return function(t,n){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,n);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),N=e("./globalState"),D=e("./validating"),A=e("./parsing"),P=["B","KB","MB","GB","TB","PB","EB","ZB","YB"],L={general:{scale:1024,suffixes:P,marker:"bd"},binary:{scale:1024,suffixes:["B","KiB","MiB","GiB","TiB","PiB","EiB","ZiB","YiB"],marker:"b"},decimal:{scale:1e3,suffixes:P,marker:"d"}},H={totalLength:0,characteristic:0,forceAverage:!1,average:!1,mantissa:-1,optionalMantissa:!0,thousandSeparated:!1,spaceSeparated:!1,negative:"sign",forceSign:!1};t.exports=function(e){return{format:function(){for(var t=arguments.length,n=Array(t),o=0;o1&&void 0!==arguments[1]&&arguments[1];if(!a.validateLanguage(e))throw new Error("Invalid language data");c[e.languageTag]=e,t&&r(e.languageTag)},l.setLanguage=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:i.languageTag;if(!c[e]){var n=e.split("-")[0],o=Object.keys(c).find(function(e){return e.split("-")[0]===n});return c[o]?void r(o):void r(t)}r(e)},l.registerLanguage(i),u=i.languageTag,t.exports=l},{"./en-US":2,"./parsing":8,"./validating":10}],5:[function(e,t,n){"use strict";function r(t,n){t.forEach(function(t){var r=void 0;try{r=e("../languages/"+t)}catch(e){console.error('Unable to load "'+t+'". No matching language file found.')}r&&n.registerLanguage(r)})}t.exports=function(e){return{loadLanguagesInNode:function(t){return r(t,e)}}}},{}],6:[function(e,t,n){"use strict";function r(e,t,n){var r=new u(e._value),o=t;return n.isNumbro(t)&&(o=t._value),o=new u(o),e._value=r.add(o).toNumber(),e}function o(e,t,n){var r=new u(e._value),o=t;return n.isNumbro(t)&&(o=t._value),o=new u(o),e._value=r.minus(o).toNumber(),e}function i(e,t,n){var r=new u(e._value),o=t;return n.isNumbro(t)&&(o=t._value),o=new u(o),e._value=r.times(o).toNumber(),e}function a(e,t,n){var r=new u(e._value),o=t;return n.isNumbro(t)&&(o=t._value),o=new u(o),e._value=r.dividedBy(o).toNumber(),e}function s(e,t,n){var r=t;return n.isNumbro(t)&&(r=t._value),e._value=r,e}function l(e,t,n){var r=n(e._value);return o(r,t,n),Math.abs(r._value)}var u=e("bignumber.js");t.exports=function(e){return{add:function(t,n){return r(t,n,e)},subtract:function(t,n){return o(t,n,e)},multiply:function(t,n){return i(t,n,e)},divide:function(t,n){return a(t,n,e)},set:function(t,n){return s(t,n,e)},difference:function(t,n){return l(t,n,e)}}}},{"bignumber.js":1}],7:[function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e){var t=e;return i.isNumbro(e)?t=e._value:"string"==typeof e?t=i.unformat(e):isNaN(e)&&(t=NaN),t}function i(e){return new p(o(e))}var a=function(){function e(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:{};return f.format(this,e)}},{key:"formatCurrency",value:function(e){return"string"==typeof e&&(e=d.parseFormat(e)),e=f.formatOrDefault(e,s.currentCurrencyDefaultFormat()),e.output="currency",f.format(this,e)}},{key:"formatTime",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return e.output="time",f.format(this,e)}},{key:"binaryByteUnits",value:function(){return f.getBinaryByteUnit(this)}},{key:"decimalByteUnits",value:function(){return f.getDecimalByteUnit(this)}},{key:"byteUnits",value:function(){return f.getByteUnit(this)}},{key:"difference",value:function(e){return h.difference(this,e)}},{key:"add",value:function(e){return h.add(this,e)}},{key:"subtract",value:function(e){return h.subtract(this,e)}},{key:"multiply",value:function(e){return h.multiply(this,e)}},{key:"divide",value:function(e){return h.divide(this,e)}},{key:"set",value:function(e){return h.set(this,o(e))}},{key:"value",value:function(){return this._value}},{key:"valueOf",value:function(){return this._value}}]),e}();i.version="2.1.1",i.isNumbro=function(e){return e instanceof p},i.language=s.currentLanguage,i.registerLanguage=s.registerLanguage,i.setLanguage=s.setLanguage,i.languages=s.languages,i.languageData=s.languageData,i.zeroFormat=s.setZeroFormat,i.defaultFormat=s.currentDefaults,i.setDefaults=s.setDefaults,i.defaultCurrencyFormat=s.currentCurrencyDefaultFormat,i.validate=l.validate,i.loadLanguagesInNode=u.loadLanguagesInNode,i.unformat=c.unformat,t.exports=i},{"./formatting":3,"./globalState":4,"./loading":5,"./manipulating":6,"./parsing":8,"./unformatting":9,"./validating":10}],8:[function(e,t,n){"use strict";function r(e,t){var n=e.match(/^{([^}]*)}/);return n?(t.prefix=n[1],e.slice(n[0].length)):e}function o(e,t){var n=e.match(/{([^}]*)}$/);return n?(t.postfix=n[1],e.slice(0,-n[0].length)):e}function i(e,t){if(-1===e.indexOf("$")){if(-1===e.indexOf("%"))return-1!==e.indexOf("bd")?(t.output="byte",void(t.base="general")):-1!==e.indexOf("b")?(t.output="byte",void(t.base="binary")):-1!==e.indexOf("d")?(t.output="byte",void(t.base="decimal")):void(-1===e.indexOf(":")?-1!==e.indexOf("o")&&(t.output="ordinal"):t.output="time");t.output="percent"}else t.output="currency"}function a(e,t){-1!==e.indexOf(",")&&(t.thousandSeparated=!0)}function s(e,t){-1!==e.indexOf(" ")&&(t.spaceSeparated=!0)}function l(e,t){var n=e.match(/[1-9]+[0-9]*/);n&&(t.totalLength=+n[0])}function u(e,t){var n=e.split(".")[0].match(/0+/);n&&(t.characteristic=n[0].length)}function c(e,t){var n=e.split(".")[1];if(n){var r=n.match(/0+/);r&&(t.mantissa=r[0].length)}}function f(e,t){-1!==e.indexOf("a")&&(t.average=!0)}function h(e,t){-1!==e.indexOf("K")?t.forceAverage="thousand":-1!==e.indexOf("M")?t.forceAverage="million":-1!==e.indexOf("B")?t.forceAverage="billion":-1!==e.indexOf("T")&&(t.forceAverage="trillion")}function d(e,t){e.match(/\[\.]/)?t.optionalMantissa=!0:e.match(/\./)&&(t.optionalMantissa=!1)}function p(e,t){if(-1!==e.indexOf(".")){var n=e.split(".")[0];t.optionalCharacteristic=-1===n.indexOf("0")}}function g(e,t){e.match(/^\+?\([^)]*\)$/)&&(t.negative="parenthesis"),e.match(/^\+?-/)&&(t.negative="sign")}function v(e,t){e.match(/^\+/)&&(t.forceSign=!0)}t.exports={parseFormat:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return"string"!=typeof e?e:(e=r(e,t),e=o(e,t),i(e,t),l(e,t),u(e,t),p(e,t),f(e,t),h(e,t),c(e,t),d(e,t),a(e,t),s(e,t),g(e,t),v(e,t),t)}}},{}],9:[function(e,t,n){"use strict";function r(e){return e.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&")}function o(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",i=arguments[3],a=arguments[4],s=arguments[5],l=arguments[6];if(!isNaN(+e))return+e;var c="",f=e.replace(/(^[^(]*)\((.*)\)([^)]*$)/,"$1$2$3");if(f!==e)return-1*o(f,t,n,i,a,s,l);for(var h=0;h2&&void 0!==arguments[2]?arguments[2]:"",o=e.replace(n,"");return o=o.replace(new RegExp("([0-9])"+r(t.thousands)+"([0-9])","g"),"$1$2"),o.replace(t.decimal,".")}function a(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",r=arguments[3],a=arguments[4],s=arguments[5],l=arguments[6];if(""!==e)return isNaN(+e)?e===a?0:o(i(e,t,n),t,n,r,a,s,l):+e}function s(e,t){if(!e.indexOf(":")||":"===t.thousands)return!1;var n=e.split(":");if(3!==n.length)return!1;var r=+n[0],o=+n[1],i=+n[2];return!isNaN(r)&&!isNaN(o)&&!isNaN(i)}function l(e){var t=e.split(":"),n=+t[0],r=+t[1];return+t[2]+60*r+3600*n}var u=[{key:"ZiB",factor:Math.pow(1024,7)},{key:"ZB",factor:Math.pow(1e3,7)},{key:"YiB",factor:Math.pow(1024,8)},{key:"YB",factor:Math.pow(1e3,8)},{key:"TiB",factor:Math.pow(1024,4)},{key:"TB",factor:Math.pow(1e3,4)},{key:"PiB",factor:Math.pow(1024,5)},{key:"PB",factor:Math.pow(1e3,5)},{key:"MiB",factor:Math.pow(1024,2)},{key:"MB",factor:Math.pow(1e3,2)},{key:"KiB",factor:Math.pow(1024,1)},{key:"KB",factor:Math.pow(1e3,1)},{key:"GiB",factor:Math.pow(1024,3)},{key:"GB",factor:Math.pow(1e3,3)},{key:"EiB",factor:Math.pow(1024,6)},{key:"EB",factor:Math.pow(1e3,6)},{key:"B",factor:1}];t.exports={unformat:function(t,n){var r=e("./globalState"),o=r.currentDelimiters(),i=r.currentCurrency().symbol,u=r.currentOrdinal(),c=r.getZeroFormat(),f=r.currentAbbreviations(),h=void 0;if("string"==typeof t)h=s(t,o)?l(t):a(t,o,i,u,c,f,n);else{if("number"!=typeof t)return;h=t}if(void 0!==h)return h}}},{"./globalState":4}],10:[function(e,t,n){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t3&&void 0!==arguments[3]&&arguments[3],a=Object.keys(e).map(function(r){if(!t[r])return console.error(n+" Invalid key: "+r),!1;var o=e[r],a=t[r];if("string"==typeof a&&(a={type:a}),"format"===a.type){if(!i(o,c,"[Validate "+r+"]",!0))return!1}else if((void 0===o?"undefined":s(o))!==a.type)return console.error(n+" "+r+' type mismatched: "'+a.type+'" expected, "'+(void 0===o?"undefined":s(o))+'" provided'),!1;if(a.restrictions&&a.restrictions.length)for(var l=a.restrictions.length,u=0;u=0},message:"value must be positive"},prefix:"string",postfix:"string",forceAverage:{type:"string",validValues:["trillion","billion","million","thousand"]},average:"boolean",currencyPosition:{type:"string",validValues:["prefix","infix","postfix"]},currencySymbol:"string",totalLength:{type:"number",restrictions:[{restriction:function(e){return e>=0},message:"value must be positive"},{restriction:function(e,t){return!t.exponential},message:"`totalLength` is incompatible with `exponential`"}]},mantissa:{type:"number",restriction:function(e){return e>=0},message:"value must be positive"},optionalMantissa:"boolean",trimMantissa:"boolean",optionalCharacteristic:"boolean",thousandSeparated:"boolean",spaceSeparated:"boolean",abbreviations:{type:"object",children:{thousand:"string",million:"string",billion:"string",trillion:"string"}},negative:{type:"string",validValues:["sign","parenthesis"]},forceSign:"boolean",exponential:{type:"boolean"},prefixSymbol:{type:"boolean",restriction:function(e,t){return"percent"===t.output},message:"`prefixSymbol` can be provided only when the output is `percent`"}},f={languageTag:{type:"string",mandatory:!0,restriction:function(e){return e.match(u)},message:"the language tag must follow the BCP 47 specification (see https://tools.ieft.org/html/bcp47)"},delimiters:{type:"object",children:{thousands:"string",decimal:"string",thousandsSize:"number"},mandatory:!0},abbreviations:{type:"object",children:{thousand:{type:"string",mandatory:!0},million:{type:"string",mandatory:!0},billion:{type:"string",mandatory:!0},trillion:{type:"string",mandatory:!0}},mandatory:!0},spaceSeparated:"boolean",ordinal:{type:"function",mandatory:!0},currency:{type:"object",children:{symbol:"string",position:"string",code:"string"},mandatory:!0},defaults:"format",ordinalFormat:"format",byteFormat:"format",percentageFormat:"format",currencyFormat:"format",timeDefaults:"format",formats:{type:"object",children:{fourDigits:{type:"format",mandatory:!0},fullWithTwoDecimals:{type:"format",mandatory:!0},fullWithTwoDecimalsNoCurrency:{type:"format",mandatory:!0},fullWithNoDecimals:{type:"format",mandatory:!0}}}};t.exports={validate:function(e,t){var n=o(e),r=a(t);return n&&r},validateFormat:a,validateInput:o,validateLanguage:function(e){return i(e,f,"[Validate language]")}}},{"./unformatting":9}]},{},[7])(7)},e.exports=o(),window.numbro=n(420)},function(e,t,n){"use strict";function r(e){var t=new Date(e);return isNaN(new Date("".concat(e,"T00:00")).getDate())?t:new Date(t.getTime()+6e4*t.getTimezoneOffset())}t.__esModule=!0,t.getNormalizedDate=r},function(e,t,n){"use strict";(function(e){function n(e){return e.split('"').length-1}var r={parse:function(e){var t,r,o,i,a,s,l,u=[],c=0;for(o=e.replace(/\r\n|\r/g,"\n").split("\n"),o.length>1&&""===o[o.length-1]&&o.pop(),t=0,r=o.length;t0&&(a+="\t"),i=e[t][r],"string"==typeof i?i.indexOf("\n")>-1?a+='"'+i.replace(/"/g,'""')+'"':a+=i:a+=null==i?"":i;t!==n-1&&(a+="\n")}return a}};t.parse=r.parse,t.stringify=r.stringify})(window)},function(e,t,n){"use strict";function r(e){var t=e.isShiftKey,n=e.isLeftClick,r=e.isRightClick,o=e.coords,i=e.selection,a=e.controller,l=i.isSelected()?i.getSelectedRange().current():null,u=i.isSelectedByCorner(),c=i.isSelectedByRowHeader();if(t&&l)o.row>=0&&o.col>=0&&!a.cells?i.setRangeEnd(o):(u||c)&&o.row>=0&&o.col>=0&&!a.cells?i.setRangeEnd(new s.CellCoords(o.row,o.col)):u&&o.row<0&&!a.column?i.setRangeEnd(new s.CellCoords(l.to.row,o.col)):c&&o.col<0&&!a.row?i.setRangeEnd(new s.CellCoords(o.row,l.to.col)):(!u&&!c&&o.col<0||u&&o.col<0)&&!a.row?i.selectRows(l.from.row,o.row):(!u&&!c&&o.row<0||c&&o.row<0)&&!a.column&&i.selectColumns(l.from.col,o.col);else{var f=new s.CellCoords(o.row,o.col);f.row<0&&(f.row=0),f.col<0&&(f.col=0);var h=!i.inInSelection(f),d=n||r&&h;o.row<0&&o.col>=0&&!a.column?d&&i.selectColumns(o.col):o.col<0&&o.row>=0&&!a.row?d&&i.selectRows(o.row):o.col>=0&&o.row>=0&&!a.cells?d&&i.setRangeStart(o):o.col<0&&o.row<0&&i.setRangeStart(o)}}function o(e){var t=e.isLeftClick,n=e.coords,r=e.selection,o=e.controller;if(t){var i=r.isSelectedByRowHeader(),a=r.isSelectedByColumnHeader(),l=r.tableProps.countCols(),u=r.tableProps.countRows();a&&!o.column?r.setRangeEnd(new s.CellCoords(u-1,n.col)):i&&!o.row?r.setRangeEnd(new s.CellCoords(n.row,l-1)):o.cell||r.setRangeEnd(n)}}function i(e,t){var n=t.coords,r=t.selection,o=t.controller;l.get(e.type)({coords:n,selection:r,controller:o,isShiftKey:e.shiftKey,isLeftClick:(0,a.isLeftClick)(e)||"touchstart"===e.type,isRightClick:(0,a.isRightClick)(e)})}t.__esModule=!0,t.mouseDown=r,t.mouseOver=o,t.handleMouseEvent=i;var a=n(18),s=n(8),l=new Map([["mousedown",r],["mouseover",o],["touchstart",r]])},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var n=0;n2&&void 0!==arguments[2]?arguments[2]:e,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:t,o=n,i=r;if(e>t){var a=[i,o];o=a[0],i=a[1]}return"".concat(o,"-").concat(i)}function s(e){var t=/^([a-zA-Z]{2})-([a-zA-Z]{2})$/,n=t.exec(e);return n?"".concat(n[1].toLowerCase(),"-").concat(n[2].toUpperCase()):e}function l(e,t){var n=s(t);(0,p.hasLanguageDictionary)(n)?e.language=n:(e.language=p.DEFAULT_LANGUAGE_CODE,u(t))}function u(e){(0,c.isDefined)(e)&&(0,h.error)((0,d.toSingleLine)(r(),e))}t.__esModule=!0,t.extendNotExistingKeys=i,t.createCellHeadersRange=a,t.normalizeLanguageCode=s,t.applyLanguageSetting=l,t.warnUserAboutLanguageRegistration=u;var c=n(14),f=n(2),h=n(76),d=n(58),p=n(90)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var o=r(n(430));t.Highlight=o.default;var i=r(n(660));t.Selection=i.default;var a=n(423);t.handleMouseEvent=a.handleMouseEvent;var s=n(91);t.detectSelectionType=s.detectSelectionType,t.normalizeSelectionFactory=s.normalizeSelectionFactory},function(e,t,n){"use strict";function r(e){return a(e)||i(e)||o()}function o(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function i(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}function a(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t0&&void 0!==arguments[0]?arguments[0]:0;return this.layerLevel=e,this}},{key:"getCell",value:function(){return this.cell}},{key:"getFill",value:function(){return this.fill}},{key:"createOrGetArea",value:function(){var e,t=this.layerLevel;return this.areas.has(t)?e=this.areas.get(t):(e=(0,h.createHighlight)(g,s({layerLevel:t},this.options)),this.areas.set(t,e)),e}},{key:"getAreas",value:function(){return r(this.areas.values())}},{key:"createOrGetHeader",value:function(){var e,t=this.layerLevel;return this.headers.has(t)?e=this.headers.get(t):(e=(0,h.createHighlight)(m,s({},this.options)),this.headers.set(t,e)),e}},{key:"getHeaders",value:function(){return r(this.headers.values())}},{key:"createOrGetActiveHeader",value:function(){var e,t=this.layerLevel;return this.activeHeaders.has(t)?e=this.activeHeaders.get(t):(e=(0,h.createHighlight)(p,s({},this.options)),this.activeHeaders.set(t,e)),e}},{key:"getActiveHeaders",value:function(){return r(this.activeHeaders.values())}},{key:"getCustomSelections",value:function(){return r(this.customSelections.values())}},{key:"addCustomSelection",value:function(e){this.customSelections.push((0,h.createHighlight)(w,s({},e)))}},{key:"clear",value:function(){this.cell.clear(),this.fill.clear(),(0,d.arrayEach)(this.areas.values(),function(e){ e.clear()}),(0,d.arrayEach)(this.headers.values(),function(e){e.clear()}),(0,d.arrayEach)(this.activeHeaders.values(),function(e){e.clear()})}},{key:Symbol.iterator,value:function(){return[this.cell,this.fill].concat(r(this.areas.values()),r(this.headers.values()),r(this.activeHeaders.values()),r(this.customSelections))[Symbol.iterator]()}}]),e}(),C=b;t.default=C},function(e,t,n){"use strict";function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var n=0;n0;l=(0,s.isObject)(h)?Object.keys(h).length:Array.isArray(h)?h.length:(0,u.stringify)(h).length,p&&(l+=d),i.has(l)||i.set(l,{needed:o.getSampleCount(),strings:[]});var g=i.get(l);if(g.needed){var v=c.indexOf(h)>-1;(!v||o.allowDuplicates||p)&&(g.strings.push(r({value:h},a,t)),c.push(h),g.needed-=1)}}),i}}]),e}(),f=c;t.default=f},function(e,t,n){"use strict";function r(e){if((0,u.isUndefined)(e))return!1;var t=e.column,n=e.sortOrder;return Number.isInteger(t)&&[h,d].includes(n)}function o(e){if(!1===Array.isArray(e)||!1===e.every(function(e){return(0,c.isObject)(e)}))return!1;var t=e.map(function(e){var t=e.column;return t}),n=new Set(t).size===t.length;return n&&e.every(r)}function i(e){if(e!==d)return e===h?d:h}function a(e){var t=e.querySelector(".".concat(p));return t}function s(e,t){if(e<0||!t.parentNode)return!1;var n=t.parentNode.parentNode.childNodes,r=Array.from(n).indexOf(t.parentNode)-n.length;return-1===r}function l(e,t,n){return-1===e&&t>=0&&!1===(0,f.isRightClick)(n)}t.__esModule=!0,t.areValidSortStates=o,t.getNextSortOrder=i,t.getHeaderSpanElement=a,t.isFirstLevelColumnHeader=s,t.wasHeaderClickedProperly=l,t.HEADER_SPAN_CLASS=t.DESC_SORT_STATE=t.ASC_SORT_STATE=void 0;var u=n(14),c=n(2),f=n(18),h="asc";t.ASC_SORT_STATE=h;var d="desc";t.DESC_SORT_STATE=d;var p="colHeader";t.HEADER_SPAN_CLASS=p},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return h(e)?f(e):f(i.COLUMN_DATA_TYPE)}t.__esModule=!0,t.getCompareFunctionFactory=o,t.getRootComparator=t.registerRootComparator=void 0;var i=n(676),a=n(677),s=n(678),l=r(n(46)),u=(0,l.default)("sorting.compareFunctionFactory"),c=u.register,f=u.getItem,h=u.hasItem,d=(0,l.default)("sorting.mainSortComparator"),p=d.register,g=d.getItem;t.getRootComparator=g,t.registerRootComparator=p,c(a.COLUMN_DATA_TYPE,a.compareFunctionFactory),c(s.COLUMN_DATA_TYPE,s.compareFunctionFactory),c(i.COLUMN_DATA_TYPE,i.compareFunctionFactory)},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var n=0;n=l}},{key:"setPosition",value:function(e,t){(0,a.isNumeric)(e)&&(this._element.style.top=e+c),(0,a.isNumeric)(t)&&(this._element.style.left=t+c)}},{key:"getPosition",value:function(){return{top:this._element.style.top?parseInt(this._element.style.top,10):0,left:this._element.style.left?parseInt(this._element.style.left,10):0}}},{key:"setSize",value:function(e,t){(0,a.isNumeric)(e)&&(this._element.style.width=e+c),(0,a.isNumeric)(t)&&(this._element.style.height=t+c)}},{key:"getSize",value:function(){return{width:this._element.style.width?parseInt(this._element.style.width,10):0,height:this._element.style.height?parseInt(this._element.style.height,10):0}}},{key:"setOffset",value:function(e,t){(0,a.isNumeric)(e)&&(this._element.style.marginTop=e+c),(0,a.isNumeric)(t)&&(this._element.style.marginLeft=t+c)}},{key:"getOffset",value:function(){return{top:this._element.style.marginTop?parseInt(this._element.style.marginTop,10):0,left:this._element.style.marginLeft?parseInt(this._element.style.marginLeft,10):0}}}]),e}(),h=f;t.default=h},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var n=0;n=s}},{key:"setPosition",value:function(e,t){void 0!==e&&(this._element.style.top=e+u),void 0!==t&&(this._element.style.left=t+u)}},{key:"getPosition",value:function(){return{top:this._element.style.top?parseInt(this._element.style.top,10):0,left:this._element.style.left?parseInt(this._element.style.left,10):0}}},{key:"setSize",value:function(e,t){e&&(this._element.style.width=e+u),t&&(this._element.style.height=t+u)}},{key:"getSize",value:function(){return{width:this._element.style.width?parseInt(this._element.style.width,10):0,height:this._element.style.height?parseInt(this._element.style.height,10):0}}},{key:"setOffset",value:function(e,t){e&&(this._element.style.marginTop=e+u),t&&(this._element.style.marginLeft=t+u)}},{key:"getOffset",value:function(){return{top:this._element.style.marginTop?parseInt(this._element.style.marginTop,10):0,left:this._element.style.marginLeft?parseInt(this._element.style.marginLeft,10):0}}}]),e}(),f=c;t.default=f},function(e,t,n){"use strict";function r(e,t,n,r){t?t.row===n&&t.col===r?(e.setAttribute("rowspan",t.rowspan.toString()),e.setAttribute("colspan",t.colspan.toString())):(e.removeAttribute("rowspan"),e.removeAttribute("colspan"),e.style.display="none"):(e.removeAttribute("rowspan"),e.removeAttribute("colspan"),e.style.display="")}t.__esModule=!0,t.applySpanProperties=r},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(e){return e&&e.__esModule?e:{default:e}}function i(e,t){var n=new c.default(e,t||{},A.rootInstanceSymbol);return n.init(),n}t.__esModule=!0,t.default=void 0,n(129),n(602),n(603),n(604);var a=n(26),s=n(19),l=n(49),u=n(119),c=o(n(120)),f=o(n(663)),h=r(n(10)),d=o(n(22)),p=o(n(124)),g=r(n(3)),v=r(n(42)),y=r(n(122)),m=r(n(421)),w=r(n(47)),b=r(n(59)),C=r(n(14)),S=r(n(9)),_=r(n(2)),E=r(n(121)),O=r(n(48)),T=r(n(32)),R=r(n(1)),k=r(n(18)),M=r(n(664)),N=n(13),D=o(n(426)),A=n(425),P=n(427),L=r(n(11)),H=n(90);(0,f.default)(i),i.Core=c.default,i.DefaultSettings=D.default,i.EventManager=h.default,i._getListenersCounter=h.getListenersCounter,i.buildDate="18/12/2018 14:40:17",i.packageName="handsontable",i.version="6.2.2";var x="";x&&(i.baseVersion=x),i.hooks=d.default.getSingleton(),i.__GhostTable=p.default;var I=[g,v,y,m,w,b,C,S,_,E,O,T],j=[R,k];i.helper={},i.dom={},g.arrayEach(I,function(e){g.arrayEach(Object.getOwnPropertyNames(e),function(t){"_"!==t.charAt(0)&&(i.helper[t]=e[t])})}),g.arrayEach(j,function(e){g.arrayEach(Object.getOwnPropertyNames(e),function(t){"_"!==t.charAt(0)&&(i.dom[t]=e[t])})}),i.cellTypes={},g.arrayEach((0,u.getRegisteredCellTypeNames)(),function(e){i.cellTypes[e]=(0,u.getCellType)(e)}),i.cellTypes.registerCellType=u.registerCellType,i.cellTypes.getCellType=u.getCellType,i.editors={},g.arrayEach((0,a.getRegisteredEditorNames)(),function(e){i.editors["".concat(O.toUpperCaseFirst(e),"Editor")]=(0,a.getEditor)(e)}),i.editors.registerEditor=a.registerEditor,i.editors.getEditor=a.getEditor,i.renderers={},g.arrayEach((0,s.getRegisteredRendererNames)(),function(e){var t=(0,s.getRenderer)(e);"base"===e&&(i.renderers.cellDecorator=t),i.renderers["".concat(O.toUpperCaseFirst(e),"Renderer")]=t}),i.renderers.registerRenderer=s.registerRenderer,i.renderers.getRenderer=s.getRenderer,i.validators={},g.arrayEach((0,l.getRegisteredValidatorNames)(),function(e){i.validators["".concat(O.toUpperCaseFirst(e),"Validator")]=(0,l.getValidator)(e)}),i.validators.registerValidator=l.registerValidator,i.validators.getValidator=l.getValidator,i.plugins={},g.arrayEach(Object.getOwnPropertyNames(M),function(e){var t=M[e];"Base"===e?i.plugins["".concat(e,"Plugin")]=t:i.plugins[e]=t}),i.plugins.registerPlugin=N.registerPlugin,i.languages={},i.languages.dictionaryKeys=L,i.languages.getLanguageDictionary=H.getLanguageDictionary,i.languages.getLanguagesDictionaries=H.getLanguagesDictionaries,i.languages.registerLanguageDictionary=H.registerLanguageDictionary,i.languages.getTranslatedPhrase=function(){return P.getTranslatedPhrase.apply(void 0,arguments)};var F=i;t.default=F},function(e,t,n){n(439),n(441),n(442),n(443),n(444),n(445),n(446),n(447),n(448),n(449),n(450),n(451),n(452),n(453),n(454),n(455),n(456),n(457),n(458),n(459),n(460),n(461),n(462),n(463),n(464),n(465),n(466),n(467),n(468),n(469),n(470),n(471),n(472),n(473),n(474),n(475),n(476),n(477),n(478),n(479),n(480),n(481),n(482),n(484),n(485),n(486),n(487),n(488),n(489),n(490),n(491),n(492),n(493),n(494),n(495),n(496),n(497),n(498),n(499),n(500),n(501),n(502),n(503),n(504),n(505),n(506),n(507),n(508),n(509),n(510),n(511),n(512),n(513),n(514),n(515),n(516),n(517),n(519),n(520),n(522),n(523),n(524),n(525),n(526),n(527),n(528),n(531),n(532),n(533),n(534),n(535),n(536),n(537),n(538),n(539),n(540),n(541),n(542),n(543),n(114),n(544),n(149),n(545),n(150),n(546),n(547),n(548),n(549),n(151),n(552),n(553),n(554),n(555),n(556),n(557),n(558),n(559),n(560),n(561),n(562),n(563),n(564),n(565),n(566),n(567),n(568),n(569),n(570),n(571),n(572),n(573),n(574),n(575),n(576),n(577),n(578),n(579),n(580),e.exports=n(21)},function(e,t,n){"use strict";var r=n(6),o=n(27),i=n(20),a=n(0),s=n(23),l=n(45).KEY,u=n(4),c=n(93),f=n(60),h=n(51),d=n(12),p=n(94),g=n(131),v=n(440),y=n(97),m=n(5),w=n(7),b=n(29),C=n(44),S=n(50),_=n(55),E=n(134),O=n(34),T=n(17),R=n(53),k=O.f,M=T.f,N=E.f,D=r.Symbol,A=r.JSON,P=A&&A.stringify,L="prototype",H=d("_hidden"),x=d("toPrimitive"),I={}.propertyIsEnumerable,j=c("symbol-registry"),F=c("symbols"),W=c("op-symbols"),B=Object[L],V="function"==typeof D,Y=r.QObject,U=!Y||!Y[L]||!Y[L].findChild,z=i&&u(function(){return 7!=_(M({},"a",{get:function(){return M(this,"a",{value:7}).a}})).a})?function(e,t,n){var r=k(B,t);r&&delete B[t],M(e,t,n),r&&e!==B&&M(B,t,r)}:M,G=function(e){var t=F[e]=_(D[L]);return t._k=e,t},X=V&&"symbol"==typeof D.iterator?function(e){return"symbol"==typeof e}:function(e){return e instanceof D},K=function(e,t,n){return e===B&&K(W,t,n),m(e),t=C(t,!0),m(n),o(F,t)?(n.enumerable?(o(e,H)&&e[H][t]&&(e[H][t]=!1),n=_(n,{enumerable:S(0,!1)})):(o(e,H)||M(e,H,S(1,{})),e[H][t]=!0),z(e,t,n)):M(e,t,n)},q=function(e,t){m(e);for(var n,r=v(t=b(t)),o=0,i=r.length;i>o;)K(e,n=r[o++],t[n]);return e},Z=function(e,t){return void 0===t?_(e):q(_(e),t)},$=function(e){var t=I.call(this,e=C(e,!0));return!(this===B&&o(F,e)&&!o(W,e))&&(!(t||!o(this,e)||!o(F,e)||o(this,H)&&this[H][e])||t)},J=function(e,t){if(e=b(e),t=C(t,!0),e!==B||!o(F,t)||o(W,t)){var n=k(e,t);return!n||!o(F,t)||o(e,H)&&e[H][t]||(n.enumerable=!0),n}},Q=function(e){for(var t,n=N(b(e)),r=[],i=0;n.length>i;)o(F,t=n[i++])||t==H||t==l||r.push(t);return r},ee=function(e){for(var t,n=e===B,r=N(n?W:b(e)),i=[],a=0;r.length>a;)!o(F,t=r[a++])||n&&!o(B,t)||i.push(F[t]);return i};V||(D=function(){if(this instanceof D)throw TypeError("Symbol is not a constructor!");var e=h(arguments.length>0?arguments[0]:void 0),t=function(n){this===B&&t.call(W,n),o(this,H)&&o(this[H],e)&&(this[H][e]=!1),z(this,e,S(1,n))};return i&&U&&z(B,e,{configurable:!0,set:t}),G(e)},s(D[L],"toString",function(){return this._k}),O.f=J,T.f=K,n(56).f=E.f=Q,n(71).f=$,n(80).f=ee,i&&!n(52)&&s(B,"propertyIsEnumerable",$,!0),p.f=function(e){return G(d(e))}),a(a.G+a.W+a.F*!V,{Symbol:D});for(var te="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),ne=0;te.length>ne;)d(te[ne++]);for(var re=R(d.store),oe=0;re.length>oe;)g(re[oe++]);a(a.S+a.F*!V,"Symbol",{for:function(e){return o(j,e+="")?j[e]:j[e]=D(e)},keyFor:function(e){if(!X(e))throw TypeError(e+" is not a symbol!");for(var t in j)if(j[t]===e)return t},useSetter:function(){U=!0},useSimple:function(){U=!1}}),a(a.S+a.F*!V,"Object",{create:Z,defineProperty:K,defineProperties:q,getOwnPropertyDescriptor:J,getOwnPropertyNames:Q,getOwnPropertySymbols:ee}),A&&a(a.S+a.F*(!V||u(function(){var e=D();return"[null]"!=P([e])||"{}"!=P({a:e})||"{}"!=P(Object(e))})),"JSON",{stringify:function(e){for(var t,n,r=[e],o=1;arguments.length>o;)r.push(arguments[o++]);if(n=t=r[1],(w(t)||void 0!==e)&&!X(e))return y(t)||(t=function(e,t){if("function"==typeof n&&(t=n.call(this,e,t)),!X(t))return t}),r[1]=t,P.apply(A,r)}}),D[L][x]||n(28)(D[L],x,D[L].valueOf),f(D,"Symbol"),f(Math,"Math",!0),f(r.JSON,"JSON",!0)},function(e,t,n){var r=n(53),o=n(80),i=n(71);e.exports=function(e){var t=r(e),n=o.f;if(n)for(var a,s=n(e),l=i.f,u=0;s.length>u;)l.call(e,a=s[u++])&&t.push(a);return t}},function(e,t,n){var r=n(0);r(r.S,"Object",{create:n(55)})},function(e,t,n){var r=n(0);r(r.S+r.F*!n(20),"Object",{defineProperty:n(17).f})},function(e,t,n){var r=n(0);r(r.S+r.F*!n(20),"Object",{defineProperties:n(133)})},function(e,t,n){var r=n(29),o=n(34).f;n(35)("getOwnPropertyDescriptor",function(){return function(e,t){return o(r(e),t)}})},function(e,t,n){var r=n(24),o=n(57);n(35)("getPrototypeOf",function(){return function(e){return o(r(e))}})},function(e,t,n){var r=n(24),o=n(53);n(35)("keys",function(){return function(e){return o(r(e))}})},function(e,t,n){n(35)("getOwnPropertyNames",function(){return n(134).f})},function(e,t,n){var r=n(7),o=n(45).onFreeze;n(35)("freeze",function(e){return function(t){return e&&r(t)?e(o(t)):t}})},function(e,t,n){var r=n(7),o=n(45).onFreeze;n(35)("seal",function(e){return function(t){return e&&r(t)?e(o(t)):t}})},function(e,t,n){var r=n(7),o=n(45).onFreeze;n(35)("preventExtensions",function(e){return function(t){return e&&r(t)?e(o(t)):t}})},function(e,t,n){var r=n(7);n(35)("isFrozen",function(e){return function(t){return!r(t)||!!e&&e(t)}})},function(e,t,n){var r=n(7);n(35)("isSealed",function(e){return function(t){return!r(t)||!!e&&e(t)}})},function(e,t,n){var r=n(7);n(35)("isExtensible",function(e){return function(t){return!!r(t)&&(!e||e(t))}})},function(e,t,n){var r=n(0);r(r.S+r.F,"Object",{assign:n(135)})},function(e,t,n){var r=n(0);r(r.S,"Object",{is:n(136)})},function(e,t,n){var r=n(0);r(r.S,"Object",{setPrototypeOf:n(99).set})},function(e,t,n){"use strict";var r=n(72),o={};o[n(12)("toStringTag")]="z",o+""!="[object z]"&&n(23)(Object.prototype,"toString",function(){return"[object "+r(this)+"]"},!0)},function(e,t,n){var r=n(0);r(r.P,"Function",{bind:n(137)})},function(e,t,n){var r=n(17).f,o=Function.prototype,i=/^\s*function ([^ (]*)/,a="name";a in o||n(20)&&r(o,a,{configurable:!0,get:function(){try{return(""+this).match(i)[1]}catch(e){return""}}})},function(e,t,n){"use strict";var r=n(7),o=n(57),i=n(12)("hasInstance"),a=Function.prototype;i in a||n(17).f(a,i,{value:function(e){if("function"!=typeof this||!r(e))return!1;if(!r(this.prototype))return e instanceof this;for(;e=o(e);)if(this.prototype===e)return!0;return!1}})},function(e,t,n){var r=n(0),o=n(139);r(r.G+r.F*(parseInt!=o),{parseInt:o})},function(e,t,n){var r=n(0),o=n(140);r(r.G+r.F*(parseFloat!=o),{parseFloat:o})},function(e,t,n){"use strict";var r=n(6),o=n(27),i=n(39),a=n(101),s=n(44),l=n(4),u=n(56).f,c=n(34).f,f=n(17).f,h=n(81).trim,d="Number",p=r[d],g=p,v=p.prototype,y=i(n(55)(v))==d,m="trim"in String.prototype,w=function(e){var t=s(e,!1);if("string"==typeof t&&t.length>2){t=m?t.trim():h(t,3);var n,r,o,i=t.charCodeAt(0);if(43===i||45===i){if(n=t.charCodeAt(2),88===n||120===n)return NaN}else if(48===i){switch(t.charCodeAt(1)){case 66:case 98:r=2,o=49;break;case 79:case 111:r=8,o=55;break;default:return+t}for(var a,l=t.slice(2),u=0,c=l.length;uo)return NaN;return parseInt(l,r)}}return+t};if(!p(" 0o1")||!p("0b1")||p("+0x1")){p=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof p&&(y?l(function(){v.valueOf.call(n)}):i(n)!=d)?a(new g(w(t)),n,p):w(t)};for(var b,C=n(20)?u(g):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),S=0;C.length>S;S++)o(g,b=C[S])&&!o(p,b)&&f(p,b,c(g,b));p.prototype=v,v.constructor=p,n(23)(r,d,p)}},function(e,t,n){"use strict";var r=n(0),o=n(33),i=n(141),a=n(102),s=1..toFixed,l=Math.floor,u=[0,0,0,0,0,0],c="Number.toFixed: incorrect invocation!",f="0",h=function(e,t){for(var n=-1,r=t;++n<6;)r+=e*u[n],u[n]=r%1e7,r=l(r/1e7)},d=function(e){for(var t=6,n=0;--t>=0;)n+=u[t],u[t]=l(n/e),n=n%e*1e7},p=function(){for(var e=6,t="";--e>=0;)if(""!==t||0===e||0!==u[e]){var n=String(u[e]);t=""===t?n:t+a.call(f,7-n.length)+n}return t},g=function(e,t,n){return 0===t?n:t%2==1?g(e,t-1,n*e):g(e*e,t/2,n)},v=function(e){for(var t=0,n=e;n>=4096;)t+=12,n/=4096;for(;n>=2;)t+=1,n/=2;return t};r(r.P+r.F*(!!s&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!n(4)(function(){s.call({})})),"Number",{toFixed:function(e){var t,n,r,s,l=i(this,c),u=o(e),y="",m=f;if(u<0||u>20)throw RangeError(c);if(l!=l)return"NaN";if(l<=-1e21||l>=1e21)return String(l);if(l<0&&(y="-",l=-l),l>1e-21)if(t=v(l*g(2,69,1))-69,n=t<0?l*g(2,-t,1):l/g(2,t,1),n*=4503599627370496,t=52-t,t>0){for(h(0,n),r=u;r>=7;)h(1e7,0),r-=7;for(h(g(10,r,1),0),r=t-1;r>=23;)d(1<<23),r-=23;d(1<0?(s=m.length,m=y+(s<=u?"0."+a.call(f,u-s)+m:m.slice(0,s-u)+"."+m.slice(s-u))):m=y+m,m}})},function(e,t,n){"use strict";var r=n(0),o=n(4),i=n(141),a=1..toPrecision;r(r.P+r.F*(o(function(){return"1"!==a.call(1,void 0)})||!o(function(){a.call({})})),"Number",{toPrecision:function(e){var t=i(this,"Number#toPrecision: incorrect invocation!");return void 0===e?a.call(t):a.call(t,e)}})},function(e,t,n){var r=n(0);r(r.S,"Number",{EPSILON:Math.pow(2,-52)})},function(e,t,n){var r=n(0),o=n(6).isFinite;r(r.S,"Number",{isFinite:function(e){return"number"==typeof e&&o(e)}})},function(e,t,n){var r=n(0);r(r.S,"Number",{isInteger:n(142)})},function(e,t,n){var r=n(0);r(r.S,"Number",{isNaN:function(e){return e!=e}})},function(e,t,n){var r=n(0),o=n(142),i=Math.abs;r(r.S,"Number",{isSafeInteger:function(e){return o(e)&&i(e)<=9007199254740991}})},function(e,t,n){var r=n(0);r(r.S,"Number",{MAX_SAFE_INTEGER:9007199254740991})},function(e,t,n){var r=n(0);r(r.S,"Number",{MIN_SAFE_INTEGER:-9007199254740991})},function(e,t,n){var r=n(0),o=n(140);r(r.S+r.F*(Number.parseFloat!=o),"Number",{parseFloat:o})},function(e,t,n){var r=n(0),o=n(139);r(r.S+r.F*(Number.parseInt!=o),"Number",{parseInt:o})},function(e,t,n){var r=n(0),o=n(143),i=Math.sqrt,a=Math.acosh;r(r.S+r.F*!(a&&710==Math.floor(a(Number.MAX_VALUE))&&a(1/0)==1/0),"Math",{acosh:function(e){return(e=+e)<1?NaN:e>94906265.62425156?Math.log(e)+Math.LN2:o(e-1+i(e-1)*i(e+1))}})},function(e,t,n){function r(e){return isFinite(e=+e)&&0!=e?e<0?-r(-e):Math.log(e+Math.sqrt(e*e+1)):e}var o=n(0),i=Math.asinh;o(o.S+o.F*!(i&&1/i(0)>0),"Math",{asinh:r})},function(e,t,n){var r=n(0),o=Math.atanh;r(r.S+r.F*!(o&&1/o(-0)<0),"Math",{atanh:function(e){return 0==(e=+e)?e:Math.log((1+e)/(1-e))/2}})},function(e,t,n){var r=n(0),o=n(103);r(r.S,"Math",{cbrt:function(e){return o(e=+e)*Math.pow(Math.abs(e),1/3)}})},function(e,t,n){var r=n(0);r(r.S,"Math",{clz32:function(e){return(e>>>=0)?31-Math.floor(Math.log(e+.5)*Math.LOG2E):32}})},function(e,t,n){var r=n(0),o=Math.exp;r(r.S,"Math",{cosh:function(e){return(o(e=+e)+o(-e))/2}})},function(e,t,n){var r=n(0),o=n(104);r(r.S+r.F*(o!=Math.expm1),"Math",{expm1:o})},function(e,t,n){var r=n(0);r(r.S,"Math",{fround:n(483)})},function(e,t,n){var r=n(103),o=Math.pow,i=o(2,-52),a=o(2,-23),s=o(2,127)*(2-a),l=o(2,-126),u=function(e){return e+1/i-1/i};e.exports=Math.fround||function(e){var t,n,o=Math.abs(e),c=r(e);return os||n!=n?c*(1/0):c*n)}},function(e,t,n){var r=n(0),o=Math.abs;r(r.S,"Math",{hypot:function(e,t){for(var n,r,i=0,a=0,s=arguments.length,l=0;a0?(r=n/l,i+=r*r):i+=n;return l===1/0?1/0:l*Math.sqrt(i)}})},function(e,t,n){var r=n(0),o=Math.imul;r(r.S+r.F*n(4)(function(){return-5!=o(4294967295,5)||2!=o.length}),"Math",{imul:function(e,t){var n=65535,r=+e,o=+t,i=n&r,a=n&o;return 0|i*a+((n&r>>>16)*a+i*(n&o>>>16)<<16>>>0)}})},function(e,t,n){var r=n(0);r(r.S,"Math",{log10:function(e){return Math.log(e)*Math.LOG10E}})},function(e,t,n){var r=n(0);r(r.S,"Math",{log1p:n(143)})},function(e,t,n){var r=n(0);r(r.S,"Math",{log2:function(e){return Math.log(e)/Math.LN2}})},function(e,t,n){var r=n(0);r(r.S,"Math",{sign:n(103)})},function(e,t,n){var r=n(0),o=n(104),i=Math.exp;r(r.S+r.F*n(4)(function(){return-2e-17!=!Math.sinh(-2e-17)}),"Math",{sinh:function(e){return Math.abs(e=+e)<1?(o(e)-o(-e))/2:(i(e-1)-i(-e-1))*(Math.E/2)}})},function(e,t,n){var r=n(0),o=n(104),i=Math.exp;r(r.S,"Math",{tanh:function(e){var t=o(e=+e),n=o(-e);return t==1/0?1:n==1/0?-1:(t-n)/(i(e)+i(-e))}})},function(e,t,n){var r=n(0);r(r.S,"Math",{trunc:function(e){return(e>0?Math.floor:Math.ceil)(e)}})},function(e,t,n){var r=n(0),o=n(54),i=String.fromCharCode,a=String.fromCodePoint;r(r.S+r.F*(!!a&&1!=a.length),"String",{fromCodePoint:function(e){for(var t,n=[],r=arguments.length,a=0;r>a;){if(t=+arguments[a++],o(t,1114111)!==t)throw RangeError(t+" is not a valid code point");n.push(t<65536?i(t):i(55296+((t-=65536)>>10),t%1024+56320))}return n.join("")}})},function(e,t,n){var r=n(0),o=n(29),i=n(16);r(r.S,"String",{raw:function(e){for(var t=o(e.raw),n=i(t.length),r=arguments.length,a=[],s=0;n>s;)a.push(String(t[s++])),s=t.length?{value:void 0,done:!0}:(e=r(t,n),this._i+=e.length,{value:e,done:!1})})},function(e,t,n){"use strict";var r=n(0),o=n(105)(!1);r(r.P,"String",{codePointAt:function(e){return o(this,e)}})},function(e,t,n){"use strict";var r=n(0),o=n(16),i=n(107),a="endsWith",s=""[a];r(r.P+r.F*n(109)(a),"String",{endsWith:function(e){var t=i(this,e,a),n=arguments.length>1?arguments[1]:void 0,r=o(t.length),l=void 0===n?r:Math.min(o(n),r),u=String(e);return s?s.call(t,u,l):t.slice(l-u.length,l)===u}})},function(e,t,n){"use strict";var r=n(0),o=n(107),i="includes";r(r.P+r.F*n(109)(i),"String",{includes:function(e){return!!~o(this,e,i).indexOf(e,arguments.length>1?arguments[1]:void 0)}})},function(e,t,n){var r=n(0);r(r.P,"String",{repeat:n(102)})},function(e,t,n){"use strict";var r=n(0),o=n(16),i=n(107),a="startsWith",s=""[a];r(r.P+r.F*n(109)(a),"String",{startsWith:function(e){var t=i(this,e,a),n=o(Math.min(arguments.length>1?arguments[1]:void 0,t.length)),r=String(e);return s?s.call(t,r,n):t.slice(n,n+r.length)===r}})},function(e,t,n){"use strict";n(25)("anchor",function(e){return function(t){return e(this,"a","name",t)}})},function(e,t,n){"use strict";n(25)("big",function(e){return function(){return e(this,"big","","")}})},function(e,t,n){"use strict";n(25)("blink",function(e){return function(){return e(this,"blink","","")}})},function(e,t,n){"use strict";n(25)("bold",function(e){return function(){return e(this,"b","","")}})},function(e,t,n){"use strict";n(25)("fixed",function(e){return function(){return e(this,"tt","","")}})},function(e,t,n){"use strict";n(25)("fontcolor",function(e){return function(t){return e(this,"font","color",t)}})},function(e,t,n){"use strict";n(25)("fontsize",function(e){return function(t){return e(this,"font","size",t)}})},function(e,t,n){"use strict";n(25)("italics",function(e){return function(){return e(this,"i","","")}})},function(e,t,n){"use strict";n(25)("link",function(e){return function(t){return e(this,"a","href",t)}})},function(e,t,n){"use strict";n(25)("small",function(e){return function(){return e(this,"small","","")}})},function(e,t,n){"use strict";n(25)("strike",function(e){return function(){return e(this,"strike","","")}})},function(e,t,n){"use strict";n(25)("sub",function(e){return function(){return e(this,"sub","","")}})},function(e,t,n){"use strict";n(25)("sup",function(e){return function(){return e(this,"sup","","")}})},function(e,t,n){var r=n(0);r(r.S,"Date",{now:function(){return(new Date).getTime()}})},function(e,t,n){"use strict";var r=n(0),o=n(24),i=n(44);r(r.P+r.F*n(4)(function(){return null!==new Date(NaN).toJSON()||1!==Date.prototype.toJSON.call({toISOString:function(){return 1}})}),"Date",{toJSON:function(e){var t=o(this),n=i(t);return"number"!=typeof n||isFinite(n)?t.toISOString():null}})},function(e,t,n){var r=n(0),o=n(518);r(r.P+r.F*(Date.prototype.toISOString!==o),"Date",{toISOString:o})},function(e,t,n){"use strict";var r=n(4),o=Date.prototype.getTime,i=Date.prototype.toISOString,a=function(e){return e>9?e:"0"+e};e.exports=r(function(){return"0385-07-25T07:06:39.999Z"!=i.call(new Date(-5e13-1))})||!r(function(){i.call(new Date(NaN))})?function(){if(!isFinite(o.call(this)))throw RangeError("Invalid time value");var e=this,t=e.getUTCFullYear(),n=e.getUTCMilliseconds(),r=t<0?"-":t>9999?"+":"";return r+("00000"+Math.abs(t)).slice(r?-6:-4)+"-"+a(e.getUTCMonth()+1)+"-"+a(e.getUTCDate())+"T"+a(e.getUTCHours())+":"+a(e.getUTCMinutes())+":"+a(e.getUTCSeconds())+"."+(n>99?n:"0"+a(n))+"Z"}:i},function(e,t,n){var r=Date.prototype,o="Invalid Date",i="toString",a=r[i],s=r.getTime;new Date(NaN)+""!=o&&n(23)(r,i,function(){var e=s.call(this);return e==e?a.call(this):o})},function(e,t,n){var r=n(12)("toPrimitive"),o=Date.prototype;r in o||n(28)(o,r,n(521))},function(e,t,n){"use strict";var r=n(5),o=n(44),i="number";e.exports=function(e){if("string"!==e&&e!==i&&"default"!==e)throw TypeError("Incorrect hint");return o(r(this),e!=i)}},function(e,t,n){var r=n(0);r(r.S,"Array",{isArray:n(97)})},function(e,t,n){"use strict";var r=n(37),o=n(0),i=n(24),a=n(145),s=n(110),l=n(16),u=n(111),c=n(112);o(o.S+o.F*!n(82)(function(e){Array.from(e)}),"Array",{from:function(e){var t,n,o,f,h=i(e),d="function"==typeof this?this:Array,p=arguments.length,g=p>1?arguments[1]:void 0,v=void 0!==g,y=0,m=c(h);if(v&&(g=r(g,p>2?arguments[2]:void 0,2)),null==m||d==Array&&s(m))for(t=l(h.length),n=new d(t);t>y;y++)u(n,y,v?g(h[y],y):h[y]);else for(f=m.call(h),n=new d;!(o=f.next()).done;y++)u(n,y,v?a(f,g,[o.value,y],!0):o.value);return n.length=y,n}})},function(e,t,n){"use strict";var r=n(0),o=n(111);r(r.S+r.F*n(4)(function(){function e(){}return!(Array.of.call(e)instanceof e)}),"Array",{of:function(){for(var e=0,t=arguments.length,n=new("function"==typeof this?this:Array)(t);t>e;)o(n,e,arguments[e++]);return n.length=t,n}})},function(e,t,n){"use strict";var r=n(0),o=n(29),i=[].join;r(r.P+r.F*(n(70)!=Object||!n(31)(i)),"Array",{join:function(e){return i.call(o(this),void 0===e?",":e)}})},function(e,t,n){"use strict";var r=n(0),o=n(98),i=n(39),a=n(54),s=n(16),l=[].slice;r(r.P+r.F*n(4)(function(){o&&l.call(o)}),"Array",{slice:function(e,t){var n=s(this.length),r=i(this);if(t=void 0===t?n:t,"Array"==r)return l.call(this,e,t);for(var o=a(e,n),u=a(t,n),c=s(u-o),f=new Array(c),h=0;h1&&(r=Math.min(r,i(arguments[1]))),r<0&&(r=n+r);r>=0;r--)if(r in t&&t[r]===e)return r||0;return-1}})},function(e,t,n){var r=n(0);r(r.P,"Array",{copyWithin:n(147)}),n(62)("copyWithin")},function(e,t,n){var r=n(0);r(r.P,"Array",{fill:n(113)}),n(62)("fill")},function(e,t,n){"use strict";var r=n(0),o=n(36)(5),i="find",a=!0;i in[]&&Array(1)[i](function(){a=!1}),r(r.P+r.F*a,"Array",{find:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),n(62)(i)},function(e,t,n){"use strict";var r=n(0),o=n(36)(6),i="findIndex",a=!0;i in[]&&Array(1)[i](function(){a=!1}),r(r.P+r.F*a,"Array",{findIndex:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),n(62)(i)},function(e,t,n){n(63)("Array")},function(e,t,n){var r=n(6),o=n(101),i=n(17).f,a=n(56).f,s=n(108),l=n(83),u=r.RegExp,c=u,f=u.prototype,h=/a/g,d=/a/g,p=new u(h)!==h;if(n(20)&&(!p||n(4)(function(){return d[n(12)("match")]=!1,u(h)!=h||u(d)==d||"/a/i"!=u(h,"i")}))){u=function(e,t){var n=this instanceof u,r=s(e),i=void 0===t;return!n&&r&&e.constructor===u&&i?e:o(p?new c(r&&!i?e.source:e,t):c((r=e instanceof u)?e.source:e,r&&i?l.call(e):t),n?this:f,u)};for(var g=function(e){e in u||i(u,e,{configurable:!0,get:function(){return c[e]},set:function(t){c[e]=t}})},v=a(c),y=0;v.length>y;)g(v[y++]);f.constructor=u,u.prototype=f,n(23)(r,"RegExp",u)}n(63)("RegExp")},function(e,t,n){"use strict";n(150);var r=n(5),o=n(83),i=n(20),a="toString",s=/./[a],l=function(e){n(23)(RegExp.prototype,a,e,!0)};n(4)(function(){return"/a/b"!=s.call({source:"a",flags:"b"})})?l(function(){var e=r(this);return"/".concat(e.source,"/","flags"in e?e.flags:!i&&e instanceof RegExp?o.call(e):void 0)}):s.name!=a&&l(function(){return s.call(this)})},function(e,t,n){"use strict";var r=n(5),o=n(16),i=n(116),a=n(84);n(85)("match",1,function(e,t,n,s){return[function(n){var r=e(this),o=null==n?void 0:n[t];return void 0!==o?o.call(n,r):new RegExp(n)[t](String(r))},function(e){var t=s(n,e,this);if(t.done)return t.value;var l=r(e),u=String(this);if(!l.global)return a(l,u);var c=l.unicode;l.lastIndex=0;for(var f,h=[],d=0;null!==(f=a(l,u));){var p=String(f[0]);h[d]=p,""===p&&(l.lastIndex=i(u,o(l.lastIndex),c)),d++}return 0===d?null:h}]})},function(e,t,n){"use strict";var r=n(5),o=n(24),i=n(16),a=n(33),s=n(116),l=n(84),u=Math.max,c=Math.min,f=Math.floor,h=/\$([$&`']|\d\d?|<[^>]*>)/g,d=/\$([$&`']|\d\d?)/g,p=function(e){return void 0===e?e:String(e)};n(85)("replace",2,function(e,t,n,g){function v(e,t,r,i,a,s){var l=r+e.length,u=i.length,c=d;return void 0!==a&&(a=o(a),c=h),n.call(s,c,function(n,o){var s;switch(o.charAt(0)){case"$":return"$";case"&":return e;case"`":return t.slice(0,r);case"'":return t.slice(l);case"<":s=a[o.slice(1,-1)];break;default:var c=+o;if(0===c)return o;if(c>u){var h=f(c/10);return 0===h?o:h<=u?void 0===i[h-1]?o.charAt(1):i[h-1]+o.charAt(1):o}s=i[c-1]}return void 0===s?"":s})}return[function(r,o){var i=e(this),a=null==r?void 0:r[t];return void 0!==a?a.call(r,i,o):n.call(String(i),r,o)},function(e,t){var o=g(n,e,this,t);if(o.done)return o.value;var f=r(e),h=String(this),d="function"==typeof t;d||(t=String(t));var y=f.global;if(y){var m=f.unicode;f.lastIndex=0}for(var w=[];;){var b=l(f,h);if(null===b)break;if(w.push(b),!y)break;var C=String(b[0]);""===C&&(f.lastIndex=s(h,i(f.lastIndex),m))}for(var S="",_=0,E=0;E=_&&(S+=h.slice(_,T)+D,_=T+O.length)}return S+h.slice(_)}]})},function(e,t,n){"use strict";var r=n(5),o=n(136),i=n(84);n(85)("search",1,function(e,t,n,a){return[function(n){var r=e(this),o=null==n?void 0:n[t];return void 0!==o?o.call(n,r):new RegExp(n)[t](String(r))},function(e){var t=a(n,e,this);if(t.done)return t.value;var s=r(e),l=String(this),u=s.lastIndex;o(u,0)||(s.lastIndex=0);var c=i(s,l);return o(s.lastIndex,u)||(s.lastIndex=u),null===c?-1:c.index}]})},function(e,t,n){"use strict";var r=n(108),o=n(5),i=n(73),a=n(116),s=n(16),l=n(84),u=n(115),c=Math.min,f=[].push,h="split",d="length",p="lastIndex",g=!!function(){try{return new RegExp("x","y")}catch(e){}}();n(85)("split",2,function(e,t,n,v){var y;return y="c"=="abbc"[h](/(b)*/)[1]||4!="test"[h](/(?:)/,-1)[d]||2!="ab"[h](/(?:ab)*/)[d]||4!="."[h](/(.?)(.?)/)[d]||"."[h](/()()/)[d]>1||""[h](/.?/)[d]?function(e,t){var o=String(this);if(void 0===e&&0===t)return[];if(!r(e))return n.call(o,e,t);for(var i,a,s,l=[],c=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),h=0,g=void 0===t?4294967295:t>>>0,v=new RegExp(e.source,c+"g");(i=u.call(v,o))&&(a=v[p],!(a>h&&(l.push(o.slice(h,i.index)),i[d]>1&&i.index=g)));)v[p]===i.index&&v[p]++;return h===o[d]?!s&&v.test("")||l.push(""):l.push(o.slice(h)),l[d]>g?l.slice(0,g):l}:"0"[h](void 0,0)[d]?function(e,t){return void 0===e&&0===t?[]:n.call(this,e,t)}:n,[function(n,r){var o=e(this),i=null==n?void 0:n[t];return void 0!==i?i.call(n,o,r):y.call(String(o),n,r)},function(e,t){var r=v(y,e,this,t,y!==n);if(r.done)return r.value;var u=o(e),f=String(this),h=i(u,RegExp),d=u.unicode,p=(u.ignoreCase?"i":"")+(u.multiline?"m":"")+(u.unicode?"u":"")+(g?"y":"g"),m=new h(g?u:"^(?:"+u.source+")",p),w=void 0===t?4294967295:t>>>0;if(0===w)return[];if(0===f.length)return null===l(m,f)?[f]:[];for(var b=0,C=0,S=[];C0?arguments[0]:void 0)}},{get:function(e){var t=r.getEntry(o(this,i),e);return t&&t.v},set:function(e,t){return r.def(o(this,i),0===e?0:e,t)}},r,!0)},function(e,t,n){"use strict";var r=n(154),o=n(66),i="Set";e.exports=n(88)(i,function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return r.def(o(this,i),e=0===e?0:e,e)}},r)},function(e,t,n){"use strict";var r,o=n(36)(0),i=n(23),a=n(45),s=n(135),l=n(155),u=n(7),c=n(4),f=n(66),h="WeakMap",d=a.getWeak,p=Object.isExtensible,g=l.ufstore,v={},y=function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},m={get:function(e){if(u(e)){var t=d(e);return!0===t?g(f(this,h)).get(e):t?t[this._i]:void 0}},set:function(e,t){return l.def(f(this,h),e,t)}},w=e.exports=n(88)(h,y,m,l,!0,!0);c(function(){return 7!=(new w).set((Object.freeze||Object)(v),7).get(v)})&&(r=l.getConstructor(y,h),s(r.prototype,m),a.NEED=!0,o(["delete","has","get","set"],function(e){var t=w.prototype,n=t[e];i(t,e,function(t,o){if(u(t)&&!p(t)){this._f||(this._f=new r);var i=this._f[e](t,o);return"set"==e?this:i}return n.call(this,t,o)})}))},function(e,t,n){"use strict";var r=n(155),o=n(66),i="WeakSet";n(88)(i,function(e){return function(){return e(this,arguments.length>0?arguments[0]:void 0)}},{add:function(e){return r.def(o(this,i),e,!0)}},r,!1,!0)},function(e,t,n){"use strict";var r=n(0),o=n(89),i=n(118),a=n(5),s=n(54),l=n(16),u=n(7),c=n(6).ArrayBuffer,f=n(73),h=i.ArrayBuffer,d=i.DataView,p=o.ABV&&c.isView,g=h.prototype.slice,v=o.VIEW,y="ArrayBuffer";r(r.G+r.W+r.F*(c!==h),{ArrayBuffer:h}),r(r.S+r.F*!o.CONSTR,y,{isView:function(e){return p&&p(e)||u(e)&&v in e}}),r(r.P+r.U+r.F*n(4)(function(){return!new h(2).slice(1,void 0).byteLength}),y,{slice:function(e,t){if(void 0!==g&&void 0===t)return g.call(a(this),e);for(var n=a(this).byteLength,r=s(e,n),o=s(void 0===t?n:t,n),i=new(f(this,h))(l(o-r)),u=new d(this),c=new d(i),p=0;r=n.length)return{value:void 0,done:!0}}while(!((e=n[t._i++])in t._t));return{value:e,done:!1}}),r(r.S,"Reflect",{enumerate:function(e){return new i(e)}})},function(e,t,n){function r(e,t){var n,s,c=arguments.length<3?e:arguments[2];return u(e)===c?e[t]:(n=o.f(e,t))?a(n,"value")?n.value:void 0!==n.get?n.get.call(c):void 0:l(s=i(e))?r(s,t,c):void 0}var o=n(34),i=n(57),a=n(27),s=n(0),l=n(7),u=n(5);s(s.S,"Reflect",{get:r})},function(e,t,n){var r=n(34),o=n(0),i=n(5);o(o.S,"Reflect",{getOwnPropertyDescriptor:function(e,t){return r.f(i(e),t)}})},function(e,t,n){var r=n(0),o=n(57),i=n(5);r(r.S,"Reflect",{getPrototypeOf:function(e){return o(i(e))}})},function(e,t,n){var r=n(0);r(r.S,"Reflect",{has:function(e,t){return t in e}})},function(e,t,n){var r=n(0),o=n(5),i=Object.isExtensible;r(r.S,"Reflect",{isExtensible:function(e){return o(e),!i||i(e)}})},function(e,t,n){var r=n(0);r(r.S,"Reflect",{ownKeys:n(157)})},function(e,t,n){var r=n(0),o=n(5),i=Object.preventExtensions;r(r.S,"Reflect",{preventExtensions:function(e){o(e);try{return i&&i(e),!0}catch(e){return!1}}})},function(e,t,n){function r(e,t,n){var l,h,d=arguments.length<4?e:arguments[3],p=i.f(c(e),t);if(!p){if(f(h=a(e)))return r(h,t,n,d);p=u(0)}if(s(p,"value")){if(!1===p.writable||!f(d))return!1;if(l=i.f(d,t)){if(l.get||l.set||!1===l.writable)return!1;l.value=n,o.f(d,t,l)}else o.f(d,t,u(0,n));return!0}return void 0!==p.set&&(p.set.call(d,n),!0)}var o=n(17),i=n(34),a=n(57),s=n(27),l=n(0),u=n(50),c=n(5),f=n(7);l(l.S,"Reflect",{set:r})},function(e,t,n){var r=n(0),o=n(99);o&&r(r.S,"Reflect",{setPrototypeOf:function(e,t){o.check(e,t);try{return o.set(e,t),!0}catch(e){return!1}}})},function(e,t,n){n(582),e.exports=n(21).Array.includes},function(e,t,n){"use strict";var r=n(0),o=n(79)(!0);r(r.P,"Array",{includes:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0)}}),n(62)("includes")},function(e,t,n){n(584),e.exports=n(21).String.padStart},function(e,t,n){"use strict";var r=n(0),o=n(158),i=n(87);r(r.P+r.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(i),"String",{padStart:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0,!0)}})},function(e,t,n){n(586),e.exports=n(21).String.padEnd},function(e,t,n){"use strict";var r=n(0),o=n(158),i=n(87);r(r.P+r.F*/Version\/10\.\d+(\.\d+)? Safari\//.test(i),"String",{padEnd:function(e){return o(this,e,arguments.length>1?arguments[1]:void 0,!1)}})},function(e,t,n){n(588),e.exports=n(94).f("asyncIterator")},function(e,t,n){n(131)("asyncIterator")},function(e,t,n){n(590),e.exports=n(21).Object.getOwnPropertyDescriptors},function(e,t,n){var r=n(0),o=n(157),i=n(29),a=n(34),s=n(111);r(r.S,"Object",{getOwnPropertyDescriptors:function(e){for(var t,n,r=i(e),l=a.f,u=o(r),c={},f=0;u.length>f;)n=l(r,t=u[f++]),void 0!==n&&s(c,t,n);return c}})},function(e,t,n){n(592),e.exports=n(21).Object.values},function(e,t,n){var r=n(0),o=n(159)(!1);r(r.S,"Object",{values:function(e){return o(e)}})},function(e,t,n){n(594),e.exports=n(21).Object.entries},function(e,t,n){var r=n(0),o=n(159)(!0);r(r.S,"Object",{entries:function(e){return o(e)}})},function(e,t,n){"use strict";n(151),n(596),e.exports=n(21).Promise.finally},function(e,t,n){"use strict";var r=n(0),o=n(21),i=n(6),a=n(73),s=n(153);r(r.P+r.R,"Promise",{finally:function(e){var t=a(this,o.Promise||i.Promise),n="function"==typeof e;return this.then(n?function(n){return s(t,e()).then(function(){return n})}:e,n?function(n){return s(t,e()).then(function(){throw n})}:e)}})},function(e,t,n){n(598),n(599),n(600),e.exports=n(21)},function(e,t,n){var r=n(6),o=n(0),i=n(87),a=[].slice,s=/MSIE .\./.test(i),l=function(e){return function(t,n){var r=arguments.length>2,o=!!r&&a.call(arguments,2);return e(r?function(){("function"==typeof t?t:Function(t)).apply(this,o)}:t,n)}};o(o.G+o.B+o.F*s,{setTimeout:l(r.setTimeout),setInterval:l(r.setInterval)})},function(e,t,n){var r=n(0),o=n(117);r(r.G+r.B,{setImmediate:o.set,clearImmediate:o.clear})},function(e,t,n){for(var r=n(114),o=n(53),i=n(23),a=n(6),s=n(28),l=n(61),u=n(12),c=u("iterator"),f=u("toStringTag"),h=l.Array,d={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},p=o(d),g=0;g=0;--r){var o=this.tryEntries[r],i=o.completion;if("root"===o.tryLoc)return t("end");if(o.tryLoc<=this.prev){var a=m.call(o,"catchLoc"),s=m.call(o,"finallyLoc");if(a&&s){if(this.prev=0;--n){var r=this.tryEntries[n];if(r.tryLoc<=this.prev&&m.call(r,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),h(n),M}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;h(n)}return o}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:p(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=v),M}}}}(function(){return this}()||Function("return this")())},function(e,t){},function(e,t){},function(e,t){},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){return!t||"object"!==o(t)&&"function"!=typeof t?s(e):t}function s(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function l(e){return l=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},l(e)}function u(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),t&&c(e,t)}function c(e,t){return c=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},c(e,t)}t.__esModule=!0,t.default=void 0;var f=n(1),h=r(n(43)),d=function(e){function t(e){var n;return i(this,t),n=a(this,l(t).call(this,e)),n.clone=n.makeClone(h.default.CLONE_DEBUG),n.clone.wtTable.holder.style.opacity=.4,n.clone.wtTable.holder.style.textShadow="0 0 2px #ff0000",(0,f.addClass)(n.clone.wtTable.holder.parentNode,"wtDebugVisible"),n}return u(t,e),t}(h.default);h.default.registerOverlay(h.default.CLONE_DEBUG,d);var p=d;t.default=p},function(e,t,n){function r(e){return n(o(e))}function o(e){var t=i[e];if(!(t+1))throw new Error("Cannot find module '"+e+"'.");return t}var i={"./af":167,"./af.js":167,"./ar":168,"./ar-dz":169,"./ar-dz.js":169,"./ar-kw":170,"./ar-kw.js":170,"./ar-ly":171,"./ar-ly.js":171,"./ar-ma":172,"./ar-ma.js":172,"./ar-sa":173,"./ar-sa.js":173,"./ar-tn":174,"./ar-tn.js":174,"./ar.js":168,"./az":175,"./az.js":175,"./be":176,"./be.js":176,"./bg":177,"./bg.js":177,"./bm":178,"./bm.js":178,"./bn":179,"./bn.js":179,"./bo":180,"./bo.js":180,"./br":181,"./br.js":181,"./bs":182,"./bs.js":182,"./ca":183,"./ca.js":183,"./cs":184,"./cs.js":184,"./cv":185,"./cv.js":185,"./cy":186,"./cy.js":186,"./da":187,"./da.js":187,"./de":188,"./de-at":189,"./de-at.js":189,"./de-ch":190,"./de-ch.js":190,"./de.js":188,"./dv":191,"./dv.js":191,"./el":192,"./el.js":192,"./en-au":193,"./en-au.js":193,"./en-ca":194,"./en-ca.js":194,"./en-gb":195,"./en-gb.js":195,"./en-ie":196,"./en-ie.js":196,"./en-nz":197,"./en-nz.js":197,"./eo":198,"./eo.js":198,"./es":199,"./es-do":200,"./es-do.js":200,"./es-us":201,"./es-us.js":201,"./es.js":199,"./et":202,"./et.js":202,"./eu":203,"./eu.js":203,"./fa":204,"./fa.js":204,"./fi":205,"./fi.js":205,"./fo":206,"./fo.js":206,"./fr":207,"./fr-ca":208,"./fr-ca.js":208,"./fr-ch":209,"./fr-ch.js":209,"./fr.js":207,"./fy":210,"./fy.js":210,"./gd":211,"./gd.js":211,"./gl":212,"./gl.js":212,"./gom-latn":213,"./gom-latn.js":213,"./gu":214,"./gu.js":214,"./he":215,"./he.js":215,"./hi":216,"./hi.js":216,"./hr":217,"./hr.js":217,"./hu":218,"./hu.js":218,"./hy-am":219,"./hy-am.js":219,"./id":220,"./id.js":220,"./is":221,"./is.js":221,"./it":222,"./it.js":222,"./ja":223,"./ja.js":223,"./jv":224,"./jv.js":224,"./ka":225,"./ka.js":225,"./kk":226,"./kk.js":226,"./km":227,"./km.js":227,"./kn":228,"./kn.js":228,"./ko":229,"./ko.js":229,"./ky":230,"./ky.js":230,"./lb":231,"./lb.js":231,"./lo":232,"./lo.js":232,"./lt":233,"./lt.js":233,"./lv":234,"./lv.js":234,"./me":235,"./me.js":235,"./mi":236,"./mi.js":236,"./mk":237,"./mk.js":237,"./ml":238,"./ml.js":238,"./mr":239,"./mr.js":239,"./ms":240,"./ms-my":241,"./ms-my.js":241,"./ms.js":240,"./mt":242,"./mt.js":242,"./my":243,"./my.js":243,"./nb":244,"./nb.js":244,"./ne":245,"./ne.js":245,"./nl":246,"./nl-be":247,"./nl-be.js":247,"./nl.js":246,"./nn":248,"./nn.js":248,"./pa-in":249,"./pa-in.js":249,"./pl":250,"./pl.js":250,"./pt":251,"./pt-br":252,"./pt-br.js":252,"./pt.js":251,"./ro":253,"./ro.js":253,"./ru":254,"./ru.js":254,"./sd":255,"./sd.js":255,"./se":256,"./se.js":256,"./si":257,"./si.js":257,"./sk":258,"./sk.js":258,"./sl":259,"./sl.js":259,"./sq":260,"./sq.js":260,"./sr":261,"./sr-cyrl":262,"./sr-cyrl.js":262,"./sr.js":261,"./ss":263,"./ss.js":263,"./sv":264,"./sv.js":264,"./sw":265,"./sw.js":265,"./ta":266,"./ta.js":266,"./te":267,"./te.js":267,"./tet":268,"./tet.js":268,"./th":269,"./th.js":269,"./tl-ph":270,"./tl-ph.js":270,"./tlh":271,"./tlh.js":271,"./tr":272,"./tr.js":272,"./tzl":273,"./tzl.js":273,"./tzm":274,"./tzm-latn":275,"./tzm-latn.js":275,"./tzm.js":274,"./uk":276,"./uk.js":276,"./ur":277,"./ur.js":277,"./uz":278,"./uz-latn":279,"./uz-latn.js":279,"./uz.js":278,"./vi":280,"./vi.js":280,"./x-pseudo":281,"./x-pseudo.js":281,"./yo":282,"./yo.js":282,"./zh-cn":283,"./zh-cn.js":283,"./zh-hk":284,"./zh-hk.js":284,"./zh-tw":285,"./zh-tw.js":285};r.keys=function(){return Object.keys(i)},r.resolve=o,e.exports=r,r.id=606},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var n=0;n0?-a:0,t=r,r+="px",(0,d.setOverlayPosition)(e,r,o)}this.adjustHeaderBordersPosition(t),this.adjustElementsSize()}}},{key:"setScrollPosition",value:function(e){var t=!1;return this.mainTableScrollableElement===window&&window.scrollX!==e?(window.scrollTo(e,(0,d.getWindowScrollTop)()),t=!0):this.mainTableScrollableElement.scrollLeft!==e&&(this.mainTableScrollableElement.scrollLeft=e,t=!0),t}},{key:"onScroll",value:function(){this.wot.getSetting("onScrollVertically")}},{key:"sumCellSizes",value:function(e,t){for(var n=this.wot.wtSettings.defaultColumnWidth,r=e,o=0;r0&&void 0!==arguments[0]&&arguments[0];this.updateTrimmingContainer(),(this.needFullRender||e)&&(this.adjustRootElementSize(),this.adjustRootChildrenSize(),e||(this.areElementSizesAdjusted=!0))}},{key:"adjustRootElementSize",value:function(){var e=this.wot.wtTable.holder,t=e.clientHeight===e.offsetHeight?0:(0,d.getScrollbarWidth)(),n=this.clone.wtTable.holder.parentNode,r=n.style,o=this.wot.getSetting("preventOverflow");if(this.trimmingContainer!==window||"vertical"===o){var i=this.wot.wtViewport.getWorkspaceHeight()-t;i=Math.min(i,(0,d.innerHeight)(this.wot.wtTable.wtRootElement)),r.height="".concat(i,"px")}else r.height="";this.clone.wtTable.holder.style.height=r.height;var a=(0,d.outerWidth)(this.clone.wtTable.TABLE);r.width="".concat(0===a?a:a+4,"px")}},{key:"adjustRootChildrenSize",value:function(){var e=(0,d.getScrollbarWidth)();this.clone.wtTable.hider.style.height=this.hider.style.height,this.clone.wtTable.holder.style.height=this.clone.wtTable.holder.parentNode.style.height,0===e&&(e=30),this.clone.wtTable.holder.style.width="".concat(parseInt(this.clone.wtTable.holder.parentNode.style.width,10)+e,"px")}},{key:"applyToDOM",value:function(){var e=this.wot.getSetting("totalColumns");if(this.areElementSizesAdjusted||this.adjustElementsSize(),"number"==typeof this.wot.wtViewport.columnsRenderCalculator.startPosition)this.spreader.style.left="".concat(this.wot.wtViewport.columnsRenderCalculator.startPosition,"px");else{if(0!==e)throw new Error("Incorrect value of the columnsRenderCalculator");this.spreader.style.left="0"}this.spreader.style.right="",this.needFullRender&&this.syncOverlayOffset()}},{key:"syncOverlayOffset",value:function(){"number"==typeof this.wot.wtViewport.rowsRenderCalculator.startPosition?this.clone.wtTable.spreader.style.top="".concat(this.wot.wtViewport.rowsRenderCalculator.startPosition,"px"):this.clone.wtTable.spreader.style.top=""}},{key:"scrollTo",value:function(e,t){var n=this.getTableParentOffset(),r=this.wot.cloneSource?this.wot.cloneSource:this.wot,o=r.wtTable.holder,i=0;return t&&o.offsetWidth!==o.clientWidth&&(i=(0,d.getScrollbarWidth)()),t?(n+=this.sumCellSizes(0,e+1),n-=this.wot.wtViewport.getViewportWidth()):n+=this.sumCellSizes(this.wot.getSetting("fixedColumnsLeft"),e),n+=i, this.setScrollPosition(n)}},{key:"getTableParentOffset",value:function(){var e=this.wot.getSetting("preventOverflow"),t=0;return e||this.trimmingContainer!==window||(t=this.wot.wtTable.holderOffset.left),t}},{key:"getScrollPosition",value:function(){return(0,d.getScrollLeft)(this.mainTableScrollableElement)}},{key:"adjustHeaderBordersPosition",value:function(e){var t=this.wot.wtTable.holder.parentNode,n=this.wot.getSetting("rowHeaders"),r=this.wot.getSetting("fixedColumnsLeft"),o=this.wot.getSetting("totalRows");if(o?(0,d.removeClass)(t,"emptyRows"):(0,d.addClass)(t,"emptyRows"),r&&!n.length)(0,d.addClass)(t,"innerBorderLeft");else if(!r&&n.length){var i=(0,d.hasClass)(t,"innerBorderLeft");e?(0,d.addClass)(t,"innerBorderLeft"):(0,d.removeClass)(t,"innerBorderLeft"),(!i&&e||i&&!e)&&this.wot.wtOverlays.adjustElementsSize()}}}]),t}(p.default);p.default.registerOverlay(p.default.CLONE_LEFT,g);var v=g;t.default=v},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var n=0;n0?-a:0,t=o,o+="px",(0,d.setOverlayPosition)(e,r,o)}this.adjustHeaderBordersPosition(t),this.adjustElementsSize()}}},{key:"setScrollPosition",value:function(e){var t=!1;return this.mainTableScrollableElement===window&&window.scrollY!==e?(window.scrollTo((0,d.getWindowScrollLeft)(),e),t=!0):this.mainTableScrollableElement.scrollTop!==e&&(this.mainTableScrollableElement.scrollTop=e,t=!0),t}},{key:"onScroll",value:function(){this.wot.getSetting("onScrollHorizontally")}},{key:"sumCellSizes",value:function(e,t){for(var n=this.wot.wtSettings.settings.defaultRowHeight,r=e,o=0;r0&&void 0!==arguments[0]&&arguments[0];this.updateTrimmingContainer(),(this.needFullRender||e)&&(this.adjustRootElementSize(),this.adjustRootChildrenSize(),e||(this.areElementSizesAdjusted=!0))}},{key:"adjustRootElementSize",value:function(){var e=this.wot.wtTable.holder,t=e.clientWidth===e.offsetWidth?0:(0,d.getScrollbarWidth)(),n=this.clone.wtTable.holder.parentNode,r=n.style,o=this.wot.getSetting("preventOverflow");if(this.trimmingContainer!==window||"horizontal"===o){var i=this.wot.wtViewport.getWorkspaceWidth()-t;i=Math.min(i,(0,d.innerWidth)(this.wot.wtTable.wtRootElement)),r.width="".concat(i,"px")}else r.width="";this.clone.wtTable.holder.style.width=r.width;var a=(0,d.outerHeight)(this.clone.wtTable.TABLE);r.height="".concat(0===a?a:a+4,"px")}},{key:"adjustRootChildrenSize",value:function(){var e=(0,d.getScrollbarWidth)();this.clone.wtTable.hider.style.width=this.hider.style.width,this.clone.wtTable.holder.style.width=this.clone.wtTable.holder.parentNode.style.width,0===e&&(e=30),this.clone.wtTable.holder.style.height="".concat(parseInt(this.clone.wtTable.holder.parentNode.style.height,10)+e,"px")}},{key:"applyToDOM",value:function(){var e=this.wot.getSetting("totalRows");if(this.areElementSizesAdjusted||this.adjustElementsSize(),"number"==typeof this.wot.wtViewport.rowsRenderCalculator.startPosition)this.spreader.style.top="".concat(this.wot.wtViewport.rowsRenderCalculator.startPosition,"px");else{if(0!==e)throw new Error("Incorrect value of the rowsRenderCalculator");this.spreader.style.top="0"}this.spreader.style.bottom="",this.needFullRender&&this.syncOverlayOffset()}},{key:"syncOverlayOffset",value:function(){"number"==typeof this.wot.wtViewport.columnsRenderCalculator.startPosition?this.clone.wtTable.spreader.style.left="".concat(this.wot.wtViewport.columnsRenderCalculator.startPosition,"px"):this.clone.wtTable.spreader.style.left=""}},{key:"scrollTo",value:function(e,t){var n=this.getTableParentOffset(),r=this.wot.cloneSource?this.wot.cloneSource:this.wot,o=r.wtTable.holder,i=0;if(t&&o.offsetHeight!==o.clientHeight&&(i=(0,d.getScrollbarWidth)()),t){var a=this.wot.getSetting("fixedRowsBottom"),s=this.wot.getSetting("totalRows");n+=this.sumCellSizes(0,e+1),n-=this.wot.wtViewport.getViewportHeight()-this.sumCellSizes(s-a,s),n+=1}else n+=this.sumCellSizes(this.wot.getSetting("fixedRowsTop"),e);return n+=i,this.setScrollPosition(n)}},{key:"getTableParentOffset",value:function(){return this.mainTableScrollableElement===window?this.wot.wtTable.holderOffset.top:0}},{key:"getScrollPosition",value:function(){return(0,d.getScrollTop)(this.mainTableScrollableElement)}},{key:"redrawSelectionBorders",value:function(e){if(e&&e.cellRange){var t=e.getBorder(this.wot),n=e.getCorners();t.disappear(),t.appear(n)}}},{key:"redrawAllSelectionsBorders",value:function(){var e=this,t=this.wot.selections;this.redrawSelectionBorders(t.getCell()),(0,p.arrayEach)(t.getAreas(),function(t){e.redrawSelectionBorders(t)}),this.redrawSelectionBorders(t.getFill()),this.wot.wtTable.wot.wtOverlays.leftOverlay.refresh()}},{key:"adjustHeaderBordersPosition",value:function(e){var t=this.wot.wtTable.holder.parentNode,n=this.wot.getSetting("totalColumns");if(n?(0,d.removeClass)(t,"emptyColumns"):(0,d.addClass)(t,"emptyColumns"),0===this.wot.getSetting("fixedRowsTop")&&this.wot.getSetting("columnHeaders").length>0){var r=(0,d.hasClass)(t,"innerBorderTop");e||0===this.wot.getSetting("totalRows")?(0,d.addClass)(t,"innerBorderTop"):(0,d.removeClass)(t,"innerBorderTop"),(!r&&e||r&&!e)&&(this.wot.wtOverlays.adjustElementsSize(),this.redrawAllSelectionsBorders())}if(0===this.wot.getSetting("rowHeaders").length){var o=this.clone.wtTable.THEAD.querySelectorAll("th:nth-of-type(2)");if(o)for(var i=0;i0&&(u="".concat(-a,"px")),r&&"horizontal"!==r||i<0&&s-e.offsetHeight>0&&(c="".concat(-i,"px")),(0,d.setOverlayPosition)(e,u,c)}else(0,d.resetCssTransform)(e);e.style.height="".concat(0===t?t:t+4,"px"),e.style.width="".concat(0===n?n:n+4,"px")}}}]),t}(p.default);p.default.registerOverlay(p.default.CLONE_TOP_LEFT_CORNER,g);var v=g;t.default=v},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var n=0;na?i-a:0,t=r,r+="px",e.style.top="",e.style.left=n,e.style.bottom=r}else t=this.getScrollPosition(),(0,d.resetCssTransform)(e),this.repositionOverlay();this.adjustHeaderBordersPosition(t)}}},{key:"setScrollPosition",value:function(e){this.mainTableScrollableElement===window?window.scrollTo((0,d.getWindowScrollLeft)(),e):this.mainTableScrollableElement.scrollTop=e}},{key:"onScroll",value:function(){this.wot.getSetting("onScrollVertically")}},{key:"sumCellSizes",value:function(e,t){for(var n=e,r=0,o=this.wot.wtSettings.settings.defaultRowHeight;n0&&void 0!==arguments[0]&&arguments[0];this.updateTrimmingContainer(),(this.needFullRender||e)&&(this.adjustRootElementSize(),this.adjustRootChildrenSize(),e||(this.areElementSizesAdjusted=!0))}},{key:"adjustRootElementSize",value:function(){var e=this.wot.wtTable.holder,t=e.clientWidth===e.offsetWidth?0:(0,d.getScrollbarWidth)(),n=this.clone.wtTable.holder.parentNode,r=n.style;this.trimmingContainer===window?r.width="":r.width="".concat(this.wot.wtViewport.getWorkspaceWidth()-t,"px"),this.clone.wtTable.holder.style.width=r.width;var o=(0,d.outerHeight)(this.clone.wtTable.TABLE);r.height="".concat(o,"px")}},{key:"adjustRootChildrenSize",value:function(){var e=(0,d.getScrollbarWidth)();this.clone.wtTable.hider.style.width=this.hider.style.width,this.clone.wtTable.holder.style.width=this.clone.wtTable.holder.parentNode.style.width,0===e&&(e=30),this.clone.wtTable.holder.style.height="".concat(parseInt(this.clone.wtTable.holder.parentNode.style.height,10)+e,"px")}},{key:"applyToDOM",value:function(){var e=this.wot.getSetting("totalRows");if(this.areElementSizesAdjusted||this.adjustElementsSize(),"number"==typeof this.wot.wtViewport.rowsRenderCalculator.startPosition)this.spreader.style.top="".concat(this.wot.wtViewport.rowsRenderCalculator.startPosition,"px");else{if(0!==e)throw new Error("Incorrect value of the rowsRenderCalculator");this.spreader.style.top="0"}this.spreader.style.bottom="",this.needFullRender&&this.syncOverlayOffset()}},{key:"syncOverlayOffset",value:function(){"number"==typeof this.wot.wtViewport.columnsRenderCalculator.startPosition?this.clone.wtTable.spreader.style.left="".concat(this.wot.wtViewport.columnsRenderCalculator.startPosition,"px"):this.clone.wtTable.spreader.style.left=""}},{key:"scrollTo",value:function(e,t){var n=this.getTableParentOffset(),r=this.wot.cloneSource?this.wot.cloneSource:this.wot,o=r.wtTable.holder,i=0;t&&o.offsetHeight!==o.clientHeight&&(i=(0,d.getScrollbarWidth)()),t?(n+=this.sumCellSizes(0,e+1),n-=this.wot.wtViewport.getViewportHeight(),n+=1):n+=this.sumCellSizes(this.wot.getSetting("fixedRowsBottom"),e),n+=i,this.setScrollPosition(n)}},{key:"getTableParentOffset",value:function(){return this.mainTableScrollableElement===window?this.wot.wtTable.holderOffset.top:0}},{key:"getScrollPosition",value:function(){return(0,d.getScrollTop)(this.mainTableScrollableElement)}},{key:"adjustHeaderBordersPosition",value:function(e){if(0===this.wot.getSetting("fixedRowsBottom")&&this.wot.getSetting("columnHeaders").length>0){var t=this.wot.wtTable.holder.parentNode,n=(0,d.hasClass)(t,"innerBorderTop");e?(0,d.addClass)(t,"innerBorderTop"):(0,d.removeClass)(t,"innerBorderTop"),(!n&&e||n&&!e)&&this.wot.wtOverlays.adjustElementsSize()}if(0===this.wot.getSetting("rowHeaders").length){var r=this.clone.wtTable.THEAD.querySelector("th:nth-of-type(2)");r&&(r.style["border-left-width"]=0)}}}]),t}(p.default);p.default.registerOverlay(p.default.CLONE_BOTTOM,g);var v=g;t.default=v},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var n=0;nl?a-l:0,o+="px",r+="px",e.style.top="",e.style.left=r,e.style.bottom=o}else(0,d.resetCssTransform)(e),this.repositionOverlay();e.style.height="".concat(t,"px"),e.style.width="".concat(n,"px")}}}]),t}(p.default);p.default.registerOverlay(p.default.CLONE_BOTTOM_LEFT_CORNER,g);var v=g;t.default=v},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){return s(e)||a(e,t)||i()}function i(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function a(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{r||null==s.return||s.return()}finally{if(o)throw i}}return n}function s(e){if(Array.isArray(e))return e}function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function c(e,t){for(var n=0;n4&&void 0!==arguments[4]&&arguments[4],i=e.wtTable.getCell(new p.default(t,n));if("object"===l(i)){var a=r;o&&(a=this.classNameGenerator(i),this.classNames.includes(a)||this.classNames.push(a)),(0,h.addClass)(i,a)}return this}},{key:"linearClassNameGenerator",value:function(e,t){return function n(r){var o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:-1;if(0===t||0===o)return e;var i=o>=0?o:t,a=e;i-=1;var s=0===i?e:"".concat(e,"-").concat(i);if((0,h.hasClass)(r,s)){var l=i+1;a="".concat(e,"-").concat(l)}else a=n(r,i);return a}}},{key:"draw",value:function(e){if(this.isEmpty())this.settings.border&&this.getBorder(e).disappear();else{for(var t=e.wtTable.getRenderedRowsCount(),n=e.wtTable.getRenderedColumnsCount(),r=this.getCorners(),i=o(r,4),a=i[0],s=i[1],l=i[2],u=i[3],c=0;c=s&&f<=u){var d=e.wtTable.getColumnHeader(f);if(d){var p=[];this.settings.highlightHeaderClassName&&p.push(this.settings.highlightHeaderClassName),this.settings.highlightColumnClassName&&p.push(this.settings.highlightColumnClassName),(0,h.addClass)(d,p)}}}for(var g=0;g=a&&v<=l){var y=e.wtTable.getRowHeader(v);if(y){var m=[];this.settings.highlightHeaderClassName&&m.push(this.settings.highlightHeaderClassName),this.settings.highlightRowClassName&&m.push(this.settings.highlightRowClassName),(0,h.addClass)(y,m)}}for(var w=0;w=a&&v<=l&&b>=s&&b<=u?this.settings.className&&this.addClassAtCoords(e,v,b,this.settings.className,this.settings.markIntersections):v>=a&&v<=l?this.settings.highlightRowClassName&&this.addClassAtCoords(e,v,b,this.settings.highlightRowClassName):b>=s&&b<=u&&this.settings.highlightColumnClassName&&this.addClassAtCoords(e,v,b,this.settings.highlightColumnClassName);var C=e.getSetting("onAfterDrawSelection",v,b,r,this.settings.layerLevel);"string"==typeof C&&this.addClassAtCoords(e,v,b,C)}}e.getSetting("onBeforeDrawBorders",r,this.settings.className),this.settings.border&&this.getBorder(e).appear(r)}}}]),e}(),y=v;t.default=y},function(e,t,n){"use strict";function r(){function e(e){return e.currentStyle||document.defaultView.getComputedStyle(e)}var t,n={minHeight:200,maxHeight:300,minWidth:100,maxWidth:300},r=document.body,o=document.createTextNode(""),i=document.createElement("SPAN"),a=function(e,t,n){e.addEventListener(t,n,!1)},s=function(e,t,n){e.removeEventListener(t,n,!1)},l=function(a){var s,l;a?/^[a-zA-Z \.,\\\/\|0-9]$/.test(a)||(a="."):a="",void 0!==o.textContent?o.textContent=t.value+a:o.data=t.value+a,i.style.fontSize=e(t).fontSize,i.style.fontFamily=e(t).fontFamily,i.style.whiteSpace="pre",r.appendChild(i),s=i.clientWidth+2,r.removeChild(i),t.style.height=n.minHeight+"px",n.minWidth>s?t.style.width=n.minWidth+"px":s>n.maxWidth?t.style.width=n.maxWidth+"px":t.style.width=s+"px",l=t.scrollHeight?t.scrollHeight-1:0,n.minHeight>l?t.style.height=n.minHeight+"px":n.maxHeight0&&void 0!==arguments[0]?arguments[0]:null;c(h(t.prototype),"open",this).call(this),this.showDatepicker(e)}},{key:"close",value:function(){var e=this;this._opened=!1,this.instance._registerTimeout(function(){e.instance._refreshBorders()}),c(h(t.prototype),"close",this).call(this)}},{key:"finishEditing",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(e){var r=this.originalValue;void 0!==r&&this.setValue(r)}this.hideDatepicker(),c(h(t.prototype),"finishEditing",this).call(this,e,n)}},{key:"showDatepicker",value:function(e){this.$datePicker.config(this.getDatePickerConfig());var t,n=this.TD.getBoundingClientRect(),r=this.cellProperties.dateFormat||this.defaultDateFormat,o=this.$datePicker.config(),i=this.instance.view.isMouseDown(),a=!!e&&(0,b.isMetaKey)(e.keyCode);this.datePickerStyle.top="".concat(window.pageYOffset+n.top+(0,y.outerHeight)(this.TD),"px"),this.datePickerStyle.left="".concat(window.pageXOffset+n.left,"px"),this.$datePicker._onInputFocus=function(){},o.format=r,this.originalValue?(t=this.originalValue,(0,g.default)(t,r,!0).isValid()&&this.$datePicker.setMoment((0,g.default)(t,r),!0),this.getValue()!==this.originalValue&&this.setValue(this.originalValue),a||i||this.setValue("")):this.cellProperties.defaultDate?(t=this.cellProperties.defaultDate,o.defaultDate=t,(0,g.default)(t,r,!0).isValid()&&this.$datePicker.setMoment((0,g.default)(t,r),!0),a||i||this.setValue("")):this.$datePicker.gotoToday(),this.datePickerStyle.display="block",this.$datePicker.show()}},{key:"hideDatepicker",value:function(){this.datePickerStyle.display="none",this.$datePicker.hide()}},{key:"getDatePickerConfig",value:function(){var e=this,t=this.TEXTAREA,n={};this.cellProperties&&this.cellProperties.datePickerConfig&&(0, m.deepExtend)(n,this.cellProperties.datePickerConfig);var r=n.onSelect,o=n.onClose;return n.field=t,n.trigger=t,n.container=this.datePicker,n.bound=!1,n.format=n.format||this.defaultDateFormat,n.reposition=n.reposition||!1,n.onSelect=function(t){var n=t;isNaN(n.getTime())||(n=(0,g.default)(n).format(e.cellProperties.dateFormat||e.defaultDateFormat)),e.setValue(n),e.hideDatepicker(),r&&r()},n.onClose=function(){e.parentDestroyed||e.finishEditing(!1),o&&o()},n}}]),t}(S.default),E=_;t.default=E},function(e,t,n){(function(t,r){"use strict";var o;try{o=n(617)}catch(e){}e.exports=r(o)})(0,function(e){"use strict";var t="function"==typeof e,n=!!window.addEventListener,r=window.document,o=window.setTimeout,i=function(e,t,r,o){n?e.addEventListener(t,r,!!o):e.attachEvent("on"+t,r)},a=function(e,t,r,o){n?e.removeEventListener(t,r,!!o):e.detachEvent("on"+t,r)},s=function(e,t,n){var o;r.createEvent?(o=r.createEvent("HTMLEvents"),o.initEvent(t,!0,!1),o=w(o,n),e.dispatchEvent(o)):r.createEventObject&&(o=r.createEventObject(),o=w(o,n),e.fireEvent("on"+t,o))},l=function(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")},u=function(e,t){return-1!==(" "+e.className+" ").indexOf(" "+t+" ")},c=function(e,t){u(e,t)||(e.className=""===e.className?t:e.className+" "+t)},f=function(e,t){e.className=l((" "+e.className+" ").replace(" "+t+" "," "))},h=function(e){return/Array/.test(Object.prototype.toString.call(e))},d=function(e){return/Date/.test(Object.prototype.toString.call(e))&&!isNaN(e.getTime())},p=function(e){var t=e.getDay();return 0===t||6===t},g=function(e){return e%4==0&&e%100!=0||e%400==0},v=function(e,t){return[31,g(e)?29:28,31,30,31,30,31,31,30,31,30,31][t]},y=function(e){d(e)&&e.setHours(0,0,0,0)},m=function(e,t){return e.getTime()===t.getTime()},w=function(e,t,n){var r,o;for(r in t)o=void 0!==e[r],o&&"object"==typeof t[r]&&null!==t[r]&&void 0===t[r].nodeName?d(t[r])?n&&(e[r]=new Date(t[r].getTime())):h(t[r])?n&&(e[r]=t[r].slice(0)):e[r]=w({},t[r],n):!n&&o||(e[r]=t[r]);return e},b=function(e){return e.month<0&&(e.year-=Math.ceil(Math.abs(e.month)/12),e.month+=12),e.month>11&&(e.year+=Math.floor(Math.abs(e.month)/12),e.month-=12),e},C={field:null,bound:void 0,position:"bottom left",reposition:!0,format:"YYYY-MM-DD",defaultDate:null,setDefaultDate:!1,firstDay:0,formatStrict:!1,minDate:null,maxDate:null,yearRange:10,showWeekNumber:!1,minYear:0,maxYear:9999,minMonth:void 0,maxMonth:void 0,startRange:null,endRange:null,isRTL:!1,yearSuffix:"",showMonthAfterYear:!1,showDaysInNextAndPreviousMonths:!1,numberOfMonths:1,mainCalendar:"left",container:void 0,i18n:{previousMonth:"Previous Month",nextMonth:"Next Month",months:["January","February","March","April","May","June","July","August","September","October","November","December"],weekdays:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],weekdaysShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]},theme:null,onSelect:null,onOpen:null,onClose:null,onDraw:null},S=function(e,t,n){for(t+=e.firstDay;t>=7;)t-=7;return n?e.i18n.weekdaysShort[t]:e.i18n.weekdays[t]},_=function(e){var t=[],n="false";if(e.isEmpty){if(!e.showDaysInNextAndPreviousMonths)return'';t.push("is-outside-current-month")}return e.isDisabled&&t.push("is-disabled"),e.isToday&&t.push("is-today"),e.isSelected&&(t.push("is-selected"),n="true"),e.isInRange&&t.push("is-inrange"),e.isStartRange&&t.push("is-startrange"),e.isEndRange&&t.push("is-endrange"),'"},E=function(e,t,n){var r=new Date(n,0,1),o=Math.ceil(((new Date(n,t,e)-r)/864e5+r.getDay()+1)/7);return''+o+""},O=function(e,t){return""+(t?e.reverse():e).join("")+""},T=function(e){return""+e.join("")+""},R=function(e){var t,n=[];for(e.showWeekNumber&&n.push(""),t=0;t<7;t++)n.push(''+S(e,t,!0)+"");return""+(e.isRTL?n.reverse():n).join("")+""},k=function(e,t,n,r,o,i){var a,s,l,u,c,f=e._o,d=n===f.minYear,p=n===f.maxYear,g='
      ',v=!0,y=!0;for(l=[],a=0;a<12;a++)l.push('");for(u='
      '+f.i18n.months[r]+'
      ",h(f.yearRange)?(a=f.yearRange[0],s=f.yearRange[1]+1):(a=n-f.yearRange,s=1+n+f.yearRange),l=[];a=f.minYear&&l.push('");return c='
      '+n+f.yearSuffix+'
      ",f.showMonthAfterYear?g+=c+u:g+=u+c,d&&(0===r||f.minMonth>=r)&&(v=!1),p&&(11===r||f.maxMonth<=r)&&(y=!1),0===t&&(g+='"),t===e._o.numberOfMonths-1&&(g+='"),g+"
      "},M=function(e,t,n){return''+R(e)+T(t)+"
      "},N=function(a){var s=this,l=s.config(a);s._onMouseDown=function(e){if(s._v){e=e||window.event;var t=e.target||e.srcElement;if(t)if(u(t,"is-disabled")||(!u(t,"pika-button")||u(t,"is-empty")||u(t.parentNode,"is-disabled")?u(t,"pika-prev")?s.prevMonth():u(t,"pika-next")&&s.nextMonth():(s.setDate(new Date(t.getAttribute("data-pika-year"),t.getAttribute("data-pika-month"),t.getAttribute("data-pika-day"))),l.bound&&o(function(){s.hide(),l.field&&l.field.blur()},100))),u(t,"pika-select"))s._c=!0;else{if(!e.preventDefault)return e.returnValue=!1,!1;e.preventDefault()}}},s._onChange=function(e){e=e||window.event;var t=e.target||e.srcElement;t&&(u(t,"pika-select-month")?s.gotoMonth(t.value):u(t,"pika-select-year")&&s.gotoYear(t.value))},s._onKeyChange=function(e){if(e=e||window.event,s.isVisible())switch(e.keyCode){case 13:case 27:l.field.blur();break;case 37:e.preventDefault(),s.adjustDate("subtract",1);break;case 38:s.adjustDate("subtract",7);break;case 39:s.adjustDate("add",1);break;case 40:s.adjustDate("add",7)}},s._onInputChange=function(n){var r;n.firedBy!==s&&(t?(r=e(l.field.value,l.format,l.formatStrict),r=r&&r.isValid()?r.toDate():null):r=new Date(Date.parse(l.field.value)),d(r)&&s.setDate(r),s._v||s.show())},s._onInputFocus=function(){s.show()},s._onInputClick=function(){s.show()},s._onInputBlur=function(){var e=r.activeElement;do{if(u(e,"pika-single"))return}while(e=e.parentNode);s._c||(s._b=o(function(){s.hide()},50)),s._c=!1},s._onClick=function(e){e=e||window.event;var t=e.target||e.srcElement,r=t;if(t){!n&&u(t,"pika-select")&&(t.onchange||(t.setAttribute("onchange","return;"),i(t,"change",s._onChange)));do{if(u(r,"pika-single")||r===l.trigger)return}while(r=r.parentNode);s._v&&t!==l.trigger&&r!==l.trigger&&s.hide()}},s.el=r.createElement("div"),s.el.className="pika-single"+(l.isRTL?" is-rtl":"")+(l.theme?" "+l.theme:""),i(s.el,"mousedown",s._onMouseDown,!0),i(s.el,"touchend",s._onMouseDown,!0),i(s.el,"change",s._onChange),i(r,"keydown",s._onKeyChange),l.field&&(l.container?l.container.appendChild(s.el):l.bound?r.body.appendChild(s.el):l.field.parentNode.insertBefore(s.el,l.field.nextSibling),i(l.field,"change",s._onInputChange),l.defaultDate||(t&&l.field.value?l.defaultDate=e(l.field.value,l.format).toDate():l.defaultDate=new Date(Date.parse(l.field.value)),l.setDefaultDate=!0));var c=l.defaultDate;d(c)?l.setDefaultDate?s.setDate(c,!0):s.gotoDate(c):s.gotoDate(new Date),l.bound?(this.hide(),s.el.className+=" is-bound",i(l.trigger,"click",s._onInputClick),i(l.trigger,"focus",s._onInputFocus),i(l.trigger,"blur",s._onInputBlur)):this.show()};return N.prototype={config:function(e){this._o||(this._o=w({},C,!0));var t=w(this._o,e,!0);t.isRTL=!!t.isRTL,t.field=t.field&&t.field.nodeName?t.field:null,t.theme="string"==typeof t.theme&&t.theme?t.theme:null,t.bound=!!(void 0!==t.bound?t.field&&t.bound:t.field),t.trigger=t.trigger&&t.trigger.nodeName?t.trigger:t.field,t.disableWeekends=!!t.disableWeekends,t.disableDayFn="function"==typeof t.disableDayFn?t.disableDayFn:null;var n=parseInt(t.numberOfMonths,10)||1;if(t.numberOfMonths=n>4?4:n,d(t.minDate)||(t.minDate=!1),d(t.maxDate)||(t.maxDate=!1),t.minDate&&t.maxDate&&t.maxDate100&&(t.yearRange=100);return t},toString:function(n){return d(this._d)?t?e(this._d).format(n||this._o.format):this._d.toDateString():""},getMoment:function(){return t?e(this._d):null},setMoment:function(n,r){t&&e.isMoment(n)&&this.setDate(n.toDate(),r)},getDate:function(){return d(this._d)?new Date(this._d.getTime()):new Date},setDate:function(e,t){if(!e)return this._d=null,this._o.field&&(this._o.field.value="",s(this._o.field,"change",{firedBy:this})),this.draw();if("string"==typeof e&&(e=new Date(Date.parse(e))),d(e)){var n=this._o.minDate,r=this._o.maxDate;d(n)&&er&&(e=r),this._d=new Date(e.getTime()),y(this._d),this.gotoDate(this._d),this._o.field&&(this._o.field.value=this.toString(),s(this._o.field,"change",{firedBy:this})),t||"function"!=typeof this._o.onSelect||this._o.onSelect.call(this,this.getDate())}},gotoDate:function(e){var t=!0;if(d(e)){if(this.calendars){var n=new Date(this.calendars[0].year,this.calendars[0].month,1),r=new Date(this.calendars[this.calendars.length-1].year,this.calendars[this.calendars.length-1].month,1),o=e.getTime();r.setMonth(r.getMonth()+1),r.setDate(r.getDate()-1),t=o=i&&(this._y=i,!isNaN(s)&&this._m>s&&(this._m=s)),t="pika-title-"+Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,2);for(var u=0;u'+k(this,u,this.calendars[u].year,this.calendars[u].month,this.calendars[0].year,t)+this.render(this.calendars[u].year,this.calendars[u].month,t)+"
      ";this.el.innerHTML=l,n.bound&&"hidden"!==n.field.type&&o(function(){n.trigger.focus()},1),"function"==typeof this._o.onDraw&&this._o.onDraw(this),n.bound&&n.field.setAttribute("aria-label","Use the arrow keys to pick a date")}},adjustPosition:function(){var e,t,n,o,i,a,s,l,u,c;if(!this._o.container){if(this.el.style.position="absolute",e=this._o.trigger,t=e,n=this.el.offsetWidth,o=this.el.offsetHeight,i=window.innerWidth||r.documentElement.clientWidth,a=window.innerHeight||r.documentElement.clientHeight,s=window.pageYOffset||r.body.scrollTop||r.documentElement.scrollTop,"function"==typeof e.getBoundingClientRect)c=e.getBoundingClientRect(),l=c.left+window.pageXOffset,u=c.bottom+window.pageYOffset;else for(l=t.offsetLeft,u=t.offsetTop+t.offsetHeight;t=t.offsetParent;)l+=t.offsetLeft,u+=t.offsetTop;(this._o.reposition&&l+n>i||this._o.position.indexOf("right")>-1&&l-n+e.offsetWidth>0)&&(l=l-n+e.offsetWidth),(this._o.reposition&&u+o>a+s||this._o.position.indexOf("top")>-1&&u-o-e.offsetHeight>0)&&(u=u-o-e.offsetHeight),this.el.style.left=l+"px",this.el.style.top=u+"px"}},render:function(e,t,n){var r=this._o,o=new Date,i=v(e,t),a=new Date(e,t,1).getDay(),s=[],l=[];y(o),r.firstDay>0&&(a-=r.firstDay,a<0&&(a+=7));for(var u=0===t?11:t-1,c=11===t?0:t+1,f=0===t?e-1:e,h=11===t?e+1:e,g=v(f,u),w=i+a,b=w;b>7;)b-=7;w+=7-b;for(var C=0,S=0;C=i+a,D=C-a+1,A=t,P=e,L=r.startRange&&m(r.startRange,T),H=r.endRange&&m(r.endRange,T),x=r.startRange&&r.endRange&&r.startRanger.maxDate||r.disableWeekends&&p(T)||r.disableDayFn&&r.disableDayFn(T);N&&(C0)for(n=0;n0?"future":"past"];return R(n)?n(t):n.replace(/%s/i,t)}function I(e,t){var n=e.toLowerCase();Br[n]=Br[n+"s"]=Br[t]=e}function j(e){return"string"==typeof e?Br[e]||Br[e.toLowerCase()]:void 0}function F(e){var t,n,r={};for(n in e)f(e,n)&&(t=j(n),t&&(r[t]=e[n]));return r}function W(e,t){Vr[e]=t}function B(e){var t=[];for(var n in e)t.push({unit:n,priority:Vr[n]});return t.sort(function(e,t){return e.priority-t.priority}),t}function V(e,t,n){var r=""+Math.abs(e),o=t-r.length,i=e>=0;return(i?n?"+":"":"-")+Math.pow(10,Math.max(0,o)).toString().substr(1)+r}function Y(e,t,n,r){var o=r;"string"==typeof r&&(o=function(){return this[r]()}),e&&(Gr[e]=o),t&&(Gr[t[0]]=function(){return V(o.apply(this,arguments),t[1],t[2])}),n&&(Gr[n]=function(){return this.localeData().ordinal(o.apply(this,arguments),e)})}function U(e){return e.match(/\[[\s\S]/)?e.replace(/^\[|\]$/g,""):e.replace(/\\/g,"")}function z(e){var t,n,r=e.match(Yr);for(t=0,n=r.length;t=0&&Ur.test(e);)e=e.replace(Ur,n),Ur.lastIndex=0,r-=1;return e}function K(e,t,n){co[e]=R(t)?t:function(e,r){return e&&n?n:t}}function q(e,t){return f(co,e)?co[e](t._strict,t._locale):new RegExp(Z(e))}function Z(e){return $(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,n,r,o){return t||n||r||o}))}function $(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function J(e,t){var n,r=t;for("string"==typeof e&&(e=[e]),l(t)&&(r=function(e,n){n[t]=S(e)}),n=0;n=0&&isFinite(s.getFullYear())&&s.setFullYear(e),s}function Se(e){var t=new Date(Date.UTC.apply(null,arguments));return e<100&&e>=0&&isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e),t}function _e(e,t,n){var r=7+t-n,o=(7+Se(e,0,r).getUTCDay()-t)%7;return-o+r-1}function Ee(e,t,n,r,o){var i,a,s=(7+n-r)%7,l=_e(e,r,o),u=1+7*(t-1)+s+l;return u<=0?(i=e-1,a=te(i)+u):u>te(e)?(i=e+1,a=u-te(e)):(i=e,a=u),{year:i,dayOfYear:a}}function Oe(e,t,n){var r,o,i=_e(e.year(),t,n),a=Math.floor((e.dayOfYear()-i-1)/7)+1;return a<1?(o=e.year()-1,r=a+Te(o,t,n)):a>Te(e.year(),t,n)?(r=a-Te(e.year(),t,n),o=e.year()+1):(o=e.year(),r=a),{week:r,year:o}}function Te(e,t,n){var r=_e(e,t,n),o=_e(e+1,t,n);return(te(e)-r+o)/7}function Re(e){return Oe(e,this._week.dow,this._week.doy).week}function ke(){return this._week.dow}function Me(){return this._week.doy}function Ne(e){var t=this.localeData().week(this);return null==e?t:this.add(7*(e-t),"d")}function De(e){var t=Oe(this,1,4).week;return null==e?t:this.add(7*(e-t),"d")}function Ae(e,t){return"string"!=typeof e?e:isNaN(e)?(e=t.weekdaysParse(e),"number"==typeof e?e:null):parseInt(e,10)}function Pe(e,t){return"string"==typeof e?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}function Le(e,t){return e?o(this._weekdays)?this._weekdays[e.day()]:this._weekdays[this._weekdays.isFormat.test(t)?"format":"standalone"][e.day()]:o(this._weekdays)?this._weekdays:this._weekdays.standalone}function He(e){return e?this._weekdaysShort[e.day()]:this._weekdaysShort}function xe(e){return e?this._weekdaysMin[e.day()]:this._weekdaysMin}function Ie(e,t,n){var r,o,i,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],r=0;r<7;++r)i=d([2e3,1]).day(r),this._minWeekdaysParse[r]=this.weekdaysMin(i,"").toLocaleLowerCase(),this._shortWeekdaysParse[r]=this.weekdaysShort(i,"").toLocaleLowerCase(),this._weekdaysParse[r]=this.weekdays(i,"").toLocaleLowerCase();return n?"dddd"===t?(o=So.call(this._weekdaysParse,a),-1!==o?o:null):"ddd"===t?(o=So.call(this._shortWeekdaysParse,a),-1!==o?o:null):(o=So.call(this._minWeekdaysParse,a),-1!==o?o:null):"dddd"===t?(o=So.call(this._weekdaysParse,a),-1!==o?o:(o=So.call(this._shortWeekdaysParse,a),-1!==o?o:(o=So.call(this._minWeekdaysParse,a),-1!==o?o:null))):"ddd"===t?(o=So.call(this._shortWeekdaysParse,a),-1!==o?o:(o=So.call(this._weekdaysParse,a),-1!==o?o:(o=So.call(this._minWeekdaysParse,a),-1!==o?o:null))):(o=So.call(this._minWeekdaysParse,a),-1!==o?o:(o=So.call(this._weekdaysParse,a),-1!==o?o:(o=So.call(this._shortWeekdaysParse,a),-1!==o?o:null)))}function je(e,t,n){var r,o,i;if(this._weekdaysParseExact)return Ie.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),r=0;r<7;r++){if(o=d([2e3,1]).day(r),n&&!this._fullWeekdaysParse[r]&&(this._fullWeekdaysParse[r]=new RegExp("^"+this.weekdays(o,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[r]=new RegExp("^"+this.weekdaysShort(o,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[r]=new RegExp("^"+this.weekdaysMin(o,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[r]||(i="^"+this.weekdays(o,"")+"|^"+this.weekdaysShort(o,"")+"|^"+this.weekdaysMin(o,""),this._weekdaysParse[r]=new RegExp(i.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[r].test(e))return r;if(n&&"ddd"===t&&this._shortWeekdaysParse[r].test(e))return r;if(n&&"dd"===t&&this._minWeekdaysParse[r].test(e))return r;if(!n&&this._weekdaysParse[r].test(e))return r}}function Fe(e){if(!this.isValid())return null!=e?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=e?(e=Ae(e,this.localeData()),this.add(e-t,"d")):t}function We(e){if(!this.isValid())return null!=e?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return null==e?t:this.add(e-t,"d")}function Be(e){if(!this.isValid())return null!=e?this:NaN;if(null!=e){var t=Pe(e,this.localeData());return this.day(this.day()%7?t:t-7)}return this.day()||7}function Ve(e){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||ze.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(f(this,"_weekdaysRegex")||(this._weekdaysRegex=Po),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)}function Ye(e){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||ze.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(f(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Lo),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Ue(e){return this._weekdaysParseExact?(f(this,"_weekdaysRegex")||ze.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(f(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Ho),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function ze(){function e(e,t){return t.length-e.length}var t,n,r,o,i,a=[],s=[],l=[],u=[];for(t=0;t<7;t++)n=d([2e3,1]).day(t),r=this.weekdaysMin(n,""),o=this.weekdaysShort(n,""),i=this.weekdays(n,""),a.push(r),s.push(o),l.push(i),u.push(r),u.push(o),u.push(i);for(a.sort(e),s.sort(e),l.sort(e),u.sort(e),t=0;t<7;t++)s[t]=$(s[t]),l[t]=$(l[t]),u[t]=$(u[t]);this._weekdaysRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+s.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function Ge(){return this.hours()%12||12}function Xe(){return this.hours()||24}function Ke(e,t){Y(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function qe(e,t){return t._meridiemParse}function Ze(e){return"p"===(e+"").toLowerCase().charAt(0)}function $e(e,t,n){return e>11?n?"pm":"PM":n?"am":"AM"}function Je(e){return e?e.toLowerCase().replace("_","-"):e}function Qe(e){for(var t,n,r,o,i=0;i0;){if(r=et(o.slice(0,t).join("-")),r)return r ;if(n&&n.length>=t&&_(o,n,!0)>=t-1)break;t--}i++}return xo}function et(t){var r=null;if(!Wo[t]&&void 0!==e&&e&&e.exports)try{r=xo._abbr;n(618)("./"+t),tt(r)}catch(e){}return Wo[t]}function tt(e,t){var n;return e&&(n=s(t)?ot(e):nt(e,t),n?xo=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),xo._abbr}function nt(e,t){if(null!==t){var n,r=Fo;if(t.abbr=e,null!=Wo[e])T("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),r=Wo[e]._config;else if(null!=t.parentLocale)if(null!=Wo[t.parentLocale])r=Wo[t.parentLocale]._config;else{if(n=et(t.parentLocale),null==n)return Bo[t.parentLocale]||(Bo[t.parentLocale]=[]),Bo[t.parentLocale].push({name:e,config:t}),null;r=n._config}return Wo[e]=new N(M(r,t)),Bo[e]&&Bo[e].forEach(function(e){nt(e.name,e.config)}),tt(e),Wo[e]}return delete Wo[e],null}function rt(e,t){if(null!=t){var n,r,o=Fo;r=et(e),null!=r&&(o=r._config),t=M(o,t),n=new N(t),n.parentLocale=Wo[e],Wo[e]=n,tt(e)}else null!=Wo[e]&&(null!=Wo[e].parentLocale?Wo[e]=Wo[e].parentLocale:null!=Wo[e]&&delete Wo[e]);return Wo[e]}function ot(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return xo;if(!o(e)){if(t=et(e),t)return t;e=[e]}return Qe(e)}function it(){return Dr(Wo)}function at(e){var t,n=e._a;return n&&-2===g(e).overflow&&(t=n[po]<0||n[po]>11?po:n[go]<1||n[go]>ce(n[ho],n[po])?go:n[vo]<0||n[vo]>24||24===n[vo]&&(0!==n[yo]||0!==n[mo]||0!==n[wo])?vo:n[yo]<0||n[yo]>59?yo:n[mo]<0||n[mo]>59?mo:n[wo]<0||n[wo]>999?wo:-1,g(e)._overflowDayOfYear&&(tgo)&&(t=go),g(e)._overflowWeeks&&-1===t&&(t=bo),g(e)._overflowWeekday&&-1===t&&(t=Co),g(e).overflow=t),e}function st(e,t,n){return null!=e?e:null!=t?t:n}function lt(e){var n=new Date(t.now());return e._useUTC?[n.getUTCFullYear(),n.getUTCMonth(),n.getUTCDate()]:[n.getFullYear(),n.getMonth(),n.getDate()]}function ut(e){var t,n,r,o,i,a=[];if(!e._d){for(r=lt(e),e._w&&null==e._a[go]&&null==e._a[po]&&ct(e),null!=e._dayOfYear&&(i=st(e._a[ho],r[ho]),(e._dayOfYear>te(i)||0===e._dayOfYear)&&(g(e)._overflowDayOfYear=!0),n=Se(i,0,e._dayOfYear),e._a[po]=n.getUTCMonth(),e._a[go]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=a[t]=r[t];for(;t<7;t++)e._a[t]=a[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[vo]&&0===e._a[yo]&&0===e._a[mo]&&0===e._a[wo]&&(e._nextDay=!0,e._a[vo]=0),e._d=(e._useUTC?Se:Ce).apply(null,a),o=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[vo]=24),e._w&&void 0!==e._w.d&&e._w.d!==o&&(g(e).weekdayMismatch=!0)}}function ct(e){var t,n,r,o,i,a,s,l;if(t=e._w,null!=t.GG||null!=t.W||null!=t.E)i=1,a=4,n=st(t.GG,e._a[ho],Oe(Rt(),1,4).year),r=st(t.W,1),o=st(t.E,1),(o<1||o>7)&&(l=!0);else{i=e._locale._week.dow,a=e._locale._week.doy;var u=Oe(Rt(),i,a);n=st(t.gg,e._a[ho],u.year),r=st(t.w,u.week),null!=t.d?(o=t.d,(o<0||o>6)&&(l=!0)):null!=t.e?(o=t.e+i,(t.e<0||t.e>6)&&(l=!0)):o=i}r<1||r>Te(n,i,a)?g(e)._overflowWeeks=!0:null!=l?g(e)._overflowWeekday=!0:(s=Ee(n,r,o,i,a),e._a[ho]=s.year,e._dayOfYear=s.dayOfYear)}function ft(e){var t,n,r,o,i,a,s=e._i,l=Vo.exec(s)||Yo.exec(s);if(l){for(g(e).iso=!0,t=0,n=zo.length;t0&&g(e).unusedInput.push(a),s=s.slice(s.indexOf(r)+r.length),u+=r.length),Gr[i]?(r?g(e).empty=!1:g(e).unusedTokens.push(i),ee(i,r,e)):e._strict&&!r&&g(e).unusedTokens.push(i);g(e).charsLeftOver=l-u,s.length>0&&g(e).unusedInput.push(s),e._a[vo]<=12&&!0===g(e).bigHour&&e._a[vo]>0&&(g(e).bigHour=void 0),g(e).parsedDateParts=e._a.slice(0),g(e).meridiem=e._meridiem,e._a[vo]=bt(e._locale,e._a[vo],e._meridiem),ut(e),at(e)}else yt(e);else ft(e)}function bt(e,t,n){var r;return null==n?t:null!=e.meridiemHour?e.meridiemHour(t,n):null!=e.isPM?(r=e.isPM(n),r&&t<12&&(t+=12),r||12!==t||(t=0),t):t}function Ct(e){var t,n,r,o,i;if(0===e._f.length)return g(e).invalidFormat=!0,void(e._d=new Date(NaN));for(o=0;othis.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Kt(){if(!s(this._isDSTShifted))return this._isDSTShifted;var e={};if(m(e,this),e=Et(e),e._a){var t=e._isUTC?d(e._a):Rt(e._a);this._isDSTShifted=this.isValid()&&_(e._a,t.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function qt(){return!!this.isValid()&&!this._isUTC}function Zt(){return!!this.isValid()&&this._isUTC}function $t(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Jt(e,t){var n,r,o,i=e,a=null;return Ht(e)?i={ms:e._milliseconds,d:e._days,M:e._months}:l(e)?(i={},t?i[t]=e:i.milliseconds=e):(a=ti.exec(e))?(n="-"===a[1]?-1:1,i={y:0,d:S(a[go])*n,h:S(a[vo])*n,m:S(a[yo])*n,s:S(a[mo])*n,ms:S(xt(1e3*a[wo]))*n}):(a=ni.exec(e))?(n="-"===a[1]?-1:1,i={y:Qt(a[2],n),M:Qt(a[3],n),w:Qt(a[4],n),d:Qt(a[5],n),h:Qt(a[6],n),m:Qt(a[7],n),s:Qt(a[8],n)}):null==i?i={}:"object"==typeof i&&("from"in i||"to"in i)&&(o=tn(Rt(i.from),Rt(i.to)),i={},i.ms=o.milliseconds,i.M=o.months),r=new Lt(i),Ht(e)&&f(e,"_locale")&&(r._locale=e._locale),r}function Qt(e,t){var n=e&&parseFloat(e.replace(",","."));return(isNaN(n)?0:n)*t}function en(e,t){var n={milliseconds:0,months:0};return n.months=t.month()-e.month()+12*(t.year()-e.year()),e.clone().add(n.months,"M").isAfter(t)&&--n.months,n.milliseconds=+t-+e.clone().add(n.months,"M"),n}function tn(e,t){var n;return e.isValid()&&t.isValid()?(t=Ft(t,e),e.isBefore(t)?n=en(e,t):(n=en(t,e),n.milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function nn(e,t){return function(n,r){var o,i;return null===r||isNaN(+r)||(T(t,"moment()."+t+"(period, number) is deprecated. Please use moment()."+t+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),i=n,n=r,r=i),n="string"==typeof n?+n:n,o=Jt(n,r),rn(this,o,e),this}}function rn(e,n,r,o){var i=n._milliseconds,a=xt(n._days),s=xt(n._months);e.isValid()&&(o=null==o||o,s&&ge(e,ie(e,"Month")+s*r),a&&ae(e,"Date",ie(e,"Date")+a*r),i&&e._d.setTime(e._d.valueOf()+i*r),o&&t.updateOffset(e,a||s))}function on(e,t){var n=e.diff(t,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"}function an(e,n){var r=e||Rt(),o=Ft(r,this).startOf("day"),i=t.calendarFormat(this,o)||"sameElse",a=n&&(R(n[i])?n[i].call(this,r):n[i]);return this.format(a||this.localeData().calendar(i,this,Rt(r)))}function sn(){return new w(this)}function ln(e,t){var n=b(e)?e:Rt(e);return!(!this.isValid()||!n.isValid())&&(t=j(t)||"millisecond","millisecond"===t?this.valueOf()>n.valueOf():n.valueOf()9999?G(n,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):R(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",G(n,"Z")):G(n,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")}function mn(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="";this.isLocal()||(e=0===this.utcOffset()?"moment.utc":"moment.parseZone",t="Z");var n="["+e+'("]',r=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",o="-MM-DD[T]HH:mm:ss.SSS",i=t+'[")]';return this.format(n+r+o+i)}function wn(e){e||(e=this.isUtc()?t.defaultFormatUtc:t.defaultFormat);var n=G(this,e);return this.localeData().postformat(n)}function bn(e,t){return this.isValid()&&(b(e)&&e.isValid()||Rt(e).isValid())?Jt({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function Cn(e){return this.from(Rt(),e)}function Sn(e,t){return this.isValid()&&(b(e)&&e.isValid()||Rt(e).isValid())?Jt({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function _n(e){return this.to(Rt(),e)}function En(e){var t;return void 0===e?this._locale._abbr:(t=ot(e),null!=t&&(this._locale=t),this)}function On(){return this._locale}function Tn(e){switch(e=j(e),e){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===e&&this.weekday(0),"isoWeek"===e&&this.isoWeekday(1),"quarter"===e&&this.month(3*Math.floor(this.month()/3)),this}function Rn(e){return e=j(e),void 0===e||"millisecond"===e?this:("date"===e&&(e="day"),this.startOf(e).add(1,"isoWeek"===e?"week":e).subtract(1,"ms"))}function kn(){return this._d.valueOf()-6e4*(this._offset||0)}function Mn(){return Math.floor(this.valueOf()/1e3)}function Nn(){return new Date(this.valueOf())}function Dn(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]}function An(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}}function Pn(){return this.isValid()?this.toISOString():null}function Ln(){return v(this)}function Hn(){return h({},g(this))}function xn(){return g(this).overflow}function In(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function jn(e,t){Y(0,[e,e.length],0,t)}function Fn(e){return Yn.call(this,e,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Wn(e){return Yn.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)}function Bn(){return Te(this.year(),1,4)}function Vn(){var e=this.localeData()._week;return Te(this.year(),e.dow,e.doy)}function Yn(e,t,n,r,o){var i;return null==e?Oe(this,r,o).year:(i=Te(e,r,o),t>i&&(t=i),Un.call(this,e,t,n,r,o))}function Un(e,t,n,r,o){var i=Ee(e,t,n,r,o),a=Se(i.year,0,i.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}function zn(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)}function Gn(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==e?t:this.add(e-t,"d")}function Xn(e,t){t[wo]=S(1e3*("0."+e))}function Kn(){return this._isUTC?"UTC":""}function qn(){return this._isUTC?"Coordinated Universal Time":""}function Zn(e){return Rt(1e3*e)}function $n(){return Rt.apply(null,arguments).parseZone()}function Jn(e){return e}function Qn(e,t,n,r){var o=ot(),i=d().set(r,t);return o[n](i,e)}function er(e,t,n){if(l(e)&&(t=e,e=void 0),e=e||"",null!=t)return Qn(e,t,n,"month");var r,o=[];for(r=0;r<12;r++)o[r]=Qn(e,r,n,"month");return o}function tr(e,t,n,r){"boolean"==typeof e?(l(t)&&(n=t,t=void 0),t=t||""):(t=e,n=t,e=!1,l(t)&&(n=t,t=void 0),t=t||"");var o,i=ot(),a=e?i._week.dow:0;if(null!=n)return Qn(t,(n+a)%7,r,"day");var s=[];for(o=0;o<7;o++)s[o]=Qn(t,(o+a)%7,r,"day");return s}function nr(e,t){return er(e,t,"months")}function rr(e,t){return er(e,t,"monthsShort")}function or(e,t,n){return tr(e,t,n,"weekdays")}function ir(e,t,n){return tr(e,t,n,"weekdaysShort")}function ar(e,t,n){return tr(e,t,n,"weekdaysMin")}function sr(){var e=this._data;return this._milliseconds=di(this._milliseconds),this._days=di(this._days),this._months=di(this._months),e.milliseconds=di(e.milliseconds),e.seconds=di(e.seconds),e.minutes=di(e.minutes),e.hours=di(e.hours),e.months=di(e.months),e.years=di(e.years),this}function lr(e,t,n,r){var o=Jt(t,n);return e._milliseconds+=r*o._milliseconds,e._days+=r*o._days,e._months+=r*o._months,e._bubble()}function ur(e,t){return lr(this,e,t,1)}function cr(e,t){return lr(this,e,t,-1)}function fr(e){return e<0?Math.floor(e):Math.ceil(e)}function hr(){var e,t,n,r,o,i=this._milliseconds,a=this._days,s=this._months,l=this._data;return i>=0&&a>=0&&s>=0||i<=0&&a<=0&&s<=0||(i+=864e5*fr(pr(s)+a),a=0,s=0),l.milliseconds=i%1e3,e=C(i/1e3),l.seconds=e%60,t=C(e/60),l.minutes=t%60,n=C(t/60),l.hours=n%24,a+=C(n/24),o=C(dr(a)),s+=o,a-=fr(pr(o)),r=C(s/12),s%=12,l.days=a,l.months=s,l.years=r,this}function dr(e){return 4800*e/146097}function pr(e){return 146097*e/4800}function gr(e){if(!this.isValid())return NaN;var t,n,r=this._milliseconds;if(e=j(e),"month"===e||"year"===e)return t=this._days+r/864e5,n=this._months+dr(t),"month"===e?n:n/12;switch(t=this._days+Math.round(pr(this._months)),e){case"week":return t/7+r/6048e5;case"day":return t+r/864e5;case"hour":return 24*t+r/36e5;case"minute":return 1440*t+r/6e4;case"second":return 86400*t+r/1e3;case"millisecond":return Math.floor(864e5*t)+r;default:throw new Error("Unknown unit "+e)}}function vr(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*S(this._months/12):NaN}function yr(e){return function(){return this.as(e)}}function mr(){return Jt(this)}function wr(e){return e=j(e),this.isValid()?this[e+"s"]():NaN}function br(e){return function(){return this.isValid()?this._data[e]:NaN}}function Cr(){return C(this.days()/7)}function Sr(e,t,n,r,o){return o.relativeTime(t||1,!!n,e,r)}function _r(e,t,n){var r=Jt(e).abs(),o=Mi(r.as("s")),i=Mi(r.as("m")),a=Mi(r.as("h")),s=Mi(r.as("d")),l=Mi(r.as("M")),u=Mi(r.as("y")),c=o<=Ni.ss&&["s",o]||o0,c[4]=n,Sr.apply(null,c)}function Er(e){return void 0===e?Mi:"function"==typeof e&&(Mi=e,!0)}function Or(e,t){return void 0!==Ni[e]&&(void 0===t?Ni[e]:(Ni[e]=t,"s"===e&&(Ni.ss=t-1),!0))}function Tr(e){if(!this.isValid())return this.localeData().invalidDate();var t=this.localeData(),n=_r(this,!e,t);return e&&(n=t.pastFuture(+this,n)),t.postformat(n)}function Rr(e){return(e>0)-(e<0)||+e}function kr(){if(!this.isValid())return this.localeData().invalidDate();var e,t,n,r=Di(this._milliseconds)/1e3,o=Di(this._days),i=Di(this._months);e=C(r/60),t=C(e/60),r%=60,e%=60,n=C(i/12),i%=12;var a=n,s=i,l=o,u=t,c=e,f=r?r.toFixed(3).replace(/\.?0+$/,""):"",h=this.asSeconds();if(!h)return"P0D";var d=h<0?"-":"",p=Rr(this._months)!==Rr(h)?"-":"",g=Rr(this._days)!==Rr(h)?"-":"",v=Rr(this._milliseconds)!==Rr(h)?"-":"";return d+"P"+(a?p+a+"Y":"")+(s?p+s+"M":"")+(l?g+l+"D":"")+(u||c||f?"T":"")+(u?v+u+"H":"")+(c?v+c+"M":"")+(f?v+f+"S":"")}var Mr,Nr;Nr=Array.prototype.some?Array.prototype.some:function(e){for(var t=Object(this),n=t.length>>>0,r=0;r68?1900:2e3)};var So,_o=oe("FullYear",!0);So=Array.prototype.indexOf?Array.prototype.indexOf:function(e){var t;for(t=0;tthis?this:e:y()}),Jo=function(){return Date.now?Date.now():+new Date},Qo=["year","quarter","month","week","day","hour","minute","second","millisecond"];It("Z",":"),It("ZZ",""),K("Z",so),K("ZZ",so),J(["Z","ZZ"],function(e,t,n){n._useUTC=!0,n._tzm=jt(so,e)});var ei=/([\+\-]|\d\d)/gi;t.updateOffset=function(){};var ti=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,ni=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;Jt.fn=Lt.prototype,Jt.invalid=Pt;var ri=nn(1,"add"),oi=nn(-1,"subtract");t.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",t.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var ii=O("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return void 0===e?this.localeData():this.locale(e)});Y(0,["gg",2],0,function(){return this.weekYear()%100}),Y(0,["GG",2],0,function(){return this.isoWeekYear()%100}),jn("gggg","weekYear"),jn("ggggg","weekYear"),jn("GGGG","isoWeekYear"),jn("GGGGG","isoWeekYear"),I("weekYear","gg"),I("isoWeekYear","GG"),W("weekYear",1),W("isoWeekYear",1),K("G",io),K("g",io),K("GG",Jr,Kr),K("gg",Jr,Kr),K("GGGG",no,Zr),K("gggg",no,Zr),K("GGGGG",ro,$r),K("ggggg",ro,$r),Q(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,r){t[r.substr(0,2)]=S(e)}),Q(["gg","GG"],function(e,n,r,o){n[o]=t.parseTwoDigitYear(e)}),Y("Q",0,"Qo","quarter"),I("quarter","Q"),W("quarter",7),K("Q",Xr),J("Q",function(e,t){t[po]=3*(S(e)-1)}),Y("D",["DD",2],"Do","date"),I("date","D"),W("date",9),K("D",Jr),K("DD",Jr,Kr),K("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),J(["D","DD"],go),J("Do",function(e,t){t[go]=S(e.match(Jr)[0])});var ai=oe("Date",!0);Y("DDD",["DDDD",3],"DDDo","dayOfYear"),I("dayOfYear","DDD"),W("dayOfYear",4),K("DDD",to),K("DDDD",qr),J(["DDD","DDDD"],function(e,t,n){n._dayOfYear=S(e)}),Y("m",["mm",2],0,"minute"),I("minute","m"),W("minute",14),K("m",Jr),K("mm",Jr,Kr),J(["m","mm"],yo);var si=oe("Minutes",!1);Y("s",["ss",2],0,"second"),I("second","s"),W("second",15),K("s",Jr),K("ss",Jr,Kr),J(["s","ss"],mo);var li,ui=oe("Seconds",!1);for(Y("S",0,0,function(){return~~(this.millisecond()/100)}),Y(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),Y(0,["SSS",3],0,"millisecond"),Y(0,["SSSS",4],0,function(){return 10*this.millisecond()}),Y(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),Y(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),Y(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),Y(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),Y(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),I("millisecond","ms"),W("millisecond",16),K("S",to,Xr),K("SS",to,Kr),K("SSS",to,qr),li="SSSS";li.length<=9;li+="S")K(li,oo);for(li="S";li.length<=9;li+="S")J(li,Xn);var ci=oe("Milliseconds",!1);Y("z",0,0,"zoneAbbr"),Y("zz",0,0,"zoneName");var fi=w.prototype;fi.add=ri,fi.calendar=an,fi.clone=sn, fi.diff=pn,fi.endOf=Rn,fi.format=wn,fi.from=bn,fi.fromNow=Cn,fi.to=Sn,fi.toNow=_n,fi.get=se,fi.invalidAt=xn,fi.isAfter=ln,fi.isBefore=un,fi.isBetween=cn,fi.isSame=fn,fi.isSameOrAfter=hn,fi.isSameOrBefore=dn,fi.isValid=Ln,fi.lang=ii,fi.locale=En,fi.localeData=On,fi.max=$o,fi.min=Zo,fi.parsingFlags=Hn,fi.set=le,fi.startOf=Tn,fi.subtract=oi,fi.toArray=Dn,fi.toObject=An,fi.toDate=Nn,fi.toISOString=yn,fi.inspect=mn,fi.toJSON=Pn,fi.toString=vn,fi.unix=Mn,fi.valueOf=kn,fi.creationData=In,fi.year=_o,fi.isLeapYear=re,fi.weekYear=Fn,fi.isoWeekYear=Wn,fi.quarter=fi.quarters=zn,fi.month=ve,fi.daysInMonth=ye,fi.week=fi.weeks=Ne,fi.isoWeek=fi.isoWeeks=De,fi.weeksInYear=Vn,fi.isoWeeksInYear=Bn,fi.date=ai,fi.day=fi.days=Fe,fi.weekday=We,fi.isoWeekday=Be,fi.dayOfYear=Gn,fi.hour=fi.hours=jo,fi.minute=fi.minutes=si,fi.second=fi.seconds=ui,fi.millisecond=fi.milliseconds=ci,fi.utcOffset=Bt,fi.utc=Yt,fi.local=Ut,fi.parseZone=zt,fi.hasAlignedHourOffset=Gt,fi.isDST=Xt,fi.isLocal=qt,fi.isUtcOffset=Zt,fi.isUtc=$t,fi.isUTC=$t,fi.zoneAbbr=Kn,fi.zoneName=qn,fi.dates=O("dates accessor is deprecated. Use date instead.",ai),fi.months=O("months accessor is deprecated. Use month instead",ve),fi.years=O("years accessor is deprecated. Use year instead",_o),fi.zone=O("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",Vt),fi.isDSTShifted=O("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Kt);var hi=N.prototype;hi.calendar=D,hi.longDateFormat=A,hi.invalidDate=P,hi.ordinal=L,hi.preparse=Jn,hi.postformat=Jn,hi.relativeTime=H,hi.pastFuture=x,hi.set=k,hi.months=fe,hi.monthsShort=he,hi.monthsParse=pe,hi.monthsRegex=we,hi.monthsShortRegex=me,hi.week=Re,hi.firstDayOfYear=Me,hi.firstDayOfWeek=ke,hi.weekdays=Le,hi.weekdaysMin=xe,hi.weekdaysShort=He,hi.weekdaysParse=je,hi.weekdaysRegex=Ve,hi.weekdaysShortRegex=Ye,hi.weekdaysMinRegex=Ue,hi.isPM=Ze,hi.meridiem=$e,tt("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10,n=1===S(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th";return e+n}}),t.lang=O("moment.lang is deprecated. Use moment.locale instead.",tt),t.langData=O("moment.langData is deprecated. Use moment.localeData instead.",ot);var di=Math.abs,pi=yr("ms"),gi=yr("s"),vi=yr("m"),yi=yr("h"),mi=yr("d"),wi=yr("w"),bi=yr("M"),Ci=yr("y"),Si=br("milliseconds"),_i=br("seconds"),Ei=br("minutes"),Oi=br("hours"),Ti=br("days"),Ri=br("months"),ki=br("years"),Mi=Math.round,Ni={ss:44,s:45,m:45,h:22,d:26,M:11},Di=Math.abs,Ai=Lt.prototype;return Ai.isValid=At,Ai.abs=sr,Ai.add=ur,Ai.subtract=cr,Ai.as=gr,Ai.asMilliseconds=pi,Ai.asSeconds=gi,Ai.asMinutes=vi,Ai.asHours=yi,Ai.asDays=mi,Ai.asWeeks=wi,Ai.asMonths=bi,Ai.asYears=Ci,Ai.valueOf=vr,Ai._bubble=hr,Ai.clone=mr,Ai.get=wr,Ai.milliseconds=Si,Ai.seconds=_i,Ai.minutes=Ei,Ai.hours=Oi,Ai.days=Ti,Ai.weeks=Cr,Ai.months=Ri,Ai.years=ki,Ai.humanize=Tr,Ai.toISOString=kr,Ai.toString=kr,Ai.toJSON=kr,Ai.locale=En,Ai.localeData=On,Ai.toIsoString=O("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",kr),Ai.lang=ii,Y("X",0,0,"unix"),Y("x",0,0,"valueOf"),K("x",io),K("X",lo),J("X",function(e,t,n){n._d=new Date(1e3*parseFloat(e,10))}),J("x",function(e,t,n){n._d=new Date(S(e))}),t.version="2.23.0",r(Rt),t.fn=fi,t.min=Mt,t.max=Nt,t.now=Jo,t.utc=d,t.unix=Zn,t.months=nr,t.isDate=u,t.locale=tt,t.invalid=y,t.duration=Jt,t.isMoment=b,t.weekdays=or,t.parseZone=$n,t.localeData=ot,t.isDuration=Ht,t.monthsShort=rr,t.weekdaysMin=ar,t.defineLocale=nt,t.updateLocale=rt,t.locales=it,t.weekdaysShort=ir,t.normalizeUnits=j,t.relativeTimeRounding=Er,t.relativeTimeThreshold=Or,t.calendarFormat=on,t.prototype=fi,t.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"GGGG-[W]WW",MONTH:"YYYY-MM"},t},e.exports=t()}).call(t,n(166)(e))},function(e,t,n){function r(e){return n(o(e))}function o(e){var t=i[e];if(!(t+1))throw new Error("Cannot find module '"+e+"'.");return t}var i={"./af":296,"./af.js":296,"./ar":297,"./ar-dz":298,"./ar-dz.js":298,"./ar-kw":299,"./ar-kw.js":299,"./ar-ly":300,"./ar-ly.js":300,"./ar-ma":301,"./ar-ma.js":301,"./ar-sa":302,"./ar-sa.js":302,"./ar-tn":303,"./ar-tn.js":303,"./ar.js":297,"./az":304,"./az.js":304,"./be":305,"./be.js":305,"./bg":306,"./bg.js":306,"./bm":307,"./bm.js":307,"./bn":308,"./bn.js":308,"./bo":309,"./bo.js":309,"./br":310,"./br.js":310,"./bs":311,"./bs.js":311,"./ca":312,"./ca.js":312,"./cs":313,"./cs.js":313,"./cv":314,"./cv.js":314,"./cy":315,"./cy.js":315,"./da":316,"./da.js":316,"./de":317,"./de-at":318,"./de-at.js":318,"./de-ch":319,"./de-ch.js":319,"./de.js":317,"./dv":320,"./dv.js":320,"./el":321,"./el.js":321,"./en-au":322,"./en-au.js":322,"./en-ca":323,"./en-ca.js":323,"./en-gb":324,"./en-gb.js":324,"./en-ie":325,"./en-ie.js":325,"./en-il":326,"./en-il.js":326,"./en-nz":327,"./en-nz.js":327,"./eo":328,"./eo.js":328,"./es":329,"./es-do":330,"./es-do.js":330,"./es-us":331,"./es-us.js":331,"./es.js":329,"./et":332,"./et.js":332,"./eu":333,"./eu.js":333,"./fa":334,"./fa.js":334,"./fi":335,"./fi.js":335,"./fo":336,"./fo.js":336,"./fr":337,"./fr-ca":338,"./fr-ca.js":338,"./fr-ch":339,"./fr-ch.js":339,"./fr.js":337,"./fy":340,"./fy.js":340,"./gd":341,"./gd.js":341,"./gl":342,"./gl.js":342,"./gom-latn":343,"./gom-latn.js":343,"./gu":344,"./gu.js":344,"./he":345,"./he.js":345,"./hi":346,"./hi.js":346,"./hr":347,"./hr.js":347,"./hu":348,"./hu.js":348,"./hy-am":349,"./hy-am.js":349,"./id":350,"./id.js":350,"./is":351,"./is.js":351,"./it":352,"./it.js":352,"./ja":353,"./ja.js":353,"./jv":354,"./jv.js":354,"./ka":355,"./ka.js":355,"./kk":356,"./kk.js":356,"./km":357,"./km.js":357,"./kn":358,"./kn.js":358,"./ko":359,"./ko.js":359,"./ku":360,"./ku.js":360,"./ky":361,"./ky.js":361,"./lb":362,"./lb.js":362,"./lo":363,"./lo.js":363,"./lt":364,"./lt.js":364,"./lv":365,"./lv.js":365,"./me":366,"./me.js":366,"./mi":367,"./mi.js":367,"./mk":368,"./mk.js":368,"./ml":369,"./ml.js":369,"./mn":370,"./mn.js":370,"./mr":371,"./mr.js":371,"./ms":372,"./ms-my":373,"./ms-my.js":373,"./ms.js":372,"./mt":374,"./mt.js":374,"./my":375,"./my.js":375,"./nb":376,"./nb.js":376,"./ne":377,"./ne.js":377,"./nl":378,"./nl-be":379,"./nl-be.js":379,"./nl.js":378,"./nn":380,"./nn.js":380,"./pa-in":381,"./pa-in.js":381,"./pl":382,"./pl.js":382,"./pt":383,"./pt-br":384,"./pt-br.js":384,"./pt.js":383,"./ro":385,"./ro.js":385,"./ru":386,"./ru.js":386,"./sd":387,"./sd.js":387,"./se":388,"./se.js":388,"./si":389,"./si.js":389,"./sk":390,"./sk.js":390,"./sl":391,"./sl.js":391,"./sq":392,"./sq.js":392,"./sr":393,"./sr-cyrl":394,"./sr-cyrl.js":394,"./sr.js":393,"./ss":395,"./ss.js":395,"./sv":396,"./sv.js":396,"./sw":397,"./sw.js":397,"./ta":398,"./ta.js":398,"./te":399,"./te.js":399,"./tet":400,"./tet.js":400,"./tg":401,"./tg.js":401,"./th":402,"./th.js":402,"./tl-ph":403,"./tl-ph.js":403,"./tlh":404,"./tlh.js":404,"./tr":405,"./tr.js":405,"./tzl":406,"./tzl.js":406,"./tzm":407,"./tzm-latn":408,"./tzm-latn.js":408,"./tzm.js":407,"./ug-cn":409,"./ug-cn.js":409,"./uk":410,"./uk.js":410,"./ur":411,"./ur.js":411,"./uz":412,"./uz-latn":413,"./uz-latn.js":413,"./uz.js":412,"./vi":414,"./vi.js":414,"./x-pseudo":415,"./x-pseudo.js":415,"./yo":416,"./yo.js":416,"./zh-cn":417,"./zh-cn.js":417,"./zh-hk":418,"./zh-hk.js":418,"./zh-tw":419,"./zh-tw.js":419};r.keys=function(){return Object.keys(i)},r.resolve=o,e.exports=r,r.id=618},function(e,t){},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var n=0;n=0&&(n.select[r].selected=!0),(0,a.stopImmediatePropagation)(e),e.preventDefault();break;case s.KEY_CODES.ARROW_DOWN:o<=n.select.length-1&&(n.select[o].selected=!0),(0,a.stopImmediatePropagation)(e),e.preventDefault()}};c.prototype.open=function(){this._opened=!0,this.refreshDimensions(),this.select.style.display="",this.instance.addHook("beforeKeyDown",f)},c.prototype.close=function(){this._opened=!1,this.select.style.display="none",this.instance.removeHook("beforeKeyDown",f)},c.prototype.focus=function(){this.select.focus()},c.prototype.refreshValue=function(){var e=this.instance.getSourceDataAtCell(this.row,this.prop);this.originalValue=e,this.setValue(e),this.refreshDimensions()},c.prototype.refreshDimensions=function(){if(this.state===l.EditorState.EDITING)if(this.TD=this.getEditedCell(),this.TD){var e,t=(0,i.offset)(this.TD),n=(0,i.offset)(this.instance.rootElement),r=(0,i.getScrollableElement)(this.TD),o=this.checkEditorSection(),a=(0,i.outerWidth)(this.TD)+1,s=(0,i.outerHeight)(this.TD)+1,u=t.top-n.top-1-(r.scrollTop||0),c=t.left-n.left-1-(r.scrollLeft||0);switch(o){case"top":e=(0,i.getCssTransform)(this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.holder.parentNode);break;case"left":e=(0,i.getCssTransform)(this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.holder.parentNode);break;case"top-left-corner":e=(0,i.getCssTransform)(this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.holder.parentNode);break;case"bottom-left-corner":e=(0,i.getCssTransform)(this.instance.view.wt.wtOverlays.bottomLeftCornerOverlay.clone.wtTable.holder.parentNode);break;case"bottom":e=(0,i.getCssTransform)(this.instance.view.wt.wtOverlays.bottomOverlay.clone.wtTable.holder.parentNode)}0===this.instance.getSelectedLast()[0]&&(u+=1),0===this.instance.getSelectedLast()[1]&&(c+=1);var f=this.select.style;e&&-1!==e?f[e[0]]=e[1]:(0,i.resetCssTransform)(this.select);var h=(0,i.getComputedStyle)(this.TD);parseInt(h.borderTopWidth,10)>0&&(s-=1),parseInt(h.borderLeftWidth,10)>0&&(a-=1),f.height="".concat(s,"px"),f.minWidth="".concat(a,"px"),f.top="".concat(u,"px"),f.left="".concat(c,"px"),f.margin="0px"}else this.close()},c.prototype.getEditedCell=function(){var e,t=this.checkEditorSection();switch(t){case"top":e=this.instance.view.wt.wtOverlays.topOverlay.clone.wtTable.getCell({row:this.row,col:this.col}),this.select.style.zIndex=101;break;case"corner":e=this.instance.view.wt.wtOverlays.topLeftCornerOverlay.clone.wtTable.getCell({row:this.row,col:this.col}),this.select.style.zIndex=103;break;case"left":e=this.instance.view.wt.wtOverlays.leftOverlay.clone.wtTable.getCell({row:this.row,col:this.col}),this.select.style.zIndex=102;break;default:e=this.instance.getCell(this.row,this.col),this.select.style.zIndex=""}return-1!==e&&-2!==e?e:void 0};var h=c;t.default=h},function(e,t,n){"use strict";function r(e,t,n,r,i,a,s){var l=[],u=[];s.className&&(t.className?t.className="".concat(t.className," ").concat(s.className):t.className=s.className),s.readOnly&&l.push(s.readOnlyCellClassName),!1===s.valid&&s.invalidCellClassName?l.push(s.invalidCellClassName):u.push(s.invalidCellClassName),!1===s.wordWrap&&s.noWordWrapClassName&&l.push(s.noWordWrapClassName),!a&&s.placeholder&&l.push(s.placeholderCellClassName),(0,o.removeClass)(t,u),(0,o.addClass)(t,l)}t.__esModule=!0,t.default=void 0;var o=n(1),i=r;t.default=i},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n,r,o,u,f){for(var h=f.allowHtml?"html":"text",d=c.cloneNode(!0),p=arguments.length,g=new Array(p>7?p-7:0),v=7;v0&&void 0!==arguments[0]&&arguments[0],n=e.getSelectedRangeLast();if(n){for(var r=n.getTopLeftCorner(),o=r.row,i=r.col,a=n.getBottomRightCorner(),s=a.row,l=a.col,u=[],c=o;c<=s;c+=1)for(var f=i;f<=l;f+=1){var h=e.getCellMeta(c,f);if("checkbox"!==h.type)return;if(!0!==h.readOnly){void 0===h.checkedTemplate&&(h.checkedTemplate=!0),void 0===h.uncheckedTemplate&&(h.uncheckedTemplate=!1);var d=e.getDataAtCell(c,f);!1===t?[h.checkedTemplate,h.checkedTemplate.toString()].includes(d)?u.push([c,f,h.uncheckedTemplate]):[h.uncheckedTemplate,h.uncheckedTemplate.toString(),null,void 0].includes(d)&&u.push([c,f,h.checkedTemplate]):u.push([c,f,h.uncheckedTemplate])}}u.length>0&&e.setDataAtCell(u)}}function p(t){var n=e.getSelectedRangeLast();if(n)for(var r=n.getTopLeftCorner(),o=n.getBottomRightCorner(),i=r.row;i<=o.row;i++)for(var a=r.col;a<=o.col;a++){var s=e.getCellMeta(i,a);if("checkbox"!==s.type)return;var l=e.getCell(i,a);if(null==l)t(i,a,s);else{var u=l.querySelectorAll("input[type=checkbox]");u.length>0&&!s.readOnly&&t(u)}}}for(var b=arguments.length,S=new Array(b>7?b-7:0),_=7;_6?l-6:0),c=6;c7?c-7:0),h=7;h7?c-7:0),h=7;h-1;return n=r.isValid()&&r.format("x")===o.format("x")||!o.isValid()||i?r:o,n.format(t)}t.__esModule=!0,t.default=o,t.correctFormat=i;var a=r(n(67)),s=n(421),l=n(26)},function(e,t,n){"use strict";function r(e,t){var n=e;null==n&&(n=""),this.allowEmpty&&""===n?t(!0):t(""!==n&&(0,o.isNumeric)(e))}t.__esModule=!0,t.default=r;var o=n(9)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){var n=this.timeFormat||"h:mm:ss a",r=!0,o=e;null===o&&(o=""),o=/^\d{3,}$/.test(o)?parseInt(o,10):o;var s=/^\d{1,2}$/.test(o);s&&(o+=":00");var l=(0,i.default)(o,a,!0).isValid()?(0,i.default)(o):(0,i.default)(o,n),u=l.isValid(),c=(0,i.default)(o,n,!0).isValid()&&!s;if(this.allowEmpty&&""===o&&(u=!0,c=!0),u||(r=!1),!u&&c&&(r=!0),u&&!c)if(!0===this.correctFormat){var f=l.format(n),h=this.instance.runHooks("unmodifyRow",this.row),d=this.instance.runHooks("unmodifyCol",this.col);this.instance.setDataAtCell(h,d,f,"timeValidator"),r=!0}else r=!1;t(r)}t.__esModule=!0,t.default=o;var i=r(n(67)),a=["YYYY-MM-DDTHH:mm:ss.SSSZ","X","x"]},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var r=n(26),o=n(19),i=n(49),a="autocomplete",s={editor:(0,r.getEditor)(a),renderer:(0,o.getRenderer)(a),validator:(0,i.getValidator)(a)};t.default=s},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var r=n(26),o=n(19),i="checkbox",a={editor:(0,r.getEditor)(i),renderer:(0,o.getRenderer)(i)};t.default=a},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var r=n(26),o=n(19),i=n(49),a="date",s={editor:(0,r.getEditor)(a),renderer:(0,o.getRenderer)("autocomplete"),validator:(0,i.getValidator)(a)};t.default=s},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var r=n(26),o=n(19),i=n(49),a="dropdown",s={editor:(0,r.getEditor)(a),renderer:(0,o.getRenderer)("autocomplete"),validator:(0,i.getValidator)("autocomplete")};t.default=s},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var r=n(26),o=n(19),i="handsontable",a={editor:(0,r.getEditor)(i),renderer:(0,o.getRenderer)("autocomplete")};t.default=a},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var r=n(26),o=n(19),i=n(49),a="numeric",s={editor:(0,r.getEditor)(a),renderer:(0,o.getRenderer)(a),validator:(0,i.getValidator)(a),dataType:"number"};t.default=s},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var r=n(26),o=n(19),i="password",a={editor:(0,r.getEditor)(i),renderer:(0,o.getRenderer)(i),copyable:!1};t.default=a},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var r=n(26),o=n(19),i="text",a={editor:(0,r.getEditor)(i),renderer:(0,o.getRenderer)(i)};t.default=a},function(e,t,n){"use strict";t.__esModule=!0,t.default=void 0;var r=n(26),o=n(19),i=n(49),a="time",s={editor:(0,r.getEditor)("text"),renderer:(0,o.getRenderer)("text"),validator:(0,i.getValidator)(a)};t.default=s},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t,n){var r=this;this.instance=e,this.priv=t,this.GridSettings=n,this.dataSource=this.instance.getSettings().data,this.cachedLength=null,this.skipCache=!1,this.latestSourceRowsCount=0,this.dataSource&&this.dataSource[0]?this.duckSchema=this.recursiveDuckSchema(this.dataSource[0]):this.duckSchema={},this.createMap(),this.interval=f.default.create(function(){return r.clearLengthCache()},"15fps"),this.instance.addHook("skipLengthCache",function(e){return r.onSkipLengthCache(e)}),this.onSkipLengthCache(500)}t.__esModule=!0,t.default=void 0;var a=r(n(422)),s=n(122),l=n(121),u=n(2),c=n(3),f=r(n(645)),h=n(9),d=r(n(646));i.prototype.DESTINATION_RENDERER=1,i.prototype.DESTINATION_CLIPBOARD_GENERATOR=2,i.prototype.recursiveDuckSchema=function(e){return(0,u.duckSchema)(e)},i.prototype.recursiveDuckColumns=function(e,t,n){var r,i=this,a=t,s=n;return void 0===a&&(a=0,s=""),"object"!==o(e)||Array.isArray(e)||(0,u.objectEach)(e,function(e,t){null===e?(r=s+t,i.colToPropCache.push(r),i.propToColCache.set(r,a),a+=1):a=i.recursiveDuckColumns(e,a,"".concat(t,"."))}),a},i.prototype.createMap=function(){var e,t=this.getSchema();if(void 0===t)throw new Error("trying to create `columns` definition but you didn't provide `schema` nor `data`");this.colToPropCache=[],this.propToColCache=new d.default;var n=this.instance.getSettings().columns;if(n){var r=this.instance.getSettings().maxCols,o=Math.min(r,n.length),i=0,a=!1,s=(0,u.deepObjectSize)(t);for("function"==typeof n&&(o=s>0?s:this.instance.countSourceCols(),a=!0),e=0;e1&&void 0!==arguments[1]?arguments[1]:1,r=arguments.length>2?arguments[2]:void 0,o=0,i=e;("number"!=typeof i||i>=this.instance.countSourceRows())&&(i=this.instance.countSourceRows());var a=this.instance.runHooks("beforeCreateRow",i,n,r);if(!1===a)return 0;for(var s=this.instance.getSettings().maxRows,l=this.instance.countCols(),c=function(){var e=null;"array"===t.instance.dataType?t.instance.getSettings().dataSchema?e=(0,u.deepClone)(t.getSchema()):(e=[],(0,h.rangeEach)(l-1,function(){return e.push(null)})):"function"===t.instance.dataType?e=t.instance.getSettings().dataSchema(i):(e={},(0,u.deepExtend)(e,t.getSchema())),i===t.instance.countSourceRows()?t.dataSource.push(e):t.spliceData(i,0,e),o+=1};o1&&void 0!==arguments[1]?arguments[1]:1,n=arguments.length>2?arguments[2]:void 0;if(!this.instance.isColumnModificationAllowed())throw new Error("Cannot create new column. When data source in an object, you can only have as much columns as defined in first data row, data schema or in the 'columns' setting.If you want to be able to add new columns, you have to use array datasource.");var r,o,i=this.instance.countSourceRows(),a=this.dataSource,s=this.instance.countCols(),u="number"!=typeof e||e>=s?s:e,c=0;this.instance.runHooks("beforeCreateCol",u,t,n),o=u;for(var f=this.instance.getSettings().maxCols;c=this.instance.countCols()){if(i>0)for(var h=0;h1&&void 0!==arguments[1]?arguments[1]:1,n=arguments.length>2?arguments[2]:void 0,r="number"!=typeof e?-t:e,o=this.instance.runHooks("modifyRemovedAmount",t,r);r=(this.instance.countSourceRows()+r)%this.instance.countSourceRows();var i=this.visualRowsToPhysical(r,o),a=this.instance.runHooks("beforeRemoveRow",r,o,i,n);if(!1!==a){var s=this.dataSource,l=this.filterData(r,o);l&&(s.length=0,Array.prototype.push.apply(s,l)),this.instance.runHooks("afterRemoveRow",r,o,i,n),this.instance.forceFullRender=!0}},i.prototype.removeCol=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,n=arguments.length>2?arguments[2]:void 0;if("object"===this.instance.dataType||this.instance.getSettings().columns)throw new Error("cannot remove column with object data source or columns option specified");var r="number"!=typeof e?-t:e;r=(this.instance.countCols()+r)%this.instance.countCols();var o=this.visualColumnsToPhysical(r,t),i=o.slice(0).sort(function(e,t){return t-e}),a=this.instance.runHooks("beforeRemoveCol",r,t,o,n);if(!1!==a){for(var s=!0,l=i.length,u=this.dataSource,c=0;c3?a-3:0),l=3;l3?a-3:0),l=3;l-1){var a=t.split("."),s=r;if(!s)return null;for(var l=0,c=a.length;l-1){var c,f=t.split("."),h=a,d=0;for(d=0,c=f.length-1;dthis.delay&&(this._then=e-t%this.delay,this.func())}else this.func()}}]),e}(),u=l;t.default=u},function(e,t,n){"use strict";function r(e){return r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r(e)}function o(){function e(e){return null!==e&&!n(e)&&("string"==typeof e||"number"==typeof e)}function t(e){return null!==e&&("object"===r(e)||"function"==typeof e)}function n(e){return e!=e}var o={arrayMap:[],weakMap:new WeakMap};return{get:function(n){return e(n)?o.arrayMap[n]:t(n)?o.weakMap.get(n):void 0},set:function(n,r){if(e(n))o.arrayMap[n]=r;else{if(!t(n))throw new Error("Invalid key type");o.weakMap.set(n,r)}},delete:function(n){e(n)?delete o.arrayMap[n]:t(n)&&o.weakMap.delete(n)}}}t.__esModule=!0,t.default=void 0;var i=o;t.default=i},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n){function r(e){var r="function"==typeof t.settings.enterMoves?t.settings.enterMoves(event):t.settings.enterMoves;e?n.transformStart(-r.row,-r.col):n.transformStart(r.row,r.col,!0)}function o(e){e?n.transformEnd(-1,0):n.transformStart(-1,0)}function f(e){e?n.transformEnd(1,0):n.transformStart(1,0)}function h(e){e?n.transformEnd(0,1):n.transformStart(0,1)}function d(e){e?n.transformEnd(0,-1):n.transformStart(0,-1)}function p(l){if(e.isListening()&&(e.runHooks("beforeKeyDown",l),!w&&229!==l.keyCode&&!(0,s.isImmediatePropagationStopped)(l)&&(t.lastKeyCode=l.keyCode,n.isSelected()))){var u=(l.ctrlKey||l.metaKey)&&!l.altKey;if(!v||v.isWaiting()||(0,a.isMetaKey)(l.keyCode)||(0,a.isCtrlMetaKey)(l.keyCode)||u||y.isEditorOpened()){var p,g=l.shiftKey?n.setRangeEnd:n.setRangeStart;switch(l.keyCode){case a.KEY_CODES.A:!y.isEditorOpened()&&u&&(e.selectAll(),l.preventDefault(),(0,s.stopPropagation)(l));break;case a.KEY_CODES.ARROW_UP:y.isEditorOpened()&&!v.isWaiting()&&y.closeEditorAndSaveChanges(u),o(l.shiftKey),l.preventDefault(),(0,s.stopPropagation)(l);break;case a.KEY_CODES.ARROW_DOWN:y.isEditorOpened()&&!v.isWaiting()&&y.closeEditorAndSaveChanges(u),f(l.shiftKey),l.preventDefault(),(0,s.stopPropagation)(l);break;case a.KEY_CODES.ARROW_RIGHT:y.isEditorOpened()&&!v.isWaiting()&&y.closeEditorAndSaveChanges(u),h(l.shiftKey),l.preventDefault(),(0,s.stopPropagation)(l);break;case a.KEY_CODES.ARROW_LEFT:y.isEditorOpened()&&!v.isWaiting()&&y.closeEditorAndSaveChanges(u),d(l.shiftKey),l.preventDefault(),(0,s.stopPropagation)(l);break;case a.KEY_CODES.TAB:p="function"==typeof t.settings.tabMoves?t.settings.tabMoves(l):t.settings.tabMoves,l.shiftKey?n.transformStart(-p.row,-p.col):n.transformStart(p.row,p.col,!0),l.preventDefault(),(0,s.stopPropagation)(l);break;case a.KEY_CODES.BACKSPACE:case a.KEY_CODES.DELETE:e.emptySelectedCells(),y.prepareEditor(),l.preventDefault();break;case a.KEY_CODES.F2:v&&v.enableFullEditMode(),y.openEditor(null,l),l.preventDefault();break;case a.KEY_CODES.ENTER:y.isEditorOpened()?(v&&v.state!==c.EditorState.WAITING&&y.closeEditorAndSaveChanges(u),r(l.shiftKey)):e.getSettings().enterBeginsEditing?(v&&v.enableFullEditMode(),y.openEditor(null,l)):r(l.shiftKey),l.preventDefault(),(0,s.stopImmediatePropagation)(l);break;case a.KEY_CODES.ESCAPE:y.isEditorOpened()&&(y.closeEditorAndRestoreOriginalValue(u),v.focus()),l.preventDefault();break;case a.KEY_CODES.HOME:l.ctrlKey||l.metaKey?g.call(n,new i.CellCoords(0,n.selectedRange.current().from.col)):g.call(n,new i.CellCoords(n.selectedRange.current().from.row,0)),l.preventDefault(),(0,s.stopPropagation)(l);break;case a.KEY_CODES.END:l.ctrlKey||l.metaKey?g.call(n,new i.CellCoords(e.countRows()-1,n.selectedRange.current().from.col)):g.call(n,new i.CellCoords(n.selectedRange.current().from.row,e.countCols()-1)),l.preventDefault(),(0,s.stopPropagation)(l);break;case a.KEY_CODES.PAGE_UP:n.transformStart(-e.countVisibleRows(),0),l.preventDefault(),(0,s.stopPropagation)(l);break;case a.KEY_CODES.PAGE_DOWN:n.transformStart(e.countVisibleRows(),0),l.preventDefault(),(0,s.stopPropagation)(l)}}else y.openEditor("",l)}}function g(){function t(e,t,n){"TD"===n.nodeName&&(v&&v.enableFullEditMode(),y.openEditor(null,e))}e.addHook("afterDocumentKeyDown",p),m.addEventListener(document.documentElement,"keydown",function(t){w||e.runHooks("afterDocumentKeyDown",t)}),m.addEventListener(document.documentElement,"compositionstart",function(t){!w&&v&&!v.isOpened()&&e.isListening()&&y.openEditor("",t)}),e.view.wt.update("onCellDblClick",t)}var v,y=this,m=new u.default(e),w=!1,b=!1;this.lockEditor=function(){b=!0},this.unlockEditor=function(){b=!1},this.destroyEditor=function(e){b||this.closeEditor(e)},this.getActiveEditor=function(){return v},this.prepareEditor=function(){if(!b)if(v&&v.isWaiting())this.closeEditor(!1,!1,function(e){e&&y.prepareEditor()});else{var t=e.selection.selectedRange.current().highlight.row,n=e.selection.selectedRange.current().highlight.col,r=e.colToProp(n),o=e.getCell(t,n),i=e.getSourceDataAtCell(e.runHooks("modifyRow",t),n),a=e.getCellMeta(t,n),s=e.getCellEditor(a);s?(v=(0,l.getEditorInstance)(s,e),v.prepare(t,n,r,o,i,a)):v=void 0}},this.isEditorOpened=function(){return v&&v.isOpened()},this.openEditor=function(e,t){if(v){var n=v.cellProperties.readOnly;n?t&&t.keyCode===a.KEY_CODES.ENTER&&r():v.beginEditing(e,t)}},this.closeEditor=function(e,t,n){v?v.finishEditing(e,t,n):n&&n(!1)},this.closeEditorAndSaveChanges=function(e){return this.closeEditor(!1,e)},this.closeEditorAndRestoreOriginalValue=function(e){return this.closeEditor(!0,e)},this.destroy=function(){w=!0},g()}t.__esModule=!0,t.default=void 0;var i=n(8),a=n(32),s=n(18),l=n(26),u=r(n(10)),c=n(74),f=new WeakMap;o.getInstance=function(e,t,n,r){var i=f.get(e);return i||(i=new o(e,t,n,r),f.set(e,i)),i};var h=o;t.default=h},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){return s(e)||a(e,t)||i()}function i(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function a(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{r||null==s.return||s.return()}finally{if(o)throw i}}return n}function s(e){if(Array.isArray(e))return e}function l(e){var t=this,n=this;this.eventManager=new c.default(e),this.instance=e,this.settings=e.getSettings(),this.selectionMouseDown=!1;var r=e.rootElement.getAttribute("style");r&&e.rootElement.setAttribute("data-originalstyle",r),(0,u.addClass)(e.rootElement,"handsontable");var o,i=document.createElement("TABLE");(0,u.addClass)(i,"htCore"),e.getSettings().tableClassName&&(0,u.addClass)(i,e.getSettings().tableClassName),this.THEAD=document.createElement("THEAD"),i.appendChild(this.THEAD),this.TBODY=document.createElement("TBODY"),i.appendChild(this.TBODY),e.table=i,e.container.insertBefore(i,e.container.firstChild),this.eventManager.addEventListener(e.rootElement,"mousedown",function(e){t.selectionMouseDown=!0,n.isTextSelectionAllowed(e.target)||(p(),e.preventDefault(),window.focus())}),this.eventManager.addEventListener(e.rootElement,"mouseup",function(){t.selectionMouseDown=!1}),this.eventManager.addEventListener(e.rootElement,"mousemove",function(e){t.selectionMouseDown&&!n.isTextSelectionAllowed(e.target)&&(t.settings.fragmentSelection&&p(),e.preventDefault())}),this.eventManager.addEventListener(document.documentElement,"keyup",function(t){e.selection.isInProgress()&&!t.shiftKey&&e.selection.finish()}),this.isMouseDown=function(){return o},this.eventManager.addEventListener(document.documentElement,"mouseup",function(t){e.selection.isInProgress()&&(0,f.isLeftClick)(t)&&e.selection.finish(),o=!1,((0,u.isOutsideInput)(document.activeElement)||!e.selection.isSelected()&&!(0,f.isRightClick)(t))&&e.unlisten()}),this.eventManager.addEventListener(document.documentElement,"contextmenu",function(t){e.selection.isInProgress()&&(0,f.isRightClick)(t)&&(e.selection.finish(),o=!1)}),this.eventManager.addEventListener(document.documentElement,"touchend",function(){e.selection.isInProgress()&&e.selection.finish(),o=!1}),this.eventManager.addEventListener(document.documentElement,"mousedown",function(t){var r=t.target,i=t.x||t.clientX,a=t.y||t.clientY,s=t.target;if(!o&&e.rootElement){if(s===e.view.wt.wtTable.holder){var l=(0,u.getScrollbarWidth)();if(document.elementFromPoint(i+l,a)!==e.view.wt.wtTable.holder||document.elementFromPoint(i,a+l)!==e.view.wt.wtTable.holder)return}else for(;s!==document.documentElement;){if(null===s){if(t.isTargetWebComponent)break;return}if(s===e.rootElement)return;s=s.parentNode}var c="function"==typeof n.settings.outsideClickDeselects?n.settings.outsideClickDeselects(r):n.settings.outsideClickDeselects;c?e.deselectCell():e.destroyEditor(!1,!1)}}),this.eventManager.addEventListener(i,"selectstart",function(e){n.settings.fragmentSelection||(0,u.isInput)(e.target)||e.preventDefault()});var a={debug:function(){return n.settings.debug},externalRowCalculator:this.instance.getPlugin("autoRowSize")&&this.instance.getPlugin("autoRowSize").isEnabled(),table:i,preventOverflow:function(){return t.settings.preventOverflow},stretchH:function(){return n.settings.stretchH},data:e.getDataAtCell,totalRows:function(){return e.countRows()},totalColumns:function(){return e.countCols()},fixedColumnsLeft:function(){return n.settings.fixedColumnsLeft},fixedRowsTop:function(){return n.settings.fixedRowsTop},fixedRowsBottom:function(){return n.settings.fixedRowsBottom},minSpareRows:function(){return n.settings.minSpareRows},renderAllRows:n.settings.renderAllRows,rowHeaders:function(){var t=[];return e.hasRowHeaders()&&t.push(function(e,t){return n.appendRowHeader(e,t)}),e.runHooks("afterGetRowHeaderRenderers",t),t},columnHeaders:function(){var t=[];return e.hasColHeaders()&&t.push(function(e,t){n.appendColHeader(e,t)}),e.runHooks("afterGetColumnHeaderRenderers",t),t},columnWidth:e.getColWidth,rowHeight:e.getRowHeight,cellRenderer:function(e,t,r){var o=n.instance.getCellMeta(e,t),i=n.instance.colToProp(t),a=n.instance.getDataAtRowProp(e,i);n.instance.hasHook("beforeValueRender")&&(a=n.instance.runHooks("beforeValueRender",a,o)),n.instance.runHooks("beforeRenderer",r,e,t,i,a,o),n.instance.getCellRenderer(o)(n.instance,r,e,t,i,a,o),n.instance.runHooks("afterRenderer",r,e,t,i,a,o)},selections:n.instance.selection.highlight,hideBorderOnMouseDownOver:function(){return n.settings.fragmentSelection},onCellMouseDown:function(t,r,i,a){var s={row:!1,column:!1,cell:!1};e.listen(),n.activeWt=a,o=!0,e.runHooks("beforeOnCellMouseDown",t,r,i,s),(0,f.isImmediatePropagationStopped)(t)||(-1!==r.row&&(0,d.handleMouseEvent)(t,{coords:r,selection:e.selection,controller:s}),e.runHooks("afterOnCellMouseDown",t,r,i),n.activeWt=n.wt)},onCellContextMenu:function(t,r,i,a){n.activeWt=a,o=!1,e.selection.isInProgress()&&e.selection.finish(),e.runHooks("beforeOnCellContextMenu",t,r,i),(0,f.isImmediatePropagationStopped)(t)||(e.runHooks("afterOnCellContextMenu",t,r,i),n.activeWt=n.wt)},onCellMouseOut:function(t,r,o,i){n.activeWt=i,e.runHooks("beforeOnCellMouseOut",t,r,o),(0,f.isImmediatePropagationStopped)(t)||(e.runHooks("afterOnCellMouseOut",t,r,o),n.activeWt=n.wt)},onCellMouseOver:function(t,r,i,a){var s={row:!1,column:!1,cell:!1};n.activeWt=a,e.runHooks("beforeOnCellMouseOver",t,r,i,s),(0,f.isImmediatePropagationStopped)(t)||(o&&(0,d.handleMouseEvent)(t,{coords:r,selection:e.selection,controller:s}),e.runHooks("afterOnCellMouseOver",t,r,i),n.activeWt=n.wt)},onCellMouseUp:function(t,r,o,i){n.activeWt=i,e.runHooks("beforeOnCellMouseUp",t,r,o),e.runHooks("afterOnCellMouseUp",t,r,o),n.activeWt=n.wt},onCellCornerMouseDown:function(t){t.preventDefault(),e.runHooks("afterOnCellCornerMouseDown",t)},onCellCornerDblClick:function(t){t.preventDefault(),e.runHooks("afterOnCellCornerDblClick",t)},beforeDraw:function(e,t){n.beforeRender(e,t)},onDraw:function(e){n.onDraw(e)},onScrollVertically:function(){e.runHooks("afterScrollVertically")},onScrollHorizontally:function(){e.runHooks("afterScrollHorizontally")},onBeforeRemoveCellClassNames:function(){return e.runHooks("beforeRemoveCellClassNames")},onAfterDrawSelection:function(t,n,r,o){return e.runHooks("afterDrawSelection",t,n,r,o)},onBeforeDrawBorders:function(t,n){e.runHooks("beforeDrawBorders",t,n)},onBeforeTouchScroll:function(){e.runHooks("beforeTouchScroll")},onAfterMomentumScroll:function(){e.runHooks("afterMomentumScroll")},onBeforeStretchingColumnWidth:function(t,n){return e.runHooks("beforeStretchingColumnWidth",t,n)},onModifyRowHeaderWidth:function(t){return e.runHooks("modifyRowHeaderWidth",t)},onModifyGetCellCoords:function(t,n,r){return e.runHooks("modifyGetCellCoords",t,n,r)},viewportRowCalculatorOverride:function(t){var r=e.countRows(),o=n.settings.viewportRowRenderingOffset;if("auto"===o&&n.settings.fixedRowsTop&&(o=10),"number"==typeof o&&(t.startRow=Math.max(t.startRow-o,0),t.endRow=Math.min(t.endRow+o,r-1)),"auto"===o){var i=t.startRow+t.endRow-t.startRow,a=Math.ceil(i/r*12);t.startRow=Math.max(t.startRow-a,0),t.endRow=Math.min(t.endRow+a,r-1)}e.runHooks("afterViewportRowCalculatorOverride",t)},viewportColumnCalculatorOverride:function(t){var r=e.countCols(),o=n.settings.viewportColumnRenderingOffset;if("auto"===o&&n.settings.fixedColumnsLeft&&(o=10),"number"==typeof o&&(t.startColumn=Math.max(t.startColumn-o,0),t.endColumn=Math.min(t.endColumn+o,r-1)),"auto"===o){var i=t.startColumn+t.endColumn-t.startColumn,a=Math.ceil(i/r*12);t.startRow=Math.max(t.startColumn-a,0),t.endColumn=Math.min(t.endColumn+a,r-1)}e.runHooks("afterViewportColumnCalculatorOverride",t)},rowHeaderWidth:function(){return n.settings.rowHeaderWidth},columnHeaderHeight:function(){var t=e.runHooks("modifyColumnHeaderHeight");return n.settings.columnHeaderHeight||t}};e.runHooks("beforeInitWalkontable",a),this.wt=new h.default(a),this.activeWt=this.wt,this.eventManager.addEventListener(n.wt.wtTable.spreader,"mousedown",function(e){e.target===n.wt.wtTable.spreader&&3===e.which&&(0,f.stopPropagation)(e)}),this.eventManager.addEventListener(n.wt.wtTable.spreader,"contextmenu",function(e){e.target===n.wt.wtTable.spreader&&3===e.which&&(0,f.stopPropagation)(e)}),this.eventManager.addEventListener(document.documentElement,"click",function(){n.settings.observeDOMVisibility&&n.wt.drawInterrupted&&(n.instance.forceFullRender=!0,n.render())})}t.__esModule=!0,t.default=void 0;var u=n(1),c=r(n(10)),f=n(18),h=r(n(8)),d=n(423),p=function(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()};l.prototype.isTextSelectionAllowed=function(e){if((0,u.isInput)(e))return!0;var t=(0,u.isChildOf)(e,this.instance.view.wt.wtTable.spreader);return!(!0!==this.settings.fragmentSelection||!t)||(!("cell"!==this.settings.fragmentSelection||!this.isSelectedOnlyCell()||!t)||!(this.settings.fragmentSelection||!this.isCellEdited()||!this.isSelectedOnlyCell()))},l.prototype.isSelectedOnlyCell=function(){var e=this.instance.getSelectedLast()||[],t=o(e,4),n=t[0],r=t[1],i=t[2],a=t[3];return void 0!==n&&n===i&&r===a},l.prototype.isCellEdited=function(){var e=this.instance.getActiveEditor();return e&&e.isOpened()},l.prototype.beforeRender=function(e,t){e&&this.instance.runHooks("beforeRender",this.instance.forceFullRender,t)},l.prototype.onDraw=function(e){e&&this.instance.runHooks("afterRender",this.instance.forceFullRender)},l.prototype.render=function(){this.wt.draw(!this.instance.forceFullRender),this.instance.forceFullRender=!1,this.instance.renderCall=!1},l.prototype.getCellAtCoords=function(e,t){var n=this.wt.getCell(e,t);return n<0?null:n},l.prototype.scrollViewport=function(e,t,n,r,o){return this.wt.scrollViewport(e,t,n,r,o)},l.prototype.scrollViewportHorizontally=function(e,t,n){return this.wt.scrollViewportHorizontally(e,t,n)},l.prototype.scrollViewportVertically=function(e,t,n){return this.wt.scrollViewportVertically(e,t,n)},l.prototype.appendRowHeader=function(e,t){if(t.firstChild){var n=t.firstChild;if(!(0,u.hasClass)(n,"relative"))return(0,u.empty)(t),void this.appendRowHeader(e,t);this.updateCellHeader(n.querySelector(".rowHeader"),e,this.instance.getRowHeader)}else{var r=document.createElement("div"),o=document.createElement("span");r.className="relative",o.className="rowHeader",this.updateCellHeader(o,e,this.instance.getRowHeader),r.appendChild(o),t.appendChild(r)}this.instance.runHooks("afterGetRowHeader",e,t)},l.prototype.appendColHeader=function(e,t){if(t.firstChild){var n=t.firstChild;(0,u.hasClass)(n,"relative")?this.updateCellHeader(n.querySelector(".colHeader"),e,this.instance.getColHeader):((0,u.empty)(t),this.appendColHeader(e,t))}else{var r=document.createElement("div"),o=document.createElement("span");r.className="relative",o.className="colHeader",this.updateCellHeader(o,e,this.instance.getColHeader),r.appendChild(o),t.appendChild(r)}this.instance.runHooks("afterGetColHeader",e,t)},l.prototype.updateCellHeader=function(e,t,n){var r=t,o=this.wt.wtOverlays.getParentOverlay(e)||this.wt;let i=n(t);e.parentNode&&((0,u.hasClass)(e,"colHeader")?r=o.wtTable.columnFilter.sourceToRendered(t):(0,u.hasClass)(e,"rowHeader")&&(r=o.wtTable.rowFilter.sourceToRendered(t),(this.wt.selections.hasOwnProperty("selectedRows")||this.wt.selections.hasOwnProperty("selectAll"))&&(this.wt.selections.selectedRows.includes(t)||this.wt.selections.selectAll)&&(i=''))),r>-1?(0,u.fastInnerHTML)(e,i):((0,u.fastInnerText)(e,String.fromCharCode(160)),(0,u.addClass)(e,"cornerHeader"),(0,u.fastInnerHTML)(e,'"))},l.prototype.maximumVisibleElementWidth=function(e){var t=this.wt.wtViewport.getWorkspaceWidth(),n=t-e;return n>0?n:0},l.prototype.maximumVisibleElementHeight=function(e){var t=this.wt.wtViewport.getWorkspaceHeight(),n=t-e;return n>0?n:0},l.prototype.mainViewIsActive=function(){return this.wt===this.activeWt},l.prototype.destroy=function(){this.wt.destroy(),this.eventManager.destroy()};var g=l;t.default=g},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:[];r(this,e),this.hot=t,this.data=n,this.dataType="array",this.colToProp=function(){},this.propToCol=function(){}}return i(e,[{key:"getData",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.data;return e&&(t=this.getByRange({row:0,col:0},{row:Math.max(this.countRows()-1,0),col:Math.max(this.countColumns()-1,0)},!0)),t}},{key:"setData",value:function(e){this.data=e}},{key:"getAtColumn",value:function(e){var t=this,n=[];return(0,s.arrayEach)(this.data,function(r){var o,i=t.colToProp(e);o="string"==typeof i?(0,a.getProperty)(r,i):"function"==typeof i?i(r):r[i],n.push(o)}),n}},{key:"getAtRow",value:function(e){return this.data[e]}},{key:"getAtCell",value:function(e,t){var n=null,r=this.hot.runHooks("modifyRowData",e),o=isNaN(r)?r:this.data[e];if(o){var i=this.colToProp(t);n="string"==typeof i?(0,a.getProperty)(o,i):"function"==typeof i?i(this.data.slice(e,e+1)[0]):o[i]}return n}},{key:"getByRange",value:function(e,t){var n=this,r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=Math.min(e.row,t.row),i=Math.min(e.col,t.col),a=Math.max(e.row,t.row),s=Math.max(e.col,t.col),u=[];return(0,l.rangeEach)(o,a,function(e){var t,o=n.getAtRow(e);"array"===n.dataType?t=o.slice(i,s+1):"object"===n.dataType&&(t=r?[]:{},(0,l.rangeEach)(i,s,function(e){var i=n.colToProp(e);r?t.push(o[i]):t[i]=o[i]})),u.push(t)}),u}},{key:"countRows",value:function(){return Array.isArray(this.data)?this.data.length:0}},{key:"countColumns",value:function(){var e=0;return Array.isArray(this.data)&&("array"===this.dataType?e=this.data[0].length:"object"===this.dataType&&(e=Object.keys(this.data[0]).length)),e}},{key:"destroy",value:function(){this.data=null,this.hot=null}}]),e}(),c=u;t.default=c},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}t.__esModule=!0,t.default=void 0;var i,a=r(n(11)),s=(i={languageCode:"en-US"},o(i,a.CONTEXTMENU_ITEMS_ROW_ABOVE,"Insert row above"),o(i,a.CONTEXTMENU_ITEMS_ROW_BELOW,"Insert row below"),o(i,a.CONTEXTMENU_ITEMS_INSERT_LEFT,"Insert column left"),o(i,a.CONTEXTMENU_ITEMS_INSERT_RIGHT,"Insert column right"),o(i,a.CONTEXTMENU_ITEMS_REMOVE_ROW,["Remove row","Remove rows"]),o(i,a.CONTEXTMENU_ITEMS_REMOVE_COLUMN,["Remove column","Remove columns"]),o(i,a.CONTEXTMENU_ITEMS_UNDO,"Undo"),o(i,a.CONTEXTMENU_ITEMS_REDO,"Redo"),o(i,a.CONTEXTMENU_ITEMS_READ_ONLY,"Read only"),o(i,a.CONTEXTMENU_ITEMS_CLEAR_COLUMN,"Clear column"),o(i,a.CONTEXTMENU_ITEMS_ALIGNMENT,"Alignment"),o(i,a.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT,"Left"),o(i,a.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER,"Center"),o(i,a.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT,"Right"),o(i,a.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY,"Justify"),o(i,a.CONTEXTMENU_ITEMS_ALIGNMENT_TOP,"Top"),o(i,a.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE,"Middle"),o(i,a.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM,"Bottom"),o(i,a.CONTEXTMENU_ITEMS_FREEZE_COLUMN,"Freeze column"),o(i,a.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN,"Unfreeze column"),o(i,a.CONTEXTMENU_ITEMS_BORDERS,"Borders"),o(i,a.CONTEXTMENU_ITEMS_BORDERS_TOP,"Top"),o(i,a.CONTEXTMENU_ITEMS_BORDERS_RIGHT,"Right"),o(i,a.CONTEXTMENU_ITEMS_BORDERS_BOTTOM,"Bottom"),o(i,a.CONTEXTMENU_ITEMS_BORDERS_LEFT,"Left"),o(i,a.CONTEXTMENU_ITEMS_REMOVE_BORDERS,"Remove border(s)"), o(i,a.CONTEXTMENU_ITEMS_ADD_COMMENT,"Add comment"),o(i,a.CONTEXTMENU_ITEMS_EDIT_COMMENT,"Edit comment"),o(i,a.CONTEXTMENU_ITEMS_REMOVE_COMMENT,"Delete comment"),o(i,a.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT,"Read-only comment"),o(i,a.CONTEXTMENU_ITEMS_MERGE_CELLS,"Merge cells"),o(i,a.CONTEXTMENU_ITEMS_UNMERGE_CELLS,"Unmerge cells"),o(i,a.CONTEXTMENU_ITEMS_COPY,"Copy"),o(i,a.CONTEXTMENU_ITEMS_CUT,"Cut"),o(i,a.CONTEXTMENU_ITEMS_NESTED_ROWS_INSERT_CHILD,"Insert child row"),o(i,a.CONTEXTMENU_ITEMS_NESTED_ROWS_DETACH_CHILD,"Detach from parent"),o(i,a.CONTEXTMENU_ITEMS_HIDE_COLUMN,["Hide column","Hide columns"]),o(i,a.CONTEXTMENU_ITEMS_SHOW_COLUMN,["Show column","Show columns"]),o(i,a.CONTEXTMENU_ITEMS_HIDE_ROW,["Hide row","Hide rows"]),o(i,a.CONTEXTMENU_ITEMS_SHOW_ROW,["Show row","Show rows"]),o(i,a.FILTERS_CONDITIONS_NONE,"None"),o(i,a.FILTERS_CONDITIONS_EMPTY,"Is empty"),o(i,a.FILTERS_CONDITIONS_NOT_EMPTY,"Is not empty"),o(i,a.FILTERS_CONDITIONS_EQUAL,"Is equal to"),o(i,a.FILTERS_CONDITIONS_NOT_EQUAL,"Is not equal to"),o(i,a.FILTERS_CONDITIONS_BEGINS_WITH,"Begins with"),o(i,a.FILTERS_CONDITIONS_ENDS_WITH,"Ends with"),o(i,a.FILTERS_CONDITIONS_CONTAINS,"Contains"),o(i,a.FILTERS_CONDITIONS_NOT_CONTAIN,"Does not contain"),o(i,a.FILTERS_CONDITIONS_GREATER_THAN,"Greater than"),o(i,a.FILTERS_CONDITIONS_GREATER_THAN_OR_EQUAL,"Greater than or equal to"),o(i,a.FILTERS_CONDITIONS_LESS_THAN,"Less than"),o(i,a.FILTERS_CONDITIONS_LESS_THAN_OR_EQUAL,"Less than or equal to"),o(i,a.FILTERS_CONDITIONS_BETWEEN,"Is between"),o(i,a.FILTERS_CONDITIONS_NOT_BETWEEN,"Is not between"),o(i,a.FILTERS_CONDITIONS_AFTER,"After"),o(i,a.FILTERS_CONDITIONS_BEFORE,"Before"),o(i,a.FILTERS_CONDITIONS_TODAY,"Today"),o(i,a.FILTERS_CONDITIONS_TOMORROW,"Tomorrow"),o(i,a.FILTERS_CONDITIONS_YESTERDAY,"Yesterday"),o(i,a.FILTERS_VALUES_BLANK_CELLS,"Blank cells"),o(i,a.FILTERS_DIVS_FILTER_BY_CONDITION,"Filter by condition"),o(i,a.FILTERS_DIVS_FILTER_BY_VALUE,"Filter by value"),o(i,a.FILTERS_LABELS_CONJUNCTION,"And"),o(i,a.FILTERS_LABELS_DISJUNCTION,"Or"),o(i,a.FILTERS_BUTTONS_SELECT_ALL,"Select all"),o(i,a.FILTERS_BUTTONS_CLEAR,"Clear"),o(i,a.FILTERS_BUTTONS_OK,"OK"),o(i,a.FILTERS_BUTTONS_CANCEL,"Cancel"),o(i,a.FILTERS_BUTTONS_PLACEHOLDER_SEARCH,"Search"),o(i,a.FILTERS_BUTTONS_PLACEHOLDER_VALUE,"Value"),o(i,a.FILTERS_BUTTONS_PLACEHOLDER_SECOND_VALUE,"Second value"),i),l=s;t.default=l},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){u(e,t)}function i(){return c()}t.__esModule=!0,t.registerPhraseFormatter=t.register=o,t.getPhraseFormatters=t.getAll=i;var a=r(n(46)),s=r(n(652)),l=(0,a.default)("phraseFormatters"),u=l.register,c=l.getValues;o("pluralize",s.default)},function(e,t,n){"use strict";function r(e,t){var n=Array.isArray(e)&&Number.isInteger(t);return n?e[t]:e}t.__esModule=!0,t.default=r},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){return p(e)(t)}t.__esModule=!0,t.createHighlight=o;var i=r(n(46)),a=r(n(654)),s=r(n(655)),l=r(n(656)),u=r(n(657)),c=r(n(658)),f=r(n(659)),h=(0,i.default)("highlight/types"),d=h.register,p=h.getItem;d("active-header",a.default),d("area",s.default),d("cell",l.default),d("custom-selection",u.default),d("fill",c.default),d("header",f.default)},function(e,t,n){"use strict";function r(e){var t=e.activeHeaderClassName,n=new o.Selection({highlightHeaderClassName:t});return n}t.__esModule=!0,t.default=void 0;var o=n(8),i=r;t.default=i},function(e,t,n){"use strict";function r(e){var t=e.layerLevel,n=e.areaCornerVisible,r=new o.Selection({className:"area",markIntersections:!0,layerLevel:Math.min(t,7),border:{width:1,color:"#4b89ff",cornerVisible:n}});return r}t.__esModule=!0,t.default=void 0;var o=n(8),i=r;t.default=i},function(e,t,n){"use strict";function r(e){var t=e.cellCornerVisible,n=new o.Selection({className:"current",border:{width:2,color:"#4b89ff",cornerVisible:t}});return n}t.__esModule=!0,t.default=void 0;var o=n(8),i=r;t.default=i},function(e,t,n){"use strict";function r(e){var t=e.border,n=e.cellRange,r=new o.Selection(t,n);return r}t.__esModule=!0,t.default=void 0;var o=n(8),i=r;t.default=i},function(e,t,n){"use strict";function r(){var e=new o.Selection({className:"fill",border:{width:1,color:"#ff0000"}});return e}t.__esModule=!0,t.default=void 0;var o=n(8),i=r;t.default=i},function(e,t,n){"use strict";function r(e){var t=e.headerClassName,n=e.rowClassName,r=e.columnClassName,i=new o.Selection({className:"highlight",highlightHeaderClassName:t,highlightRowClassName:n,highlightColumnClassName:r});return i}t.__esModule=!0,t.default=void 0;var o=n(8),i=r;t.default=i},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function i(e,t){return l(e)||s(e,t)||a()}function a(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function s(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{r||null==s.return||s.return()}finally{if(o)throw i}}return n}function l(e){if(Array.isArray(e))return e}function u(){var e=c(["Unsupported format of the selection ranges was passed. To select cells pass \n the coordinates as an array of arrays ([[rowStart, columnStart/columnPropStart, rowEnd, columnEnd/columnPropEnd]]) \n or as an array of CellRange objects."]);return u=function(){return e},e}function c(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function f(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function h(e,t){for(var n=0;n2&&void 0!==arguments[2]&&arguments[2],r="multiple"===this.settings.selectionMode,o=(0,w.isUndefined)(t)?(0,y.isPressedCtrlKey)():t,i=e.row<0,a=e.col<0,s=i&&a;i&&(e.row=0),a&&(e.col=0),this.selectedByCorner=s,this.runLocalHooks("beforeSetRangeStart".concat(n?"Only":""),e),(!r||r&&!o&&(0,w.isUndefined)(t))&&this.selectedRange.clear(),this.selectedRange.add(e),0===this.getLayerLevel()&&(this.selectedByRowHeader.clear(),this.selectedByColumnHeader.clear()),!s&&a&&this.selectedByRowHeader.add(this.getLayerLevel()),!s&&i&&this.selectedByColumnHeader.add(this.getLayerLevel()),n||this.setRangeEnd(e)}},{key:"setRangeStartOnly",value:function(e,t){this.setRangeStart(e,t,!0)}},{key:"setRangeEnd",value:function(e){if(!this.selectedRange.isEmpty()){this.runLocalHooks("beforeSetRangeEnd",e),this.begin();var t=this.selectedRange.current();"single"!==this.settings.selectionMode&&t.setTo(new v.CellCoords(e.row,e.col)),this.highlight.getCell().clear(),this.highlight.isEnabledFor(p.CELL_TYPE)&&this.highlight.getCell().add(this.selectedRange.current().highlight);var n=this.getLayerLevel();n=1)&&(r.add(t.from).add(t.to),1===n&&(this.highlight.useLayerLevel(n-1).createOrGetArea().add(this.selectedRange.previous().from),this.highlight.useLayerLevel(n))),this.highlight.isEnabledFor(p.HEADER_TYPE)&&("single"===this.settings.selectionMode?o.add(t.highlight):o.add(t.from).add(t.to)),this.isSelectedByRowHeader()){var a=this.tableProps.countCols()===t.getWidth();a&&i.add(new v.CellCoords(t.from.row,-1)).add(new v.CellCoords(t.to.row,-1))}if(this.isSelectedByColumnHeader()){var s=this.tableProps.countRows()===t.getHeight();s&&i.add(new v.CellCoords(-1,t.from.col)).add(new v.CellCoords(-1,t.to.col))}this.runLocalHooks("afterSetRangeEnd",e)}}},{key:"isMultiple",value:function(){var e=(0,m.createObjectPropListener)(!this.selectedRange.current().isSingle());return this.runLocalHooks("afterIsMultipleSelection",e),e.value}},{key:"transformStart",value:function(e,t,n){this.setRangeStart(this.transformation.transformStart(e,t,n))}},{key:"transformEnd",value:function(e,t){this.setRangeEnd(this.transformation.transformEnd(e,t))}},{key:"getLayerLevel",value:function(){return this.selectedRange.size()-1}},{key:"isSelected",value:function(){return!this.selectedRange.isEmpty()}},{key:"isSelectedByRowHeader",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.getLayerLevel();return-1===e?this.selectedByRowHeader.size>0:this.selectedByRowHeader.has(e)}},{key:"isSelectedByColumnHeader",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.getLayerLevel();return-1===e?this.selectedByColumnHeader.size>0:this.selectedByColumnHeader.has(e)}},{key:"isSelectedByAnyHeader",value:function(){return this.isSelectedByRowHeader(-1)||this.isSelectedByColumnHeader(-1)}},{key:"isSelectedByCorner",value:function(){return this.selectedByCorner}},{key:"inInSelection",value:function(e){return this.selectedRange.includes(e)}},{key:"isCellCornerVisible",value:function(){return this.settings.fillHandle&&!this.tableProps.isEditorOpened()&&!this.isMultiple()}},{key:"isAreaCornerVisible",value:function(e){return(!Number.isInteger(e)||e===this.getLayerLevel())&&(this.settings.fillHandle&&!this.tableProps.isEditorOpened()&&this.isMultiple())}},{key:"clear",value:function(){this.selectedRange.clear(),this.highlight.clear()}},{key:"deselect",value:function(){this.isSelected()&&(this.inProgress=!1,this.clear(),this.runLocalHooks("afterDeselect"))}},{key:"selectAll",value:function(){this.clear(),this.setRangeStart(new v.CellCoords(-1,-1)),this.selectedByRowHeader.add(this.getLayerLevel()),this.selectedByColumnHeader.add(this.getLayerLevel()),this.setRangeEnd(new v.CellCoords(this.tableProps.countRows()-1,this.tableProps.countCols()-1))}},{key:"selectCells",value:function(e){var t=this,n=(0,_.detectSelectionType)(e);if(n===_.SELECTION_TYPE_EMPTY)return!1;if(n===_.SELECTION_TYPE_UNRECOGNIZED)throw new Error((0,E.toSingleLine)(u()));var r=(0,_.normalizeSelectionFactory)(n,{propToCol:function(e){return t.tableProps.propToCol(e)},keepDirection:!0}),o=this.tableProps.countRows(),a=this.tableProps.countCols(),s=!e.some(function(e){var t=r(e),n=i(t,4),s=n[0],l=n[1],u=n[2],c=n[3],f=(0,_.isValidCoord)(s,o)&&(0,_.isValidCoord)(l,a)&&(0,_.isValidCoord)(u,o)&&(0,_.isValidCoord)(c,a);return!f});return s&&(this.clear(),(0,b.arrayEach)(e,function(e){var n=r(e),o=i(n,4),a=o[0],s=o[1],l=o[2],u=o[3];t.setRangeStartOnly(new v.CellCoords(a,s),!1),t.setRangeEnd(new v.CellCoords(l,u)),t.finish()})),s}},{key:"selectColumns",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e,n="string"==typeof e?this.tableProps.propToCol(e):e,r="string"==typeof t?this.tableProps.propToCol(t):t,o=this.tableProps.countCols(),i=(0,_.isValidCoord)(n,o)&&(0,_.isValidCoord)(r,o);return i&&(this.setRangeStartOnly(new v.CellCoords(-1,n)),this.setRangeEnd(new v.CellCoords(this.tableProps.countRows()-1,r)),this.finish()),i}},{key:"selectRows",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e,n=this.tableProps.countRows(),r=(0,_.isValidCoord)(e,n)&&(0,_.isValidCoord)(t,n);return r&&(this.setRangeStartOnly(new v.CellCoords(e,-1)),this.setRangeEnd(new v.CellCoords(t,this.tableProps.countCols()-1)),this.finish()),r}}]),e}();(0,m.mixin)(O,C.default);var T=O;t.default=T},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:0,n=this.size()+t-1;return n>=0&&(e=this.ranges[n]),e}},{key:Symbol.iterator,value:function(){return this.ranges[Symbol.iterator]()}}]),e}(),l=s;t.default=l},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var n=0;no-1?n&&l>0&&!(a&&h.row>=o-a-1)?(this.runLocalHooks("insertRowRequire",o),o=this.options.countRows()):f&&(r.row=1-o,r.col=h.col+r.col===i-1?1-i:1):f&&h.row+r.row<0&&h.col+r.col>=0&&(r.row=o-1,r.col=h.col+r.col===0?i-1:-1),h.col+r.col>i-1?n&&u>0?(this.runLocalHooks("insertColRequire",i),i=this.options.countCols()):c&&(r.row=h.row+r.row===o-1?1-o:1,r.col=1-i):c&&h.col+r.col<0&&h.row+r.row>=0&&(r.row=h.row+r.row===0?o-1:-1,r.col=i-1);var d=new s.CellCoords(h.row+r.row,h.col+r.col),p=0,g=0;return d.row<0?(p=-1,d.row=0):d.row>0&&d.row>=o&&(p=1,d.row=o-1),d.col<0?(g=-1,d.col=0):d.col>0&&d.col>=i&&(g=1,d.col=i-1),this.runLocalHooks("afterTransformStart",d,p,g),d}},{key:"transformEnd",value:function(e,t){var n=new s.CellCoords(e,t);this.runLocalHooks("beforeTransformEnd",n);var r=this.options.countRows(),o=this.options.countCols(),i=this.range.current(),a=new s.CellCoords(i.to.row+n.row,i.to.col+n.col),l=0,u=0;return a.row<0?(l=-1,a.row=0):a.row>0&&a.row>=r&&(l=1,a.row=r-1),a.col<0?(u=-1,a.col=0):a.col>0&&a.col>=o&&(u=1,a.col=o-1),this.runLocalHooks("afterTransformEnd",a,l,u),a}}]),e}();(0,l.mixin)(c,u.default);var f=c;t.default=f},function(e,t,n){"use strict";function r(e){var t="undefined"!=typeof window&&window.jQuery;t&&(t.fn.handsontable=function(t){var n,r=this.first(),o=r.data("handsontable");if("string"!=typeof t){var i=t||{};return o?o.updateSettings(i):(o=new e.Core(r[0],i),r.data("handsontable",o),o.init()),r}if(o){if(void 0===o[t])throw new Error("Handsontable do not provide action: ".concat(t));for(var a,s=arguments.length,l=new Array(s>1?s-1:0),u=1;u0&&void 0!==arguments[0]?arguments[0]:{from:0,to:this.hot.countCols()-1},n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{from:0,to:this.hot.countRows()-1},r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o="number"==typeof t?{from:t,to:t}:t,a="number"==typeof n?{from:n,to:n}:n;(0,O.rangeEach)(o.from,o.to,function(t){if(r||void 0===e.widths[t]&&!e.hot._getColWidthFromSettings(t)){var n=e.samplesGenerator.generateColumnSamples(t,a);(0,b.arrayEach)(n,function(t){var n=i(t,2),r=n[0],o=n[1];return e.ghostTable.addColumn(r,o)})}}),this.ghostTable.columns.length&&(this.ghostTable.getWidths(function(t,n){e.widths[t]=n}),this.ghostTable.clean())}},{key:"calculateAllColumnsWidth",value:function(){var e=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{from:0,to:this.hot.countRows()-1},r=0,o=this.hot.countCols()-1,i=null;this.inProgress=!0;var a=function a(){if(!e.hot)return(0,C.cancelAnimationFrame)(i),void(e.inProgress=!1);e.calculateColumnsWidth({from:r,to:Math.min(r+t.CALCULATION_STEP,o)},n),r=r+t.CALCULATION_STEP+1,r=0&&(this.calculateColumnsWidth({from:0,to:s},n),this.firstCalculation=!1,r=s+1),r>=0),Math.min(e,n)}},{key:"getColumnWidth",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],r=t;return void 0===r&&(r=this.widths[e],n&&"number"==typeof r&&(r=Math.max(r,M.ViewportColumnsCalculator.DEFAULT_WIDTH))),r}},{key:"getFirstVisibleColumn",value:function(){var e=this.hot.view.wt;return e.wtViewport.columnsVisibleCalculator?e.wtTable.getFirstVisibleColumn():e.wtViewport.columnsRenderCalculator?e.wtTable.getFirstRenderedColumn():-1}},{key:"getLastVisibleColumn",value:function(){var e=this.hot.view.wt;return e.wtViewport.columnsVisibleCalculator?e.wtTable.getLastVisibleColumn():e.wtViewport.columnsRenderCalculator?e.wtTable.getLastRenderedColumn():-1}},{key:"findColumnsWhereHeaderWasChanged",value:function(){var e=this.hot.getColHeader(),t=N.get(this),n=t.cachedColumnHeaders,r=(0,b.arrayReduce)(e,function(e,t,r){var o=n.length;return(o-10&&void 0!==arguments[0]?arguments[0]:[];t.length?(0,b.arrayEach)(t,function(t){e.widths[t]=void 0}):this.widths.length=0}},{key:"isNeedRecalculate",value:function(){return!!(0,b.arrayFilter)(this.widths,function(e){return void 0===e}).length}},{ key:"onBeforeRender",value:function(){var e=this.hot.renderCall,t=this.hot.countRows(),n=this.getFirstVisibleColumn(),r=this.getLastVisibleColumn();null!==n&&null!==r&&t&&(this.calculateColumnsWidth({from:n,to:r},void 0,e),this.isNeedRecalculate()&&!this.inProgress&&this.calculateAllColumnsWidth())}},{key:"onAfterLoadData",value:function(){var e=this;this.hot.view?this.recalculateAllColumnsWidth():setTimeout(function(){e.hot&&e.recalculateAllColumnsWidth()},0)}},{key:"onBeforeChange",value:function(e){var t=this,n=(0,b.arrayMap)(e,function(e){var n=i(e,2),r=n[1];return t.hot.propToCol(r)});this.clearCache(n)}},{key:"onBeforeColumnResize",value:function(e,t,n){var r=t;return n&&(this.calculateColumnsWidth(e,void 0,!0),r=this.getColumnWidth(e,void 0,!1)),r}},{key:"onAfterInit",value:function(){N.get(this).cachedColumnHeaders=this.hot.getColHeader()}},{key:"destroy",value:function(){this.ghostTable.clean(),f(d(t.prototype),"destroy",this).call(this)}}]),t}(w.default);(0,T.registerPlugin)("autoColumnSize",D);var A=D;t.default=A},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e){return l(e)||s(e)||a()}function a(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function s(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}function l(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t-1&&o.col>-1){var a=this.getSelectionData();this.hot.runHooks("beforeAutofill",o,i,a);var s=(0,O.getDeltas)(o,i,a,r),l=a;if(["up","left"].indexOf(r)>-1){l=[];var u=null,c=null;if("up"===r){u=i.row-o.row+1,c=u%a.length;for(var f=0;fe.row))t=new E.CellCoords(e.row,r.col);else{if(!this.directions.includes(O.DIRECTIONS.horizontal))return;t=new E.CellCoords(r.row,e.col)}return this.reduceSelectionAreaIfNeeded(t)}},{key:"showBorder",value:function(e){var t=this.getCoordsOfDragAndDropBorders(e);t&&this.redrawBorders(t)}},{key:"addRow",value:function(){var e=this;this.hot._registerTimeout(setTimeout(function(){e.hot.alter(T,void 0,1,"".concat(e.pluginName,".fill")),e.addingStarted=!1},R))}},{key:"addNewRowIfNeeded",value:function(){if(this.hot.selection.highlight.getFill().cellRange&&!1===this.addingStarted&&this.autoInsertRow){var e=this.hot.getSelectedLast(),t=this.hot.selection.highlight.getFill().getCorners(),n=this.hot.countRows();e[2]t&&e.clientX<=n}},{key:"registerEvents",value:function(){var e=this;this.eventManager.addEventListener(document.documentElement,"mouseup",function(){return e.onMouseUp()}),this.eventManager.addEventListener(document.documentElement,"mousemove",function(t){return e.onMouseMove(t)})}},{key:"onCellCornerDblClick",value:function(){var e=this.selectAdjacent();e&&this.fillIn()}},{key:"onAfterCellCornerMouseDown",value:function(){this.handleDraggedCells=1,this.mouseDownOnCellCorner=!0}},{key:"onBeforeCellMouseOver",value:function(e){this.mouseDownOnCellCorner&&!this.hot.view.isMouseDown()&&this.handleDraggedCells&&(this.handleDraggedCells+=1,this.showBorder(e),this.addNewRowIfNeeded())}},{key:"onMouseUp",value:function(){this.handleDraggedCells&&(this.handleDraggedCells>1&&this.fillIn(),this.handleDraggedCells=0,this.mouseDownOnCellCorner=!1)}},{key:"onMouseMove",value:function(e){var t=this.getIfMouseWasDraggedOutside(e);!1===this.addingStarted&&this.handleDraggedCells>0&&t?(this.mouseDragOutside=!0,this.addingStarted=!0):this.mouseDragOutside=!1,this.mouseDragOutside&&this.autoInsertRow&&this.addRow()}},{key:"clearMappedSettings",value:function(){this.directions.length=0,this.autoInsertRow=!1}},{key:"mapSettings",value:function(){var e=(0,O.getMappedFillHandleSetting)(this.hot.getSettings().fillHandle);this.directions=e.directions,this.autoInsertRow=e.autoInsertRow}},{key:"destroy",value:function(){d(g(t.prototype),"destroy",this).call(this)}}]),t}(w.default);(0,_.registerPlugin)("autofill",k);var M=k;t.default=M},function(e,t,n){"use strict";function r(e,t,n,r){var o=n.length,i=n?n[0].length:0,a=[],s=t.row-e.row,l=t.col-e.col;if(-1!==["down","up"].indexOf(r)){for(var u=[],c=0;c<=l;c++){var f=parseInt(n[0][c],10),h=parseInt(n[o-1][c],10),d=("down"===r?h-f:f-h)/(o-1)||0;u.push(d)}a.push(u)}if(-1!==["right","left"].indexOf(r))for(var p=0;p<=s;p++){var g=parseInt(n[p][0],10),v=parseInt(n[p][i-1],10),y=("right"===r?v-g:g-v)/(i-1)||0;a.push([y])}return a}function o(e,t){var n,r,o;return t[0]===e[0]&&t[1]e[3]?(o="right",n=new l.CellCoords(t[0],e[3]+1),r=new l.CellCoords(t[2],t[3])):t[0]e[2]&&t[1]===e[1]&&(o="down",n=new l.CellCoords(e[2]+1,t[1]),r=new l.CellCoords(t[2],t[3])),{directionOfDrag:o,startOfDragCoords:n,endOfDragCoords:r}}function i(e){var t={};return!0===e?(t.directions=Object.keys(u),t.autoInsertRow=!0):(0,a.isObject)(e)?((0,s.isDefined)(e.autoInsertRow)?e.direction===u.horizontal?t.autoInsertRow=!1:t.autoInsertRow=e.autoInsertRow:t.autoInsertRow=!1,(0,s.isDefined)(e.direction)?t.directions=[e.direction]:t.directions=Object.keys(u)):"string"==typeof e?(t.directions=[e],t.autoInsertRow=!0):(t.directions=[],t.autoInsertRow=!1),t}t.__esModule=!0,t.getDeltas=r,t.getDragDirectionAndRange=o,t.getMappedFillHandleSetting=i,t.DIRECTIONS=void 0;var a=n(2),s=n(14),l=n(8),u={horizontal:"horizontal",vertical:"vertical"};t.DIRECTIONS=u},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t){return l(e)||s(e,t)||a()}function a(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function s(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{r||null==s.return||s.return()}finally{if(o)throw i}}return n}function l(e){if(Array.isArray(e))return e}function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function c(e,t){return!t||"object"!==o(t)&&"function"!=typeof t?f(e):t}function f(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function h(e,t,n){return h="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(e,t,n){var r=d(e,t);if(r){var o=Object.getOwnPropertyDescriptor(r,t);return o.get?o.get.call(n):o.value}},h(e,t,n||e)}function d(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&(e=p(e),null!==e););return e}function p(e){return p=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},p(e)}function g(e,t){for(var n=0;n=0?r=n.hot.getDataAtCell(e,t):-1===e&&(r=n.hot.getColHeader(t)),{value:r}}),n.firstCalculation=!0,n.inProgress=!1,n.addHook("beforeRowResize",function(e,t,r){return n.onBeforeRowResize(e,t,r)}),n}return y(t,e),v(t,null,[{key:"CALCULATION_STEP",get:function(){return 50}},{key:"SYNC_CALCULATION_LIMIT",get:function(){return 500}}]),v(t,[{key:"isEnabled",value:function(){return!0===this.hot.getSettings().autoRowSize||(0,E.isObject)(this.hot.getSettings().autoRowSize)}},{key:"enablePlugin",value:function(){var e=this;this.enabled||(this.setSamplingOptions(),this.addHook("afterLoadData",function(){return e.onAfterLoadData()}),this.addHook("beforeChange",function(t){return e.onBeforeChange(t)}),this.addHook("beforeColumnMove",function(){return e.recalculateAllRowsHeight()}),this.addHook("beforeColumnResize",function(){return e.recalculateAllRowsHeight()}),this.addHook("beforeColumnSort",function(){return e.clearCache()}),this.addHook("beforeRender",function(t){return e.onBeforeRender(t)}),this.addHook("beforeRowMove",function(t,n){return e.onBeforeRowMove(t,n)}),this.addHook("modifyRowHeight",function(t,n){return e.getRowHeight(n,t)}),this.addHook("modifyColumnHeaderHeight",function(){return e.getColumnHeaderHeight()}),h(p(t.prototype),"enablePlugin",this).call(this))}},{key:"disablePlugin",value:function(){h(p(t.prototype),"disablePlugin",this).call(this)}},{key:"calculateRowsHeight",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{from:0,to:this.hot.countRows()-1},n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{from:0,to:this.hot.countCols()-1},r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o="number"==typeof t?{from:t,to:t}:t,a="number"==typeof n?{from:n,to:n}:n;if(null!==this.hot.getColHeader(0)){var s=this.samplesGenerator.generateRowSamples(-1,a);this.ghostTable.addColumnHeadersRow(s.get(-1))}(0,O.rangeEach)(o.from,o.to,function(t){if(r||void 0===e.heights[t]){var n=e.samplesGenerator.generateRowSamples(t,a);(0,b.arrayEach)(n,function(t){var n=i(t,2),r=n[0],o=n[1];return e.ghostTable.addRow(r,o)})}}),this.ghostTable.rows.length&&(this.ghostTable.getHeights(function(t,n){e.heights[t]=n}),this.ghostTable.clean())}},{key:"calculateAllRowsHeight",value:function(){var e=this,n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{from:0,to:this.hot.countCols()-1},r=0,o=this.hot.countRows()-1,i=null;this.inProgress=!0;var a=function a(){if(!e.hot)return(0,C.cancelAnimationFrame)(i),void(e.inProgress=!1);e.calculateRowsHeight({from:r,to:Math.min(r+t.CALCULATION_STEP,o)},n),r=r+t.CALCULATION_STEP+1,r=0&&(this.calculateRowsHeight({from:0,to:s},n),this.firstCalculation=!1,r=s+1),r>=0),Math.min(e,n)}},{key:"getRowHeight",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:void 0,n=t;return void 0!==this.heights[e]&&this.heights[e]>(t||0)&&(n=this.heights[e]),n}},{key:"getColumnHeaderHeight",value:function(){return this.heights[-1]}},{key:"getFirstVisibleRow",value:function(){var e=this.hot.view.wt;return e.wtViewport.rowsVisibleCalculator?e.wtTable.getFirstVisibleRow():e.wtViewport.rowsRenderCalculator?e.wtTable.getFirstRenderedRow():-1}},{key:"getLastVisibleRow",value:function(){var e=this.hot.view.wt;return e.wtViewport.rowsVisibleCalculator?e.wtTable.getLastVisibleRow():e.wtViewport.rowsRenderCalculator?e.wtTable.getLastRenderedRow():-1}},{key:"clearCache",value:function(){this.heights.length=0,this.heights[-1]=void 0}},{key:"clearCacheByRange",value:function(e){var t=this,n="number"==typeof e?{from:e,to:e}:e,r=n.from,o=n.to;(0,O.rangeEach)(Math.min(r,o),Math.max(r,o),function(e){t.heights[e]=void 0})}},{key:"isNeedRecalculate",value:function(){return!!(0,b.arrayFilter)(this.heights,function(e){return void 0===e}).length}},{key:"onBeforeRender",value:function(){var e=this.hot.renderCall,t=this.hot.getSettings().fixedRowsBottom,n=this.getFirstVisibleRow(),r=this.getLastVisibleRow();if(null!==n&&null!==r){if(this.calculateRowsHeight({from:n,to:r},void 0,e),t){var o=this.hot.countRows()-1;this.calculateRowsHeight({from:o-t,to:o})}this.isNeedRecalculate()&&!this.inProgress&&this.calculateAllRowsHeight()}}},{key:"onBeforeRowMove",value:function(e,t){this.clearCacheByRange({from:e,to:t}),this.calculateAllRowsHeight()}},{key:"onBeforeRowResize",value:function(e,t,n){var r=t;return n&&(this.calculateRowsHeight(e,void 0,!0),r=this.getRowHeight(e)),r}},{key:"onAfterLoadData",value:function(){var e=this;this.hot.view?this.recalculateAllRowsHeight():setTimeout(function(){e.hot&&e.recalculateAllRowsHeight()},0)}},{key:"onBeforeChange",value:function(e){var t=null;1===e.length?t=e[0][0]:e.length>1&&(t={from:e[0][0],to:e[e.length-1][0]}),null!==t&&this.clearCacheByRange(t)}},{key:"destroy",value:function(){this.ghostTable.clean(),h(p(t.prototype),"destroy",this).call(this)}}]),t}(w.default);(0,T.registerPlugin)("autoRowSize",M);var N=M;t.default=N},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e){return l(e)||s(e)||a()}function a(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function s(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}function l(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function h(e,t){if(null==e)return{};var n,r,o={},i=Object.keys(e);for(r=0;r=0||(o[n]=e[n]);return o}function d(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function p(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:[];return Array.isArray(e)?e.slice(0,1):[e].slice(0,1)}},{key:"areValidSortConfigs",value:function(e){if(!1===Array.isArray(e))return!1;var t=e.map(function(e){var t=e.column;return t}),n=this.hot.countCols(),r=t.every(function(e){return e<=n&&e>=0});return(0,P.areValidSortStates)(e)&&r}},{key:"saveAllSortSettings",value:function(){var e=this.columnStatesManager.getAllColumnsProperties();e.initialConfig=this.columnStatesManager.getSortStates(),this.hot.runHooks("persistentStateSave","columnSorting",e)}},{key:"getAllSavedSortSettings",value:function(){var e=this,t={};this.hot.runHooks("persistentStateLoad","columnSorting",t);var n=t.value,r=function(t){var n=t.column,r=f(t,["column"]);return u({column:e.hot.toVisualColumn(n)},r)};return(0,E.isDefined)(n)&&Array.isArray(n.initialConfig)&&(n.initialConfig=(0,T.arrayMap)(n.initialConfig,r)),n}},{key:"getColumnNextConfig",value:function(e){var t=this.hot.toPhysicalColumn(e);if(this.columnStatesManager.isColumnSorted(t)){var n=this.getSortConfig(e),r=(0,P.getNextSortOrder)(n.sortOrder);return(0,E.isDefined)(r)?(n.sortOrder=r,n):void 0}var o=this.hot.countCols();if(Number.isInteger(e)&&e>=0&&e1&&void 0!==arguments[1]?arguments[1]:j,n=this.hot.toPhysicalColumn(e),r=this.columnStatesManager.getIndexOfColumnInSortQueue(n),o=this.columnStatesManager.isColumnSorted(n),a=this.getSortConfig(),s=this.getColumnNextConfig(e);if(o){if((0,E.isUndefined)(s))return[].concat(i(a.slice(0,r)),i(a.slice(r+1)));if(t===j)return[].concat(i(a.slice(0,r)),i(a.slice(r+1)),[s]);if(t===F)return[].concat(i(a.slice(0,r)),[s],i(a.slice(r+1)))}return(0,E.isDefined)(s)?a.concat(s):a}},{key:"setMergedPluginSettings",value:function(e){var t=this.hot.toPhysicalColumn(e),n=this.hot.getSettings()[this.pluginKey],r=this.columnStatesManager.getAllColumnsProperties(),o=this.hot.getCellMeta(0,e),i=Object.getPrototypeOf(o),a=Object.hasOwnProperty.call(i,this.pluginKey),s=a?i[this.pluginKey]:{};this.columnMetaCache.set(t,Object.assign(r,n,s))}},{key:"getFirstCellSettings",value:function(e){var t=this.blockPluginTranslation;this.blockPluginTranslation=!0,(0===this.columnMetaCache.size||this.columnMetaCache.size1?t-1:0),r=1;r0&&(e=this.sortedColumnsStates[0].column),e}},{key:"getSortOrderOfColumn",value:function(e){var t,n=this.sortedColumnsStates.find(function(t){var n=t.column;return e===n});return(0,a.isObject)(n)&&(t=n.sortOrder),t}},{key:"getSortedColumns",value:function(){return(0,s.arrayMap)(this.sortedColumnsStates,function(e){var t=e.column;return t})}},{key:"getIndexOfColumnInSortQueue",value:function(e){return this.getSortedColumns().indexOf(e)}},{key:"getNumberOfSortedColumns",value:function(){return this.sortedColumnsStates.length}},{key:"isListOfSortedColumnsEmpty",value:function(){return 0===this.getNumberOfSortedColumns()}},{key:"isColumnSorted",value:function(e){return this.getSortedColumns().includes(e)}},{key:"getSortStates",value:function(){return(0,a.deepClone)(this.sortedColumnsStates)}},{key:"getColumnSortState",value:function(e){if(this.isColumnSorted(e))return(0,a.deepClone)(this.sortedColumnsStates[this.getIndexOfColumnInSortQueue(e)])}},{key:"setSortStates",value:function(e){this.sortedColumnsStates=e}},{key:"destroy",value:function(){this.sortedColumnsStates.length=0,this.sortedColumnsStates=null}}]),e}();t.ColumnStatesManager=h},function(e,t,n){"use strict";function r(e,t,n,r){var o=[u];if(r&&o.push(c),!1===n)o.push(l);else if(e.isColumnSorted(t)){var i=e.getSortOrderOfColumn(t);o.push(f.get(i))}return o}function o(){return Array.from(f.values()).concat(c,l,u)}t.__esModule=!0,t.getClassesToAdd=r,t.getClassedToRemove=o;var i=n(432),a="ascending",s="descending",l="indicatorDisabled",u="columnSorting",c="sortAction",f=new Map([[i.ASC_SORT_STATE,a],[i.DESC_SORT_STATE,s]])},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var n=0;nr?"asc"===e?i.FIRST_AFTER_SECOND:i.FIRST_BEFORE_SECOND:i.DO_NOT_SWAP)}}t.__esModule=!0,t.compareFunctionFactory=r,t.COLUMN_DATA_TYPE=void 0;var o=n(14),i=n(78),a="default";t.COLUMN_DATA_TYPE=a},function(e,t,n){"use strict";function r(e,t,n){return function(t,r){var a=parseFloat(t),s=parseFloat(r),l=n.sortEmptyCells;if(a===s||isNaN(a)&&isNaN(s))return i.DO_NOT_SWAP;if(l){if((0,o.isEmpty)(t))return"asc"===e?i.FIRST_BEFORE_SECOND:i.FIRST_AFTER_SECOND;if((0,o.isEmpty)(r))return"asc"===e?i.FIRST_AFTER_SECOND:i.FIRST_BEFORE_SECOND}return isNaN(a)?i.FIRST_AFTER_SECOND:isNaN(s)?i.FIRST_BEFORE_SECOND:as?"asc"===e?i.FIRST_AFTER_SECOND:i.FIRST_BEFORE_SECOND:i.DO_NOT_SWAP}}t.__esModule=!0,t.compareFunctionFactory=r,t.COLUMN_DATA_TYPE=void 0;var o=n(14),i=n(78),a="numeric";t.COLUMN_DATA_TYPE=a},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t,n){return function(r,o){var l=n.sortEmptyCells;if(r===o)return s.DO_NOT_SWAP;if((0,a.isEmpty)(r))return(0,a.isEmpty)(o)?s.DO_NOT_SWAP:l&&"asc"===e?s.FIRST_BEFORE_SECOND:s.FIRST_AFTER_SECOND;if((0,a.isEmpty)(o))return l&&"asc"===e?s.FIRST_AFTER_SECOND:s.FIRST_BEFORE_SECOND;var u=t.dateFormat,c=(0,i.default)(r,u),f=(0,i.default)(o,u);return c.isValid()?f.isValid()?f.isAfter(c)?"asc"===e?s.FIRST_BEFORE_SECOND:s.FIRST_AFTER_SECOND:f.isBefore(c)?"asc"===e?s.FIRST_AFTER_SECOND:s.FIRST_BEFORE_SECOND:s.DO_NOT_SWAP:s.FIRST_BEFORE_SECOND:s.FIRST_AFTER_SECOND}}t.__esModule=!0,t.compareFunctionFactory=o,t.COLUMN_DATA_TYPE=void 0;var i=r(n(67)),a=n(14),s=n(78),l="date";t.COLUMN_DATA_TYPE=l},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){for(var n=(0,a.getRootComparator)(t),r=arguments.length,o=new Array(r>2?r-2:0),s=2;s1&&void 0!==arguments[1]?arguments[1]:s,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:e.length;if(Math.abs(r-n)<=1)return[];var a=Math.ceil((n+r)/2);return o(e,t,n,a),o(e,t,a,r),i(e,t,n,a,r)}function i(e,t,n,r,o){for(var i=new a.default,s=new a.default,l=r-n,u=o-r,c=Math.max(l,u),f=o-n,h=0;h0?e[n+d]=s.shift().data:e[n+d]=i.shift().data:i.first?e[n+d]=i.shift().data:e[n+d]=s.shift().data,d+=1;return e}t.__esModule=!0,t.default=o;var a=r(n(681)),s=function(e,t){var n=e.toString(),r=t.toString();return n===r?0:n0&&void 0!==arguments[0])||arguments[0];if(!this.range.from)throw new Error('Before using this method, first set cell range (hot.getPlugin("comment").setRange())');this.hot.setCellMeta(this.range.from.row,this.range.from.col,k,void 0),e&&this.hot.render(),this.hide()}},{key:"removeCommentAtCell",value:function(e,t){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];this.setRange({from:new b.CellCoords(e,t)}),this.removeComment(n)}},{key:"getComment",value:function(){var e=this.range.from.row,t=this.range.from.col;return this.getCommentMeta(e,t,M)}},{key:"getCommentAtCell",value:function(e,t){return this.getCommentMeta(e,t,M)}},{key:"show",value:function(){if(!this.range.from)throw new Error('Before using this method, first set cell range (hot.getPlugin("comment").setRange())');var e=this.hot.getCellMeta(this.range.from.row,this.range.from.col);return this.refreshEditor(!0),this.editor.setValue(e[k]?e[k][M]:""),this.editor.hidden&&this.editor.show(),!0}},{key:"showAtCell",value:function(e,t){return this.setRange({from:new b.CellCoords(e,t)}),this.show()}},{key:"hide",value:function(){this.editor.hidden||this.editor.hide()}},{key:"refreshEditor",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(e||this.range.from&&this.editor.isVisible()){var t=(0,y.getScrollableElement)(this.hot.view.wt.wtTable.TABLE),n=this.hot.view.wt.wtTable.getCell(this.range.from),r=this.range.from.row,o=this.range.from.col,i=(0,y.offset)(n),a=this.hot.view.wt.wtTable.getStretchedColumnWidth(o),s=i.top<0?0:i.top,l=i.left;this.hot.view.wt.wtViewport.hasVerticalScroll()&&t!==window&&(s-=this.hot.view.wt.wtOverlays.topOverlay.getScrollPosition()),this.hot.view.wt.wtViewport.hasHorizontalScroll()&&t!==window&&(l-=this.hot.view.wt.wtOverlays.leftOverlay.getScrollPosition());var u=l+a,c=s,f=this.getCommentMeta(r,o,N),h=this.getCommentMeta(r,o,D);f?this.editor.setSize(f.width,f.height):this.editor.resetSize(),this.editor.setReadOnlyState(h),this.editor.setPosition(u,c)}}},{key:"checkSelectionCommentsConsistency",value:function(){var e=this.hot.getSelectedRangeLast();if(!e)return!1;var t=!1,n=e.from;return this.getCommentMeta(n.row,n.col,M)&&(t=!0),t}},{key:"updateCommentMeta",value:function(e,t,n){var r,o=this.hot.getCellMeta(e,t)[k];o?(r=(0,m.deepClone)(o),(0,m.deepExtend)(r,n)):r=n,this.hot.setCellMeta(e,t,k,r)}},{key:"getCommentMeta",value:function(e,t,n){var r=this.hot.getCellMeta(e,t);if(r[k])return r[k][n]}},{key:"onMouseDown",value:function(e){if(this.mouseDown=!0,this.hot.view&&this.hot.view.wt){if(!this.contextMenuEvent&&!this.targetIsCommentTextArea(e)){var t=(0,y.closest)(e.target,"TD","TBODY"),n=null;t&&(n=this.hot.view.wt.wtTable.getCoords(t)),(!t||this.range.from&&n&&(this.range.from.row!==n.row||this.range.from.col!==n.col))&&this.hide()}this.contextMenuEvent=!1}}},{key:"onMouseOver",value:function(e){var t=R.get(this);if(t.cellBelowCursor=document.elementFromPoint(e.clientX,e.clientY),!(this.mouseDown||this.editor.isFocused()||(0,y.hasClass)(e.target,"wtBorder")||t.cellBelowCursor!==e.target)&&this.editor)if(this.targetIsCellWithComment(e)){var n=this.hot.view.wt.wtTable.getCoords(e.target),r={from:new b.CellCoords(n.row,n.col)};this.displaySwitch.show(r)}else(0,y.isChildOf)(e.target,document)&&!this.targetIsCommentTextArea(e)&&this.displaySwitch.hide()}},{key:"onMouseUp",value:function(){this.mouseDown=!1}},{key:"onAfterRenderer",value:function(e,t){t[k]&&t[k][M]&&(0,y.addClass)(e,t.commentedCellClassName)}},{key:"onEditorBlur",value:function(){this.setComment()}},{key:"onEditorMouseDown",value:function(e){var t=R.get(this);t.tempEditorDimensions={width:(0,y.outerWidth)(e.target),height:(0,y.outerHeight)(e.target)}}},{key:"onEditorMouseUp",value:function(e){var t=R.get(this),n=(0,y.outerWidth)(e.target),r=(0,y.outerHeight)(e.target);n===t.tempEditorDimensions.width+1&&r===t.tempEditorDimensions.height+2||this.updateCommentMeta(this.range.from.row,this.range.from.col,a({},N,{width:n,height:r}))}},{key:"onContextMenuAddComment",value:function(){var e=this;this.displaySwitch.cancelHiding();var t=this.hot.getSelectedRangeLast();this.contextMenuEvent=!0,this.setRange({from:t.from}),this.show(),setTimeout(function(){e.hot&&(e.hot.deselectCell(),e.editor.focus())},10)}},{key:"onContextMenuRemoveComment",value:function(){var e=this.hot.getSelectedRangeLast(),t=e.from,n=e.to;this.contextMenuEvent=!0;for(var r=t.row;r<=n.row;r++)for(var o=t.col;o<=n.col;o++)this.removeCommentAtCell(r,o,!1);this.hot.render()}},{key:"onContextMenuMakeReadOnly",value:function(){var e=this.hot.getSelectedRangeLast(),t=e.from,n=e.to;this.contextMenuEvent=!0;for(var r=t.row;r<=n.row;r++)for(var o=t.col;o<=n.col;o++){var i=!!this.getCommentMeta(r,o,D);this.updateCommentMeta(r,o,a({},D,!i))}}},{key:"addToContextMenu",value:function(e){var t=this;e.items.push({name:"---------"},{key:"commentsAddEdit",name:function(){return t.checkSelectionCommentsConsistency()?t.hot.getTranslatedPhrase(T.CONTEXTMENU_ITEMS_EDIT_COMMENT):t.hot.getTranslatedPhrase(T.CONTEXTMENU_ITEMS_ADD_COMMENT)},callback:function(){return t.onContextMenuAddComment()},disabled:function(){return!(this.getSelectedLast()&&!this.selection.isSelectedByCorner())}},{key:"commentsRemove",name:function(){return this.getTranslatedPhrase(T.CONTEXTMENU_ITEMS_REMOVE_COMMENT)},callback:function(){return t.onContextMenuRemoveComment()},disabled:function(){return t.hot.selection.isSelectedByCorner()}},{key:"commentsReadOnly",name:function(){var e=this,t=this.getTranslatedPhrase(T.CONTEXTMENU_ITEMS_READ_ONLY_COMMENT),n=(0,E.checkSelectionConsistency)(this.getSelectedRangeLast(),function(t,n){var r=e.getCellMeta(t,n)[k];if(r&&(r=r[D]),r)return!0});return n&&(t=(0,E.markLabelAsSelected)(t)),t},callback:function(){return t.onContextMenuMakeReadOnly()},disabled:function(){return t.hot.selection.isSelectedByCorner()||!t.checkSelectionCommentsConsistency()}})}},{key:"getDisplayDelaySetting",value:function(){var e=this.hot.getSettings().comments;if((0,m.isObject)(e))return e.displayDelay}},{key:"onAfterBeginEditing",value:function(){this.hide()}},{key:"destroy",value:function(){this.editor&&this.editor.destroy(),this.displaySwitch&&this.displaySwitch.destroy(),f(d(t.prototype),"destroy",this).call(this)}}]),t}(S.default);(0,C.registerPlugin)("comments",A);var P=A;t.default=P},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:"",t=e||"";this.getInputElement().value=t}},{key:"getValue",value:function(){return this.getInputElement().value}},{key:"isFocused",value:function(){return document.activeElement===this.getInputElement()}},{key:"focus",value:function(){this.getInputElement().focus()}},{key:"createEditor",value:function(){var t=document.createElement("div"),n=document.createElement("textarea"),r=document.querySelector(".".concat(e.CLASS_EDITOR_CONTAINER));return r||(r=document.createElement("div"),(0,a.addClass)(r,e.CLASS_EDITOR_CONTAINER),document.body.appendChild(r)),(0,a.addClass)(t,e.CLASS_EDITOR),(0,a.addClass)(n,e.CLASS_INPUT),t.appendChild(n),r.appendChild(t),t}},{key:"getInputElement",value:function(){return this.editor.querySelector(".".concat(e.CLASS_INPUT))}},{key:"destroy",value:function(){this.editor.parentNode.removeChild(this.editor),this.editor=null,this.editorStyle=null}}]),e}(),l=s;t.default=l},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:c;this.showDebounced=(0,s.debounce)(function(t){e.wasLastActionShow&&e.runLocalHooks("show",t.from.row,t.from.col)},t)}},{key:"destroy",value:function(){this.clearLocalHooks()}}]),e}();(0,l.mixin)(h,u.default);var d=h;t.default=d},function(e,t){},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){return!t||"object"!==o(t)&&"function"!=typeof t?p(e):t}function s(e,t,n){return s="undefined"!=typeof Reflect&&Reflect.get?Reflect.get:function(e,t,n){var r=l(e,t);if(r){var o=Object.getOwnPropertyDescriptor(r,t);return o.get?o.get.call(n):o.value}},s(e,t,n||e)}function l(e,t){for(;!Object.prototype.hasOwnProperty.call(e,t)&&(e=u(e),null!==e););return e}function u(e){return u=Object.setPrototypeOf?Object.getPrototypeOf:function(e){return e.__proto__||Object.getPrototypeOf(e)},u(e)}function c(e,t){for(var n=0;n1?n-1:0),o=1;o1?n-1:0),o=1;o0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=[],o=e;return o&&o.items?o=o.items:Array.isArray(o)||(o=t),(0,s.isObject)(o)?(0,s.objectEach)(o,function(e,t){var o=n["string"==typeof e?e:t];o||(o=e),(0,s.isObject)(e)?(0,s.extend)(o,e):"string"==typeof o&&(o={name:o}),void 0===o.key&&(o.key=t),r.push(o)}):(0,l.arrayEach)(o,function(e,t){var o=n[e];!o&&u.ITEMS.indexOf(e)>=0||(o||(o={name:e,key:"".concat(t)}),(0,s.isObject)(e)&&(0,s.extend)(o,e),void 0===o.key&&(o.key=t),r.push(o))}),r}t.__esModule=!0,t.default=void 0;var s=n(2),l=n(3),u=n(127),c=function(){function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;r(this,e),this.hot=t,this.predefinedItems=(0,u.predefinedItems)(),this.defaultOrderPattern=n}return i(e,[{key:"setPredefinedItems",value:function(e){var t=this,n={};this.defaultOrderPattern.length=0,(0,s.objectEach)(e,function(e,r){var o="";e.name===u.SEPARATOR?(n[u.SEPARATOR]=e,o=u.SEPARATOR):isNaN(parseInt(r,10))?(e.key=void 0===e.key?r:e.key,n[r]=e,o=e.key):(n[e.key]=e,o=e.key),t.defaultOrderPattern.push(o)}),this.predefinedItems=n}},{key:"getItems",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return a(e,this.defaultOrderPattern,this.predefinedItems)}}]),e}(),f=c;t.default=f},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(){return{key:l,name:function(){return this.getTranslatedPhrase(s.CONTEXTMENU_ITEMS_ALIGNMENT)},disabled:function(){return!(this.getSelectedRange()&&!this.selection.isSelectedByCorner())},submenu:{items:[{key:"".concat(l,":left"),name:function(){var e=this,t=this.getTranslatedPhrase(s.CONTEXTMENU_ITEMS_ALIGNMENT_LEFT),n=(0,i.checkSelectionConsistency)(this.getSelectedRange(),function(t,n){var r=e.getCellMeta(t,n).className;if(r&&-1!==r.indexOf("htLeft"))return!0});return n&&(t=(0,i.markLabelAsSelected)(t)),t},callback:function(){var e=this,t=this.getSelectedRange(),n=(0,i.getAlignmentClasses)(t,function(t,n){return e.getCellMeta(t,n).className}),r="horizontal",o="htLeft";this.runHooks("beforeCellAlignment",n,t,r,o),(0,i.align)(t,r,o,function(t,n){return e.getCellMeta(t,n)},function(t,n,r,o){return e.setCellMeta(t,n,r,o)}),this.render()},disabled:!1},{key:"".concat(l,":center"),name:function(){var e=this,t=this.getTranslatedPhrase(s.CONTEXTMENU_ITEMS_ALIGNMENT_CENTER),n=(0,i.checkSelectionConsistency)(this.getSelectedRange(),function(t,n){var r=e.getCellMeta(t,n).className;if(r&&-1!==r.indexOf("htCenter"))return!0});return n&&(t=(0,i.markLabelAsSelected)(t)),t},callback:function(){var e=this,t=this.getSelectedRange(),n=(0,i.getAlignmentClasses)(t,function(t,n){return e.getCellMeta(t,n).className}),r="horizontal",o="htCenter";this.runHooks("beforeCellAlignment",n,t,r,o),(0,i.align)(t,r,o,function(t,n){return e.getCellMeta(t,n)},function(t,n,r,o){return e.setCellMeta(t,n,r,o)}),this.render()},disabled:!1},{key:"".concat(l,":right"),name:function(){var e=this,t=this.getTranslatedPhrase(s.CONTEXTMENU_ITEMS_ALIGNMENT_RIGHT),n=(0,i.checkSelectionConsistency)(this.getSelectedRange(),function(t,n){var r=e.getCellMeta(t,n).className;if(r&&-1!==r.indexOf("htRight"))return!0});return n&&(t=(0,i.markLabelAsSelected)(t)),t},callback:function(){var e=this,t=this.getSelectedRange(),n=(0,i.getAlignmentClasses)(t,function(t,n){return e.getCellMeta(t,n).className}),r="horizontal",o="htRight";this.runHooks("beforeCellAlignment",n,t,r,o),(0,i.align)(t,r,o,function(t,n){return e.getCellMeta(t,n)},function(t,n,r,o){return e.setCellMeta(t,n,r,o)}),this.render()},disabled:!1},{key:"".concat(l,":justify"),name:function(){var e=this,t=this.getTranslatedPhrase(s.CONTEXTMENU_ITEMS_ALIGNMENT_JUSTIFY),n=(0,i.checkSelectionConsistency)(this.getSelectedRange(),function(t,n){var r=e.getCellMeta(t,n).className;if(r&&-1!==r.indexOf("htJustify"))return!0});return n&&(t=(0,i.markLabelAsSelected)(t)),t},callback:function(){var e=this,t=this.getSelectedRange(),n=(0,i.getAlignmentClasses)(t,function(t,n){return e.getCellMeta(t,n).className}),r="horizontal",o="htJustify";this.runHooks("beforeCellAlignment",n,t,r,o),(0,i.align)(t,r,o,function(t,n){return e.getCellMeta(t,n)},function(t,n,r,o){return e.setCellMeta(t,n,r,o)}),this.render()},disabled:!1},{name:a.KEY},{key:"".concat(l,":top"),name:function(){var e=this,t=this.getTranslatedPhrase(s.CONTEXTMENU_ITEMS_ALIGNMENT_TOP),n=(0,i.checkSelectionConsistency)(this.getSelectedRange(),function(t,n){var r=e.getCellMeta(t,n).className;if(r&&-1!==r.indexOf("htTop"))return!0});return n&&(t=(0,i.markLabelAsSelected)(t)),t},callback:function(){var e=this,t=this.getSelectedRange(),n=(0,i.getAlignmentClasses)(t,function(t,n){return e.getCellMeta(t,n).className}),r="vertical",o="htTop";this.runHooks("beforeCellAlignment",n,t,r,o),(0,i.align)(t,r,o,function(t,n){return e.getCellMeta(t,n)},function(t,n,r,o){return e.setCellMeta(t,n,r,o)}),this.render()},disabled:!1},{key:"".concat(l,":middle"),name:function(){var e=this,t=this.getTranslatedPhrase(s.CONTEXTMENU_ITEMS_ALIGNMENT_MIDDLE),n=(0,i.checkSelectionConsistency)(this.getSelectedRange(),function(t,n){var r=e.getCellMeta(t,n).className;if(r&&-1!==r.indexOf("htMiddle"))return!0});return n&&(t=(0,i.markLabelAsSelected)(t)),t},callback:function(){var e=this,t=this.getSelectedRange(),n=(0,i.getAlignmentClasses)(t,function(t,n){return e.getCellMeta(t,n).className}),r="vertical",o="htMiddle";this.runHooks("beforeCellAlignment",n,t,r,o),(0,i.align)(t,r,o,function(t,n){return e.getCellMeta(t,n)},function(t,n,r,o){return e.setCellMeta(t,n,r,o)}),this.render()},disabled:!1},{key:"".concat(l,":bottom"),name:function(){var e=this,t=this.getTranslatedPhrase(s.CONTEXTMENU_ITEMS_ALIGNMENT_BOTTOM),n=(0,i.checkSelectionConsistency)(this.getSelectedRange(),function(t,n){var r=e.getCellMeta(t,n).className;if(r&&-1!==r.indexOf("htBottom"))return!0});return n&&(t=(0,i.markLabelAsSelected)(t)),t},callback:function(){var e=this,t=this.getSelectedRange(),n=(0,i.getAlignmentClasses)(t,function(t,n){return e.getCellMeta(t,n).className}),r="vertical",o="htBottom";this.runHooks("beforeCellAlignment",n,t,r,o),(0,i.align)(t,r,o,function(t,n){return e.getCellMeta(t,n)},function(t,n,r,o){return e.setCellMeta(t,n,r,o)}),this.render()},disabled:!1}]}}}t.__esModule=!0,t.default=o,t.KEY=void 0;var i=n(30),a=n(126),s=r(n(11)),l="alignment";t.KEY=l},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(e,t){return s(e)||a(e,t)||i()}function i(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function a(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{r||null==s.return||s.return()}finally{if(o)throw i}}return n}function s(e){if(Array.isArray(e))return e}function l(){return{key:f,name:function(){return this.getTranslatedPhrase(c.CONTEXTMENU_ITEMS_CLEAR_COLUMN)},callback:function(e,t){var n=t[0].start.col;this.countRows()&&this.populateFromArray(0,n,[[null]],Math.max(t[0].start.row,t[0].end.row),n,"ContextMenu.clearColumn")},disabled:function(){var e=(0,u.getValidSelection)(this);if(!e)return!0;var t=o(e[0],3),n=t[0],r=t[1],i=t[2],a=[n,0,i,this.countCols()-1],s=a.join(",")===e.join(",");return r<0||this.countCols()>=this.getSettings().maxCols||s}}}t.__esModule=!0,t.default=l,t.KEY=void 0;var u=n(30),c=r(n(11)),f="clear_column";t.KEY=f},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(e,t){return s(e)||a(e,t)||i()}function i(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function a(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{r||null==s.return||s.return()}finally{if(o)throw i}}return n}function s(e){if(Array.isArray(e))return e}function l(){return{key:f,name:function(){return this.getTranslatedPhrase(c.CONTEXTMENU_ITEMS_INSERT_LEFT)},callback:function(e,t){var n=t[Math.max(t.length-1,0)];this.alter("insert_col",n.start.col,1,"ContextMenu.columnLeft")},disabled:function(){var e=(0,u.getValidSelection)(this);if(!e)return!0;if(!this.isColumnModificationAllowed())return!0;var t=o(e[0],3),n=t[0],r=t[1],i=t[2],a=[n,0,i,this.countCols()-1],s=a.join(",")===e.join(","),l=1===this.countCols();return r<0||this.countCols()>=this.getSettings().maxCols||!l&&s},hidden:function(){return!this.getSettings().allowInsertColumn}}}t.__esModule=!0,t.default=l,t.KEY=void 0;var u=n(30),c=r(n(11)),f="col_left";t.KEY=f},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(e,t){return s(e)||a(e,t)||i()}function i(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function a(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{r||null==s.return||s.return()}finally{if(o)throw i}}return n}function s(e){if(Array.isArray(e))return e}function l(){return{key:f,name:function(){return this.getTranslatedPhrase(c.CONTEXTMENU_ITEMS_INSERT_RIGHT)},callback:function(e,t){var n=t[Math.max(t.length-1,0)];this.alter("insert_col",n.end.col+1,1,"ContextMenu.columnRight")},disabled:function(){var e=(0,u.getValidSelection)(this);if(!e)return!0;if(!this.isColumnModificationAllowed())return!0;var t=o(e[0],3),n=t[0],r=t[1],i=t[2],a=[n,0,i,this.countCols()-1],s=a.join(",")===e.join(","),l=1===this.countCols();return r<0||this.countCols()>=this.getSettings().maxCols||!l&&s},hidden:function(){return!this.getSettings().allowInsertColumn}}}t.__esModule=!0,t.default=l,t.KEY=void 0;var u=n(30),c=r(n(11)),f="col_right";t.KEY=f},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(){return{key:l,name:function(){var e=this,t=this.getTranslatedPhrase(s.CONTEXTMENU_ITEMS_READ_ONLY),n=(0,i.checkSelectionConsistency)(this.getSelectedRange(),function(t,n){return e.getCellMeta(t,n).readOnly});return n&&(t=(0,i.markLabelAsSelected)(t)),t},callback:function(){var e=this,t=this.getSelectedRange(),n=(0,i.checkSelectionConsistency)(t,function(t,n){return e.getCellMeta(t,n).readOnly});(0,a.arrayEach)(t,function(t){t.forAll(function(t,r){e.setCellMeta(t,r,"readOnly",!n)})}),this.render()},disabled:function(){return!(this.getSelectedRange()&&!this.selection.isSelectedByCorner())}}}t.__esModule=!0,t.default=o,t.KEY=void 0;var i=n(30),a=n(3),s=r(n(11)),l="make_read_only";t.KEY=l},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(){return{key:a,name:function(){return this.getTranslatedPhrase(i.CONTEXTMENU_ITEMS_REDO)},callback:function(){this.redo()},disabled:function(){return this.undoRedo&&!this.undoRedo.isRedoAvailable()}}}t.__esModule=!0,t.default=o,t.KEY=void 0;var i=r(n(11)),a="redo";t.KEY=a},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(e,t){return s(e)||a(e,t)||i()}function i(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function a(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{r||null==s.return||s.return()}finally{if(o)throw i}}return n}function s(e){if(Array.isArray(e))return e}function l(){return{key:h,name:function(){var e=this.getSelected(),t=0;if(e)if(e.length>1)t=1;else{var n=o(e[0],4),r=n[1],i=n[3];r-i!=0&&(t=1)}return this.getTranslatedPhrase(f.CONTEXTMENU_ITEMS_REMOVE_COLUMN,t)},callback:function(){this.alter("remove_col",(0,c.transformSelectionToColumnDistance)(this.getSelected()),null,"ContextMenu.removeColumn")},disabled:function(){var e=(0,u.getValidSelection)(this),t=this.countCols();return!e||(this.selection.isSelectedByRowHeader()||this.selection.isSelectedByCorner()||!this.isColumnModificationAllowed()||!t)},hidden:function(){return!this.getSettings().allowRemoveColumn}}}t.__esModule=!0,t.default=l,t.KEY=void 0;var u=n(30),c=n(91),f=r(n(11)),h="remove_col";t.KEY=h},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(e,t){return s(e)||a(e,t)||i()}function i(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function a(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{r||null==s.return||s.return()}finally{if(o)throw i}}return n}function s(e){if(Array.isArray(e))return e}function l(){return{key:h,name:function(){var e=this.getSelected(),t=0;if(e)if(e.length>1)t=1;else{var n=o(e[0],3),r=n[0],i=n[2];r-i!=0&&(t=1)}return this.getTranslatedPhrase(f.CONTEXTMENU_ITEMS_REMOVE_ROW,t)},callback:function(){this.alter("remove_row",(0,c.transformSelectionToRowDistance)(this.getSelected()),1,"ContextMenu.removeRow")},disabled:function(){var e=(0,u.getValidSelection)(this),t=this.countRows();return!e||(this.selection.isSelectedByColumnHeader()||this.selection.isSelectedByCorner()||!t)},hidden:function(){return!this.getSettings().allowRemoveRow}}}t.__esModule=!0,t.default=l,t.KEY=void 0;var u=n(30),c=n(91),f=r(n(11)),h="remove_row";t.KEY=h},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(){return{key:s,name:function(){return this.getTranslatedPhrase(a.CONTEXTMENU_ITEMS_ROW_ABOVE)},callback:function(e,t){var n=t[Math.max(t.length-1,0)];this.alter("insert_row",n.start.row,1,"ContextMenu.rowAbove")},disabled:function(){var e=(0,i.getValidSelection)(this);return!e||(this.selection.isSelectedByColumnHeader()||this.countRows()>=this.getSettings().maxRows)},hidden:function(){return!this.getSettings().allowInsertRow}}}t.__esModule=!0,t.default=o,t.KEY=void 0;var i=n(30),a=r(n(11)),s="row_above";t.KEY=s},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(){return{key:s,name:function(){return this.getTranslatedPhrase(a.CONTEXTMENU_ITEMS_ROW_BELOW)},callback:function(e,t){var n=t[Math.max(t.length-1,0)];this.alter("insert_row",n.end.row+1,1,"ContextMenu.rowBelow")},disabled:function(){var e=(0,i.getValidSelection)(this);return!e||(this.selection.isSelectedByColumnHeader()||this.countRows()>=this.getSettings().maxRows)},hidden:function(){return!this.getSettings().allowInsertRow}}}t.__esModule=!0,t.default=o,t.KEY=void 0;var i=n(30),a=r(n(11)),s="row_below";t.KEY=s},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(){return{key:a,name:function(){return this.getTranslatedPhrase(i.CONTEXTMENU_ITEMS_UNDO)},callback:function(){this.undo()},disabled:function(){return this.undoRedo&&!this.undoRedo.isUndoAvailable()}}}t.__esModule=!0,t.default=o,t.KEY=void 0;var i=r(n(11)),a="undo";t.KEY=a},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:0;this.offset[e]=t}},{key:"isSubMenu",value:function(){return null!==this.parentMenu}},{key:"open",value:function(){var e=this;this.runLocalHooks("beforeOpen"),this.container.removeAttribute("style"),this.container.style.display="block";var t=(0,p.debounce)(function(t){return e.openSubMenu(t)},300),n=this.options.minWidth||b,r=(0,u.arrayFilter)(this.menuItems,function(t){return(0,g.isItemHidden)(t,e.hot)});r=(0,g.filterSeparators)(r,m.SEPARATOR);var o={data:r,colHeaders:!1,autoColumnSize:!0,modifyColWidth:function(e){return(0,d.isDefined)(e)&&e0&&void 0!==arguments[0]&&arguments[0];this.isOpened()&&(e&&this.parentMenu?this.parentMenu.close():(this.closeAllSubMenus(),this.container.style.display="none",this.releaseMainTableCallbacks(),this.hotMenu.destroy(),this.hotMenu=null,this.hot.getSettings().outsideClickDeselects=this.origOutsideClickDeselects,this.runLocalHooks("afterClose"),this.parentMenu&&this.parentMenu.hotMenu.listen()))}},{key:"openSubMenu",value:function(t){if(!this.hotMenu)return!1;var n=this.hotMenu.getCell(t,0);if(this.closeAllSubMenus(),!n||!(0,g.hasSubMenu)(n))return!1;var r=this.hotMenu.getSourceDataAtRow(t),o=new e(this.hot,{parent:this,name:r.name,className:this.options.className,keepInViewport:!0});return o.setMenuItems(r.submenu.items),o.open(),o.setPosition(n.getBoundingClientRect()),this.hotSubMenus[r.key]=o,o}},{key:"closeSubMenu",value:function(e){var t=this.hotMenu.getSourceDataAtRow(e),n=this.hotSubMenus[t.key];n&&(n.destroy(),delete this.hotSubMenus[t.key])}},{key:"closeAllSubMenus",value:function(){var e=this;(0,u.arrayEach)(this.hotMenu.getData(),function(t,n){return e.closeSubMenu(n)})}},{key:"isAllSubMenusClosed",value:function(){return 0===Object.keys(this.hotSubMenus).length}},{key:"destroy",value:function(){this.clearLocalHooks(),this.close(),this.parentMenu=null,this.eventManager.destroy()}},{key:"isOpened",value:function(){return null!==this.hotMenu}},{key:"executeCommand",value:function(e){if(this.isOpened()&&this.hotMenu.getSelectedLast()){var t=this.hotMenu.getSourceDataAtRow(this.hotMenu.getSelectedLast()[0]);if(this.runLocalHooks("select",t,e),!1!==t.isCommand&&t.name!==m.SEPARATOR){var n=this.hot.getSelectedRange(),r=n?(0,g.normalizeSelection)(n):[],o=!0;(!0===t.disabled||"function"==typeof t.disabled&&!0===t.disabled.call(this.hot)||t.submenu)&&(o=!1),this.runLocalHooks("executeCommand",t.key,r,e),this.isSubMenu()&&this.parentMenu.runLocalHooks("executeCommand",t.key,r,e),o&&this.close(!0)}}}},{key:"setPosition",value:function(e){var t=new c.default(e);this.options.keepInViewport?(t.fitsBelow(this.container)?this.setPositionBelowCursor(t):t.fitsAbove(this.container)?this.setPositionAboveCursor(t):this.setPositionBelowCursor(t),t.fitsOnRight(this.container)?this.setPositionOnRightOfCursor(t):this.setPositionOnLeftOfCursor(t)):(this.setPositionBelowCursor(t),this.setPositionOnRightOfCursor(t))}},{key:"setPositionAboveCursor",value:function(e){var t=this.offset.above+e.top-this.container.offsetHeight;this.isSubMenu()&&(t=e.top+e.cellHeight-this.container.offsetHeight+3),this.container.style.top="".concat(t,"px")}},{key:"setPositionBelowCursor",value:function(e){var t=this.offset.below+e.top;this.isSubMenu()&&(t=e.top-1),this.container.style.top="".concat(t,"px")}},{key:"setPositionOnRightOfCursor",value:function(e){var t;t=this.isSubMenu()?1+e.left+e.cellWidth:this.offset.right+1+e.left,this.container.style.left="".concat(t,"px")}},{key:"setPositionOnLeftOfCursor",value:function(e){var t=this.offset.left+e.left-this.container.offsetWidth+(0,l.getScrollbarWidth)()+4;this.container.style.left="".concat(t,"px")}},{key:"selectFirstCell",value:function(){var e=this.hotMenu.getCell(0,0);(0,g.isSeparator)(e)||(0,g.isDisabled)(e)||(0,g.isSelectionDisabled)(e)?this.selectNextCell(0,0):this.hotMenu.selectCell(0,0)}},{key:"selectLastCell",value:function(){var e=this.hotMenu.countRows()-1,t=this.hotMenu.getCell(e,0);(0,g.isSeparator)(t)||(0,g.isDisabled)(t)||(0,g.isSelectionDisabled)(t)?this.selectPrevCell(e,0):this.hotMenu.selectCell(e,0)}},{key:"selectNextCell",value:function(e,t){var n=e+1,r=n=0?this.hotMenu.getCell(n,t):null;r&&((0,g.isSeparator)(r)||(0,g.isDisabled)(r)||(0,g.isSelectionDisabled)(r)?this.selectPrevCell(n,t):this.hotMenu.selectCell(n,t))}},{key:"menuItemRenderer",value:function(e,t,n,r,o,i){var a=this,s=e.getSourceDataAtRow(n),u=document.createElement("div"),c=function(e){return(0,h.hasOwnProperty)(e,"submenu")},f=function(e){return new RegExp(m.SEPARATOR,"i").test(e.name)},d=function(e){return!0===e.disabled||"function"==typeof e.disabled&&!0===e.disabled.call(a.hot)},p=function(e){return e.disableSelection},g=i;"function"==typeof g&&(g=g.call(this.hot)),(0,l.empty)(t),(0,l.addClass)(u,"htItemWrapper"),t.appendChild(u),f(s)?(0,l.addClass)(t,"htSeparator"):"function"==typeof s.renderer?((0,l.addClass)(t,"htCustomMenuRenderer"),t.appendChild(s.renderer(e,u,n,r,o,g))):(0,l.fastInnerHTML)(u,g),d(s)?((0,l.addClass)(t,"htDisabled"),this.eventManager.addEventListener(t,"mouseenter",function(){return e.deselectCell()})):p(s)?((0,l.addClass)(t,"htSelectionDisabled"),this.eventManager.addEventListener(t,"mouseenter",function(){return e.deselectCell()})):c(s)?((0,l.addClass)(t,"htSubmenu"),p(s)?this.eventManager.addEventListener(t,"mouseenter",function(){return e.deselectCell()}):this.eventManager.addEventListener(t,"mouseenter",function(){return e.selectCell(n,r,void 0,void 0,!1,!1)})):((0,l.removeClass)(t,"htSubmenu"),(0,l.removeClass)(t,"htDisabled"),p(s)?this.eventManager.addEventListener(t,"mouseenter",function(){return e.deselectCell()}):this.eventManager.addEventListener(t,"mouseenter",function(){return e.selectCell(n,r,void 0,void 0,!1,!1)}))}},{key:"createContainer",value:function(){var e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,n=t;return n?((0,p.isFunction)(n)&&(n=n.call(this.hot),n=null===n||(0,d.isUndefined)(n)?"":n.toString()),n=n.replace(/[^A-z0-9]/g,"_"),n="".concat(this.options.className,"Sub_").concat(n),e=document.querySelector(".".concat(this.options.className,".").concat(n))):e=document.querySelector(".".concat(this.options.className)),e||(e=document.createElement("div"),(0,l.addClass)(e,"htMenu ".concat(this.options.className)),n&&(0,l.addClass)(e,n),document.getElementsByTagName("body")[0].appendChild(e)),e}},{key:"blockMainTableCallbacks",value:function(){this._afterScrollCallback=function(){},this.hot.addHook("afterScrollVertically",this._afterScrollCallback),this.hot.addHook("afterScrollHorizontally",this._afterScrollCallback)}},{key:"releaseMainTableCallbacks",value:function(){this._afterScrollCallback&&(this.hot.removeHook("afterScrollVertically",this._afterScrollCallback),this.hot.removeHook("afterScrollHorizontally",this._afterScrollCallback),this._afterScrollCallback=null)}},{key:"onBeforeKeyDown",value:function(e){var t=this.hotMenu.getSelectedLast(),n=!1;switch(this.keyEvent=!0,e.keyCode){case v.KEY_CODES.ESCAPE:this.close(),n=!0;break;case v.KEY_CODES.ENTER:t&&(this.hotMenu.getSourceDataAtRow(t[0]).submenu?n=!0:(this.executeCommand(e),this.close(!0)));break;case v.KEY_CODES.ARROW_DOWN:t?this.selectNextCell(t[0],t[1]):this.selectFirstCell(),n=!0;break;case v.KEY_CODES.ARROW_UP:t?this.selectPrevCell(t[0],t[1]):this.selectLastCell(),n=!0;break;case v.KEY_CODES.ARROW_RIGHT:if(t){var r=this.openSubMenu(t[0]);r&&r.selectFirstCell()}n=!0;break;case v.KEY_CODES.ARROW_LEFT:t&&this.isSubMenu()&&(this.close(),this.parentMenu&&this.parentMenu.hotMenu.listen(),n=!0)}n&&(e.preventDefault(),(0,w.stopImmediatePropagation)(e)),this.keyEvent=!1}},{key:"onAfterInit",value:function(){var e=this.hotMenu.getSettings().data,t=this.hotMenu.view.wt.wtTable.hider.style,n=this.hotMenu.view.wt.wtTable.holder.style,r=parseInt(t.width,10),o=(0,u.arrayReduce)(e,function(e,t){return e+(t.name===m.SEPARATOR?1:26)},0);n.width="".concat(r+22,"px"),n.height="".concat(o+4,"px"),t.height=n.height}},{key:"onAfterSelection",value:function(e,t,n,r,o){!1===this.keyEvent&&(o.value=!0)}},{key:"onDocumentMouseDown",value:function(e){this.isOpened()&&(this.container&&(0,l.isChildOf)(e.target,this.container)&&this.executeCommand(e),this.options.standalone&&this.hotMenu&&!(0,l.isChildOf)(e.target,this.hotMenu.rootElement)?this.close(!0):(this.isAllSubMenusClosed()||this.isSubMenu())&&!(0,l.isChildOf)(e.target,".htMenu")&&(0,l.isChildOf)(e.target,document)&&this.close(!0))}}]),e}();(0,h.mixin)(C,y.default);var S=C;t.default=S},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var n=0;n=e.offsetHeight}},{key:"fitsBelow",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:window.innerHeight;return this.topRelative+e.offsetHeight<=t}},{key:"fitsOnRight",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:window.innerWidth;return this.leftRelative+this.cellWidth+e.offsetWidth<=t}},{key:"fitsOnLeft",value:function(e){return this.leftRelative>=e.offsetWidth}}]),e}(),u=l;t.default=u},function(e,t){},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){return s(e)||a(e,t)||i()}function i(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function a(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{r||null==s.return||s.return()}finally{if(o)throw i}}return n}function s(e){if(Array.isArray(e))return e}function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){ return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function u(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function c(e,t){for(var n=0;n0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:e;if(e||t){var n=new k.default;e&&n.clipboardData.setData("text/plain",e),t&&n.clipboardData.setData("text/html",t),this.getOrCreateFocusableElement(),this.onPaste(n)}}},{key:"setCopyableText",value:function(){var e=this.hot.getSelectedRangeLast();if(e){var t=e.getTopLeftCorner(),n=e.getBottomRightCorner(),r=t.row,o=t.col,i=n.row,a=n.col,s=Math.min(i,r+this.rowsLimit-1),l=Math.min(a,o+this.columnsLimit-1);this.copyableRanges.length=0,this.copyableRanges.push({startRow:r,startCol:o,endRow:s,endCol:l}),this.copyableRanges=this.hot.runHooks("modifyCopyableRange",this.copyableRanges),i===s&&a===l||this.hot.runHooks("afterCopyLimit",i-r+1,a-o+1,this.rowsLimit,this.columnsLimit)}}},{key:"getOrCreateFocusableElement",value:function(){var e=this.hot.getActiveEditor(),t=e?e.TEXTAREA:void 0;t?this.focusableElement.setFocusableElement(t):this.focusableElement.useSecondaryElement()}},{key:"isEditorOpened",value:function(){var e=this.hot.getActiveEditor();return e&&e.isOpened()}},{key:"populateValues",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.hot.getSelectedLast();if(e.length){for(var n=e.length-1,r=e[0].length-1,o=Math.min(t[0],t[2]),i=Math.max(t[0],t[2],n+o),a=Math.min(t[1],t[3]),s=Math.max(t[1],t[3],r+a),l=[],u=o,c=0;u<=i;u+=1){for(var f=[],h=a,d=0;h<=s;h+=1)f.push(e[c][d]),d=d===r?0:d+=1;l.push(f),c=c===n?0:c+=1}return this.hot.populateFromArray(o,a,l,void 0,void 0,"CopyPaste.paste",this.pasteMode),[o,a,i,s]}}},{key:"onCopy",value:function(e){var t=P.get(this);if((this.hot.isListening()||t.isTriggeredByCopy)&&!this.isEditorOpened()){this.setCopyableText(),t.isTriggeredByCopy=!1;var n=this.getRangedData(this.copyableRanges),r=!!this.hot.runHooks("beforeCopy",n,this.copyableRanges);if(r){var o=C.default.stringify(n);if(e&&e.clipboardData){var i=(0,N.arrayToTable)(n);e.clipboardData.setData("text/plain",o),e.clipboardData.setData("text/html",i)}else"undefined"==typeof ClipboardEvent&&window.clipboardData.setData("Text",o);this.hot.runHooks("afterCopy",n,this.copyableRanges)}e.preventDefault()}}},{key:"onCut",value:function(e){var t=P.get(this);if((this.hot.isListening()||t.isTriggeredByCut)&&!this.isEditorOpened()){this.setCopyableText(),t.isTriggeredByCut=!1;var n=this.getRangedData(this.copyableRanges),r=!!this.hot.runHooks("beforeCut",n,this.copyableRanges);if(r){var o=C.default.stringify(n);if(e&&e.clipboardData){var i=(0,N.arrayToTable)(n);e.clipboardData.setData("text/plain",o),e.clipboardData.setData("text/html",i)}else"undefined"==typeof ClipboardEvent&&window.clipboardData.setData("Text",o);this.hot.emptySelectedCells(),this.hot.runHooks("afterCut",n,this.copyableRanges)}e.preventDefault()}}},{key:"onPaste",value:function(e){if(this.hot.isListening()&&!this.isEditorOpened()){var t;if(e&&e.preventDefault&&e.preventDefault(),e&&void 0!==e.clipboardData){var n=e.clipboardData.getData("text/html");t=n&&/(1},hidden:!1}}t.__esModule=!0,t.default=o;var i=r(n(11))},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(e){return{key:"cut",name:function(){return this.getTranslatedPhrase(i.CONTEXTMENU_ITEMS_CUT)},callback:function(){e.cut()},disabled:function(){var e=this.getSelected();return!e||e.length>1},hidden:!1}}t.__esModule=!0,t.default=o;var i=r(n(11))},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}t.__esModule=!0,t.default=void 0;var i=r(n(707)),a=function e(){o(this,e),this.clipboardData=new i.default};t.default=a},function(e,t,n){"use strict";function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(e,t){for(var n=0;n0&&(m-=1),l(e),m<=0&&(m=0,y&&y.parentNode&&(y.parentNode.removeChild(y),y=null),e.mainElement=null))}t.__esModule=!0,t.createElement=s,t.deactivateElement=l,t.destroyElement=f;var h=r(n(10)),d=r(n(68)),p=n(2),g=n(42),v=function(){function e(){o(this,e),this.mainElement=null,this.eventManager=new h.default(this),this.listenersCount=new WeakSet}return a(e,[{key:"useSecondaryElement",value:function(){var e=c();this.listenersCount.has(e)||(this.listenersCount.add(e),u(this.eventManager,e,this)),this.mainElement=e}},{key:"setFocusableElement",value:function(e){this.listenersCount.has(e)||(this.listenersCount.add(e),u(this.eventManager,e,this)),this.mainElement=e}},{key:"getFocusableElement",value:function(){return this.mainElement}},{key:"focus",value:function(){this.mainElement.value=("number" !== this.mainElement.type) ? " " : "",(0,g.isMobileBrowser)()||this.mainElement.select()}}]),e}();(0,p.mixin)(v,d.default);var y,m=0,w=function(e,t){return function(n){return t.runLocalHooks(e,n)}}},function(e,t,n){"use strict";function r(e){var t=e.length,n=[""],r=document.createElement("div");document.documentElement.appendChild(r);for(var o=0;o");for(var u=0;u".concat(r.innerHTML,""));n.push.apply(n,[""].concat(l,[""])),o+1===t&&n.push("")}return document.documentElement.removeChild(r),n.push("
      "),n.join("")}function o(e){return"table"===(e&&e.nodeName||"").toLowerCase()}function i(e){var t=[],n=e;if("string"==typeof n){var r=document.createElement("div");r.innerHTML=n.replace(/\n/g,""),n=r.querySelector("table")}if(n&&o(n)){for(var i=n.rows,a=i&&i.length,s=[],l=0;l(\n?)/,"\n");var p=d.innerText;f.push(p)}s.push(f)}t.push.apply(t,s)}return t}t.__esModule=!0,t.arrayToTable=r,t.tableToArray=i;var a=n(14)},function(e,t){},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(e){return e&&e.__esModule?e:{default:e}}function i(e){return i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i(e)}function a(e,t){return u(e)||l(e,t)||s()}function s(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function l(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{r||null==s.return||s.return()}finally{if(o)throw i}}return n}function u(e){if(Array.isArray(e))return e}function c(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function f(e,t){for(var n=0;n0&&(t.hot.setCellMeta(r,o,"borders",i),t.insertBorderIntoSettings(i))})})}},{key:"removeAllBorders",value:function(e,t){var n=(0,k.createId)(e,t);this.spliceBorder(n),this.clearBordersFromSelectionSettings(n),this.clearNullCellRange(),this.hot.removeCellMeta(e,t,"borders")}},{key:"setBorder",value:function(e,t,n,r){var o=this.hot.getCellMeta(e,t).borders;if(o&&void 0!==o.border||(o=(0,k.createEmptyBorders)(e,t)),r){o[n]=(0,k.createSingleEmptyBorder)();var i=this.countHide(o);if(4===i)this.removeAllBorders(e,t);else{var a=this.checkCustomSelectionsFromContextMenu(o,n,r);a||this.insertBorderIntoSettings(o),this.hot.setCellMeta(e,t,"borders",o)}}else{o[n]=(0,k.createDefaultCustomBorder)();var s=this.checkCustomSelectionsFromContextMenu(o,n,r);s||this.insertBorderIntoSettings(o),this.hot.setCellMeta(e,t,"borders",o)}}},{key:"prepareBorder",value:function(e,t,n){var r=this;(0,E.arrayEach)(e,function(e){var o=e.start,i=e.end;if(o.row===i.row&&o.col===i.col)"noBorders"===t?r.removeAllBorders(o.row,o.col):r.setBorder(o.row,o.col,t,n);else switch(t){case"noBorders":(0,_.rangeEach)(o.col,i.col,function(e){(0,_.rangeEach)(o.row,i.row,function(t){r.removeAllBorders(t,e)})});break;case"top":(0,_.rangeEach)(o.col,i.col,function(e){r.setBorder(o.row,e,t,n)});break;case"right":(0,_.rangeEach)(o.row,i.row,function(e){r.setBorder(e,i.col,t,n)});break;case"bottom":(0,_.rangeEach)(o.col,i.col,function(e){r.setBorder(i.row,e,t,n)});break;case"left":(0,_.rangeEach)(o.row,i.row,function(e){r.setBorder(e,o.col,t,n)})}})}},{key:"createCustomBorders",value:function(e){var t=this;(0,E.arrayEach)(e,function(e){e.range?t.prepareBorderFromCustomAddedRange(e):t.prepareBorderFromCustomAdded(e.row,e.col,e)})}},{key:"countHide",value:function(e){var t=Object.values(e);return(0,E.arrayReduce)(t,function(e,t){var n=e;return t.hide&&(n+=1),n},0)}},{key:"clearBordersFromSelectionSettings",value:function(e){var t=(0,E.arrayMap)(this.hot.selection.highlight.customSelections,function(e){return e.settings.id}).indexOf(e);t>-1&&this.hot.selection.highlight.customSelections[t].clear(),this.hot.view.wt.draw(!0)}},{key:"clearNullCellRange",value:function(){var e=this;(0,E.arrayEach)(this.hot.selection.highlight.customSelections,function(t,n){if(null===t.cellRange)return e.hot.selection.highlight.customSelections.splice(n,1),!1})}},{key:"hideBorders",value:function(){var e=this;(0,E.arrayEach)(this.savedBorders,function(t){e.clearBordersFromSelectionSettings(t.id)})}},{key:"spliceBorder",value:function(e){var t=(0,E.arrayMap)(this.savedBorders,function(e){return e.id}).indexOf(e);t>-1&&this.savedBorders.splice(t,1)}},{key:"checkSavedBorders",value:function(e){var t=this,n=!1,r=this.countHide(e);return 4===r?(this.spliceBorder(e.id),n=!0):(0,E.arrayEach)(this.savedBorders,function(r,o){if(e.id===r.id)return t.savedBorders[o]=e,n=!0,!1}),n}},{key:"checkCustomSelectionsFromContextMenu",value:function(e,t,n){var r=!1;return(0,E.arrayEach)(this.hot.selection.highlight.customSelections,function(o){if(e.id===o.settings.id)return(0,S.objectEach)(o.instanceBorders,function(e){e.toggleHiddenClass(t,n)}),r=!0,!1}),r}},{key:"checkCustomSelections",value:function(e,t,n){var r=this.countHide(e),o=!1;return 4===r?(this.removeAllBorders(e.row,e.col),this.clearBordersFromSelectionSettings(e.id),this.clearNullCellRange(),o=!0):(0,E.arrayEach)(this.hot.selection.highlight.customSelections,function(r){if(e.id===r.settings.id)return r.cellRange=t,n&&(0,S.objectEach)(r.instanceBorders,function(t){t.changeBorderStyle(n,e)}),o=!0,!1}),o}},{key:"changeBorderSettings",value:function(){var e=this.hot.getSettings().customBorders;Array.isArray(e)?(e.length||(this.savedBorders=e),this.createCustomBorders(e)):void 0!==e&&this.createCustomBorders(this.savedBorders)}},{key:"onAfterContextMenuDefaultOptions",value:function(e){this.hot.getSettings().customBorders&&e.items.push({name:"---------"},{key:"borders",name:function(){return this.getTranslatedPhrase(T.CONTEXTMENU_ITEMS_BORDERS)},disabled:function(){return this.selection.isSelectedByCorner()},submenu:{items:[(0,R.top)(this),(0,R.right)(this),(0,R.bottom)(this),(0,R.left)(this),(0,R.noBorders)(this)]}})}},{key:"onAfterInit",value:function(){this.changeBorderSettings()}},{key:"destroy",value:function(){g(y(t.prototype),"destroy",this).call(this)}}]),t}(b.default);(0,C.registerPlugin)("customBorders",N);var D=N;t.default=D},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}t.__esModule=!0;var o=r(n(713));t.bottom=o.default;var i=r(n(714));t.left=i.default;var a=r(n(715));t.noBorders=a.default;var s=r(n(716));t.right=s.default;var l=r(n(717));t.top=l.default},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(e){return{key:"borders:bottom",name:function(){var e=this.getTranslatedPhrase(i.CONTEXTMENU_ITEMS_BORDERS_BOTTOM),t=(0,a.checkSelectionBorders)(this,"bottom");return t&&(e=(0,a.markSelected)(e)),e},callback:function(t,n){var r=(0,a.checkSelectionBorders)(this,"bottom");e.prepareBorder(n,"bottom",r)}}}t.__esModule=!0,t.default=o;var i=r(n(11)),a=n(69)},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(e){return{key:"borders:left",name:function(){var e=this.getTranslatedPhrase(i.CONTEXTMENU_ITEMS_BORDERS_LEFT),t=(0,a.checkSelectionBorders)(this,"left");return t&&(e=(0,a.markSelected)(e)),e},callback:function(t,n){var r=(0,a.checkSelectionBorders)(this,"left");e.prepareBorder(n,"left",r)}}}t.__esModule=!0,t.default=o;var i=r(n(11)),a=n(69)},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(e){return{key:"borders:no_borders",name:function(){return this.getTranslatedPhrase(i.CONTEXTMENU_ITEMS_REMOVE_BORDERS)},callback:function(t,n){e.prepareBorder(n,"noBorders")},disabled:function(){return!(0,a.checkSelectionBorders)(this)}}}t.__esModule=!0,t.default=o;var i=r(n(11)),a=n(69)},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(e){return{key:"borders:right",name:function(){var e=this.getTranslatedPhrase(i.CONTEXTMENU_ITEMS_BORDERS_RIGHT),t=(0,a.checkSelectionBorders)(this,"right");return t&&(e=(0,a.markSelected)(e)),e},callback:function(t,n){var r=(0,a.checkSelectionBorders)(this,"right");e.prepareBorder(n,"right",r)}}}t.__esModule=!0,t.default=o;var i=r(n(11)),a=n(69)},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(e){return{key:"borders:top",name:function(){var e=this.getTranslatedPhrase(i.CONTEXTMENU_ITEMS_BORDERS_TOP),t=(0,a.checkSelectionBorders)(this,"top");return t&&(e=(0,a.markSelected)(e)),e},callback:function(t,n){var r=(0,a.checkSelectionBorders)(this,"top");e.prepareBorder(n,"top",r)}}}t.__esModule=!0,t.default=o;var i=r(n(11)),a=n(69)},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var n=0;nthis.boundaries.bottom&&(r=t-this.boundaries.bottom),ethis.boundaries.right&&(n=e-this.boundaries.right),this.callback(n,r)}},{key:"registerEvents",value:function(){var e=this;this.eventManager.addEventListener(document,"mouseup",function(){return e.onMouseUp()}),this.eventManager.addEventListener(document,"mousemove",function(t){return e.onMouseMove(t)})}},{key:"unregisterEvents",value:function(){this.eventManager.clear()}},{key:"setupListening",value:function(){var e=this.hot.view.wt.wtTable.holder;e!==window&&(this.setBoundaries(e.getBoundingClientRect()),this.setCallback(function(t,n){t<0?e.scrollLeft-=50:t>0&&(e.scrollLeft+=50),n<0?e.scrollTop-=20:n>0&&(e.scrollTop+=20)}),this.listening=!0)}},{key:"onMouseMove",value:function(e){this.listening&&this.check(e.clientX,e.clientY)}},{key:"onMouseUp",value:function(){this.listening=!1}},{key:"destroy",value:function(){u(f(t.prototype),"destroy",this).call(this)}}]),t}(g.default);(0,y.registerPlugin)("dragToScroll",m);var w=m;t.default=w},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var n=0;nn.fixedColumnsLeft-1)){var r=this.getBestColumnReturnPosition(e);t.moveByFreeze=!0,n.fixedColumnsLeft-=1,this.getMovePlugin().moveColumn(e,r+1)}}},{key:"getMovePlugin",value:function(){return this.manualColumnMovePlugin||(this.manualColumnMovePlugin=this.hot.getPlugin("manualColumnMove")),this.manualColumnMovePlugin}},{key:"getBestColumnReturnPosition",value:function(e){var t,n=this.getMovePlugin(),r=this.hot.getSettings(),o=r.fixedColumnsLeft,i=n.columnsMapper.getValueByIndex(o);if(null===this.frozenColumnsBasePositions[e]||void 0===this.frozenColumnsBasePositions[e])for(t=n.columnsMapper.getValueByIndex(e);null!==i&&i<=t;)o+=1,i=n.columnsMapper.getValueByIndex(o);else{for(t=this.frozenColumnsBasePositions[e],this.frozenColumnsBasePositions[e]=void 0;null!==i&&i<=t;)o+=1,i=n.columnsMapper.getValueByIndex(o);o=i}return o-1}},{key:"addContextMenuEntry",value:function(e){e.items.push({name:"---------"},(0,m.default)(this),(0,w.default)(this))}},{key:"onAfterInit",value:function(){this.getMovePlugin().isEnabled()||this.getMovePlugin().enablePlugin()}},{key:"onBeforeColumnMove",value:function(e,t){var n=b.get(this);if(n.afterFirstUse&&!n.moveByFreeze){var r=this.hot.getSettings().fixedColumnsLeft,o=t1?t=!0:(e[0].from.col!==e[0].to.col||e[0].from.col<=this.getSettings().fixedColumnsLeft-1)&&(t=!0),t}}}t.__esModule=!0,t.default=l;var u=r(n(11))},function(e,t,n){"use strict";function r(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n)){var r=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,n):{};r.get||r.set?Object.defineProperty(t,n,r):t[n]=e[n]}return t.default=e,t}function o(e,t){return s(e)||a(e,t)||i()}function i(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function a(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{r||null==s.return||s.return()}finally{if(o)throw i}}return n}function s(e){if(Array.isArray(e))return e}function l(e){return{key:"unfreeze_column",name:function(){return this.getTranslatedPhrase(u.CONTEXTMENU_ITEMS_UNFREEZE_COLUMN)},callback:function(t,n){var r=o(n,1),i=r[0].start.col;e.unfreezeColumn(i),this.render(),this.view.wt.wtOverlays.adjustElementsSize(!0)},hidden:function(){var e=this.getSelectedRange(),t=!1;return void 0===e?t=!0:e.length>1?t=!0:(e[0].from.col!==e[0].to.col||e[0].from.col>=this.getSettings().fixedColumnsLeft)&&(t=!0),t}}}t.__esModule=!0,t.default=l;var u=r(n(11))},function(e,t){},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e){return l(e)||s(e)||a()}function a(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function s(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}function l(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t0?e.target.col=0:e.target.col=t>0?t-1:t;else if(e.target.TD.offsetWidth/2+a<=s){var d=e.coordsColumn>=e.countCols?e.countCols-1:e.coordsColumn;e.target.col=d+1,a+=e.target.TD.offsetWidth,e.target.col>n&&n=e.fixedColumns&&t>0&&this.hot.scrollViewportTo(void 0,t-1);e.target.col<=t&&e.target.col>=e.fixedColumns&&t>0&&this.hot.scrollViewportTo(void 0,t-1);var p=s,g=a;s+f+c>=l?p=l-f-c:s+c=l-1?g=l-1:0===g?g=1:void 0!==o.scrollX&&e.coordsColumne){var r=e-1,o=[];(0,C.arrayEach)(this.columnsMapper._arrayMap,function(e,t){e>r&&o.push(t)}),this.columnsMapper.removeItems(o)}}},{key:"registerEvents",value:function(){var e=this;this.eventManager.addEventListener(document.documentElement,"mousemove",function(t){return e.onMouseMove(t)}),this.eventManager.addEventListener(document.documentElement,"mouseup",function(){return e.onMouseUp()})}},{key:"unregisterEvents",value:function(){this.eventManager.clear()}},{key:"onBeforeOnCellMouseDown",value:function(e,t,n,r){var o=this.hot.view.wt.wtTable,i=this.hot.selection.isSelectedByColumnHeader(),a=this.hot.getSelectedRangeLast(),s=M.get(this),l=e.realTarget.className.indexOf("sortAction")>-1;if(!a||!i||s.pressed||0!==e.button||l)return s.pressed=!1,s.columnsToMove.length=0,void(0,S.removeClass)(this.hot.rootElement,[A,D]);var u=this.guideline.isBuilt()&&!this.guideline.isAppended(),c=this.backlight.isBuilt()&&!this.backlight.isAppended();u&&c&&(this.guideline.appendTo(o.hider),this.backlight.appendTo(o.hider));var f=a.from,h=a.to,d=Math.min(f.col,h.col),p=Math.max(f.col,h.col);if(t.row<0&&t.col>=d&&t.col<=p){r.column=!0,s.pressed=!0,s.target.eventPageX=e.pageX,s.coordsColumn=t.col,s.target.TD=n,s.target.col=t.col,s.columnsToMove=this.prepareColumnsToMoving(d,p),s.hasRowHeaders=!!this.hot.getSettings().rowHeaders,s.countCols=this.hot.countCols(),s.fixedColumns=this.hot.getSettings().fixedColumnsLeft,s.rootElementOffset=(0,S.offset)(this.hot.rootElement).left;var g=s.hasRowHeaders?-1:0,v=o.holder.scrollTop+o.getColumnHeaderHeight(0)+1,y=t.col-1?(0,S.removeClass)(this.hot.rootElement,D):(0,S.addClass)(this.hot.rootElement,D),r.row=!0,r.column=!0,r.cell=!0,i.coordsColumn=t.col,i.target.TD=n)}},{key:"onMouseUp",value:function(){var e=M.get(this);if(e.coordsColumn=void 0,e.pressed=!1,e.backlightWidth=0,(0,S.removeClass)(this.hot.rootElement,[A,D,P]),this.hot.selection.isSelectedByColumnHeader()&&(0,S.addClass)(this.hot.rootElement,P),!(e.columnsToMove.length<1||void 0===e.target.col||e.columnsToMove.indexOf(e.target.col)>-1)){if(this.moveColumns(e.columnsToMove,e.target.col),this.persistentStateSave(),this.hot.render(),this.hot.view.wt.wtOverlays.adjustElementsSize(!0),!e.disallowMoving){var t=this.columnsMapper.getIndexByValue(e.columnsToMove[0]),n=this.columnsMapper.getIndexByValue(e.columnsToMove[e.columnsToMove.length-1]);this.changeSelection(t,n)}e.columnsToMove.length=0}}},{key:"onAfterScrollVertically",value:function(){var e=this.hot.view.wt.wtTable,t=e.getColumnHeaderHeight(0)+1,n=e.holder.scrollTop,r=t+n;this.backlight.setPosition(r),this.backlight.setSize(null,e.hider.offsetHeight-r)}},{key:"onAfterCreateCol",value:function(e,t){this.columnsMapper.shiftItems(e,t)}},{key:"onBeforeRemoveCol",value:function(e,t){var n=this;this.removedColumns.length=0,!1!==e&&(0,_.rangeEach)(e,e+t-1,function(e){n.removedColumns.push(n.hot.runHooks("modifyCol",e,n.pluginName))})}},{key:"onAfterRemoveCol",value:function(){this.columnsMapper.unshiftItems(this.removedColumns)}},{key:"onAfterLoadData",value:function(){this.updateColumnsMapper()}},{key:"onModifyCol",value:function(e,t){var n=e;if(t!==this.pluginName){var r=this.columnsMapper.getValueByIndex(n);n=null===r?n:r}return n}},{key:"onUnmodifyCol",value:function(e){var t=this.columnsMapper.getIndexByValue(e);return null===t?e:t}},{key:"onAfterPluginsInitialized",value:function(){this.updateColumnsMapper(),this.initialSettings(),this.backlight.build(),this.guideline.build()}},{key:"destroy",value:function(){this.backlight.destroy(),this.guideline.destroy(),d(g(t.prototype),"destroy",this).call(this)}}]),t}(w.default);(0,O.registerPlugin)("ManualColumnMove",L);var H=L;t.default=H},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var n=0;n=0){var o=this.currentTH.getBoundingClientRect();if(this.currentCol=n,this.selectedCols=[],this.hot.selection.isSelected()&&this.hot.selection.isSelectedByColumnHeader()){var i=this.hot.getSelectedRangeLast(),a=i.from,s=i.to,l=a.col,u=s.col;l>=u&&(l=s.col,u=a.col),this.currentCol>=l&&this.currentCol<=u?(0,b.rangeEach)(l,u,function(e){return t.selectedCols.push(e)}):this.selectedCols.push(this.currentCol)}else this.selectedCols.push(this.currentCol);this.startOffset=o.left-6,this.startWidth=parseInt(o.width,10),this.handle.style.top="".concat(o.top,"px"),this.handle.style.left="".concat(this.startOffset+this.startWidth,"px"),this.handle.style.height="".concat(r,"px"),this.hot.rootElement.appendChild(this.handle)}}},{key:"refreshHandlePosition",value:function(){this.handle.style.left="".concat(this.startOffset+this.currentWidth,"px")}},{key:"setupGuidePosition",value:function(){var e=parseInt((0,v.outerHeight)(this.handle),10),t=parseInt(this.handle.style.top,10)+e,n=parseInt(this.hot.view.maximumVisibleElementHeight(0),10);(0,v.addClass)(this.handle,"active"),(0,v.addClass)(this.guide,"active"),this.guide.style.top="".concat(t,"px"),this.guide.style.left=this.handle.style.left,this.guide.style.height="".concat(n-e,"px"),this.hot.rootElement.appendChild(this.guide)}},{key:"refreshGuidePosition",value:function(){this.guide.style.left=this.handle.style.left}},{key:"hideHandleAndGuide",value:function(){(0,v.removeClass)(this.handle,"active"),(0,v.removeClass)(this.guide,"active")}},{key:"checkIfColumnHeader",value:function(e){if(e!==this.hot.rootElement){var t=e.parentNode;return"THEAD"===t.tagName||this.checkIfColumnHeader(t)}return!1}},{key:"getTHFromTargetElement",value:function(e){return"TABLE"!==e.tagName?"TH"===e.tagName?e:this.getTHFromTargetElement(e.parentNode):null}},{key:"onMouseOver",value:function(e){if(this.checkIfColumnHeader(e.target)){var t=this.getTHFromTargetElement(e.target);if(!t)return;var n=t.getAttribute("colspan");!t||null!==n&&1!==n||this.pressed||this.setupHandlePosition(t)}}},{key:"afterMouseDownTimeout",value:function(){var e=this,t=function(){e.hot.forceFullRender=!0,e.hot.view.render(),e.hot.view.wt.wtOverlays.adjustElementsSize(!0)},n=function(n,r){var o=e.hot.runHooks("beforeColumnResize",n,e.newSize,!0);void 0!==o&&(e.newSize=o),"all"===e.hot.getSettings().stretchH?e.clearManualSize(n):e.setManualSize(n,e.newSize),r&&t(),e.saveManualColumnWidths(),e.hot.runHooks("afterColumnResize",n,e.newSize,!0)};if(this.dblclick>=2){var r=this.selectedCols.length;r>1?((0,w.arrayEach)(this.selectedCols,function(e){n(e)}),t()):(0,w.arrayEach)(this.selectedCols,function(e){n(e,!0)})}this.dblclick=0,this.autoresizeTimeout=null}},{key:"onMouseDown",value:function(e){var t=this;(0,v.hasClass)(e.target,"manualColumnResizer")&&(this.setupGuidePosition(),this.pressed=this.hot,null===this.autoresizeTimeout&&(this.autoresizeTimeout=setTimeout(function(){return t.afterMouseDownTimeout()},500),this.hot._registerTimeout(this.autoresizeTimeout)),this.dblclick+=1,this.startX=(0,m.pageX)(e),this.newSize=this.startWidth)}},{key:"onMouseMove",value:function(e){var t=this;this.pressed&&(this.currentWidth=this.startWidth+((0,m.pageX)(e)-this.startX),(0,w.arrayEach)(this.selectedCols,function(e){t.newSize=t.setManualSize(e,t.currentWidth)}),this.refreshHandlePosition(),this.refreshGuidePosition())}},{key:"onMouseUp",value:function(){var e=this,t=function(){e.hot.forceFullRender=!0,e.hot.view.render(),e.hot.view.wt.wtOverlays.adjustElementsSize(!0)},n=function(n,r){e.hot.runHooks("beforeColumnResize",n,e.newSize,!1),r&&t(),e.saveManualColumnWidths(),e.hot.runHooks("afterColumnResize",n,e.newSize)};if(this.pressed){if(this.hideHandleAndGuide(),this.pressed=!1,this.newSize!==this.startWidth){var r=this.selectedCols.length;r>1?((0,w.arrayEach)(this.selectedCols,function(e){n(e)}),t()):(0,w.arrayEach)(this.selectedCols,function(e){n(e,!0)})}this.setupHandlePosition(this.currentTH)}}},{key:"bindEvents",value:function(){var e=this;this.eventManager.addEventListener(this.hot.rootElement,"mouseover",function(t){return e.onMouseOver(t)}),this.eventManager.addEventListener(this.hot.rootElement,"mousedown",function(t){return e.onMouseDown(t)}),this.eventManager.addEventListener(window,"mousemove",function(t){return e.onMouseMove(t)}),this.eventManager.addEventListener(window,"mouseup",function(){return e.onMouseUp()})}},{key:"setManualSize",value:function(e,t){var n=Math.max(t,20),r=this.hot.runHooks("modifyCol",e);return this.manualColumnWidths[r]=n,n}},{key:"clearManualSize",value:function(e){var t=this.hot.runHooks("modifyCol",e);this.manualColumnWidths[t]=void 0}},{key:"onModifyColWidth",value:function(e,t){var n=e;if(this.enabled){var r=this.hot.runHooks("modifyCol",t),o=this.manualColumnWidths[r];this.hot.getSettings().manualColumnResize&&o&&(n=o)} return n}},{key:"onBeforeStretchingColumnWidth",value:function(e,t){var n=this.manualColumnWidths[t];return void 0===n&&(n=e),n}},{key:"onBeforeColumnResize",value:function(){this.hot.view.wt.wtViewport.hasOversizedColumnHeadersMarked={}}}]),t}(g.default);(0,C.registerPlugin)("manualColumnResize",S);var _=S;t.default=_},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e){return l(e)||s(e)||a()}function a(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function s(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}function l(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);tthis.hot.getSettings().fixedRowsBottom}},{key:"persistentStateSave",value:function(){this.hot.runHooks("persistentStateSave","manualRowMove",this.rowsMapper._arrayMap)}},{key:"persistentStateLoad",value:function(){var e={};return this.hot.runHooks("persistentStateLoad","manualRowMove",e),e.value?e.value:[]}},{key:"prepareRowsToMoving",value:function(){var e=this.hot.getSelectedRangeLast(),t=[];if(!e)return t;var n=e.from,r=e.to,o=Math.min(n.row,r.row),i=Math.max(n.row,r.row);return(0,_.rangeEach)(o,i,function(e){t.push(e)}),t}},{key:"refreshPositions",value:function(){var e=M.get(this),t=e.target.coords,n=this.hot.view.wt.wtTable.getFirstVisibleRow(),r=this.hot.view.wt.wtTable.getLastVisibleRow(),o=this.hot.getSettings().fixedRowsTop,i=this.hot.countRows();t.row0&&this.hot.scrollViewportTo(n-1),t.row>=r&&r0?n-1:n:s.offsetHeight/2+u<=c?(e.target.row=t.row+1,u+=0===t.row?s.offsetHeight-1:s.offsetHeight):e.target.row=t.row;var g=c,v=u;c+p+d>=f?g=f-p-d:c+d=f-1&&(v=f-1);var y=0;this.hot.view.wt.wtOverlays.topOverlay&&(y=this.hot.view.wt.wtOverlays.topOverlay.clone.wtTable.TABLE.offsetHeight),t.row>=o&&v-a.holder.scrollTope){var r=e-1,o=[];(0,C.arrayEach)(this.rowsMapper._arrayMap,function(e,t){e>r&&o.push(t)}),this.rowsMapper.removeItems(o)}}},{key:"registerEvents",value:function(){var e=this;this.eventManager.addEventListener(document.documentElement,"mousemove",function(t){return e.onMouseMove(t)}),this.eventManager.addEventListener(document.documentElement,"mouseup",function(){return e.onMouseUp()})}},{key:"unregisterEvents",value:function(){this.eventManager.clear()}},{key:"onBeforeColumnSort",value:function(e,t){var n=M.get(this);n.disallowMoving=void 0!==t}},{key:"onBeforeOnCellMouseDown",value:function(e,t,n,r){var o=this.hot.view.wt.wtTable,i=this.hot.selection.isSelectedByRowHeader(),a=this.hot.getSelectedRangeLast(),s=M.get(this);if(!a||!i||s.pressed||0!==e.button)return s.pressed=!1,s.rowsToMove.length=0,void(0,S.removeClass)(this.hot.rootElement,[A,D]);var l=this.guideline.isBuilt()&&!this.guideline.isAppended(),u=this.backlight.isBuilt()&&!this.backlight.isAppended();l&&u&&(this.guideline.appendTo(o.hider),this.backlight.appendTo(o.hider));var c=a.from,f=a.to,h=Math.min(c.row,f.row),d=Math.max(c.row,f.row);if(t.col<0&&t.row>=h&&t.row<=d){r.row=!0,s.pressed=!0,s.target.eventPageY=e.pageY,s.target.coords=t,s.target.TD=n,s.rowsToMove=this.prepareRowsToMoving();var p=o.holder.scrollLeft+this.hot.view.wt.wtViewport.getRowHeaderWidth();this.backlight.setPosition(null,p),this.backlight.setSize(o.hider.offsetWidth-p,this.getRowsHeight(h,d+1)),this.backlight.setOffset(-1*(this.getRowsHeight(h,t.row)+e.layerY),null),(0,S.addClass)(this.hot.rootElement,A),this.refreshPositions()}else(0,S.removeClass)(this.hot.rootElement,P),s.pressed=!1,s.rowsToMove.length=0}},{key:"onMouseMove",value:function(e){var t=M.get(this);if(t.pressed){if(e.realTarget===this.backlight.element){var n=this.backlight.getSize().height;this.backlight.setSize(null,0),setTimeout(function(){this.backlight.setPosition(null,n)})}t.target.eventPageY=e.pageY,this.refreshPositions()}}},{key:"onBeforeOnCellMouseOver",value:function(e,t,n,r){var o=this.hot.getSelectedRangeLast(),i=M.get(this);o&&i.pressed&&(i.rowsToMove.indexOf(t.row)>-1?(0,S.removeClass)(this.hot.rootElement,D):(0,S.addClass)(this.hot.rootElement,D),r.row=!0,r.column=!0,r.cell=!0,i.target.coords=t,i.target.TD=n)}},{key:"onMouseUp",value:function(){var e=M.get(this),t=e.target.row,n=e.rowsToMove.length;if(e.pressed=!1,e.backlightHeight=0,(0,S.removeClass)(this.hot.rootElement,[A,D,P]),this.hot.selection.isSelectedByRowHeader()&&(0,S.addClass)(this.hot.rootElement,P),!(n<1||void 0===t||e.rowsToMove.indexOf(t)>-1||e.rowsToMove[n-1]===t-1)){if(this.moveRows(e.rowsToMove,t),this.persistentStateSave(),this.hot.render(),!e.disallowMoving){var r=this.rowsMapper.getIndexByValue(e.rowsToMove[0]),o=this.rowsMapper.getIndexByValue(e.rowsToMove[n-1]);this.changeSelection(r,o)}e.rowsToMove.length=0}}},{key:"onAfterScrollHorizontally",value:function(){var e=this.hot.view.wt.wtTable,t=this.hot.view.wt.wtViewport.getRowHeaderWidth(),n=e.holder.scrollLeft,r=t+n;this.backlight.setPosition(null,r),this.backlight.setSize(e.hider.offsetWidth-r)}},{key:"onAfterCreateRow",value:function(e,t){this.rowsMapper.shiftItems(e,t)}},{key:"onBeforeRemoveRow",value:function(e,t){var n=this;this.removedRows.length=0,!1!==e&&(0,_.rangeEach)(e,e+t-1,function(e){n.removedRows.push(n.hot.runHooks("modifyRow",e,n.pluginName))})}},{key:"onAfterRemoveRow",value:function(){this.rowsMapper.unshiftItems(this.removedRows)}},{key:"onAfterLoadData",value:function(){this.updateRowsMapper()}},{key:"onModifyRow",value:function(e,t){var n=e;if(t!==this.pluginName){var r=this.rowsMapper.getValueByIndex(n);n=null===r?n:r}return n}},{key:"onUnmodifyRow",value:function(e){var t=this.rowsMapper.getIndexByValue(e);return null===t?e:t}},{key:"onAfterPluginsInitialized",value:function(){this.updateRowsMapper(),this.initialSettings(),this.backlight.build(),this.guideline.build()}},{key:"destroy",value:function(){this.backlight.destroy(),this.guideline.destroy(),this.rowsMapper.destroy(),d(g(t.prototype),"destroy",this).call(this)}}]),t}(w.default);(0,O.registerPlugin)("ManualRowMove",L);var H=L;t.default=H},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var n=0;n=0){var o=this.currentTH.getBoundingClientRect();if(this.currentRow=n,this.selectedRows=[],this.hot.selection.isSelected()&&this.hot.selection.isSelectedByRowHeader()){var i=this.hot.getSelectedRangeLast(),a=i.from,s=i.to,l=a.row,u=s.row;l>=u&&(l=s.row,u=a.row),this.currentRow>=l&&this.currentRow<=u?(0,b.rangeEach)(l,u,function(e){return t.selectedRows.push(e)}):this.selectedRows.push(this.currentRow)}else this.selectedRows.push(this.currentRow);this.startOffset=o.top-6,this.startHeight=parseInt(o.height,10),this.handle.style.left="".concat(o.left,"px"),this.handle.style.top="".concat(this.startOffset+this.startHeight,"px"),this.handle.style.width="".concat(r,"px"),this.hot.rootElement.appendChild(this.handle)}}},{key:"refreshHandlePosition",value:function(){this.handle.style.top="".concat(this.startOffset+this.currentHeight,"px")}},{key:"setupGuidePosition",value:function(){var e=parseInt((0,v.outerWidth)(this.handle),10),t=parseInt(this.handle.style.left,10)+e,n=parseInt(this.hot.view.maximumVisibleElementWidth(0),10);(0,v.addClass)(this.handle,"active"),(0,v.addClass)(this.guide,"active"),this.guide.style.top=this.handle.style.top,this.guide.style.left="".concat(t,"px"),this.guide.style.width="".concat(n-e,"px"),this.hot.rootElement.appendChild(this.guide)}},{key:"refreshGuidePosition",value:function(){this.guide.style.top=this.handle.style.top}},{key:"hideHandleAndGuide",value:function(){(0,v.removeClass)(this.handle,"active"),(0,v.removeClass)(this.guide,"active")}},{key:"checkIfRowHeader",value:function(e){if(e!==this.hot.rootElement){var t=e.parentNode;return"TBODY"===t.tagName||this.checkIfRowHeader(t)}return!1}},{key:"getTHFromTargetElement",value:function(e){return"TABLE"!==e.tagName?"TH"===e.tagName?e:this.getTHFromTargetElement(e.parentNode):null}},{key:"onMouseOver",value:function(e){if(this.checkIfRowHeader(e.target)){var t=this.getTHFromTargetElement(e.target);t&&(this.pressed||this.setupHandlePosition(t))}}},{key:"afterMouseDownTimeout",value:function(){var e=this,t=function(){e.hot.forceFullRender=!0,e.hot.view.render(),e.hot.view.wt.wtOverlays.adjustElementsSize(!0)},n=function(n,r){var o=e.hot.runHooks("beforeRowResize",n,e.newSize,!0);void 0!==o&&(e.newSize=o),e.setManualSize(n,e.newSize),r&&t(),e.hot.runHooks("afterRowResize",n,e.newSize,!0)};if(this.dblclick>=2){var r=this.selectedRows.length;r>1?((0,w.arrayEach)(this.selectedRows,function(e){n(e)}),t()):(0,w.arrayEach)(this.selectedRows,function(e){n(e,!0)})}this.dblclick=0,this.autoresizeTimeout=null}},{key:"onMouseDown",value:function(e){var t=this;(0,v.hasClass)(e.target,"manualRowResizer")&&(this.setupGuidePosition(),this.pressed=this.hot,null===this.autoresizeTimeout&&(this.autoresizeTimeout=setTimeout(function(){return t.afterMouseDownTimeout()},500),this.hot._registerTimeout(this.autoresizeTimeout)),this.dblclick+=1,this.startY=(0,m.pageY)(e),this.newSize=this.startHeight)}},{key:"onMouseMove",value:function(e){var t=this;this.pressed&&(this.currentHeight=this.startHeight+((0,m.pageY)(e)-this.startY),(0,w.arrayEach)(this.selectedRows,function(e){t.newSize=t.setManualSize(e,t.currentHeight)}),this.refreshHandlePosition(),this.refreshGuidePosition())}},{key:"onMouseUp",value:function(){var e=this,t=function(){e.hot.forceFullRender=!0,e.hot.view.render(),e.hot.view.wt.wtOverlays.adjustElementsSize(!0)},n=function(n,r){e.hot.runHooks("beforeRowResize",n,e.newSize),r&&t(),e.saveManualRowHeights(),e.hot.runHooks("afterRowResize",n,e.newSize,!1)};if(this.pressed){if(this.hideHandleAndGuide(),this.pressed=!1,this.newSize!==this.startHeight){var r=this.selectedRows.length;r>1?((0,w.arrayEach)(this.selectedRows,function(e){n(e)}),t()):(0,w.arrayEach)(this.selectedRows,function(e){n(e,!0)})}this.setupHandlePosition(this.currentTH)}}},{key:"bindEvents",value:function(){var e=this;this.eventManager.addEventListener(this.hot.rootElement,"mouseover",function(t){return e.onMouseOver(t)}),this.eventManager.addEventListener(this.hot.rootElement,"mousedown",function(t){return e.onMouseDown(t)}),this.eventManager.addEventListener(window,"mousemove",function(t){return e.onMouseMove(t)}),this.eventManager.addEventListener(window,"mouseup",function(){return e.onMouseUp()})}},{key:"setManualSize",value:function(e,t){var n=this.hot.runHooks("modifyRow",e);return this.manualRowHeights[n]=t,t}},{key:"onModifyRowHeight",value:function(e,t){if(this.enabled){var n=this.hot.getPlugin("autoRowSize"),r=n?n.heights[t]:null,o=this.hot.runHooks("modifyRow",t),i=this.manualRowHeights[o];if(void 0!==i&&(i===r||i>(e||0)))return i}return e}}]),t}(g.default);(0,C.registerPlugin)("manualRowResize",S);var _=S;t.default=_},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t){return l(e)||s(e,t)||a()}function a(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function s(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{r||null==s.return||s.return()}finally{if(o)throw i}}return n}function l(e){if(Array.isArray(e))return e}function u(e){return h(e)||f(e)||c()}function c(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function f(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}function h(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t1&&void 0!==arguments[1]&&arguments[1];return!!t||this.validateSetting(e)}},{key:"toggleMergeOnSelection",value:function(){ var e=this.hot.getSelectedRangeLast();if(e){e.setDirection("NW-SE");var t=e.from,n=e.to;this.toggleMerge(e),this.hot.selectCell(t.row,t.col,n.row,n.col,!1)}}},{key:"mergeSelection",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.hot.getSelectedRangeLast();if(e){e.setDirection("NW-SE");var t=e.from,n=e.to;this.unmergeRange(e,!0),this.mergeRange(e),this.hot.selectCell(t.row,t.col,n.row,n.col,!1)}}},{key:"unmergeSelection",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.hot.getSelectedRangeLast();if(e){var t=e.from,n=e.to;this.unmergeRange(e,!0),this.hot.selectCell(t.row,t.col,n.row,n.col,!1)}}},{key:"mergeRange",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=e.getTopLeftCorner(),i=e.getBottomRightCorner(),a={row:o.row,col:o.col,rowspan:i.row-o.row+1,colspan:i.col-o.col+1},s=[],l=null;if(!this.canMergeRange(a,n))return!1;this.hot.runHooks("beforeMergeCells",e,n),(0,x.rangeEach)(0,a.rowspan-1,function(e){(0,x.rangeEach)(0,a.colspan-1,function(n){var r=null;s[e]||(s[e]=[]),0===e&&0===n?r=t.hot.getDataAtCell(a.row,a.col):t.hot.setCellMeta(a.row+e,a.col+n,"hidden",!0),s[e][n]=r})}),this.hot.setCellMeta(a.row,a.col,"spanned",!0);var u=this.mergedCellsCollection.add(a);return!u||(r?l=[a.row,a.col,s]:this.hot.populateFromArray(a.row,a.col,s,void 0,void 0,this.pluginName),this.hot.runHooks("afterMergeCells",e,a,n),l)}},{key:"unmergeRange",value:function(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=this.mergedCellsCollection.getWithinRange(e);r&&(this.hot.runHooks("beforeUnmergeCells",e,n),(0,P.arrayEach)(r,function(e){t.mergedCellsCollection.remove(e.row,e.col),(0,x.rangeEach)(0,e.rowspan-1,function(n){(0,x.rangeEach)(0,e.colspan-1,function(r){t.hot.removeCellMeta(e.row+n,e.col+r,"hidden")})}),t.hot.removeCellMeta(e.row,e.col,"spanned")}),this.hot.render(),this.hot.runHooks("afterUnmergeCells",e,n))}},{key:"toggleMerge",value:function(e){var t=this.mergedCellsCollection.get(e.from.row,e.from.col),n=t.row===e.from.row&&t.col===e.from.col&&t.row+t.rowspan-1===e.to.row&&t.col+t.colspan-1===e.to.col;n?this.unmergeRange(e):this.mergeSelection(e)}},{key:"merge",value:function(e,t,n,r){var o=new R.CellCoords(e,t),i=new R.CellCoords(n,r);this.mergeRange(new R.CellRange(o,o,i))}},{key:"unmerge",value:function(e,t,n,r){var o=new R.CellCoords(e,t),i=new R.CellCoords(n,r);this.unmergeRange(new R.CellRange(o,o,i))}},{key:"onAfterInit",value:function(){this.generateFromSettings(this.hot.getSettings().mergeCells),this.hot.render()}},{key:"onBeforeKeyDown",value:function(e){var t=(e.ctrlKey||e.metaKey)&&!e.altKey;t&&77===e.keyCode&&(this.toggleMerge(this.hot.getSelectedRangeLast()),this.hot.render(),(0,T.stopImmediatePropagation)(e))}},{key:"onAfterIsMultipleSelection",value:function(e){if(e)for(var t=this.mergedCellsCollection.mergedCells,n=this.hot.getSelectedRangeLast(),r=0;r0?r.row=a.row+a.rowspan-1-i.row+e.row:e.row<0&&(r.row=i.row-a.row+e.row),e.col>0?r.col=a.col+a.colspan-1-i.col+e.col:e.col<0&&(r.col=i.col-a.col+e.col)}o=new R.CellCoords(n.highlight.row+r.row,n.highlight.col+r.col);var c=this.mergedCellsCollection.get(o.row,o.col);c&&(t.lastDesiredCoords=o,r={row:c.row-i.row,col:c.col-i.col}),0!==r.row&&(e.row=r.row),0!==r.col&&(e.col=r.col)}},{key:"onModifyTransformEnd",value:function(e){var t=this,n=this.hot.getSelectedRangeLast(),r=(0,L.clone)(e),o=this.selectionCalculations.getUpdatedSelectionRange(n,e),i=(0,L.clone)(r),a=this.mergedCellsCollection.getWithinRange(o,!0);do{i=(0,L.clone)(r),this.selectionCalculations.getUpdatedSelectionRange(n,r),(0,P.arrayEach)(a,function(e){t.selectionCalculations.snapDelta(r,n,e)})}while(r.row!==i.row||r.col!==i.col);e.row=r.row,e.col=r.col}},{key:"onModifyGetCellCoords",value:function(e,t){var n=this.mergedCellsCollection.get(e,t);return n?[n.row,n.col,n.row+n.rowspan-1,n.col+n.colspan-1]:void 0}},{key:"addMergeActionsToContextMenu",value:function(e){e.items.push({name:"---------"},(0,A.default)(this))}},{key:"onAfterRenderer",value:function(e,t,n){var r=this.mergedCellsCollection.get(t,n);(0,I.applySpanProperties)(e,r,t,n)}},{key:"onBeforeSetRangeEnd",value:function(e){var t=this.hot.getSelectedRangeLast();t.highlight=new R.CellCoords(t.highlight.row,t.highlight.col),t.to=e;var n=!1;if(!(0===t.from.row&&t.to.row===this.hot.countRows()-1||0===t.from.col&&t.to.col===this.hot.countCols()-1))do{n=!1;for(var r=0;re.endRow)return e.endRow=o,n.onAfterViewportRowCalculatorOverride.call(n,e)}return!0})}},{key:"onAfterViewportColumnCalculatorOverride",value:function(e){var t,n=this,r=this.hot.countRows();(0,x.rangeEach)(0,r-1,function(r){if(t=n.mergedCellsCollection.get(r,e.startColumn),t&&t.cole.endColumn)return e.endColumn=o,n.onAfterViewportColumnCalculatorOverride.call(n,e)}return!0})}},{key:"onModifyAutofillRange",value:function(e,t){this.autofillCalculations.correctSelectionAreaSize(t);var n=this.autofillCalculations.getDirection(t,e),r=e;if(this.autofillCalculations.dragAreaOverlapsCollections(t,r,n))return r=t,r;var o=this.mergedCellsCollection.getWithinRange({from:{row:t[0],col:t[1]},to:{row:t[2],col:t[3]}});return o?(r=this.autofillCalculations.snapDragArea(t,r,n,o),r):r}},{key:"onAfterCreateCol",value:function(e,t){this.mergedCellsCollection.shiftCollections("right",e,t)}},{key:"onAfterRemoveCol",value:function(e,t){this.mergedCellsCollection.shiftCollections("left",e,t)}},{key:"onAfterCreateRow",value:function(e,t,n){"auto"!==n&&this.mergedCellsCollection.shiftCollections("down",e,t)}},{key:"onAfterRemoveRow",value:function(e,t){this.mergedCellsCollection.shiftCollections("up",e,t)}},{key:"onAfterChange",value:function(e,t){"Autofill.fill"===t&&this.autofillCalculations.recreateAfterDataPopulation(e)}},{key:"onBeforeDrawAreaBorders",value:function(e,t){if(t&&"area"===t){var n=this.hot.getSelectedRangeLast(),r=this.mergedCellsCollection.getWithinRange(n);(0,P.arrayEach)(r,function(t){n.getBottomRightCorner().row===t.getLastRow()&&n.getBottomRightCorner().col===t.getLastColumn()&&(e[2]=t.row,e[3]=t.col)})}}},{key:"onAfterModifyTransformStart",value:function(e,t,n){if(this.enabled){var r=this.mergedCellsCollection.get(e.row,e.col);if(r){var o=t>0,i=t<0,a=n<0,s=n>0,l=r.row+r.rowspan-1==this.hot.countRows()-1,u=0===r.row,c=r.col+r.colspan-1==this.hot.countCols()-1,f=0===r.col;(o&&l||i&&u||s&&c||a&&f)&&(e.row=r.row,e.col=r.col)}}}},{key:"onAfterDrawSelection",value:function(e,t,n,r){return this.selectionCalculations.getSelectedMergedCellClassName(e,t,n,r)}},{key:"onBeforeRemoveCellClassNames",value:function(){return this.selectionCalculations.getSelectedMergedCellClassNameToRemove()}}]),t}(_.default);(0,O.registerPlugin)("mergeCells",F);var W=F;t.default=W},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(){var e=i(["The merged cell declared at [",", ","], overlaps with the other declared merged \n cell. The overlapping merged cell was not added to the table, please fix your setup."]);return o=function(){return e},e}function i(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function a(e){return u(e)||l(e)||s()}function s(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function l(e){if(Symbol.iterator in Object(e)||"[object Arguments]"===Object.prototype.toString.call(e))return Array.from(e)}function u(e){if(Array.isArray(e)){for(var t=0,n=new Array(e.length);t=e&&n.col<=t&&n.col+n.colspan-1>=t)||(r=n,!1)}),r}},{key:"getByRange",value:function(e){var t=this.mergedCells,n=!1;return(0,y.arrayEach)(t,function(t){return!(t.row<=e.from.row&&t.row+t.rowspan-1>=e.to.row&&t.col<=e.from.col&&t.col+t.colspan-1>=e.to.col)||(n=t,n)}),n}},{key:"getWithinRange",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=this.mergedCells,r=[],o=e;if(!o.includesRange){var i=new p.CellCoords(o.from.row,o.from.col),a=new p.CellCoords(o.to.row,o.to.col);o=new p.CellRange(i,i,a)}return(0,y.arrayEach)(n,function(e){var n=new p.CellCoords(e.row,e.col),i=new p.CellCoords(e.row+e.rowspan-1,e.col+e.colspan-1),a=new p.CellRange(n,n,i);t?o.overlaps(a)&&r.push(e):o.includesRange(a)&&r.push(e)}),!!r.length&&r}},{key:"add",value:function(t){var n=this.mergedCells,r=t.row,o=t.col,i=t.rowspan,a=t.colspan,s=new d.default(r,o,i,a),l=this.get(r,o),u=this.isOverlapping(s);return l||u?((0,v.warn)(e.IS_OVERLAPPING_WARNING(s)),!1):(this.hot&&s.normalize(this.hot),n.push(s),s)}},{key:"remove",value:function(e,t){var n=this.mergedCells,r=this.get(e,t),o=r?this.mergedCells.indexOf(r):null;return!(!r||!1===o)&&(n.splice(o,1),r)}},{key:"clear",value:function(){var e=this,t=this.mergedCells,n=[],r=[];(0,y.arrayEach)(t,function(t){var r=e.hot.getCell(t.row,t.col);r&&n.push([r,e.get(t.row,t.col),t.row,t.col])}),this.mergedCells.length=0,(0,y.arrayEach)(n,function(t,o){(0,g.rangeEach)(0,t.rowspan-1,function(n){(0,g.rangeEach)(0,t.colspan-1,function(o){if(0!==o||0!==n){var i=e.hot.getCell(t.row+n,t.col+o);i&&r.push([i,null,null,null])}})}),n[o][1]=null}),(0,y.arrayEach)(n,function(e){m.applySpanProperties.apply(void 0,a(e))}),(0,y.arrayEach)(r,function(e){m.applySpanProperties.apply(void 0,a(e))})}},{key:"isOverlapping",value:function(e){var t=new p.CellRange(null,new p.CellCoords(e.row,e.col),new p.CellCoords(e.row+e.rowspan-1,e.col+e.colspan-1)),n=!1;return(0,y.arrayEach)(this.mergedCells,function(e){var r=new p.CellRange(null,new p.CellCoords(e.row,e.col),new p.CellCoords(e.row+e.rowspan-1,e.col+e.colspan-1));return!r.overlaps(t)||(n=!0,!1)}),n}},{key:"isMergedParent",value:function(e,t){var n=this.mergedCells,r=!1;return(0,y.arrayEach)(n,function(n){return n.row!==e||n.col!==t||(r=!0,!1)}),r}},{key:"shiftCollections",value:function(e,t,n){var r=this,o=[0,0];switch(e){case"right":o[0]+=n;break;case"left":o[0]-=n;break;case"down":o[1]+=n;break;case"up":o[1]-=n}(0,y.arrayEach)(this.mergedCells,function(e){e.shift(o,t)}),(0,g.rangeEachReverse)(this.mergedCells.length-1,0,function(e){var t=r.mergedCells[e];t&&t.removed&&r.mergedCells.splice(r.mergedCells.indexOf(t),1)})}}],[{key:"IS_OVERLAPPING_WARNING",value:function(e){return(0,w.toSingleLine)(o(),e.row,e.col)}}]),e}(),C=b;t.default=C},function(e,t,n){"use strict";function r(e,t){return a(e)||i(e,t)||o()}function o(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function i(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{r||null==s.return||s.return()}finally{if(o)throw i}}return n}function a(e){if(Array.isArray(e))return e}function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){for(var n=0;n-1,d=h?c-l+1:f-u+1,p=Math.floor(a/d)*d,g=a-p,v=this.getFarthestCollection(e,t,n,o);if(v)if("down"===n){var y=v.row+v.rowspan-l-g,m=i[2]+y;m>=this.plugin.hot.countRows()?i[2]-=g:i[2]+=g?y:0}else if("right"===n){var w=v.col+v.colspan-u-g,b=i[3]+w;b>=this.plugin.hot.countCols()?i[3]-=g:i[3]+=g?w:0}else if("up"===n){var C=c-g-v.row+1,S=i[0]+C;S<0?i[0]+=g:i[0]-=g?C:0}else if("left"===n){var _=f-g-v.col+1,E=i[1]+_;E<0?i[1]+=g:i[1]-=g?_:0}return this.updateCurrentFillCache({baseArea:e,dragDirection:n,foundMergedCells:o,fillSize:a,dragArea:i,cycleLength:d}),i}},{key:"updateCurrentFillCache",value:function(e){this.currentFillData||(this.currentFillData={}),(0,c.extend)(this.currentFillData,e)}},{key:"getAutofillSize",value:function(e,t,n){var o=r(e,4),i=o[0],a=o[1],s=o[2],l=o[3],u=r(t,4),c=u[0],f=u[1],h=u[2],d=u[3];switch(n){case"up":return i-c;case"down":return h-s;case"left":return a-f;case"right":return d-l;default:return null}}},{key:"getDragArea",value:function(e,t,n){var o=r(e,4),i=o[0],a=o[1],s=o[2],l=o[3],u=r(t,4),c=u[0],f=u[1],h=u[2],d=u[3];switch(n){case"up":return[c,f,i-1,l];case"down":return[s+1,a,h,l];case"left":return[c,f,s,a-1];case"right":return[i,l+1,h,d];default:return null}}},{key:"getFarthestCollection",value:function(e,t,n,o){var i=r(e,4),a=i[0],s=i[1],l=i[2],u=i[3],c=["up","down"].indexOf(n)>-1,f=c?l:u,d=c?a:s,p=this.getAutofillSize(e,t,n),g=c?l-a+1:u-s+1,v=Math.floor(p/g)*g,y=p-v,m=null,w=null,b=null;switch(n){case"up":m="includesVertically",b=f-y+1;break;case"left":m="includesHorizontally",b=f-y+1;break;case"down":m="includesVertically",b=d+y-1;break;case"right":m="includesHorizontally",b=d+y-1}return(0,h.arrayEach)(o,function(e){e[m](b)&&e.isFarther(w,n)&&(w=e)}),w}},{key:"recreateAfterDataPopulation",value:function(e){if(this.currentFillData){var t=this.getRangeFromChanges(e),n=this.currentFillData.foundMergedCells,r=this.currentFillData.dragDirection,o=function(e,n){switch(r){case"up":return e.row-n>=t.from.row;case"down":return e.row+e.rowspan-1+n<=t.to.row;case"left":return e.col-n>=t.from.column;case"right":return e.col+e.colspan-1+n<=t.to.column;default:return null}},i=0,a=null,s=1;do{for(var l=0;ln.max)&&(n.max=o),(null===r.min||ir.max)&&(r.max=i)}),{from:{row:n.min,column:r.min},to:{row:n.max,column:r.max}}}},{key:"dragAreaOverlapsCollections",value:function(e,t,n){var o=this.getDragArea(e,t,n),i=r(o,4),a=i[0],s=i[1],l=i[2],u=i[3],c=new f.CellCoords(a,s),h=new f.CellCoords(l,u),d=new f.CellRange(c,c,h);return!!this.mergedCellsCollection.getWithinRange(d,!0)}}]),e}(),p=d;t.default=p},function(e,t,n){"use strict";function r(e,t){return a(e)||i(e,t)||o()}function o(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}function i(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{r||null==s.return||s.return()}finally{if(o)throw i}}return n}function a(e){if(Array.isArray(e))return e}function s(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t){for(var n=0;n0?o&&n!==i&&(r+=a-n+1):o&&n!==a&&(r-=n-i+1),e.row?e.row=r:e.col&&(e.col=r))}},{key:"getUpdatedSelectionRange",value:function(e,t){return new c.CellRange(e.highlight,e.from,new c.CellCoords(e.to.row+t.row,e.to.col+t.col))}},{key:"getSelectedMergedCellClassName",value:function(e,t,n,o){var i=r(n,4),a=i[0],s=i[1],l=i[2],u=i[3];if(void 0!==o&&e>=a&&e<=l&&t>=s&&t<=u){var c=this.plugin.mergedCellsCollection.isMergedParent(e,t);if(!c)return;var f=this.plugin.mergedCellsCollection.get(e,t);if(!f)return;if(f.row+f.rowspan-1<=l&&f.col+f.colspan-1<=u)return"".concat(this.fullySelectedMergedCellClassName,"-").concat(o);if(this.plugin.selectionCalculations.isMergeCellFullySelected(f,this.plugin.hot.getSelectedRange()))return"".concat(this.fullySelectedMergedCellClassName,"-multiple")}}},{key:"isMergeCellFullySelected",value:function(e,t){var n=[];if(!t||!e)return!1;for(var r=0;r0}}]),t}(y.default);(0,w.registerPlugin)("multipleSelectionHandles",C);var S=C;t.default=S},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var n=0;n0&&(e.patches=[],e.callback&&e.callback(o)),o}function d(e,t,o,i){for(var a=C(t),s=C(e),l=!1,u=s.length-1;u>=0;u--){var f=s[u],h=e[f];if(t.hasOwnProperty(f)){var p=t[f];"object"==r(h)&&null!=h&&"object"==r(p)&&null!=p?d(h,p,o,i+"/"+n(f)):h!=p&&(!0,o.push({op:"replace",path:i+"/"+n(f),value:c(p)}))}else o.push({op:"remove",path:i+"/"+n(f)}),l=!0}if(l||a.length!=s.length)for(u=0;u=48&&t<=57))return!1;n++}return!0}function g(e,t,n){for(var r,o,i=!1,a=0,s=t.length;a=h){i=E[r.op].call(r,c,o,e);break}if(b(c)){if("-"===o)o=c.length;else{if(n&&!p(o))throw new k("Expected an unsigned base-10 integer value, making the new referenced value the array element with the zero-based index","OPERATION_PATH_ILLEGAL_ARRAY_INDEX",a-1,r.path,r);o=parseInt(o,10)}if(f>=h){if(n&&"add"===r.op&&o>c.length)throw new k("The specified index MUST NOT be greater than the number of elements in the array","OPERATION_VALUE_OUT_OF_BOUNDS",a-1,r.path,r);i=_[r.op].call(r,c,o,e);break}}else if(o&&-1!=o.indexOf("~")&&(o=o.replace(/~1/g,"/").replace(/~0/g,"~")),f>=h){i=S[r.op].call(r,c,o,e);break}c=c[o]}}return i}function v(e,t){var n=[];return d(e,t,n,""),n}function y(e){if(void 0===e)return!0;if("array"==typeof e||"object"==r(e))for(var t in e)if(y(e[t]))return!0;return!1}function m(t,n,o,i){if("object"!==r(t)||null===t||b(t))throw new k("Operation is not an object","OPERATION_NOT_AN_OBJECT",n,t,o);if(!S[t.op])throw new k("Operation `op` property is not one of operations defined in RFC-6902","OPERATION_OP_INVALID",n,t,o);if("string"!=typeof t.path)throw new k("Operation `path` property is not a string","OPERATION_PATH_INVALID",n,t,o);if(("move"===t.op||"copy"===t.op)&&"string"!=typeof t.from)throw new k("Operation `from` property is not present (applicable in `move` and `copy` operations)","OPERATION_FROM_REQUIRED",n,t,o);if(("add"===t.op||"replace"===t.op||"test"===t.op)&&void 0===t.value)throw new k("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_REQUIRED",n,t,o);if(("add"===t.op||"replace"===t.op||"test"===t.op)&&y(t.value))throw new k("Operation `value` property is not present (applicable in `add`, `replace` and `test` operations)","OPERATION_VALUE_CANNOT_CONTAIN_UNDEFINED",n,t,o);if(o)if("add"==t.op){var a=t.path.split("/").length,s=i.split("/").length;if(a!==s+1&&a!==s)throw new k("Cannot perform an `add` operation at the desired path","OPERATION_PATH_CANNOT_ADD",n,t,o)}else if("replace"===t.op||"remove"===t.op||"_get"===t.op){if(t.path!==i)throw new k("Cannot perform the operation at a path that does not exist","OPERATION_PATH_UNRESOLVABLE",n,t,o)}else if("move"===t.op||"copy"===t.op){var l={op:"_get",path:t.from,value:void 0},u=e.validate([l],o);if(u&&"OPERATION_PATH_UNRESOLVABLE"===u.name)throw new k("Cannot perform the operation from a path that does not exist","OPERATION_FROM_UNRESOLVABLE",n,t,o)}}function w(e,t){try{if(!b(e))throw new k("Patch sequence must be an array","SEQUENCE_NOT_AN_ARRAY");if(t)t=JSON.parse(JSON.stringify(t)),g.call(this,t,e,!0);else for(var n=0;n1&&void 0!==arguments[1]?arguments[1]:this.getCallback(),r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.getQueryMethod(),o=this.hot.countRows(),i=this.hot.countCols(),a=[],s=this.hot;return(0,S.rangeEach)(0,o-1,function(o){(0,S.rangeEach)(0,i-1,function(i){var l=t.hot.getDataAtCell(o,i),u=t.hot.getCellMeta(o,i),c=u.search.callback||n,f=u.search.queryMethod||r,h=f(e,l);if(h){var d={row:o,col:i,data:l};a.push(d)}c&&c(s,o,i,l,h)})}),a}},{key:"getCallback",value:function(){return this.callback}},{key:"setCallback",value:function(e){this.callback=e}},{key:"getQueryMethod",value:function(){return this.queryMethod}},{key:"setQueryMethod",value:function(e){this.queryMethod=e}},{key:"getSearchResultClass",value:function(){return this.searchResultClass}},{key:"setSearchResultClass",value:function(e){this.searchResultClass=e}},{key:"updatePluginSettings",value:function(e){(0,C.isObject)(e)&&(e.searchResultClass&&this.setSearchResultClass(e.searchResultClass),e.queryMethod&&this.setQueryMethod(e.queryMethod),e.callback&&this.setCallback(e.callback))}},{key:"onBeforeRenderer",value:function(e,t,n,r,o,a){var s,l=a.className||[],u=[];"string"==typeof l?u=l.split(" "):(s=u).push.apply(s,i(l));this.isEnabled()&&a.isSearchResult?u.includes(this.searchResultClass)||u.push("".concat(this.searchResultClass)):u.includes(this.searchResultClass)&&u.splice(u.indexOf(this.searchResultClass),1),a.className=u.join(" ")}},{key:"destroy",value:function(){p(v(t.prototype),"destroy",this).call(this)}}]),t}(w.default);(0,b.registerPlugin)("search",R);var k=R;t.default=k},function(e,t,n){"use strict";function r(e){return e&&e.__esModule?e:{default:e}}function o(e){return o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o(e)}function i(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function a(e,t){for(var n=0;n0},d.prototype.isRedoAvailable=function(){return this.undoneActions.length>0},d.prototype.clear=function(){this.doneActions.length=0,this.undoneActions.length=0},d.Action=function(){},d.Action.prototype.undo=function(){},d.Action.prototype.redo=function(){},d.ChangeAction=function(e){this.changes=e,this.actionType="change"},(0,S.inherit)(d.ChangeAction,d.Action),d.ChangeAction.prototype.undo=function(e,t){for(var n=(0,S.deepClone)(this.changes),r=e.countEmptyRows(!0),o=e.countEmptyCols(!0),i=0,a=n.length;i=n&&this.index-rthis.target?this.rows[0]+this.rows.length:this.rows[0],i=[],a=this.rows.length+r,s=r;s"); var el = null; var originalValue = ( this.options.hasOwnProperty('loadDataDynamically') ) ? (this.originalValue + "").split(", ") : (this.originalValue + "").split(","); if (options.data && options.data.length) { for (var i = 0; i < options.data.length; i++) { el = $("
      ","
      "),e.push(o.stringRepeat(" ",i.indent)),s++,l=0,a=i[s]||Number.MAX_VALUE;0!=d.length&&(r+=d.length,l=this.$renderToken(e,l,h,d))}}},this.$renderSimpleLine=function(e,t){var i=0,n=t[0],r=n.value;this.displayIndentGuides&&(r=this.renderIndentGuide(e,r)),r&&(i=this.$renderToken(e,i,n,r));for(var o=1;o"),r.length){var o=this.session.getRowSplitData(t);o&&o.length?this.$renderWrappedLine(e,r,o,i):this.$renderSimpleLine(e,r)}this.showInvisibles&&(n&&(t=n.end.row),e.push("",t==this.session.getLength()-1?this.EOF_CHAR:this.EOL_CHAR,"")),i||e.push("
      ")},this.$getFoldLineTokens=function(e,t){function i(e,t,i){for(var n=0,o=0;o+e[n].value.lengthi-t&&(s=s.substring(0,i-t)),r.push({type:e[n].type,value:s}),o=t+s.length,n+=1}for(;oi?r.push({type:e[n].type,value:s.substring(0,i-o)}):r.push(e[n]),o+=s.length,n+=1}}var n=this.session,r=[],o=n.getTokens(e);return t.walk(function(e,t,s,a,l){null!=e?r.push({type:"fold",value:e}):(l&&(o=n.getTokens(t)),o.length&&i(o,a,s))},t.end.row,this.session.getLine(t.end.row).length),r},this.$useLineGroups=function(){return this.session.getUseWrapMode()},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.$measureNode&&this.$measureNode.parentNode.removeChild(this.$measureNode),delete this.$measureNode}}).call(a.prototype),t.Text=a}),ace.define("ace/layer/cursor",["require","exports","module","ace/lib/dom"],function(e,t,i){"use strict";var n,r=e("../lib/dom"),o=function(e){this.element=r.createElement("div"),this.element.className="ace_layer ace_cursor-layer",e.appendChild(this.element),void 0===n&&(n=!("opacity"in this.element.style)),this.isVisible=!1,this.isBlinking=!0,this.blinkInterval=1e3,this.smoothBlinking=!1,this.cursors=[],this.cursor=this.addCursor(),r.addCssClass(this.element,"ace_hidden-cursors"),this.$updateCursors=(n?this.$updateVisibility:this.$updateOpacity).bind(this)};(function(){this.$updateVisibility=function(e){for(var t=this.cursors,i=t.length;i--;)t[i].style.visibility=e?"":"hidden"},this.$updateOpacity=function(e){for(var t=this.cursors,i=t.length;i--;)t[i].style.opacity=e?"":"0"},this.$padding=0,this.setPadding=function(e){this.$padding=e},this.setSession=function(e){this.session=e},this.setBlinking=function(e){e!=this.isBlinking&&(this.isBlinking=e,this.restartTimer())},this.setBlinkInterval=function(e){e!=this.blinkInterval&&(this.blinkInterval=e,this.restartTimer())},this.setSmoothBlinking=function(e){e==this.smoothBlinking||n||(this.smoothBlinking=e,r.setCssClass(this.element,"ace_smooth-blinking",e),this.$updateCursors(!0),this.$updateCursors=this.$updateOpacity.bind(this),this.restartTimer())},this.addCursor=function(){var e=r.createElement("div");return e.className="ace_cursor",this.element.appendChild(e),this.cursors.push(e),e},this.removeCursor=function(){if(this.cursors.length>1){var e=this.cursors.pop();return e.parentNode.removeChild(e),e}},this.hideCursor=function(){this.isVisible=!1,r.addCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.showCursor=function(){this.isVisible=!0,r.removeCssClass(this.element,"ace_hidden-cursors"),this.restartTimer()},this.restartTimer=function(){var e=this.$updateCursors;if(clearInterval(this.intervalId),clearTimeout(this.timeoutId),this.smoothBlinking&&r.removeCssClass(this.element,"ace_smooth-blinking"),e(!0),this.isBlinking&&this.blinkInterval&&this.isVisible){this.smoothBlinking&&setTimeout(function(){r.addCssClass(this.element,"ace_smooth-blinking")}.bind(this));var t=function(){this.timeoutId=setTimeout(function(){e(!1)},.6*this.blinkInterval)}.bind(this);this.intervalId=setInterval(function(){e(!0),t()},this.blinkInterval),t()}},this.getPixelPosition=function(e,t){if(!this.config||!this.session)return{left:0,top:0};e||(e=this.session.selection.getCursor());var i=this.session.documentToScreenPosition(e);return{left:this.$padding+(this.session.$bidiHandler.isBidiRow(i.row,e.row)?this.session.$bidiHandler.getPosLeft(i.column):i.column*this.config.characterWidth),top:(i.row-(t?this.config.firstRowScreen:0))*this.config.lineHeight}},this.update=function(e){this.config=e;var t=this.session.$selectionMarkers,i=0,n=0;void 0!==t&&0!==t.length||(t=[{cursor:null}]);for(var i=0,r=t.length;ie.height+e.offset||o.top<0)&&i>1)){var s=(this.cursors[n++]||this.addCursor()).style;this.drawCursor?this.drawCursor(s,o,e,t[i],this.session):(s.left=o.left+"px",s.top=o.top+"px",s.width=e.characterWidth+"px",s.height=e.lineHeight+"px")}}for(;this.cursors.length>n;)this.removeCursor();var a=this.session.getOverwrite();this.$setOverwrite(a),this.$pixelPos=o,this.restartTimer()},this.drawCursor=null,this.$setOverwrite=function(e){e!=this.overwrite&&(this.overwrite=e,e?r.addCssClass(this.element,"ace_overwrite-cursors"):r.removeCssClass(this.element,"ace_overwrite-cursors"))},this.destroy=function(){clearInterval(this.intervalId),clearTimeout(this.timeoutId)}}).call(o.prototype),t.Cursor=o}),ace.define("ace/scrollbar",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/event","ace/lib/event_emitter"],function(e,t,i){"use strict";var n=e("./lib/oop"),r=e("./lib/dom"),o=e("./lib/event"),s=e("./lib/event_emitter").EventEmitter,a=function(e){this.element=r.createElement("div"),this.element.className="ace_scrollbar ace_scrollbar"+this.classSuffix,this.inner=r.createElement("div"),this.inner.className="ace_scrollbar-inner",this.element.appendChild(this.inner),e.appendChild(this.element),this.setVisible(!1),this.skipEvent=!1,o.addListener(this.element,"scroll",this.onScroll.bind(this)),o.addListener(this.element,"mousedown",o.preventDefault)};(function(){n.implement(this,s),this.setVisible=function(e){this.element.style.display=e?"":"none",this.isVisible=e,this.coeff=1}}).call(a.prototype);var l=function(e,t){a.call(this,e),this.scrollTop=0,this.scrollHeight=0,t.$scrollbarWidth=this.width=r.scrollbarWidth(e.ownerDocument),this.inner.style.width=this.element.style.width=(this.width||15)+5+"px",this.$minWidth=0};n.inherits(l,a),function(){this.classSuffix="-v",this.onScroll=function(){if(!this.skipEvent){if(this.scrollTop=this.element.scrollTop,1!=this.coeff){var e=this.element.clientHeight/this.scrollHeight;this.scrollTop=this.scrollTop*(1-e)/(this.coeff-e)}this._emit("scroll",{data:this.scrollTop})}this.skipEvent=!1},this.getWidth=function(){return Math.max(this.isVisible?this.width:0,this.$minWidth||0)},this.setHeight=function(e){this.element.style.height=e+"px"},this.setInnerHeight=this.setScrollHeight=function(e){this.scrollHeight=e,e>32768?(this.coeff=32768/e,e=32768):1!=this.coeff&&(this.coeff=1),this.inner.style.height=e+"px"},this.setScrollTop=function(e){this.scrollTop!=e&&(this.skipEvent=!0,this.scrollTop=e,this.element.scrollTop=e*this.coeff)}}.call(l.prototype);var c=function(e,t){a.call(this,e),this.scrollLeft=0,this.height=t.$scrollbarWidth,this.inner.style.height=this.element.style.height=(this.height||15)+5+"px"};n.inherits(c,a),function(){this.classSuffix="-h",this.onScroll=function(){this.skipEvent||(this.scrollLeft=this.element.scrollLeft,this._emit("scroll",{data:this.scrollLeft})),this.skipEvent=!1},this.getHeight=function(){return this.isVisible?this.height:0},this.setWidth=function(e){this.element.style.width=e+"px"},this.setInnerWidth=function(e){this.inner.style.width=e+"px"},this.setScrollWidth=function(e){this.inner.style.width=e+"px"},this.setScrollLeft=function(e){this.scrollLeft!=e&&(this.skipEvent=!0,this.scrollLeft=this.element.scrollLeft=e)}}.call(c.prototype),t.ScrollBar=l,t.ScrollBarV=l,t.ScrollBarH=c,t.VScrollBar=l,t.HScrollBar=c}),ace.define("ace/renderloop",["require","exports","module","ace/lib/event"],function(e,t,i){"use strict";var n=e("./lib/event"),r=function(e,t){this.onRender=e,this.pending=!1,this.changes=0,this.window=t||window};(function(){this.schedule=function(e){if(this.changes=this.changes|e,!this.pending&&this.changes){this.pending=!0;var t=this;n.nextFrame(function(){t.pending=!1;for(var e;e=t.changes;)t.changes=0,t.onRender(e)},this.window)}}}).call(r.prototype),t.RenderLoop=r}),ace.define("ace/layer/font_metrics",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/lib/lang","ace/lib/useragent","ace/lib/event_emitter"],function(e,t,i){var n=e("../lib/oop"),r=e("../lib/dom"),o=e("../lib/lang"),s=e("../lib/useragent"),a=e("../lib/event_emitter").EventEmitter,l=0,c=t.FontMetrics=function(e){this.el=r.createElement("div"),this.$setMeasureNodeStyles(this.el.style,!0),this.$main=r.createElement("div"),this.$setMeasureNodeStyles(this.$main.style),this.$measureNode=r.createElement("div"),this.$setMeasureNodeStyles(this.$measureNode.style),this.el.appendChild(this.$main),this.el.appendChild(this.$measureNode),e.appendChild(this.el),l||this.$testFractionalRect(),this.$measureNode.innerHTML=o.stringRepeat("X",l),this.$characterSize={width:0,height:0},this.checkForSizeChanges()};(function(){n.implement(this,a),this.$characterSize={width:0,height:0},this.$testFractionalRect=function(){var e=r.createElement("div");this.$setMeasureNodeStyles(e.style),e.style.width="0.2px",document.documentElement.appendChild(e);var t=e.getBoundingClientRect().width;l=t>0&&t<1?50:100,e.parentNode.removeChild(e)},this.$setMeasureNodeStyles=function(e,t){e.width=e.height="auto",e.left=e.top="0px",e.visibility="hidden",e.position="absolute",e.whiteSpace="pre",s.isIE<8?e["font-family"]="inherit":e.font="inherit",e.overflow=t?"hidden":"visible"},this.checkForSizeChanges=function(){var e=this.$measureSizes();if(e&&(this.$characterSize.width!==e.width||this.$characterSize.height!==e.height)){this.$measureNode.style.fontWeight="bold";var t=this.$measureSizes();this.$measureNode.style.fontWeight="",this.$characterSize=e,this.charSizes=Object.create(null),this.allowBoldFonts=t&&t.width===e.width&&t.height===e.height,this._emit("changeCharacterSize",{data:e})}},this.$pollSizeChanges=function(){if(this.$pollSizeChangesTimer)return this.$pollSizeChangesTimer;var e=this;return this.$pollSizeChangesTimer=setInterval(function(){e.checkForSizeChanges()},500)},this.setPolling=function(e){e?this.$pollSizeChanges():this.$pollSizeChangesTimer&&(clearInterval(this.$pollSizeChangesTimer),this.$pollSizeChangesTimer=0)},this.$measureSizes=function(){if(50===l){var e=null;try{e=this.$measureNode.getBoundingClientRect()}catch(t){e={width:0,height:0}}var t={height:e.height,width:e.width/l}}else var t={height:this.$measureNode.clientHeight,width:this.$measureNode.clientWidth/l};return 0===t.width||0===t.height?null:t},this.$measureCharWidth=function(e){return this.$main.innerHTML=o.stringRepeat(e,l),this.$main.getBoundingClientRect().width/l},this.getCharacterWidth=function(e){var t=this.charSizes[e];return void 0===t&&(t=this.charSizes[e]=this.$measureCharWidth(e)/this.$characterSize.width),t},this.destroy=function(){clearInterval(this.$pollSizeChangesTimer),this.el&&this.el.parentNode&&this.el.parentNode.removeChild(this.el)}}).call(c.prototype)}),ace.define("ace/virtual_renderer",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/config","ace/lib/useragent","ace/layer/gutter","ace/layer/marker","ace/layer/text","ace/layer/cursor","ace/scrollbar","ace/scrollbar","ace/renderloop","ace/layer/font_metrics","ace/lib/event_emitter"],function(e,t,i){"use strict";var n=e("./lib/oop"),r=e("./lib/dom"),o=e("./config"),s=e("./lib/useragent"),a=e("./layer/gutter").Gutter,l=e("./layer/marker").Marker,c=e("./layer/text").Text,h=e("./layer/cursor").Cursor,d=e("./scrollbar").HScrollBar,u=e("./scrollbar").VScrollBar,p=e("./renderloop").RenderLoop,f=e("./layer/font_metrics").FontMetrics,m=e("./lib/event_emitter").EventEmitter;r.importCssString('.ace_editor {\tposition: relative;\toverflow: hidden;\tfont: 12px/normal \'Monaco\', \'Menlo\', \'Ubuntu Mono\', \'Consolas\', \'source-code-pro\', monospace;\tdirection: ltr;\ttext-align: left;\t-webkit-tap-highlight-color: rgba(0, 0, 0, 0);\t}\t.ace_scroller {\tposition: absolute;\toverflow: hidden;\ttop: 0;\tbottom: 0;\tbackground-color: inherit;\t-ms-user-select: none;\t-moz-user-select: none;\t-webkit-user-select: none;\tuser-select: none;\tcursor: text;\t}\t.ace_content {\tposition: absolute;\t-moz-box-sizing: border-box;\t-webkit-box-sizing: border-box;\tbox-sizing: border-box;\tmin-width: 100%;\t}\t.ace_dragging .ace_scroller:before{\tposition: absolute;\ttop: 0;\tleft: 0;\tright: 0;\tbottom: 0;\tcontent: \'\';\tbackground: rgba(250, 250, 250, 0.01);\tz-index: 1000;\t}\t.ace_dragging.ace_dark .ace_scroller:before{\tbackground: rgba(0, 0, 0, 0.01);\t}\t.ace_selecting, .ace_selecting * {\tcursor: text !important;\t}\t.ace_gutter {\tposition: absolute;\toverflow : hidden;\twidth: auto;\ttop: 0;\tbottom: 0;\tleft: 0;\tcursor: default;\tz-index: 4;\t-ms-user-select: none;\t-moz-user-select: none;\t-webkit-user-select: none;\tuser-select: none;\t}\t.ace_gutter-active-line {\tposition: absolute;\tleft: 0;\tright: 0;\t}\t.ace_scroller.ace_scroll-left {\tbox-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\t}\t.ace_gutter-cell {\tpadding-left: 19px;\tpadding-right: 6px;\tbackground-repeat: no-repeat;\t}\t.ace_gutter-cell.ace_error {\tbackground-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==");\tbackground-repeat: no-repeat;\tbackground-position: 2px center;\t}\t.ace_gutter-cell.ace_warning {\tbackground-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==");\tbackground-position: 2px center;\t}\t.ace_gutter-cell.ace_info {\tbackground-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=");\tbackground-position: 2px center;\t}\t.ace_dark .ace_gutter-cell.ace_info {\tbackground-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC");\t}\t.ace_scrollbar {\tposition: absolute;\tright: 0;\tbottom: 0;\tz-index: 6;\t}\t.ace_scrollbar-inner {\tposition: absolute;\tcursor: text;\tleft: 0;\ttop: 0;\t}\t.ace_scrollbar-v{\toverflow-x: hidden;\toverflow-y: scroll;\ttop: 0;\t}\t.ace_scrollbar-h {\toverflow-x: scroll;\toverflow-y: hidden;\tleft: 0;\t}\t.ace_print-margin {\tposition: absolute;\theight: 100%;\t}\t.ace_text-input {\tposition: absolute;\tz-index: 0;\twidth: 0.5em;\theight: 1em;\topacity: 0;\tbackground: transparent;\t-moz-appearance: none;\tappearance: none;\tborder: none;\tresize: none;\toutline: none;\toverflow: hidden;\tfont: inherit;\tpadding: 0 1px;\tmargin: 0 -1px;\ttext-indent: -1em;\t-ms-user-select: text;\t-moz-user-select: text;\t-webkit-user-select: text;\tuser-select: text;\twhite-space: pre!important;\t}\t.ace_text-input.ace_composition {\tbackground: inherit;\tcolor: inherit;\tz-index: 1000;\topacity: 1;\ttext-indent: 0;\t}\t.ace_layer {\tz-index: 1;\tposition: absolute;\toverflow: hidden;\tword-wrap: normal;\twhite-space: pre;\theight: 100%;\twidth: 100%;\t-moz-box-sizing: border-box;\t-webkit-box-sizing: border-box;\tbox-sizing: border-box;\tpointer-events: none;\t}\t.ace_gutter-layer {\tposition: relative;\twidth: auto;\ttext-align: right;\tpointer-events: auto;\t}\t.ace_text-layer {\tfont: inherit !important;\t}\t.ace_cjk {\tdisplay: inline-block;\ttext-align: center;\t}\t.ace_cursor-layer {\tz-index: 4;\t}\t.ace_cursor {\tz-index: 4;\tposition: absolute;\t-moz-box-sizing: border-box;\t-webkit-box-sizing: border-box;\tbox-sizing: border-box;\tborder-left: 2px solid;\ttransform: translatez(0);\t}\t.ace_multiselect .ace_cursor {\tborder-left-width: 1px;\t}\t.ace_slim-cursors .ace_cursor {\tborder-left-width: 1px;\t}\t.ace_overwrite-cursors .ace_cursor {\tborder-left-width: 0;\tborder-bottom: 1px solid;\t}\t.ace_hidden-cursors .ace_cursor {\topacity: 0.2;\t}\t.ace_smooth-blinking .ace_cursor {\t-webkit-transition: opacity 0.18s;\ttransition: opacity 0.18s;\t}\t.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\tposition: absolute;\tz-index: 3;\t}\t.ace_marker-layer .ace_selection {\tposition: absolute;\tz-index: 5;\t}\t.ace_marker-layer .ace_bracket {\tposition: absolute;\tz-index: 6;\t}\t.ace_marker-layer .ace_active-line {\tposition: absolute;\tz-index: 2;\t}\t.ace_marker-layer .ace_selected-word {\tposition: absolute;\tz-index: 4;\t-moz-box-sizing: border-box;\t-webkit-box-sizing: border-box;\tbox-sizing: border-box;\t}\t.ace_line .ace_fold {\t-moz-box-sizing: border-box;\t-webkit-box-sizing: border-box;\tbox-sizing: border-box;\tdisplay: inline-block;\theight: 11px;\tmargin-top: -2px;\tvertical-align: middle;\tbackground-image:\turl("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),\turl("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=");\tbackground-repeat: no-repeat, repeat-x;\tbackground-position: center center, top left;\tcolor: transparent;\tborder: 1px solid black;\tborder-radius: 2px;\tcursor: pointer;\tpointer-events: auto;\t}\t.ace_dark .ace_fold {\t}\t.ace_fold:hover{\tbackground-image:\turl("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII="),\turl("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC");\t}\t.ace_tooltip {\tbackground-color: #FFF;\tbackground-image: -webkit-linear-gradient(top, transparent, rgba(0, 0, 0, 0.1));\tbackground-image: linear-gradient(to bottom, transparent, rgba(0, 0, 0, 0.1));\tborder: 1px solid gray;\tborder-radius: 1px;\tbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\tcolor: black;\tmax-width: 100%;\tpadding: 3px 4px;\tposition: fixed;\tz-index: 999999;\t-moz-box-sizing: border-box;\t-webkit-box-sizing: border-box;\tbox-sizing: border-box;\tcursor: default;\twhite-space: pre;\tword-wrap: break-word;\tline-height: normal;\tfont-style: normal;\tfont-weight: normal;\tletter-spacing: normal;\tpointer-events: none;\t}\t.ace_folding-enabled > .ace_gutter-cell {\tpadding-right: 13px;\t}\t.ace_fold-widget {\t-moz-box-sizing: border-box;\t-webkit-box-sizing: border-box;\tbox-sizing: border-box;\tmargin: 0 -12px 0 1px;\tdisplay: none;\twidth: 11px;\tvertical-align: top;\tbackground-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==");\tbackground-repeat: no-repeat;\tbackground-position: center;\tborder-radius: 3px;\tborder: 1px solid transparent;\tcursor: pointer;\t}\t.ace_folding-enabled .ace_fold-widget {\tdisplay: inline-block; \t}\t.ace_fold-widget.ace_end {\tbackground-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==");\t}\t.ace_fold-widget.ace_closed {\tbackground-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==");\t}\t.ace_fold-widget:hover {\tborder: 1px solid rgba(0, 0, 0, 0.3);\tbackground-color: rgba(255, 255, 255, 0.2);\tbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\t}\t.ace_fold-widget:active {\tborder: 1px solid rgba(0, 0, 0, 0.4);\tbackground-color: rgba(0, 0, 0, 0.05);\tbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\t}\t.ace_dark .ace_fold-widget {\tbackground-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC");\t}\t.ace_dark .ace_fold-widget.ace_end {\tbackground-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==");\t}\t.ace_dark .ace_fold-widget.ace_closed {\tbackground-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==");\t}\t.ace_dark .ace_fold-widget:hover {\tbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\tbackground-color: rgba(255, 255, 255, 0.1);\t}\t.ace_dark .ace_fold-widget:active {\tbox-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\t}\t.ace_fold-widget.ace_invalid {\tbackground-color: #FFB4B4;\tborder-color: #DE5555;\t}\t.ace_fade-fold-widgets .ace_fold-widget {\t-webkit-transition: opacity 0.4s ease 0.05s;\ttransition: opacity 0.4s ease 0.05s;\topacity: 0;\t}\t.ace_fade-fold-widgets:hover .ace_fold-widget {\t-webkit-transition: opacity 0.05s ease 0.05s;\ttransition: opacity 0.05s ease 0.05s;\topacity:1;\t}\t.ace_underline {\ttext-decoration: underline;\t}\t.ace_bold {\tfont-weight: bold;\t}\t.ace_nobold .ace_bold {\tfont-weight: normal;\t}\t.ace_italic {\tfont-style: italic;\t}\t.ace_error-marker {\tbackground-color: rgba(255, 0, 0,0.2);\tposition: absolute;\tz-index: 9;\t}\t.ace_highlight-marker {\tbackground-color: rgba(255, 255, 0,0.2);\tposition: absolute;\tz-index: 8;\t}\t.ace_br1 {border-top-left-radius : 3px;}\t.ace_br2 {border-top-right-radius : 3px;}\t.ace_br3 {border-top-left-radius : 3px; border-top-right-radius: 3px;}\t.ace_br4 {border-bottom-right-radius: 3px;}\t.ace_br5 {border-top-left-radius : 3px; border-bottom-right-radius: 3px;}\t.ace_br6 {border-top-right-radius : 3px; border-bottom-right-radius: 3px;}\t.ace_br7 {border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px;}\t.ace_br8 {border-bottom-left-radius : 3px;}\t.ace_br9 {border-top-left-radius : 3px; border-bottom-left-radius: 3px;}\t.ace_br10{border-top-right-radius : 3px; border-bottom-left-radius: 3px;}\t.ace_br11{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-left-radius: 3px;}\t.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\t.ace_br13{border-top-left-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\t.ace_br14{border-top-right-radius : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\t.ace_br15{border-top-left-radius : 3px; border-top-right-radius: 3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\t.ace_text-input-ios {\tposition: absolute !important;\ttop: -100000px !important;\tleft: -100000px !important;\t}\t',"ace_editor.css");var g=function(e,t){var i=this;this.container=e||r.createElement("div"),this.$keepTextAreaAtCursor=!s.isOldIE,r.addCssClass(this.container,"ace_editor"),this.setTheme(t),this.$gutter=r.createElement("div"),this.$gutter.className="ace_gutter",this.container.appendChild(this.$gutter),this.$gutter.setAttribute("aria-hidden",!0),this.scroller=r.createElement("div"),this.scroller.className="ace_scroller",this.container.appendChild(this.scroller),this.content=r.createElement("div"),this.content.className="ace_content",this.scroller.appendChild(this.content),this.$gutterLayer=new a(this.$gutter),this.$gutterLayer.on("changeGutterWidth",this.onGutterResize.bind(this)),this.$markerBack=new l(this.content);var n=this.$textLayer=new c(this.content);this.canvas=n.element,this.$markerFront=new l(this.content),this.$cursorLayer=new h(this.content),this.$horizScroll=!1,this.$vScroll=!1,this.scrollBar=this.scrollBarV=new u(this.container,this),this.scrollBarH=new d(this.container,this),this.scrollBarV.addEventListener("scroll",function(e){i.$scrollAnimation||i.session.setScrollTop(e.data-i.scrollMargin.top)}),this.scrollBarH.addEventListener("scroll",function(e){i.$scrollAnimation||i.session.setScrollLeft(e.data-i.scrollMargin.left)}),this.scrollTop=0,this.scrollLeft=0,this.cursorPos={row:0,column:0},this.$fontMetrics=new f(this.container),this.$textLayer.$setFontMetrics(this.$fontMetrics),this.$textLayer.addEventListener("changeCharacterSize",function(e){i.updateCharacterSize(),i.onResize(!0,i.gutterWidth,i.$size.width,i.$size.height),i._signal("changeCharacterSize",e)}),this.$size={width:0,height:0,scrollerHeight:0,scrollerWidth:0,$dirty:!0},this.layerConfig={width:1,padding:0,firstRow:0,firstRowScreen:0,lastRow:0,lineHeight:0,characterWidth:0,minHeight:1,maxHeight:1,offset:0,height:1,gutterOffset:1},this.scrollMargin={left:0,right:0,top:0,bottom:0,v:0,h:0},this.$loop=new p(this.$renderChanges.bind(this),this.container.ownerDocument.defaultView),this.$loop.schedule(this.CHANGE_FULL),this.updateCharacterSize(),this.setPadding(4),o.resetOptions(this),o._emit("renderer",this)};(function(){this.CHANGE_CURSOR=1,this.CHANGE_MARKER=2,this.CHANGE_GUTTER=4,this.CHANGE_SCROLL=8,this.CHANGE_LINES=16,this.CHANGE_TEXT=32,this.CHANGE_SIZE=64,this.CHANGE_MARKER_BACK=128,this.CHANGE_MARKER_FRONT=256,this.CHANGE_FULL=512,this.CHANGE_H_SCROLL=1024,n.implement(this,m),this.updateCharacterSize=function(){this.$textLayer.allowBoldFonts!=this.$allowBoldFonts&&(this.$allowBoldFonts=this.$textLayer.allowBoldFonts,this.setStyle("ace_nobold",!this.$allowBoldFonts)),this.layerConfig.characterWidth=this.characterWidth=this.$textLayer.getCharacterWidth(),this.layerConfig.lineHeight=this.lineHeight=this.$textLayer.getLineHeight(),this.$updatePrintMargin()},this.setSession=function(e){this.session&&this.session.doc.off("changeNewLineMode",this.onChangeNewLineMode),this.session=e,e&&this.scrollMargin.top&&e.getScrollTop()<=0&&e.setScrollTop(-this.scrollMargin.top),this.$cursorLayer.setSession(e),this.$markerBack.setSession(e),this.$markerFront.setSession(e),this.$gutterLayer.setSession(e),this.$textLayer.setSession(e),e&&(this.$loop.schedule(this.CHANGE_FULL),this.session.$setFontMetrics(this.$fontMetrics),this.scrollBarH.scrollLeft=this.scrollBarV.scrollTop=null,this.onChangeNewLineMode=this.onChangeNewLineMode.bind(this),this.onChangeNewLineMode(),this.session.doc.on("changeNewLineMode",this.onChangeNewLineMode))},this.updateLines=function(e,t,i){if(void 0===t&&(t=1/0),this.$changedLines?(this.$changedLines.firstRow>e&&(this.$changedLines.firstRow=e),this.$changedLines.lastRowthis.layerConfig.lastRow||this.$loop.schedule(this.CHANGE_LINES)},this.onChangeNewLineMode=function(){this.$loop.schedule(this.CHANGE_TEXT),this.$textLayer.$updateEolChar(),this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR)},this.onChangeTabSize=function(){this.$loop.schedule(this.CHANGE_TEXT|this.CHANGE_MARKER),this.$textLayer.onChangeTabSize()},this.updateText=function(){this.$loop.schedule(this.CHANGE_TEXT)},this.updateFull=function(e){e?this.$renderChanges(this.CHANGE_FULL,!0):this.$loop.schedule(this.CHANGE_FULL)},this.updateFontSize=function(){this.$textLayer.checkForSizeChanges()},this.$changes=0,this.$updateSizeAsync=function(){this.$loop.pending?this.$size.$dirty=!0:this.onResize()},this.onResize=function(e,t,i,n){if(!(this.resizing>2)){this.resizing>0?this.resizing++:this.resizing=e?1:0;var r=this.container;n||(n=r.clientHeight||r.scrollHeight),i||(i=r.clientWidth||r.scrollWidth);var o=this.$updateCachedSize(e,t,i,n);if(!this.$size.scrollerHeight||!i&&!n)return this.resizing=0;e&&(this.$gutterLayer.$padding=null),e?this.$renderChanges(o|this.$changes,!0):this.$loop.schedule(o|this.$changes),this.resizing&&(this.resizing=0),this.scrollBarV.scrollLeft=this.scrollBarV.scrollTop=null}},this.$updateCachedSize=function(e,t,i,n){n-=this.$extraHeight||0;var r=0,o=this.$size,s={width:o.width,height:o.height,scrollerHeight:o.scrollerHeight,scrollerWidth:o.scrollerWidth};return n&&(e||o.height!=n)&&(o.height=n,r|=this.CHANGE_SIZE,o.scrollerHeight=o.height,this.$horizScroll&&(o.scrollerHeight-=this.scrollBarH.getHeight()),this.scrollBarV.element.style.bottom=this.scrollBarH.getHeight()+"px",r|=this.CHANGE_SCROLL),i&&(e||o.width!=i)&&(r|=this.CHANGE_SIZE,o.width=i,null==t&&(t=this.$showGutter?this.$gutter.offsetWidth:0),this.gutterWidth=t,this.scrollBarH.element.style.left=this.scroller.style.left=t+"px",o.scrollerWidth=Math.max(0,i-t-this.scrollBarV.getWidth()),this.scrollBarH.element.style.right=this.scroller.style.right=this.scrollBarV.getWidth()+"px",this.scroller.style.bottom=this.scrollBarH.getHeight()+"px",(this.session&&this.session.getUseWrapMode()&&this.adjustWrapLimit()||e)&&(r|=this.CHANGE_FULL)),o.$dirty=!i||!n,r&&this._signal("resize",s),r},this.onGutterResize=function(){var e=this.$showGutter?this.$gutter.offsetWidth:0;e!=this.gutterWidth&&(this.$changes|=this.$updateCachedSize(!0,e,this.$size.width,this.$size.height)),this.session.getUseWrapMode()&&this.adjustWrapLimit()?this.$loop.schedule(this.CHANGE_FULL):this.$size.$dirty?this.$loop.schedule(this.CHANGE_FULL):(this.$computeLayerConfig(),this.$loop.schedule(this.CHANGE_MARKER))},this.adjustWrapLimit=function(){var e=this.$size.scrollerWidth-2*this.$padding,t=Math.floor(e/this.characterWidth);return this.session.adjustWrapLimit(t,this.$showPrintMargin&&this.$printMarginColumn)},this.setAnimatedScroll=function(e){this.setOption("animatedScroll",e)},this.getAnimatedScroll=function(){return this.$animatedScroll},this.setShowInvisibles=function(e){this.setOption("showInvisibles",e),this.session.$bidiHandler.setShowInvisibles(e)},this.getShowInvisibles=function(){return this.getOption("showInvisibles")},this.getDisplayIndentGuides=function(){return this.getOption("displayIndentGuides")},this.setDisplayIndentGuides=function(e){this.setOption("displayIndentGuides",e)},this.setShowPrintMargin=function(e){this.setOption("showPrintMargin",e)},this.getShowPrintMargin=function(){return this.getOption("showPrintMargin")},this.setPrintMarginColumn=function(e){this.setOption("printMarginColumn",e)},this.getPrintMarginColumn=function(){return this.getOption("printMarginColumn")},this.getShowGutter=function(){return this.getOption("showGutter")},this.setShowGutter=function(e){return this.setOption("showGutter",e)},this.getFadeFoldWidgets=function(){return this.getOption("fadeFoldWidgets")},this.setFadeFoldWidgets=function(e){this.setOption("fadeFoldWidgets",e)},this.setHighlightGutterLine=function(e){this.setOption("highlightGutterLine",e)},this.getHighlightGutterLine=function(){return this.getOption("highlightGutterLine")},this.$updateGutterLineHighlight=function(){var e=this.$cursorLayer.$pixelPos,t=this.layerConfig.lineHeight;if(this.session.getUseWrapMode()){var i=this.session.selection.getCursor();i.column=0,e=this.$cursorLayer.getPixelPosition(i,!0),t*=this.session.getRowLength(i.row)}this.$gutterLineHighlight.style.top=e.top-this.layerConfig.offset+"px",this.$gutterLineHighlight.style.height=t+"px"},this.$updatePrintMargin=function(){if(this.$showPrintMargin||this.$printMarginEl){if(!this.$printMarginEl){var e=r.createElement("div");e.className="ace_layer ace_print-margin-layer",this.$printMarginEl=r.createElement("div"),this.$printMarginEl.className="ace_print-margin",e.appendChild(this.$printMarginEl),this.content.insertBefore(e,this.content.firstChild)}var t=this.$printMarginEl.style;t.left=this.characterWidth*this.$printMarginColumn+this.$padding+"px",t.visibility=this.$showPrintMargin?"visible":"hidden",this.session&&-1==this.session.$wrap&&this.adjustWrapLimit()}},this.getContainerElement=function(){return this.container},this.getMouseEventTarget=function(){return this.scroller},this.getTextAreaContainer=function(){return this.container},this.$moveTextAreaToCursor=function(){if(this.$keepTextAreaAtCursor){var e=this.layerConfig,t=this.$cursorLayer.$pixelPos.top,i=this.$cursorLayer.$pixelPos.left;t-=e.offset;var n=this.textarea.style,r=this.lineHeight;if(t<0||t>e.height-r)return void(n.top=n.left="0");var o=this.characterWidth;if(this.$composition){var s=this.textarea.value.replace(/^\x01+/,"");o*=this.session.$getStringScreenWidth(s)[0]+2,r+=2}i-=this.scrollLeft,i>this.$size.scrollerWidth-o&&(i=this.$size.scrollerWidth-o),i+=this.gutterWidth,n.height=r+"px",n.width=o+"px",n.left=Math.min(i,this.$size.scrollerWidth-o)+"px",n.top=Math.min(t,this.$size.height-r)+"px"}},this.getFirstVisibleRow=function(){return this.layerConfig.firstRow},this.getFirstFullyVisibleRow=function(){return this.layerConfig.firstRow+(0===this.layerConfig.offset?0:1)},this.getLastFullyVisibleRow=function(){var e=this.layerConfig,t=e.lastRow;return this.session.documentToScreenRow(t,0)*e.lineHeight-this.session.getScrollTop()>e.height-e.lineHeight?t-1:t},this.getLastVisibleRow=function(){return this.layerConfig.lastRow},this.$padding=null,this.setPadding=function(e){this.$padding=e,this.$textLayer.setPadding(e),this.$cursorLayer.setPadding(e),this.$markerFront.setPadding(e),this.$markerBack.setPadding(e),this.$loop.schedule(this.CHANGE_FULL),this.$updatePrintMargin()},this.setScrollMargin=function(e,t,i,n){var r=this.scrollMargin;r.top=0|e,r.bottom=0|t,r.right=0|n,r.left=0|i,r.v=r.top+r.bottom,r.h=r.left+r.right,r.top&&this.scrollTop<=0&&this.session&&this.session.setScrollTop(-r.top),this.updateFull()},this.getHScrollBarAlwaysVisible=function(){return this.$hScrollBarAlwaysVisible},this.setHScrollBarAlwaysVisible=function(e){this.setOption("hScrollBarAlwaysVisible",e)},this.getVScrollBarAlwaysVisible=function(){return this.$vScrollBarAlwaysVisible},this.setVScrollBarAlwaysVisible=function(e){this.setOption("vScrollBarAlwaysVisible",e)},this.$updateScrollBarV=function(){var e=this.layerConfig.maxHeight,t=this.$size.scrollerHeight;!this.$maxLines&&this.$scrollPastEnd&&(e-=(t-this.lineHeight)*this.$scrollPastEnd,this.scrollTop>e-t&&(e=this.scrollTop+t,this.scrollBarV.scrollTop=null)),this.scrollBarV.setScrollHeight(e+this.scrollMargin.v),this.scrollBarV.setScrollTop(this.scrollTop+this.scrollMargin.top)},this.$updateScrollBarH=function(){this.scrollBarH.setScrollWidth(this.layerConfig.width+2*this.$padding+this.scrollMargin.h),this.scrollBarH.setScrollLeft(this.scrollLeft+this.scrollMargin.left)},this.$frozen=!1,this.freeze=function(){this.$frozen=!0},this.unfreeze=function(){this.$frozen=!1},this.$renderChanges=function(e,t){if(this.$changes&&(e|=this.$changes,this.$changes=0),!this.session||!this.container.offsetWidth||this.$frozen||!e&&!t)return void(this.$changes|=e);if(this.$size.$dirty)return this.$changes|=e,this.onResize(!0);this.lineHeight||this.$textLayer.checkForSizeChanges(),this._signal("beforeRender"),this.session&&this.session.$bidiHandler&&this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics);var i=this.layerConfig;if(e&this.CHANGE_FULL||e&this.CHANGE_SIZE||e&this.CHANGE_TEXT||e&this.CHANGE_LINES||e&this.CHANGE_SCROLL||e&this.CHANGE_H_SCROLL){if(e|=this.$computeLayerConfig(),i.firstRow!=this.layerConfig.firstRow&&i.firstRowScreen==this.layerConfig.firstRowScreen){var n=this.scrollTop+(i.firstRow-this.layerConfig.firstRow)*this.lineHeight;n>0&&(this.scrollTop=n,e|=this.CHANGE_SCROLL,e|=this.$computeLayerConfig())}i=this.layerConfig,this.$updateScrollBarV(),e&this.CHANGE_H_SCROLL&&this.$updateScrollBarH(),this.$gutterLayer.element.style.marginTop=-i.offset+"px",this.content.style.marginTop=-i.offset+"px",this.content.style.width=i.width+2*this.$padding+"px",this.content.style.height=i.minHeight+"px"}return e&this.CHANGE_H_SCROLL&&(this.content.style.marginLeft=-this.scrollLeft+"px",this.scroller.className=this.scrollLeft<=0?"ace_scroller":"ace_scroller ace_scroll-left"),e&this.CHANGE_FULL?(this.$textLayer.update(i),this.$showGutter&&this.$gutterLayer.update(i),this.$markerBack.update(i),this.$markerFront.update(i),this.$cursorLayer.update(i),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),void this._signal("afterRender")):e&this.CHANGE_SCROLL?(e&this.CHANGE_TEXT||e&this.CHANGE_LINES?this.$textLayer.update(i):this.$textLayer.scrollLines(i),this.$showGutter&&this.$gutterLayer.update(i),this.$markerBack.update(i),this.$markerFront.update(i),this.$cursorLayer.update(i),this.$highlightGutterLine&&this.$updateGutterLineHighlight(),this.$moveTextAreaToCursor(),void this._signal("afterRender")):(e&this.CHANGE_TEXT?(this.$textLayer.update(i),this.$showGutter&&this.$gutterLayer.update(i)):e&this.CHANGE_LINES?(this.$updateLines()||e&this.CHANGE_GUTTER&&this.$showGutter)&&this.$gutterLayer.update(i):(e&this.CHANGE_TEXT||e&this.CHANGE_GUTTER)&&this.$showGutter&&this.$gutterLayer.update(i),e&this.CHANGE_CURSOR&&(this.$cursorLayer.update(i),this.$moveTextAreaToCursor(),this.$highlightGutterLine&&this.$updateGutterLineHighlight()),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_FRONT)&&this.$markerFront.update(i),e&(this.CHANGE_MARKER|this.CHANGE_MARKER_BACK)&&this.$markerBack.update(i),void this._signal("afterRender"))},this.$autosize=function(){var e=this.session.getScreenLength()*this.lineHeight,t=this.$maxLines*this.lineHeight,i=Math.min(t,Math.max((this.$minLines||1)*this.lineHeight,e))+this.scrollMargin.v+(this.$extraHeight||0);this.$horizScroll&&(i+=this.scrollBarH.getHeight()),this.$maxPixelHeight&&i>this.$maxPixelHeight&&(i=this.$maxPixelHeight);var n=e>t;if(i!=this.desiredHeight||this.$size.height!=this.desiredHeight||n!=this.$vScroll){n!=this.$vScroll&&(this.$vScroll=n,this.scrollBarV.setVisible(n));var r=this.container.clientWidth;this.container.style.height=i+"px",this.$updateCachedSize(!0,this.$gutterWidth,r,i),this.desiredHeight=i,this._signal("autosize")}},this.$computeLayerConfig=function(){var e=this.session,t=this.$size,i=t.height<=2*this.lineHeight,n=this.session.getScreenLength(),r=n*this.lineHeight,o=this.$getLongestLine(),s=!i&&(this.$hScrollBarAlwaysVisible||t.scrollerWidth-o-2*this.$padding<0),a=this.$horizScroll!==s;a&&(this.$horizScroll=s,this.scrollBarH.setVisible(s));var l=this.$vScroll;this.$maxLines&&this.lineHeight>1&&this.$autosize();var c=this.scrollTop%this.lineHeight,h=t.scrollerHeight+this.lineHeight,d=!this.$maxLines&&this.$scrollPastEnd?(t.scrollerHeight-this.lineHeight)*this.$scrollPastEnd:0;r+=d;var u=this.scrollMargin;this.session.setScrollTop(Math.max(-u.top,Math.min(this.scrollTop,r-t.scrollerHeight+u.bottom))),this.session.setScrollLeft(Math.max(-u.left,Math.min(this.scrollLeft,o+2*this.$padding-t.scrollerWidth+u.right)));var p=!i&&(this.$vScrollBarAlwaysVisible||t.scrollerHeight-r+d<0||this.scrollTop>u.top),f=l!==p;f&&(this.$vScroll=p,this.scrollBarV.setVisible(p));var m,g,v=Math.ceil(h/this.lineHeight)-1,y=Math.max(0,Math.round((this.scrollTop-c)/this.lineHeight)),w=y+v,b=this.lineHeight;y=e.screenToDocumentRow(y,0);var C=e.getFoldLine(y);C&&(y=C.start.row),m=e.documentToScreenRow(y,0),g=e.getRowLength(y)*b,w=Math.min(e.screenToDocumentRow(w,0),e.getLength()-1),h=t.scrollerHeight+e.getRowLength(w)*b+g,c=this.scrollTop-m*b;var E=0;return this.layerConfig.width!=o&&(E=this.CHANGE_H_SCROLL),(a||f)&&(E=this.$updateCachedSize(!0,this.gutterWidth,t.width,t.height),this._signal("scrollbarVisibilityChanged"),f&&(o=this.$getLongestLine())),this.layerConfig={width:o,padding:this.$padding,firstRow:y,firstRowScreen:m,lastRow:w,lineHeight:b,characterWidth:this.characterWidth,minHeight:h,maxHeight:r,offset:c,gutterOffset:b?Math.max(0,Math.ceil((c+t.height-t.scrollerHeight)/b)):0,height:this.$size.scrollerHeight},E},this.$updateLines=function(){if(this.$changedLines){var e=this.$changedLines.firstRow,t=this.$changedLines.lastRow;this.$changedLines=null;var i=this.layerConfig;if(!(e>i.lastRow+1||to?(t&&l+s>o+this.lineHeight&&(o-=t*this.$size.scrollerHeight),0===o&&(o=-this.scrollMargin.top),this.session.setScrollTop(o)):l+this.$size.scrollerHeight-ar?(r=1-this.scrollMargin.top||(t>0&&this.session.getScrollTop()+this.$size.scrollerHeight-this.layerConfig.maxHeight<-1+this.scrollMargin.bottom||(e<0&&this.session.getScrollLeft()>=1-this.scrollMargin.left||(e>0&&this.session.getScrollLeft()+this.$size.scrollerWidth-this.layerConfig.width<-1+this.scrollMargin.right||void 0)))},this.pixelToScreenCoordinates=function(e,t){var i=this.scroller.getBoundingClientRect(),n=e+this.scrollLeft-i.left-this.$padding,r=n/this.characterWidth,o=Math.floor((t+this.scrollTop-i.top)/this.lineHeight),s=Math.round(r);return{row:o,column:s,side:r-s>0?1:-1,offsetX:n}},this.screenToTextCoordinates=function(e,t){var i=this.scroller.getBoundingClientRect(),n=e+this.scrollLeft-i.left-this.$padding,r=Math.round(n/this.characterWidth),o=(t+this.scrollTop-i.top)/this.lineHeight;return this.session.screenToDocumentPosition(o,Math.max(r,0),n)},this.textToScreenCoordinates=function(e,t){var i=this.scroller.getBoundingClientRect(),n=this.session.documentToScreenPosition(e,t),r=this.$padding+(this.session.$bidiHandler.isBidiRow(n.row,e)?this.session.$bidiHandler.getPosLeft(n.column):Math.round(n.column*this.characterWidth)),o=n.row*this.lineHeight;return{pageX:i.left+r-this.scrollLeft,pageY:i.top+o-this.scrollTop}},this.visualizeFocus=function(){r.addCssClass(this.container,"ace_focus")},this.visualizeBlur=function(){r.removeCssClass(this.container,"ace_focus")},this.showComposition=function(e){this.$composition||(this.$composition={keepTextAreaAtCursor:this.$keepTextAreaAtCursor,cssText:this.textarea.style.cssText}),this.$keepTextAreaAtCursor=!0,r.addCssClass(this.textarea,"ace_composition"),this.textarea.style.cssText="",this.$moveTextAreaToCursor()},this.setCompositionText=function(e){this.$moveTextAreaToCursor()},this.hideComposition=function(){this.$composition&&(r.removeCssClass(this.textarea,"ace_composition"),this.$keepTextAreaAtCursor=this.$composition.keepTextAreaAtCursor,this.textarea.style.cssText=this.$composition.cssText,this.$composition=null)},this.setTheme=function(e,t){function i(i){if(n.$themeId!=e)return t&&t();if(!i||!i.cssClass)throw new Error("couldn't load module "+e+" or it didn't call define");r.importCssString(i.cssText,i.cssClass,n.container.ownerDocument),n.theme&&r.removeCssClass(n.container,n.theme.cssClass);var o="padding"in i?i.padding:"padding"in(n.theme||{})?4:n.$padding;n.$padding&&o!=n.$padding&&n.setPadding(o),n.$theme=i.cssClass,n.theme=i,r.addCssClass(n.container,i.cssClass),r.setCssClass(n.container,"ace_dark",i.isDark),n.$size&&(n.$size.width=0,n.$updateSizeAsync()),n._dispatchEvent("themeLoaded",{theme:i}),t&&t()}var n=this;if(this.$themeId=e,n._dispatchEvent("themeChange",{theme:e}),e&&"string"!=typeof e)i(e);else{var s=e||this.$options.theme.initialValue;o.loadModule(["theme",s],i)}},this.getTheme=function(){return this.$themeId},this.setStyle=function(e,t){r.setCssClass(this.container,e,!1!==t)},this.unsetStyle=function(e){r.removeCssClass(this.container,e)},this.setCursorStyle=function(e){this.scroller.style.cursor!=e&&(this.scroller.style.cursor=e)},this.setMouseCursor=function(e){this.scroller.style.cursor=e},this.destroy=function(){this.$textLayer.destroy(),this.$cursorLayer.destroy()}}).call(g.prototype),o.defineOptions(g.prototype,"renderer",{animatedScroll:{initialValue:!1},showInvisibles:{set:function(e){this.$textLayer.setShowInvisibles(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!1},showPrintMargin:{set:function(){this.$updatePrintMargin()},initialValue:!0},printMarginColumn:{set:function(){this.$updatePrintMargin()},initialValue:80},printMargin:{set:function(e){"number"==typeof e&&(this.$printMarginColumn=e),this.$showPrintMargin=!!e,this.$updatePrintMargin()},get:function(){return this.$showPrintMargin&&this.$printMarginColumn}},showGutter:{set:function(e){this.$gutter.style.display=e?"block":"none",this.$loop.schedule(this.CHANGE_FULL),this.onGutterResize()},initialValue:!0},fadeFoldWidgets:{set:function(e){r.setCssClass(this.$gutter,"ace_fade-fold-widgets",e)},initialValue:!1},showFoldWidgets:{set:function(e){this.$gutterLayer.setShowFoldWidgets(e)},initialValue:!0},showLineNumbers:{set:function(e){this.$gutterLayer.setShowLineNumbers(e),this.$loop.schedule(this.CHANGE_GUTTER)},initialValue:!0},displayIndentGuides:{set:function(e){this.$textLayer.setDisplayIndentGuides(e)&&this.$loop.schedule(this.CHANGE_TEXT)},initialValue:!0},highlightGutterLine:{set:function(e){if(!this.$gutterLineHighlight)return this.$gutterLineHighlight=r.createElement("div"),this.$gutterLineHighlight.className="ace_gutter-active-line",void this.$gutter.appendChild(this.$gutterLineHighlight);this.$gutterLineHighlight.style.display=e?"":"none",this.$cursorLayer.$pixelPos&&this.$updateGutterLineHighlight()},initialValue:!1,value:!0},hScrollBarAlwaysVisible:{set:function(e){this.$hScrollBarAlwaysVisible&&this.$horizScroll||this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},vScrollBarAlwaysVisible:{set:function(e){this.$vScrollBarAlwaysVisible&&this.$vScroll||this.$loop.schedule(this.CHANGE_SCROLL)},initialValue:!1},fontSize:{set:function(e){"number"==typeof e&&(e+="px"),this.container.style.fontSize=e,this.updateFontSize()},initialValue:12},fontFamily:{set:function(e){this.container.style.fontFamily=e,this.updateFontSize()}},maxLines:{set:function(e){this.updateFull()}},minLines:{set:function(e){this.updateFull()}},maxPixelHeight:{set:function(e){this.updateFull()},initialValue:0},scrollPastEnd:{set:function(e){e=+e||0,this.$scrollPastEnd!=e&&(this.$scrollPastEnd=e,this.$loop.schedule(this.CHANGE_SCROLL))},initialValue:0,handlesSet:!0},fixedWidthGutter:{set:function(e){this.$gutterLayer.$fixedWidth=!!e,this.$loop.schedule(this.CHANGE_GUTTER)}},theme:{set:function(e){this.setTheme(e)},get:function(){return this.$themeId||this.theme},initialValue:"./theme/textmate",handlesSet:!0}}),t.VirtualRenderer=g}),ace.define("ace/worker/worker_client",["require","exports","module","ace/lib/oop","ace/lib/net","ace/lib/event_emitter","ace/config"],function(e,t,i){"use strict";function n(e,t){var i=t.src;s.qualifyURL(e);try{return new Blob([i],{type:"application/javascript"})}catch(e){var n=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder,r=new n;return r.append(i),r.getBlob("application/javascript")}}function r(e,t){var i=n(e,t),r=window.URL||window.webkitURL,o=r.createObjectURL(i);return new Worker(o)}var o=e("../lib/oop"),s=e("../lib/net"),a=e("../lib/event_emitter").EventEmitter,l=e("../config"),c=function(t,i,n,o,s){if(this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.onMessage=this.onMessage.bind(this),e.nameToUrl&&!e.toUrl&&(e.toUrl=e.nameToUrl),l.get("packaged")||!e.toUrl)o=o||l.moduleUrl(i.id,"worker");else{var a=this.$normalizePath;o=o||a(e.toUrl("ace/worker/worker.js",null,"_"));var c={};t.forEach(function(t){c[t]=a(e.toUrl(t,null,"_").replace(/(\.js)?(\?.*)?$/,""))})}this.$worker=r(o,i),s&&this.send("importScripts",s),this.$worker.postMessage({init:!0,tlns:c,module:i.id,classname:n}),this.callbackId=1,this.callbacks={},this.$worker.onmessage=this.onMessage};(function(){o.implement(this,a),this.onMessage=function(e){var t=e.data;switch(t.type){case"event":this._signal(t.name,{data:t.data});break;case"call":var i=this.callbacks[t.id];i&&(i(t.data),delete this.callbacks[t.id]);break;case"error":this.reportError(t.data);break;case"log":window.console&&console.log&&console.log.apply(console,t.data)}},this.reportError=function(e){window.console&&console.error&&console.error(e)},this.$normalizePath=function(e){return s.qualifyURL(e)},this.terminate=function(){this._signal("terminate",{}),this.deltaQueue=null,this.$worker.terminate(),this.$worker=null,this.$doc&&this.$doc.off("change",this.changeListener),this.$doc=null},this.send=function(e,t){this.$worker.postMessage({command:e,args:t})},this.call=function(e,t,i){if(i){var n=this.callbackId++;this.callbacks[n]=i,t.push(n)}this.send(e,t)},this.emit=function(e,t){try{ this.$worker.postMessage({event:e,data:{data:t.data}})}catch(e){console.error(e.stack)}},this.attachToDocument=function(e){this.$doc&&this.terminate(),this.$doc=e,this.call("setValue",[e.getValue()]),e.on("change",this.changeListener)},this.changeListener=function(e){this.deltaQueue||(this.deltaQueue=[],setTimeout(this.$sendDeltaQueue,0)),"insert"==e.action?this.deltaQueue.push(e.start,e.lines):this.deltaQueue.push(e.start,e.end)},this.$sendDeltaQueue=function(){var e=this.deltaQueue;e&&(this.deltaQueue=null,e.length>50&&e.length>this.$doc.getLength()>>1?this.call("setValue",[this.$doc.getValue()]):this.emit("change",{data:e}))}}).call(c.prototype);var h=function(e,t,i){this.$sendDeltaQueue=this.$sendDeltaQueue.bind(this),this.changeListener=this.changeListener.bind(this),this.callbackId=1,this.callbacks={},this.messageBuffer=[];var n=null,r=!1,o=Object.create(a),s=this;this.$worker={},this.$worker.terminate=function(){},this.$worker.postMessage=function(e){s.messageBuffer.push(e),n&&(r?setTimeout(c):c())},this.setEmitSync=function(e){r=e};var c=function(){var e=s.messageBuffer.shift();e.command?n[e.command].apply(n,e.args):e.event&&o._signal(e.event,e.data)};o.postMessage=function(e){s.onMessage({data:e})},o.callback=function(e,t){this.postMessage({type:"call",id:t,data:e})},o.emit=function(e,t){this.postMessage({type:"event",name:e,data:t})},l.loadModule(["worker",t],function(e){for(n=new e[i](o);s.messageBuffer.length;)c()})};h.prototype=c.prototype,t.UIWorkerClient=h,t.WorkerClient=c,t.createWorker=r}),ace.define("ace/placeholder",["require","exports","module","ace/range","ace/lib/event_emitter","ace/lib/oop"],function(e,t,i){"use strict";var n=e("./range").Range,r=e("./lib/event_emitter").EventEmitter,o=e("./lib/oop"),s=function(e,t,i,n,r,o){var s=this;this.length=t,this.session=e,this.doc=e.getDocument(),this.mainClass=r,this.othersClass=o,this.$onUpdate=this.onUpdate.bind(this),this.doc.on("change",this.$onUpdate),this.$others=n,this.$onCursorChange=function(){setTimeout(function(){s.onCursorChange()})},this.$pos=i;var a=e.getUndoManager().$undoStack||e.getUndoManager().$undostack||{length:-1};this.$undoStackDepth=a.length,this.setup(),e.selection.on("changeCursor",this.$onCursorChange)};(function(){o.implement(this,r),this.setup=function(){var e=this,t=this.doc,i=this.session;this.selectionBefore=i.selection.toJSON(),i.selection.inMultiSelectMode&&i.selection.toSingleRange(),this.pos=t.createAnchor(this.$pos.row,this.$pos.column);var r=this.pos;r.$insertRight=!0,r.detach(),r.markerId=i.addMarker(new n(r.row,r.column,r.row,r.column+this.length),this.mainClass,null,!1),this.others=[],this.$others.forEach(function(i){var n=t.createAnchor(i.row,i.column);n.$insertRight=!0,n.detach(),e.others.push(n)}),i.setUndoSelect(!1)},this.showOtherMarkers=function(){if(!this.othersActive){var e=this.session,t=this;this.othersActive=!0,this.others.forEach(function(i){i.markerId=e.addMarker(new n(i.row,i.column,i.row,i.column+t.length),t.othersClass,null,!1)})}},this.hideOtherMarkers=function(){if(this.othersActive){this.othersActive=!1;for(var e=0;e=this.pos.column&&t.start.column<=this.pos.column+this.length+1,o=t.start.column-this.pos.column;if(this.updateAnchors(e),r&&(this.length+=i),r&&!this.session.$fromUndo)if("insert"===e.action)for(var s=this.others.length-1;s>=0;s--){var a=this.others[s],l={row:a.row,column:a.column+o};this.doc.insertMergedLines(l,e.lines)}else if("remove"===e.action)for(var s=this.others.length-1;s>=0;s--){var a=this.others[s],l={row:a.row,column:a.column+o};this.doc.remove(new n(l.row,l.column,l.row,l.column-i))}this.$updating=!1,this.updateMarkers()}},this.updateAnchors=function(e){this.pos.onChange(e);for(var t=this.others.length;t--;)this.others[t].onChange(e);this.updateMarkers()},this.updateMarkers=function(){if(!this.$updating){var e=this,t=this.session,i=function(i,r){t.removeMarker(i.markerId),i.markerId=t.addMarker(new n(i.row,i.column,i.row,i.column+e.length),r,null,!1)};i(this.pos,this.mainClass);for(var r=this.others.length;r--;)i(this.others[r],this.othersClass)}},this.onCursorChange=function(e){if(!this.$updating&&this.session){var t=this.session.selection.getCursor();t.row===this.pos.row&&t.column>=this.pos.column&&t.column<=this.pos.column+this.length?(this.showOtherMarkers(),this._emit("cursorEnter",e)):(this.hideOtherMarkers(),this._emit("cursorLeave",e))}},this.detach=function(){this.session.removeMarker(this.pos&&this.pos.markerId),this.hideOtherMarkers(),this.doc.removeEventListener("change",this.$onUpdate),this.session.selection.removeEventListener("changeCursor",this.$onCursorChange),this.session.setUndoSelect(!0),this.session=null},this.cancel=function(){if(-1!==this.$undoStackDepth){for(var e=this.session.getUndoManager(),t=(e.$undoStack||e.$undostack).length-this.$undoStackDepth,i=0;i1&&!this.inMultiSelectMode&&(this._signal("multiSelect"),this.inMultiSelectMode=!0,this.session.$undoSelect=!1,this.rangeList.attach(this.session)),t||this.fromOrientedRange(e)}},this.toSingleRange=function(e){e=e||this.ranges[0];var t=this.rangeList.removeAll();t.length&&this.$onRemoveRange(t),e&&this.fromOrientedRange(e)},this.substractPoint=function(e){var t=this.rangeList.substractPoint(e);if(t)return this.$onRemoveRange(t),t[0]},this.mergeOverlappingRanges=function(){var e=this.rangeList.merge();e.length?this.$onRemoveRange(e):this.ranges[0]&&this.fromOrientedRange(this.ranges[0])},this.$onAddRange=function(e){this.rangeCount=this.rangeList.ranges.length,this.ranges.unshift(e),this._signal("addRange",{range:e})},this.$onRemoveRange=function(e){if(this.rangeCount=this.rangeList.ranges.length,1==this.rangeCount&&this.inMultiSelectMode){var t=this.rangeList.ranges.pop();e.push(t),this.rangeCount=0}for(var i=e.length;i--;){var n=this.ranges.indexOf(e[i]);this.ranges.splice(n,1)}this._signal("removeRange",{ranges:e}),0===this.rangeCount&&this.inMultiSelectMode&&(this.inMultiSelectMode=!1,this._signal("singleSelect"),this.session.$undoSelect=!0,this.rangeList.detach(this.session)),(t=t||this.ranges[0])&&!t.isEqual(this.getRange())&&this.fromOrientedRange(t)},this.$initRangeList=function(){this.rangeList||(this.rangeList=new a,this.ranges=[],this.rangeCount=0)},this.getAllRanges=function(){return this.rangeCount?this.rangeList.ranges.concat():[this.getRange()]},this.splitIntoLines=function(){if(this.rangeCount>1){var e=this.rangeList.ranges,t=e[e.length-1],i=l.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(i,t.cursor==t.start)}else{var i=this.getRange(),n=this.isBackwards(),r=i.start.row,o=i.end.row;if(r==o){if(n)var s=i.end,a=i.start;else var s=i.start,a=i.end;return this.addRange(l.fromPoints(a,a)),void this.addRange(l.fromPoints(s,s))}var c=[],h=this.getLineRange(r,!0);h.start.column=i.start.column,c.push(h);for(var d=r+1;d1){var e=this.rangeList.ranges,t=e[e.length-1],i=l.fromPoints(e[0].start,t.end);this.toSingleRange(),this.setSelectionRange(i,t.cursor==t.start)}else{var n=this.session.documentToScreenPosition(this.selectionLead),r=this.session.documentToScreenPosition(this.selectionAnchor);this.rectangularRangeBlock(n,r).forEach(this.addRange,this)}},this.rectangularRangeBlock=function(e,t,i){var n=[],o=e.column0;)v--;if(v>0)for(var y=0;n[y].isEmpty();)y++;for(var w=v;w>=y;w--)n[w].isEmpty()&&n.splice(w,1)}return n}}.call(c.prototype);var v=e("./editor").Editor;(function(){this.updateSelectionMarkers=function(){this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.addSelectionMarker=function(e){e.cursor||(e.cursor=e.end);var t=this.getSelectionStyle();return e.marker=this.session.addMarker(e,"ace_selection",t),this.session.$selectionMarkers.push(e),this.session.selectionMarkerCount=this.session.$selectionMarkers.length,e},this.removeSelectionMarker=function(e){if(e.marker){this.session.removeMarker(e.marker);var t=this.session.$selectionMarkers.indexOf(e);-1!=t&&this.session.$selectionMarkers.splice(t,1),this.session.selectionMarkerCount=this.session.$selectionMarkers.length}},this.removeSelectionMarkers=function(e){for(var t=this.session.$selectionMarkers,i=e.length;i--;){var n=e[i];if(n.marker){this.session.removeMarker(n.marker);var r=t.indexOf(n);-1!=r&&t.splice(r,1)}}this.session.selectionMarkerCount=t.length},this.$onAddRange=function(e){this.addSelectionMarker(e.range),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onRemoveRange=function(e){this.removeSelectionMarkers(e.ranges),this.renderer.updateCursor(),this.renderer.updateBackMarkers()},this.$onMultiSelect=function(e){this.inMultiSelectMode||(this.inMultiSelectMode=!0,this.setStyle("ace_multiselect"),this.keyBinding.addKeyboardHandler(p.keyboardHandler),this.commands.setDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers())},this.$onSingleSelect=function(e){this.session.multiSelect.inVirtualMode||(this.inMultiSelectMode=!1,this.unsetStyle("ace_multiselect"),this.keyBinding.removeKeyboardHandler(p.keyboardHandler),this.commands.removeDefaultHandler("exec",this.$onMultiSelectExec),this.renderer.updateCursor(),this.renderer.updateBackMarkers(),this._emit("changeSelection"))},this.$onMultiSelectExec=function(e){var t=e.command,i=e.editor;if(i.multiSelect){if(t.multiSelectAction)"forEach"==t.multiSelectAction?n=i.forEachSelection(t,e.args):"forEachLine"==t.multiSelectAction?n=i.forEachSelection(t,e.args,!0):"single"==t.multiSelectAction?(i.exitMultiSelectMode(),n=t.exec(i,e.args||{})):n=t.multiSelectAction(i,e.args||{});else{var n=t.exec(i,e.args||{});i.multiSelect.addRange(i.multiSelect.toOrientedRange()),i.multiSelect.mergeOverlappingRanges()}return n}},this.forEachSelection=function(e,t,i){if(!this.inVirtualSelectionMode){var n,r=i&&i.keepOrder,o=1==i||i&&i.$byLines,s=this.session,a=this.selection,l=a.rangeList,h=(r?a:l).ranges;if(!h.length)return e.exec?e.exec(this,t||{}):e(this,t||{});var d=a._eventRegistry;a._eventRegistry={};var u=new c(s);this.inVirtualSelectionMode=!0;for(var p=h.length;p--;){if(o)for(;p>0&&h[p].start.row==h[p-1].end.row;)p--;u.fromOrientedRange(h[p]),u.index=p,this.selection=s.selection=u;var f=e.exec?e.exec(this,t||{}):e(this,t||{});n||void 0===f||(n=f),u.toOrientedRange(h[p])}u.detach(),this.selection=s.selection=a,this.inVirtualSelectionMode=!1,a._eventRegistry=d,a.mergeOverlappingRanges();var m=this.renderer.$scrollAnimation;return this.onCursorChange(),this.onSelectionChange(),m&&m.from==m.to&&this.renderer.animateScrolling(m.from),n}},this.exitMultiSelectMode=function(){this.inMultiSelectMode&&!this.inVirtualSelectionMode&&this.multiSelect.toSingleRange()},this.getSelectedText=function(){var e="";if(this.inMultiSelectMode&&!this.inVirtualSelectionMode){for(var t=this.multiSelect.rangeList.ranges,i=[],n=0;no&&(o=i.column),rc?e.insert(n,u.stringRepeat(" ",r-c)):e.remove(new l(n.row,n.column,n.row,n.column-r+c)),t.start.column=t.end.column=o,t.start.row=t.end.row=n.row,t.cursor=t.end}),t.fromOrientedRange(i[0]),this.renderer.updateCursor(),this.renderer.updateBackMarkers()}else{var c=this.selection.getRange(),h=c.start.row,d=c.end.row,p=h==d;if(p){var f,m=this.session.getLength();do{f=this.session.getLine(d)}while(/[=:]/.test(f)&&++d0);h<0&&(h=0),d>=m&&(d=m-1)}var g=this.session.removeFullLines(h,d);g=this.$reAlignText(g,p),this.session.insert({row:h,column:0},g.join("\n")+"\n"),p||(c.start.column=0,c.end.column=g[g.length-1].length),this.selection.setRange(c)}},this.$reAlignText=function(e,t){function i(e){return u.stringRepeat(" ",e)}function n(e){return e[2]?i(s)+e[2]+i(a-e[2].length+l)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function r(e){return e[2]?i(s+a-e[2].length)+e[2]+i(l," ")+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}function o(e){return e[2]?i(s)+e[2]+i(l)+e[4].replace(/^([=:])\s+/,"$1 "):e[0]}var s,a,l,c=!0,h=!0;return e.map(function(e){var t=e.match(/(\s*)(.*?)(\s*)([=:].*)/);return t?null==s?(s=t[1].length,a=t[2].length,l=t[3].length,t):(s+a+l!=t[1].length+t[2].length+t[3].length&&(h=!1),s!=t[1].length&&(c=!1),s>t[1].length&&(s=t[1].length),at[3].length&&(l=t[3].length),t):[e]}).map(t?n:c?h?r:n:o)}}).call(v.prototype),t.onSessionChange=function(e){var t=e.session;t&&!t.multiSelect&&(t.$selectionMarkers=[],t.selection.$initRangeList(),t.multiSelect=t.selection),this.multiSelect=t&&t.multiSelect;var i=e.oldSession;i&&(i.multiSelect.off("addRange",this.$onAddRange),i.multiSelect.off("removeRange",this.$onRemoveRange),i.multiSelect.off("multiSelect",this.$onMultiSelect),i.multiSelect.off("singleSelect",this.$onSingleSelect),i.multiSelect.lead.off("change",this.$checkMultiselectChange),i.multiSelect.anchor.off("change",this.$checkMultiselectChange)),t&&(t.multiSelect.on("addRange",this.$onAddRange),t.multiSelect.on("removeRange",this.$onRemoveRange),t.multiSelect.on("multiSelect",this.$onMultiSelect),t.multiSelect.on("singleSelect",this.$onSingleSelect),t.multiSelect.lead.on("change",this.$checkMultiselectChange),t.multiSelect.anchor.on("change",this.$checkMultiselectChange)),t&&this.inMultiSelectMode!=t.selection.inMultiSelectMode&&(t.selection.inMultiSelectMode?this.$onMultiSelect():this.$onSingleSelect())},t.MultiSelect=o,e("./config").defineOptions(v.prototype,"editor",{enableMultiselect:{set:function(e){o(this),e?(this.on("changeSession",this.$multiselectOnSessionChange),this.on("mousedown",h)):(this.off("changeSession",this.$multiselectOnSessionChange),this.off("mousedown",h))},value:!0},enableBlockSelect:{set:function(e){this.$blockSelectEnabled=e},value:!0}})}),ace.define("ace/mode/folding/fold_mode",["require","exports","module","ace/range"],function(e,t,i){"use strict";var n=e("../../range").Range,r=t.FoldMode=function(){};(function(){this.foldingStartMarker=null,this.foldingStopMarker=null,this.getFoldWidget=function(e,t,i){var n=e.getLine(i);return this.foldingStartMarker.test(n)?"start":"markbeginend"==t&&this.foldingStopMarker&&this.foldingStopMarker.test(n)?"end":""},this.getFoldWidgetRange=function(e,t,i){return null},this.indentationBlock=function(e,t,i){var r=e.getLine(t),o=r.search(/\S/);if(-1!=o){for(var s=i||r.length,a=e.getLength(),l=t,c=t;++tl){var d=e.getLine(c).length;return new n(l,s,c,d)}}},this.openingBracketBlock=function(e,t,i,r,o){var s={row:i,column:r+1},a=e.$findClosingBracket(t,s,o);if(a){var l=e.foldWidgets[a.row];return null==l&&(l=e.getFoldWidget(a.row)),"start"==l&&a.row>s.row&&(a.row--,a.column=e.getLine(a.row).length),n.fromPoints(s,a)}},this.closingBracketBlock=function(e,t,i,r,o){var s={row:i,column:r},a=e.$findOpeningBracket(t,s);if(a)return a.column++,s.column--,n.fromPoints(a,s)}}).call(r.prototype)}),ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"],function(e,t,i){"use strict";t.isDark=!1,t.cssClass="ace-tm",t.cssText='.ace-tm .ace_gutter {\tbackground: #f0f0f0;\tcolor: #333;\t}\t.ace-tm .ace_print-margin {\twidth: 1px;\tbackground: #e8e8e8;\t}\t.ace-tm .ace_fold {\tbackground-color: #6B72E6;\t}\t.ace-tm {\tbackground-color: #FFFFFF;\tcolor: black;\t}\t.ace-tm .ace_cursor {\tcolor: black;\t}\t.ace-tm .ace_invisible {\tcolor: rgb(191, 191, 191);\t}\t.ace-tm .ace_storage,\t.ace-tm .ace_keyword {\tcolor: blue;\t}\t.ace-tm .ace_constant {\tcolor: rgb(197, 6, 11);\t}\t.ace-tm .ace_constant.ace_buildin {\tcolor: rgb(88, 72, 246);\t}\t.ace-tm .ace_constant.ace_language {\tcolor: rgb(88, 92, 246);\t}\t.ace-tm .ace_constant.ace_library {\tcolor: rgb(6, 150, 14);\t}\t.ace-tm .ace_invalid {\tbackground-color: rgba(255, 0, 0, 0.1);\tcolor: red;\t}\t.ace-tm .ace_support.ace_function {\tcolor: rgb(60, 76, 114);\t}\t.ace-tm .ace_support.ace_constant {\tcolor: rgb(6, 150, 14);\t}\t.ace-tm .ace_support.ace_type,\t.ace-tm .ace_support.ace_class {\tcolor: rgb(109, 121, 222);\t}\t.ace-tm .ace_keyword.ace_operator {\tcolor: rgb(104, 118, 135);\t}\t.ace-tm .ace_string {\tcolor: rgb(3, 106, 7);\t}\t.ace-tm .ace_comment {\tcolor: rgb(76, 136, 107);\t}\t.ace-tm .ace_comment.ace_doc {\tcolor: rgb(0, 102, 255);\t}\t.ace-tm .ace_comment.ace_doc.ace_tag {\tcolor: rgb(128, 159, 191);\t}\t.ace-tm .ace_constant.ace_numeric {\tcolor: rgb(0, 0, 205);\t}\t.ace-tm .ace_variable {\tcolor: rgb(49, 132, 149);\t}\t.ace-tm .ace_xml-pe {\tcolor: rgb(104, 104, 91);\t}\t.ace-tm .ace_entity.ace_name.ace_function {\tcolor: #0000A2;\t}\t.ace-tm .ace_heading {\tcolor: rgb(12, 7, 255);\t}\t.ace-tm .ace_list {\tcolor:rgb(185, 6, 144);\t}\t.ace-tm .ace_meta.ace_tag {\tcolor:rgb(0, 22, 142);\t}\t.ace-tm .ace_string.ace_regex {\tcolor: rgb(255, 0, 0)\t}\t.ace-tm .ace_marker-layer .ace_selection {\tbackground: rgb(181, 213, 255);\t}\t.ace-tm.ace_multiselect .ace_selection.ace_start {\tbox-shadow: 0 0 3px 0px white;\t}\t.ace-tm .ace_marker-layer .ace_step {\tbackground: rgb(252, 255, 0);\t}\t.ace-tm .ace_marker-layer .ace_stack {\tbackground: rgb(164, 229, 101);\t}\t.ace-tm .ace_marker-layer .ace_bracket {\tmargin: -1px 0 0 -1px;\tborder: 1px solid rgb(192, 192, 192);\t}\t.ace-tm .ace_marker-layer .ace_active-line {\tbackground: rgba(0, 0, 0, 0.07);\t}\t.ace-tm .ace_gutter-active-line {\tbackground-color : #dcdcdc;\t}\t.ace-tm .ace_marker-layer .ace_selected-word {\tbackground: rgb(250, 250, 255);\tborder: 1px solid rgb(200, 200, 250);\t}\t.ace-tm .ace_indent-guide {\tbackground: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y;\t}\t',e("../lib/dom").importCssString(t.cssText,t.cssClass)}),ace.define("ace/line_widgets",["require","exports","module","ace/lib/oop","ace/lib/dom","ace/range"],function(e,t,i){"use strict";function n(e){this.session=e,this.session.widgetManager=this,this.session.getRowLength=this.getRowLength,this.session.$getWidgetScreenLength=this.$getWidgetScreenLength,this.updateOnChange=this.updateOnChange.bind(this),this.renderWidgets=this.renderWidgets.bind(this),this.measureWidgets=this.measureWidgets.bind(this),this.session._changedWidgets=[],this.$onChangeEditor=this.$onChangeEditor.bind(this),this.session.on("change",this.updateOnChange),this.session.on("changeFold",this.updateOnFold),this.session.on("changeEditor",this.$onChangeEditor)}var r=(e("./lib/oop"),e("./lib/dom"));e("./range").Range;(function(){this.getRowLength=function(e){var t;return t=this.lineWidgets?this.lineWidgets[e]&&this.lineWidgets[e].rowCount||0:0,this.$useWrapMode&&this.$wrapData[e]?this.$wrapData[e].length+1+t:1+t},this.$getWidgetScreenLength=function(){var e=0;return this.lineWidgets.forEach(function(t){t&&t.rowCount&&!t.hidden&&(e+=t.rowCount)}),e},this.$onChangeEditor=function(e){this.attach(e.editor)},this.attach=function(e){e&&e.widgetManager&&e.widgetManager!=this&&e.widgetManager.detach(),this.editor!=e&&(this.detach(),this.editor=e,e&&(e.widgetManager=this,e.renderer.on("beforeRender",this.measureWidgets),e.renderer.on("afterRender",this.renderWidgets)))},this.detach=function(e){var t=this.editor;if(t){this.editor=null,t.widgetManager=null,t.renderer.off("beforeRender",this.measureWidgets),t.renderer.off("afterRender",this.renderWidgets);var i=this.session.lineWidgets;i&&i.forEach(function(e){e&&e.el&&e.el.parentNode&&(e._inDocument=!1,e.el.parentNode.removeChild(e.el))})}},this.updateOnFold=function(e,t){var i=t.lineWidgets;if(i&&e.action){for(var n=e.data,r=n.start.row,o=n.end.row,s="add"==e.action,a=r+1;a0&&!n[r];)r--;this.firstRow=i.firstRow,this.lastRow=i.lastRow,t.$cursorLayer.config=i;for(var s=r;s<=o;s++){var a=n[s];if(a&&a.el)if(a.hidden)a.el.style.top=-100-(a.pixelHeight||0)+"px";else{a._inDocument||(a._inDocument=!0,t.container.appendChild(a.el));var l=t.$cursorLayer.getPixelPosition({row:s,column:0},!0).top;a.coverLine||(l+=i.lineHeight*this.session.getRowLineCount(a.row)),a.el.style.top=l-i.offset+"px";var c=a.coverGutter?0:t.gutterWidth;a.fixedWidth||(c-=t.scrollLeft),a.el.style.left=c+"px",a.fullWidth&&a.screenWidth&&(a.el.style.minWidth=i.width+2*i.padding+"px"),a.fixedWidth?a.el.style.right=t.scrollBar.getWidth()+"px":a.el.style.right=""}}}}}).call(n.prototype),t.LineWidgets=n}),ace.define("ace/ext/error_marker",["require","exports","module","ace/line_widgets","ace/lib/dom","ace/range"],function(e,t,i){"use strict";function n(e,t,i){for(var n=0,r=e.length-1;n<=r;){var o=n+r>>1,s=i(t,e[o]);if(s>0)n=o+1;else{if(!(s<0))return o;r=o-1}}return-(n+1)}function r(e,t,i){var r=e.getAnnotations().sort(a.comparePoints);if(r.length){var o=n(r,{row:t,column:-1},a.comparePoints);o<0&&(o=-o-1),o>=r.length?o=i>0?0:r.length-1:0===o&&i<0&&(o=r.length-1);var s=r[o];if(s&&i){if(s.row===t){do{s=r[o+=i]}while(s&&s.row===t);if(!s)return r.slice()}var l=[];t=s.row;do{l[i<0?"unshift":"push"](s),s=r[o+=i]}while(s&&s.row==t);return l.length&&l}}}var o=e("../line_widgets").LineWidgets,s=e("../lib/dom"),a=e("../range").Range;t.showErrorMarker=function(e,t){var i=e.session;i.widgetManager||(i.widgetManager=new o(i),i.widgetManager.attach(e));var n=e.getCursorPosition(),a=n.row,l=i.widgetManager.getWidgetsAtRow(a).filter(function(e){return"errorMarker"==e.type})[0];l?l.destroy():a-=t;var c,h=r(i,a,t);if(h){var d=h[0];n.column=(d.pos&&"number"!=typeof d.column?d.pos.sc:d.column)||0,n.row=d.row,c=e.renderer.$gutterLayer.$annotations[n.row]}else{if(l)return;c={text:["Looks good!"],className:"ace_ok"}}e.session.unfold(n.row),e.selection.moveToPosition(n);var u={row:n.row,fixedWidth:!0,coverGutter:!0,el:s.createElement("div"),type:"errorMarker"},p=u.el.appendChild(s.createElement("div")),f=u.el.appendChild(s.createElement("div"));f.className="error_widget_arrow "+c.className;var m=e.renderer.$cursorLayer.getPixelPosition(n).left;f.style.left=m+e.renderer.gutterWidth-5+"px",u.el.className="error_widget_wrapper",p.className="error_widget "+c.className,p.innerHTML=c.text.join("
      "),p.appendChild(s.createElement("div"));var g=function(e,t,i){if(0===t&&("esc"===i||"return"===i))return u.destroy(),{command:"null"}};u.destroy=function(){e.$mouseHandler.isMousePressed||(e.keyBinding.removeKeyboardHandler(g),i.widgetManager.removeLineWidget(u),e.off("changeSelection",u.destroy),e.off("changeSession",u.destroy),e.off("mouseup",u.destroy),e.off("change",u.destroy))},e.keyBinding.addKeyboardHandler(g),e.on("changeSelection",u.destroy),e.on("changeSession",u.destroy),e.on("mouseup",u.destroy),e.on("change",u.destroy),e.session.widgetManager.addLineWidget(u),u.el.onmousedown=e.focus.bind(e),e.renderer.scrollCursorIntoView(null,.5,{bottom:u.el.offsetHeight})},s.importCssString("\t .error_widget_wrapper {\t background: inherit;\t color: inherit;\t border:none\t }\t .error_widget {\t border-top: solid 2px;\t border-bottom: solid 2px;\t margin: 5px 0;\t padding: 10px 40px;\t white-space: pre-wrap;\t }\t .error_widget.ace_error, .error_widget_arrow.ace_error{\t border-color: #ff5a5a\t }\t .error_widget.ace_warning, .error_widget_arrow.ace_warning{\t border-color: #F1D817\t }\t .error_widget.ace_info, .error_widget_arrow.ace_info{\t border-color: #5a5a5a\t }\t .error_widget.ace_ok, .error_widget_arrow.ace_ok{\t border-color: #5aaa5a\t }\t .error_widget_arrow {\t position: absolute;\t border: solid 5px;\t border-top-color: transparent!important;\t border-right-color: transparent!important;\t border-left-color: transparent!important;\t top: -5px;\t }\t","")}),ace.define("ace/ace",["require","exports","module","ace/lib/fixoldbrowsers","ace/lib/dom","ace/lib/event","ace/editor","ace/edit_session","ace/undomanager","ace/virtual_renderer","ace/worker/worker_client","ace/keyboard/hash_handler","ace/placeholder","ace/multi_select","ace/mode/folding/fold_mode","ace/theme/textmate","ace/ext/error_marker","ace/config"],function(e,t,n){"use strict";e("./lib/fixoldbrowsers");var r=e("./lib/dom"),o=e("./lib/event"),s=e("./editor").Editor,a=e("./edit_session").EditSession,l=e("./undomanager").UndoManager,c=e("./virtual_renderer").VirtualRenderer;e("./worker/worker_client"),e("./keyboard/hash_handler"),e("./placeholder"),e("./multi_select"),e("./mode/folding/fold_mode"),e("./theme/textmate"),e("./ext/error_marker"),t.config=e("./config"),t.acequire=e,t.define=i(53),t.edit=function(e){if("string"==typeof e){var i=e;if(!(e=document.getElementById(i)))throw new Error("ace.edit can't find div #"+i)}if(e&&e.env&&e.env.editor instanceof s)return e.env.editor;var n="";if(e&&/input|textarea/i.test(e.tagName)){var a=e;n=a.value,e=r.createElement("pre"),a.parentNode.replaceChild(e,a)}else e&&(n=r.getInnerText(e),e.innerHTML="");var l=t.createEditSession(n),h=new s(new c(e));h.setSession(l);var d={document:l,editor:h,onResize:h.resize.bind(h,null)};return a&&(d.textarea=a),o.addListener(window,"resize",d.onResize),h.on("destroy",function(){o.removeListener(window,"resize",d.onResize),d.editor.container.env=null}),h.container.env=h.env=d,h},t.createEditSession=function(e,t){var i=new a(e,t);return i.setUndoManager(new l),i},t.EditSession=a,t.UndoManager=l,t.version="1.2.9"}),function(){ace.acequire(["ace/ace"],function(e){e&&(e.config.init(!0),e.define=ace.define),window.ace||(window.ace=e);for(var t in e)e.hasOwnProperty(t)&&(window.ace[t]=e[t])})}(),e.exports=window.ace.acequire("ace/ace")},function(e,t){e.exports=function(){throw new Error("define cannot be used indirect")}},function(e,t,i){ace.define("ace/mode/json_highlight_rules",["require","exports","module","ace/lib/oop","ace/mode/text_highlight_rules"],function(e,t,i){"use strict";var n=e("../lib/oop"),r=e("./text_highlight_rules").TextHighlightRules,o=function(){this.$rules={start:[{token:"variable",regex:'["](?:(?:\\\\.)|(?:[^"\\\\]))*?["]\\s*(?=:)'},{token:"string",regex:'"',next:"string"},{token:"constant.numeric",regex:"0[xX][0-9a-fA-F]+\\b"},{token:"constant.numeric",regex:"[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?\\b"},{token:"constant.language.boolean",regex:"(?:true|false)\\b"},{token:"text",regex:"['](?:(?:\\\\.)|(?:[^'\\\\]))*?[']"},{token:"comment",regex:"\\/\\/.*$"},{token:"comment.start",regex:"\\/\\*",next:"comment"},{token:"paren.lparen",regex:"[[({]"},{token:"paren.rparen",regex:"[\\])}]"},{token:"text",regex:"\\s+"}],string:[{token:"constant.language.escape",regex:/\\(?:x[0-9a-fA-F]{2}|u[0-9a-fA-F]{4}|["\\\/bfnrt])/},{token:"string",regex:'"|$',next:"start"},{defaultToken:"string"}],comment:[{token:"comment.end",regex:"\\*\\/",next:"start"},{defaultToken:"comment"}]}};n.inherits(o,r),t.JsonHighlightRules=o}),ace.define("ace/mode/matching_brace_outdent",["require","exports","module","ace/range"],function(e,t,i){"use strict";var n=e("../range").Range,r=function(){};(function(){this.checkOutdent=function(e,t){return!!/^\s+$/.test(e)&&/^\s*\}/.test(t)},this.autoOutdent=function(e,t){var i=e.getLine(t),r=i.match(/^(\s*\})/);if(!r)return 0;var o=r[1].length,s=e.findMatchingBracket({row:t,column:o});if(!s||s.row==t)return 0;var a=this.$getIndent(e.getLine(s.row));e.replace(new n(t,0,t,o-1),a)},this.$getIndent=function(e){return e.match(/^\s*/)[0]}}).call(r.prototype),t.MatchingBraceOutdent=r}),ace.define("ace/mode/folding/cstyle",["require","exports","module","ace/lib/oop","ace/range","ace/mode/folding/fold_mode"],function(e,t,i){"use strict";var n=e("../../lib/oop"),r=e("../../range").Range,o=e("./fold_mode").FoldMode,s=t.FoldMode=function(e){e&&(this.foldingStartMarker=new RegExp(this.foldingStartMarker.source.replace(/\|[^|]*?$/,"|"+e.start)),this.foldingStopMarker=new RegExp(this.foldingStopMarker.source.replace(/\|[^|]*?$/,"|"+e.end)))};n.inherits(s,o),function(){this.foldingStartMarker=/([\{\[\(])[^\}\]\)]*$|^\s*(\/\*)/,this.foldingStopMarker=/^[^\[\{\(]*([\}\]\)])|^[\s\*]*(\*\/)/,this.singleLineBlockCommentRe=/^\s*(\/\*).*\*\/\s*$/,this.tripleStarBlockCommentRe=/^\s*(\/\*\*\*).*\*\/\s*$/,this.startRegionRe=/^\s*(\/\*|\/\/)#?region\b/,this._getFoldWidgetBase=this.getFoldWidget,this.getFoldWidget=function(e,t,i){var n=e.getLine(i);if(this.singleLineBlockCommentRe.test(n)&&!this.startRegionRe.test(n)&&!this.tripleStarBlockCommentRe.test(n))return"";var r=this._getFoldWidgetBase(e,t,i);return!r&&this.startRegionRe.test(n)?"start":r},this.getFoldWidgetRange=function(e,t,i,n){var r=e.getLine(i);if(this.startRegionRe.test(r))return this.getCommentRegionBlock(e,r,i);var o=r.match(this.foldingStartMarker);if(o){var s=o.index;if(o[1])return this.openingBracketBlock(e,o[1],i,s);var a=e.getCommentFoldRange(i,s+o[0].length,1);return a&&!a.isMultiLine()&&(n?a=this.getSectionRange(e,i):"all"!=t&&(a=null)),a}if("markbegin"!==t){var o=r.match(this.foldingStopMarker);if(o){var s=o.index+o[0].length;return o[1]?this.closingBracketBlock(e,o[1],i,s):e.getCommentFoldRange(i,s,-1)}}},this.getSectionRange=function(e,t){var i=e.getLine(t),n=i.search(/\S/),o=t,s=i.length;t+=1;for(var a=t,l=e.getLength();++tc)break;var h=this.getFoldWidgetRange(e,"all",t);if(h){if(h.start.row<=o)break;if(h.isMultiLine())t=h.end.row;else if(n==c)break}a=t}}return new r(o,s,a,e.getLine(a).length)},this.getCommentRegionBlock=function(e,t,i){for(var n=t.search(/\s*$/),o=e.getLength(),s=i,a=/^\s*(?:\/\*|\/\/|--)#?(end)?region\b/,l=1;++is)return new r(s,n,h,t.length)}}.call(s.prototype)}),ace.define("ace/mode/json",["require","exports","module","ace/lib/oop","ace/mode/text","ace/mode/json_highlight_rules","ace/mode/matching_brace_outdent","ace/mode/behaviour/cstyle","ace/mode/folding/cstyle","ace/worker/worker_client"],function(e,t,n){"use strict";var r=e("../lib/oop"),o=e("./text").Mode,s=e("./json_highlight_rules").JsonHighlightRules,a=e("./matching_brace_outdent").MatchingBraceOutdent,l=e("./behaviour/cstyle").CstyleBehaviour,c=e("./folding/cstyle").FoldMode,h=e("../worker/worker_client").WorkerClient,d=function(){this.HighlightRules=s,this.$outdent=new a,this.$behaviour=new l,this.foldingRules=new c};r.inherits(d,o),function(){this.getNextLineIndent=function(e,t,i){var n=this.$getIndent(t);if("start"==e){t.match(/^.*[\{\(\[]\s*$/)&&(n+=i)}return n},this.checkOutdent=function(e,t,i){return this.$outdent.checkOutdent(t,i)},this.autoOutdent=function(e,t,i){this.$outdent.autoOutdent(t,i)},this.createWorker=function(e){var t=new h(["ace"],i(55),"JsonWorker");return t.attachToDocument(e.getDocument()),t.on("annotate",function(t){e.setAnnotations(t.data)}),t.on("terminate",function(){e.clearAnnotations()}),t},this.$id="ace/mode/json"}.call(d.prototype),t.Mode=d})},function(e,t){e.exports.id="ace/mode/json_worker", e.exports.src='"no use strict";!function(window){function resolveModuleId(id,paths){for(var testPath=id,tail="";testPath;){var alias=paths[testPath];if("string"==typeof alias)return alias+tail;if(alias)return alias.location.replace(/\\/*$/,"/")+(tail||alias.main||alias.name);if(alias===!1)return"";var i=testPath.lastIndexOf("/");if(-1===i)break;tail=testPath.substr(i)+tail,testPath=testPath.slice(0,i)}return id}if(!(void 0!==window.window&&window.document||window.acequire&&window.define)){window.console||(window.console=function(){var msgs=Array.prototype.slice.call(arguments,0);postMessage({type:"log",data:msgs})},window.console.error=window.console.warn=window.console.log=window.console.trace=window.console),window.window=window,window.ace=window,window.onerror=function(message,file,line,col,err){postMessage({type:"error",data:{message:message,data:err.data,file:file,line:line,col:col,stack:err.stack}})},window.normalizeModule=function(parentId,moduleName){if(-1!==moduleName.indexOf("!")){var chunks=moduleName.split("!");return window.normalizeModule(parentId,chunks[0])+"!"+window.normalizeModule(parentId,chunks[1])}if("."==moduleName.charAt(0)){var base=parentId.split("/").slice(0,-1).join("/");for(moduleName=(base?base+"/":"")+moduleName;-1!==moduleName.indexOf(".")&&previous!=moduleName;){var previous=moduleName;moduleName=moduleName.replace(/^\\.\\//,"").replace(/\\/\\.\\//,"/").replace(/[^\\/]+\\/\\.\\.\\//,"")}}return moduleName},window.acequire=function acequire(parentId,id){if(id||(id=parentId,parentId=null),!id.charAt)throw Error("worker.js acequire() accepts only (parentId, id) as arguments");id=window.normalizeModule(parentId,id);var module=window.acequire.modules[id];if(module)return module.initialized||(module.initialized=!0,module.exports=module.factory().exports),module.exports;if(!window.acequire.tlns)return console.log("unable to load "+id);var path=resolveModuleId(id,window.acequire.tlns);return".js"!=path.slice(-3)&&(path+=".js"),window.acequire.id=id,window.acequire.modules[id]={},importScripts(path),window.acequire(parentId,id)},window.acequire.modules={},window.acequire.tlns={},window.define=function(id,deps,factory){if(2==arguments.length?(factory=deps,"string"!=typeof id&&(deps=id,id=window.acequire.id)):1==arguments.length&&(factory=id,deps=[],id=window.acequire.id),"function"!=typeof factory)return window.acequire.modules[id]={exports:factory,initialized:!0},void 0;deps.length||(deps=["require","exports","module"]);var req=function(childId){return window.acequire(id,childId)};window.acequire.modules[id]={exports:{},factory:function(){var module=this,returnExports=factory.apply(this,deps.map(function(dep){switch(dep){case"require":return req;case"exports":return module.exports;case"module":return module;default:return req(dep)}}));return returnExports&&(module.exports=returnExports),module}}},window.define.amd={},acequire.tlns={},window.initBaseUrls=function(topLevelNamespaces){for(var i in topLevelNamespaces)acequire.tlns[i]=topLevelNamespaces[i]},window.initSender=function(){var EventEmitter=window.acequire("ace/lib/event_emitter").EventEmitter,oop=window.acequire("ace/lib/oop"),Sender=function(){};return function(){oop.implement(this,EventEmitter),this.callback=function(data,callbackId){postMessage({type:"call",id:callbackId,data:data})},this.emit=function(name,data){postMessage({type:"event",name:name,data:data})}}.call(Sender.prototype),new Sender};var main=window.main=null,sender=window.sender=null;window.onmessage=function(e){var msg=e.data;if(msg.event&&sender)sender._signal(msg.event,msg.data);else if(msg.command)if(main[msg.command])main[msg.command].apply(main,msg.args);else{if(!window[msg.command])throw Error("Unknown command:"+msg.command);window[msg.command].apply(window,msg.args)}else if(msg.init){window.initBaseUrls(msg.tlns),acequire("ace/lib/es5-shim"),sender=window.sender=window.initSender();var clazz=acequire(msg.module)[msg.classname];main=window.main=new clazz(sender)}}}}(this),ace.define("ace/lib/oop",["require","exports","module"],function(acequire,exports){"use strict";exports.inherits=function(ctor,superCtor){ctor.super_=superCtor,ctor.prototype=Object.create(superCtor.prototype,{constructor:{value:ctor,enumerable:!1,writable:!0,configurable:!0}})},exports.mixin=function(obj,mixin){for(var key in mixin)obj[key]=mixin[key];return obj},exports.implement=function(proto,mixin){exports.mixin(proto,mixin)}}),ace.define("ace/range",["require","exports","module"],function(acequire,exports){"use strict";var comparePoints=function(p1,p2){return p1.row-p2.row||p1.column-p2.column},Range=function(startRow,startColumn,endRow,endColumn){this.start={row:startRow,column:startColumn},this.end={row:endRow,column:endColumn}};(function(){this.isEqual=function(range){return this.start.row===range.start.row&&this.end.row===range.end.row&&this.start.column===range.start.column&&this.end.column===range.end.column},this.toString=function(){return"Range: ["+this.start.row+"/"+this.start.column+"] -> ["+this.end.row+"/"+this.end.column+"]"},this.contains=function(row,column){return 0==this.compare(row,column)},this.compareRange=function(range){var cmp,end=range.end,start=range.start;return cmp=this.compare(end.row,end.column),1==cmp?(cmp=this.compare(start.row,start.column),1==cmp?2:0==cmp?1:0):-1==cmp?-2:(cmp=this.compare(start.row,start.column),-1==cmp?-1:1==cmp?42:0)},this.comparePoint=function(p){return this.compare(p.row,p.column)},this.containsRange=function(range){return 0==this.comparePoint(range.start)&&0==this.comparePoint(range.end)},this.intersects=function(range){var cmp=this.compareRange(range);return-1==cmp||0==cmp||1==cmp},this.isEnd=function(row,column){return this.end.row==row&&this.end.column==column},this.isStart=function(row,column){return this.start.row==row&&this.start.column==column},this.setStart=function(row,column){"object"==typeof row?(this.start.column=row.column,this.start.row=row.row):(this.start.row=row,this.start.column=column)},this.setEnd=function(row,column){"object"==typeof row?(this.end.column=row.column,this.end.row=row.row):(this.end.row=row,this.end.column=column)},this.inside=function(row,column){return 0==this.compare(row,column)?this.isEnd(row,column)||this.isStart(row,column)?!1:!0:!1},this.insideStart=function(row,column){return 0==this.compare(row,column)?this.isEnd(row,column)?!1:!0:!1},this.insideEnd=function(row,column){return 0==this.compare(row,column)?this.isStart(row,column)?!1:!0:!1},this.compare=function(row,column){return this.isMultiLine()||row!==this.start.row?this.start.row>row?-1:row>this.end.row?1:this.start.row===row?column>=this.start.column?0:-1:this.end.row===row?this.end.column>=column?0:1:0:this.start.column>column?-1:column>this.end.column?1:0},this.compareStart=function(row,column){return this.start.row==row&&this.start.column==column?-1:this.compare(row,column)},this.compareEnd=function(row,column){return this.end.row==row&&this.end.column==column?1:this.compare(row,column)},this.compareInside=function(row,column){return this.end.row==row&&this.end.column==column?1:this.start.row==row&&this.start.column==column?-1:this.compare(row,column)},this.clipRows=function(firstRow,lastRow){if(this.end.row>lastRow)var end={row:lastRow+1,column:0};else if(firstRow>this.end.row)var end={row:firstRow,column:0};if(this.start.row>lastRow)var start={row:lastRow+1,column:0};else if(firstRow>this.start.row)var start={row:firstRow,column:0};return Range.fromPoints(start||this.start,end||this.end)},this.extend=function(row,column){var cmp=this.compare(row,column);if(0==cmp)return this;if(-1==cmp)var start={row:row,column:column};else var end={row:row,column:column};return Range.fromPoints(start||this.start,end||this.end)},this.isEmpty=function(){return this.start.row===this.end.row&&this.start.column===this.end.column},this.isMultiLine=function(){return this.start.row!==this.end.row},this.clone=function(){return Range.fromPoints(this.start,this.end)},this.collapseRows=function(){return 0==this.end.column?new Range(this.start.row,0,Math.max(this.start.row,this.end.row-1),0):new Range(this.start.row,0,this.end.row,0)},this.toScreenRange=function(session){var screenPosStart=session.documentToScreenPosition(this.start),screenPosEnd=session.documentToScreenPosition(this.end);return new Range(screenPosStart.row,screenPosStart.column,screenPosEnd.row,screenPosEnd.column)},this.moveBy=function(row,column){this.start.row+=row,this.start.column+=column,this.end.row+=row,this.end.column+=column}}).call(Range.prototype),Range.fromPoints=function(start,end){return new Range(start.row,start.column,end.row,end.column)},Range.comparePoints=comparePoints,Range.comparePoints=function(p1,p2){return p1.row-p2.row||p1.column-p2.column},exports.Range=Range}),ace.define("ace/apply_delta",["require","exports","module"],function(acequire,exports){"use strict";exports.applyDelta=function(docLines,delta){var row=delta.start.row,startColumn=delta.start.column,line=docLines[row]||"";switch(delta.action){case"insert":var lines=delta.lines;if(1===lines.length)docLines[row]=line.substring(0,startColumn)+delta.lines[0]+line.substring(startColumn);else{var args=[row,1].concat(delta.lines);docLines.splice.apply(docLines,args),docLines[row]=line.substring(0,startColumn)+docLines[row],docLines[row+delta.lines.length-1]+=line.substring(startColumn)}break;case"remove":var endColumn=delta.end.column,endRow=delta.end.row;row===endRow?docLines[row]=line.substring(0,startColumn)+line.substring(endColumn):docLines.splice(row,endRow-row+1,line.substring(0,startColumn)+docLines[endRow].substring(endColumn))}}}),ace.define("ace/lib/event_emitter",["require","exports","module"],function(acequire,exports){"use strict";var EventEmitter={},stopPropagation=function(){this.propagationStopped=!0},preventDefault=function(){this.defaultPrevented=!0};EventEmitter._emit=EventEmitter._dispatchEvent=function(eventName,e){this._eventRegistry||(this._eventRegistry={}),this._defaultHandlers||(this._defaultHandlers={});var listeners=this._eventRegistry[eventName]||[],defaultHandler=this._defaultHandlers[eventName];if(listeners.length||defaultHandler){"object"==typeof e&&e||(e={}),e.type||(e.type=eventName),e.stopPropagation||(e.stopPropagation=stopPropagation),e.preventDefault||(e.preventDefault=preventDefault),listeners=listeners.slice();for(var i=0;listeners.length>i&&(listeners[i](e,this),!e.propagationStopped);i++);return defaultHandler&&!e.defaultPrevented?defaultHandler(e,this):void 0}},EventEmitter._signal=function(eventName,e){var listeners=(this._eventRegistry||{})[eventName];if(listeners){listeners=listeners.slice();for(var i=0;listeners.length>i;i++)listeners[i](e,this)}},EventEmitter.once=function(eventName,callback){var _self=this;callback&&this.addEventListener(eventName,function newCallback(){_self.removeEventListener(eventName,newCallback),callback.apply(null,arguments)})},EventEmitter.setDefaultHandler=function(eventName,callback){var handlers=this._defaultHandlers;if(handlers||(handlers=this._defaultHandlers={_disabled_:{}}),handlers[eventName]){var old=handlers[eventName],disabled=handlers._disabled_[eventName];disabled||(handlers._disabled_[eventName]=disabled=[]),disabled.push(old);var i=disabled.indexOf(callback);-1!=i&&disabled.splice(i,1)}handlers[eventName]=callback},EventEmitter.removeDefaultHandler=function(eventName,callback){var handlers=this._defaultHandlers;if(handlers){var disabled=handlers._disabled_[eventName];if(handlers[eventName]==callback)handlers[eventName],disabled&&this.setDefaultHandler(eventName,disabled.pop());else if(disabled){var i=disabled.indexOf(callback);-1!=i&&disabled.splice(i,1)}}},EventEmitter.on=EventEmitter.addEventListener=function(eventName,callback,capturing){this._eventRegistry=this._eventRegistry||{};var listeners=this._eventRegistry[eventName];return listeners||(listeners=this._eventRegistry[eventName]=[]),-1==listeners.indexOf(callback)&&listeners[capturing?"unshift":"push"](callback),callback},EventEmitter.off=EventEmitter.removeListener=EventEmitter.removeEventListener=function(eventName,callback){this._eventRegistry=this._eventRegistry||{};var listeners=this._eventRegistry[eventName];if(listeners){var index=listeners.indexOf(callback);-1!==index&&listeners.splice(index,1)}},EventEmitter.removeAllListeners=function(eventName){this._eventRegistry&&(this._eventRegistry[eventName]=[])},exports.EventEmitter=EventEmitter}),ace.define("ace/anchor",["require","exports","module","ace/lib/oop","ace/lib/event_emitter"],function(acequire,exports){"use strict";var oop=acequire("./lib/oop"),EventEmitter=acequire("./lib/event_emitter").EventEmitter,Anchor=exports.Anchor=function(doc,row,column){this.$onChange=this.onChange.bind(this),this.attach(doc),column===void 0?this.setPosition(row.row,row.column):this.setPosition(row,column)};(function(){function $pointsInOrder(point1,point2,equalPointsInOrder){var bColIsAfter=equalPointsInOrder?point1.column<=point2.column:point1.columnthis.row)){var point=$getTransformedPoint(delta,{row:this.row,column:this.column},this.$insertRight);this.setPosition(point.row,point.column,!0)}},this.setPosition=function(row,column,noClip){var pos;if(pos=noClip?{row:row,column:column}:this.$clipPositionToDocument(row,column),this.row!=pos.row||this.column!=pos.column){var old={row:this.row,column:this.column};this.row=pos.row,this.column=pos.column,this._signal("change",{old:old,value:pos})}},this.detach=function(){this.document.removeEventListener("change",this.$onChange)},this.attach=function(doc){this.document=doc||this.document,this.document.on("change",this.$onChange)},this.$clipPositionToDocument=function(row,column){var pos={};return row>=this.document.getLength()?(pos.row=Math.max(0,this.document.getLength()-1),pos.column=this.document.getLine(pos.row).length):0>row?(pos.row=0,pos.column=0):(pos.row=row,pos.column=Math.min(this.document.getLine(pos.row).length,Math.max(0,column))),0>column&&(pos.column=0),pos}}).call(Anchor.prototype)}),ace.define("ace/document",["require","exports","module","ace/lib/oop","ace/apply_delta","ace/lib/event_emitter","ace/range","ace/anchor"],function(acequire,exports){"use strict";var oop=acequire("./lib/oop"),applyDelta=acequire("./apply_delta").applyDelta,EventEmitter=acequire("./lib/event_emitter").EventEmitter,Range=acequire("./range").Range,Anchor=acequire("./anchor").Anchor,Document=function(textOrLines){this.$lines=[""],0===textOrLines.length?this.$lines=[""]:Array.isArray(textOrLines)?this.insertMergedLines({row:0,column:0},textOrLines):this.insert({row:0,column:0},textOrLines)};(function(){oop.implement(this,EventEmitter),this.setValue=function(text){var len=this.getLength()-1;this.remove(new Range(0,0,len,this.getLine(len).length)),this.insert({row:0,column:0},text)},this.getValue=function(){return this.getAllLines().join(this.getNewLineCharacter())},this.createAnchor=function(row,column){return new Anchor(this,row,column)},this.$split=0==="aaa".split(/a/).length?function(text){return text.replace(/\\r\\n|\\r/g,"\\n").split("\\n")}:function(text){return text.split(/\\r\\n|\\r|\\n/)},this.$detectNewLine=function(text){var match=text.match(/^.*?(\\r\\n|\\r|\\n)/m);this.$autoNewLine=match?match[1]:"\\n",this._signal("changeNewLineMode")},this.getNewLineCharacter=function(){switch(this.$newLineMode){case"windows":return"\\r\\n";case"unix":return"\\n";default:return this.$autoNewLine||"\\n"}},this.$autoNewLine="",this.$newLineMode="auto",this.setNewLineMode=function(newLineMode){this.$newLineMode!==newLineMode&&(this.$newLineMode=newLineMode,this._signal("changeNewLineMode"))},this.getNewLineMode=function(){return this.$newLineMode},this.isNewLine=function(text){return"\\r\\n"==text||"\\r"==text||"\\n"==text},this.getLine=function(row){return this.$lines[row]||""},this.getLines=function(firstRow,lastRow){return this.$lines.slice(firstRow,lastRow+1)},this.getAllLines=function(){return this.getLines(0,this.getLength())},this.getLength=function(){return this.$lines.length},this.getTextRange=function(range){return this.getLinesForRange(range).join(this.getNewLineCharacter())},this.getLinesForRange=function(range){var lines;if(range.start.row===range.end.row)lines=[this.getLine(range.start.row).substring(range.start.column,range.end.column)];else{lines=this.getLines(range.start.row,range.end.row),lines[0]=(lines[0]||"").substring(range.start.column);var l=lines.length-1;range.end.row-range.start.row==l&&(lines[l]=lines[l].substring(0,range.end.column))}return lines},this.insertLines=function(row,lines){return console.warn("Use of document.insertLines is deprecated. Use the insertFullLines method instead."),this.insertFullLines(row,lines)},this.removeLines=function(firstRow,lastRow){return console.warn("Use of document.removeLines is deprecated. Use the removeFullLines method instead."),this.removeFullLines(firstRow,lastRow)},this.insertNewLine=function(position){return console.warn("Use of document.insertNewLine is deprecated. Use insertMergedLines(position, [\'\', \'\']) instead."),this.insertMergedLines(position,["",""])},this.insert=function(position,text){return 1>=this.getLength()&&this.$detectNewLine(text),this.insertMergedLines(position,this.$split(text))},this.insertInLine=function(position,text){var start=this.clippedPos(position.row,position.column),end=this.pos(position.row,position.column+text.length);return this.applyDelta({start:start,end:end,action:"insert",lines:[text]},!0),this.clonePos(end)},this.clippedPos=function(row,column){var length=this.getLength();void 0===row?row=length:0>row?row=0:row>=length&&(row=length-1,column=void 0);var line=this.getLine(row);return void 0==column&&(column=line.length),column=Math.min(Math.max(column,0),line.length),{row:row,column:column}},this.clonePos=function(pos){return{row:pos.row,column:pos.column}},this.pos=function(row,column){return{row:row,column:column}},this.$clipPosition=function(position){var length=this.getLength();return position.row>=length?(position.row=Math.max(0,length-1),position.column=this.getLine(length-1).length):(position.row=Math.max(0,position.row),position.column=Math.min(Math.max(position.column,0),this.getLine(position.row).length)),position},this.insertFullLines=function(row,lines){row=Math.min(Math.max(row,0),this.getLength());var column=0;this.getLength()>row?(lines=lines.concat([""]),column=0):(lines=[""].concat(lines),row--,column=this.$lines[row].length),this.insertMergedLines({row:row,column:column},lines)},this.insertMergedLines=function(position,lines){var start=this.clippedPos(position.row,position.column),end={row:start.row+lines.length-1,column:(1==lines.length?start.column:0)+lines[lines.length-1].length};return this.applyDelta({start:start,end:end,action:"insert",lines:lines}),this.clonePos(end)},this.remove=function(range){var start=this.clippedPos(range.start.row,range.start.column),end=this.clippedPos(range.end.row,range.end.column);return this.applyDelta({start:start,end:end,action:"remove",lines:this.getLinesForRange({start:start,end:end})}),this.clonePos(start)},this.removeInLine=function(row,startColumn,endColumn){var start=this.clippedPos(row,startColumn),end=this.clippedPos(row,endColumn);return this.applyDelta({start:start,end:end,action:"remove",lines:this.getLinesForRange({start:start,end:end})},!0),this.clonePos(start)},this.removeFullLines=function(firstRow,lastRow){firstRow=Math.min(Math.max(0,firstRow),this.getLength()-1),lastRow=Math.min(Math.max(0,lastRow),this.getLength()-1);var deleteFirstNewLine=lastRow==this.getLength()-1&&firstRow>0,deleteLastNewLine=this.getLength()-1>lastRow,startRow=deleteFirstNewLine?firstRow-1:firstRow,startCol=deleteFirstNewLine?this.getLine(startRow).length:0,endRow=deleteLastNewLine?lastRow+1:lastRow,endCol=deleteLastNewLine?0:this.getLine(endRow).length,range=new Range(startRow,startCol,endRow,endCol),deletedLines=this.$lines.slice(firstRow,lastRow+1);return this.applyDelta({start:range.start,end:range.end,action:"remove",lines:this.getLinesForRange(range)}),deletedLines},this.removeNewLine=function(row){this.getLength()-1>row&&row>=0&&this.applyDelta({start:this.pos(row,this.getLine(row).length),end:this.pos(row+1,0),action:"remove",lines:["",""]})},this.replace=function(range,text){if(range instanceof Range||(range=Range.fromPoints(range.start,range.end)),0===text.length&&range.isEmpty())return range.start;if(text==this.getTextRange(range))return range.end;this.remove(range);var end;return end=text?this.insert(range.start,text):range.start},this.applyDeltas=function(deltas){for(var i=0;deltas.length>i;i++)this.applyDelta(deltas[i])},this.revertDeltas=function(deltas){for(var i=deltas.length-1;i>=0;i--)this.revertDelta(deltas[i])},this.applyDelta=function(delta,doNotValidate){var isInsert="insert"==delta.action;(isInsert?1>=delta.lines.length&&!delta.lines[0]:!Range.comparePoints(delta.start,delta.end))||(isInsert&&delta.lines.length>2e4&&this.$splitAndapplyLargeDelta(delta,2e4),applyDelta(this.$lines,delta,doNotValidate),this._signal("change",delta))},this.$splitAndapplyLargeDelta=function(delta,MAX){for(var lines=delta.lines,l=lines.length,row=delta.start.row,column=delta.start.column,from=0,to=0;;){from=to,to+=MAX-1;var chunk=lines.slice(from,to);if(to>l){delta.lines=chunk,delta.start.row=row+from,delta.start.column=column;break}chunk.push(""),this.applyDelta({start:this.pos(row+from,column),end:this.pos(row+to,column=0),action:delta.action,lines:chunk},!0)}},this.revertDelta=function(delta){this.applyDelta({start:this.clonePos(delta.start),end:this.clonePos(delta.end),action:"insert"==delta.action?"remove":"insert",lines:delta.lines.slice()})},this.indexToPosition=function(index,startRow){for(var lines=this.$lines||this.getAllLines(),newlineLength=this.getNewLineCharacter().length,i=startRow||0,l=lines.length;l>i;i++)if(index-=lines[i].length+newlineLength,0>index)return{row:i,column:index+lines[i].length+newlineLength};return{row:l-1,column:lines[l-1].length}},this.positionToIndex=function(pos,startRow){for(var lines=this.$lines||this.getAllLines(),newlineLength=this.getNewLineCharacter().length,index=0,row=Math.min(pos.row,lines.length),i=startRow||0;row>i;++i)index+=lines[i].length+newlineLength;return index+pos.column}}).call(Document.prototype),exports.Document=Document}),ace.define("ace/lib/lang",["require","exports","module"],function(acequire,exports){"use strict";exports.last=function(a){return a[a.length-1]},exports.stringReverse=function(string){return string.split("").reverse().join("")},exports.stringRepeat=function(string,count){for(var result="";count>0;)1&count&&(result+=string),(count>>=1)&&(string+=string);return result};var trimBeginRegexp=/^\\s\\s*/,trimEndRegexp=/\\s\\s*$/;exports.stringTrimLeft=function(string){return string.replace(trimBeginRegexp,"")},exports.stringTrimRight=function(string){return string.replace(trimEndRegexp,"")},exports.copyObject=function(obj){var copy={};for(var key in obj)copy[key]=obj[key];return copy},exports.copyArray=function(array){for(var copy=[],i=0,l=array.length;l>i;i++)copy[i]=array[i]&&"object"==typeof array[i]?this.copyObject(array[i]):array[i];return copy},exports.deepCopy=function deepCopy(obj){if("object"!=typeof obj||!obj)return obj;var copy;if(Array.isArray(obj)){copy=[];for(var key=0;obj.length>key;key++)copy[key]=deepCopy(obj[key]);return copy}if("[object Object]"!==Object.prototype.toString.call(obj))return obj;copy={};for(var key in obj)copy[key]=deepCopy(obj[key]);return copy},exports.arrayToMap=function(arr){for(var map={},i=0;arr.length>i;i++)map[arr[i]]=1;return map},exports.createMap=function(props){var map=Object.create(null);for(var i in props)map[i]=props[i];return map},exports.arrayRemove=function(array,value){for(var i=0;array.length>=i;i++)value===array[i]&&array.splice(i,1)},exports.escapeRegExp=function(str){return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g,"\\\\$1")},exports.escapeHTML=function(str){return str.replace(/&/g,"&").replace(/"/g,""").replace(/\'/g,"'").replace(/i;i+=2){if(Array.isArray(data[i+1]))var d={action:"insert",start:data[i],lines:data[i+1]};else var d={action:"remove",start:data[i],end:data[i+1]};doc.applyDelta(d,!0)}return _self.$timeout?deferredUpdate.schedule(_self.$timeout):(_self.onUpdate(),void 0)})};(function(){this.$timeout=500,this.setTimeout=function(timeout){this.$timeout=timeout},this.setValue=function(value){this.doc.setValue(value),this.deferredUpdate.schedule(this.$timeout)},this.getValue=function(callbackId){this.sender.callback(this.doc.getValue(),callbackId)},this.onUpdate=function(){},this.isPending=function(){return this.deferredUpdate.isPending()}}).call(Mirror.prototype)}),ace.define("ace/mode/json/json_parse",["require","exports","module"],function(){"use strict";var at,ch,text,value,escapee={\'"\':\'"\',"\\\\":"\\\\","/":"/",b:"\\b",f:"\\f",n:"\\n",r:"\\r",t:"\t"},error=function(m){throw{name:"SyntaxError",message:m,at:at,text:text}},next=function(c){return c&&c!==ch&&error("Expected \'"+c+"\' instead of \'"+ch+"\'"),ch=text.charAt(at),at+=1,ch},number=function(){var number,string="";for("-"===ch&&(string="-",next("-"));ch>="0"&&"9">=ch;)string+=ch,next();if("."===ch)for(string+=".";next()&&ch>="0"&&"9">=ch;)string+=ch;if("e"===ch||"E"===ch)for(string+=ch,next(),("-"===ch||"+"===ch)&&(string+=ch,next());ch>="0"&&"9">=ch;)string+=ch,next();return number=+string,isNaN(number)?(error("Bad number"),void 0):number},string=function(){var hex,i,uffff,string="";if(\'"\'===ch)for(;next();){if(\'"\'===ch)return next(),string;if("\\\\"===ch)if(next(),"u"===ch){for(uffff=0,i=0;4>i&&(hex=parseInt(next(),16),isFinite(hex));i+=1)uffff=16*uffff+hex;string+=String.fromCharCode(uffff)}else{if("string"!=typeof escapee[ch])break;string+=escapee[ch]}else string+=ch}error("Bad string")},white=function(){for(;ch&&" ">=ch;)next()},word=function(){switch(ch){case"t":return next("t"),next("r"),next("u"),next("e"),!0;case"f":return next("f"),next("a"),next("l"),next("s"),next("e"),!1;case"n":return next("n"),next("u"),next("l"),next("l"),null}error("Unexpected \'"+ch+"\'")},array=function(){var array=[];if("["===ch){if(next("["),white(),"]"===ch)return next("]"),array;for(;ch;){if(array.push(value()),white(),"]"===ch)return next("]"),array;next(","),white()}}error("Bad array")},object=function(){var key,object={};if("{"===ch){if(next("{"),white(),"}"===ch)return next("}"),object;for(;ch;){if(key=string(),white(),next(":"),Object.hasOwnProperty.call(object,key)&&error(\'Duplicate key "\'+key+\'"\'),object[key]=value(),white(),"}"===ch)return next("}"),object;next(","),white()}}error("Bad object")};return value=function(){switch(white(),ch){case"{":return object();case"[":return array();case\'"\':return string();case"-":return number();default:return ch>="0"&&"9">=ch?number():word()}},function(source,reviver){var result;return text=source,at=0,ch=" ",result=value(),white(),ch&&error("Syntax error"),"function"==typeof reviver?function walk(holder,key){var k,v,value=holder[key];if(value&&"object"==typeof value)for(k in value)Object.hasOwnProperty.call(value,k)&&(v=walk(value,k),void 0!==v?value[k]=v:delete value[k]);return reviver.call(holder,key,value)}({"":result},""):result}}),ace.define("ace/mode/json_worker",["require","exports","module","ace/lib/oop","ace/worker/mirror","ace/mode/json/json_parse"],function(acequire,exports){"use strict";var oop=acequire("../lib/oop"),Mirror=acequire("../worker/mirror").Mirror,parse=acequire("./json/json_parse"),JsonWorker=exports.JsonWorker=function(sender){Mirror.call(this,sender),this.setTimeout(200)};oop.inherits(JsonWorker,Mirror),function(){this.onUpdate=function(){var value=this.doc.getValue(),errors=[];try{value&&parse(value)}catch(e){var pos=this.doc.indexToPosition(e.at-1);errors.push({row:pos.row,column:pos.column,text:e.message,type:"error"})}this.sender.emit("annotate",errors)}}.call(JsonWorker.prototype)}),ace.define("ace/lib/es5-shim",["require","exports","module"],function(){function Empty(){}function doesDefinePropertyWork(object){try{return Object.defineProperty(object,"sentinel",{}),"sentinel"in object}catch(exception){}}function toInteger(n){return n=+n,n!==n?n=0:0!==n&&n!==1/0&&n!==-(1/0)&&(n=(n>0||-1)*Math.floor(Math.abs(n))),n}Function.prototype.bind||(Function.prototype.bind=function(that){var target=this;if("function"!=typeof target)throw new TypeError("Function.prototype.bind called on incompatible "+target);var args=slice.call(arguments,1),bound=function(){if(this instanceof bound){var result=target.apply(this,args.concat(slice.call(arguments)));return Object(result)===result?result:this}return target.apply(that,args.concat(slice.call(arguments)))};return target.prototype&&(Empty.prototype=target.prototype,bound.prototype=new Empty,Empty.prototype=null),bound});var defineGetter,defineSetter,lookupGetter,lookupSetter,supportsAccessors,call=Function.prototype.call,prototypeOfArray=Array.prototype,prototypeOfObject=Object.prototype,slice=prototypeOfArray.slice,_toString=call.bind(prototypeOfObject.toString),owns=call.bind(prototypeOfObject.hasOwnProperty);if((supportsAccessors=owns(prototypeOfObject,"__defineGetter__"))&&(defineGetter=call.bind(prototypeOfObject.__defineGetter__),defineSetter=call.bind(prototypeOfObject.__defineSetter__),lookupGetter=call.bind(prototypeOfObject.__lookupGetter__),lookupSetter=call.bind(prototypeOfObject.__lookupSetter__)),2!=[1,2].splice(0).length)if(function(){function makeArray(l){var a=Array(l+2);return a[0]=a[1]=0,a}var lengthBefore,array=[];return array.splice.apply(array,makeArray(20)),array.splice.apply(array,makeArray(26)),lengthBefore=array.length,array.splice(5,0,"XXX"),lengthBefore+1==array.length,lengthBefore+1==array.length?!0:void 0\n}()){var array_splice=Array.prototype.splice;Array.prototype.splice=function(start,deleteCount){return arguments.length?array_splice.apply(this,[void 0===start?0:start,void 0===deleteCount?this.length-start:deleteCount].concat(slice.call(arguments,2))):[]}}else Array.prototype.splice=function(pos,removeCount){var length=this.length;pos>0?pos>length&&(pos=length):void 0==pos?pos=0:0>pos&&(pos=Math.max(length+pos,0)),length>pos+removeCount||(removeCount=length-pos);var removed=this.slice(pos,pos+removeCount),insert=slice.call(arguments,2),add=insert.length;if(pos===length)add&&this.push.apply(this,insert);else{var remove=Math.min(removeCount,length-pos),tailOldPos=pos+remove,tailNewPos=tailOldPos+add-remove,tailCount=length-tailOldPos,lengthAfterRemove=length-remove;if(tailOldPos>tailNewPos)for(var i=0;tailCount>i;++i)this[tailNewPos+i]=this[tailOldPos+i];else if(tailNewPos>tailOldPos)for(i=tailCount;i--;)this[tailNewPos+i]=this[tailOldPos+i];if(add&&pos===lengthAfterRemove)this.length=lengthAfterRemove,this.push.apply(this,insert);else for(this.length=lengthAfterRemove+add,i=0;add>i;++i)this[pos+i]=insert[i]}return removed};Array.isArray||(Array.isArray=function(obj){return"[object Array]"==_toString(obj)});var boxedString=Object("a"),splitString="a"!=boxedString[0]||!(0 in boxedString);if(Array.prototype.forEach||(Array.prototype.forEach=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,thisp=arguments[1],i=-1,length=self.length>>>0;if("[object Function]"!=_toString(fun))throw new TypeError;for(;length>++i;)i in self&&fun.call(thisp,self[i],i,object)}),Array.prototype.map||(Array.prototype.map=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0,result=Array(length),thisp=arguments[1];if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");for(var i=0;length>i;i++)i in self&&(result[i]=fun.call(thisp,self[i],i,object));return result}),Array.prototype.filter||(Array.prototype.filter=function(fun){var value,object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0,result=[],thisp=arguments[1];if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");for(var i=0;length>i;i++)i in self&&(value=self[i],fun.call(thisp,value,i,object)&&result.push(value));return result}),Array.prototype.every||(Array.prototype.every=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0,thisp=arguments[1];if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");for(var i=0;length>i;i++)if(i in self&&!fun.call(thisp,self[i],i,object))return!1;return!0}),Array.prototype.some||(Array.prototype.some=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0,thisp=arguments[1];if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");for(var i=0;length>i;i++)if(i in self&&fun.call(thisp,self[i],i,object))return!0;return!1}),Array.prototype.reduce||(Array.prototype.reduce=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0;if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");if(!length&&1==arguments.length)throw new TypeError("reduce of empty array with no initial value");var result,i=0;if(arguments.length>=2)result=arguments[1];else for(;;){if(i in self){result=self[i++];break}if(++i>=length)throw new TypeError("reduce of empty array with no initial value")}for(;length>i;i++)i in self&&(result=fun.call(void 0,result,self[i],i,object));return result}),Array.prototype.reduceRight||(Array.prototype.reduceRight=function(fun){var object=toObject(this),self=splitString&&"[object String]"==_toString(this)?this.split(""):object,length=self.length>>>0;if("[object Function]"!=_toString(fun))throw new TypeError(fun+" is not a function");if(!length&&1==arguments.length)throw new TypeError("reduceRight of empty array with no initial value");var result,i=length-1;if(arguments.length>=2)result=arguments[1];else for(;;){if(i in self){result=self[i--];break}if(0>--i)throw new TypeError("reduceRight of empty array with no initial value")}do i in this&&(result=fun.call(void 0,result,self[i],i,object));while(i--);return result}),Array.prototype.indexOf&&-1==[0,1].indexOf(1,2)||(Array.prototype.indexOf=function(sought){var self=splitString&&"[object String]"==_toString(this)?this.split(""):toObject(this),length=self.length>>>0;if(!length)return-1;var i=0;for(arguments.length>1&&(i=toInteger(arguments[1])),i=i>=0?i:Math.max(0,length+i);length>i;i++)if(i in self&&self[i]===sought)return i;return-1}),Array.prototype.lastIndexOf&&-1==[0,1].lastIndexOf(0,-3)||(Array.prototype.lastIndexOf=function(sought){var self=splitString&&"[object String]"==_toString(this)?this.split(""):toObject(this),length=self.length>>>0;if(!length)return-1;var i=length-1;for(arguments.length>1&&(i=Math.min(i,toInteger(arguments[1]))),i=i>=0?i:length-Math.abs(i);i>=0;i--)if(i in self&&sought===self[i])return i;return-1}),Object.getPrototypeOf||(Object.getPrototypeOf=function(object){return object.__proto__||(object.constructor?object.constructor.prototype:prototypeOfObject)}),!Object.getOwnPropertyDescriptor){var ERR_NON_OBJECT="Object.getOwnPropertyDescriptor called on a non-object: ";Object.getOwnPropertyDescriptor=function(object,property){if("object"!=typeof object&&"function"!=typeof object||null===object)throw new TypeError(ERR_NON_OBJECT+object);if(owns(object,property)){var descriptor,getter,setter;if(descriptor={enumerable:!0,configurable:!0},supportsAccessors){var prototype=object.__proto__;object.__proto__=prototypeOfObject;var getter=lookupGetter(object,property),setter=lookupSetter(object,property);if(object.__proto__=prototype,getter||setter)return getter&&(descriptor.get=getter),setter&&(descriptor.set=setter),descriptor}return descriptor.value=object[property],descriptor}}}if(Object.getOwnPropertyNames||(Object.getOwnPropertyNames=function(object){return Object.keys(object)}),!Object.create){var createEmpty;createEmpty=null===Object.prototype.__proto__?function(){return{__proto__:null}}:function(){var empty={};for(var i in empty)empty[i]=null;return empty.constructor=empty.hasOwnProperty=empty.propertyIsEnumerable=empty.isPrototypeOf=empty.toLocaleString=empty.toString=empty.valueOf=empty.__proto__=null,empty},Object.create=function(prototype,properties){var object;if(null===prototype)object=createEmpty();else{if("object"!=typeof prototype)throw new TypeError("typeof prototype["+typeof prototype+"] != \'object\'");var Type=function(){};Type.prototype=prototype,object=new Type,object.__proto__=prototype}return void 0!==properties&&Object.defineProperties(object,properties),object}}if(Object.defineProperty){var definePropertyWorksOnObject=doesDefinePropertyWork({}),definePropertyWorksOnDom="undefined"==typeof document||doesDefinePropertyWork(document.createElement("div"));if(!definePropertyWorksOnObject||!definePropertyWorksOnDom)var definePropertyFallback=Object.defineProperty}if(!Object.defineProperty||definePropertyFallback){var ERR_NON_OBJECT_DESCRIPTOR="Property description must be an object: ",ERR_NON_OBJECT_TARGET="Object.defineProperty called on non-object: ",ERR_ACCESSORS_NOT_SUPPORTED="getters & setters can not be defined on this javascript engine";Object.defineProperty=function(object,property,descriptor){if("object"!=typeof object&&"function"!=typeof object||null===object)throw new TypeError(ERR_NON_OBJECT_TARGET+object);if("object"!=typeof descriptor&&"function"!=typeof descriptor||null===descriptor)throw new TypeError(ERR_NON_OBJECT_DESCRIPTOR+descriptor);if(definePropertyFallback)try{return definePropertyFallback.call(Object,object,property,descriptor)}catch(exception){}if(owns(descriptor,"value"))if(supportsAccessors&&(lookupGetter(object,property)||lookupSetter(object,property))){var prototype=object.__proto__;object.__proto__=prototypeOfObject,delete object[property],object[property]=descriptor.value,object.__proto__=prototype}else object[property]=descriptor.value;else{if(!supportsAccessors)throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);owns(descriptor,"get")&&defineGetter(object,property,descriptor.get),owns(descriptor,"set")&&defineSetter(object,property,descriptor.set)}return object}}Object.defineProperties||(Object.defineProperties=function(object,properties){for(var property in properties)owns(properties,property)&&Object.defineProperty(object,property,properties[property]);return object}),Object.seal||(Object.seal=function(object){return object}),Object.freeze||(Object.freeze=function(object){return object});try{Object.freeze(function(){})}catch(exception){Object.freeze=function(freezeObject){return function(object){return"function"==typeof object?object:freezeObject(object)}}(Object.freeze)}if(Object.preventExtensions||(Object.preventExtensions=function(object){return object}),Object.isSealed||(Object.isSealed=function(){return!1}),Object.isFrozen||(Object.isFrozen=function(){return!1}),Object.isExtensible||(Object.isExtensible=function(object){if(Object(object)===object)throw new TypeError;for(var name="";owns(object,name);)name+="?";object[name]=!0;var returnValue=owns(object,name);return delete object[name],returnValue}),!Object.keys){var hasDontEnumBug=!0,dontEnums=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],dontEnumsLength=dontEnums.length;for(var key in{toString:null})hasDontEnumBug=!1;Object.keys=function(object){if("object"!=typeof object&&"function"!=typeof object||null===object)throw new TypeError("Object.keys called on a non-object");var keys=[];for(var name in object)owns(object,name)&&keys.push(name);if(hasDontEnumBug)for(var i=0,ii=dontEnumsLength;ii>i;i++){var dontEnum=dontEnums[i];owns(object,dontEnum)&&keys.push(dontEnum)}return keys}}Date.now||(Date.now=function(){return(new Date).getTime()});var ws="\t\\n\v\\f\\r   ᠎ â€â€‚         âŸã€€\\u2028\\u2029\ufeff";if(!String.prototype.trim||ws.trim()){ws="["+ws+"]";var trimBeginRegexp=RegExp("^"+ws+ws+"*"),trimEndRegexp=RegExp(ws+ws+"*$");String.prototype.trim=function(){return(this+"").replace(trimBeginRegexp,"").replace(trimEndRegexp,"")}}var toObject=function(o){if(null==o)throw new TypeError("can\'t convert "+o+" to object");return Object(o)}});'},function(e,t){ace.define("ace/ext/searchbox",["require","exports","module","ace/lib/dom","ace/lib/lang","ace/lib/event","ace/keyboard/hash_handler","ace/lib/keys"],function(e,t,i){"use strict";var n=e("../lib/dom"),r=e("../lib/lang"),o=e("../lib/event"),s=e("../keyboard/hash_handler").HashHandler,a=e("../lib/keys");n.importCssString('\t.ace_search {\tbackground-color: #ddd;\tcolor: #666;\tborder: 1px solid #cbcbcb;\tborder-top: 0 none;\toverflow: hidden;\tmargin: 0;\tpadding: 4px 6px 0 4px;\tposition: absolute;\ttop: 0;\tz-index: 99;\twhite-space: normal;\t}\t.ace_search.left {\tborder-left: 0 none;\tborder-radius: 0px 0px 5px 0px;\tleft: 0;\t}\t.ace_search.right {\tborder-radius: 0px 0px 0px 5px;\tborder-right: 0 none;\tright: 0;\t}\t.ace_search_form, .ace_replace_form {\tmargin: 0 20px 4px 0;\toverflow: hidden;\tline-height: 1.9;\t}\t.ace_replace_form {\tmargin-right: 0;\t}\t.ace_search_form.ace_nomatch {\toutline: 1px solid red;\t}\t.ace_search_field {\tborder-radius: 3px 0 0 3px;\tbackground-color: white;\tcolor: black;\tborder: 1px solid #cbcbcb;\tborder-right: 0 none;\tbox-sizing: border-box!important;\toutline: 0;\tpadding: 0;\tfont-size: inherit;\tmargin: 0;\tline-height: inherit;\tpadding: 0 6px;\tmin-width: 17em;\tvertical-align: top;\t}\t.ace_searchbtn {\tborder: 1px solid #cbcbcb;\tline-height: inherit;\tdisplay: inline-block;\tpadding: 0 6px;\tbackground: #fff;\tborder-right: 0 none;\tborder-left: 1px solid #dcdcdc;\tcursor: pointer;\tmargin: 0;\tposition: relative;\tbox-sizing: content-box!important;\tcolor: #666;\t}\t.ace_searchbtn:last-child {\tborder-radius: 0 3px 3px 0;\tborder-right: 1px solid #cbcbcb;\t}\t.ace_searchbtn:disabled {\tbackground: none;\tcursor: default;\t}\t.ace_searchbtn:hover {\tbackground-color: #eef1f6;\t}\t.ace_searchbtn.prev, .ace_searchbtn.next {\tpadding: 0px 0.7em\t}\t.ace_searchbtn.prev:after, .ace_searchbtn.next:after {\tcontent: "";\tborder: solid 2px #888;\twidth: 0.5em;\theight: 0.5em;\tborder-width: 2px 0 0 2px;\tdisplay:inline-block;\ttransform: rotate(-45deg);\t}\t.ace_searchbtn.next:after {\tborder-width: 0 2px 2px 0 ;\t}\t.ace_searchbtn_close {\tbackground: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAcCAYAAABRVo5BAAAAZ0lEQVR42u2SUQrAMAhDvazn8OjZBilCkYVVxiis8H4CT0VrAJb4WHT3C5xU2a2IQZXJjiQIRMdkEoJ5Q2yMqpfDIo+XY4k6h+YXOyKqTIj5REaxloNAd0xiKmAtsTHqW8sR2W5f7gCu5nWFUpVjZwAAAABJRU5ErkJggg==) no-repeat 50% 0;\tborder-radius: 50%;\tborder: 0 none;\tcolor: #656565;\tcursor: pointer;\tfont: 16px/16px Arial;\tpadding: 0;\theight: 14px;\twidth: 14px;\ttop: 9px;\tright: 7px;\tposition: absolute;\t}\t.ace_searchbtn_close:hover {\tbackground-color: #656565;\tbackground-position: 50% 100%;\tcolor: white;\t}\t.ace_button {\tmargin-left: 2px;\tcursor: pointer;\t-webkit-user-select: none;\t-moz-user-select: none;\t-o-user-select: none;\t-ms-user-select: none;\tuser-select: none;\toverflow: hidden;\topacity: 0.7;\tborder: 1px solid rgba(100,100,100,0.23);\tpadding: 1px;\tbox-sizing: border-box!important;\tcolor: black;\t}\t.ace_button:hover {\tbackground-color: #eee;\topacity:1;\t}\t.ace_button:active {\tbackground-color: #ddd;\t}\t.ace_button.checked {\tborder-color: #3399ff;\topacity:1;\t}\t.ace_search_options{\tmargin-bottom: 3px;\ttext-align: right;\t-webkit-user-select: none;\t-moz-user-select: none;\t-o-user-select: none;\t-ms-user-select: none;\tuser-select: none;\tclear: both;\t}\t.ace_search_counter {\tfloat: left;\tfont-family: arial;\tpadding: 0 8px;\t}',"ace_searchbox");var l=''.replace(/> +/g,">"),c=function(e,t,i){var r=n.createElement("div");r.innerHTML=l,this.element=r.firstChild,this.setSession=this.setSession.bind(this),this.$init(),this.setEditor(e)};(function(){this.setEditor=function(e){e.searchBox=this,e.renderer.scroller.appendChild(this.element),this.editor=e},this.setSession=function(e){this.searchRange=null,this.$syncOptions(!0)},this.$initElements=function(e){this.searchBox=e.querySelector(".ace_search_form"),this.replaceBox=e.querySelector(".ace_replace_form"),this.searchOption=e.querySelector("[action=searchInSelection]"),this.replaceOption=e.querySelector("[action=toggleReplace]"),this.regExpOption=e.querySelector("[action=toggleRegexpMode]"),this.caseSensitiveOption=e.querySelector("[action=toggleCaseSensitive]"),this.wholeWordOption=e.querySelector("[action=toggleWholeWords]"),this.searchInput=this.searchBox.querySelector(".ace_search_field"),this.replaceInput=this.replaceBox.querySelector(".ace_search_field"),this.searchCounter=e.querySelector(".ace_search_counter")},this.$init=function(){var e=this.element;this.$initElements(e);var t=this;o.addListener(e,"mousedown",function(e){setTimeout(function(){t.activeInput.focus()},0),o.stopPropagation(e)}),o.addListener(e,"click",function(e){var i=e.target||e.srcElement,n=i.getAttribute("action");n&&t[n]?t[n]():t.$searchBarKb.commands[n]&&t.$searchBarKb.commands[n].exec(t),o.stopPropagation(e)}),o.addCommandKeyListener(e,function(e,i,n){var r=a.keyCodeToString(n),s=t.$searchBarKb.findKeyCommand(i,r);s&&s.exec&&(s.exec(t),o.stopEvent(e))}),this.$onChange=r.delayedCall(function(){t.find(!1,!1)}),o.addListener(this.searchInput,"input",function(){t.$onChange.schedule(20)}),o.addListener(this.searchInput,"focus",function(){t.activeInput=t.searchInput,t.searchInput.value&&t.highlight()}),o.addListener(this.replaceInput,"focus",function(){t.activeInput=t.replaceInput,t.searchInput.value&&t.highlight()})},this.$closeSearchBarKb=new s([{bindKey:"Esc",name:"closeSearchBar",exec:function(e){e.searchBox.hide()}}]),this.$searchBarKb=new s,this.$searchBarKb.bindKeys({"Ctrl-f|Command-f":function(e){var t=e.isReplace=!e.isReplace;e.replaceBox.style.display=t?"":"none",e.replaceOption.checked=!1,e.$syncOptions(),e.searchInput.focus()},"Ctrl-H|Command-Option-F":function(e){e.replaceOption.checked=!0,e.$syncOptions(),e.replaceInput.focus()},"Ctrl-G|Command-G":function(e){e.findNext()},"Ctrl-Shift-G|Command-Shift-G":function(e){e.findPrev()},esc:function(e){setTimeout(function(){e.hide()})},Return:function(e){e.activeInput==e.replaceInput&&e.replace(),e.findNext()},"Shift-Return":function(e){e.activeInput==e.replaceInput&&e.replace(),e.findPrev()},"Alt-Return":function(e){e.activeInput==e.replaceInput&&e.replaceAll(),e.findAll()},Tab:function(e){(e.activeInput==e.replaceInput?e.searchInput:e.replaceInput).focus()}}),this.$searchBarKb.addCommands([{name:"toggleRegexpMode",bindKey:{win:"Alt-R|Alt-/",mac:"Ctrl-Alt-R|Ctrl-Alt-/"},exec:function(e){e.regExpOption.checked=!e.regExpOption.checked,e.$syncOptions()}},{name:"toggleCaseSensitive",bindKey:{win:"Alt-C|Alt-I",mac:"Ctrl-Alt-R|Ctrl-Alt-I"},exec:function(e){e.caseSensitiveOption.checked=!e.caseSensitiveOption.checked,e.$syncOptions()}},{name:"toggleWholeWords",bindKey:{win:"Alt-B|Alt-W",mac:"Ctrl-Alt-B|Ctrl-Alt-W"},exec:function(e){e.wholeWordOption.checked=!e.wholeWordOption.checked,e.$syncOptions()}},{name:"toggleReplace",exec:function(e){e.replaceOption.checked=!e.replaceOption.checked,e.$syncOptions()}},{name:"searchInSelection",exec:function(e){e.searchOption.checked=!e.searchRange,e.setSearchRange(e.searchOption.checked&&e.editor.getSelectionRange()),e.$syncOptions()}}]),this.setSearchRange=function(e){this.searchRange=e,e?this.searchRangeMarker=this.editor.session.addMarker(e,"ace_active-line"):this.searchRangeMarker&&(this.editor.session.removeMarker(this.searchRangeMarker),this.searchRangeMarker=null)},this.$syncOptions=function(e){n.setCssClass(this.replaceOption,"checked",this.searchRange),n.setCssClass(this.searchOption,"checked",this.searchOption.checked),this.replaceOption.textContent=this.replaceOption.checked?"-":"+",n.setCssClass(this.regExpOption,"checked",this.regExpOption.checked),n.setCssClass(this.wholeWordOption,"checked",this.wholeWordOption.checked),n.setCssClass(this.caseSensitiveOption,"checked",this.caseSensitiveOption.checked),this.replaceBox.style.display=this.replaceOption.checked?"":"none",this.find(!1,!1,e)},this.highlight=function(e){this.editor.session.highlight(e||this.editor.$search.$options.re),this.editor.renderer.updateBackMarkers()},this.find=function(e,t,i){var r=this.editor.find(this.searchInput.value,{skipCurrent:e,backwards:t,wrap:!0,regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked,preventScroll:i,range:this.searchRange}),o=!r&&this.searchInput.value;n.setCssClass(this.searchBox,"ace_nomatch",o),this.editor._emit("findSearchBox",{match:!o}),this.highlight(),this.updateCounter()},this.updateCounter=function(){var e=this.editor,t=e.$search.$options.re,i=0,n=0;if(t){var r=this.searchRange?e.session.getTextRange(this.searchRange):e.getValue(),o=e.session.doc.positionToIndex(e.selection.anchor);this.searchRange&&(o-=e.session.doc.positionToIndex(this.searchRange.start));for(var s,a=t.lastIndex=0;(s=t.exec(r))&&(i++,a=s.index,a<=o&&n++,!(i>999))&&(s[0]||(t.lastIndex=a+=1,!(a>=r.length))););}this.searchCounter.textContent=n+" of "+(i>999?"999+":i)},this.findNext=function(){this.find(!0,!1)},this.findPrev=function(){this.find(!0,!0)},this.findAll=function(){var e=this.editor.findAll(this.searchInput.value,{regExp:this.regExpOption.checked,caseSensitive:this.caseSensitiveOption.checked,wholeWord:this.wholeWordOption.checked}),t=!e&&this.searchInput.value;n.setCssClass(this.searchBox,"ace_nomatch",t),this.editor._emit("findSearchBox",{match:!t}),this.highlight(),this.hide()},this.replace=function(){this.editor.getReadOnly()||this.editor.replace(this.replaceInput.value)},this.replaceAndFindNext=function(){this.editor.getReadOnly()||(this.editor.replace(this.replaceInput.value),this.findNext())},this.replaceAll=function(){this.editor.getReadOnly()||this.editor.replaceAll(this.replaceInput.value)},this.hide=function(){this.active=!1,this.setSearchRange(null),this.editor.off("changeSession",this.setSession),this.element.style.display="none",this.editor.keyBinding.removeKeyboardHandler(this.$closeSearchBarKb),this.editor.focus()},this.show=function(e,t){this.active=!0,this.editor.on("changeSession",this.setSession),this.element.style.display="",this.replaceOption.checked=t,e&&(this.searchInput.value=e),this.searchInput.focus(),this.searchInput.select(),this.editor.keyBinding.addKeyboardHandler(this.$closeSearchBarKb),this.$syncOptions(!0)},this.isFocused=function(){var e=document.activeElement;return e==this.searchInput||e==this.replaceInput}}).call(c.prototype),t.SearchBox=c,t.Search=function(e,t){(e.searchBox||new c(e)).show(e.session.getTextRange(),t)}}),function(){ace.acequire(["ace/ext/searchbox"],function(){})}()},function(e,t,i){var n;if(window.Picker)n=window.Picker;else try{n=i(58)}catch(e){}e.exports=n},function(e,t,i){!function(t,i){e.exports=i()}(0,function(){"use strict";function e(e){function t(e,t,i,n){function r(e,t,i){return Math.max(t,Math.min(e,i))}var o=e.clientX,s=e.clientY;if(t){var a=t.getBoundingClientRect();if(o-=a.left,s-=a.top,i&&(o-=i[0],s-=i[1]),n&&(o=r(o,0,a.width),s=r(s,0,a.height)),t!==p){(null!==A?A:"circle"===t.nodeName||"ellipse"===t.nodeName)&&(o-=a.width/2,s-=a.height/2)}}return b?[Math.round(o),Math.round(s)]:[o,s]}function i(e){e.preventDefault(),w||e.stopPropagation()}function n(e){var n=void 0;if(n=f?f instanceof Element?f.contains(e.target)?f:null:e.target.closest(f):{}){i(e);var r=f&&E?t(e,n):[0,0],o=t(e,p,r);F={target:n,mouseOffset:r,startPos:o,actuallyDragged:!1},g&&g(n,o)}}function r(e){if(F){i(e);var n=F.startPos,r=t(e,p,F.mouseOffset,!C);F.actuallyDragged=F.actuallyDragged||n[0]!==r[0]||n[1]!==r[1],m(F.target,r,n)}}function o(e,i){if(F){if(v||y){var n=!F.actuallyDragged,r=n?F.startPos:t(e,p,F.mouseOffset,!C);y&&n&&!i&&y(F.target,r),v&&v(F.target,r,F.startPos,i||n&&y)}F=null}}function s(e,t){o(d(e),t)}function a(e,t,i){e.addEventListener(t,i)}function l(e){return void 0!==e.buttons?1===e.buttons:1===e.which}function h(e,t){if(1!==e.touches.length)return void o(e,!0);t(d(e))}function d(e){var t=e.targetTouches[0];return t||(t=e.changedTouches[0]),t.preventDefault=e.preventDefault.bind(e),t.stopPropagation=e.stopPropagation.bind(e),t}var u=Element.prototype;u.matches||(u.matches=u.msMatchesSelector||u.webkitMatchesSelector),u.closest||(u.closest=function(e){var t=this;do{if(t.matches(e))return t;t="svg"===t.tagName?t.parentNode:t.parentElement}while(t);return null}),e=e||{};var p=e.container||document.documentElement,f=e.selector,m=e.callback||console.log,g=e.callbackDragStart,v=e.callbackDragEnd,y=e.callbackClick,w=e.propagateEvents,b=!1!==e.roundCoords,C=!1!==e.dragOutside,E=e.handleOffset||!1!==e.handleOffset,A=null;switch(E){case"center":A=!0;break;case"topleft":case"top-left":A=!1}var F=void 0;a(p,"mousedown",function(e){l(e)?n(e):o(e,!0)}),a(p,"touchstart",function(e){return h(e,n)}),a(c,"mousemove",function(e){F&&(l(e)?r(e):o(e))}),a(c,"touchmove",function(e){return h(e,r)}),a(p,"mouseup",function(e){F&&!l(e)&&o(e)}),a(p,"touchend",function(e){return s(e)}),a(p,"touchcancel",function(e){return s(e,!0)})}function t(e){var t=document.createElement("div");return t.innerHTML=e,t.firstElementChild}function i(e,t,i){e.addEventListener(t,i,!1)}var n=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},r=function(){function e(e,t){for(var i=0;i.5?u/(2-a-l):u/(a+l),a){case i:c=(n-r)/u+(n1&&(i-=1),i<1/6?e+6*(t-e)*i:i<.5?t:i<2/3?e+(t-e)*(2/3-i)*6:e},d=r<.5?r*(1+n):r+n-r*n,u=2*r-d;a=h(u,d,i+1/3),l=h(u,d,i),c=h(u,d,i-1/3)}var p=[255*a,255*l,255*c].map(Math.round);return p[3]=s,p}}]),e}(),c=window ;return document.documentElement.firstElementChild.appendChild(document.createElement("style")).textContent=".picker_wrapper.no_alpha .picker_alpha,.picker_wrapper.no_editor .picker_editor{display:none}.layout_default.picker_wrapper{display:flex;flex-flow:row wrap;justify-content:space-between;align-items:stretch;font-size:10px;width:25em;padding:.5em}.layout_default.picker_wrapper input,.layout_default.picker_wrapper button{font-size:1rem}.layout_default.picker_wrapper>*{margin:.5em}.layout_default.picker_wrapper::before{content:'';display:block;width:100%;height:0;order:1}.layout_default .picker_slider,.layout_default .picker_selector{padding:1em}.layout_default .picker_hue{width:100%}.layout_default .picker_sl{flex:1 1 auto}.layout_default .picker_sl::before{content:'';display:block;padding-bottom:100%}.layout_default .picker_editor{order:1;width:6rem}.layout_default .picker_editor input{width:calc(100% + 2px);height:calc(100% + 2px)}.layout_default .picker_sample{order:1;flex:1 1 auto}.layout_default .picker_done{order:1}.picker_wrapper{box-sizing:border-box;background:#f2f2f2;cursor:default;font-family:sans-serif;pointer-events:auto}.picker_wrapper button,.picker_wrapper input{margin:-1px}.picker_selector{position:absolute;z-index:1;display:block;transform:translate(-50%, -50%);border:2px solid white;border-radius:100%;box-shadow:0 0 3px 1px #67b9ff;background:currentColor;cursor:pointer}.picker_slider .picker_selector{border-radius:2px}.picker_hue{position:relative;background-image:linear-gradient(90deg, red, yellow, lime, cyan, blue, magenta, red);box-shadow:0 0 0 1px silver}.picker_sl{position:relative;box-shadow:0 0 0 1px silver;background-image:linear-gradient(180deg, white, rgba(255,255,255,0) 50%),linear-gradient(0deg, black, rgba(0,0,0,0) 50%),linear-gradient(90deg, gray, rgba(128,128,128,0))}.picker_alpha,.picker_sample{position:relative;background:url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2' height='2'%3E%3Cpath d='M1,0H0V1H2V2H1' fill='lightgrey'/%3E%3C/svg%3E\") left top/contain white;box-shadow:0 0 0 1px silver}.picker_alpha .picker_selector,.picker_sample .picker_selector{background:none}.picker_editor input{box-sizing:border-box;font-family:monospace;padding:.1em .2em}.picker_sample::before{content:'';position:absolute;display:block;width:100%;height:100%;background:currentColor}.picker_done button{box-sizing:border-box;padding:.2em .5em;cursor:pointer}.picker_arrow{position:absolute;z-index:-1}.picker_wrapper.popup{position:absolute;z-index:2;margin:1.5em}.picker_wrapper.popup,.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{background:#f2f2f2;box-shadow:0 0 10px 1px rgba(0,0,0,0.4)}.picker_wrapper.popup .picker_arrow{width:3em;height:3em;margin:0}.picker_wrapper.popup .picker_arrow::before,.picker_wrapper.popup .picker_arrow::after{content:\"\";display:block;position:absolute;top:0;left:0;z-index:-99}.picker_wrapper.popup .picker_arrow::before{width:100%;height:100%;transform:skew(45deg);transform-origin:0 100%}.picker_wrapper.popup .picker_arrow::after{width:150%;height:150%;box-shadow:none}.popup.popup_top{bottom:100%;left:0}.popup.popup_top .picker_arrow{bottom:0;left:0;transform:rotate(-90deg)}.popup.popup_bottom{top:100%;left:0}.popup.popup_bottom .picker_arrow{top:0;left:0;transform:rotate(90deg) scale(1, -1)}.popup.popup_left{top:0;right:100%}.popup.popup_left .picker_arrow{top:0;right:0;transform:scale(-1, 1)}.popup.popup_right{top:0;left:100%}.popup.popup_right .picker_arrow{top:0;left:0}",function(){function o(e){var t=this;n(this,o),this.settings={popup:"right",layout:"default",alpha:!0,editor:!0},this._openProxy=function(e){return t.openHandler(e)},this.onChange=null,this.onDone=null,this.onOpen=null,this.onClose=null,this.setOptions(e)}return r(o,[{key:"setOptions",value:function(e){if(e){var t=this.settings;e instanceof HTMLElement?t.parent=e:(t.parent&&e.parent&&t.parent!==e.parent&&(t.parent.removeEventListener("click",this._openProxy,!1),this._popupInited=!1),function(e,t,i){for(var n in e)i&&i.indexOf(n)>=0||(t[n]=e[n])}(e,t)),e.onChange&&(this.onChange=e.onChange),e.onDone&&(this.onDone=e.onDone),e.onOpen&&(this.onOpen=e.onOpen),e.onClose&&(this.onClose=e.onClose);var n=e.color||e.colour;n&&this._setColor(n),t.parent&&t.popup&&!this._popupInited?(i(t.parent,"click",this._openProxy),this._popupInited=!0):e.parent&&!t.popup&&this.show()}}},{key:"openHandler",value:function(e){this.show()&&(this.settings.parent.style.pointerEvents="none",this.onOpen&&this.onOpen(this.colour))}},{key:"closeHandler",value:function(e){var t=!1;e?"mousedown"===e.type?this.domElement.contains(e.target)||(t=!0):(e.preventDefault(),e.stopPropagation(),t=!0):t=!0,t&&this.hide()&&(this.settings.parent.style.pointerEvents="",this.onClose&&this.onClose(this.colour))}},{key:"movePopup",value:function(e,t){this.closeHandler(),this.setOptions(e),t&&this.openHandler()}},{key:"setColor",value:function(e,t){this._setColor(e,{silent:t})}},{key:"_setColor",value:function(e,t){var i=new l(e);if(!this.settings.alpha){var n=i.hsla;n[3]=1,i.hsla=n}this.colour=this.color=i,this._setHSLA(null,null,null,null,t)}},{key:"setColour",value:function(e,t){this.setColor(e,t)}},{key:"show",value:function(){if(!this.settings.parent)return!1;if(this.domElement){var e=this._toggleDOM(!0);return this._setPosition(),e}var i=this.settings.template||'
      ',n=t(i);return this.domElement=n,this._domH=n.querySelector(".picker_hue"),this._domSL=n.querySelector(".picker_sl"),this._domA=n.querySelector(".picker_alpha"),this._domEdit=n.querySelector(".picker_editor input"),this._domSample=n.querySelector(".picker_sample"),this._domOkay=n.querySelector(".picker_done button"),n.classList.add("layout_"+this.settings.layout),this.settings.alpha||n.classList.add("no_alpha"),this.settings.editor||n.classList.add("no_editor"),this._ifPopup(function(){return n.classList.add("popup")}),this._setPosition(),this.colour?this._updateUI():this._setColor("#0cf"),this._bindEvents(),!0}},{key:"hide",value:function(){return this._toggleDOM(!1)}},{key:"_bindEvents",value:function(){function t(e,t){function i(i,n){var r=n[0]/e.clientWidth,o=n[1]/e.clientHeight;t(r,o)}return{container:e,dragOutside:!1,callback:i,callbackClick:i,callbackDragStart:i,propagateEvents:!0}}var n=this,r=this;e(t(this._domH,function(e,t){return r._setHSLA(e)})),e(t(this._domSL,function(e,t){return r._setHSLA(null,e,1-t)})),this.settings.alpha&&e(t(this._domA,function(e,t){return r._setHSLA(null,null,null,1-t)})),this.settings.editor&&i(this._domEdit,"input",function(e){var t=this.value;try{new l(this.value),r._setColor(t,{fromEditor:!0})}catch(e){}}),i(window,"mousedown",function(e){return n._ifPopup(function(){return n.closeHandler(e)})}),i(this._domOkay,"click",function(e){n._ifPopup(function(){return n.closeHandler(e)}),n.onDone&&n.onDone(n.colour)})}},{key:"_setPosition",value:function(){var e=this.settings.parent,t=this.domElement;e!==t.parentNode&&e.appendChild(t),this._ifPopup(function(i){"static"===getComputedStyle(e).position&&(e.style.position="relative");var n=!0===i?"popup_right":"popup_"+i;["popup_top","popup_bottom","popup_left","popup_right"].forEach(function(e){e===n?t.classList.add(e):t.classList.remove(e)}),t.classList.add(n)})}},{key:"_setHSLA",value:function(e,t,i,n,r){r=r||{};var o=this.colour,s=o.hsla;[e,t,i,n].forEach(function(e,t){(e||0===e)&&(s[t]=e)}),o.hsla=s,this._updateUI(r),this.onChange&&!r.silent&&this.onChange(o)}},{key:"_updateUI",value:function(e){function t(e,t,i){t.style.left=100*i+"%"}function i(e,t,i){t.style.top=100*i+"%"}if(this.domElement){e=e||{};var n=this.colour,r=n.hsla,o="hsl("+360*r[0]+", 100%, 50%)",s=n.hslString,a=n.hslaString,l=this._domH,c=this._domSL,h=this._domA;t(l,l.firstElementChild,r[0]),this._domSL.style.backgroundColor=this._domH.style.color=o,t(c,c.firstElementChild,r[1]),i(c,c.firstElementChild,1-r[2]),c.style.color=s,i(h,h.firstElementChild,1-r[3]);var d=s,u=d.replace("hsl","hsla").replace(")",", 0)"),p="linear-gradient("+[d,u]+")";if(this._domA.style.backgroundImage=p+", url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='2' height='2'%3E%3Cpath d='M1,0H0V1H2V2H1' fill='lightgrey'/%3E%3C/svg%3E\")",!e.fromEditor){var f=n.hex;this._domEdit.value=this.settings.alpha?f:f.substr(0,7)}this._domSample.style.color=a}}},{key:"_ifPopup",value:function(e,t){this.settings.parent&&this.settings.popup?e&&e(this.settings.popup):t&&t()}},{key:"_toggleDOM",value:function(e){var t=this.domElement;if(!t)return!1;var i=e?"":"none",n=t.style.display!==i;return n&&(t.style.display=i),n}}]),o}()})},function(e,t,i){"use strict";var n=i(57),r=i(60),o=i(61),s=i(67),a=i(68),l=i(70),c=i(71),h=i(80),d=i(62),u=i(81),p=i(76),f=i(78),m=i(66).translate,g=i(66).setLanguages,v=i(66).setLanguage,y=document.body,w={};w.create=function(e,t){if(!e)throw new Error("No container element provided.");this.container=e,this.dom={},this.highlighter=new r,this.selection=void 0,this.multiselection={nodes:[]},this.validateSchema=null,this.validationSequence=0,this.errorNodes=[],this.node=null,this.focusTarget=null,this._setOptions(t),t.autocomplete&&(this.autocomplete=new u(t.autocomplete)),this.options.history&&"view"!==this.options.mode&&(this.history=new o(this)),this._createFrame(),this._createTable()},w.destroy=function(){this.frame&&this.container&&this.frame.parentNode==this.container&&(this.container.removeChild(this.frame),this.frame=null),this.container=null,this.dom=null,this.clear(),this.node=null,this.focusTarget=null,this.selection=null,this.multiselection=null,this.errorNodes=null,this.validateSchema=null,this._debouncedValidate=null,this.history&&(this.history.destroy(),this.history=null),this.searchBox&&(this.searchBox.destroy(),this.searchBox=null),this.modeSwitcher&&(this.modeSwitcher.destroy(),this.modeSwitcher=null)},w._setOptions=function(e){if(this.options={search:!0,history:!0,mode:"tree",name:void 0,schema:null,schemaRefs:null,autocomplete:null,navigationBar:!0,mainMenuBar:!0,onSelectionChange:null,colorPicker:!0,onColorPicker:function(e,t,i){n?new n({parent:e,color:t,popup:"bottom",onDone:function(e){var t=e.rgba[3],n=1===t?e.hex.substr(0,7):e.hex;i(n)}}).show():console.warn("Cannot open color picker: the `vanilla-picker` library is not included in the bundle. Either use the full bundle or implement your own color picker using `onColorPicker`.")},timestampTag:!0,onEvent:null,enableSort:!0,enableTransform:!0},e)for(var t in e)e.hasOwnProperty(t)&&(this.options[t]=e[t]);this.setSchema(this.options.schema,this.options.schemaRefs),this._debouncedValidate=d.debounce(this.validate.bind(this),this.DEBOUNCE_INTERVAL),e.onSelectionChange&&this.onSelectionChange(e.onSelectionChange),g(this.options.languages),v(this.options.language)},w.set=function(e){if(e instanceof Function||void 0===e)this.clear();else{this.content.removeChild(this.table);var t={field:this.options.name,value:e},i=new c(this,t);this._setRoot(i),this.validate();this.node.expand(!1),this.content.appendChild(this.table)}this.history&&this.history.clear(),this.searchBox&&this.searchBox.clear()},w.update=function(e){if(!this.node.deepEqual(e)){var t=this.getSelection();if(this.onChangeDisabled=!0,this.node.update(e),this.onChangeDisabled=!1,this.validate(),this.searchBox&&!this.searchBox.isEmpty()&&this.searchBox.forceSearch(),t&&t.start&&t.end){var i=this.node.findNodeByPath(t.start.path),n=this.node.findNodeByPath(t.end.path);i&&n?this.setSelection(t.start,t.end):this.setSelection({},{})}else this.setSelection({},{})}},w.get=function(){return this.node?this.node.getValue():void 0},w.getText=function(){return JSON.stringify(this.get())},w.setText=function(e){try{this.set(d.parse(e))}catch(i){var t=d.sanitize(e);this.set(d.parse(t))}},w.updateText=function(e){try{this.update(d.parse(e))}catch(i){var t=d.sanitize(e);this.update(d.parse(t))}},w.setName=function(e){this.options.name=e,this.node&&this.node.updateField(this.options.name)},w.getName=function(){return this.options.name},w.focus=function(){var e=this.scrollableContent.querySelector("[contenteditable=true]");e?e.focus():this.node.dom.expand?this.node.dom.expand.focus():this.node.dom.menu?this.node.dom.menu.focus():(e=this.frame.querySelector("button"))&&e.focus()},w.clear=function(){this.node&&(this.node.hide(),delete this.node),this.treePath&&this.treePath.reset()},w._setRoot=function(e){this.clear(),this.node=e,this.tbody.appendChild(e.getDom())},w.search=function(e){var t;return this.node?(this.content.removeChild(this.table),t=this.node.search(e),this.content.appendChild(this.table)):t=[],t},w.expandAll=function(){this.node&&(this.content.removeChild(this.table),this.node.expand(),this.content.appendChild(this.table))},w.collapseAll=function(){this.node&&(this.content.removeChild(this.table),this.node.collapse(),this.content.appendChild(this.table))},w._onAction=function(e,t){this.history&&this.history.add(e,t),this._onChange()},w._onChange=function(){if(!this.onChangeDisabled){if(this.selection=this.getDomSelection(),this._debouncedValidate(),this.treePath){var e=this.selection?this.node.findNodeByInternalPath(this.selection.path):this.multiselection?this.multiselection.nodes[0]:void 0;e?this._updateTreePath(e.getNodePath()):this.treePath.reset()}if(this.options.onChange)try{this.options.onChange()}catch(e){console.error("Error in onChange callback: ",e)}if(this.options.onChangeJSON)try{this.options.onChangeJSON(this.get())}catch(e){console.error("Error in onChangeJSON callback: ",e)}if(this.options.onChangeText)try{this.options.onChangeText(this.getText())}catch(e){console.error("Error in onChangeText callback: ",e)}if(this.options.onClassName&&this.node.recursivelyUpdateCssClassesOnNodes(),this.options.onNodeName&&this.node.childs)try{this.node.recursivelyUpdateNodeName()}catch(e){console.error("Error in onNodeName callback: ",e)}}},w.validate=function(){var e=this.node;if(e){var t=e.getValue(),i=[];if(this.validateSchema){this.validateSchema(t)||(i=this.validateSchema.errors.map(function(e){return d.improveSchemaError(e)}).map(function(t){return{node:e.findNode(t.dataPath),error:t}}).filter(function(e){return null!=e.node}))}try{this.validationSequence++;var n=this,r=this.validationSequence;this._validateCustom(t).then(function(e){if(r===n.validationSequence){var t=[].concat(i,e||[]);n._renderValidationErrors(t)}}).catch(function(e){console.error(e)})}catch(e){console.error(e)}}},w._renderValidationErrors=function(e){this.errorNodes&&this.errorNodes.forEach(function(e){e.setError(null)});var t=e.reduce(function(e,t){return t.node.findParents().filter(function(t){return!e.some(function(e){return e[0]===t})}).map(function(e){return[e,t.node]}).concat(e)},[]);this.errorNodes=t.map(function(e){return{node:e[0],child:e[1],error:{message:"object"===e[0].type?"Contains invalid properties":"Contains invalid items"}}}).concat(e).map(function(e){return e.node.setError(e.error,e.child),e.node})},w._validateCustom=function(e){try{if(this.options.onValidate){var t=this.node,i=this.options.onValidate(e);return(d.isPromise(i)?i:Promise.resolve(i)).then(function(e){return Array.isArray(e)?e.filter(function(e){var t=d.isValidValidationError(e);return t||console.warn('Ignoring a custom validation error with invalid structure. Expected structure: {path: [...], message: "..."}. Actual error:',e),t}).map(function(e){var i;try{i=e&&e.path?t.findNodeByPath(e.path):null}catch(e){}return i||console.warn("Ignoring validation error: node not found. Path:",e.path,"Error:",e),{node:i,error:e}}).filter(function(e){return e&&e.node&&e.error&&e.error.message}):null})}}catch(e){return Promise.reject(e)}return Promise.resolve(null)},w.refresh=function(){this.node&&this.node.updateDom({recurse:!0})},w.startAutoScroll=function(e){var t=this,i=this.scrollableContent,n=d.getAbsoluteTop(i),r=i.clientHeight,o=n+r;e0?this.autoScrollStep=(n+24-e)/3:e>o-24&&r+i.scrollTop0?this.multiselection.nodes.map(function(e){return e.getInternalPath()}):null,scrollTop:this.scrollableContent?this.scrollableContent.scrollTop:0}},w.scrollTo=function(e,t){var i=this.scrollableContent;if(i){var n=this;n.animateTimeout&&(clearTimeout(n.animateTimeout),delete n.animateTimeout),n.animateCallback&&(n.animateCallback(!1),delete n.animateCallback);var r=i.clientHeight,o=i.scrollHeight-r,s=Math.min(Math.max(e-r/4,0),o),a=function(){var e=i.scrollTop,r=s-e;Math.abs(r)>3?(i.scrollTop+=r/3,n.animateCallback=t,n.animateTimeout=setTimeout(a,50)):(t&&t(!0),i.scrollTop=s,delete n.animateTimeout,delete n.animateCallback)};a()}else t&&t(!1)},w._createFrame=function(){function e(e){t._onEvent&&t._onEvent(e)}this.frame=document.createElement("div"),this.frame.className="jsoneditor jsoneditor-mode-"+this.options.mode,this.container.appendChild(this.frame),this.contentOuter=document.createElement("div"),this.contentOuter.className="jsoneditor-outer";var t=this;if(this.frame.onclick=function(t){var i=t.target;e(t),"BUTTON"==i.nodeName&&t.preventDefault()},this.frame.oninput=e,this.frame.onchange=e,this.frame.onkeydown=e,this.frame.onkeyup=e,this.frame.oncut=e,this.frame.onpaste=e,this.frame.onmousedown=e,this.frame.onmouseup=e,this.frame.onmouseover=e,this.frame.onmouseout=e,d.addEventListener(this.frame,"focus",e,!0),d.addEventListener(this.frame,"blur",e,!0),this.frame.onfocusin=e,this.frame.onfocusout=e,this.options.mainMenuBar){d.addClassName(this.contentOuter,"has-main-menu-bar"),this.menu=document.createElement("div"),this.menu.className="jsoneditor-menu",this.frame.appendChild(this.menu);var i=document.createElement("button");i.type="button",i.className="jsoneditor-expand-all",i.title=m("expandAll"),i.onclick=function(){t.expandAll()},this.menu.appendChild(i);var n=document.createElement("button");if(n.type="button",n.title=m("collapseAll"),n.className="jsoneditor-collapse-all",n.onclick=function(){t.collapseAll()},this.menu.appendChild(n),this.options.enableSort){var r=document.createElement("button");r.type="button",r.className="jsoneditor-sort",r.title=m("sortTitleShort"),r.onclick=function(){var e=t.options.modalAnchor||y;p(t.node,e)},this.menu.appendChild(r)}if(this.options.enableTransform){var o=document.createElement("button");o.type="button",o.title=m("transformTitleShort"),o.className="jsoneditor-transform",o.onclick=function(){var e=t.options.modalAnchor||y;f(t.node,e)},this.menu.appendChild(o)}if(this.history){var a=document.createElement("button");a.type="button",a.className="jsoneditor-undo jsoneditor-separator",a.title=m("undo"),a.onclick=function(){t._onUndo()},this.menu.appendChild(a),this.dom.undo=a;var c=document.createElement("button");c.type="button",c.className="jsoneditor-redo",c.title=m("redo"),c.onclick=function(){t._onRedo()},this.menu.appendChild(c),this.dom.redo=c,this.history.onChange=function(){a.disabled=!t.history.canUndo(),c.disabled=!t.history.canRedo()},this.history.onChange()}if(this.options&&this.options.modes&&this.options.modes.length){var u=this;this.modeSwitcher=new h(this.menu,this.options.modes,this.options.mode,function(e){u.setMode(e),u.modeSwitcher.focus()})}this.options.search&&(this.searchBox=new s(this,this.menu))}this.options.navigationBar&&(this.navBar=document.createElement("div"),this.navBar.className="jsoneditor-navigation-bar nav-bar-empty",this.frame.appendChild(this.navBar),this.treePath=new l(this.navBar,this.frame),this.treePath.onSectionSelected(this._onTreePathSectionSelected.bind(this)),this.treePath.onContextMenuItemSelected(this._onTreePathMenuItemSelected.bind(this)))},w._onUndo=function(){this.history&&(this.history.undo(),this._onChange())},w._onRedo=function(){this.history&&(this.history.redo(),this._onChange())},w._onEvent=function(e){if(!c.targetIsColorPicker(e.target)){"keydown"===e.type&&this._onKeyDown(e),"focus"===e.type&&(this.focusTarget=e.target),"mousedown"===e.type&&this._startDragDistance(e),"mousemove"!==e.type&&"mouseup"!==e.type&&"click"!==e.type||this._updateDragDistance(e);var t=c.getNodeFromTarget(e.target);if(t&&this.options&&this.options.navigationBar&&t&&("keydown"===e.type||"mousedown"===e.type)){var i=this;setTimeout(function(){i._updateTreePath(t.getNodePath())})}if(t&&t.selected){if("click"===e.type){if(e.target===t.dom.menu)return void this.showContextMenu(e.target);e.hasMoved||this.deselect()}"mousedown"===e.type&&c.onDragStart(this.multiselection.nodes,e)}else"mousedown"===e.type&&d.hasParentNode(e.target,this.content)&&(this.deselect(),t&&e.target===t.dom.drag?c.onDragStart(t,e):(!t||e.target!==t.dom.field&&e.target!==t.dom.value&&e.target!==t.dom.select)&&this._onMultiSelectStart(e));t&&t.onEvent(e)}},w._updateTreePath=function(e){function t(e){return e.parent?"array"===e.parent.type?e.index:e.field:e.type}if(e&&e.length){d.removeClassName(this.navBar,"nav-bar-empty");var i=[];e.forEach(function(e){var n={name:t(e),node:e,children:[]};e.childs&&e.childs.length&&e.childs.forEach(function(e){n.children.push({name:t(e),node:e})}),i.push(n)}),this.treePath.setPath(i)}else d.addClassName(this.navBar,"nav-bar-empty")},w._onTreePathSectionSelected=function(e){e&&e.node&&(e.node.expandTo(),e.node.focus())},w._onTreePathMenuItemSelected=function(e,t){if(e&&e.children.length){var i=e.children.find(function(e){return e.name===t});i&&i.node&&(this._updateTreePath(i.node.getNodePath()),i.node.expandTo(),i.node.focus())}},w._startDragDistance=function(e){this.dragDistanceEvent={initialTarget:e.target,initialPageX:e.pageX,initialPageY:e.pageY,dragDistance:0,hasMoved:!1}},w._updateDragDistance=function(e){this.dragDistanceEvent||this._startDragDistance(e);var t=e.pageX-this.dragDistanceEvent.initialPageX,i=e.pageY-this.dragDistanceEvent.initialPageY;return this.dragDistanceEvent.dragDistance=Math.sqrt(t*t+i*i),this.dragDistanceEvent.hasMoved=this.dragDistanceEvent.hasMoved||this.dragDistanceEvent.dragDistance>10,e.dragDistance=this.dragDistanceEvent.dragDistance,e.hasMoved=this.dragDistanceEvent.hasMoved,e.dragDistance},w._onMultiSelectStart=function(e){var t=c.getNodeFromTarget(e.target);if("tree"===this.options.mode&&void 0===this.options.onEditable){this.multiselection={start:t||null,end:null,nodes:[]},this._startDragDistance(e);var i=this;this.mousemove||(this.mousemove=d.addEventListener(window,"mousemove",function(e){i._onMultiSelect(e)})),this.mouseup||(this.mouseup=d.addEventListener(window,"mouseup",function(e){i._onMultiSelectEnd(e)})),e.preventDefault()}},w._onMultiSelect=function(e){if(e.preventDefault(),this._updateDragDistance(e),e.hasMoved){var t=c.getNodeFromTarget(e.target);t&&(null==this.multiselection.start&&(this.multiselection.start=t),this.multiselection.end=t),this.deselect();var i=this.multiselection.start,n=this.multiselection.end||this.multiselection.start;if(i&&n){if(this.multiselection.nodes=this._findTopLevelNodes(i,n),this.multiselection.nodes&&this.multiselection.nodes.length){var r=this.multiselection.nodes[0];this.multiselection.start===r||this.multiselection.start.isDescendantOf(r)?this.multiselection.direction="down":this.multiselection.direction="up"}this.select(this.multiselection.nodes)}}},w._onMultiSelectEnd=function(){this.multiselection.nodes[0]&&this.multiselection.nodes[0].dom.menu.focus(),this.multiselection.start=null,this.multiselection.end=null,this.mousemove&&(d.removeEventListener(window,"mousemove",this.mousemove),delete this.mousemove),this.mouseup&&(d.removeEventListener(window,"mouseup",this.mouseup),delete this.mouseup)},w.deselect=function(e){var t=!!this.multiselection.nodes.length;this.multiselection.nodes.forEach(function(e){e.setSelected(!1)}),this.multiselection.nodes=[],e&&(this.multiselection.start=null,this.multiselection.end=null),t&&this._selectionChangedHandler&&this._selectionChangedHandler()},w.select=function(e){if(!Array.isArray(e))return this.select([e]);if(e){this.deselect(),this.multiselection.nodes=e.slice(0);var t=e[0];if(e.forEach(function(e){e.expandPathToNode(),e.setSelected(!0,e===t)}),this._selectionChangedHandler){var i=this.getSelection();this._selectionChangedHandler(i.start,i.end)}}},w._findTopLevelNodes=function(e,t){for(var i=e.getNodePath(),n=t.getNodePath(),r=0;r=0&&(l="value"),e.target.className.indexOf("jsoneditor-field")>=0&&(l="field");var h=c.getNodeFromTarget(e.target);setTimeout(function(e,t){if(t.innerText.length>0){var i=this.options.autocomplete.getOptions(t.innerText,e.getPath(),l,e.editor);null===i?this.autocomplete.hideDropDown():"function"==typeof i.then?i.then(function(e){null===e?this.autocomplete.hideDropDown():e.options?this.autocomplete.show(t,e.startFrom,e.options):this.autocomplete.show(t,0,e)}.bind(this)):i.options?this.autocomplete.show(t,i.startFrom,i.options):this.autocomplete.show(t,0,i)}else this.autocomplete.hideDropDown()}.bind(this,h,e.target),50)}s&&(e.preventDefault(),e.stopPropagation())},w._createTable=function(){this.options.navigationBar&&d.addClassName(this.contentOuter,"has-nav-bar"),this.scrollableContent=document.createElement("div"),this.scrollableContent.className="jsoneditor-tree",this.contentOuter.appendChild(this.scrollableContent),this.content=document.createElement("div"),this.content.className="jsoneditor-tree-inner",this.scrollableContent.appendChild(this.content),this.table=document.createElement("table"),this.table.className="jsoneditor-tree",this.content.appendChild(this.table);var e;this.colgroupContent=document.createElement("colgroup"),"tree"===this.options.mode&&(e=document.createElement("col"),e.width="24px",this.colgroupContent.appendChild(e)),e=document.createElement("col"),e.width="24px",this.colgroupContent.appendChild(e),e=document.createElement("col"),this.colgroupContent.appendChild(e),this.table.appendChild(this.colgroupContent),this.tbody=document.createElement("tbody"),this.table.appendChild(this.tbody),this.frame.appendChild(this.contentOuter)},w.showContextMenu=function(e,t){var i=[],n=this.multiselection.nodes.slice();i.push({text:m("duplicateText"),title:m("duplicateTitle"),className:"jsoneditor-duplicate",click:function(){c.onDuplicate(n)}}),i.push({text:m("remove"),title:m("removeTitle"),className:"jsoneditor-remove",click:function(){c.onRemove(n)}}),this.options.onCreateMenu&&(i=this.options.onCreateMenu(i,{path:node.getPath()})),new a(i,{close:t}).show(e,this.frame)},w.getSelection=function(){var e={start:null,end:null};if(this.multiselection.nodes&&this.multiselection.nodes.length&&this.multiselection.nodes.length){var t=this.multiselection.nodes[0],i=this.multiselection.nodes[this.multiselection.nodes.length-1];"down"===this.multiselection.direction?(e.start=t.serialize(),e.end=i.serialize()):(e.start=i.serialize(),e.end=t.serialize())}return e},w.onSelectionChange=function(e){"function"==typeof e&&(this._selectionChangedHandler=d.debounce(e,this.DEBOUNCE_INTERVAL))},w.setSelection=function(e,t){e&&e.dom&&e.range&&(console.warn("setSelection/getSelection usage for text selection is deprecated and should not be used, see documentation for supported selection options"),this.setDomSelection(e));var i=this._getNodeInstancesByRange(e,t);i.forEach(function(e){e.expandTo()}),this.select(i)},w._getNodeInstancesByRange=function(e,t){var i,n;e&&e.path&&(i=this.node.findNodeByPath(e.path),t&&t.path&&(n=this.node.findNodeByPath(t.path)));var r=[];if(i instanceof c)if(n instanceof c&&n!==i)if(i.parent===n.parent){var e,t;i.getIndex()=0},n.prototype.canRedo=function(){return this.index=" "&&h<=" "||" "===h||"âŸ"===h||" "===h?(s.push(" "),a++):"'"===h?o("'"):'"'===h?o('"'):"`"===h?o("´"):"‘"===h?o("’"):"“"===h?o("â€"):","===h&&-1!==["]","}"].indexOf(function(){for(var t=a+1;t=0;){var t=s[e];if(!r(t))return t;e--}return""}())?function(){for(var e=["null","true","false"],i="",n=t(),r=/[a-zA-Z_$\d]/;r.test(n);)i+=n,a++,n=t();-1===e.indexOf(i)?s.push('"'+i+'"'):s.push(i)}():(s.push(h),a++)}return s.join("")},t.escapeUnicodeChars=function(e){return e.replace(/[\u007F-\uFFFF]/g,function(e){return"\\u"+("0000"+e.charCodeAt(0).toString(16)).slice(-4)})},t.validate=function(e){void 0!==n?n.parse(e):JSON.parse(e)},t.extend=function(e,t){for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i]);return e},t.clear=function(e){for(var t in e)e.hasOwnProperty(t)&&delete e[t];return e},t.type=function(e){return null===e?"null":void 0===e?"undefined":e instanceof Number||"number"==typeof e?"number":e instanceof String||"string"==typeof e?"string":e instanceof Boolean||"boolean"==typeof e?"boolean":e instanceof RegExp||"regexp"==typeof e?"regexp":t.isArray(e)?"array":"object"};var s=/^https?:\/\/\S+$/;t.isUrl=function(e){return("string"==typeof e||e instanceof String)&&s.test(e)},t.isArray=function(e){return"[object Array]"===Object.prototype.toString.call(e)},t.getAbsoluteLeft=function(e){return e.getBoundingClientRect().left+window.pageXOffset||document.scrollLeft||0},t.getAbsoluteTop=function(e){return e.getBoundingClientRect().top+window.pageYOffset||document.scrollTop||0},t.addClassName=function(e,t){var i=e.className.split(" ");-1==i.indexOf(t)&&(i.push(t),e.className=i.join(" "))},t.removeAllClassNames=function(e){e.className=""},t.removeClassName=function(e,t){var i=e.className.split(" "),n=i.indexOf(t);-1!=n&&(i.splice(n,1),e.className=i.join(" "))},t.stripFormatting=function(e){for(var i=e.childNodes,n=0,r=i.length;n=0;a--){var l=s[a];!0===l.specified&&o.removeAttribute(l.name)}t.stripFormatting(o)}},t.setEndOfContentEditable=function(e){var t,i;document.createRange&&(t=document.createRange(),t.selectNodeContents(e),t.collapse(!1),i=window.getSelection(),i.removeAllRanges(),i.addRange(t))},t.selectContentEditable=function(e){if(e&&"DIV"==e.nodeName){var t,i;window.getSelection&&document.createRange&&(i=document.createRange(),i.selectNodeContents(e),t=window.getSelection(),t.removeAllRanges(),t.addRange(i))}},t.getSelection=function(){if(window.getSelection){var e=window.getSelection();if(e.getRangeAt&&e.rangeCount)return e.getRangeAt(0)}return null},t.setSelection=function(e){if(e&&window.getSelection){var t=window.getSelection();t.removeAllRanges(),t.addRange(e)}},t.getSelectionOffset=function(){var e=t.getSelection();return e&&"startOffset"in e&&"endOffset"in e&&e.startContainer&&e.startContainer==e.endContainer?{startOffset:e.startOffset,endOffset:e.endOffset,container:e.startContainer.parentNode}:null},t.setSelectionOffset=function(e){if(document.createRange&&window.getSelection){if(window.getSelection()){var i=document.createRange();e.container.firstChild||e.container.appendChild(document.createTextNode("")),i.setStart(e.container.firstChild,e.startOffset),i.setEnd(e.container.firstChild,e.endOffset),t.setSelection(i)}}},t.getInnerText=function(e,i){if(void 0==i&&(i={text:"",flush:function(){var e=this.text;return this.text="",e},set:function(e){this.text=e}}),e.nodeValue)return i.flush()+e.nodeValue;if(e.hasChildNodes()){for(var n=e.childNodes,r="",o=0,s=n.length;o5){var i=["("+(t.length-5)+" more...)"];t=t.slice(0,5),t.push(i)}e.message="should be equal to one of: "+t.join(", ")}}return"additionalProperties"===e.keyword&&(e.message="should NOT have additional property: "+e.params.additionalProperty),e},t.isPromise=function(e){return e&&"function"==typeof e.then&&"function"==typeof e.catch},t.isValidValidationError=function(e){return"object"==typeof e&&Array.isArray(e.path)&&"string"==typeof e.message},t.insideRect=function(e,t,i){var n=void 0!==i?i:0;return t.left-n>=e.left&&t.right+n<=e.right&&t.top-n>=e.top&&t.bottom+n<=e.bottom},t.debounce=function(e,t,i){var n;return function(){var r=this,o=arguments,s=function(){n=null,i||e.apply(r,o)},a=i&&!n;clearTimeout(n),n=setTimeout(s,t),a&&e.apply(r,o)}},t.textDiff=function(e,t){for(var i=t.length,n=0,r=e.length,o=t.length;t.charAt(n)===e.charAt(n)&&nn&&r>0;)o--,r--;return{start:n,end:o}},t.getInputSelection=function(e){function t(t){var i=e.value.substring(0,t);return{row:(i.match(/\n/g)||[]).length+1,column:i.length-i.lastIndexOf("\n")}}var i,n,r,o,s,a=0,l=0;return"number"==typeof e.selectionStart&&"number"==typeof e.selectionEnd?(a=e.selectionStart,l=e.selectionEnd):(n=document.selection.createRange())&&n.parentElement()==e&&(o=e.value.length,i=e.value.replace(/\r\n/g,"\n"),r=e.createTextRange(),r.moveToBookmark(n.getBookmark()),s=e.createTextRange(),s.collapse(!1),r.compareEndPoints("StartToEnd",s)>-1?a=l=o:(a=-r.moveStart("character",-o),a+=i.slice(0,a).split("\n").length-1,r.compareEndPoints("EndToEnd",s)>-1?l=o:(l=-r.moveEnd("character",-o),l+=i.slice(0,l).split("\n").length-1))),{startIndex:a,endIndex:l,start:t(a),end:t(l)}},t.getIndexForPosition=function(e,t,i){var n=e.value||"";if(t>0&&i>0){var r=n.split("\n",t);t=Math.min(r.length,t),i=Math.min(r[t-1].length,i-1);var o=1==t?i:i+1;return r.slice(0,t-1).join("\n").length+o}return-1},t.getPositionForPath=function(e,t){var i,n=this,o=[];if(!t||!t.length)return o;try{i=r.parse(e)}catch(e){return o}return t.forEach(function(e){var t=n.parsePath(e),r=t.length?"/"+t.join("/"):"",s=i.pointers[r];s&&o.push({path:e,line:s.key?s.key.line:s.value?s.value.line:0,column:s.key?s.key.column:s.value?s.value.column:0})}),o},t.getColorCSS=function(e){var t=document.createElement("div");return t.style.color=e,t.style.color.split(/\s+/).join("").toLowerCase()||null},t.isValidColor=function(e){return!!t.getColorCSS(e)},t.makeFieldTooltip=function(e,t){if(!e)return"";var i="";return e.title&&(i+=e.title),e.description&&(i.length>0&&(i+="\n"),i+=e.description),e.default&&(i.length>0&&(i+="\n\n"),i+=o("default",void 0,t)+"\n",i+=JSON.stringify(e.default,null,2)),Array.isArray(e.examples)&&e.examples.length>0&&(i.length>0&&(i+="\n\n"),i+=o("examples",void 0,t)+"\n",e.examples.forEach(function(t,n){i+=JSON.stringify(t,null,2),n!==e.examples.length-1&&(i+="\n")})),i},t.get=function(e,t){for(var i=e,n=0;n1?" "+r:""))+")",r++}return n}},function(e,t){"undefined"!=typeof Element&&function(){function e(e){e.hasOwnProperty("remove")||Object.defineProperty(e,"remove",{configurable:!0,enumerable:!0,writable:!0,value:function(){null!=this.parentNode&&this.parentNode.removeChild(this)}})}"undefined"!=typeof Element&&e(Element.prototype),"undefined"!=typeof CharacterData&&e(CharacterData.prototype),"undefined"!=typeof DocumentType&&e(DocumentType.prototype)}(),String.prototype.startsWith||(String.prototype.startsWith=function(e,t){return t=t||0,this.substr(t,e.length)===e}),Array.prototype.find||(Array.prototype.find=function(e){for(var t=0;t2&&C.push("'"+this.terminals_[y]+"'");var A="";A=this.lexer.showPosition?"Parse error on line "+(l+1)+":\n"+this.lexer.showPosition()+"\nExpecting "+C.join(", ")+", got '"+this.terminals_[p]+"'":"Parse error on line "+(l+1)+": Unexpected "+(1==p?"end of input":"'"+(this.terminals_[p]||p)+"'"),this.parseError(A,{text:this.lexer.match,token:this.terminals_[p]||p,line:this.lexer.yylineno,loc:u,expected:C})}if(3==h){if(1==p)throw new Error(A||"Parsing halted.");c=this.lexer.yyleng,a=this.lexer.yytext,l=this.lexer.yylineno,u=this.lexer.yylloc,p=t()}for(;;){if(d.toString()in s[m])break;if(0==m)throw new Error(A||"Parsing halted.");!function(e){n.length=n.length-2*e,r.length=r.length-e,o.length=o.length-e}(1),m=n[n.length-1]}f=p,p=d,m=n[n.length-1],g=s[m]&&s[m][d],h=3}if(g[0]instanceof Array&&g.length>1)throw new Error("Parse Error: multiple actions possible at state: "+m+", token: "+p);switch(g[0]){case 1:n.push(p),r.push(this.lexer.yytext),o.push(this.lexer.yylloc),n.push(g[1]),p=null,f?(p=f,f=null):(c=this.lexer.yyleng,a=this.lexer.yytext,l=this.lexer.yylineno,u=this.lexer.yylloc,h>0&&h--);break;case 2:if(w=this.productions_[g[1]][1],E.$=r[r.length-w],E._$={first_line:o[o.length-(w||1)].first_line,last_line:o[o.length-1].last_line,first_column:o[o.length-(w||1)].first_column,last_column:o[o.length-1].last_column},void 0!==(v=this.performAction.call(E,a,c,l,this.yy,g[1],r,o)))return v;w&&(n=n.slice(0,-1*w*2),r=r.slice(0,-1*w),o=o.slice(0,-1*w)),n.push(this.productions_[g[1]][0]),r.push(E.$),o.push(E._$),b=s[n[n.length-2]][n[n.length-1]],n.push(b);break;case 3:return!0}}return!0}},t=function(){var e={EOF:1,parseError:function(e,t){if(!this.yy.parseError)throw new Error(e);this.yy.parseError(e,t)},setInput:function(e){return this._input=e,this._more=this._less=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this},input:function(){var e=this._input[0];return this.yytext+=e,this.yyleng++,this.match+=e,this.matched+=e,e.match(/\n/)&&this.yylineno++,this._input=this._input.slice(1),e},unput:function(e){return this._input=e+this._input,this},more:function(){return this._more=!0,this},less:function(e){this._input=this.match.slice(e)+this._input},pastInput:function(){var e=this.matched.substr(0,this.matched.length-this.match.length);return(e.length>20?"...":"")+e.substr(-20).replace(/\n/g,"")},upcomingInput:function(){var e=this.match;return e.length<20&&(e+=this._input.substr(0,20-e.length)),(e.substr(0,20)+(e.length>20?"...":"")).replace(/\n/g,"")},showPosition:function(){var e=this.pastInput(),t=new Array(e.length+1).join("-");return e+this.upcomingInput()+"\n"+t+"^"},next:function(){if(this.done)return this.EOF;this._input||(this.done=!0);var e,t,i,n,r;this._more||(this.yytext="",this.match="");for(var o=this._currentRules(),s=0;st[0].length)||(t=i,n=s,this.options.flex));s++);return t?(r=t[0].match(/\n.*/g),r&&(this.yylineno+=r.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:r?r[r.length-1].length-1:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.yyleng=this.yytext.length,this._more=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],e=this.performAction.call(this,this.yy,this,o[n],this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),e||void 0):""===this._input?this.EOF:void this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},lex:function(){var e=this.next();return void 0!==e?e:this.lex()},begin:function(e){this.conditionStack.push(e)},popState:function(){return this.conditionStack.pop()},_currentRules:function(){return this.conditions[this.conditionStack[this.conditionStack.length-1]].rules},topState:function(){return this.conditionStack[this.conditionStack.length-2]},pushState:function(e){this.begin(e)}};return e.options={},e.performAction=function(e,t,i,n){switch(i){case 0:break;case 1:return 6;case 2:return t.yytext=t.yytext.substr(1,t.yyleng-2),4;case 3:return 17;case 4:return 18;case 5:return 23;case 6:return 24;case 7:return 22;case 8:return 21;case 9:return 10;case 10:return 11;case 11:return 8;case 12:return 14;case 13:return"INVALID"}},e.rules=[/^(?:\s+)/,/^(?:(-?([0-9]|[1-9][0-9]+))(\.[0-9]+)?([eE][-+]?[0-9]+)?\b)/,/^(?:"(?:\\[\\"bfnrt\/]|\\u[a-fA-F0-9]{4}|[^\\\0-\x09\x0a-\x1f"])*")/,/^(?:\{)/,/^(?:\})/,/^(?:\[)/,/^(?:\])/,/^(?:,)/,/^(?::)/,/^(?:true\b)/,/^(?:false\b)/,/^(?:null\b)/,/^(?:$)/,/^(?:.)/],e.conditions={INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,12,13],inclusive:!0}},e}();return e.lexer=t,e}();t.parser=n,t.parse=n.parse.bind(n)},function(e,t){"use strict";function i(e){return a.indexOf(typeof e)>=0}function n(e){return'"'+(e=e.replace(l,"\\$&").replace(h,"\\f").replace(c,"\\b").replace(d,"\\n").replace(u,"\\r").replace(p,"\\t"))+'"'}function r(e){return e.replace(f,"~0").replace(m,"~1")}var o={b:"\b",f:"\f",n:"\n",r:"\r",t:"\t",'"':'"',"/":"/","\\":"\\"},s="a".charCodeAt();t.parse=function(e){function t(t,r){i();var o;m(t,"value");var s=d();switch(s){case"t":h("rue"),o=!0;break;case"f":h("alse"),o=!1;break;case"n":h("ull"),o=null;break;case'"':o=n();break;case"[":o=l(t);break;case"{":o=c(t);break;default:u(),"-0123456789".indexOf(s)>=0?o=a():y()}return m(t,"valueEnd"),i(),r&&F="a"&&i<="f"?t+=i.charCodeAt()-s+10:i>="0"&&i<="9"?t+=+i:w()}return String.fromCharCode(t)}function f(){for(var t="";e[F]>="0"&&e[F]<="9";)t+=d();if(t.length)return t;b(),y()}function m(e,t){g(e,t,v())}function g(e,t,i){C[e]=C[e]||{},C[e][t]=i}function v(){return{line:E,column:A,pos:F}}function y(){throw new SyntaxError("Unexpected token "+e[F]+" in JSON at position "+F)}function w(){u(),y()}function b(){if(F>=e.length)throw new SyntaxError("Unexpected end of JSON input")}var C={},E=0,A=0,F=0;return{data:t("",!0),pointers:C}},t.stringify=function(e,t,o){function s(e,t,h){switch(c(h,"value"),typeof e){case"number":case"boolean":a(""+e);break;case"string":a(n(e));break;case"object":null===e?a("null"):"function"==typeof e.toJSON?a(n(e.toJSON())):Array.isArray(e)?function(){if(e.length){a("[");for(var n=t+1,r=0;r10?10:o<0?0:Math.floor(o);o=f&&h(f," "),d=f,u=f;break;case"string":o=o.slice(0,10),d=0,u=0;for(var m=0;mthis.results.length-1&&(t=0),this._setActiveResult(t,e)}},i.prototype.previous=function(e){if(void 0!=this.results){var t=this.results.length-1,i=void 0!=this.resultIndex?this.resultIndex-1:t;i<0&&(i=t),this._setActiveResult(i,e)}},i.prototype._setActiveResult=function(e,t){if(this.activeResult){var i=this.activeResult.node;"field"==this.activeResult.elem?delete i.searchFieldActive:delete i.searchValueActive,i.updateDom()}if(!this.results||!this.results[e])return this.resultIndex=void 0,void(this.activeResult=void 0);this.resultIndex=e;var n=this.results[this.resultIndex].node,r=this.results[this.resultIndex].elem;"field"==r?n.searchFieldActive=!0:n.searchValueActive=!0,this.activeResult=this.results[this.resultIndex],n.updateDom(),n.scrollTo(function(){t&&n.focus(r)})},i.prototype._clearDelay=function(){void 0!=this.timeout&&(clearTimeout(this.timeout),delete this.timeout)},i.prototype._onDelayedSearch=function(e){this._clearDelay();var t=this;this.timeout=setTimeout(function(e){t._onSearch()},this.delay)},i.prototype._onSearch=function(e){this._clearDelay();var t=this.dom.search.value,i=t.length>0?t:void 0;if(i!==this.lastText||e){this.lastText=i,this.results=this.editor.search(i);var n=this.results[0]?this.results[0].node.MAX_SEARCH_RESULTS:1/0,r=0;if(this.activeResult)for(var o=0;on?n+"+ results":s+" results"}else this.dom.results.innerHTML=""}},i.prototype._onKeyDown=function(e){var t=e.which;27==t?(this.dom.search.value="",this._onSearch(),e.preventDefault(),e.stopPropagation()):13==t&&(e.ctrlKey?this._onSearch(!0):e.shiftKey?this.previous():this.next(),e.preventDefault(),e.stopPropagation())},i.prototype._onKeyUp=function(e){var t=e.keyCode;27!=t&&13!=t&&this._onDelayedSearch(e)},i.prototype.clear=function(){this.dom.search.value="",this._onSearch()},i.prototype.forceSearch=function(){this._onSearch(!0)},i.prototype.isEmpty=function(){return""===this.dom.search.value},i.prototype.destroy=function(){this.editor=null,this.dom.container.removeChild(this.dom.table),this.dom=null,this.results=null,this.activeResult=null,this._clearDelay()},e.exports=i},function(e,t,i){"use strict";function n(e,t){function i(e,t,r){r.forEach(function(r){if("separator"==r.type){var o=document.createElement("div");o.className="jsoneditor-separator",l=document.createElement("li"),l.appendChild(o),e.appendChild(l)}else{var a={},l=document.createElement("li");e.appendChild(l);var c=document.createElement("button");if(c.type="button",c.className=r.className,a.button=c,r.title&&(c.title=r.title),r.click&&(c.onclick=function(e){e.preventDefault(),n.hide(),r.click()}),l.appendChild(c),r.submenu){var h=document.createElement("div");h.className="jsoneditor-icon",c.appendChild(h);var d=document.createElement("div");d.className="jsoneditor-text"+(r.click?"":" jsoneditor-right-margin"),d.appendChild(document.createTextNode(r.text)),c.appendChild(d);var u;if(r.click){c.className+=" jsoneditor-default";var p=document.createElement("button");p.type="button",a.buttonExpand=p,p.className="jsoneditor-expand",p.innerHTML='
      ',l.appendChild(p),r.submenuTitle&&(p.title=r.submenuTitle),u=p}else{var f=document.createElement("div");f.className="jsoneditor-expand",c.appendChild(f),u=c}u.onclick=function(e){e.preventDefault(),n._onExpandItem(a),u.focus()};var m=[];a.subItems=m;var g=document.createElement("ul");a.ul=g,g.className="jsoneditor-menu",g.style.height="0",l.appendChild(g),i(g,m,r.submenu)}else c.innerHTML='
      '+s(r.text)+"
      ";t.push(a)}})}this.dom={};var n=this,r=this.dom;this.anchor=void 0,this.items=e,this.eventListeners={},this.selection=void 0,this.onClose=t?t.close:void 0;var o=document.createElement("div");o.className="jsoneditor-contextmenu-root",r.root=o;var a=document.createElement("div");a.className="jsoneditor-contextmenu",r.menu=a,o.appendChild(a);var l=document.createElement("ul");l.className="jsoneditor-menu",a.appendChild(l),r.list=l,r.items=[];var c=document.createElement("button");c.type="button",r.focusButton=c;var h=document.createElement("li");h.style.overflow="hidden",h.style.height="0",h.appendChild(c),l.appendChild(h),i(l,this.dom.items,e),this.maxHeight=0,e.forEach(function(t){var i=24*(e.length+(t.submenu?t.submenu.length:0));n.maxHeight=Math.max(n.maxHeight,i)})}var r=i(69).createAbsoluteAnchor,o=i(62),s=i(66).translate;n.prototype._getVisibleButtons=function(){var e=[],t=this;return this.dom.items.forEach(function(i){e.push(i.button),i.buttonExpand&&e.push(i.buttonExpand),i.subItems&&i==t.expandedItem&&i.subItems.forEach(function(t){e.push(t.button),t.buttonExpand&&e.push(t.buttonExpand)})}),e},n.visibleMenu=void 0,n.prototype.show=function(e,t,i){this.hide();var s=!0,a=e.parentNode,l=e.getBoundingClientRect(),c=a.getBoundingClientRect(),h=t.getBoundingClientRect(),d=this;this.dom.absoluteAnchor=r(e,t,function(){d.hide()}),l.bottom+this.maxHeighth.top&&(s=!1);var u=i?0:l.top-c.top;if(s){var p=e.offsetHeight;this.dom.menu.style.left="0",this.dom.menu.style.top=u+p+"px",this.dom.menu.style.bottom=""}else this.dom.menu.style.left="0",this.dom.menu.style.top="",this.dom.menu.style.bottom="0px";this.dom.absoluteAnchor.appendChild(this.dom.root),this.selection=o.getSelection(),this.anchor=e,setTimeout(function(){d.dom.focusButton.focus()},0),n.visibleMenu&&n.visibleMenu.hide(),n.visibleMenu=this},n.prototype.hide=function(){this.dom.absoluteAnchor&&(this.dom.absoluteAnchor.destroy(),delete this.dom.absoluteAnchor),this.dom.root.parentNode&&(this.dom.root.parentNode.removeChild(this.dom.root),this.onClose&&this.onClose()),n.visibleMenu==this&&(n.visibleMenu=void 0)},n.prototype._onExpandItem=function(e){var t=this,i=e==this.expandedItem,n=this.expandedItem;if(n&&(n.ul.style.height="0",n.ul.style.padding="",setTimeout(function(){t.expandedItem!=n&&(n.ul.style.display="",o.removeClassName(n.ul.parentNode,"jsoneditor-selected"))},300),this.expandedItem=void 0),!i){var r=e.ul;r.style.display="block";r.clientHeight;setTimeout(function(){if(t.expandedItem==e){for(var i=0,n=0;n0;){var n=t.shift();if("number"==typeof n){if("array"!==i.type)throw new Error("Cannot get child node at index "+n+": node is no array");i=i.childs[n]}else{if("object"!==i.type)throw new Error("Cannot get child node "+n+": node is no object");i=i.childs.filter(function(e){return e.field===n})[0]}}return i},n.prototype.findParents=function(){for(var e=[],t=this.parent;t;)e.unshift(t),t=t.parent;return e},n.prototype.setError=function(e,t){this.error=e,this.errorChild=t,this.dom&&this.dom.tr&&this.updateError()},n.prototype.updateError=function(){var e=this.fieldError||this.valueError||this.error,t=this.dom.tdError;if(e&&this.dom&&this.dom.tr){f.addClassName(this.dom.tr,"jsoneditor-validation-error"),t||(t=document.createElement("td"),this.dom.tdError=t,this.dom.tdValue.parentNode.appendChild(t));var i=document.createElement("div");i.className="jsoneditor-popover jsoneditor-right",i.appendChild(document.createTextNode(e.message));var n=document.createElement("button");n.type="button",n.className="jsoneditor-button jsoneditor-schema-error",n.appendChild(i),n.onmouseover=n.onfocus=function(){for(var e=["right","above","below","left"],t=0;t=e.length;a--)this.removeChild(this.childs[a],!1)}else if("object"===this.type){for(this.childs||(this.childs=[]),a=this.childs.length-1;a>=0;a--)e.hasOwnProperty(this.childs[a].field)||this.removeChild(this.childs[a],!1);s=0;for(var c in e)e.hasOwnProperty(c)&&(i=e[c],void 0===i||i instanceof Function||(r=this.findChildByProperty(c),r?(r.setField(c,!0),r.setValue(i)):(r=new n(this.editor,{field:c,value:i}),o=s=e.childs.length;s--)this.removeChild(this.childs[s],!1)}else if("object"===e.type){for(this.childs||(this.childs=[]),o=0;o=e.childs.length;s--)this.removeChild(this.childs[s],!1)}else this.hideChilds(),delete this.append,delete this.showMore,delete this.expanded,delete this.childs,this.value=e.value;Array.isArray(a)!==Array.isArray(this.childs)&&this.recreateDom(),this.updateDom({updateIndexes:!0}),this.previousValue=this.value},n.prototype.recreateDom=function(){if(this.dom&&this.dom.tr&&this.dom.tr.parentNode){var e=this._detachFromDom();this.clearDom(),this._attachToDom(e)}else this.clearDom()},n.prototype.getValue=function(){if("array"==this.type){var e=[];return this.childs.forEach(function(t){e.push(t.getValue())}),e}if("object"==this.type){var t={};return this.childs.forEach(function(e){t[e.getField()]=e.getValue()}),t}return void 0===this.value&&this._getDomValue(),this.value},n.prototype.getInternalValue=function(){return"array"===this.type?{type:this.type,childs:this.childs.map(function(e){return e.getInternalValue()})}:"object"===this.type?{type:this.type,childs:this.childs.map(function(e){return{field:e.getField(),value:e.getInternalValue()}})}:(void 0===this.value&&this._getDomValue(),{type:this.type,value:this.value})},n.prototype.getLevel=function(){return this.parent?this.parent.getLevel()+1:0},n.prototype.getNodePath=function(){var e=this.parent?this.parent.getNodePath():[];return e.push(this),e},n.prototype.clone=function(){var e=new n(this.editor);if(e.type=this.type,e.field=this.field,e.fieldInnerText=this.fieldInnerText,e.fieldEditable=this.fieldEditable,e.previousField=this.previousField,e.value=this.value,e.valueInnerText=this.valueInnerText,e.previousValue=this.previousValue,e.expanded=this.expanded,e.visibleChilds=this.visibleChilds,this.childs){var t=[];this.childs.forEach(function(i){var n=i.clone();n.setParent(e),t.push(n)}),e.childs=t}else e.childs=void 0;return e},n.prototype.expand=function(e){this.childs&&(this.expanded=!0,this.dom.expand&&(this.dom.expand.className="jsoneditor-button jsoneditor-expanded"),this.showChilds(),!1!==e&&this.childs.forEach(function(t){t.expand(e)}))},n.prototype.collapse=function(e){this.childs&&(this.hideChilds(),!1!==e&&this.childs.forEach(function(t){t.collapse(e)}),this.dom.expand&&(this.dom.expand.className="jsoneditor-button jsoneditor-collapsed"),this.expanded=!1)},n.prototype.showChilds=function(){if(this.childs&&this.expanded){var e=this.dom.tr,t=e?e.parentNode:void 0;if(t){var i=this.getAppendDom();if(!i.parentNode){var n=e.nextSibling;n?t.insertBefore(i,n):t.appendChild(i)}for(var r=Math.min(this.childs.length,this.visibleChilds),n=this._getNextTr(),o=0;othis.visibleChilds){var r=this.childs[this.visibleChilds-1];this.insertBefore(e,r)}else this.appendChild(e);else this.insertBefore(e,t);i&&i.removeChild(n)}},n.prototype.insertBefore=function(e,t){if(this._hasChilds()){if(this.visibleChilds++,"object"===this.type&&void 0==e.field&&e.setField(""),t===this.append)e.setParent(this),e.fieldEditable="object"==this.type,this.childs.push(e);else{var i=this.childs.indexOf(t);if(-1==i)throw new Error("Node not found");e.setParent(this),e.fieldEditable="object"==this.type,this.childs.splice(i,0,e)}if(this.expanded){var n=e.getDom(),r=t.getDom(),o=r?r.parentNode:void 0;r&&o&&o.insertBefore(n,r),e.showChilds(),this.showChilds()}this.updateDom({updateIndexes:!0}),e.updateDom({recurse:!0})}},n.prototype.insertAfter=function(e,t){if(this._hasChilds()){var i=this.childs.indexOf(t),n=this.childs[i+1];n?this.insertBefore(e,n):this.appendChild(e)}},n.prototype.search=function(e,t){Array.isArray(t)||(t=[]);var i,n=e?e.toLowerCase():void 0;if(delete this.searchField,delete this.searchValue,void 0!==this.field&&t.length<=this.MAX_SEARCH_RESULTS){i=String(this.field).toLowerCase().indexOf(n),-1!==i&&(this.searchField=!0,t.push({node:this,elem:"field"})),this._updateDomField()}if(this._hasChilds())this.childs&&this.childs.forEach(function(i){i.search(e,t)});else if(void 0!==this.value&&t.length<=this.MAX_SEARCH_RESULTS){var r=String(this.value).toLowerCase();i=r.indexOf(n),-1!==i&&(this.searchValue=!0,t.push({node:this,elem:"value"})),this._updateDomValue()}return t},n.prototype.scrollTo=function(e){this.expandPathToNode(),this.dom.tr&&this.dom.tr.parentNode&&this.editor.scrollTo(this.dom.tr.offsetTop,e)},n.prototype.expandPathToNode=function(){for(var e=this;e&&e.parent;){for(var t="array"===e.parent.type?e.index:e.parent.childs.indexOf(e);e.parent.visibleChilds9466848e5&&!isNaN(new Date(i).valueOf())?(this.dom.date||(this.dom.date=document.createElement("div"),this.dom.date.className="jsoneditor-date",this.dom.value.parentNode.appendChild(this.dom.date)),this.dom.date.innerHTML=new Date(i).toISOString(),this.dom.date.title=new Date(i).toString()):this.dom.date&&(this.dom.date.parentNode.removeChild(this.dom.date),delete this.dom.date),f.stripFormatting(e),this._updateDomDefault()}},n.prototype._deleteDomColor=function(){this.dom.color&&(this.dom.tdColor.parentNode.removeChild(this.dom.tdColor),delete this.dom.tdColor,delete this.dom.color,this.dom.value.style.color="")},n.prototype._updateDomField=function(){var e=this.dom.field;if(e){var t=f.makeFieldTooltip(this.schema,this.editor.options.language);t&&(e.title=t);""==String(this.field)&&"array"!=this.parent.type?f.addClassName(e,"jsoneditor-empty"):f.removeClassName(e,"jsoneditor-empty"),this.searchFieldActive?f.addClassName(e,"jsoneditor-highlight-active"):f.removeClassName(e,"jsoneditor-highlight-active"),this.searchField?f.addClassName(e,"jsoneditor-highlight"):f.removeClassName(e,"jsoneditor-highlight"),f.stripFormatting(e)}},n.prototype._getDomField=function(e){if(this._clearFieldError(),this.dom.field&&this.fieldEditable&&(this.fieldInnerText=f.getInnerText(this.dom.field)),void 0!==this.fieldInnerText)try{var t=this._unescapeHTML(this.fieldInnerText),i=this.parent.getFieldNames(this);-1!==i.indexOf(t)?e?(t=f.findUniqueName(t,i))!==this.field&&(this.field=t,this._debouncedOnChangeField()):this._setFieldError(m("duplicateFieldError")):t!==this.field&&(this.field=t,this._debouncedOnChangeField())}catch(e){this._setFieldError(m("cannotParseFieldError"))}},n.prototype._updateDomDefault=function(){if(this.schema&&void 0!==this.schema.default&&!this._hasChilds()){var e=this.dom.select?this.dom.select:this.dom.value;e&&(this.value===this.schema.default?(e.title=m("default"),f.addClassName(e,"jsoneditor-is-default"),f.removeClassName(e,"jsoneditor-is-not-default")):(e.removeAttribute("title"),f.removeClassName(e,"jsoneditor-is-default"),f.addClassName(e,"jsoneditor-is-not-default")))}},n.prototype.clearDom=function(){this.dom={}},n.prototype.getDom=function(){var e=this.dom;if(e.tr)return e.tr;if(this._updateEditability(),e.tr=document.createElement("tr"),e.tr.node=this,"tree"===this.editor.options.mode){var t=document.createElement("td");if(this.editable.field&&this.parent){var i=document.createElement("button");i.type="button",e.drag=i,i.className="jsoneditor-button jsoneditor-dragarea",i.title=m("drag"),t.appendChild(i)}e.tr.appendChild(t);var n=document.createElement("td"),r=document.createElement("button");r.type="button",e.menu=r,r.className="jsoneditor-button jsoneditor-contextmenu",r.title=m("actionsMenu"),n.appendChild(e.menu),e.tr.appendChild(n)}var o=document.createElement("td");return e.tr.appendChild(o),e.tree=this._createDomTree(),o.appendChild(e.tree),this.updateDom({updateIndexes:!0}),e.tr},n.prototype.isVisible=function(){return this.dom&&this.dom.tr&&this.dom.tr.parentNode||!1},n.onDragStart=function(e,t){if(!Array.isArray(e))return n.onDragStart([e],t);if(0!==e.length){var i=e[0],o=e[e.length-1],s=i.parent,a=n.getNodeFromTarget(t.target),l=i.editor,c=f.getAbsoluteTop(a.dom.tr)-f.getAbsoluteTop(i.dom.tr);l.mousemove||(l.mousemove=f.addEventListener(window,"mousemove",function(t){n.onDrag(e,t)})),l.mouseup||(l.mouseup=f.addEventListener(window,"mouseup",function(t){n.onDragEnd(e,t)})),l.highlighter.lock(),l.drag={oldCursor:document.body.style.cursor,oldSelection:l.getDomSelection(),oldPaths:e.map(r),oldParent:s,oldNextNode:s.childs[o.getIndex()+1]||s.append,oldParentPathRedo:s.getInternalPath(),oldIndexRedo:i.getIndex(),mouseX:t.pageX,offsetY:c,level:i.getLevel()},document.body.style.cursor="move",t.preventDefault()}},n.onDrag=function(e,t){if(!Array.isArray(e))return n.onDrag([e],t);if(0!==e.length){var i,r,o,s,a,l,c,h,d,u,p,m,g,y,w=e[0].editor,b=t.pageY-w.drag.offsetY,C=t.pageX,E=!1,A=e[0];if(i=A.dom.tr,d=f.getAbsoluteTop(i),m=i.offsetHeight,bu+m&&(c=void 0)),c&&(e.forEach(function(e){c.parent.moveBefore(e,c)}),E=!0)}else{var F=e[e.length-1];if(a=F.expanded&&F.append?F.append.getDom():F.dom.tr,s=a?a.nextSibling:void 0){p=f.getAbsoluteTop(s),o=s;do{h=n.getNodeFromTarget(o),o&&(g=o.nextSibling?f.getAbsoluteTop(o.nextSibling):0,y=o?g-p:0,h&&h.parent.childs.length==e.length&&h.parent.childs[e.length-1]==F&&(d+=27),o=o.nextSibling)}while(o&&b>d+y);if(h&&h.parent){var x=C-w.drag.mouseX,S=Math.round(x/24/2),_=w.drag.level+S,k=h.getLevel();for(r=h.dom.tr&&h.dom.tr.previousSibling;k<_&&r;){c=n.getNodeFromTarget(r);if(e.some(function(e){return e===c||c.isDescendantOf(e)}));else{if(!(c instanceof v))break;var D=c.parent.childs;if(D.length==e.length&&D[e.length-1]==F)break;h=n.getNodeFromTarget(r),k=h.getLevel()}r=r.previousSibling}h instanceof v&&!h.isVisible()&&h.parent.showMore.isVisible()&&(h=h._nextNode()),h&&h.dom.tr&&a.nextSibling!=h.dom.tr&&(e.forEach(function(e){h.parent.moveBefore(e,h)}),E=!0)}}}E&&(w.drag.mouseX=C,w.drag.level=A.getLevel()),w.startAutoScroll(b),t.preventDefault()}},n.onDragEnd=function(e,t){if(!Array.isArray(e))return n.onDrag([e],t);if(0!==e.length){var i=e[0],r=i.editor;e[0]&&e[0].dom.menu.focus();var s=r.drag.oldParent.getInternalPath(),a=i.parent.getInternalPath(),l=r.drag.oldParent===i.parent,c=r.drag.oldNextNode.getIndex(),h=i.getIndex(),d=r.drag.oldParentPathRedo,u=r.drag.oldIndexRedo,p=l&&u0)return i[0].enum}return null},n._findSchema=function(e,t,i){var r=e,o=r,s=e.oneOf||e.anyOf||e.allOf;s||(s=[e]);for(var a=0;a0?null:o},n.prototype._updateDomIndexes=function(){var e=this.dom.value,t=this.childs;e&&t&&("array"==this.type?t.forEach(function(e,t){e.index=t;var i=e.dom.field;i&&(i.innerHTML=t)}):"object"==this.type&&t.forEach(function(e){void 0!=e.index&&(delete e.index,void 0==e.field&&(e.field=""))}))},n.prototype._createDomValue=function(){var e;return"array"==this.type?(e=document.createElement("div"),e.innerHTML="[...]"):"object"==this.type?(e=document.createElement("div"),e.innerHTML="{...}"):!this.editable.value&&f.isUrl(this.value)?(e=document.createElement("a"),e.href=this.value,e.innerHTML=this._escapeHTML(this.value)):(e=document.createElement("div"),e.contentEditable=this.editable.value,e.spellcheck=!1,e.innerHTML=this._escapeHTML(this.value)),e},n.prototype._createDomExpandButton=function(){var e=document.createElement("button");return e.type="button",this._hasChilds()?(e.className=this.expanded?"jsoneditor-button jsoneditor-expanded":"jsoneditor-button jsoneditor-collapsed",e.title=m("expandTitle")):(e.className="jsoneditor-button jsoneditor-invisible",e.title=""),e},n.prototype._createDomTree=function(){var e=this.dom,t=document.createElement("table"),i=document.createElement("tbody");t.style.borderCollapse="collapse",t.className="jsoneditor-values",t.appendChild(i);var n=document.createElement("tr");i.appendChild(n);var r=document.createElement("td");r.className="jsoneditor-tree",n.appendChild(r),e.expand=this._createDomExpandButton(),r.appendChild(e.expand),e.tdExpand=r;var o=document.createElement("td");o.className="jsoneditor-tree",n.appendChild(o),e.field=this._createDomField(),o.appendChild(e.field),e.tdField=o;var s=document.createElement("td");s.className="jsoneditor-tree",n.appendChild(s),"object"!=this.type&&"array"!=this.type&&(s.appendChild(document.createTextNode(":")),s.className="jsoneditor-separator"),e.tdSeparator=s;var a=document.createElement("td");return a.className="jsoneditor-tree",n.appendChild(a),e.value=this._createDomValue(),a.appendChild(e.value),e.tdValue=a,t},n.prototype.onEvent=function(e){var t=e.type,i=e.target||e.srcElement,n=this.dom,r=this,o=this._hasChilds();if("function"==typeof this.editor.options.onEvent&&this._onEvent(e),i!=n.drag&&i!=n.menu||("mouseover"==t?this.editor.highlighter.highlight(this):"mouseout"==t&&this.editor.highlighter.unhighlight()),"click"==t&&i==n.menu){var s=r.editor.highlighter;s.highlight(r),s.lock(),f.addClassName(n.menu,"jsoneditor-selected"),this.showContextMenu(n.menu,function(){f.removeClassName(n.menu,"jsoneditor-selected"),s.unlock(),s.unhighlight()})}if("click"==t&&(i==n.expand||("view"===r.editor.options.mode||"form"===r.editor.options.mode)&&"DIV"===i.nodeName)&&o){var a=e.ctrlKey;this._onExpand(a)}"click"!==t||e.target!==r.dom.tdColor&&e.target!==r.dom.color||this._showColorPicker(),"change"==t&&i==n.checkbox&&(this.dom.value.innerHTML=!this.value,this._getDomValue(),this._updateDomDefault()),"change"==t&&i==n.select&&(this.dom.value.innerHTML=n.select.value,this._getDomValue(),this._updateDomValue());var l=n.value;if(i==l)switch(t){case"blur":case"change":this._getDomValue(),this._clearValueError(),this._updateDomValue(),this.value&&(l.innerHTML=this._escapeHTML(this.value));break;case"input":this._getDomValue(),this._updateDomValue();break;case"keydown":case"mousedown":this.editor.selection=this.editor.getDomSelection();break;case"click":e.ctrlKey&&this.editable.value&&f.isUrl(this.value)&&(e.preventDefault(),window.open(this.value,"_blank"));break;case"keyup":this._getDomValue(),this._updateDomValue();break;case"cut":case"paste":setTimeout(function(){r._getDomValue(),r._updateDomValue()},1)}var c=n.field;if(i==c)switch(t){case"blur":this._getDomField(!0),this._updateDomField(),this.field&&(c.innerHTML=this._escapeHTML(this.field));break;case"input":this._getDomField(),this._updateSchema(),this._updateDomField(),this._updateDomValue();break;case"keydown":case"mousedown":this.editor.selection=this.editor.getDomSelection();break;case"keyup":this._getDomField(),this._updateDomField();break;case"cut":case"paste":setTimeout(function(){r._getDomField(),r._updateDomField()},1)}var h=n.tree;if(h&&i==h.parentNode&&"click"==t&&!e.hasMoved){(void 0!=e.offsetX?e.offsetX<24*(this.getLevel()+1):e.pageX0?this.editor.multiselection.nodes:[this],S=x[0],_=x[x.length-1];if(13==y){if(w==this.dom.value)this.editable.value&&!e.ctrlKey||f.isUrl(this.value)&&(window.open(this.value,"_blank"),A=!0);else if(w==this.dom.expand){var k=this._hasChilds();if(k){var D=e.ctrlKey;this._onExpand(D),w.focus(),A=!0}}}else if(68==y)b&&F&&(n.onDuplicate(x),A=!0);else if(69==y)b&&(this._onExpand(C),w.focus(),A=!0);else if(77==y&&F)b&&(this.showContextMenu(w),A=!0);else if(46==y&&F)b&&(n.onRemove(x),A=!0);else if(45==y&&F)b&&!C?(this._onInsertBefore(),A=!0):b&&C&&(this._onInsertAfter(),A=!0);else if(35==y){if(E){var $=this._lastNode();$&&$.focus(n.focusElement||this._getElementName(w)),A=!0}}else if(36==y){if(E){var B=this._firstNode();B&&B.focus(n.focusElement||this._getElementName(w)),A=!0}}else if(37==y){if(E&&!C){var L=this._previousElement(w);L&&this.focus(this._getElementName(L)),A=!0}else if(E&&C&&F){if(_.expanded){var T=_.getAppendDom();r=T?T.nextSibling:void 0}else{var R=_.getDom();r=R.nextSibling}r&&(i=n.getNodeFromTarget(r),s=r.nextSibling,O=n.getNodeFromTarget(s),i&&i instanceof v&&1!=_.parent.childs.length&&O&&O.parent&&(a=this.editor.getDomSelection(),c=S.parent,l=c.childs[_.getIndex()+1]||c.append,h=S.getIndex(),d=O.getIndex(),u=c.getInternalPath(),p=O.parent.getInternalPath(),x.forEach(function(e){O.parent.moveBefore(e,O)}),this.focus(n.focusElement||this._getElementName(w)),this.editor._onAction("moveNodes",{count:x.length,fieldNames:x.map(o),oldParentPath:c.getInternalPath(),newParentPath:S.parent.getInternalPath(),oldIndex:l.getIndex(),newIndex:S.getIndex(),oldIndexRedo:h,newIndexRedo:d,oldParentPathRedo:u,newParentPathRedo:p,oldSelection:a,newSelection:this.editor.getDomSelection()})))}}else if(38==y)E&&!C?(t=this._previousNode(),t&&(this.editor.deselect(!0),t.focus(n.focusElement||this._getElementName(w))),A=!0):!E&&b&&C&&F?(t=this._previousNode(),t&&(g=this.editor.multiselection,g.start=g.start||this,g.end=t,m=this.editor._findTopLevelNodes(g.start,g.end),this.editor.select(m),t.focus("field")),A=!0):E&&C&&F&&(t=S._previousNode(),t&&t.parent&&(a=this.editor.getDomSelection(),c=S.parent,l=c.childs[_.getIndex()+1]||c.append,h=S.getIndex(),d=t.getIndex(),u=c.getInternalPath(),p=t.parent.getInternalPath(),x.forEach(function(e){t.parent.moveBefore(e,t)}),this.focus(n.focusElement||this._getElementName(w)),this.editor._onAction("moveNodes",{count:x.length,fieldNames:x.map(o),oldParentPath:c.getInternalPath(),newParentPath:S.parent.getInternalPath(),oldIndex:l.getIndex(),newIndex:S.getIndex(),oldIndexRedo:h,newIndexRedo:d,oldParentPathRedo:u,newParentPathRedo:p,oldSelection:a,newSelection:this.editor.getDomSelection()})),A=!0);else if(39==y){if(E&&!C){var P=this._nextElement(w);P&&this.focus(this._getElementName(P)),A=!0}else if(E&&C&&F){R=S.getDom();var M=R.previousSibling;M&&(t=n.getNodeFromTarget(M))&&t.parent&&!t.isVisible()&&(a=this.editor.getDomSelection(),c=S.parent,l=c.childs[_.getIndex()+1]||c.append,h=S.getIndex(),d=t.getIndex(),u=c.getInternalPath(),p=t.parent.getInternalPath(),x.forEach(function(e){t.parent.moveBefore(e,t)}),this.focus(n.focusElement||this._getElementName(w)),this.editor._onAction("moveNodes",{count:x.length,fieldNames:x.map(o),oldParentPath:c.getInternalPath(),newParentPath:S.parent.getInternalPath(),oldIndex:l.getIndex(),newIndex:S.getIndex(),oldIndexRedo:h,newIndexRedo:d,oldParentPathRedo:u,newParentPathRedo:p,oldSelection:a,newSelection:this.editor.getDomSelection()}))}}else if(40==y)if(E&&!C)i=this._nextNode(),i&&(this.editor.deselect(!0),i.focus(n.focusElement||this._getElementName(w))),A=!0;else if(!E&&b&&C&&F)i=this._nextNode(),i&&(g=this.editor.multiselection,g.start=g.start||this,g.end=i,m=this.editor._findTopLevelNodes(g.start,g.end),this.editor.select(m),i.focus("field")),A=!0;else if(E&&C&&F){i=_.expanded?_.append?_.append._nextNode():void 0:_._nextNode(),i&&!i.isVisible()&&(i=i.parent.showMore),i&&i instanceof v&&(i=_);var O=i&&(i._nextNode()||i.parent.append);O&&O.parent&&(a=this.editor.getDomSelection(),c=S.parent,l=c.childs[_.getIndex()+1]||c.append,h=S.getIndex(),d=O.getIndex(),u=c.getInternalPath(),p=O.parent.getInternalPath(),x.forEach(function(e){O.parent.moveBefore(e,O)}),this.focus(n.focusElement||this._getElementName(w)),this.editor._onAction("moveNodes",{count:x.length,fieldNames:x.map(o),oldParentPath:c.getInternalPath(),newParentPath:S.parent.getInternalPath(),oldParentPathRedo:u,newParentPathRedo:p,oldIndexRedo:h,newIndexRedo:d,oldIndex:l.getIndex(),newIndex:S.getIndex(),oldSelection:a,newSelection:this.editor.getDomSelection()})),A=!0}A&&(e.preventDefault(),e.stopPropagation())},n.prototype._onExpand=function(e){if(e){var t=this.dom.tr.parentNode,i=t.parentNode,n=i.scrollTop;i.removeChild(t)}this.expanded?this.collapse(e):this.expand(e),e&&(i.appendChild(t),i.scrollTop=n)},n.prototype._showColorPicker=function(){if("function"==typeof this.editor.options.onColorPicker&&this.dom.color){var e=this;e._deleteDomColor(),e.updateDom();var t=l(this.dom.color,this.editor.frame);this.editor.options.onColorPicker(t,this.value,function(t){"string"==typeof t&&t!==e.value&&(e._deleteDomColor(),e.value=t,e.updateDom(),e._debouncedOnChangeValue())})}},n.prototype.getFieldNames=function(e){return"object"===this.type?this.childs.filter(function(t){return t!==e}).map(function(e){return e.field}):[]},n.onRemove=function(e){if(!Array.isArray(e))return n.onRemove([e]);if(e&&e.length>0){var t=e[0],i=t.parent,o=t.editor,s=t.getIndex();o.highlighter.unhighlight();var a=o.getDomSelection();n.blurNodes(e);var l=o.getDomSelection(),c=e.map(r);e.forEach(function(e){e.parent._remove(e)}),o._onAction("removeNodes",{nodes:e,paths:c,parentPath:i.getInternalPath(),index:s,oldSelection:a,newSelection:l})}},n.onDuplicate=function(e){if(!Array.isArray(e))return n.onDuplicate([e]);if(e&&e.length>0){var t=e[e.length-1],i=t.parent,o=t.editor;o.deselect(o.multiselection.nodes);var s=o.getDomSelection(),a=t,l=e.map(function(e){var t=e.clone();if("object"===e.parent.type){var n=e.parent.getFieldNames();t.field=f.findUniqueName(e.field,n)}return i.insertAfter(t,a),a=t,t});1===e.length?l[0].focus():o.select(l);var c=o.getDomSelection();o._onAction("duplicateNodes",{paths:e.map(r),clonePaths:l.map(r),afterPath:t.getInternalPath(),parentPath:i.getInternalPath(),oldSelection:s,newSelection:c})}},n.prototype._onInsertBefore=function(e,t,i){var r=this.editor.getDomSelection(),o=new n(this.editor,{field:void 0!=e?e:"",value:void 0!=t?t:"",type:i});o.expand(!0);var s=this.getInternalPath();this.parent.insertBefore(o,this),this.editor.highlighter.unhighlight(),o.focus("field");var a=this.editor.getDomSelection();this.editor._onAction("insertBeforeNodes",{nodes:[o],paths:[o.getInternalPath()],beforePath:s,parentPath:this.parent.getInternalPath(),oldSelection:r,newSelection:a})},n.prototype._onInsertAfter=function(e,t,i){var r=this.editor.getDomSelection(),o=new n(this.editor,{field:void 0!=e?e:"",value:void 0!=t?t:"",type:i});o.expand(!0),this.parent.insertAfter(o,this),this.editor.highlighter.unhighlight(),o.focus("field");var s=this.editor.getDomSelection();this.editor._onAction("insertAfterNodes",{nodes:[o],paths:[o.getInternalPath()],afterPath:this.getInternalPath(),parentPath:this.parent.getInternalPath(),oldSelection:r,newSelection:s})},n.prototype._onAppend=function(e,t,i){var r=this.editor.getDomSelection(),o=new n(this.editor,{field:void 0!=e?e:"",value:void 0!=t?t:"",type:i});o.expand(!0),this.parent.appendChild(o),this.editor.highlighter.unhighlight(),o.focus("field");var s=this.editor.getDomSelection();this.editor._onAction("appendNodes",{nodes:[o],paths:[o.getInternalPath()],parentPath:this.parent.getInternalPath(),oldSelection:r,newSelection:s})},n.prototype._onChangeType=function(e){var t=this.type;if(e!=t){var i=this.editor.getDomSelection();this.changeType(e);var n=this.editor.getDomSelection();this.editor._onAction("changeType",{path:this.getInternalPath(),oldType:t,newType:e,oldSelection:i,newSelection:n})}},n.prototype.sort=function(e,t){if(this._hasChilds()){this.hideChilds();var i=this.childs;this.childs=this.childs.concat();var n="desc"===t?-1:1;"object"===this.type?this.childs.sort(function(e,t){return n*a(e.field,t.field)}):this.childs.sort(function(t,i){var r=t.getNestedChild(e),o=i.getNestedChild(e);if(!r)return n;if(!o)return-n;var s=r.value,l=o.value;return"string"!=typeof s&&"string"!=typeof l?s>l?n:s/g,">").replace(/ /g,"  ").replace(/^ /," ").replace(/ $/," "),i=JSON.stringify(t),n=i.substring(1,i.length-1);return!0===this.editor.options.escapeUnicode&&(n=f.escapeUnicodeChars(n)),n},n.prototype._unescapeHTML=function(e){var t='"'+this._escapeJSON(e)+'"';return f.parse(t).replace(/</g,"<").replace(/>/g,">").replace(/ |\u00A0/g," ").replace(/&/g,"&")},n.prototype._escapeJSON=function(e){for(var t="",i=0;i="a"&&e<="z"||e>="A"&&e<="Z"||"_"===e}function a(e){return e>="0"&&e<="9"||"-"===e}function l(e){return e>="a"&&e<="z"||e>="A"&&e<="Z"||e>="0"&&e<="9"||"_"===e}function c(){}function h(){}function d(e){this.runtime=e}function u(e){this._interpreter=e,this.functionTable={abs:{_func:this._functionAbs,_signature:[{types:[v]}]},avg:{_func:this._functionAvg,_signature:[{types:[A]}]},ceil:{_func:this._functionCeil,_signature:[{types:[v]}]},contains:{_func:this._functionContains,_signature:[{types:[w,b]},{types:[y]}]},ends_with:{_func:this._functionEndsWith,_signature:[{types:[w]},{types:[w]}]},floor:{_func:this._functionFloor,_signature:[{types:[v]}]},length:{_func:this._functionLength,_signature:[{types:[w,b,C]}]},map:{_func:this._functionMap,_signature:[{types:[E]},{types:[b]}]},max:{_func:this._functionMax,_signature:[{types:[A,F]}]},merge:{_func:this._functionMerge,_signature:[{types:[C],variadic:!0}]},max_by:{_func:this._functionMaxBy,_signature:[{types:[b]},{types:[E]}]},sum:{_func:this._functionSum,_signature:[{types:[A]}]},starts_with:{_func:this._functionStartsWith,_signature:[{types:[w]},{types:[w]}]},min:{_func:this._functionMin,_signature:[{types:[A,F]}]},min_by:{_func:this._functionMinBy,_signature:[{types:[b]},{types:[E]}]},type:{_func:this._functionType,_signature:[{types:[y]}]},keys:{_func:this._functionKeys,_signature:[{types:[C]}]},values:{_func:this._functionValues,_signature:[{types:[C]}]},sort:{_func:this._functionSort,_signature:[{types:[F,A]}]},sort_by:{_func:this._functionSortBy,_signature:[{types:[b]},{types:[E]}]},join:{_func:this._functionJoin,_signature:[{types:[w]},{types:[F]}]},reverse:{_func:this._functionReverse,_signature:[{types:[w,b]}]},to_array:{_func:this._functionToArray,_signature:[{types:[y]}]},to_string:{_func:this._functionToString,_signature:[{types:[y]}]},to_number:{_func:this._functionToNumber,_signature:[{types:[y]}]},not_null:{_func:this._functionNotNull,_signature:[{types:[y],variadic:!0}]}}}function p(e){return(new h).parse(e)}function f(e){return(new c).tokenize(e)}function m(e,t){var i=new h,n=new u,r=new d(n);n._interpreter=r;var o=i.parse(t);return r.search(o,e)}var g;g="function"==typeof String.prototype.trimLeft?function(e){return e.trimLeft()}:function(e){return e.match(/^\s*(.*)/)[1]};var v=0,y=1,w=2,b=3,C=4,E=6,A=8,F=9,x={".":"Dot","*":"Star",",":"Comma",":":"Colon","{":"Lbrace","}":"Rbrace","]":"Rbracket","(":"Lparen",")":"Rparen","@":"Current"},S={"<":!0,">":!0,"=":!0,"!":!0},_={" ":!0,"\t":!0,"\n":!0};c.prototype={tokenize:function(e){var t=[];this._current=0;for(var i,n,r;this._current"===i?"="===e[this._current]?(this._current++,{type:"GTE",value:">=",start:t}):{type:"GT",value:">",start:t}:"="===i&&"="===e[this._current]?(this._current++,{type:"EQ",value:"==",start:t}):void 0},_consumeLiteral:function(e){this._current++;for(var t,i=this._current,n=e.length;"`"!==e[this._current]&&this._current=0)return!0;if(i.indexOf(e)>=0)return!0;if(!(n.indexOf(e[0])>=0))return!1;try{return JSON.parse(e),!0}catch(e){return!1}}};var k={};k.EOF=0,k.UnquotedIdentifier=0,k.QuotedIdentifier=0,k.Rbracket=0,k.Rparen=0,k.Comma=0,k.Rbrace=0,k.Number=0,k.Current=0,k.Expref=0,k.Pipe=1,k.Or=2,k.And=3,k.EQ=5,k.GT=5,k.LT=5,k.GTE=5,k.LTE=5,k.NE=5,k.Flatten=9,k.Star=20,k.Filter=21,k.Dot=40,k.Not=45,k.Lbrace=50,k.Lbracket=55,k.Lparen=60,h.prototype={parse:function(e){this._loadTokens(e),this.index=0;var t=this.expression(0);if("EOF"!==this._lookahead(0)){var i=this._lookaheadToken(0),n=new Error("Unexpected token type: "+i.type+", value: "+i.value);throw n.name="ParserError",n}return t},_loadTokens:function(e){var t=new c,i=t.tokenize(e);i.push({type:"EOF",value:"",start:e.length}),this.tokens=i},expression:function(e){var t=this._lookaheadToken(0);this._advance();for(var i=this.nud(t),n=this._lookahead(0);e=0?this.expression(e):"Lbracket"===t?(this._match("Lbracket"),this._parseMultiselectList()):"Lbrace"===t?(this._match("Lbrace"),this._parseMultiselectHash()):void 0},_parseProjectionRHS:function(e){var t;if(k[this._lookahead(0)]<10)t={type:"Identity"};else if("Lbracket"===this._lookahead(0))t=this.expression(e);else if("Filter"===this._lookahead(0))t=this.expression(e);else{if("Dot"!==this._lookahead(0)){var i=this._lookaheadToken(0),n=new Error("Sytanx error, unexpected token: "+i.value+"("+i.type+")");throw n.name="ParserError",n}this._match("Dot"),t=this._parseDotRHS(e)}return t},_parseMultiselectList:function(){for(var e=[];"Rbracket"!==this._lookahead(0);){var t=this.expression(0);if(e.push(t),"Comma"===this._lookahead(0)&&(this._match("Comma"),"Rbracket"===this._lookahead(0)))throw new Error("Unexpected token Rbracket")}return this._match("Rbracket"),{type:"MultiSelectList",children:e}},_parseMultiselectHash:function(){for(var e,t,i,n,r=[],o=["UnquotedIdentifier","QuotedIdentifier"];;){if(e=this._lookaheadToken(0),o.indexOf(e.type)<0)throw new Error("Expecting an identifier token, got: "+e.type);if(t=e.value,this._advance(),this._match("Colon"),i=this.expression(0),n={type:"KeyValuePair",name:t,value:i},r.push(n),"Comma"===this._lookahead(0))this._match("Comma");else if("Rbrace"===this._lookahead(0)){this._match("Rbrace");break}}return{type:"MultiSelectHash",children:r}}},d.prototype={search:function(e,t){return this.visit(e,t)},visit:function(e,s){var a,l,c,h,d,u,p,f,m;switch(e.type){case"Field":return null===s?null:i(s)?(u=s[e.name],void 0===u?null:u):null;case"Subexpression":for(c=this.visit(e.children[0],s),m=1;m0)for(m=w;mb;m+=C)c.push(s[m]);return c;case"Projection":var E=this.visit(e.children[0],s);if(!t(E))return null;for(f=[],m=0;md;break;case"GTE":c=h>=d;break;case"LT":c=h=e&&(t=i<0?e-1:e),t}},u.prototype={callFunction:function(e,t){var i=this.functionTable[e];if(void 0===i)throw new Error("Unknown function: "+e+"()");return this._validateArgs(e,t,i._signature),i._func.call(this,t)},_validateArgs:function(e,t,i){var n;if(i[i.length-1].variadic){if(t.length=0;n--)i+=t[n];return i}var r=e[0].slice(0);return r.reverse(),r},_functionAbs:function(e){return Math.abs(e[0])},_functionCeil:function(e){return Math.ceil(e[0])},_functionAvg:function(e){for(var t=0,i=e[0],n=0;n=0},_functionFloor:function(e){return Math.floor(e[0])},_functionLength:function(e){return i(e[0])?Object.keys(e[0]).length:e[0].length},_functionMap:function(e){for(var t=[],i=this._interpreter,n=e[0],r=e[1],o=0;o0){if(this._getTypeName(e[0][0])===v)return Math.max.apply(Math,e[0]);for(var t=e[0],i=t[0],n=1;n0){if(this._getTypeName(e[0][0])===v)return Math.min.apply(Math,e[0]);for(var t=e[0],i=t[0],n=1;na?1:ss&&(s=i,t=r[a]);return t},_functionMinBy:function(e){for(var t,i,n=e[1],r=e[0],o=this.createKeyFunction(n,[v,w]),s=1/0,a=0;am)return 1}for(var g=0,v=Math.max(u.length,p.length);gr)return 1}return 0}},function(e,t,i){"use strict";function n(e){function t(e){this.editor=e,this.dom={}}return t.prototype=new e,t.prototype.getDom=function(){var e=this.dom;if(e.tr)return e.tr;this._updateEditability();var t=document.createElement("tr");if(t.className="jsoneditor-append",t.node=this,e.tr=t,"tree"===this.editor.options.mode){e.tdDrag=document.createElement("td");var i=document.createElement("td");e.tdMenu=i;var n=document.createElement("button");n.type="button",n.className="jsoneditor-button jsoneditor-contextmenu",n.title="Click to open the actions menu (Ctrl+M)",e.menu=n,i.appendChild(e.menu)}var r=document.createElement("td"),o=document.createElement("div");return o.innerHTML="("+s("empty")+")",o.className="jsoneditor-readonly",r.appendChild(o),e.td=r,e.text=o,this.updateDom(),t},t.prototype.getPath=function(){return null},t.prototype.getIndex=function(){return null},t.prototype.updateDom=function(e){var t=this.dom,i=t.td;i&&(i.style.paddingLeft=24*this.getLevel()+26+"px");var n=t.text;n&&(n.innerHTML="("+s("empty")+" "+this.parent.type+")");var r=t.tr;this.isVisible()?t.tr.firstChild||(t.tdDrag&&r.appendChild(t.tdDrag),t.tdMenu&&r.appendChild(t.tdMenu),r.appendChild(i)):t.tr.firstChild&&(t.tdDrag&&r.removeChild(t.tdDrag),t.tdMenu&&r.removeChild(t.tdMenu),r.removeChild(i))},t.prototype.isVisible=function(){return 0==this.parent.childs.length},t.prototype.showContextMenu=function(t,i){var n=this,r=e.TYPE_TITLES,a=[{text:s("auto"),className:"jsoneditor-type-auto",title:r.auto,click:function(){n._onAppend("","","auto")}},{text:s("array"),className:"jsoneditor-type-array",title:r.array,click:function(){n._onAppend("",[])}},{text:s("object"),className:"jsoneditor-type-object",title:r.object,click:function(){n._onAppend("",{})}},{text:s("string"),className:"jsoneditor-type-string",title:r.string,click:function(){n._onAppend("","","string")}}];n.addTemplates(a,!0);var l=[{text:s("appendText"),title:s("appendTitleAuto"),submenuTitle:s("appendSubmenuTitle"),className:"jsoneditor-insert",click:function(){n._onAppend("","","auto")},submenu:a}];this.editor.options.onCreateMenu&&(l=this.editor.options.onCreateMenu(l,{path:n.getPath()})),new o(l,{close:i}).show(t,this.editor.frame)},t.prototype.onEvent=function(e){var t=e.type,i=e.target||e.srcElement,n=this.dom;if(i==n.menu&&("mouseover"==t?this.editor.highlighter.highlight(this.parent):"mouseout"==t&&this.editor.highlighter.unhighlight()),"click"==t&&i==n.menu){var o=this.editor.highlighter;o.highlight(this.parent),o.lock(),r.addClassName(n.menu,"jsoneditor-selected"),this.showContextMenu(n.menu,function(){r.removeClassName(n.menu,"jsoneditor-selected"),o.unlock(),o.unhighlight()})}"keydown"==t&&this.onKeyDown(e)},t}var r=i(62),o=i(68),s=i(66).translate;e.exports=n},function(e,t,i){"use strict";function n(e){function t(e,t){this.editor=e,this.parent=t,this.dom={}}return t.prototype=new e,t.prototype.getDom=function(){if(this.dom.tr)return this.dom.tr;if(this._updateEditability(),!this.dom.tr){var e=this,t=this.parent,i=document.createElement("a");i.appendChild(document.createTextNode(r("showMore"))),i.href="#",i.onclick=function(i){return t.visibleChilds=Math.floor(t.visibleChilds/t.getMaxVisibleChilds()+1)*t.getMaxVisibleChilds(),e.updateDom(),t.showChilds(),i.preventDefault(),!1};var n=document.createElement("a");n.appendChild(document.createTextNode(r("showAll"))),n.href="#",n.onclick=function(i){return t.visibleChilds=1/0,e.updateDom(),t.showChilds(),i.preventDefault(),!1};var o=document.createElement("div"),s=document.createTextNode(this._getShowMoreText());o.className="jsoneditor-show-more",o.appendChild(s),o.appendChild(i),o.appendChild(document.createTextNode(". ")),o.appendChild(n),o.appendChild(document.createTextNode(". "));var a=document.createElement("td");a.appendChild(o);var l=document.createElement("tr");"tree"===this.editor.options.mode&&(l.appendChild(document.createElement("td")),l.appendChild(document.createElement("td"))),l.appendChild(a),l.className="jsoneditor-show-more",this.dom.tr=l,this.dom.moreContents=o,this.dom.moreText=s}return this.updateDom(),this.dom.tr},t.prototype.updateDom=function(e){if(this.isVisible()){if(this.dom.tr.node=this.parent.childs[this.parent.visibleChilds],!this.dom.tr.parentNode){var t=this.parent._getNextTr();t&&t.parentNode.insertBefore(this.dom.tr,t)}this.dom.moreText.nodeValue=this._getShowMoreText(),this.dom.moreContents.style.marginLeft=24*(this.getLevel()+1)+"px"}else this.dom.tr&&this.dom.tr.parentNode&&this.dom.tr.parentNode.removeChild(this.dom.tr)},t.prototype._getShowMoreText=function(){return r("showMoreStatus",{visibleChilds:this.parent.visibleChilds,totalChilds:this.parent.childs.length})+" "},t.prototype.isVisible=function(){return this.parent.expanded&&this.parent.childs.length>this.parent.visibleChilds},t.prototype.onEvent=function(e){"keydown"===e.type&&this.onKeyDown(e)},t}var r=i(66).translate;e.exports=n},function(e,t,i){function n(e,t){var i='
      '+o("sort")+"
      "+o("sortFieldLabel")+'
      '+o("sortDirectionLabel")+'
      ';r({parent:t,content:i,overlayClass:"jsoneditor-modal-overlay",modalClass:"jsoneditor-modal jsoneditor-modal-sort"}).afterCreate(function(t){function i(e){s.value=e,s.className="jsoneditor-button-group jsoneditor-button-group-value-"+s.value}var n=t.modalElem().querySelector("form"),r=t.modalElem().querySelector("#ok"),o=t.modalElem().querySelector("#field"),s=t.modalElem().querySelector("#direction"),a="array"===e.type?e.getChildPaths():["."];a.forEach(function(e){var t=document.createElement("option");t.text=e,t.value=e,o.appendChild(t)}),o.value=e.sortedBy?e.sortedBy.path:a[0],i(e.sortedBy?e.sortedBy.direction:"asc"),s.onclick=function(e){i(e.target.getAttribute("data-value"))},r.onclick=function(i){i.preventDefault(),i.stopPropagation(),t.close();var n=o.value,r="."===n?[]:n.split(".").slice(1);e.sortedBy={path:n,direction:s.value},e.sort(r,s.value)},n&&(n.onsubmit=r.onclick)}).afterClose(function(e){e.destroy()}).show()}var r=i(77),o=i(66).translate;e.exports=n},function(e,t,i){var n,r,o;!function(i,s){"use strict";r=[],n=s,void 0!==(o="function"==typeof n?n.apply(t,r):n)&&(e.exports=o)}(0,function(){"use strict";function e(e){return"object"==typeof Node?e instanceof Node:e&&"object"==typeof e&&"number"==typeof e.nodeType}function t(e){return"string"==typeof e}function i(){var e=[];return{watch:e.push.bind(e),trigger:function(t,i){for(var n=!0,r={detail:i,preventDefault:function(){n=!1}},o=0;o
      '+a("transform")+'

      Enter a JMESPath query to filter, sort, or transform the JSON data.
      To learn JMESPath, go to the interactive tutorial.

      '+a("transformWizardLabel")+'
      '+a("transformWizardFilter")+'
      '+a("transformWizardSortBy")+'
      '+a("transformWizardSelectFields")+'
      '+a("transformQueryLabel")+'
      '+a("transformPreviewLabel")+'
      ';o({parent:t,content:n,overlayClass:"jsoneditor-modal-overlay",modalClass:"jsoneditor-modal jsoneditor-modal-transform",focus:!1}).afterCreate(function(t){function n(e){return"."===e[0]?"."===e?"@":e.slice(1):e}function o(){if(f.value&&m.value&&g.value){var t=f.value,n="@"!==t?["0"].concat(l.parsePath("."+t)):["0"],r=l.get(i,n),o="string"==typeof r?g.value:e._stringCast(g.value);b.value="[? "+t+" "+m.value+" `"+JSON.stringify(o)+"`]"}else b.value="[*]";if(v.value&&y.value){var s=v.value;"desc"===y.value?b.value+=" | reverse(sort_by(@, &"+s+"))":b.value+=" | sort_by(@, &"+s+")"}if(w.value){for(var a=[],c=0;c1&&(b.value+=".{"+a.map(function(e){var t=e.split(".");return t[t.length-1]+": "+e}).join(", ")+"}")}D()}function a(){try{var e=r.search(i,b.value),t=JSON.stringify(e,null,2).split("\n");t.length>h&&(t=t.slice(0,h).concat(["..."])),C.className="jsoneditor-transform-preview",C.value=t.join("\n"),p.disabled=!1}catch(e){C.className="jsoneditor-transform-preview jsoneditor-error",C.value=e.toString(),p.disabled=!0}}var d=t.modalElem(),u=d.querySelector("#wizard"),p=d.querySelector("#ok"),f=d.querySelector("#filterField"),m=d.querySelector("#filterRelation"),g=d.querySelector("#filterValue"),v=d.querySelector("#sortField"),y=d.querySelector("#sortOrder"),w=d.querySelector("#selectFields"),b=d.querySelector("#query"),C=d.querySelector("#preview");Array.isArray(i)||(u.style.fontStyle="italic",u.innerHTML="(wizard not available for objects, only for arrays)"),e.getChildPaths().forEach(function(e){var t=n(e),i=document.createElement("option");i.text=t,i.value=t,f.appendChild(i);var r=document.createElement("option");r.text=t,r.value=t,v.appendChild(r)});var E=e.getChildPaths(!0).filter(function(e){return"."!==e});if(E.length>0)E.forEach(function(e){var t=n(e),i=document.createElement("option");i.text=t,i.value=t,w.appendChild(i)});else{var A=d.querySelector("#selectFieldsPart");A&&(A.style.display="none")}var F=new s(f,{defaultSelected:!1,clearable:!0,allowDeselect:!0,placeholder:"field..."}),x=new s(m,{defaultSelected:!1,clearable:!0,allowDeselect:!0,placeholder:"compare..."}),S=new s(v,{defaultSelected:!1,clearable:!0,allowDeselect:!0,placeholder:"field..."}),_=new s(y,{defaultSelected:!1,clearable:!0,allowDeselect:!0,placeholder:"order..."}),k=new s(w,{multiple:!0,clearable:!0,defaultSelected:!1,placeholder:"select fields..."});F.on("selectr.change",o),x.on("selectr.change",o),g.oninput=o,S.on("selectr.change",o),_.on("selectr.change",o),k.on("selectr.change",o),d.querySelector(".pico-modal-contents").onclick=function(e){"A"!==e.target.nodeName&&e.preventDefault()},b.value=Array.isArray(i)?"[*]":"@";var D=c(a,300);b.oninput=D,D(),p.onclick=function(i){i.preventDefault(),i.stopPropagation(),t.close(),e.transform(b.value)},setTimeout(function(){b.select(),b.focus(),b.selectionStart=3,b.selectionEnd=3})}).afterClose(function(e){e.destroy()}).show()}var r=i(72),o=i(77),s=i(79),a=i(66).translate,l=i(62),c=l.debounce,h=100;e.exports=n},function(e,t){"use strict";function i(e,t){return e.hasOwnProperty(t)&&(!0===e[t]||e[t].length)}function n(e,t,i){e.parentNode?e.parentNode.parentNode||t.appendChild(e.parentNode):t.appendChild(e),s.removeClass(e,"excluded"),i||(e.innerHTML=e.textContent)}var r={defaultSelected:!0,width:"auto",disabled:!1,searchable:!0,clearable:!1,sortSelected:!1,allowDeselect:!1,closeOnScroll:!1,nativeDropdown:!1,placeholder:"Select an option...",taggable:!1,tagPlaceholder:"Enter a tag..."},o=function(){};o.prototype={on:function(e,t){this._events=this._events||{},this._events[e]=this._events[e]||[],this._events[e].push(t)},off:function(e,t){this._events=this._events||{},e in this._events!=!1&&this._events[e].splice(this._events[e].indexOf(t),1)},emit:function(e){if(this._events=this._events||{},e in this._events!=!1)for(var t=0;t-1},truncate:function(e){for(;e.firstChild;)e.removeChild(e.firstChild)}},a=function(){if(this.items.length){var e=document.createDocumentFragment();if(this.config.pagination){var t=this.pages.slice(0,this.pageIndex);s.each(t,function(t,i){s.each(i,function(t,i){n(i,e,this.customOption)},this)},this)}else s.each(this.items,function(t,i){n(i,e,this.customOption)},this);e.childElementCount&&(s.removeClass(this.items[this.navIndex],"active"),this.navIndex=e.querySelector(".selectr-option").idx,s.addClass(this.items[this.navIndex],"active")),this.tree.appendChild(e)}},l=function(e){var t=e.target;this.container.contains(t)||!this.opened&&!s.hasClass(this.container,"notice")||this.close()},c=function(e,t){t=t||e;var i=this.customOption?this.config.renderOption(t):e.textContent,n=s.createElement("li",{class:"selectr-option",html:i,role:"treeitem","aria-selected":!1});return n.idx=e.idx,this.items.push(n),e.defaultSelected&&this.defaultSelected.push(e.idx),e.disabled&&(n.disabled=!0,s.addClass(n,"disabled")),n},h=function(){this.requiresPagination=this.config.pagination&&this.config.pagination>0,i(this.config,"width")&&(s.isInt(this.config.width)?this.width=this.config.width+"px":"auto"===this.config.width?this.width="100%":s.includes(this.config.width,"%")&&(this.width=this.config.width)),this.container=s.createElement("div",{class:"selectr-container"}),this.config.customClass&&s.addClass(this.container,this.config.customClass),this.mobileDevice?s.addClass(this.container,"selectr-mobile"):s.addClass(this.container,"selectr-desktop"),this.el.tabIndex=-1,this.config.nativeDropdown||this.mobileDevice?s.addClass(this.el,"selectr-visible"):s.addClass(this.el,"selectr-hidden"),this.selected=s.createElement("div",{class:"selectr-selected",disabled:this.disabled,tabIndex:1,"aria-expanded":!1}),this.label=s.createElement(this.el.multiple?"ul":"span",{class:"selectr-label"});var e=s.createElement("div",{class:"selectr-options-container"});if(this.tree=s.createElement("ul",{class:"selectr-options",role:"tree","aria-hidden":!0,"aria-expanded":!1}),this.notice=s.createElement("div",{class:"selectr-notice"}),this.el.setAttribute("aria-hidden",!0),this.disabled&&(this.el.disabled=!0),this.el.multiple&&(s.addClass(this.label,"selectr-tags"),s.addClass(this.container,"multiple"),this.tags=[],this.selectedValues=this.getSelectedProperties("value"),this.selectedIndexes=this.getSelectedProperties("idx")),this.selected.appendChild(this.label),this.config.clearable&&(this.selectClear=s.createElement("button",{class:"selectr-clear",type:"button"}),this.container.appendChild(this.selectClear),s.addClass(this.container,"clearable")),this.config.taggable){var t=s.createElement("li",{class:"input-tag"});this.input=s.createElement("input",{class:"selectr-tag-input",placeholder:this.config.tagPlaceholder,tagIndex:0,autocomplete:"off",autocorrect:"off",autocapitalize:"off",spellcheck:"false",role:"textbox",type:"search"}),t.appendChild(this.input),this.label.appendChild(t),s.addClass(this.container,"taggable"),this.tagSeperators=[","],this.config.tagSeperators&&(this.tagSeperators=this.tagSeperators.concat(this.config.tagSeperators))}this.config.searchable&&(this.input=s.createElement("input",{class:"selectr-input",tagIndex:-1,autocomplete:"off",autocorrect:"off",autocapitalize:"off",spellcheck:"false",role:"textbox",type:"search"}),this.inputClear=s.createElement("button",{class:"selectr-input-clear",type:"button"}),this.inputContainer=s.createElement("div",{class:"selectr-input-container"}),this.inputContainer.appendChild(this.input),this.inputContainer.appendChild(this.inputClear),e.appendChild(this.inputContainer)),e.appendChild(this.notice),e.appendChild(this.tree),this.items=[],this.options=[],this.el.options.length&&(this.options=[].slice.call(this.el.options));var n=!1,r=0;if(this.el.children.length&&s.each(this.el.children,function(e,t){"OPTGROUP"===t.nodeName?(n=s.createElement("ul",{class:"selectr-optgroup",role:"group",html:"
    • "+t.label+"
    • "}),s.each(t.children,function(e,t){t.idx=r,n.appendChild(c.call(this,t,n)),r++},this)):(t.idx=r,c.call(this,t),r++)},this),this.config.data&&Array.isArray(this.config.data)){this.data=[];var o,a=!1;n=!1,r=0,s.each(this.config.data,function(e,t){i(t,"children")?(a=s.createElement("optgroup",{label:t.text}),n=s.createElement("ul",{class:"selectr-optgroup",role:"group",html:"
    • "+t.text+"
    • "}),s.each(t.children,function(e,t){o=new Option(t.text,t.value,!1,t.hasOwnProperty("selected")&&!0===t.selected),o.disabled=i(t,"disabled"),this.options.push(o),a.appendChild(o),o.idx=r,n.appendChild(c.call(this,o,t)),this.data[r]=t,r++},this)):(o=new Option(t.text,t.value,!1,t.hasOwnProperty("selected")&&!0===t.selected),o.disabled=i(t,"disabled"),this.options.push(o),o.idx=r,c.call(this,o,t),this.data[r]=t,r++)},this)}this.setSelected(!0);var l;this.navIndex=0;for(var h=0;h0)&&this.change(this.navIndex);var t,i=this.items[this.navIndex];switch(e.which){case 38:t=0,this.navIndex>0&&this.navIndex--;break;case 40:t=1,this.navIndexthis.tree.lastElementChild.idx){this.navIndex=this.tree.lastElementChild.idx;break}if(this.navIndexthis.optsRect.top+this.optsRect.height&&(this.tree.scrollTop=this.tree.scrollTop+(n.top+n.height-(this.optsRect.top+this.optsRect.height))),this.navIndex===this.tree.childElementCount-1&&this.requiresPagination&&f.call(this)):0===this.navIndex?this.tree.scrollTop=0:n.top-this.optsRect.top<0&&(this.tree.scrollTop=this.tree.scrollTop+(n.top-this.optsRect.top)),i&&s.removeClass(i,"active"),s.addClass(this.items[this.navIndex],"active")},u=function(e){var t,i=this,n=document.createDocumentFragment(),r=this.options[e.idx],o=this.data?this.data[e.idx]:r,a=this.customSelected?this.config.renderSelection(o):r.textContent,l=s.createElement("li",{class:"selectr-tag",html:a}),c=s.createElement("button",{class:"selectr-tag-remove",type:"button"});if(l.appendChild(c),l.idx=e.idx,l.tag=r.value,this.tags.push(l),this.config.sortSelected){var h=this.tags.slice();t=function(e,t){e.replace(/(\d+)|(\D+)/g,function(e,i,n){t.push([i||1/0,n||""])})},h.sort(function(e,n){var r,o,s=[],a=[];for(!0===i.config.sortSelected?(r=e.tag,o=n.tag):"text"===i.config.sortSelected&&(r=e.textContent,o=n.textContent),t(r,s),t(o,a);s.length&&a.length;){var l=s.shift(),c=a.shift(),h=l[0]-c[0]||l[1].localeCompare(c[1]);if(h)return h}return s.length-a.length}),s.each(h,function(e,t){n.appendChild(t)}),this.label.innerHTML=""}else n.appendChild(l);this.config.taggable?this.label.insertBefore(n,this.input.parentNode):this.label.appendChild(n)},p=function(e){var t=!1;s.each(this.tags,function(i,n){n.idx===e.idx&&(t=n)},this),t&&(this.label.removeChild(t),this.tags.splice(this.tags.indexOf(t),1))},f=function(){var e=this.tree;if(e.scrollTop>=e.scrollHeight-e.offsetHeight&&this.pageIndex"+i[0]+"")},v=function(e,t){if(t=t||{},!e)throw new Error("You must supply either a HTMLSelectElement or a CSS3 selector string.");if(this.el=e,"string"==typeof e&&(this.el=document.querySelector(e)),null===this.el)throw new Error("The element you passed to Selectr can not be found.");if("select"!==this.el.nodeName.toLowerCase())throw new Error("The element you passed to Selectr is not a HTMLSelectElement.");this.render(t)};v.prototype.render=function(e){if(!this.rendered){this.config=s.extend(r,e),this.originalType=this.el.type,this.originalIndex=this.el.tabIndex,this.defaultSelected=[],this.originalOptionCount=this.el.options.length,(this.config.multiple||this.config.taggable)&&(this.el.multiple=!0),this.disabled=i(this.config,"disabled"),this.opened=!1,this.config.taggable&&(this.config.searchable=!1),this.navigating=!1,this.mobileDevice=!1,/Android|webOS|iPhone|iPad|BlackBerry|Windows Phone|Opera Mini|IEMobile|Mobile/i.test(navigator.userAgent)&&(this.mobileDevice=!0),this.customOption=this.config.hasOwnProperty("renderOption")&&"function"==typeof this.config.renderOption,this.customSelected=this.config.hasOwnProperty("renderSelection")&&"function"==typeof this.config.renderSelection,o.mixin(this),h.call(this),this.bindEvents(),this.update(),this.optsRect=s.rect(this.tree),this.rendered=!0,this.el.multiple||(this.el.selectedIndex=this.selectedIndex);var t=this;setTimeout(function(){t.emit("selectr.init")},20)}},v.prototype.getSelected=function(){return this.el.querySelectorAll("option:checked")},v.prototype.getSelectedProperties=function(e){var t=this.getSelected();return[].slice.call(t).map(function(t){return t[e]}).filter(function(e){return null!==e&&void 0!==e})},v.prototype.bindEvents=function(){var e=this;if(this.events={},this.events.dismiss=l.bind(this),this.events.navigate=d.bind(this),this.events.reset=this.reset.bind(this),this.config.nativeDropdown||this.mobileDevice){this.container.addEventListener("touchstart",function(t){t.changedTouches[0].target===e.el&&e.toggle()}),(this.config.nativeDropdown||this.mobileDevice)&&this.container.addEventListener("click",function(t){t.preventDefault(),t.stopPropagation(),t.target===e.el&&e.toggle()});var t=function(e,t){for(var i,n=[],r=e.slice(0),o=0;o-1?r.splice(i,1):n.push(t[o]);return[n,r]};this.el.addEventListener("change",function(i){if(e.el.multiple){var n=e.getSelectedProperties("idx"),r=t(e.selectedIndexes,n);s.each(r[0],function(t,i){e.select(i)},e),s.each(r[1],function(t,i){e.deselect(i)},e)}else e.el.selectedIndex>-1&&e.select(e.el.selectedIndex)})}this.config.nativeDropdown&&this.container.addEventListener("keydown",function(t){"Enter"===t.key&&e.selected===document.activeElement&&(e.toggle(),setTimeout(function(){e.el.focus()},200))}),this.selected.addEventListener("click",function(t){e.disabled||e.toggle(),t.preventDefault(),t.stopPropagation()}),this.label.addEventListener("click",function(t){ s.hasClass(t.target,"selectr-tag-remove")&&e.deselect(t.target.parentNode.idx)}),this.selectClear&&this.selectClear.addEventListener("click",this.clear.bind(this)),this.tree.addEventListener("mousedown",function(e){e.preventDefault()}),this.tree.addEventListener("click",function(t){t.preventDefault(),t.stopPropagation();var i=s.closest(t.target,function(e){return e&&s.hasClass(e,"selectr-option")});i&&(s.hasClass(i,"disabled")||(s.hasClass(i,"selected")?(e.el.multiple||!e.el.multiple&&e.config.allowDeselect)&&e.deselect(i.idx):e.select(i.idx),e.opened&&!e.el.multiple&&e.close()))}),this.tree.addEventListener("mouseover",function(t){s.hasClass(t.target,"selectr-option")&&(s.hasClass(t.target,"disabled")||(s.removeClass(e.items[e.navIndex],"active"),s.addClass(t.target,"active"),e.navIndex=[].slice.call(e.items).indexOf(t.target)))}),this.config.searchable&&(this.input.addEventListener("focus",function(t){e.searching=!0}),this.input.addEventListener("blur",function(t){e.searching=!1}),this.input.addEventListener("keyup",function(t){e.search(),e.config.taggable||(this.value.length?s.addClass(this.parentNode,"active"):s.removeClass(this.parentNode,"active"))}),this.inputClear.addEventListener("click",function(t){e.input.value=null,m.call(e),e.tree.childElementCount||a.call(e)})),this.config.taggable&&this.input.addEventListener("keyup",function(t){if(e.search(),e.config.taggable&&this.value.length){var i=this.value.trim();if(13===t.which||s.includes(e.tagSeperators,t.key)){s.each(e.tagSeperators,function(e,t){i=i.replace(t,"")});e.add({value:i,text:i,selected:!0},!0)?(e.close(),m.call(e)):(this.value="",e.setMessage("That tag is already in use."))}}}),this.update=s.debounce(function(){e.opened&&e.config.closeOnScroll&&e.close(),e.width&&(e.container.style.width=e.width),e.invert()},50),this.requiresPagination&&(this.paginateItems=s.debounce(function(){f.call(this)},50),this.tree.addEventListener("scroll",this.paginateItems.bind(this))),document.addEventListener("click",this.events.dismiss),window.addEventListener("keydown",this.events.navigate),window.addEventListener("resize",this.update),window.addEventListener("scroll",this.update),this.el.form&&this.el.form.addEventListener("reset",this.events.reset)},v.prototype.setSelected=function(e){if(this.config.data||this.el.multiple||!this.el.options.length||(0===this.el.selectedIndex&&(this.el.options[0].defaultSelected||this.config.defaultSelected||(this.el.selectedIndex=-1)),this.selectedIndex=this.el.selectedIndex,this.selectedIndex>-1&&this.select(this.selectedIndex)),this.config.multiple&&"select-one"===this.originalType&&!this.config.data&&this.el.options[0].selected&&!this.el.options[0].defaultSelected&&(this.el.options[0].selected=!1),s.each(this.options,function(e,t){t.selected&&t.defaultSelected&&this.select(t.idx)},this),this.config.selectedValue&&this.setValue(this.config.selectedValue),this.config.data){!this.el.multiple&&this.config.defaultSelected&&this.el.selectedIndex<0&&this.select(0);var t=0;s.each(this.config.data,function(e,n){i(n,"children")?s.each(n.children,function(e,i){i.hasOwnProperty("selected")&&!0===i.selected&&this.select(t),t++},this):(n.hasOwnProperty("selected")&&!0===n.selected&&this.select(t),t++)},this)}},v.prototype.destroy=function(){this.rendered&&(this.emit("selectr.destroy"),"select-one"===this.originalType&&(this.el.multiple=!1),this.config.data&&(this.el.innerHTML=""),s.removeClass(this.el,"selectr-hidden"),this.el.form&&s.off(this.el.form,"reset",this.events.reset),s.off(document,"click",this.events.dismiss),s.off(document,"keydown",this.events.navigate),s.off(window,"resize",this.update),s.off(window,"scroll",this.update),this.container.parentNode.replaceChild(this.el,this.container),this.rendered=!1)},v.prototype.change=function(e){var t=this.items[e],i=this.options[e];i.disabled||(i.selected&&s.hasClass(t,"selected")?this.deselect(e):this.select(e),this.opened&&!this.el.multiple&&this.close())},v.prototype.select=function(e){var t=this.items[e],i=[].slice.call(this.el.options),n=this.options[e];if(this.el.multiple){if(s.includes(this.selectedIndexes,e))return!1;if(this.config.maxSelections&&this.tags.length===this.config.maxSelections)return this.setMessage("A maximum of "+this.config.maxSelections+" items can be selected.",!0),!1;this.selectedValues.push(n.value),this.selectedIndexes.push(e),u.call(this,t)}else{var r=this.data?this.data[e]:n;this.label.innerHTML=this.customSelected?this.config.renderSelection(r):n.textContent,this.selectedValue=n.value,this.selectedIndex=e,s.each(this.options,function(t,i){var n=this.items[t];t!==e&&(n&&s.removeClass(n,"selected"),i.selected=!1,i.removeAttribute("selected"))},this)}s.includes(i,n)||this.el.add(n),t.setAttribute("aria-selected",!0),s.addClass(t,"selected"),s.addClass(this.container,"has-selected"),n.selected=!0,n.setAttribute("selected",""),this.emit("selectr.change",n),this.emit("selectr.select",n)},v.prototype.deselect=function(e,t){var i=this.items[e],n=this.options[e];if(this.el.multiple){var r=this.selectedIndexes.indexOf(e);this.selectedIndexes.splice(r,1);var o=this.selectedValues.indexOf(n.value);this.selectedValues.splice(o,1),p.call(this,i),this.tags.length||s.removeClass(this.container,"has-selected")}else{if(!t&&!this.config.clearable&&!this.config.allowDeselect)return!1;this.label.innerHTML="",this.selectedValue=null,this.el.selectedIndex=this.selectedIndex=-1,s.removeClass(this.container,"has-selected")}this.items[e].setAttribute("aria-selected",!1),s.removeClass(this.items[e],"selected"),n.selected=!1,n.removeAttribute("selected"),this.emit("selectr.change",null),this.emit("selectr.deselect",n)},v.prototype.setValue=function(e){var t=Array.isArray(e);if(t||(e=e.toString().trim()),!this.el.multiple&&t)return!1;s.each(this.options,function(i,n){(t&&s.includes(e.toString(),n.value)||n.value===e)&&this.change(n.idx)},this)},v.prototype.getValue=function(e,t){var i;if(this.el.multiple)e?this.selectedIndexes.length&&(i={},i.values=[],s.each(this.selectedIndexes,function(e,t){var n=this.options[t];i.values[e]={value:n.value,text:n.textContent}},this)):i=this.selectedValues.slice();else if(e){var n=this.options[this.selectedIndex];i={value:n.value,text:n.textContent}}else i=this.selectedValue;return e&&t&&(i=JSON.stringify(i)),i},v.prototype.add=function(e,t){if(e){if(this.data=this.data||[],this.items=this.items||[],this.options=this.options||[],Array.isArray(e))s.each(e,function(e,i){this.add(i,t)},this);else if("[object Object]"===Object.prototype.toString.call(e)){if(t){var i=!1;if(s.each(this.options,function(t,n){n.value.toLowerCase()===e.value.toLowerCase()&&(i=!0)}),i)return!1}var n=s.createElement("option",e);return this.data.push(e),this.options.push(n),n.idx=this.options.length>0?this.options.length-1:0,c.call(this,n),e.selected&&this.select(n.idx),n}return this.setPlaceholder(),this.config.pagination&&this.paginate(),!0}},v.prototype.remove=function(e){var t=[];if(Array.isArray(e)?s.each(e,function(i,n){s.isInt(n)?t.push(this.getOptionByIndex(n)):"string"==typeof e&&t.push(this.getOptionByValue(n))},this):s.isInt(e)?t.push(this.getOptionByIndex(e)):"string"==typeof e&&t.push(this.getOptionByValue(e)),t.length){var i;s.each(t,function(e,t){i=t.idx,this.el.remove(t),this.options.splice(i,1);var n=this.items[i].parentNode;n&&n.removeChild(this.items[i]),this.items.splice(i,1),s.each(this.options,function(e,t){t.idx=e,this.items[e].idx=e},this)},this),this.setPlaceholder(),this.config.pagination&&this.paginate()}},v.prototype.removeAll=function(){this.clear(!0),s.each(this.el.options,function(e,t){this.el.remove(t)},this),s.truncate(this.tree),this.items=[],this.options=[],this.data=[],this.navIndex=0,this.requiresPagination&&(this.requiresPagination=!1,this.pageIndex=1,this.pages=[]),this.setPlaceholder()},v.prototype.search=function(e){if(!this.navigating){e=e||this.input.value;var t=document.createDocumentFragment();if(this.removeMessage(),s.truncate(this.tree),e.length>1)if(s.each(this.options,function(i,r){var o=this.items[r.idx];s.includes(r.textContent.toLowerCase(),e.toLowerCase())&&!r.disabled?(n(o,t,this.customOption),s.removeClass(o,"excluded"),this.customOption||(o.innerHTML=g(e,r))):s.addClass(o,"excluded")},this),t.childElementCount){var i=this.items[this.navIndex],r=t.firstElementChild;s.removeClass(i,"active"),this.navIndex=r.idx,s.addClass(r,"active")}else this.config.taggable||this.setMessage("no results.");else a.call(this);this.tree.appendChild(t)}},v.prototype.toggle=function(){this.disabled||(this.opened?this.close():this.open())},v.prototype.open=function(){var e=this;return!!this.options.length&&(this.opened||this.emit("selectr.open"),this.opened=!0,this.mobileDevice||this.config.nativeDropdown?(s.addClass(this.container,"native-open"),void(this.config.data&&s.each(this.options,function(e,t){this.el.add(t)},this))):(s.addClass(this.container,"open"),a.call(this),this.invert(),this.tree.scrollTop=0,s.removeClass(this.container,"notice"),this.selected.setAttribute("aria-expanded",!0),this.tree.setAttribute("aria-hidden",!1),this.tree.setAttribute("aria-expanded",!0),void(this.config.searchable&&!this.config.taggable&&setTimeout(function(){e.input.focus(),e.input.tabIndex=0},10))))},v.prototype.close=function(){if(this.opened&&this.emit("selectr.close"),this.opened=!1,this.mobileDevice||this.config.nativeDropdown)return void s.removeClass(this.container,"native-open");var e=s.hasClass(this.container,"notice");this.config.searchable&&!e&&(this.input.blur(),this.input.tabIndex=-1,this.searching=!1),e&&(s.removeClass(this.container,"notice"),this.notice.textContent=""),s.removeClass(this.container,"open"),s.removeClass(this.container,"native-open"),this.selected.setAttribute("aria-expanded",!1),this.tree.setAttribute("aria-hidden",!0),this.tree.setAttribute("aria-expanded",!1),s.truncate(this.tree),m.call(this)},v.prototype.enable=function(){this.disabled=!1,this.el.disabled=!1,this.selected.tabIndex=this.originalIndex,this.el.multiple&&s.each(this.tags,function(e,t){t.lastElementChild.tabIndex=0}),s.removeClass(this.container,"selectr-disabled")},v.prototype.disable=function(e){e||(this.el.disabled=!0),this.selected.tabIndex=-1,this.el.multiple&&s.each(this.tags,function(e,t){t.lastElementChild.tabIndex=-1}),this.disabled=!0,s.addClass(this.container,"selectr-disabled")},v.prototype.reset=function(){this.disabled||(this.clear(),this.setSelected(!0),s.each(this.defaultSelected,function(e,t){this.select(t)},this),this.emit("selectr.reset"))},v.prototype.clear=function(e){if(this.el.multiple){if(this.selectedIndexes.length){var t=this.selectedIndexes.slice();s.each(t,function(e,t){this.deselect(t)},this)}}else this.selectedIndex>-1&&this.deselect(this.selectedIndex,e);this.emit("selectr.clear")},v.prototype.serialise=function(e){var t=[];return s.each(this.options,function(e,i){var n={value:i.value,text:i.textContent};i.selected&&(n.selected=!0),i.disabled&&(n.disabled=!0),t[e]=n}),e?JSON.stringify(t):t},v.prototype.serialize=function(e){return this.serialise(e)},v.prototype.setPlaceholder=function(e){e=e||this.config.placeholder||this.el.getAttribute("placeholder"),this.options.length||(e="No options available"),this.placeEl.innerHTML=e},v.prototype.paginate=function(){if(this.items.length){var e=this;return this.pages=this.items.map(function(t,i){return i%e.config.pagination==0?e.items.slice(i,i+e.config.pagination):null}).filter(function(e){return e}),this.pages}},v.prototype.setMessage=function(e,t){t&&this.close(),s.addClass(this.container,"notice"),this.notice.textContent=e},v.prototype.removeMessage=function(){s.removeClass(this.container,"notice"),this.notice.innerHTML=""},v.prototype.invert=function(){var e=s.rect(this.selected),t=this.tree.parentNode.offsetHeight,i=window.innerHeight;e.top+e.height+t>i?(s.addClass(this.container,"inverted"),this.isInverted=!0):(s.removeClass(this.container,"inverted"),this.isInverted=!1),this.optsRect=s.rect(this.tree)},v.prototype.getOptionByIndex=function(e){return this.options[e]},v.prototype.getOptionByValue=function(e){for(var t=!1,i=0,n=this.options.length;i/g,">"),a.getBoundingClientRect().right}e=e||{},e.confirmKeys=e.confirmKeys||[39,35,9],e.caseSensitive=e.caseSensitive||!1;var n="",r="",o=document.createElement("div");o.style.position="relative",o.style.outline="0",o.style.border="0",o.style.margin="0",o.style.padding="0";var s=document.createElement("div");s.className="autocomplete dropdown",s.style.position="absolute",s.style.visibility="hidden";var a,l,c={onArrowDown:function(){},onArrowUp:function(){},onEnter:function(){},onTab:function(){},startFrom:0,options:[],element:null,elementHint:null,elementStyle:null,wrapper:o,show:function(e,t,i){this.startFrom=t,this.wrapper.remove(),this.elementHint&&(this.elementHint.remove(),this.elementHint=null),""==n&&(n=window.getComputedStyle(e).getPropertyValue("font-size")),""==r&&(r=window.getComputedStyle(e).getPropertyValue("font-family"));e.getBoundingClientRect().right,e.getBoundingClientRect().left;s.style.marginLeft="0",s.style.marginTop=e.getBoundingClientRect().height+"px",this.options=i,this.element!=e&&(this.element=e,this.elementStyle={zIndex:this.element.style.zIndex,position:this.element.style.position,backgroundColor:this.element.style.backgroundColor,borderColor:this.element.style.borderColor}),this.element.style.zIndex=3,this.element.style.position="relative",this.element.style.backgroundColor="transparent",this.element.style.borderColor="transparent",this.elementHint=e.cloneNode(),this.elementHint.className="autocomplete hint",this.elementHint.style.zIndex=2,this.elementHint.style.position="absolute",this.elementHint.onfocus=function(){this.element.focus()}.bind(this),this.element.addEventListener&&(this.element.removeEventListener("keydown",d),this.element.addEventListener("keydown",d,!1),this.element.removeEventListener("blur",u),this.element.addEventListener("blur",u,!1)),o.appendChild(this.elementHint),o.appendChild(s),e.parentElement.appendChild(o),this.repaint(e)},setText:function(e){this.element.innerText=e},getText:function(){return this.element.innerText},hideDropDown:function(){this.wrapper.remove(),this.elementHint&&(this.elementHint.remove(),this.elementHint=null,h.hide(),this.element.style.zIndex=this.elementStyle.zIndex,this.element.style.position=this.elementStyle.position,this.element.style.backgroundColor=this.elementStyle.backgroundColor,this.element.style.borderColor=this.elementStyle.borderColor)},repaint:function(t){var n=t.innerText;n=n.replace("\n","");var r=(this.startFrom,this.options,this.options.length),o=n.substring(this.startFrom);l=n.substring(0,this.startFrom);for(var a=0;a"+o[f].substring(i.length)+"",n.push(m),t.appendChild(m)}0!==n.length&&(1===n.length&&(i.toLowerCase()===n[0].__hint.toLowerCase()&&!e.caseSensitive||i===n[0].__hint&&e.caseSensitive)||n.length<2||(c.highlight(0),u>3*p?(t.style.maxHeight=u+"px",t.style.top="",t.style.bottom="100%"):(t.style.top="100%",t.style.bottom="",t.style.maxHeight=p+"px"),t.style.visibility="visible"))},highlight:function(e){-1!=o&&n[o]&&(n[o].className="item"),n[e].className="item hover",o=e},move:function(e){return"hidden"===t.style.visibility?"":r+e===-1||r+e===n.length?n[r].__hint:(r+=e,c.highlight(r),n[r].__hint)},onmouseselection:function(){}};return c}(s,c),d=function(i){i=i||window.event;var n=i.keyCode;if(null!=this.elementHint&&33!=n&&34!=n){if(27==n)return c.hideDropDown(),c.element.focus(),i.preventDefault(),void i.stopPropagation();var r=this.element.innerText;r=r.replace("\n","");this.startFrom;if(e.confirmKeys.indexOf(n)>=0)return 9==n&&0==this.elementHint.innerText.length&&c.onTab(),void(this.elementHint.innerText.length>0&&this.element.innerText!=this.elementHint.realInnerText&&(this.element.innerText=this.elementHint.realInnerText,c.hideDropDown(),t(this.element),9==n&&(c.element.focus(),i.preventDefault(),i.stopPropagation())));if(13!=n){if(40==n){var o=r.substring(this.startFrom),a=h.move(1);return""==a&&c.onArrowDown(),this.elementHint.innerText=l+o+a.substring(o.length),this.elementHint.realInnerText=l+a,i.preventDefault(),void i.stopPropagation()}if(38==n){var o=r.substring(this.startFrom),a=h.move(-1);return""==a&&c.onArrowUp(),this.elementHint.innerText=l+o+a.substring(o.length),this.elementHint.realInnerText=l+a,i.preventDefault(),void i.stopPropagation()}}else if(0==this.elementHint.innerText.length)c.onEnter();else{var d="hidden"==s.style.visibility;if(h.hide(),d)return c.hideDropDown(),c.element.focus(),void c.onEnter();this.element.innerText=this.elementHint.realInnerText,c.hideDropDown(),t(this.element),i.preventDefault(),i.stopPropagation()}}}.bind(c),u=function(e){c.hideDropDown()}.bind(c);return h.onmouseselection=function(e,i){i.element.innerText=i.elementHint.innerText=l+e,i.hideDropDown(),window.setTimeout(function(){i.element.focus(),t(i.element)},1)},c}e.exports=i},function(e,t,i){"use strict";function n(){try{this.format()}catch(e){}}var r=i(51),o=i(80),s=i(62),a={};a.create=function(e,t){t=t||{},void 0===t.statusBar&&(t.statusBar=!0),t.mainMenuBar=!1!==t.mainMenuBar,this.options=t,t.indentation?this.indentation=Number(t.indentation):this.indentation=2;var n=t.ace?t.ace:r;if(this.mode="code"==t.mode?"code":"text","code"==this.mode&&void 0===n&&(this.mode="text",console.warn("Failed to load Ace editor, falling back to plain text mode. Please use a JSONEditor bundle including Ace, or pass Ace as via the configuration option `ace`.")),this.theme=t.theme||"ace/theme/jsoneditor","ace/theme/jsoneditor"===this.theme&&n)try{i(83)}catch(e){console.error(e)}t.onTextSelectionChange&&this.onTextSelectionChange(t.onTextSelectionChange);var a=this;if(this.container=e,this.dom={},this.aceEditor=void 0,this.textarea=void 0,this.validateSchema=null,this.validationSequence=0,this.annotations=[],this.errorTableVisible=void 0,this._debouncedValidate=s.debounce(this.validate.bind(this),this.DEBOUNCE_INTERVAL),this.width=e.clientWidth,this.height=e.clientHeight,this.frame=document.createElement("div"),this.frame.className="jsoneditor jsoneditor-mode-"+this.options.mode,this.frame.onclick=function(e){e.preventDefault()},this.frame.onkeydown=function(e){a._onKeyDown(e)},this.content=document.createElement("div"),this.content.className="jsoneditor-outer",this.options.mainMenuBar){s.addClassName(this.content,"has-main-menu-bar"),this.menu=document.createElement("div"),this.menu.className="jsoneditor-menu",this.frame.appendChild(this.menu);var l=document.createElement("button");l.type="button",l.className="jsoneditor-format",l.title="Format JSON data, with proper indentation and line feeds (Ctrl+\\)",this.menu.appendChild(l),l.onclick=function(){try{a.format(),a._onChange()}catch(e){a._onError(e)}};var c=document.createElement("button");c.type="button",c.className="jsoneditor-compact",c.title="Compact JSON data, remove all whitespaces (Ctrl+Shift+\\)",this.menu.appendChild(c),c.onclick=function(){try{a.compact(),a._onChange()}catch(e){a._onError(e)}};var h=document.createElement("button");if(h.type="button",h.className="jsoneditor-repair",h.title="Repair JSON: fix quotes and escape characters, remove comments and JSONP notation, turn JavaScript objects into JSON.",this.menu.appendChild(h),h.onclick=function(){try{a.repair(),a._onChange()}catch(e){a._onError(e)}},this.options&&this.options.modes&&this.options.modes.length&&(this.modeSwitcher=new o(this.menu,this.options.modes,this.options.mode,function(e){a.setMode(e),a.modeSwitcher.focus()})),"code"==this.mode){var d=document.createElement("a");d.appendChild(document.createTextNode("powered by ace")),d.href="http://ace.ajax.org",d.target="_blank",d.className="jsoneditor-poweredBy",d.onclick=function(){window.open(d.href,d.target)},this.menu.appendChild(d)}}var u={},p=this.options.onEditable&&typeof("function"===this.options.onEditable)&&!this.options.onEditable(u);if(this.frame.appendChild(this.content),this.container.appendChild(this.frame),"code"==this.mode){this.editorDom=document.createElement("div"),this.editorDom.style.height="100%",this.editorDom.style.width="100%",this.content.appendChild(this.editorDom);var f=n.edit(this.editorDom),m=f.getSession();f.$blockScrolling=1/0,f.setTheme(this.theme),f.setOptions({readOnly:p}),f.setShowPrintMargin(!1),f.setFontSize(13),m.setMode("ace/mode/json"),m.setTabSize(this.indentation),m.setUseSoftTabs(!0),m.setUseWrapMode(!0);var g=m.setAnnotations;m.setAnnotations=function(e){g.call(this,e&&e.length?e:a.annotations)},f.commands.bindKey("Ctrl-L",null),f.commands.bindKey("Command-L",null),this.aceEditor=f,this.hasOwnProperty("editor")||Object.defineProperty(this,"editor",{get:function(){return console.warn('Property "editor" has been renamed to "aceEditor".'),a.aceEditor},set:function(e){console.warn('Property "editor" has been renamed to "aceEditor".'),a.aceEditor=e}}),f.on("change",this._onChange.bind(this)),f.on("changeSelection",this._onSelect.bind(this))}else{var v=document.createElement("textarea");v.className="jsoneditor-text",v.spellcheck=!1,this.content.appendChild(v),this.textarea=v,this.textarea.readOnly=p,null===this.textarea.oninput?this.textarea.oninput=this._onChange.bind(this):this.textarea.onchange=this._onChange.bind(this),v.onselect=this._onSelect.bind(this),v.onmousedown=this._onMouseDown.bind(this),v.onblur=this._onBlur.bind(this)}var y=document.createElement("div");y.className="jsoneditor-validation-errors-container",this.dom.validationErrorsContainer=y,this.frame.appendChild(y);var w=document.createElement("div");if(w.style.display="none",w.className="jsoneditor-additional-errors fadein",w.innerHTML="Scroll for more ▿",this.dom.additionalErrorsIndication=w,y.appendChild(w),t.statusBar){s.addClassName(this.content,"has-status-bar"),this.curserInfoElements={};var b=document.createElement("div");this.dom.statusBar=b,b.className="jsoneditor-statusbar",this.frame.appendChild(b);var C=document.createElement("span");C.className="jsoneditor-curserinfo-label",C.innerText="Ln:";var E=document.createElement("span");E.className="jsoneditor-curserinfo-val",E.innerText="1",b.appendChild(C),b.appendChild(E);var A=document.createElement("span");A.className="jsoneditor-curserinfo-label",A.innerText="Col:";var F=document.createElement("span");F.className="jsoneditor-curserinfo-val",F.innerText="1",b.appendChild(A),b.appendChild(F),this.curserInfoElements.colVal=F,this.curserInfoElements.lnVal=E;var x=document.createElement("span");x.className="jsoneditor-curserinfo-label",x.innerText="characters selected",x.style.display="none";var S=document.createElement("span");S.className="jsoneditor-curserinfo-count",S.innerText="0",S.style.display="none",this.curserInfoElements.countLabel=x,this.curserInfoElements.countVal=S,b.appendChild(S),b.appendChild(x);var _=document.createElement("span");_.className="jsoneditor-validation-error-icon",_.style.display="none";var k=document.createElement("span");k.className="jsoneditor-validation-error-count",k.style.display="none",this.validationErrorIndication={validationErrorIcon:_,validationErrorCount:k},b.appendChild(k),b.appendChild(_),this.parseErrorIndication=document.createElement("span"),this.parseErrorIndication.className="jsoneditor-parse-error-icon",this.parseErrorIndication.style.display="none",b.appendChild(this.parseErrorIndication)}this.setSchema(this.options.schema,this.options.schemaRefs)},a._onChange=function(){if(!this.onChangeDisabled){if(this._debouncedValidate(),this.options.onChange)try{this.options.onChange()}catch(e){console.error("Error in onChange callback: ",e)}if(this.options.onChangeText)try{this.options.onChangeText(this.getText())}catch(e){console.error("Error in onChangeText callback: ",e)}}},a._onSelect=function(){this._updateCursorInfo(),this._emitSelectionChange()},a._onKeyDown=function(e){var t=e.which||e.keyCode,i=!1;220==t&&e.ctrlKey&&(e.shiftKey?(this.compact(),this._onChange()):(this.format(),this._onChange()),i=!0),i&&(e.preventDefault(),e.stopPropagation()),this._updateCursorInfo(),this._emitSelectionChange()},a._onMouseDown=function(){this._updateCursorInfo(),this._emitSelectionChange()},a._onBlur=function(){var e=this;setTimeout(function(){e.isFocused||(e._updateCursorInfo(),e._emitSelectionChange()),e.isFocused=!1})},a._updateCursorInfo=function(){function e(){r.curserInfoElements.countVal.innerText!==n&&(r.curserInfoElements.countVal.innerText=n,r.curserInfoElements.countVal.style.display=n?"inline":"none",r.curserInfoElements.countLabel.style.display=n?"inline":"none"),r.curserInfoElements.lnVal.innerText=t,r.curserInfoElements.colVal.innerText=i}var t,i,n,r=this;if(this.textarea)setTimeout(function(){var o=s.getInputSelection(r.textarea);o.startIndex!==o.endIndex&&(n=o.endIndex-o.startIndex),n&&r.cursorInfo&&r.cursorInfo.line===o.end.row&&r.cursorInfo.column===o.end.column?(t=o.start.row,i=o.start.column):(t=o.end.row,i=o.end.column),r.cursorInfo={line:t,column:i,count:n},r.options.statusBar&&e()},0);else if(this.aceEditor&&this.curserInfoElements){var o=this.aceEditor.getCursorPosition(),a=this.aceEditor.getSelectedText();t=o.row+1,i=o.column+1,n=a.length,r.cursorInfo={line:t,column:i,count:n},this.options.statusBar&&e()}},a._emitSelectionChange=function(){if(this._selectionChangedHandler){var e=this.getTextSelection();this._selectionChangedHandler(e.start,e.end,e.text)}},a._refreshAnnotations=function(){var e=this.aceEditor&&this.aceEditor.getSession();if(e){var t=e.getAnnotations().filter(function(e){return"error"===e.type});e.setAnnotations(t)}},a.destroy=function(){this.aceEditor&&(this.aceEditor.destroy(),this.aceEditor=null),this.frame&&this.container&&this.frame.parentNode==this.container&&this.container.removeChild(this.frame),this.modeSwitcher&&(this.modeSwitcher.destroy(),this.modeSwitcher=null),this.textarea=null,this._debouncedValidate=null},a.compact=function(){var e=this.get(),t=JSON.stringify(e);this.setText(t)},a.format=function(){var e=this.get(),t=JSON.stringify(e,null,this.indentation);this.setText(t)},a.repair=function(){var e=this.getText(),t=s.sanitize(e);this.setText(t)},a.focus=function(){this.textarea&&this.textarea.focus(),this.aceEditor&&this.aceEditor.focus()},a.resize=function(){if(this.aceEditor){this.aceEditor.resize(!1)}},a.set=function(e){this.setText(JSON.stringify(e,null,this.indentation))},a.update=function(e){this.updateText(JSON.stringify(e,null,this.indentation))},a.get=function(){var e,t=this.getText();try{e=s.parse(t)}catch(i){t=s.sanitize(t),e=s.parse(t)}return e},a.getText=function(){return this.textarea?this.textarea.value:this.aceEditor?this.aceEditor.getValue():""},a.setText=function(e){var t;t=!0===this.options.escapeUnicode?s.escapeUnicodeChars(e):e,this.textarea&&(this.textarea.value=t),this.aceEditor&&(this.onChangeDisabled=!0,this.aceEditor.setValue(t,-1),this.onChangeDisabled=!1),this._debouncedValidate()},a.updateText=function(e){this.getText()!==e&&(this.onChangeDisabled=!0,this.setText(e),this.onChangeDisabled=!1)},a.validate=function(){var e,t=!1,i=[],n=[];try{e=this.get(),this.parseErrorIndication&&(this.parseErrorIndication.style.display="none"),t=!0}catch(e){if(this.getText()){this.parseErrorIndication&&(this.parseErrorIndication.style.display="block");var r,o=/\w*line\s*(\d+)\w*/g.exec(e.message);o&&(r=+o[1]),this.parseErrorIndication&&(this.parseErrorIndication.title=isNaN(r)?"parse error - check that the json is valid":"parse error on line "+r),n.push({type:"error",message:e.message.replace(/\n/g,"
      "),line:r})}}if(t){if(this.validateSchema){this.validateSchema(e)||(i=this.validateSchema.errors.map(function(e){return e.type="validation",s.improveSchemaError(e)}))}try{this.validationSequence++;var a=this,l=this.validationSequence;this._validateCustom(e).then(function(e){if(l===a.validationSequence){var t=i.concat(n||[]).concat(e||[]);a._renderErrors(t)}}).catch(function(e){console.error(e)})}catch(e){console.error(e)}}else this._renderErrors(n||[],!0)},a._validateCustom=function(e){if(this.options.onValidate)try{var t=this.options.onValidate(e);return(s.isPromise(t)?t:Promise.resolve(t)).then(function(e){return Array.isArray(e)?e.filter(function(e){var t=s.isValidValidationError(e);return t||console.warn('Ignoring a custom validation error with invalid structure. Expected structure: {path: [...], message: "..."}. Actual error:',e),t}).map(function(e){return{dataPath:s.stringifyPath(e.path),message:e.message}}):null})}catch(e){return Promise.reject(e)}return Promise.resolve(null)},a._renderErrors=function(e,t){var i=this,n=0;this.errorTableVisible=void 0===this.errorTableVisible?!this.aceEditor:this.errorTableVisible,this.dom.validationErrors&&(this.dom.validationErrors.parentNode.removeChild(this.dom.validationErrors),this.dom.validationErrors=null,this.dom.additionalErrorsIndication.style.display="none",this.content.style.marginBottom="",this.content.style.paddingBottom="");var r=this.getText(),o=[];e.reduce(function(e,t){return-1===e.indexOf(t.dataPath)&&e.push(t.dataPath),e},o);var a=s.getPositionForPath(r,o);if(e.length>0)if(this.aceEditor&&(this.annotations=a.map(function(t){var i=e.filter(function(e){return e.dataPath===t.path}),n=i.map(function(e){return e.message}).join("\n");return n?{row:t.line,column:t.column,text:"Schema validation error"+(1!==i.length?"s":"")+": \n"+n,type:"warning",source:"jsoneditor"}:{}}),this._refreshAnnotations()),t?!this.aceEditor:this.errorTableVisible){var l=document.createElement("div");l.innerHTML='
      ';var c=l.getElementsByTagName("tbody")[0];e.forEach(function(e){var t;t="string"==typeof e?'
      '+e+"
      ":""+(e.dataPath||"")+""+e.message+"";var r;if(isNaN(e.line)){if(e.dataPath){var o=a.find(function(t){return t.path===e.dataPath});o&&(r=o.line+1)}}else r=e.line;var s=document.createElement("tr");s.className=isNaN(r)?"":"jump-to-line","error"===e.type?s.className+=" parse-error":(s.className+=" validation-error",++n),s.innerHTML=''+(isNaN(r)?"":"Ln "+r)+""+t,s.onclick=function(){i.isFocused=!0,isNaN(r)||i.setTextSelection({row:r,column:1},{row:r,column:1e3})},c.appendChild(s)}),this.dom.validationErrors=l,this.dom.validationErrorsContainer.appendChild(l),this.dom.additionalErrorsIndication.title=e.length+" errors total",this.dom.validationErrorsContainer.clientHeight0&&0===i.dom.validationErrorsContainer.scrollTop?"block":"none"}):this.dom.validationErrorsContainer.onscroll=void 0;var h=this.dom.validationErrorsContainer.clientHeight+(this.dom.statusBar?this.dom.statusBar.clientHeight:0);this.content.style.marginBottom=-h+"px",this.content.style.paddingBottom=h+"px"}else n=e.reduce(function(e,t){return"validation"===t.type?++e:e},0);else this.aceEditor&&(this.annotations=[],this._refreshAnnotations());if(this.options.statusBar){n=n||this.annotations.length;var d=!!n;this.validationErrorIndication.validationErrorIcon.style.display=d?"inline":"none",this.validationErrorIndication.validationErrorCount.style.display=d?"inline":"none",d&&(this.validationErrorIndication.validationErrorCount.innerText=n,this.validationErrorIndication.validationErrorIcon.title=n+" schema validation error(s) found",this.validationErrorIndication.validationErrorCount.onclick=this.validationErrorIndication.validationErrorIcon.onclick=this._toggleErrorTableVisibility.bind(this))}if(this.aceEditor){this.aceEditor.resize(!1)}},a._toggleErrorTableVisibility=function(){this.errorTableVisible=!this.errorTableVisible,this.validate()},a.getTextSelection=function(){var e={};if(this.textarea){var t=s.getInputSelection(this.textarea);return this.cursorInfo&&this.cursorInfo.line===t.end.row&&this.cursorInfo.column===t.end.column?(e.start=t.end,e.end=t.start):e=t,{start:e.start,end:e.end,text:this.textarea.value.substring(t.startIndex,t.endIndex)}}if(this.aceEditor){var i=this.aceEditor.getSelection(),n=this.aceEditor.getSelectedText(),r=i.getRange(),o=i.getSelectionLead();return o.row===r.end.row&&o.column===r.end.column?e=r:(e.start=r.end,e.end=r.start),{start:{row:e.start.row+1,column:e.start.column+1},end:{row:e.end.row+1,column:e.end.column+1},text:n}}},a.onTextSelectionChange=function(e){"function"==typeof e&&(this._selectionChangedHandler=s.debounce(e,this.DEBOUNCE_INTERVAL))},a.setTextSelection=function(e,t){if(e&&t)if(this.textarea){var i=s.getIndexForPosition(this.textarea,e.row,e.column),n=s.getIndexForPosition(this.textarea,t.row,t.column);if(i>-1&&n>-1){if(this.textarea.setSelectionRange)this.textarea.focus(),this.textarea.setSelectionRange(i,n);else if(this.textarea.createTextRange){var r=this.textarea.createTextRange();r.collapse(!0),r.moveEnd("character",n),r.moveStart("character",i),r.select()}var o=(this.textarea.value.match(/\n/g)||[]).length+1,a=this.textarea.scrollHeight/o,l=e.row*a;this.textarea.scrollTop=l>this.textarea.clientHeight?l-this.textarea.clientHeight/2:0}}else if(this.aceEditor){var r={start:{row:e.row-1,column:e.column-1},end:{row:t.row-1,column:t.column-1}};this.aceEditor.selection.setRange(r),this.aceEditor.scrollToLine(e.row-1,!0)}},e.exports=[{mode:"text",mixin:a,data:"text",load:n},{mode:"code",mixin:a,data:"text",load:n}]},function(e,t){ace.define("ace/theme/jsoneditor",["require","exports","module","ace/lib/dom"],function(e,t,i){t.isDark=!1,t.cssClass="ace-jsoneditor",t.cssText='.ace-jsoneditor .ace_gutter {\tbackground: #ebebeb;\tcolor: #333\t}\t\t.ace-jsoneditor.ace_editor {\tfont-family: "dejavu sans mono", "droid sans mono", consolas, monaco, "lucida console", "courier new", courier, monospace, sans-serif;\tline-height: 1.3;\tbackground-color: #fff;\t}\t.ace-jsoneditor .ace_print-margin {\twidth: 1px;\tbackground: #e8e8e8\t}\t.ace-jsoneditor .ace_scroller {\tbackground-color: #FFFFFF\t}\t.ace-jsoneditor .ace_text-layer {\tcolor: gray\t}\t.ace-jsoneditor .ace_variable {\tcolor: #1a1a1a\t}\t.ace-jsoneditor .ace_cursor {\tborder-left: 2px solid #000000\t}\t.ace-jsoneditor .ace_overwrite-cursors .ace_cursor {\tborder-left: 0px;\tborder-bottom: 1px solid #000000\t}\t.ace-jsoneditor .ace_marker-layer .ace_selection {\tbackground: lightgray\t}\t.ace-jsoneditor.ace_multiselect .ace_selection.ace_start {\tbox-shadow: 0 0 3px 0px #FFFFFF;\tborder-radius: 2px\t}\t.ace-jsoneditor .ace_marker-layer .ace_step {\tbackground: rgb(255, 255, 0)\t}\t.ace-jsoneditor .ace_marker-layer .ace_bracket {\tmargin: -1px 0 0 -1px;\tborder: 1px solid #BFBFBF\t}\t.ace-jsoneditor .ace_marker-layer .ace_active-line {\tbackground: #FFFBD1\t}\t.ace-jsoneditor .ace_gutter-active-line {\tbackground-color : #dcdcdc\t}\t.ace-jsoneditor .ace_marker-layer .ace_selected-word {\tborder: 1px solid lightgray\t}\t.ace-jsoneditor .ace_invisible {\tcolor: #BFBFBF\t}\t.ace-jsoneditor .ace_keyword,\t.ace-jsoneditor .ace_meta,\t.ace-jsoneditor .ace_support.ace_constant.ace_property-value {\tcolor: #AF956F\t}\t.ace-jsoneditor .ace_keyword.ace_operator {\tcolor: #484848\t}\t.ace-jsoneditor .ace_keyword.ace_other.ace_unit {\tcolor: #96DC5F\t}\t.ace-jsoneditor .ace_constant.ace_language {\tcolor: darkorange\t}\t.ace-jsoneditor .ace_constant.ace_numeric {\tcolor: red\t}\t.ace-jsoneditor .ace_constant.ace_character.ace_entity {\tcolor: #BF78CC\t}\t.ace-jsoneditor .ace_invalid {\tcolor: #FFFFFF;\tbackground-color: #FF002A;\t}\t.ace-jsoneditor .ace_fold {\tbackground-color: #AF956F;\tborder-color: #000000\t}\t.ace-jsoneditor .ace_storage,\t.ace-jsoneditor .ace_support.ace_class,\t.ace-jsoneditor .ace_support.ace_function,\t.ace-jsoneditor .ace_support.ace_other,\t.ace-jsoneditor .ace_support.ace_type {\tcolor: #C52727\t}\t.ace-jsoneditor .ace_string {\tcolor: green\t}\t.ace-jsoneditor .ace_comment {\tcolor: #BCC8BA\t}\t.ace-jsoneditor .ace_entity.ace_name.ace_tag,\t.ace-jsoneditor .ace_entity.ace_other.ace_attribute-name {\tcolor: #606060\t}\t.ace-jsoneditor .ace_markup.ace_underline {\ttext-decoration: underline\t}\t.ace-jsoneditor .ace_indent-guide {\tbackground: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==") right repeat-y\t}',e("../lib/dom").importCssString(t.cssText,t.cssClass)})}])}); //# sourceMappingURL=jsoneditor.mapassets/js/mithril/mithril.min.js000064400000065327147600337620012747 0ustar00/* phpcs:ignoreFile */!function(){"use strict";function e(e,t,n,r,o,l){return{tag:e,key:t,attrs:n,children:r,text:o,dom:l,domSize:void 0,state:void 0,events:void 0,instance:void 0}}e.normalize=function(t){return Array.isArray(t)?e("[",void 0,void 0,e.normalizeChildren(t),void 0,void 0):null==t||"boolean"==typeof t?null:"object"==typeof t?t:e("#",void 0,void 0,String(t),void 0,void 0)},e.normalizeChildren=function(t){var n=[];if(t.length){for(var r=null!=t[0]&&null!=t[0].key,o=1;o0&&(i.className=l.join(" ")),r[e]={tag:o,attrs:i}}(i),a):(a.tag=i,a)}if(i.trust=function(t){return null==t&&(t=""),e("<",void 0,void 0,t,void 0,void 0)},i.fragment=function(){var n=t.apply(0,arguments);return n.tag="[",n.children=e.normalizeChildren(n.children),n},(a=function(e){if(!(this instanceof a))throw new Error("Promise must be called with `new`");if("function"!=typeof e)throw new TypeError("executor must be a function");var t=this,n=[],r=[],o=s(n,!0),l=s(r,!1),i=t._instance={resolvers:n,rejectors:r},u="function"==typeof setImmediate?setImmediate:setTimeout;function s(e,o){return function a(s){var f;try{if(!o||null==s||"object"!=typeof s&&"function"!=typeof s||"function"!=typeof(f=s.then))u(function(){o||0!==e.length||console.error("Possible unhandled promise rejection:",s);for(var t=0;t0||e(n)}}var r=n(l);try{e(n(o),r)}catch(e){r(e)}}c(e)}).prototype.then=function(e,t){var n,r,o=this._instance;function l(e,t,l,i){t.push(function(t){if("function"!=typeof e)l(t);else try{n(e(t))}catch(e){r&&r(e)}}),"function"==typeof o.retry&&i===o.state&&o.retry()}var i=new a(function(e,t){n=e,r=t});return l(e,o.resolvers,n,!0),l(t,o.rejectors,r,!1),i},a.prototype.catch=function(e){return this.then(null,e)},a.prototype.finally=function(e){return this.then(function(t){return a.resolve(e()).then(function(){return t})},function(t){return a.resolve(e()).then(function(){return a.reject(t)})})},a.resolve=function(e){return e instanceof a?e:new a(function(t){t(e)})},a.reject=function(e){return new a(function(t,n){n(e)})},a.all=function(e){return new a(function(t,n){var r=e.length,o=0,l=[];if(0===e.length)t([]);else for(var i=0;i'+t.children+"",i=i.firstChild):i.innerHTML=t.children,t.dom=i.firstChild,t.domSize=i.childNodes.length,t.instance=[];for(var a,u=r.createDocumentFragment();a=i.firstChild;)t.instance.push(a),u.appendChild(a);w(e,u,o)}function h(e,t,n,r,o,l){if(t!==n&&(null!=t||null!=n))if(null==t||0===t.length)s(e,n,0,n.length,r,o,l);else if(null==n||0===n.length)x(e,t,0,t.length);else{var i=null!=t[0]&&null!=t[0].key,a=null!=n[0]&&null!=n[0].key,u=0,f=0;if(!i)for(;f=f&&C>=u&&(w=t[S],b=n[C],w.key===b.key);)w!==b&&p(e,w,b,r,o,l),null!=b.dom&&(o=b.dom),S--,C--;for(;S>=f&&C>=u&&(d=t[f],h=n[u],d.key===h.key);)f++,u++,d!==h&&p(e,d,h,r,y(t,f,o),l);for(;S>=f&&C>=u&&u!==C&&d.key===b.key&&w.key===h.key;)g(e,w,E=y(t,f,o)),w!==h&&p(e,w,h,r,E,l),++u<=--C&&g(e,d,o),d!==b&&p(e,d,b,r,o,l),null!=b.dom&&(o=b.dom),f++,w=t[--S],b=n[C],d=t[f],h=n[u];for(;S>=f&&C>=u&&w.key===b.key;)w!==b&&p(e,w,b,r,o,l),null!=b.dom&&(o=b.dom),C--,w=t[--S],b=n[C];if(u>C)x(e,t,f,S+1);else if(f>S)s(e,n,u,C+1,r,o,l);else{var j,z,A=o,O=C-u+1,N=new Array(O),T=0,P=0,$=2147483647,I=0;for(P=0;P=u;P--){null==j&&(j=v(t,f,S+1));var L=j[(b=n[P]).key];null!=L&&($=L<$?L:-1,N[P-u]=L,w=t[L],t[L]=null,w!==b&&p(e,w,b,r,o,l),null!=b.dom&&(o=b.dom),I++)}if(o=A,I!==S-f+1&&x(e,t,f,S+1),0===I)s(e,n,u,C+1,r,o,l);else if(-1===$)for(T=(z=function(e){for(var t=[0],n=0,r=0,o=0,l=m.length=e.length,o=0;o>>1)+(r>>>1)+(n&r&1);e[t[a]]0&&(m[o]=t[n-1]),t[n]=o)}}for(n=t.length,r=t[n-1];n-- >0;)t[n]=r,r=m[r];return m.length=0,t}(N)).length-1,P=C;P>=u;P--)h=n[P],-1===N[P-u]?c(e,h,r,l,o):z[T]===P-u?T--:g(e,h,o),null!=h.dom&&(o=n[P].dom);else for(P=C;P>=u;P--)h=n[P],-1===N[P-u]&&c(e,h,r,l,o),null!=h.dom&&(o=n[P].dom)}}else{var R=t.lengthR&&x(e,t,u,t.length),n.length>R&&s(e,n,u,n.length,r,o,l)}}}function p(t,n,r,o,i,u){var s=n.tag;if(s===r.tag){if(r.state=n.state,r.events=n.events,function(e,t){do{if(null!=e.attrs&&"function"==typeof e.attrs.onbeforeupdate){var n=a.call(e.attrs.onbeforeupdate,e,t);if(void 0!==n&&!n)break}if("string"!=typeof e.tag&&"function"==typeof e.state.onbeforeupdate){var n=a.call(e.state.onbeforeupdate,e,t);if(void 0!==n&&!n)break}return!1}while(0);return e.dom=t.dom,e.domSize=t.domSize,e.instance=t.instance,e.attrs=t.attrs,e.children=t.children,e.text=t.text,!0}(r,n))return;if("string"==typeof s)switch(null!=r.attrs&&_(r.attrs,r,o),s){case"#":!function(e,t){e.children.toString()!==t.children.toString()&&(e.dom.nodeValue=t.children),t.dom=e.dom}(n,r);break;case"<":!function(e,t,n,r,o){t.children!==n.children?(E(e,t),d(e,n,r,o)):(n.dom=t.dom,n.domSize=t.domSize,n.instance=t.instance)}(t,n,r,u,i);break;case"[":!function(e,t,n,r,o,l){h(e,t.children,n.children,r,o,l);var i=0,a=n.children;if(n.dom=null,null!=a){for(var u=0;u-1||null!=e.attrs&&e.attrs.is||"href"!==t&&"list"!==t&&"form"!==t&&"width"!==t&&"height"!==t)&&t in e.dom}var N=/[A-Z]/g;function T(e){return"-"+e.toLowerCase()}function P(e){return"-"===e[0]&&"-"===e[1]?e:"cssFloat"===e?"float":e.replace(N,T)}function $(e,t,n){if(t===n);else if(null==n)e.style.cssText="";else if("object"!=typeof n)e.style.cssText=n;else if(null==t||"object"!=typeof t)for(var r in e.style.cssText="",n)null!=(o=n[r])&&e.style.setProperty(P(r),String(o));else{for(var r in n){var o;null!=(o=n[r])&&(o=String(o))!==String(t[r])&&e.style.setProperty(P(r),o)}for(var r in t)null!=t[r]&&null==n[r]&&e.style.removeProperty(P(r))}}function I(){this._=n}function L(e,t,n){if(null!=e.events){if(e.events[t]===n)return;null==n||"function"!=typeof n&&"object"!=typeof n?(null!=e.events[t]&&e.dom.removeEventListener(t.slice(2),e.events,!1),e.events[t]=void 0):(null==e.events[t]&&e.dom.addEventListener(t.slice(2),e.events,!1),e.events[t]=n)}else null==n||"function"!=typeof n&&"object"!=typeof n||(e.events=new I,e.dom.addEventListener(t.slice(2),e.events,!1),e.events[t]=n)}function R(e,t,n){"function"==typeof e.oninit&&a.call(e.oninit,t),"function"==typeof e.oncreate&&n.push(a.bind(e.oncreate,t))}function _(e,t,n){"function"==typeof e.onupdate&&n.push(a.bind(e.onupdate,t))}return I.prototype=Object.create(null),I.prototype.handleEvent=function(e){var t,n=this["on"+e.type];"function"==typeof n?t=n.call(e.currentTarget,e):"function"==typeof n.handleEvent&&n.handleEvent(e),this._&&!1!==e.redraw&&(0,this._)(),!1===t&&(e.preventDefault(),e.stopPropagation())},function(t,r,o){if(!t)throw new TypeError("Ensure the DOM element being passed to m.route/m.mount/m.render is not undefined.");var l=[],i=u(),a=t.namespaceURI;null==t.vnodes&&(t.textContent=""),r=e.normalizeChildren(Array.isArray(r)?r:[r]);var s=n;try{n="function"==typeof o?o:void 0,h(t,t.vnodes,r,l,null,"http://www.w3.org/1999/xhtml"===a?void 0:a)}finally{n=s}t.vnodes=r,null!=i&&u()!==i&&"function"==typeof i.focus&&i.focus();for(var c=0;c=0&&(o.splice(l,2),t(n,[],u)),null!=r&&(o.push(n,r),t(n,e(r),u))},redraw:u}}(u,requestAnimationFrame,console),c=function(e){if("[object Object]"!==Object.prototype.toString.call(e))return"";var t=[];for(var n in e)r(n,e[n]);return t.join("&");function r(e,n){if(Array.isArray(n))for(var o=0;o=0&&(v+=e.slice(n,o)),s>=0&&(v+=(n<0?"?":"&")+u.slice(s,h));var m=c(a);return m&&(v+=(n<0&&s<0?"?":"&")+m),r>=0&&(v+=e.slice(r)),d>=0&&(v+=(r<0?"":"&")+u.slice(d)),v},h=function(e,t,n){var r=0;function o(e){return new t(e)}function l(e){return function(r,l){"string"!=typeof r?(l=r,r=r.url):null==l&&(l={});var i=new t(function(t,n){e(d(r,l.params),l,function(e){if("function"==typeof l.type)if(Array.isArray(e))for(var n=0;n=200&&e.target.status<300||304===e.target.status||/^file:\/\//i.test(t),a=e.target.response;if("json"===c?e.target.responseType||"function"==typeof n.extract||(a=JSON.parse(e.target.responseText)):c&&"text"!==c||null==a&&(a=e.target.responseText),"function"==typeof n.extract?(a=n.extract(e.target,n),i=!0):"function"==typeof n.deserialize&&(a=n.deserialize(a)),i)r(a);else{try{l=e.target.responseText}catch(e){l=a}var u=new Error(l);u.code=e.target.status,u.response=a,o(u)}}catch(e){o(e)}},"function"==typeof n.config&&(f=n.config(f,n,t)||f)!==h&&(l=f.abort,f.abort=function(){d=!0,l.call(this)}),null==u?f.send():"function"==typeof n.serialize?f.send(n.serialize(u)):u instanceof e.FormData?f.send(u):f.send(JSON.stringify(u))}),jsonp:l(function(t,n,o,l){var i=n.callbackName||"_mithril_"+Math.round(1e16*Math.random())+"_"+r++,a=e.document.createElement("script");e[i]=function(t){delete e[i],a.parentNode.removeChild(a),o(t)},a.onerror=function(){delete e[i],a.parentNode.removeChild(a),l(new Error("JSONP request failed"))},a.src=t+(t.indexOf("?")<0?"?":"&")+encodeURIComponent(n.callbackKey||"callback")+"="+encodeURIComponent(i),e.document.documentElement.appendChild(a)})}}(window,a,s.redraw),p=s,v=function(){return i.apply(this,arguments)};v.m=i,v.trust=i.trust,v.fragment=i.fragment,v.mount=p.mount;var m=i,y=a,g=function(e){if(""===e||null==e)return{};"?"===e.charAt(0)&&(e=e.slice(1));for(var t=e.split("&"),n={},r={},o=0;o-1&&u.pop();for(var c=0;c1&&"/"===l[l.length-1]&&(l=l.slice(0,-1))):l="/",{path:l,params:t<0?{}:g(e.slice(t+1,r))}},b=function(e){var t=w(e),n=Object.keys(t.params),r=[],o=new RegExp("^"+t.path.replace(/:([^\/.-]+)(\.{3}|\.(?!\.)|-)?|[\\^$*+.()|\[\]{}]/g,function(e,t,n){return null==t?"\\"+e:(r.push({k:t,r:"..."===n}),"..."===n?"(.*)":"."===n?"([^/]+)\\.":"([^/]+)"+(n||""))})+"$");return function(e){for(var l=0;l":">",'"':""","'":"'","/":"/"};return"string"!=typeof e?e:String(e).replace(/[&<>"'\/\\]/g,function(e){return t[e]})},r.appendMany=function(e,t){if("1.7"===o.fn.jquery.substr(0,3)){var n=o();o.map(t,function(e){n=n.add(e)}),t=n}e.append(t)},r.__cache={};var n=0;return r.GetUniqueElementId=function(e){var t=e.getAttribute("data-select2-id");return null==t&&(e.id?(t=e.id,e.setAttribute("data-select2-id",t)):(e.setAttribute("data-select2-id",++n),t=n.toString())),t},r.StoreData=function(e,t,n){var i=r.GetUniqueElementId(e);r.__cache[i]||(r.__cache[i]={}),r.__cache[i][t]=n},r.GetData=function(e,t){var n=r.GetUniqueElementId(e);return t?r.__cache[n]&&null!=r.__cache[n][t]?r.__cache[n][t]:o(e).data(t):r.__cache[n]},r.RemoveData=function(e){var t=r.GetUniqueElementId(e);null!=r.__cache[t]&&delete r.__cache[t],e.removeAttribute("data-select2-id")},r}),e.define("select2/results",["jquery","./utils"],function(h,f){function i(e,t,n){this.$element=e,this.data=n,this.options=t,i.__super__.constructor.call(this)}return f.Extend(i,f.Observable),i.prototype.render=function(){var e=h('
        ');return this.options.get("multiple")&&e.attr("aria-multiselectable","true"),this.$results=e},i.prototype.clear=function(){this.$results.empty()},i.prototype.displayMessage=function(e){var t=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var n=h(''),i=this.options.get("translations").get(e.message);n.append(t(i(e.args))),n[0].className+=" select2-results__message",this.$results.append(n)},i.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},i.prototype.append=function(e){this.hideLoading();var t=[];if(null!=e.results&&0!==e.results.length){e.results=this.sort(e.results);for(var n=0;n",{class:"select2-results__options select2-results__options--nested"});p.append(l),s.append(a),s.append(p)}else this.template(e,t);return f.StoreData(t,"data",e),t},i.prototype.bind=function(t,e){var l=this,n=t.id+"-results";this.$results.attr("id",n),t.on("results:all",function(e){l.clear(),l.append(e.data),t.isOpen()&&(l.setClasses(),l.highlightFirstItem())}),t.on("results:append",function(e){l.append(e.data),t.isOpen()&&l.setClasses()}),t.on("query",function(e){l.hideMessages(),l.showLoading(e)}),t.on("select",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("unselect",function(){t.isOpen()&&(l.setClasses(),l.options.get("scrollAfterSelect")&&l.highlightFirstItem())}),t.on("open",function(){l.$results.attr("aria-expanded","true"),l.$results.attr("aria-hidden","false"),l.setClasses(),l.ensureHighlightVisible()}),t.on("close",function(){l.$results.attr("aria-expanded","false"),l.$results.attr("aria-hidden","true"),l.$results.removeAttr("aria-activedescendant")}),t.on("results:toggle",function(){var e=l.getHighlightedResults();0!==e.length&&e.trigger("mouseup")}),t.on("results:select",function(){var e=l.getHighlightedResults();if(0!==e.length){var t=f.GetData(e[0],"data");"true"==e.attr("aria-selected")?l.trigger("close",{}):l.trigger("select",{data:t})}}),t.on("results:previous",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e);if(!(n<=0)){var i=n-1;0===e.length&&(i=0);var r=t.eq(i);r.trigger("mouseenter");var o=l.$results.offset().top,s=r.offset().top,a=l.$results.scrollTop()+(s-o);0===i?l.$results.scrollTop(0):s-o<0&&l.$results.scrollTop(a)}}),t.on("results:next",function(){var e=l.getHighlightedResults(),t=l.$results.find("[aria-selected]"),n=t.index(e)+1;if(!(n>=t.length)){var i=t.eq(n);i.trigger("mouseenter");var r=l.$results.offset().top+l.$results.outerHeight(!1),o=i.offset().top+i.outerHeight(!1),s=l.$results.scrollTop()+o-r;0===n?l.$results.scrollTop(0):rthis.$results.outerHeight()||o<0)&&this.$results.scrollTop(r)}},i.prototype.template=function(e,t){var n=this.options.get("templateResult"),i=this.options.get("escapeMarkup"),r=n(e,t);null==r?t.style.display="none":"string"==typeof r?t.innerHTML=i(r):h(t).append(r)},i}),e.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),e.define("select2/selection/base",["jquery","../utils","../keys"],function(n,i,r){function o(e,t){this.$element=e,this.options=t,o.__super__.constructor.call(this)}return i.Extend(o,i.Observable),o.prototype.render=function(){var e=n('');return this._tabindex=0,null!=i.GetData(this.$element[0],"old-tabindex")?this._tabindex=i.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),e.attr("title",this.$element.attr("title")),e.attr("tabindex",this._tabindex),e.attr("aria-disabled","false"),this.$selection=e},o.prototype.bind=function(e,t){var n=this,i=e.id+"-results";this.container=e,this.$selection.on("focus",function(e){n.trigger("focus",e)}),this.$selection.on("blur",function(e){n._handleBlur(e)}),this.$selection.on("keydown",function(e){n.trigger("keypress",e),e.which===r.SPACE&&e.preventDefault()}),e.on("results:focus",function(e){n.$selection.attr("aria-activedescendant",e.data._resultId)}),e.on("selection:update",function(e){n.update(e.data)}),e.on("open",function(){n.$selection.attr("aria-expanded","true"),n.$selection.attr("aria-owns",i),n._attachCloseHandler(e)}),e.on("close",function(){n.$selection.attr("aria-expanded","false"),n.$selection.removeAttr("aria-activedescendant"),n.$selection.removeAttr("aria-owns"),n.$selection.trigger("focus"),n._detachCloseHandler(e)}),e.on("enable",function(){n.$selection.attr("tabindex",n._tabindex),n.$selection.attr("aria-disabled","false")}),e.on("disable",function(){n.$selection.attr("tabindex","-1"),n.$selection.attr("aria-disabled","true")})},o.prototype._handleBlur=function(e){var t=this;window.setTimeout(function(){document.activeElement==t.$selection[0]||n.contains(t.$selection[0],document.activeElement)||t.trigger("blur",e)},1)},o.prototype._attachCloseHandler=function(e){n(document.body).on("mousedown.select2."+e.id,function(e){var t=n(e.target).closest(".select2");n(".select2.select2-container--open").each(function(){this!=t[0]&&i.GetData(this,"element").select2("close")})})},o.prototype._detachCloseHandler=function(e){n(document.body).off("mousedown.select2."+e.id)},o.prototype.position=function(e,t){t.find(".selection").append(e)},o.prototype.destroy=function(){this._detachCloseHandler(this.container)},o.prototype.update=function(e){throw new Error("The `update` method must be defined in child classes.")},o.prototype.isEnabled=function(){return!this.isDisabled()},o.prototype.isDisabled=function(){return this.options.get("disabled")},o}),e.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(e,t,n,i){function r(){r.__super__.constructor.apply(this,arguments)}return n.Extend(r,t),r.prototype.render=function(){var e=r.__super__.render.call(this);return e.addClass("select2-selection--single"),e.html(''),e},r.prototype.bind=function(t,e){var n=this;r.__super__.bind.apply(this,arguments);var i=t.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",i).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",i),this.$selection.on("mousedown",function(e){1===e.which&&n.trigger("toggle",{originalEvent:e})}),this.$selection.on("focus",function(e){}),this.$selection.on("blur",function(e){}),t.on("focus",function(e){t.isOpen()||n.$selection.trigger("focus")})},r.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},r.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},r.prototype.selectionContainer=function(){return e("")},r.prototype.update=function(e){if(0!==e.length){var t=e[0],n=this.$selection.find(".select2-selection__rendered"),i=this.display(t,n);n.empty().append(i);var r=t.title||t.text;r?n.attr("title",r):n.removeAttr("title")}else this.clear()},r}),e.define("select2/selection/multiple",["jquery","./base","../utils"],function(r,e,l){function n(e,t){n.__super__.constructor.apply(this,arguments)}return l.Extend(n,e),n.prototype.render=function(){var e=n.__super__.render.call(this);return e.addClass("select2-selection--multiple"),e.html('
          '),e},n.prototype.bind=function(e,t){var i=this;n.__super__.bind.apply(this,arguments),this.$selection.on("click",function(e){i.trigger("toggle",{originalEvent:e})}),this.$selection.on("click",".select2-selection__choice__remove",function(e){if(!i.isDisabled()){var t=r(this).parent(),n=l.GetData(t[0],"data");i.trigger("unselect",{originalEvent:e,data:n})}})},n.prototype.clear=function(){var e=this.$selection.find(".select2-selection__rendered");e.empty(),e.removeAttr("title")},n.prototype.display=function(e,t){var n=this.options.get("templateSelection");return this.options.get("escapeMarkup")(n(e,t))},n.prototype.selectionContainer=function(){return r('
        • ×
        • ')},n.prototype.update=function(e){if(this.clear(),0!==e.length){for(var t=[],n=0;n×');a.StoreData(i[0],"data",t),this.$selection.find(".select2-selection__rendered").prepend(i)}},e}),e.define("select2/selection/search",["jquery","../utils","../keys"],function(i,a,l){function e(e,t,n){e.call(this,t,n)}return e.prototype.render=function(e){var t=i('');this.$searchContainer=t,this.$search=t.find("input");var n=e.call(this);return this._transferTabIndex(),n},e.prototype.bind=function(e,t,n){var i=this,r=t.id+"-results";e.call(this,t,n),t.on("open",function(){i.$search.attr("aria-controls",r),i.$search.trigger("focus")}),t.on("close",function(){i.$search.val(""),i.$search.removeAttr("aria-controls"),i.$search.removeAttr("aria-activedescendant"),i.$search.trigger("focus")}),t.on("enable",function(){i.$search.prop("disabled",!1),i._transferTabIndex()}),t.on("disable",function(){i.$search.prop("disabled",!0)}),t.on("focus",function(e){i.$search.trigger("focus")}),t.on("results:focus",function(e){e.data._resultId?i.$search.attr("aria-activedescendant",e.data._resultId):i.$search.removeAttr("aria-activedescendant")}),this.$selection.on("focusin",".select2-search--inline",function(e){i.trigger("focus",e)}),this.$selection.on("focusout",".select2-search--inline",function(e){i._handleBlur(e)}),this.$selection.on("keydown",".select2-search--inline",function(e){if(e.stopPropagation(),i.trigger("keypress",e),i._keyUpPrevented=e.isDefaultPrevented(),e.which===l.BACKSPACE&&""===i.$search.val()){var t=i.$searchContainer.prev(".select2-selection__choice");if(0this.maximumInputLength?this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:t.term,params:t}}):e.call(this,t,n)},e}),e.define("select2/data/maximumSelectionLength",[],function(){function e(e,t,n){this.maximumSelectionLength=n.get("maximumSelectionLength"),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("select",function(){i._checkIfMaximumSelected()})},e.prototype.query=function(e,t,n){var i=this;this._checkIfMaximumSelected(function(){e.call(i,t,n)})},e.prototype._checkIfMaximumSelected=function(e,n){var i=this;this.current(function(e){var t=null!=e?e.length:0;0=i.maximumSelectionLength?i.trigger("results:message",{message:"maximumSelected",args:{maximum:i.maximumSelectionLength}}):n&&n()})},e}),e.define("select2/dropdown",["jquery","./utils"],function(t,e){function n(e,t){this.$element=e,this.options=t,n.__super__.constructor.call(this)}return e.Extend(n,e.Observable),n.prototype.render=function(){var e=t('');return e.attr("dir",this.options.get("dir")),this.$dropdown=e},n.prototype.bind=function(){},n.prototype.position=function(e,t){},n.prototype.destroy=function(){this.$dropdown.remove()},n}),e.define("select2/dropdown/search",["jquery","../utils"],function(o,e){function t(){}return t.prototype.render=function(e){var t=e.call(this),n=o('');return this.$searchContainer=n,this.$search=n.find("input"),t.prepend(n),t},t.prototype.bind=function(e,t,n){var i=this,r=t.id+"-results";e.call(this,t,n),this.$search.on("keydown",function(e){i.trigger("keypress",e),i._keyUpPrevented=e.isDefaultPrevented()}),this.$search.on("input",function(e){o(this).off("keyup")}),this.$search.on("keyup input",function(e){i.handleSearch(e)}),t.on("open",function(){i.$search.attr("tabindex",0),i.$search.attr("aria-controls",r),i.$search.trigger("focus"),window.setTimeout(function(){i.$search.trigger("focus")},0)}),t.on("close",function(){i.$search.attr("tabindex",-1),i.$search.removeAttr("aria-controls"),i.$search.removeAttr("aria-activedescendant"),i.$search.val(""),i.$search.trigger("blur")}),t.on("focus",function(){t.isOpen()||i.$search.trigger("focus")}),t.on("results:all",function(e){null!=e.query.term&&""!==e.query.term||(i.showSearch(e)?i.$searchContainer.removeClass("select2-search--hide"):i.$searchContainer.addClass("select2-search--hide"))}),t.on("results:focus",function(e){e.data._resultId?i.$search.attr("aria-activedescendant",e.data._resultId):i.$search.removeAttr("aria-activedescendant")})},t.prototype.handleSearch=function(e){if(!this._keyUpPrevented){var t=this.$search.val();this.trigger("query",{term:t})}this._keyUpPrevented=!1},t.prototype.showSearch=function(e,t){return!0},t}),e.define("select2/dropdown/hidePlaceholder",[],function(){function e(e,t,n,i){this.placeholder=this.normalizePlaceholder(n.get("placeholder")),e.call(this,t,n,i)}return e.prototype.append=function(e,t){t.results=this.removePlaceholder(t.results),e.call(this,t)},e.prototype.normalizePlaceholder=function(e,t){return"string"==typeof t&&(t={id:"",text:t}),t},e.prototype.removePlaceholder=function(e,t){for(var n=t.slice(0),i=t.length-1;0<=i;i--){var r=t[i];this.placeholder.id===r.id&&n.splice(i,1)}return n},e}),e.define("select2/dropdown/infiniteScroll",["jquery"],function(n){function e(e,t,n,i){this.lastParams={},e.call(this,t,n,i),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return e.prototype.append=function(e,t){this.$loadingMore.remove(),this.loading=!1,e.call(this,t),this.showLoadingMore(t)&&(this.$results.append(this.$loadingMore),this.loadMoreIfNeeded())},e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("query",function(e){i.lastParams=e,i.loading=!0}),t.on("query:append",function(e){i.lastParams=e,i.loading=!0}),this.$results.on("scroll",this.loadMoreIfNeeded.bind(this))},e.prototype.loadMoreIfNeeded=function(){var e=n.contains(document.documentElement,this.$loadingMore[0]);if(!this.loading&&e){var t=this.$results.offset().top+this.$results.outerHeight(!1);this.$loadingMore.offset().top+this.$loadingMore.outerHeight(!1)<=t+50&&this.loadMore()}},e.prototype.loadMore=function(){this.loading=!0;var e=n.extend({},{page:1},this.lastParams);e.page++,this.trigger("query:append",e)},e.prototype.showLoadingMore=function(e,t){return t.pagination&&t.pagination.more},e.prototype.createLoadingMore=function(){var e=n('
        • '),t=this.options.get("translations").get("loadingMore");return e.html(t(this.lastParams)),e},e}),e.define("select2/dropdown/attachBody",["jquery","../utils"],function(f,a){function e(e,t,n){this.$dropdownParent=f(n.get("dropdownParent")||document.body),e.call(this,t,n)}return e.prototype.bind=function(e,t,n){var i=this;e.call(this,t,n),t.on("open",function(){i._showDropdown(),i._attachPositioningHandler(t),i._bindContainerResultHandlers(t)}),t.on("close",function(){i._hideDropdown(),i._detachPositioningHandler(t)}),this.$dropdownContainer.on("mousedown",function(e){e.stopPropagation()})},e.prototype.destroy=function(e){e.call(this),this.$dropdownContainer.remove()},e.prototype.position=function(e,t,n){t.attr("class",n.attr("class")),t.removeClass("select2"),t.addClass("select2-container--open"),t.css({position:"absolute",top:-999999}),this.$container=n},e.prototype.render=function(e){var t=f(""),n=e.call(this);return t.append(n),this.$dropdownContainer=t},e.prototype._hideDropdown=function(e){this.$dropdownContainer.detach()},e.prototype._bindContainerResultHandlers=function(e,t){if(!this._containerResultsHandlersBound){var n=this;t.on("results:all",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:append",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("results:message",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("select",function(){n._positionDropdown(),n._resizeDropdown()}),t.on("unselect",function(){n._positionDropdown(),n._resizeDropdown()}),this._containerResultsHandlersBound=!0}},e.prototype._attachPositioningHandler=function(e,t){var n=this,i="scroll.select2."+t.id,r="resize.select2."+t.id,o="orientationchange.select2."+t.id,s=this.$container.parents().filter(a.hasScroll);s.each(function(){a.StoreData(this,"select2-scroll-position",{x:f(this).scrollLeft(),y:f(this).scrollTop()})}),s.on(i,function(e){var t=a.GetData(this,"select2-scroll-position");f(this).scrollTop(t.y)}),f(window).on(i+" "+r+" "+o,function(e){n._positionDropdown(),n._resizeDropdown()})},e.prototype._detachPositioningHandler=function(e,t){var n="scroll.select2."+t.id,i="resize.select2."+t.id,r="orientationchange.select2."+t.id;this.$container.parents().filter(a.hasScroll).off(n),f(window).off(n+" "+i+" "+r)},e.prototype._positionDropdown=function(){var e=f(window),t=this.$dropdown.hasClass("select2-dropdown--above"),n=this.$dropdown.hasClass("select2-dropdown--below"),i=null,r=this.$container.offset();r.bottom=r.top+this.$container.outerHeight(!1);var o={height:this.$container.outerHeight(!1)};o.top=r.top,o.bottom=r.top+o.height;var s=this.$dropdown.outerHeight(!1),a=e.scrollTop(),l=e.scrollTop()+e.height(),c=ar.bottom+s,d={left:r.left,top:o.bottom},p=this.$dropdownParent;"static"===p.css("position")&&(p=p.offsetParent());var h={top:0,left:0};(f.contains(document.body,p[0])||p[0].isConnected)&&(h=p.offset()),d.top-=h.top,d.left-=h.left,t||n||(i="below"),u||!c||t?!c&&u&&t&&(i="below"):i="above",("above"==i||t&&"below"!==i)&&(d.top=o.top-h.top-s),null!=i&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+i),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+i)),this.$dropdownContainer.css(d)},e.prototype._resizeDropdown=function(){var e={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(e.minWidth=e.width,e.position="relative",e.width="auto"),this.$dropdown.css(e)},e.prototype._showDropdown=function(e){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},e}),e.define("select2/dropdown/minimumResultsForSearch",[],function(){function e(e,t,n,i){this.minimumResultsForSearch=n.get("minimumResultsForSearch"),this.minimumResultsForSearch<0&&(this.minimumResultsForSearch=1/0),e.call(this,t,n,i)}return e.prototype.showSearch=function(e,t){return!(function e(t){for(var n=0,i=0;i');return e.attr("dir",this.options.get("dir")),this.$container=e,this.$container.addClass("select2-container--"+this.options.get("theme")),u.StoreData(e[0],"element",this.$element),e},d}),e.define("select2/compat/utils",["jquery"],function(s){return{syncCssClasses:function(e,t,n){var i,r,o=[];(i=s.trim(e.attr("class")))&&s((i=""+i).split(/\s+/)).each(function(){0===this.indexOf("select2-")&&o.push(this)}),(i=s.trim(t.attr("class")))&&s((i=""+i).split(/\s+/)).each(function(){0!==this.indexOf("select2-")&&null!=(r=n(this))&&o.push(r)}),e.attr("class",o.join(" "))}}}),e.define("select2/compat/containerCss",["jquery","./utils"],function(s,a){function l(e){return null}function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get("containerCssClass")||"";s.isFunction(n)&&(n=n(this.$element));var i=this.options.get("adaptContainerCssClass");if(i=i||l,-1!==n.indexOf(":all:")){n=n.replace(":all:","");var r=i;i=function(e){var t=r(e);return null!=t?t+" "+e:e}}var o=this.options.get("containerCss")||{};return s.isFunction(o)&&(o=o(this.$element)),a.syncCssClasses(t,this.$element,i),t.css(o),t.addClass(n),t},e}),e.define("select2/compat/dropdownCss",["jquery","./utils"],function(s,a){function l(e){return null}function e(){}return e.prototype.render=function(e){var t=e.call(this),n=this.options.get("dropdownCssClass")||"";s.isFunction(n)&&(n=n(this.$element));var i=this.options.get("adaptDropdownCssClass");if(i=i||l,-1!==n.indexOf(":all:")){n=n.replace(":all:","");var r=i;i=function(e){var t=r(e);return null!=t?t+" "+e:e}}var o=this.options.get("dropdownCss")||{};return s.isFunction(o)&&(o=o(this.$element)),a.syncCssClasses(t,this.$element,i),t.css(o),t.addClass(n),t},e}),e.define("select2/compat/initSelection",["jquery"],function(i){function e(e,t,n){n.get("debug")&&window.console&&console.warn&&console.warn("Select2: The `initSelection` option has been deprecated in favor of a custom data adapter that overrides the `current` method. This method is now called multiple times instead of a single time when the instance is initialized. Support will be removed for the `initSelection` option in future versions of Select2"),this.initSelection=n.get("initSelection"),this._isInitialized=!1,e.call(this,t,n)}return e.prototype.current=function(e,t){var n=this;this._isInitialized?e.call(this,t):this.initSelection.call(null,this.$element,function(e){n._isInitialized=!0,i.isArray(e)||(e=[e]),t(e)})},e}),e.define("select2/compat/inputData",["jquery","../utils"],function(s,i){function e(e,t,n){this._currentData=[],this._valueSeparator=n.get("valueSeparator")||",","hidden"===t.prop("type")&&n.get("debug")&&console&&console.warn&&console.warn("Select2: Using a hidden input with Select2 is no longer supported and may stop working in the future. It is recommended to use a `"; window.smart_manager.advancedSearchContent = ''; //Code for dashboards select2 window.smart_manager.dashboard_select_options = ''; if( window.smart_manager.sm_beta_pro == 1 ) { let recentDashboards = (!Array.isArray(window.smart_manager.recentDashboards)) ? window.smart_manager.recentDashboards.values() : window.smart_manager.recentDashboards, recentTaxonomyDashboards = (!Array.isArray(window.smart_manager.recentTaxonomyDashboards)) ? window.smart_manager.recentTaxonomyDashboards.values() : window.smart_manager.recentTaxonomyDashboards; // Code for rendering recently accessed dashboards if(recentDashboards.length > 0){ window.smart_manager.createOptGroups({'parent': window.smart_manager.sm_dashboards, 'child': recentDashboards, 'label': _x('Common post types', 'dashboard option groups', 'smart-manager-for-wp-e-commerce'), 'is_recently_accessed': true }); } // Code for rendering recently accessed taxonomy dashboards if(recentTaxonomyDashboards.length > 0){ window.smart_manager.createOptGroups({'parent': window.smart_manager.taxonomyDashboards, 'child': recentTaxonomyDashboards, 'label': _x('Common taxonomies', 'dashboard option groups', 'smart-manager-for-wp-e-commerce'), 'is_recently_accessed': true }); } // Code for rendering recently accessed views if(window.smart_manager.recentViews.length > 0 && Object.keys(window.smart_manager.sm_views).length > 0){ window.smart_manager.createOptGroups({'parent': window.smart_manager.sm_views, 'child': window.smart_manager.recentViews, 'label': _x('Recently used views', 'dashboard option groups', 'smart-manager-for-wp-e-commerce'), 'is_recently_accessed': true }); } // Code for rendering all remaining dashboards if(Object.keys(window.smart_manager.sm_dashboards).length > 0){ window.smart_manager.createOptGroups({'parent': recentDashboards, 'child': window.smart_manager.sm_dashboards, 'label': _x('Other post types', 'dashboard option groups', 'smart-manager-for-wp-e-commerce'), 'is_recently_accessed': false }); } // Code for rendering all remaining taxonomy dashboards if(Object.keys(window.smart_manager.taxonomyDashboards).length > 0){ window.smart_manager.createOptGroups({'parent': recentTaxonomyDashboards, 'child': window.smart_manager.taxonomyDashboards, 'label': _x('Other taxonomies', 'dashboard option groups', 'smart-manager-for-wp-e-commerce'), 'is_recently_accessed': false }); } // Code for rendering all remaining views if(Object.keys(window.smart_manager.sm_views).length > 0){ let otherSavedViews = Object.entries(window.smart_manager.sm_views) .filter(([key]) => !window.smart_manager.recentViews.includes(key)) .reduce((acc, [key, value]) => { acc[key] = value; return acc; }, {}) window.smart_manager.createOptGroups({'parent': window.smart_manager.sm_views, 'child': otherSavedViews, 'label': _x('Other saved views', 'dashboard option groups', 'smart-manager-for-wp-e-commerce'), 'is_recently_accessed': true }); } // Code to change the dashboard key to view post type let viewSlug = window.smart_manager.getViewSlug(window.smart_manager.dashboardName); if(viewSlug){ window.smart_manager.dashboard_key = window.smart_manager.viewPostTypes[viewSlug]; } } else { if(Object.keys(window.smart_manager.sm_dashboards).length > 0){ window.smart_manager.createOptGroups({'parent': window.smart_manager.sm_dashboards, 'child': window.smart_manager.sm_dashboards, 'label': _x('All post types', 'dashboard option groups', 'smart-manager-for-wp-e-commerce'), 'is_recently_accessed': false, 'isParentChildSame': true }); } if(Object.keys(window.smart_manager.taxonomyDashboards).length > 0){ window.smart_manager.createOptGroups({'parent': window.smart_manager.taxonomyDashboards, 'child': window.smart_manager.taxonomyDashboards, 'label': _x('All taxonomies', 'dashboard option groups', 'smart-manager-for-wp-e-commerce'), 'is_recently_accessed': false, 'isParentChildSame': true }); } } let navBar = ""+ ""; jQuery('#sm_nav_bar .sm_beta_left').append(navBar); jQuery('#sm_dashboard_select').empty().append(window.smart_manager.dashboard_select_options); jQuery('#sm_dashboard_select').select2({ width: '20em', dropdownCssClass: 'sm_beta_dashboard_select', dropdownParent: jQuery('#sm_nav_bar'), templateResult: function (data) { if (data.element && data.element.tagName === 'OPTGROUP') { return jQuery(`${data.text}`) } return data.text; }, }); jQuery('#sm_nav_bar #sm_nav_bar_right').append(``); let sm_top_bar = '
          '+ '
          '+ '
          '+ '
          '+ ''+ ''+ ''+ ''+_x('Bulk Edit', 'button', 'smart-manager-for-wp-e-commerce')+''+ '
          '+ '
          '+ '
          '+ '
          '+ ''+ ''+ ''+ ''+_x('Save', 'button', 'smart-manager-for-wp-e-commerce')+''+ '
          '+ '
          '+ ''+ ''+ ''+ ''+_x('Add Row', 'button', 'smart-manager-for-wp-e-commerce')+''+ '
          '+ ''+ ''+ '
          '+ '
          '+ ''+ '
          '+ ''+ ''+ ''+ ''+_x('Export CSV', 'button', 'smart-manager-for-wp-e-commerce')+''+ '
          '+ '
          '+ '
          '+ '
          '+ '
          '+ ''+ '
          '+ '
          '+ '
          '+ ''+ ''+ ''+ ''+_x('Columns', 'button', 'smart-manager-for-wp-e-commerce')+''+ '
          '+ '
          '+ '
          '+ '
          '+ '
          '; let sm_bottom_bar = "
          "+ "
          "+ "
          "+ "
          "+window.smart_manager.loadMoreBtnHtml+"
          "+ "
          "+ "
          "+ "
          "; let sm_msg = jQuery('.sm_design_notice').prop('outerHTML'); if(sm_msg){ jQuery(sm_msg).insertAfter("#sm_nav_bar"); jQuery('.wrap > .sm_design_notice').show() } jQuery(sm_top_bar).insertBefore("#sm_editor_grid"); jQuery(sm_bottom_bar).insertAfter("#sm_editor_grid"); if ( window.smart_manager.dashboard_key == 'shop_order' ) { jQuery('#print_invoice_sm_editor_grid_btn').show(); } else { jQuery('#print_invoice_sm_editor_grid_btn').hide(); } (window.smart_manager.isTaxonomyDashboard()) ? jQuery('#sm_beta_move_to_trash').hide() : jQuery('#sm_beta_move_to_trash').show(); document.getElementById('sm_access_privilege_settings').style.display = (window.smart_manager.isAdmin) ? 'block' : 'none'; window.smart_manager.displayShowHideColumnSettings(true); if('undefined' !== typeof(window.smart_manager.displayTasks) && 'function' === typeof(window.smart_manager.displayTasks)){ window.smart_manager.displayTasks({hideTasks: true}); // Hide tasks for custom view dashboard } //Code for Dashboard KPI jQuery('#sm_dashboard_kpi').remove(); if( window.smart_manager.searchType != 'simple' ) { window.smart_manager.initialize_advanced_search(); //initialize advanced search control } jQuery('#sm_top_bar').trigger('sm_top_bar_loaded'); window.smart_manager.toggleTopBar(); } String.prototype.capitalize = function() { return this.charAt(0).toUpperCase() + this.slice(1); } Smart_Manager.prototype.getCheckboxValues = function( colObj ) { if(!colObj){ return []; } if( !(colObj.hasOwnProperty('checkedTemplate') && colObj.hasOwnProperty('uncheckedTemplate')) ) { colObj.checkedTemplate = 'true'; colObj.uncheckedTemplate = 'false'; } return new Array({'key': colObj.checkedTemplate, 'value': String(colObj.checkedTemplate).capitalize()}, {'key': colObj.uncheckedTemplate, 'value': String(colObj.uncheckedTemplate).capitalize()}); } Smart_Manager.prototype.initialize_advanced_search = function() { if( typeof(window.smart_manager.currentColModel) == 'undefined' ) { return; } let colModel = JSON.parse( JSON.stringify( window.smart_manager.currentColModel ) ); window.smart_manager.colModelSearch = {} Object.entries(colModel).map(([key, obj]) => { if( obj.hasOwnProperty('searchable') && obj.searchable == 1 ) { if( obj.type == 'checkbox' ) { obj.type = 'dropdown'; obj.search_values = window.smart_manager.getCheckboxValues(obj); } if( obj.type == 'sm.multilist' ) { obj.type = 'dropdown'; } if( obj.type == 'text' ) { if( obj.hasOwnProperty('validator') ) { if( obj.validator == 'customNumericTextEditor' ) { obj.type = 'numeric'; } } } if (obj.type == "number") { obj.type = 'numeric' } window.smart_manager.colModelSearch[obj.table_name +'.'+ obj.col_name] = { 'title': obj.name_display, 'type': (obj.hasOwnProperty('search_type')) ? obj.search_type : obj.type, 'values': (obj.search_values) ? obj.search_values : {} }; } }); jQuery('#sm_advanced_search_content').html( sprintf( /* translators: %1$d: Advanced search rule count %2$s: search conditions */ _x('%1$d condition%2$s', 'search conditions', 'smart-manager-for-wp-e-commerce'), window.smart_manager.advancedSearchRuleCount, ((window.smart_manager.advancedSearchRuleCount > 1) ? _x('s', 'search conditions', 'smart-manager-for-wp-e-commerce') : '')) ) } Smart_Manager.prototype.showLoader = function( is_show = true ) { if ( is_show ) { jQuery('.sm-loader-container').hide().show(); } else { jQuery('.sm-loader-container').hide(); } } Smart_Manager.prototype.send_request = function(params, callback, callbackParams) { if( typeof params.showLoader == 'undefined' || (typeof params.showLoader != 'undefined' && params.showLoader !== false ) ) { window.smart_manager.showLoader(); } if( window.smart_manager.sm_beta_pro == 1 ) { // Flag for handling taxonomy dashboards params.data['is_taxonomy'] = window.smart_manager.isTaxonomyDashboard(); } jQuery.ajax({ type : ( ( typeof(params.call_type) != 'undefined' ) ? params.call_type : 'POST' ), url : ( (typeof(params.call_url) != 'undefined' ) ? params.call_url : window.smart_manager.sm_ajax_url ), dataType: ( ( typeof(params.data_type) != 'undefined' ) ? params.data_type : 'text' ), async: ( ( typeof(params.async) != 'undefined' ) ? params.async : true ), data: params.data, success: function(resp) { if( typeof params.showLoader == 'undefined' || (typeof params.showLoader != 'undefined' && params.showLoader !== false ) ) { if(false == params.hasOwnProperty('hideLoader') || (params.hasOwnProperty('hideLoader') && false != params.hideLoader) ){ window.smart_manager.showLoader(false); } } return ( ( typeof(callbackParams) != 'undefined' ) ? callback(callbackParams, resp) : callback(resp) ); }, error: function(error) { console.log('Smart Manager AJAX failed::', error); } }); } //function to format the column model Smart_Manager.prototype.format_dashboard_column_model = function( column_model ) { if( window.smart_manager.currentColModel == '' || typeof(window.smart_manager.currentColModel) == 'undefined' ) { return; } index = 0; if ( typeof (window.smart_manager.sortColumns) !== "undefined" && typeof (window.smart_manager.sortColumns) === "function" ) { window.smart_manager.sortColumns(); } window.smart_manager.column_names = []; window.smart_manager.currentVisibleColumns = []; for (i = 0; i < window.smart_manager.currentColModel.length; i++) { if( typeof(window.smart_manager.currentColModel[i]) == 'undefined' ) { continue; } hidden = ( typeof(window.smart_manager.currentColModel[i].hidden) != 'undefined' ) ? window.smart_manager.currentColModel[i].hidden : true; column_values = (typeof(window.smart_manager.currentColModel[i].values) != 'undefined') ? window.smart_manager.currentColModel[i].values : {}; type = (typeof(window.smart_manager.currentColModel[i].type) != 'undefined') ? window.smart_manager.currentColModel[i].type : ''; editor = (typeof(window.smart_manager.currentColModel[i].editor) != 'undefined') ? window.smart_manager.currentColModel[i].editor : ''; selectOptions = (typeof(window.smart_manager.currentColModel[i].selectOptions) != 'undefined') ? window.smart_manager.currentColModel[i].selectOptions : ''; multiSelectSeparator = (typeof(window.smart_manager.currentColModel[i].separator) != 'undefined') ? window.smart_manager.currentColModel[i].separator : ''; allowMultiSelect = false; if( type == 'dropdown' && editor == 'select2' ) { if( window.smart_manager.currentColModel[i].hasOwnProperty('select2Options') ) { if( window.smart_manager.currentColModel[i].select2Options.hasOwnProperty('data') ) { column_values = {}; allowMultiSelect = ( window.smart_manager.currentColModel[i].select2Options.hasOwnProperty('multiple') ) ? window.smart_manager.currentColModel[i].select2Options.multiple : false; window.smart_manager.currentColModel[i].select2Options.data.forEach(function(obj) { column_values[obj.id] = obj.text; }); } } } let bu_values = [] if( Object.keys(column_values).length > 0 ){ Object.keys(column_values).forEach(key => { bu_values.push({'key':key, 'value':column_values[key]}) }); } let name = ''; if( typeof( window.smart_manager.currentColModel[i].name ) != 'undefined' ) { name = ( window.smart_manager.currentColModel[i].name ) ? window.smart_manager.currentColModel[i].name.trim() : ''; } if(window.smart_manager.currentColModel[i].hasOwnProperty('name_display') === false) {// added for state management window.smart_manager.currentColModel[i].name_display = name; } if( hidden === false ) { window.smart_manager.column_names[index] = window.smart_manager.currentColModel[i].name_display; //Array for column headers window.smart_manager.currentVisibleColumns[index] = window.smart_manager.currentColModel[i]; index++; } var batch_enabled_flag = false; if (window.smart_manager.currentColModel[i].hasOwnProperty('batch_editable')) { batch_enabled_flag = window.smart_manager.currentColModel[i].batch_editable; } if (batch_enabled_flag === true) { let type = window.smart_manager.currentColModel[i].type; if(window.smart_manager.currentColModel[i].hasOwnProperty('validator')) { if('customNumericTextEditor' == window.smart_manager.currentColModel[i].validator){ type = 'numeric'; } } window.smart_manager.column_names_batch_update[window.smart_manager.currentColModel[i].src] = {title: window.smart_manager.currentColModel[i].name_display, type:type, editor:window.smart_manager.currentColModel[i].editor, values:bu_values, src:window.smart_manager.currentColModel[i].data, allowMultiSelect:allowMultiSelect, multiSelectSeparator:multiSelectSeparator}; if( window.smart_manager.currentColModel[i].type == 'checkbox' ) { window.smart_manager.column_names_batch_update[window.smart_manager.currentColModel[i].src].type = 'dropdown'; window.smart_manager.column_names_batch_update[window.smart_manager.currentColModel[i].src].values = window.smart_manager.getCheckboxValues(window.smart_manager.currentColModel[i]); } if( window.smart_manager.currentColModel[i].type == 'sm.multilist' ) { window.smart_manager.column_names_batch_update[window.smart_manager.currentColModel[i].src].type = 'multilist'; //Code for setting the values let multilistValues = window.smart_manager.column_names_batch_update[window.smart_manager.currentColModel[i].src].values let multilistBulkEditValues = [] multilistValues.forEach((obj) => { let val = (obj.hasOwnProperty('value')) ? obj.value : {} let title = (val.hasOwnProperty('title')) ? val.title : ((val.hasOwnProperty('term')) ? val.term : '') multilistBulkEditValues.push({'key': obj.key, 'value': title}); }) window.smart_manager.column_names_batch_update[window.smart_manager.currentColModel[i].src].values = multilistBulkEditValues } } if ( typeof(window.smart_manager.currentColModel[i].allow_showhide) != 'undefined' && window.smart_manager.currentColModel[i].allow_showhide === false ) { window.smart_manager.currentColModel[i].hidedlg = true; } window.smart_manager.currentColModel[i].name = window.smart_manager.currentColModel[i].index; // setting the default width if (typeof(window.smart_manager.currentColModel[i].width) == 'undefined') { // window.smart_manager.currentColModel[i].width = 80; } //Code for formatting the values var formatted_values = ''; window.smart_manager.currentColModel[i].wordWrap = true; } jQuery('#sm_editor_grid').trigger( 'smart_manager_post_format_columns' ); //custom trigger } Smart_Manager.prototype.setDashboardModel = function (response) { if( typeof response != 'undefined' && response != '' ) { window.smart_manager.sm_store_table_model = response.tables; window.smart_manager.currentColModel = response.columns; //call to function for formatting the column model if( typeof( window.smart_manager.format_dashboard_column_model ) !== "undefined" && typeof( window.smart_manager.format_dashboard_column_model ) === "function" ) { window.smart_manager.format_dashboard_column_model(); } response.columns = window.smart_manager.currentColModel; window.smart_manager.currentDashboardModel = response; //Code for rendering the columns in grid window.smart_manager.formatGridColumns(); if(window.smart_manager.hotPlugin.manualColumnResizePlugin){ window.smart_manager.hotPlugin.manualColumnResizePlugin.manualColumnWidths = [] } window.smart_manager.hot.updateSettings({ data: window.smart_manager.currentDashboardData, columns: window.smart_manager.currentVisibleColumns, colHeaders: window.smart_manager.column_names, forceRender: window.smart_manager.firstLoad }) //Code for handling sort state management if( window.smart_manager.currentDashboardModel.hasOwnProperty('sort_params') ) { if( window.smart_manager.currentDashboardModel.sort_params ) { if( window.smart_manager.currentDashboardModel.sort_params.hasOwnProperty('default') ) { window.smart_manager.hotPlugin.columnSortPlugin.sort(); } else { if( window.smart_manager.currentVisibleColumns.length > 0 ) { for( let index in window.smart_manager.currentVisibleColumns ) { if( window.smart_manager.currentVisibleColumns[index].src == window.smart_manager.currentDashboardModel.sort_params.column ) { let sort_params = Object.assign({}, window.smart_manager.currentDashboardModel.sort_params); sort_params.column = parseInt(index); window.smart_manager.hotPlugin.columnSortPlugin.setSortConfig([sort_params]); break; } } } } } } if(window.smart_manager.firstLoad){ window.smart_manager.firstLoad = false } if(window.smart_manager.sm_beta_pro == 1){ jQuery('#sm_custom_views_update, #sm_custom_views_delete').hide(); let viewSlug = window.smart_manager.getViewSlug(window.smart_manager.dashboardName); if(viewSlug){ if(window.smart_manager.ownedViews.includes(viewSlug)) { jQuery('#sm_custom_views_update, #sm_custom_views_delete').show(); } } if(response.hasOwnProperty('search_params')){ let searchType = 'simple'; if(response.search_params.hasOwnProperty('isAdvanceSearch')){ if(response.search_params.isAdvanceSearch == 'true'){ searchType = 'advanced' } } if(response.search_params.hasOwnProperty('params')){ if( searchType == 'simple' ) { window.smart_manager.simpleSearchText = response.search_params.params; window.smart_manager.advancedSearchQuery = new Array(); jQuery('#search_switch').prop('checked', false); } else { window.smart_manager.simpleSearchText = ''; window.smart_manager.advancedSearchQuery = response.search_params.params; // code to update the advanced seach rule count window.smart_manager.advancedSearchRuleCount = 0; if(("undefined" !== typeof(window.smart_manager.updateAdvancedSearchRuleCount)) && ("function" === typeof(window.smart_manager.updateAdvancedSearchRuleCount))){ window.smart_manager.updateAdvancedSearchRuleCount(); } jQuery('#search_switch').prop('checked', true); } } window.smart_manager.clearSearchOnSwitch = false; window.smart_manager.searchType = ( searchType == 'simple' ) ? 'advanced' : 'simple'; let el = '#search_switch'; jQuery(el).attr('switchSearchType', searchType); jQuery(el).trigger('change'); //Code to re-draw the search content based on search type if( searchType == 'simple' ) { jQuery('#sm_simple_search_box').val(window.smart_manager.simpleSearchText); } window.smart_manager.clearSearchOnSwitch = true; } } if( window.smart_manager.searchType != 'simple' && !response.hasOwnProperty('search_params') ) { window.smart_manager.initialize_advanced_search(); //initialize advanced search control } if ( "undefined" !== typeof (window.smart_manager.refreshColumnsTitleAttribute) && "function" === typeof (window.smart_manager.refreshColumnsTitleAttribute) ) { window.smart_manager.refreshColumnsTitleAttribute(); } window.smart_manager.exportButtonHtml(); jQuery('#sm_editor_grid').trigger( 'smart_manager_post_load_grid' ); //custom trigger } } Smart_Manager.prototype.getViewSlug = function(title = '') { return Object.keys(window.smart_manager.sm_views).find(key => window.smart_manager.sm_views[key] === title); } //Function to check if 'Tasks' is enabled or not Smart_Manager.prototype.isTasksEnabled = function(){ return (jQuery("#sm_show_tasks").is(":checked")) ? 1 : 0; } Smart_Manager.prototype.displayShowHideColumnSettings = function (isShow = true) { (isShow) ? jQuery('#show_hide_cols_sm_editor_grid').show() : jQuery('#show_hide_cols_sm_editor_grid').hide(); } Smart_Manager.prototype.getDashboardModel = function () { window.smart_manager.currentDashboardModel = ''; // Ajax request to get the dashboard model let params = {}; params.data_type = 'json'; params.hideLoader = false; params.data = { cmd: 'get_dashboard_model', security: window.smart_manager.sm_nonce, active_module: window.smart_manager.dashboard_key, is_public: ( window.smart_manager.sm_dashboards_public.indexOf(window.smart_manager.dashboard_key) != -1 ) ? 1 : 0, active_module_title: window.smart_manager.dashboardName }; // Code for passing extra param for taxonomy & view handling if( window.smart_manager.sm_beta_pro == 1 ) { let viewSlug = window.smart_manager.getViewSlug(window.smart_manager.dashboardName); params.data['is_view'] = 0; if(viewSlug) { params.data['is_view'] = 1; params.data['active_view'] = viewSlug; params.data['active_module'] = (window.smart_manager.viewPostTypes.hasOwnProperty(viewSlug)) ? window.smart_manager.viewPostTypes[viewSlug] : window.smart_manager.dashboard_key; window.smart_manager.refreshIsViewAuthor(viewSlug); } // Flag for handling taxonomy dashboards params.data['is_taxonomy'] = window.smart_manager.isTaxonomyDashboard(); // Code for passing extra param for handling tasks params.data = ("undefined" !== typeof(window.smart_manager.addTasksParams) && "function" === typeof(window.smart_manager.addTasksParams) && 1 == window.smart_manager.sm_beta_pro) ? window.smart_manager.addTasksParams(params.data) : params.data; } window.smart_manager.send_request(params, window.smart_manager.setDashboardModel); } Smart_Manager.prototype.set_data = function(response) { if( typeof response != 'undefined' && response != '' ) { let res = {}; if( response != 'null' && window.smart_manager.isJSON( response ) ) { res = JSON.parse(response); if(res && res.hasOwnProperty('meta')){ window.smart_manager.isViewContainSearchParams = (res.meta.hasOwnProperty('is_view_contain_search_params') && (true === res.meta.is_view_contain_search_params || 'true' === res.meta.is_view_contain_search_params)) ? true : false; } window.smart_manager.totalRecords = parseInt(res.total_count); window.smart_manager.displayTotalRecords = ( res.hasOwnProperty('display_total_count') ) ? res.display_total_count : res.total_count; // re-initialize the loadedTotalRecords if( window.smart_manager.page == 1 ) { window.smart_manager.loadedTotalRecords = 0 } if(!window.smart_manager.isRefreshingLoadedPage){ let loadedRecordCount = (res.hasOwnProperty('loaded_total_count')) ? parseInt(res.loaded_total_count) : res.items.length window.smart_manager.loadedTotalRecords += loadedRecordCount } if( window.smart_manager.page > 1 ) { window.smart_manager.showLoader(false); let lastRowIndex = window.smart_manager.currentDashboardData.length; let idsIndex = {}; let idKey = window.smart_manager.getKeyID() window.smart_manager.currentDashboardData.map((obj, key) => { let id = (obj[idKey]) ? obj[idKey] : '' if(id != ''){ idsIndex[id] = key } }) //if no matchingids then replace else push/concat if(Object.keys(idsIndex).length > 0) { res.items.map((data, key) => { let id = (data[idKey]) ? data[idKey] : '' if(0 <= idsIndex[id]){ window.smart_manager.currentDashboardData[idsIndex[id]] = data; } else { window.smart_manager.currentDashboardData.push(data) } }) } else { window.smart_manager.currentDashboardData = window.smart_manager.currentDashboardData.concat(res.items) } window.smart_manager.hot.forceFullRender = false window.smart_manager.hot.loadData(window.smart_manager.currentDashboardData, false); if( window.smart_manager.sm_beta_pro == 0 ) { if( typeof( window.smart_manager.modifiedRows ) != 'undefined' ) { if( window.smart_manager.modifiedRows.length >= window.smart_manager.sm_updated_successful ) { //call to function for highlighting selected row ids if( typeof( window.smart_manager.disableSelectedRows ) !== "undefined" && typeof( window.smart_manager.disableSelectedRows ) === "function" ) { window.smart_manager.disableSelectedRows(true); } } } } } else { window.smart_manager.currentDashboardData = ( window.smart_manager.totalRecords > 0 ) ? res.items : []; if(document.getElementById('sm_export_entire_store') !== null){ document.getElementById('sm_export_entire_store').innerHTML = (window.smart_manager.isFilteredData()) ? _x('All Items In Search Results', 'export button', 'smart-manager-for-wp-e-commerce') : _x('Entire Store', 'export button', 'smart-manager-for-wp-e-commerce'); } window.smart_manager.setExportButtonHTML(); document.getElementById('sm_beta_dup_entire_store').innerHTML = (window.smart_manager.isFilteredData()) ? _x('All Items In Search Results', 'duplicate button', 'smart-manager-for-wp-e-commerce') : _x('Entire Store', 'duplicate button', 'smart-manager-for-wp-e-commerce') } } else { window.smart_manager.currentDashboardData = []; } if( window.smart_manager.page == 1 ) { if( window.smart_manager.columnSort ) { window.smart_manager.hot.loadData(window.smart_manager.currentDashboardData); window.smart_manager.hot.scrollViewportTo(0, 0); } else { jQuery('#sm_dashboard_kpi').remove(); if( res.hasOwnProperty('kpi_data') ) { window.smart_manager.kpiData = res.kpi_data; if( Object.entries(window.smart_manager.kpiData).length > 0 ) { let kpi_html = new Array(); Object.entries(window.smart_manager.kpiData).forEach(([kpiTitle, kpiObj]) => { kpi_html.push(' '+ kpiTitle +'('+ ( ( kpiObj.hasOwnProperty('count') !== false ) ? kpiObj['count'] : 0 ) +') '); }); if( kpi_html.length > 0 ) { jQuery('#sm_bottom_bar_left').append('
          '+ kpi_html.join(" | ") +'
          ' ); } } } else { window.smart_manager.kpiData = {}; } if(window.smart_manager.currentVisibleColumns.length > 0){ if(window.smart_manager.isColumnModelUpdated){ window.smart_manager.formatGridColumns(); window.smart_manager.hot.updateSettings({ data: window.smart_manager.currentDashboardData, columns: window.smart_manager.currentVisibleColumns, colHeaders: window.smart_manager.column_names, // forceRender: window.smart_manager.firstLoad }) } else { window.smart_manager.hot.updateSettings({ data: window.smart_manager.currentDashboardData, forceRender: window.smart_manager.firstLoad }) } if(window.smart_manager.firstLoad){ window.smart_manager.firstLoad = false } } window.smart_manager.showLoader(false); } } window.smart_manager.refreshBottomBar(); if(window.smart_manager.totalRecords == 0){ jQuery('#sm_editor_grid_load_items').attr('disabled','disabled'); jQuery('#sm_editor_grid_load_items').addClass('sm-ui-state-disabled'); jQuery('#sm_bottom_bar_right #sm_beta_display_records').hide(); jQuery('#sm_bottom_bar_right #sm_beta_load_more_records').text(sprintf( /* translators: %s: dashboard display name */ _x('No %s Found', 'bottom bar status', 'smart-manager-for-wp-e-commerce'), window.smart_manager.dashboardDisplayName)); } else { if( window.smart_manager.currentDashboardData.length >= window.smart_manager.totalRecords ) { jQuery('#sm_editor_grid_load_items').attr('disabled','disabled'); jQuery('#sm_editor_grid_load_items').addClass('sm-ui-state-disabled'); jQuery('#sm_bottom_bar_right #sm_beta_display_records').hide(); jQuery('#sm_bottom_bar_right #sm_beta_load_more_records').text(sprintf( /* translators: %1$d: number of display records %2$s: dashboard display name */ _x('%1$d %2$s loaded', 'bottom bar status', 'smart-manager-for-wp-e-commerce'), window.smart_manager.displayTotalRecords, window.smart_manager.dashboardDisplayName)); } else { jQuery('#sm_bottom_bar_right #sm_beta_display_records').show(); jQuery('#sm_editor_grid_load_items').removeAttr('disabled'); jQuery('#sm_editor_grid_load_items').removeClass('sm-ui-state-disabled'); jQuery('#sm_bottom_bar_right #sm_beta_load_more_records').html(window.smart_manager.loadMoreBtnHtml); jQuery('#sm_bottom_bar_right #sm_editor_grid_load_items span').html(window.smart_manager.dashboardDisplayName); } jQuery('#sm_bottom_bar_right').show(); } window.smart_manager.gettingData = 0; } } //Function to refresh the bottom bar of grid Smart_Manager.prototype.refreshBottomBar = function() { let msg = ( window.smart_manager.currentDashboardData.length > 0 ) ? sprintf( /* translators: %1$d: number of total records %2$d: number of display records %3$s: dashboard display name */ _x('%1$d of %2$d %3$s loaded', 'bottom bar status', 'smart-manager-for-wp-e-commerce'), window.smart_manager.loadedTotalRecords, window.smart_manager.displayTotalRecords, window.smart_manager.dashboardDisplayName) : sprintf( /* translators: %s: dashboard display name */ _x('No %s Found', 'bottom bar status', 'smart-manager-for-wp-e-commerce'), window.smart_manager.dashboardDisplayName); jQuery('#sm_bottom_bar_right #sm_beta_display_records').html(msg); } Smart_Manager.prototype.getDataDefaultParams = function(params) { let defaultParams = {}; defaultParams.data = { cmd: 'get_data_model', active_module: window.smart_manager.dashboard_key, security: window.smart_manager.sm_nonce, is_public: ( window.smart_manager.sm_dashboards_public.indexOf(window.smart_manager.dashboard_key) != -1 ) ? 1 : 0, sm_page: window.smart_manager.page, sm_limit: window.smart_manager.limit, SM_IS_WOO30: window.smart_manager.sm_is_woo30, sort_params: (window.smart_manager.currentDashboardModel.hasOwnProperty('sort_params') ) ? window.smart_manager.currentDashboardModel.sort_params : '', table_model: (window.smart_manager.currentDashboardModel.hasOwnProperty('tables') ) ? window.smart_manager.currentDashboardModel.tables : '', search_text: (window.smart_manager.searchType == 'simple') ? window.smart_manager.simpleSearchText : '', advanced_search_query: JSON.stringify((window.smart_manager.searchType != 'simple') ? window.smart_manager.advancedSearchQuery : []) }; // Code for passing extra param for view handling if( window.smart_manager.sm_beta_pro == 1 ) { let viewSlug = window.smart_manager.getViewSlug(window.smart_manager.dashboardName); defaultParams.data['is_view'] = 0; if(viewSlug){ defaultParams.data['is_view'] = 1; defaultParams.data['active_view'] = viewSlug; defaultParams.data['active_module'] = (window.smart_manager.viewPostTypes.hasOwnProperty(viewSlug)) ? window.smart_manager.viewPostTypes[viewSlug] : window.smart_manager.dashboard_key; } // Code for passing extra param for handling tasks defaultParams.data = ("undefined" !== typeof(window.smart_manager.addTasksParams) && "function" === typeof(window.smart_manager.addTasksParams) && 1 == window.smart_manager.sm_beta_pro) ? window.smart_manager.addTasksParams(defaultParams.data) : defaultParams.data; } if( typeof params != 'undefined' ) { if( Object.getOwnPropertyNames(params).length > 0 ) { let paramsData = (params.hasOwnProperty('data')) ? params.data : {} if( Object.getOwnPropertyNames(paramsData).length > 0 ) { defaultParams = Object.assign(paramsData, defaultParams.data); } defaultParams = Object.assign(params, defaultParams); } } window.smart_manager.currentGetDataParams = defaultParams; } Smart_Manager.prototype.getData = function(params = {}) { window.smart_manager.gettingData = 1; window.smart_manager.isRefreshingLoadedPage = false; if( window.smart_manager.page == 1 ) { if ( typeof (window.smart_manager.getDataDefaultParams) !== "undefined" && typeof (window.smart_manager.getDataDefaultParams) === "function" ) { window.smart_manager.getDataDefaultParams(params); window.smart_manager.currentGetDataParams.hideLoader = false } } else { if( typeof(window.smart_manager.currentGetDataParams.data) != 'undefined' && typeof(window.smart_manager.currentGetDataParams.data.sm_page) != 'undefined' ) { if(params.hasOwnProperty('refreshPage')){ window.smart_manager.isRefreshingLoadedPage = true; window.smart_manager.currentGetDataParams.data.sm_page = params.refreshPage; window.smart_manager.currentGetDataParams.async = false; } else { window.smart_manager.currentGetDataParams.data.sm_page = window.smart_manager.page; } window.smart_manager.currentGetDataParams.data.sort_params = window.smart_manager.currentDashboardModel.sort_params; } } window.smart_manager.send_request(window.smart_manager.currentGetDataParams, window.smart_manager.set_data); } Smart_Manager.prototype.inline_edit_dlg = function(params) { if (params.dlg_width == '' || typeof (params.dlg_width) == 'undefined') { modal_width = 350; } else { modal_width = params.dlg_width; } if (params.dlg_height == '' || typeof (params.dlg_height) == 'undefined') { modal_height = 390; } else { modal_height = params.dlg_height; } let ok_btn = [{ text: _x("OK", 'button', 'smart-manager-for-wp-e-commerce'), class: 'sm_inline_dialog_ok sm-dlg-btn-yes', click: function() { jQuery( this ).dialog( "close" ); } }]; jQuery( "#sm_inline_dialog" ).html(params.content); let dialog_params = { closeOnEscape: true, draggable: false, dialogClass: 'sm_ui_dialog_class', height: modal_height, width: modal_width, modal: (params.hasOwnProperty('modal')) ? params.modal : false, position: {my: ( params.hasOwnProperty('position_my') ) ? params.position_my : 'left center+250px', at: ( params.hasOwnProperty('position_my') ) ? params.position_at : 'left center', of: params.target}, create: function (event, ui) { if( !(params.hasOwnProperty('title') && params.title != '') ) { jQuery(".ui-widget-header").hide(); } }, open: function() { if( params.hasOwnProperty('show_close_icon') && params.show_close_icon === false ) { jQuery(this).find('.ui-dialog-titlebar-close').hide(); } jQuery('.ui-widget-overlay').bind('click', function() { jQuery('#sm_inline_dialog').dialog('close'); }); if( !(params.hasOwnProperty('title') && params.title != '') ) { jQuery(".ui-widget-header").hide(); } else if( (params.hasOwnProperty('title') && params.title != '') ) { jQuery(".ui-widget-header").show(); } if( params.hasOwnProperty('customDataAttributes') ) { Object.entries(params.customDataAttributes).forEach(([key, value]) => { jQuery(this).attr(key, value); }); } jQuery(this).html(params.content); }, close: function(event, ui) { jQuery(this).dialog('close'); }, buttons: ( params.hasOwnProperty('display_buttons') && params.display_buttons === false ) ? [] : ( params.hasOwnProperty('buttons_model') ? params.buttons_model : ok_btn ) } if( params.hasOwnProperty('title') ) { dialog_params.title = params.title; } if( params.hasOwnProperty('titleIsHtml') ) { dialog_params.titleIsHtml = params.titleIsHtml; } jQuery( "#sm_inline_dialog" ).dialog(dialog_params); jQuery('.sm_ui_dialog_class, .ui-widget-overlay').show(); } Smart_Manager.prototype.getTextWidth = function (text, font) { // re-use canvas object for better performance let canvas = window.smart_manager.getTextWidthCanvas || (window.smart_manager.getTextWidthCanvas = document.createElement("canvas")); let context = canvas.getContext("2d"); context.font = font; let metrics = context.measureText(text); return metrics.width; } Smart_Manager.prototype.formatGridColumns = function () { if(Array.isArray(window.smart_manager.currentVisibleColumns) && window.smart_manager.currentVisibleColumns.length > 0){ window.smart_manager.currentVisibleColumns.map((c, i) => { let colWidth = c.width || 0; let header_text = window.smart_manager.column_names[i], font = '30px Arial'; // font = '26px ' + window.smart_manager.body_font_family; let newWidth = window.smart_manager.getTextWidth(header_text,font); if( newWidth > colWidth && !c.width ) { c.width = ( newWidth < 250 ) ? newWidth : 250; } c.width = Math.round(parseInt(c.width)) window.smart_manager.currentVisibleColumns[i] = c }) } } Smart_Manager.prototype.enableDisableButtons = function() { //enabling the action buttons if( window.smart_manager.selectedRows.length > 0 || window.smart_manager.selectAll ) { if( jQuery('.sm_top_bar_action_btns #del_sm_editor_grid svg').hasClass('sm-ui-state-disabled') ) { jQuery('.sm_top_bar_action_btns #del_sm_editor_grid svg').removeClass('sm-ui-state-disabled'); } if( jQuery('.sm_top_bar_action_btns #print_invoice_sm_editor_grid_btn svg').hasClass('sm-ui-state-disabled') ) { jQuery('.sm_top_bar_action_btns #print_invoice_sm_editor_grid_btn svg').removeClass('sm-ui-state-disabled'); } } else { if( !jQuery('.sm_top_bar_action_btns #del_sm_editor_grid svg').hasClass('sm-ui-state-disabled') ) { jQuery('.sm_top_bar_action_btns #del_sm_editor_grid svg').addClass('sm-ui-state-disabled'); } if( !jQuery('.sm_top_bar_action_btns #print_invoice_sm_editor_grid_btn svg').hasClass('sm-ui-state-disabled') ) { jQuery('.sm_top_bar_action_btns #print_invoice_sm_editor_grid_btn svg').addClass('sm-ui-state-disabled'); } } } Smart_Manager.prototype.disableSelectedRows = function( readonly ) { for (let i = 0; i < window.smart_manager.hot.countRows(); i++) { if( window.smart_manager.modifiedRows.indexOf(i) != -1 ) { continue; } for (let j = 0; j < window.smart_manager.hot.countCols(); j++) { window.smart_manager.hot.setCellMeta( i, j, 'readOnly', readonly ); } } } //Function to highlight the edited cells Smart_Manager.prototype.highlightEditedCells = function() { if( typeof window.smart_manager.dirtyRowColIds == 'undefined' || Object.getOwnPropertyNames(window.smart_manager.dirtyRowColIds).length == 0 ) { return; } for( let row in window.smart_manager.dirtyRowColIds ) { window.smart_manager.dirtyRowColIds[row].forEach(function(colIndex) { cellProp = window.smart_manager.hot.getCellMeta(row, colIndex); prevClassName = cellProp.className; if( prevClassName == '' || typeof prevClassName == 'undefined' || ( typeof(prevClassName) != 'undefined' && prevClassName.indexOf('sm-grid-dirty-cell') == -1 ) ) { window.smart_manager.hot.setCellMeta(row, colIndex, 'className', (prevClassName + ' ' + 'sm-grid-dirty-cell')); jQuery('.smCheckboxColumnModel input[data-row='+row+']').parents('tr').removeClass('sm_edited').addClass('sm_edited'); } }); } } Smart_Manager.prototype.isHTML = RegExp.prototype.test.bind(/(<([^>]+)>)/i); Smart_Manager.prototype.isJSON = function(str) { try { return (JSON.parse(str) && !!str); } catch (e) { return false; } } Smart_Manager.prototype.getCustomRenderer = function ( col ) { let customRenderer = ''; let colObj = window.smart_manager.currentVisibleColumns[col]; if( typeof( colObj ) != 'undefined' ) { let renderer = ( colObj.hasOwnProperty('renderer') ) ? colObj.renderer : ''; if( colObj.hasOwnProperty('type') ) { if( colObj.type == 'numeric' ) { customRenderer = 'numericRenderer'; } else if( colObj.type == 'text' && renderer != 'html' ) { customRenderer = 'customTextRenderer'; } else if( colObj.type == 'html' || renderer == 'html' ) { customRenderer = 'customHtmlRenderer'; } else if( colObj.type == 'checkbox' ) { // customRenderer = 'customCheckboxRenderer'; } else if( colObj.type == 'password' ) { customRenderer = 'customPasswordRenderer'; } } } return customRenderer; } Smart_Manager.prototype.generateImageGalleryDlgHtml = function( imageObj ) { let html = ''; if( typeof( imageObj ) !== "undefined" ) { Object.entries(imageObj).forEach(([id, imageUrl]) => { html += ''; }); } return html; } Smart_Manager.prototype.handleMediaUpdate = function( params ) { let file_frame; // If the media frame already exists, reopen it. if ( file_frame ) { file_frame.open(); return; } let allowMultiple = ( params.hasOwnProperty('allowMultiple') ) ? params.allowMultiple : false; // Code for attaching media to the posts wp.media.model.settings.post.id = 0 if('posts_id' === window.smart_manager.getKeyID() && params.hasOwnProperty('row_data_id')){ wp.media.model.settings.post.id = params.row_data_id } // Create the media frame. file_frame = wp.media.frames.file_frame = wp.media({ title: ( params.hasOwnProperty('uploaderTitle') ) ? params.uploaderTitle : jQuery( this ).data( 'uploader_title' ), button: { text: ( params.hasOwnProperty('uploader_button_text') ) ? params.uploaderButtonText : jQuery( this ).data( 'uploader_button_text' ), }, library: { type: 'image' }, multiple: allowMultiple // Set to true to allow multiple files to be selected }); if( params.hasOwnProperty('callback') ) { file_frame.on( 'select', function() { let attachments = ( allowMultiple ) ? file_frame.state().get('selection').toJSON() : file_frame.state().get('selection').first().toJSON(); params.callback( attachments ) }); } file_frame.open(); } Smart_Manager.prototype.inlineUpdateMultipleImages = function(galleryImages){ if(!galleryImages || !((Object.keys(galleryImages)).every(galleryImage => galleryImages.hasOwnProperty(galleryImage)))){ return; } let params = {}; params.data = { cmd: 'inline_update', active_module: window.smart_manager.dashboard_key, edited_data: JSON.stringify({[galleryImages.id]:{[galleryImages.src]:galleryImages.values}}), security: window.smart_manager.sm_nonce, pro: ('undefined' !== typeof(window.smart_manager.sm_beta_pro)) ? window.smart_manager.sm_beta_pro : 0, table_model: (window.smart_manager.currentDashboardModel.hasOwnProperty('tables') ) ? window.smart_manager.currentDashboardModel.tables : '' }; params.data = ("undefined" !== typeof(window.smart_manager.addTasksParams) && "function" === typeof(window.smart_manager.addTasksParams) && 1 == window.smart_manager.sm_beta_pro) ? window.smart_manager.addTasksParams(params.data) : params.data; window.smart_manager.send_request(params,function(response){ if(galleryImages.hasOwnProperty('rowNo')){ window.smart_manager.getData({refreshPage: (Math.ceil((parseInt(galleryImages.rowNo)/window.smart_manager.limit)))}); window.smart_manager.hot.render(); } else{ window.smart_manager.refresh(); } if(1 == window.smart_manager.sm_beta_pro && 'undefined' !== typeof(window.smart_manager.displayGalleryImagesModal) && 'function' === typeof(window.smart_manager.displayGalleryImagesModal)){ window.smart_manager.displayGalleryImagesModal({id:galleryImages.id,src:galleryImages.src,imageGalleryHtml:galleryImages.imageGalleryHtml,rowNo:galleryImages.rowNo || 0}) } }); }; Smart_Manager.prototype.showImagePreview = function(params) { let xOffset = 150, yOffset = 30; if( jQuery('#sm_img_preview').length == 0 ) { jQuery("body").append("
          "+ params.title +"
          "); } jQuery("#sm_img_preview") .css("top", (params.event.pageY - xOffset) + "px") .css("left", (params.event.pageX + yOffset) + "px") .fadeIn("fast") .show(); } Smart_Manager.prototype.loadGrid = function() { jQuery('#sm_editor_grid').html(''); window.smart_manager.formatGridColumns(); window.smart_manager.hot = new Handsontable(window.smart_manager.container, { data: window.smart_manager.currentDashboardData, height: window.smart_manager.grid_height, width: window.smart_manager.grid_width, // allowEmpty: true, // default is true rowHeaders: function(index) { return ''; }, // for row headings (like numbering) colHeaders: true, // for col headings // renderAllRows: true, // viewportRowRenderingOffset: 100, // -- problem no. of rows outside the visible part of table. Default: auto stretchH: 'all', // strech autoColumnSize: {useHeaders: true}, // wordWrap: true, //default is true // autoRowSize: false, // by default its undefined which is also same rowHeights: window.smart_manager.rowHeight, colWidths: 100, bindRowsWithHeaders: true, manualColumnResize: true, // manualRowResize: true, manualColumnMove: false, columnSorting: true, // columnSorting: { sortEmptyCells: false }, //--problem // fillHandle: 'vertical', //for excel like filling of cells fillHandle: { //for excel like filling of cells direction: 'vertical', autoInsertRow: false // For restricting to add new rows automatically when dragging the cells }, persistentState: true, customBorders: true, // disableVisualSelection: true, columns: window.smart_manager.currentVisibleColumns, colHeaders: window.smart_manager.column_names, }); window.smart_manager.hotPlugin.columnSortPlugin = window.smart_manager.hot.getPlugin('columnSorting'); window.smart_manager.hotPlugin.manualColumnResizePlugin = window.smart_manager.hot.getPlugin('manualColumnResize') window.smart_manager.hot.updateSettings({ cells: function(row, col, prop) { let customRenderer = window.smart_manager.getCustomRenderer(col); if( customRenderer != '' ) { let cellProperties = {}; cellProperties.renderer = customRenderer; return cellProperties; } }, afterOnCellMouseOver: function(e, coords, td) { if( coords.row < 0 || coords.col < 0 ) { return; } let col = this.getCellMeta(coords.row, coords.col), current_cell_value = this.getDataAtCell(coords.row, coords.col); if( typeof(col.type) != 'undefined' && current_cell_value ) { if( col.type == 'sm.image' ) { let row_title = ''; if( window.smart_manager.dashboard_key == 'product' ) { row_title = this.getDataAtRowProp(coords.row, 'posts_post_title'); row_title = ( window.smart_manager.isHTML(row_title) == true ) ? jQuery(row_title).text() : row_title; row_title = row_title; } let params = { 'current_cell_value': current_cell_value, 'event': e, 'title': row_title }; if( typeof( window.smart_manager.showImagePreview ) !== "undefined" && typeof( window.smart_manager.showImagePreview ) === "function" ) { window.smart_manager.showImagePreview(params); } } } }, afterOnCellMouseOut: function(e, coords, td) { if( jQuery('#sm_img_preview').length > 0 ) { jQuery('#sm_img_preview').remove(); } }, afterRender: function( isForced ) { //TODO: check if( isForced === true ) { window.smart_manager.showLoader(false); } }, beforeColumnSort: function(currentSortConfig, destinationSortConfigs) { window.smart_manager.hotPlugin.columnSortPlugin.setSortConfig(destinationSortConfigs); if( typeof(destinationSortConfigs) != 'undefined' ) { if( destinationSortConfigs.length > 0 ) { if( destinationSortConfigs[0].hasOwnProperty('column') ) { if( window.smart_manager.currentVisibleColumns.length > 0 ) { let colObj = window.smart_manager.currentVisibleColumns[destinationSortConfigs[0].column]; window.smart_manager.currentDashboardModel.sort_params = { 'column': colObj.src, 'sortOrder': destinationSortConfigs[0].sortOrder }; window.smart_manager.columnSort = true; } } } else { if( window.smart_manager.currentDashboardModel.hasOwnProperty('sort_params') ) { window.smart_manager.currentDashboardModel.sort_params = Object.assign({}, window.smart_manager.defaultSortParams); } window.smart_manager.columnSort = false; } window.smart_manager.page = 1; window.smart_manager.getData(); } return false; // The blockade for the default sort action. }, afterCreateRow: function (row, amount) { while( amount > 0 ) { // setTimeout( function() { //added for handling dirty class for edited cells let idKey = window.smart_manager.getKeyID(); let row_data_id = window.smart_manager.hot.getDataAtRowProp(row, idKey); if( typeof(row_data_id) != 'undefined' && row_data_id ) { return; } window.smart_manager.addRecords_count++; window.smart_manager.hot.setDataAtRowProp(row,idKey,'sm_temp_'+window.smart_manager.addRecords_count); let val = '', colObj = {}; for( let key in window.smart_manager.currentColModel ) { colObj = window.smart_manager.currentColModel[key]; if( colObj.hasOwnProperty('data') ) { if( jQuery.inArray(colObj.data, window.smart_manager.defaultColumnsAddRow) >= 0 ) { if( typeof colObj.defaultValue != 'undefined' ) { val = colObj.defaultValue; } else { if( typeof colObj.selectOptions != 'undefined' ) { val = Object.keys(colObj.selectOptions)[0] } else { val = 'test'; } } window.smart_manager.hot.setDataAtRowProp(row, colObj.data, val); } } } // }, 1 ); row++; amount--; } }, afterChange: function(changes, source) { if( window.smart_manager.selectAll === true || window.smart_manager.isRefreshingLoadedPage || changes === null ) { return; } let col = {}, cellProp = {}, colIndex = '', idKey = window.smart_manager.getKeyID(), colTypesDisabledHiglight = new Array('sm.image'); changes.forEach(([row, prop, oldValue, newValue]) => { if( ( row < 0 && prop == 0 ) || (oldValue == newValue && String(oldValue).length == String(newValue).length) ) { return; } if( window.smart_manager.modifiedRows.indexOf(row) == -1 ) { window.smart_manager.modifiedRows.push(row); } colIndex = window.smart_manager.hot.propToCol(prop); if( typeof(colIndex) == 'number' ) { col = window.smart_manager.hot.getCellMeta(row, colIndex); } let id = window.smart_manager.hot.getDataAtRowProp(row, idKey); if( (oldValue != newValue || String(oldValue).length != String(newValue).length) && prop != idKey && colTypesDisabledHiglight.indexOf(col.type) == -1 ) { //for inline edit cellProp = window.smart_manager.hot.getCellMeta(row, prop); prevClassName = ( typeof(cellProp.className) != 'undefined' ) ? cellProp.className : ''; //dirty cells variable if( window.smart_manager.dirtyRowColIds.hasOwnProperty(row) === false ) { window.smart_manager.dirtyRowColIds[row] = new Array(); } if( window.smart_manager.dirtyRowColIds[row].indexOf(colIndex) == -1 ) { window.smart_manager.dirtyRowColIds[row].push(colIndex); } if( jQuery('.sm_top_bar_action_btns #save_sm_editor_grid_btn svg').hasClass('sm-ui-state-disabled') ) { jQuery('.sm_top_bar_action_btns #save_sm_editor_grid_btn svg').removeClass('sm-ui-state-disabled'); } if( prevClassName == '' || ( typeof(prevClassName) != 'undefined' && prevClassName.indexOf('sm-grid-dirty-cell') == -1 ) ) { //creating the edited json string if( window.smart_manager.editedData.hasOwnProperty(id) === false ) { window.smart_manager.editedData[id] = {}; } if( Object.entries(col).length === 0 ) { if( typeof( window.smart_manager.currentColModel ) != 'undefined' ) { window.smart_manager.currentColModel.forEach(function(value) { if( value.hasOwnProperty('data') && value.data == prop ) { col.src = value.src; } }); } } window.smart_manager.editedData[id][col.src] = (window.smart_manager.editedAttribueSlugs && (false === (window.smart_manager.excludedEditedFieldKeys).includes(col.src))) ? window.smart_manager.editedAttribueSlugs : newValue; window.smart_manager.editedCellIds.push({'row': row, 'col':colIndex}); } if( window.smart_manager.sm_beta_pro == 0 ) { if( typeof( window.smart_manager.modifiedRows ) != 'undefined' ) { if( window.smart_manager.modifiedRows.length >= window.smart_manager.sm_updated_successful ) { //call to function for highlighting selected row ids if( typeof( window.smart_manager.disableSelectedRows ) !== "undefined" && typeof( window.smart_manager.disableSelectedRows ) === "function" ) { window.smart_manager.disableSelectedRows(true); } } } } } }); //call to function for highlighting edited cell ids if( typeof( window.smart_manager.highlightEditedCells ) !== "undefined" && typeof( window.smart_manager.highlightEditedCells ) === "function" ) { window.smart_manager.highlightEditedCells(); } window.smart_manager.hot.render(); }, afterOnCellMouseUp: function (e, coords, td) { if((!coords) || (coords && (coords.row === -1) && (coords.col !== -1))){ return; } window.smart_manager.editedAttribueSlugs = ''; window.smart_manager.selectAll = false //Code for having checkbox column selection if(coords.col === -1){ //code for handling header checkbox selection if(window.smart_manager.hot){ if(window.smart_manager.hot.selection){ if(window.smart_manager.hot.selection.highlight){ if(window.smart_manager.hot.selection.highlight.selectAll){ window.smart_manager.selectAll = true } if(window.smart_manager.hot.selection.highlight.selectedRows){ window.smart_manager.selectedRows = window.smart_manager.hot.selection.highlight.selectedRows } } } } if( typeof( window.smart_manager.enableDisableButtons ) !== "undefined" && typeof( window.smart_manager.enableDisableButtons ) === "function" ) { window.smart_manager.enableDisableButtons(); } return; } let col = this.getCellMeta(coords.row, coords.col); if( typeof(col.readOnly) != 'undefined' && col.readOnly == 'true' ) { return; } let id_key = window.smart_manager.getKeyID(), row_data_id = this.getDataAtRowProp(coords.row, id_key), current_cell_value = this.getDataAtCell(coords.row, coords.col), params = {'coords': coords, 'td': td, 'colObj': col, 'row_data_id': row_data_id, 'current_cell_value': current_cell_value}; window.smart_manager.defaultEditor = true; jQuery('#sm_editor_grid').trigger('sm_grid_on_afterOnCellMouseUp',[params]); if( window.smart_manager.hasOwnProperty('defaultEditor') && window.smart_manager.defaultEditor === false ) { return; } if( typeof (col.type) != 'undefined' && col.type == 'sm.multipleImage' ) { // code to handle the functionality to handle editing of 'image' data types let galleryImages = current_cell_value, imageGalleryHtml = `'; if( Object.entries(col).length === 0 ) { if( typeof( window.smart_manager.currentColModel ) != 'undefined' ) { window.smart_manager.currentColModel.forEach(function(value) { if( value.hasOwnProperty('data') && value.data == col.prop ) { col.src = value.src; } }); } } if('undefined' !== typeof(window.smart_manager.displayGalleryImagesModal) && 'function' === typeof(window.smart_manager.displayGalleryImagesModal) && row_data_id && col.src && imageGalleryHtml){ window.smart_manager.displayGalleryImagesModal({id:row_data_id,src:col.src,imageGalleryHtml:imageGalleryHtml,rowNo:coords.row}); } } if( typeof (col.type) != 'undefined' && col.type == 'sm.image' && coords.row >= 0 ) { // code to handle the functionality to handle editing of 'image' data types if ( typeof (window.smart_manager.handleMediaUpdate) !== "undefined" && typeof (window.smart_manager.handleMediaUpdate) === "function" ) { let params = {row_data_id: row_data_id}; // When an image is selected, run a callback. params.callback = function( attachment ) { if( typeof( attachment ) == 'undefined' ) { return; } let params = {}; params = { editedImage: JSON.stringify({[row_data_id] : {[col.src]: attachment['id']}}), row: coords.row, col: coords.col, value: attachment['url'], source: 'image_inline_update' } let editedColumnName = ''; if("undefined" !== typeof(window.smart_manager.getColDisplayName) && "function" === typeof(window.smart_manager.getColDisplayName)){ editedColumnName = window.smart_manager.getColDisplayName(col.src); } if(1 == window.smart_manager.sm_beta_pro){ window.smart_manager.processName = _x('Inline Edit','process name','smart-manager-for-wp-e-commerce'); window.smart_manager.processContent = (editedColumnName) ? editedColumnName : col.src; if("undefined" !== typeof(window.smart_manager.inlineUpdateImage) && "function" === typeof(window.smart_manager.inlineUpdateImage)){ window.smart_manager.processCallback = window.smart_manager.inlineUpdateImage; } window.smart_manager.processCallbackParams = params; if("undefined" !== typeof(window.smart_manager.showTitleModal) && "function" === typeof (window.smart_manager.showTitleModal)){ window.smart_manager.showTitleModal() } } else{ if("undefined" !== typeof(window.smart_manager.inlineUpdateImage) && "function" === typeof(window.smart_manager.inlineUpdateImage) && params){ window.smart_manager.inlineUpdateImage(params); } } }; window.smart_manager.handleMediaUpdate( params ); } } if( typeof (col.type) != 'undefined' && col.type == 'sm.longstring' ) { if( typeof(wp.editor.getDefaultSettings) == 'undefined' ) { return; } let unformatted_val = current_cell_value; //Code for unformatting the 'longstring' type values let initializeWPEditor = function(){ wp.editor.remove('sm_beta_lonstring_input'); wp.editor.initialize('sm_beta_lonstring_input', {tinymce: { height: 200, wpautop:true, plugins : 'charmap colorpicker compat3x directionality fullscreen hr image lists media paste tabfocus textcolor wordpress wpautoresize wpdialogs wpeditimage wpemoji wpgallery wplink wptextpattern wpview', toolbar1: 'formatselect bold,italic,strikethrough,|,bullist,numlist,blockquote,|,justifyleft,justifycenter,justifyright,|,link,unlink,wp_more,|,spellchecker,fullscreen,wp_adv', toolbar2: 'underline,justifyfull,forecolor,|,pastetext,pasteword,removeformat,|,media,charmap,|,outdent,indent,|,undo,redo,wp_help'}, quicktags: { buttons: 'strong,em,link,block,del,img,ul,ol,li,code,more,spell,close,fullscreen' }, mediaButtons: true }); } window.smart_manager.modal = { title: col.key || '', content: '', autoHide: false, cta: { title: _x('Ok', 'button', 'smart-manager-for-wp-e-commerce'), callback: function() { let content = wp.editor.getContent('sm_beta_lonstring_input'); window.smart_manager.hot.setDataAtCell(coords.row, coords.col, content, 'sm.longstring_inline_update'); wp.editor.remove('sm_beta_lonstring_input'); } }, onCreate: initializeWPEditor, onUpdate: initializeWPEditor } window.smart_manager.showModal() } if( col.editor == 'sm.serialized' ) { //Code for handling serialized complex data handling window.smart_manager.JSONEditorObj = {} // hold JSONEditor instance let initializeJSONEditor = function() { let container = document.getElementById("sm_beta_json_editor"); jQuery(container).html(''); let options = { "mode": 'tree', "search": true }; window.smart_manager.JSONEditorObj = new JSONEditor(container, options); let val = ( window.smart_manager.isJSON(current_cell_value) ) ? JSON.parse(current_cell_value) : current_cell_value; if ( col.editor_schema && window.smart_manager.isJSON( col.editor_schema ) ) { window.smart_manager.JSONEditorObj.setSchema( JSON.parse( col.editor_schema ) ); } window.smart_manager.JSONEditorObj.set(val); window.smart_manager.JSONEditorObj.expandAll(); } window.smart_manager.modal = { title: col.key || '', content: '
          ', autoHide: false, cta: { title: _x('Ok', 'button', 'smart-manager-for-wp-e-commerce'), callback: function() { let content = (window.smart_manager.JSONEditorObj) ? JSON.stringify(window.smart_manager.JSONEditorObj.get()) : ''; window.smart_manager.hot.setDataAtCell(coords.row, coords.col, content, 'sm.serialized_inline_update'); window.smart_manager.JSONEditorObj = {} wp.editor.remove('sm_beta_json_editor') } }, onCreate: initializeJSONEditor, onUpdate: initializeJSONEditor } window.smart_manager.showModal() } if( typeof (col.type) != 'undefined' && col.type == 'sm.multilist' ) { // code to handle the functionality to handle editing of 'multilist' data types var actual_value = col.values, multiselect_data = new Array(), multiselect_chkbox_list = '', current_value = new Array(); if( current_cell_value != '' && typeof(current_cell_value) != 'undefined' && current_cell_value !== null ) { current_value = (typeof(current_cell_value) == 'string') ? current_cell_value.split(', ') : new Array(String(current_cell_value)); } for (var index in actual_value) { let title = (actual_value[index].hasOwnProperty('title')) ? actual_value[index].title : actual_value[index].term; if(0 === parseInt(actual_value[index]['parent'])) { if(undefined !== multiselect_data[index]) { if(false !== multiselect_data[index].hasOwnProperty('child')) { multiselect_data[index].id = index multiselect_data[index].term = actual_value[index].term; multiselect_data[index].title = title; } } else { multiselect_data[index] = {'id': index, 'term' : actual_value[index].term, 'title': title }; } } else { if(!actual_value[actual_value[index]['parent']]){ continue; } if(undefined === multiselect_data[actual_value[index]['parent']]) { //For hierarchical categories for (var mindex in multiselect_data) { if (false === multiselect_data[mindex].hasOwnProperty('child')) { continue; } for (var cindex in multiselect_data[mindex].child) { } } multiselect_data[actual_value[index]['parent']] = {}; } if(false === multiselect_data[actual_value[index]['parent']].hasOwnProperty('child')) { multiselect_data[actual_value[index]['parent']].child = {}; } multiselect_data[actual_value[index]['parent']].term = actual_value[actual_value[index]['parent']].term; multiselect_data[actual_value[index]['parent']].child[index] = {term: actual_value[index].term, title: title, }; } } multiselect_data.sort(function(a,b){ return a.term.localeCompare(b.term); }) multiselect_chkbox_list += '
            '; for (let index in multiselect_data) { let idStr = (multiselect_data[index].id) ? multiselect_data[index].id.toString() : '' let checked = (current_value != '' && (current_value.includes(multiselect_data[index].title) || current_value.includes(idStr))) ? 'checked' : ''; multiselect_chkbox_list += '
          • '+ multiselect_data[index].term +'
          • '; if ( false === multiselect_data[index].hasOwnProperty('child') ) continue; let child_val = multiselect_data[index].child; multiselect_chkbox_list += '
              '; let childValKeys = Object.keys(multiselect_data[index].child); childValKeys.sort(function(a,b){ return child_val[a].term.localeCompare(child_val[b].term); }) childValKeys.map(function(key) { let term = (child_val[key].hasOwnProperty('term')) ? child_val[key].term : '' let title = (child_val[key].hasOwnProperty('title')) ? child_val[key].title : term let child_checked = (current_value != '' && (current_value.includes(title) || current_value.includes(key.toString()))) ? 'checked' : ''; multiselect_chkbox_list += '
            • '+ term +'
            • '; }); multiselect_chkbox_list += '
            '; } multiselect_chkbox_list += '
          '; window.smart_manager.modal = { title: _x((col.key || 'Taxonomy'), 'modal title', 'smart-manager-for-wp-e-commerce'), content: multiselect_chkbox_list, autoHide: false, cta: { title: _x('Ok', 'button', 'smart-manager-for-wp-e-commerce'), callback: function() { let mutiselect_edited_text = ''; let selected_val = jQuery("input[name='chk_multiselect']:checked" ).map(function () { return jQuery(this).val(); }).get(); if( selected_val.length > 0 ) { for (var index in selected_val) { if( actual_value.hasOwnProperty(selected_val[index]) ) { if (mutiselect_edited_text != '') { mutiselect_edited_text += ', '; } mutiselect_edited_text += selected_val[index]; } } } window.smart_manager.hot.setDataAtCell(coords.row, coords.col, mutiselect_edited_text, 'sm.multilist_inline_update'); } }, } window.smart_manager.showModal() } }, // to handle updating the state on column resize afterColumnResize: function (currentColumn, newSize, isDoubleClick) { if(window.smart_manager.currentVisibleColumns[currentColumn]){ for(let index in window.smart_manager.currentColModel){ if(window.smart_manager.currentColModel[index].src == window.smart_manager.currentVisibleColumns[currentColumn].src){ window.smart_manager.currentColModel[index].width = newSize } } } }, afterScrollHorizontally: function() { if ( "undefined" !== typeof (window.smart_manager.refreshColumnsTitleAttribute) && "function" === typeof (window.smart_manager.refreshColumnsTitleAttribute) ) { window.smart_manager.refreshColumnsTitleAttribute(); } } }); } Smart_Manager.prototype.reset = function( fullReset = false ){ if(fullReset){ window.smart_manager.currentDashboardModel = ''; window.smart_manager.currentVisibleColumns = []; window.smart_manager.column_names = []; window.smart_manager.simpleSearchText = ''; window.smart_manager.advancedSearchQuery = new Array(); window.smart_manager.advancedSearchRuleCount = 0; window.smart_manager.colModelSearch = {} window.smart_manager.savedBulkEditConditions = [] } window.smart_manager.currentDashboardData = []; window.smart_manager.selectedRows = []; window.smart_manager.selectAll = false; window.smart_manager.addRecords_count = 0; window.smart_manager.page = 1; window.smart_manager.dirtyRowColIds = {}; window.smart_manager.editedData = {}; window.smart_manager.updatedEditedData = {}; window.smart_manager.processContent = ''; window.smart_manager.updatedTitle = ''; window.smart_manager.editedColumnTitles = {}; window.smart_manager.exportCSVActions = ['sm_export_selected_records', 'sm_export_entire_store']; window.smart_manager.recordSelectNotification = (this.sm_beta_pro == 1) ? true : false; window.smart_manager.scheduledActionContent = ''; window.smart_manager.isScheduled = false; if(window.smart_manager.hot){ if(window.smart_manager.hot.selection){ if(window.smart_manager.hot.selection.highlight){ if(window.smart_manager.hot.selection.highlight.selectAll){ delete window.smart_manager.hot.selection.highlight.selectAll } window.smart_manager.hot.selection.highlight.selectedRows = [] } } } } Smart_Manager.prototype.refresh = function( dataParams ) { window.smart_manager.reset(); if( window.smart_manager.sm_beta_pro == 0 ) { if( typeof( window.smart_manager.disableSelectedRows ) !== "undefined" && typeof( window.smart_manager.disableSelectedRows ) === "function" ) { window.smart_manager.disableSelectedRows(false); } } window.smart_manager.getData(dataParams); } // Function to show the pannel dialog Smart_Manager.prototype.showPannelDialog = function(route = '', currentRoute = '') { if(!route && !currentRoute){ return } let routeIdentifier = "#!/" let currentURL = (window.location.href.indexOf(routeIdentifier) >= 0) ? window.location.href.substring(0, window.location.href.indexOf(routeIdentifier)) : window.location.href if(!currentURL){ return } let defaultRoute = routeIdentifier+window.smart_manager.defaultRoute route = (!route) ? ((routeIdentifier === currentRoute) ? defaultRoute : routeIdentifier) : ((routeIdentifier === route) ? route : routeIdentifier+route) window.location.href = currentURL + route } Smart_Manager.prototype.event_handler = function() { // Detect when the user is typing in the select2 search box jQuery(document).on('input', '#sm_nav_bar .select2-search__field', function (e) { if ((!window.smart_manager.hasOwnProperty('dashboardSelect2Items')) || (typeof window.smart_manager.dashboardSelect2Items === 'undefined')) { return; } let select2SearchResult = window.smart_manager.findSelect2ParentOrChildByText(e.target.value, false); let matchingParentId = select2SearchResult.hasOwnProperty('parentID') ? select2SearchResult.parentID : ''; if ((matchingParentId) && (matchingParentId.length)) { window.smart_manager.showSelect2Childs(matchingParentId, jQuery("#sm_nav_bar .select2-results__group").first());//by default set the focus on the first element(parent) return; } jQuery("#select2_childs_section").hide(); }); jQuery(document).on("mouseenter", "#sm_nav_bar .select2-results__group", function () { jQuery("#sm_nav_bar .select2-results__group").removeClass("focus"); let parentId = jQuery(this).find(".select2-group-text").attr("id"); if ((!parentId) || (parentId.length === 0)) { return; } window.smart_manager.showSelect2Childs(parentId, jQuery(this)); }); // Code to handle select2 child item selection and display jQuery(document).on("click", ".select2-child-item", function () { const childId = jQuery(this).data("id"); if ((!childId) || (typeof childId === 'undefined') || (childId.length === 0)) { return; } jQuery("#sm_dashboard_select").val(childId).trigger("change"); jQuery("#select2_childs_section").hide(); }); // Code to handle select2 child items show/hide jQuery("#select2_childs_section").on("mouseenter", function () { jQuery(this).show(); }); // Code to handle width of the grid based on the WP collapsable menu jQuery(document).on('click', '#collapse-menu', function() { let current_url = document.URL; if ( current_url.indexOf("page=smart-manager") == -1 ) { return; } if ( !jQuery(document.body).hasClass('folded') ) { window.smart_manager.grid_width = document.documentElement.offsetWidth - (document.documentElement.offsetWidth * 0.10); } else { window.smart_manager.grid_width = document.documentElement.offsetWidth - (document.documentElement.offsetWidth * 0.04); } window.smart_manager.hot.updateSettings({'width':window.smart_manager.grid_width}); window.smart_manager.hot.render(); jQuery('#sm_top_bar, #sm_bottom_bar').css('width',window.smart_manager.grid_width+'px'); jQuery('#sm_top_bar_actions').css('width',window.smart_manager.grid_width+'px'); jQuery('#sm_top_bar_left').css('width','calc('+ window.smart_manager.grid_width +'px - 2em'); }); //Code to handle dashboard change in grid jQuery(document).off('change', '#sm_dashboard_select').on('change', '#sm_dashboard_select',function(){ var sm_dashboard_valid = 0, sm_selected_dashboard_key = jQuery(this).val(), sm_selected_dashboard_title = jQuery( "#sm_dashboard_select option:selected" ).text(); if( window.smart_manager.sm_beta_pro == 0 ) { sm_dashboard_valid = 0; if( window.smart_manager.sm_lite_dashboards.indexOf(sm_selected_dashboard_key) >= 0 ) { sm_dashboard_valid = 1; } } else { sm_dashboard_valid = 1; } if( sm_dashboard_valid == 1 ) { window.smart_manager.state_apply = true; // window.smart_manager.refreshDashboardStates(); //function to save the state if ("undefined" !== typeof(window.smart_manager.updateState) && "function" === typeof(window.smart_manager.updateState)){ ("undefined" !== typeof(window.smart_manager.isTasksEnabled) && "function" === typeof(window.smart_manager.isTasksEnabled) && window.smart_manager.isTasksEnabled()) ? window.smart_manager.updateState({isTasksEnabled:1}) : window.smart_manager.updateState(); } window.smart_manager.reset(true); window.smart_manager.dashboard_key = sm_selected_dashboard_key; window.smart_manager.dashboardName = sm_selected_dashboard_title; window.smart_manager.current_selected_dashboard = sm_selected_dashboard_key; if("undefined" !== typeof(window.smart_manager.resetSearch) && "function" === typeof(window.smart_manager.resetSearch)){ window.smart_manager.resetSearch(); } if ( typeof (window.smart_manager.initialize_advanced_search) !== "undefined" && typeof (window.smart_manager.initialize_advanced_search) === "function" && window.smart_manager.searchType != 'simple' ) { window.smart_manager.initialize_advanced_search(); } if ( window.smart_manager.dashboard_key == 'shop_order' ) { jQuery('#print_invoice_sm_editor_grid_btn').show(); } else { jQuery('#print_invoice_sm_editor_grid_btn').hide(); } (window.smart_manager.isTaxonomyDashboard()) ? jQuery('#sm_beta_move_to_trash').hide() : jQuery('#sm_beta_move_to_trash').show(); jQuery('#sm_show_tasks_container').parents('div.sm_top_bar_action_btns').removeAttr('style'); window.smart_manager.displayShowHideColumnSettings(true); jQuery('#sm_editor_grid').trigger( 'sm_dashboard_change' ); //custom trigger if('undefined' !== typeof(window.smart_manager.displayTasks) && 'function' === typeof(window.smart_manager.displayTasks)){ window.smart_manager.displayTasks({dashboardChange: true}); } window.smart_manager.toggleTopBar(); window.smart_manager.setDashboardDisplayName(); window.smart_manager.load_dashboard() window.smart_manager.savedSearchConds = {} } else { jQuery(this).val(window.smart_manager.current_selected_dashboard); window.smart_manager.notification = {message: sprintf( /* translators: %1$s: dashboard display name %2$s: success message %3$s: pricing page link */ _x('For managing %1$s, %2$s %3$s version', 'modal content', 'smart-manager-for-wp-e-commerce'), sm_selected_dashboard_title, window.smart_manager.sm_success_msg, ''+_x('Pro', 'modal content', 'smart-manager-for-wp-e-commerce')+''), hideDelay: window.smart_manager.notificationHideDelayInMs} window.smart_manager.showNotification() } }) .off( 'click', '#sm_advanced_search' ).on( 'click', '#sm_advanced_search' ,function(e){ e.preventDefault(); if ( typeof (window.smart_manager.showPannelDialog) !== "undefined" && typeof (window.smart_manager.showPannelDialog) === "function" ) { window.smart_manager.showPannelDialog(window.smart_manager.advancedSearchRoute) } }) .off( 'click', '#show_hide_cols_sm_editor_grid' ).on( 'click', '#show_hide_cols_sm_editor_grid' ,function(e){ e.preventDefault(); if((typeof window.smart_manager.dirtyRowColIds !== 'undefined') && Object.getOwnPropertyNames(window.smart_manager.dirtyRowColIds).length > 0){ window.smart_manager.confirmUnsavedChanges({'yesCallback': window.smart_manager.showPannelDialog, 'yesCallbackParams': window.smart_manager.columnManagerRoute, 'hideOnYes': false}) }else if( "undefined" !== typeof (window.smart_manager.showPannelDialog) && "function" === typeof (window.smart_manager.showPannelDialog)){ window.smart_manager.showPannelDialog(window.smart_manager.columnManagerRoute); } }) //code for handling resetting column state to default state .off('click', 'a#sm_reset_state').on('click', 'a#sm_reset_state', function (e){ e.preventDefault(); let params = {}, viewSlug = window.smart_manager.getViewSlug(window.smart_manager.dashboardName); params.data_type = 'json'; params.data = { cmd: 'reset_state', security: window.smart_manager.sm_nonce, active_module: window.smart_manager.dashboard_key }; params.data['dashboard_key'] = window.smart_manager.dashboard_key // Code for passing extra param for view handling if( 1 == window.smart_manager.sm_beta_pro ) { params.data['is_view'] = 0; if(viewSlug){ params.data['is_view'] = 1; params.data['active_module'] = viewSlug; } } window.smart_manager.send_request(params, function(response) { let dashboardURLParams = (viewSlug) ? viewSlug+"&is_view=1" : window.smart_manager.dashboard_key; window.location.href = (window.smart_manager.smAppAdminURL || window.location.href) + ((window.location.href.indexOf("?")===-1)?"?":"&") + "dashboard="+dashboardURLParams; }) }) .off( 'click', '#search_switch').on( 'click', '#search_switch' ,function(){ //Added for setting click flag for handling for custom views window.smart_manager.searchSwitchClicked = true }) .off( 'change', '#search_switch').on( 'change', '#search_switch' ,function(e){ //request for handling switch search types //Code for showing notice for custom views if((window.smart_manager.isViewContainSearchParams) && (window.smart_manager.searchSwitchClicked) && typeof (window.smart_manager.showNotification) !== "undefined" && typeof (window.smart_manager. showNotification) === "function" ) { e.target.checked = ! e.target.checked window.smart_manager.searchSwitchClicked = false window.smart_manager.notification = {message: _x('Cannot switch search when using Custom Views', 'search switch notice for custom views', 'smart-manager-for-wp-e-commerce'),hideDelay: window.smart_manager.notificationHideDelayInMs} window.smart_manager.showNotification() return } let switchSearchType = jQuery(this).attr('switchSearchType'), title = jQuery("label[for='"+ jQuery(this).attr("id") +"']").attr('title'), content = ''; jQuery(this).attr('switchSearchType', window.smart_manager.searchType); jQuery("label[for='"+ jQuery(this).attr("id") +"']").attr('title', title.replace(String(switchSearchType).capitalize(), String(window.smart_manager.searchType).capitalize())); window.smart_manager.searchType = switchSearchType; content = ( window.smart_manager.searchType == 'simple' ) ? window.smart_manager.simpleSearchContent : window.smart_manager.advancedSearchContent; jQuery('#sm_nav_bar_search #search_content').html(content); if( window.smart_manager.searchType == 'simple' ) { jQuery('#sm_simple_search_box').val(window.smart_manager.simpleSearchText); } else { // Code to initialize search col model if ( typeof (window.smart_manager.initialize_advanced_search) !== "undefined" && typeof (window.smart_manager.initialize_advanced_search) === "function" ) { window.smart_manager.initialize_advanced_search(); } if(((typeof window.smart_manager.dirtyRowColIds !== 'undefined') && Object.getOwnPropertyNames(window.smart_manager.dirtyRowColIds).length > 0) && (window.smart_manager.advancedSearchRuleCount === 0)){ window.smart_manager.confirmUnsavedChanges({'yesCallback': window.smart_manager.showPannelDialog, 'yesCallbackParams': window.smart_manager.advancedSearchRoute, 'hideOnYes': false}) }else if((window.smart_manager.advancedSearchRuleCount === 0) && "undefined" !== typeof(window.smart_manager.showPannelDialog) && "function" === typeof(window.smart_manager.showPannelDialog)){ // Code to show the advanced search dialog in case of no conditions. window.smart_manager.showPannelDialog(window.smart_manager.advancedSearchRoute); } } // code for refreshing the dashboard based on the search if ( (window.smart_manager.simpleSearchText != '' || window.smart_manager.advancedSearchRuleCount > 0) && typeof (window.smart_manager.load_dashboard) !== "undefined" && typeof (window.smart_manager.load_dashboard) === "function" ) { window.smart_manager.load_dashboard() } }) .off( 'keyup', '#sm_simple_search_box').on( 'keyup', '#sm_simple_search_box' ,function(){ //request for handling simple search clearTimeout(window.smart_manager.searchTimeoutId); window.smart_manager.searchTimeoutId = setTimeout(function () { //Code for showing notice for custom views if((window.smart_manager.isViewContainSearchParams) && typeof (window.smart_manager.showNotification) !== "undefined" && typeof (window.smart_manager. showNotification) === "function" ) { window.smart_manager.notification = {message: _x('Search string cannot be edited when using Custom Views', 'simple search notice for custom views', 'smart-manager-for-wp-e-commerce'),hideDelay: window.smart_manager.notificationHideDelayInMs} window.smart_manager.showNotification() jQuery('#sm_simple_search_box').val(window.smart_manager.simpleSearchText) } else { window.smart_manager.simpleSearchText = jQuery('#sm_simple_search_box').val(); if((typeof window.smart_manager.dirtyRowColIds !== 'undefined') && Object.getOwnPropertyNames(window.smart_manager.dirtyRowColIds).length > 0){ window.smart_manager.confirmUnsavedChanges({'yesCallback': window.smart_manager.refresh}) }else if("undefined" !== typeof(window.smart_manager.refresh) && "function" === typeof(window.smart_manager.refresh)){ // Code to show the advanced search dialog in case of no conditions. window.smart_manager.refresh(); } } }, 1000); }) //Code to handle the inline save functionality .off( 'click', '.sm_top_bar_action_btns #save_sm_editor_grid_btn').on( 'click', '.sm_top_bar_action_btns #save_sm_editor_grid_btn' ,function(){ if(Object.keys(window.smart_manager.editedData).length == 0){ window.smart_manager.notification = {message: _x('Please edit a record', 'notification', 'smart-manager-for-wp-e-commerce')} window.smart_manager.showNotification() return; } if(window.smart_manager.dashboard_key == 'user' && Object.keys(window.smart_manager.dirtyRowColIds).length > 0){ for(let row in window.smart_manager.dirtyRowColIds){ let userEmail = window.smart_manager.hot.getDataAtRowProp(row, 'users_user_email'); if(!userEmail){ window.smart_manager.notification = {message: _x('Please enter user email', 'notification', 'smart-manager-for-wp-e-commerce') + '
          '+_x('Enable', 'notification', 'smart-manager-for-wp-e-commerce')+''+_x('User Email', 'notification', 'smart-manager-for-wp-e-commerce')+''+_x('column if not enabled using', 'notification', 'smart-manager-for-wp-e-commerce')+' '+_x('column show/hide functionality', 'notification', 'smart-manager-for-wp-e-commerce')+'.
          ',hideDelay: window.smart_manager.notificationHideDelayInMs} window.smart_manager.showNotification() return; } } } if("undefined" === typeof(window.smart_manager.saveData) && "function" !== typeof (window.smart_manager.saveData)){ return; } if(1 == window.smart_manager.sm_beta_pro){ window.smart_manager.updatedEditedData = {}; Object.entries(window.smart_manager.editedData).forEach(([key, value]) => { if(key && (false === key.includes('sm_temp_')) && (false === key.includes('null'))){ window.smart_manager.updatedEditedData[key] = value; } }); let inlineUpdatedFields = new Set(); if(Object.values(window.smart_manager.updatedEditedData).length > 0 && ("undefined" !== typeof(window.smart_manager.getColDisplayName) && "function" === typeof(window.smart_manager.getColDisplayName))){ Object.values(window.smart_manager.updatedEditedData).forEach((values) => { if(Object.keys(values).length > 0){ Object.keys(values).forEach((key) => { let editedColumnName = window.smart_manager.getColDisplayName(key); if(editedColumnName){ inlineUpdatedFields.add(editedColumnName) } }); } }); } window.smart_manager.processName = _x('Inline Edit', 'process name', 'smart-manager-for-wp-e-commerce'); window.smart_manager.processContent = [...inlineUpdatedFields].join(', '); window.smart_manager.processCallback = window.smart_manager.saveData; if("undefined" !== typeof(window.smart_manager.showTitleModal) && "function" === typeof(window.smart_manager.showTitleModal) && (inlineUpdatedFields.size > 0)){ window.smart_manager.showTitleModal() }else if(0 === inlineUpdatedFields.size){ window.smart_manager.saveData() } }else{ window.smart_manager.saveData(); } }) //Code to handle the delete records functionality .off( 'click', '.sm_top_bar_action_btns #sm_beta_move_to_trash, .sm_top_bar_action_btns #sm_beta_delete_permanently').on( 'click', '.sm_top_bar_action_btns #sm_beta_move_to_trash, .sm_top_bar_action_btns #sm_beta_delete_permanently' ,function(){ let id = jQuery(this).attr('id'); let deletePermanently = ( 'sm_beta_delete_permanently' == id ) ? 1 : 0; let moveToTrash = ( 'sm_beta_move_to_trash' == id ) ? 1 : 0; let isBackgroundProcessRunning = window.smart_manager.backgroundProcessRunningNotification(false); if( 0 == window.smart_manager.sm_beta_pro && deletePermanently ) { window.smart_manager.notification = {status:'error',message: _x('To permanently delete records', 'notification', 'smart-manager-for-wp-e-commerce')+', '+_x('upgrade to Pro', 'notification', 'smart-manager-for-wp-e-commerce')+'',hideDelay: window.smart_manager.notificationHideDelayInMs} window.smart_manager.showNotification() return false; } if( ( deletePermanently || moveToTrash ) && window.smart_manager.trashAndDeletePermanently.disable ) { window.smart_manager.notification = {status:'error',message: window.smart_manager.trashAndDeletePermanently.error_message,hideDelay: window.smart_manager.notificationHideDelayInMs} window.smart_manager.showNotification() return false; } if( window.smart_manager.selectedRows.length == 0 && !window.smart_manager.selectAll ) { window.smart_manager.notification = {message: _x('Please select a record', 'notification', 'smart-manager-for-wp-e-commerce')} window.smart_manager.showNotification() return false; } if ( window.smart_manager.sm_beta_pro == 0 && window.smart_manager.selectedRows.length > window.smart_manager.sm_deleted_successful ) { window.smart_manager.notification = {message: _x('To delete more than', 'notification', 'smart-manager-for-wp-e-commerce')+' '+window.smart_manager.sm_deleted_successful+' '+_x('records at a time', 'notification', 'smart-manager-for-wp-e-commerce')+', '+_x('upgrade to Pro', 'notification', 'smart-manager-for-wp-e-commerce')+'',hideDelay:window.smart_manager.notificationHideDelayInMs} window.smart_manager.showNotification() } else { let params = {}; params.title = ' '+_x('Attention!', 'modal title', 'smart-manager-for-wp-e-commerce')+''; params.titleIsHtml = true; params.btnParams = {}; let actionText = ( !window.smart_manager.trashEnabled || deletePermanently ) ? ''+_x('permanently delete', 'modal content', 'smart-manager-for-wp-e-commerce')+'' : _x('trash', 'modal content', 'smart-manager-for-wp-e-commerce'); if( !window.smart_manager.trashEnabled || deletePermanently ) { params.height = 170; } let selected_text = ''+sprintf( /* translators: %s: action name */ _x('Are you sure you want to %s', 'modal content', 'smart-manager-for-wp-e-commerce'), ''+ actionText +' '+_x('the selected','modal content', 'smart-manager-for-wp-e-commerce')+''+' ') + ( ( window.smart_manager.selectedRows.length > 1 ) ? _x('records', 'modal content', 'smart-manager-for-wp-e-commerce') : _x('record', 'modal content', 'smart-manager-for-wp-e-commerce') ) + '?'; let all_text = ''+sprintf( /* translators: %1$s: action name %2$s: dashboard display name */ _x('Are you sure you want to %1$s the %2$s?', 'modal content', 'smart-manager-for-wp-e-commerce'),''+ actionText +' '+_x('all', 'modal content', 'smart-manager-for-wp-e-commerce')+'', window.smart_manager.dashboardDisplayName)+ ''; if (window.smart_manager.isFilteredData()){ all_text = ''+sprintf( /* translators: %s: action name */ _x('Are you sure you want to %s?', 'modal content', 'smart-manager-for-wp-e-commerce'),''+ actionText +' '+_x('all items in search results', 'modal content', 'smart-manager-for-wp-e-commerce')+'')+ ''; } params.btnParams.yesCallbackParams = {}; if ( window.smart_manager.sm_beta_pro == 1 ) { params.btnParams.yesCallbackParams = { 'deletePermanently': deletePermanently }; if ( true === window.smart_manager.selectAll ) { params.content = all_text; } else { params.content = selected_text; } if ( typeof (window.smart_manager.deleteAllRecords) !== "undefined" && typeof (window.smart_manager.deleteAllRecords) === "function" ) { params.btnParams.yesCallback = window.smart_manager.deleteAllRecords; } } else { if ( typeof (window.smart_manager.deleteRecords) !== "undefined" && typeof (window.smart_manager.deleteRecords) === "function" ) { params.content = selected_text; if ( true === window.smart_manager.selectAll ) { params.content += '


          '+_x('Note: Looking to', 'modal content', 'smart-manager-for-wp-e-commerce')+' '+_x('delete all', 'modal content', 'smart-manager-for-wp-e-commerce')+' '+_x('the records?', 'modal content', 'smart-manager-for-wp-e-commerce')+' '+_x('Upgrade to Pro', 'modal content', 'smart-manager-for-wp-e-commerce')+''; params.height = 225; } params.btnParams.yesCallback = window.smart_manager.deleteRecords; } } if( !isBackgroundProcessRunning ) { params.btnParams.hideOnYes = (window.smart_manager.sm_beta_pro == 1) ? false : true; if((typeof window.smart_manager.dirtyRowColIds !== 'undefined') && Object.getOwnPropertyNames(window.smart_manager.dirtyRowColIds).length > 0){ window.smart_manager.confirmUnsavedChanges({'yesCallback': window.smart_manager.showConfirmDialog, 'yesCallbackParams': params, 'hideOnYes': false}) }else if(typeof (window.smart_manager.showConfirmDialog) !== "undefined" && typeof (window.smart_manager.showConfirmDialog) === "function"){ window.smart_manager.showConfirmDialog(params); } } } return false; }) //Code for handling refresh event .off('click', ".sm_gallery_image .sm_gallery_image_delete").on('click', ".sm_gallery_image .sm_gallery_image_delete",function(){ let colSrc = jQuery(this).parents('div.sm_gallery_image_parent').data('col') || '', updateId = jQuery(this).parents('div.sm_gallery_image_parent').data('id') || 0, rowNo = parseInt(jQuery(this).parents('div.sm_gallery_image_parent').data('row') || 0); jQuery(this).parents('.sm_gallery_image').remove(); let imageIds = new Array(); jQuery('.sm_gallery_image').find('img').each(function(){ imageIds.push(jQuery(this).data('id')); }); let updatedGalleryImages = {}; updatedGalleryImages[updateId] = {}; updatedGalleryImages[updateId][colSrc] = imageIds.join(','); let params = {id:updateId,src:colSrc,values:updatedGalleryImages[updateId][colSrc],imageGalleryHtml:jQuery('div.modal-body').html(),rowNo:rowNo}; if(1 == window.smart_manager.sm_beta_pro && "undefined" !== typeof(window.smart_manager.displayTitleModal) && "function" === typeof(window.smart_manager.displayTitleModal)){ window.smart_manager.displayTitleModal(params); }else if("undefined" !== typeof(window.smart_manager.inlineUpdateMultipleImages) && "function" === typeof(window.smart_manager.inlineUpdateMultipleImages)){ window.smart_manager.inlineUpdateMultipleImages(params); } }) //Code for handling refresh event .off( 'click', "#refresh_sm_editor_grid").on( 'click', "#refresh_sm_editor_grid", function(){ window.smart_manager.refresh(); }) .off( 'click', "#sm_editor_grid_distraction_free_mode").on( 'click', "#sm_editor_grid_distraction_free_mode", function(){ if ( window.smart_manager.sm_beta_pro == 1 ) { if ( typeof (window.smart_manager.smToggleFullScreen) !== "undefined" && typeof (window.smart_manager.smToggleFullScreen) === "function" ) { let element = document.documentElement; window.smart_manager.smToggleFullScreen( element ); } } else { window.smart_manager.notification = {message: sprintf( /* translators: %s: pricing page link */ _x('This feature is available only in the %s version', 'modal content', 'smart-manager-for-wp-e-commerce'), ''+_x('Pro', 'modal content', 'smart-manager-for-wp-e-commerce')+''),hideDelay: window.smart_manager.notificationHideDelayInMs} window.smart_manager.showNotification() } /*Review*/ window.smart_manager.hot.updateSettings({'width':window.smart_manager.grid_width}); window.smart_manager.hot.render(); jQuery('#sm_top_bar, #sm_bottom_bar').css('width',window.smart_manager.grid_width+'px'); }) //Code for load more items .off( 'click', "#sm_editor_grid_load_items").on( 'click', "#sm_editor_grid_load_items", function(){ if( window.smart_manager.currentDashboardData.length >= window.smart_manager.totalRecords ) { return; } window.smart_manager.page++; window.smart_manager.getData(); }) .off( 'click', 'td.htDimmed' ).on( 'click', 'td.htDimmed' , function() { if( window.smart_manager.sm_beta_pro == 0 ) { if( typeof( window.smart_manager.modifiedRows ) != 'undefined' ) { if( window.smart_manager.modifiedRows.length >= window.smart_manager.sm_updated_successful ) { alert(_x('For editing more records upgrade to Pro', 'notification', 'smart-manager-for-wp-e-commerce')); } } } }) //Code for add record functionality .off( 'click', "#add_sm_editor_grid").on( 'click', "#add_sm_editor_grid", function(){ window.smart_manager.modal = { title: sprintf( /* translators: %s: dashboard display name */ _x('Add %s(s)', 'modal title', 'smart-manager-for-wp-e-commerce'), window.smart_manager.dashboardDisplayName), content: '
          '+sprintf( /* translators: %s: dashboard display name */ _x('Enter how many new %s(s) to create!', 'modal content', 'smart-manager-for-wp-e-commerce'), window.smart_manager.dashboardDisplayName)+'
          ', autoHide: false, cta: { title: _x('Create', 'button', 'smart-manager-for-wp-e-commerce'), callback: function() { // setTimeout((window.smart_manager.modal = {}),2000) // code to hide the modal let count = jQuery('#sm_beta_add_record_count').val(); if( count > 0 ) { window.smart_manager.hot.alter('insert_row', 0, count); } } }, closeCTA: { title: _x('Cancel', 'button', 'smart-manager-for-wp-e-commerce')} } if((typeof window.smart_manager.dirtyRowColIds !== 'undefined') && Object.getOwnPropertyNames(window.smart_manager.dirtyRowColIds).length > 0){ window.smart_manager.confirmUnsavedChanges({'yesCallback': window.smart_manager.showModal, 'modalVals': window.smart_manager.modal, 'hideOnYes': false}) }else if("undefined" !== typeof(window.smart_manager.showModal) && "function" === typeof(window.smart_manager.showModal)){ window.smart_manager.showModal() } }) .off('click', "#sm_custom_views_create, #sm_custom_views_update").on('click', "#sm_custom_views_create, #sm_custom_views_update", function(e){ e.preventDefault(); if( window.smart_manager.sm_beta_pro == 1 ) { if ( typeof (window.smart_manager.createUpdateViewDialog) !== "undefined" && typeof (window.smart_manager.createUpdateViewDialog) === "function" ) { let id = jQuery(this).attr('id'); let action = (id == 'sm_custom_views_update') ? 'update' : 'create'; if((typeof window.smart_manager.dirtyRowColIds !== 'undefined') && Object.getOwnPropertyNames(window.smart_manager.dirtyRowColIds).length > 0){ window.smart_manager.confirmUnsavedChanges({'yesCallback': window.smart_manager.createUpdateViewDialog, 'yesCallbackParams': action, 'hideOnYes': false}) }else if("undefined" !== typeof(window.smart_manager.createUpdateViewDialog) && "function" === typeof(window.smart_manager.createUpdateViewDialog)){ window.smart_manager.createUpdateViewDialog(action); } } } else { window.smart_manager.notification = {message: sprintf( /* translators: %s: pricing page link */ _x('Custom Views avialable (Only in %s)', 'notification', 'smart-manager-for-wp-e-commerce'), ''+_x('Pro', 'notification', 'smart-manager-for-wp-e-commerce')+''),hideDelay: window.smart_manager.notificationHideDelayInMs} window.smart_manager.showNotification() } }) .off('click', "#sm_custom_views_delete").on('click', "#sm_custom_views_delete", function(e){ e.preventDefault(); if( window.smart_manager.sm_beta_pro == 1 ) { let params = {}; params.btnParams = {} params.title = ' '+_x('Attention!', 'modal title', 'smart-manager-for-wp-e-commerce')+''; params.content = ''+_x('This will', 'modal content', 'smart-manager-for-wp-e-commerce')+' '+_x('delete', 'modal content', 'smart-manager-for-wp-e-commerce')+' '+_x('the current view. Are you sure you want to continue?', 'modal content', 'smart-manager-for-wp-e-commerce')+''; params.titleIsHtml = true; params.height = 200; if ( typeof (window.smart_manager.deleteView) !== "undefined" && typeof (window.smart_manager.deleteView) === "function" ) { params.btnParams.yesCallback = window.smart_manager.deleteView; } window.smart_manager.showConfirmDialog(params); } else { window.smart_manager.notification = {message: sprintf( /* translators: %s: pricing page link */ _x('Custom Views avialable (Only in %s)', 'notification', 'smart-manager-for-wp-e-commerce'), ''+_x('Pro', 'notification', 'smart-manager-for-wp-e-commerce')+''),hideDelay: window.smart_manager.notificationHideDelayInMs} window.smart_manager.showNotification() } }) // Code for handling the batch update & duplicate records functionality .off( 'click', "#batch_update_sm_editor_grid, .sm_top_bar_action_btns .sm_beta_dropdown_content a, #print_invoice_sm_editor_grid_btn").on( 'click', "#batch_update_sm_editor_grid, .sm_top_bar_action_btns .sm_beta_dropdown_content a, #print_invoice_sm_editor_grid_btn", function(e){ e.preventDefault(); let id = jQuery(this).attr('id'), btnText = jQuery(this).text(), className = jQuery(this).attr('class'); if( jQuery(this).parents('div#del_sm_editor_grid').length > 0 || jQuery(this).parents('div#sm_custom_views').length > 0 ) { return; } let params = {}, isBackgroundProcessRunning = window.smart_manager.backgroundProcessRunningNotification(false); params.btnParams = {}; params.title = _x('Attention!', 'modal title', 'smart-manager-for-wp-e-commerce'); if(0 === window.smart_manager.selectedRows.length && !window.smart_manager.selectAll && window.smart_manager.recordSelectNotification && className !== 'sm_entire_store'){ window.smart_manager.notification = {message: _x('Please select a record', 'notification', 'smart-manager-for-wp-e-commerce')} window.smart_manager.showNotification() } else if(window.smart_manager.exportCSVActions && 'undefined' !== typeof(id) && id && window.smart_manager.exportCSVActions.includes(id) && !isBackgroundProcessRunning){ //code for handling export CSV functionality. if((typeof window.smart_manager.dirtyRowColIds !== 'undefined') && Object.getOwnPropertyNames(window.smart_manager.dirtyRowColIds).length > 0){ window.smart_manager.confirmUnsavedChanges({'yesCallback': window.smart_manager.getExportCsv, 'yesCallbackParams': {'params':params,'id':id,'btnText':btnText}, 'hideOnYes': false}) }else if("undefined" !== typeof(window.smart_manager.getExportCsv) && "function" === typeof(window.smart_manager.getExportCsv) && params && btnText){ window.smart_manager.getExportCsv({'params':params,'id':id,'btnText':btnText}); } } if(1 == window.smart_manager.sm_beta_pro){ if('undefined' !== typeof(id) && id){ if(window.smart_manager.selectedRows.length > 0 || window.smart_manager.selectAll || 'sm_entire_store' === className){ if( id == 'batch_update_sm_editor_grid' && !isBackgroundProcessRunning ) { //code for handling batch update functionality // window.smart_manager.createBatchUpdateDialog(); if((typeof window.smart_manager.dirtyRowColIds !== 'undefined') && Object.getOwnPropertyNames(window.smart_manager.dirtyRowColIds).length > 0){ window.smart_manager.confirmUnsavedChanges({'yesCallback': window.smart_manager.showPannelDialog, 'yesCallbackParams': window.smart_manager.bulkEditRoute, 'hideOnYes': false}) }else if(typeof (window.smart_manager.showPannelDialog) !== "undefined" && typeof (window.smart_manager.showPannelDialog) === "function"){ window.smart_manager.showPannelDialog(window.smart_manager.bulkEditRoute) } } else if( ( id == 'sm_beta_dup_entire_store' || id == 'sm_beta_dup_selected' ) && !isBackgroundProcessRunning ) { //code for handling duplicate records functionality if(window.smart_manager.isTaxonomyDashboard()){ window.smart_manager.notification = {message: _x('Comming soon', 'notification', 'smart-manager-for-wp-e-commerce')} if(typeof (window.smart_manager.showNotification) !== "undefined" && typeof (window.smart_manager.showNotification) === "function" ){ window.smart_manager.showNotification(); } }else { params.content = (window.smart_manager.dashboard_key != 'product') ? '

          '+_x('This will duplicate only the records in posts, postmeta and related taxonomies.', 'modal content', 'smart-manager-for-wp-e-commerce')+'

          ' : ''; params.content += _x('Are you sure you want to duplicate the ', 'modal content', 'smart-manager-for-wp-e-commerce') + btnText + '?'; if ( typeof (window.smart_manager.duplicateRecords) !== "undefined" && typeof (window.smart_manager.duplicateRecords) === "function" ) { params.btnParams.yesCallback = window.smart_manager.duplicateRecords; } window.smart_manager.duplicateStore = ( id == 'sm_beta_dup_entire_store' ) ? true : false; params.btnParams.hideOnYes = false; if((typeof window.smart_manager.dirtyRowColIds !== 'undefined') && Object.getOwnPropertyNames(window.smart_manager.dirtyRowColIds).length > 0){ window.smart_manager.confirmUnsavedChanges({'yesCallback': window.smart_manager.showConfirmDialog, 'yesCallbackParams': params, 'hideOnYes': false}) }else if("undefined" !== typeof(window.smart_manager.showConfirmDialog) && "function" === typeof(window.smart_manager.showConfirmDialog)){ window.smart_manager.showConfirmDialog(params); } } } else if( id == 'print_invoice_sm_editor_grid_btn' ) { //code for handling Print Invoice functionality if((typeof window.smart_manager.dirtyRowColIds !== 'undefined') && Object.getOwnPropertyNames(window.smart_manager.dirtyRowColIds).length > 0){ window.smart_manager.confirmUnsavedChanges({'yesCallback': window.smart_manager.printInvoice}) }else if(typeof (window.smart_manager.printInvoice) !== "undefined" && typeof (window.smart_manager.printInvoice) === "function"){ window.smart_manager.printInvoice(); } } } } } else { if( typeof(id) != 'undefined' ) { if(!['sm_beta_dup_entire_store', 'sm_beta_dup_selected'].includes(id) && (window.smart_manager.stockCols && !window.smart_manager.stockCols.includes(id))) { let description = sprintf( /* translators: %s: Bulk Edit doc link */ _x('You can change/update multiple fields of the entire store OR for selected items using the Bulk Edit feature. Refer to this doc on %s or watch the video below.', 'modal description', 'smart-manager-for-wp-e-commerce'), ''+_x('how to do bulk edit', 'modal description', 'smart-manager-for-wp-e-commerce')+''); title = ( ( id == 'batch_update_sm_editor_grid' ) ? btnText + ' - '+_x('Biggest Time Saver', 'modal title', 'smart-manager-for-wp-e-commerce')+' ' : btnText ) + sprintf( /* translators: %s: pricing page link */ _x('(Only in %s)', 'modal title', 'smart-manager-for-wp-e-commerce'), ''+_x('Pro', 'modal title', 'smart-manager-for-wp-e-commerce')+''); if((id !== 'batch_update_sm_editor_grid') && window.smart_manager.exportCSVActions){ title = _x('Export CSV of ', 'modal title', 'smart-manager-for-wp-e-commerce') + btnText; description = _x('You can export selected/all records OR filtered records (using Simple Search or Advanced Search) by simply clicking on the Export CSV button at the bottom right of the grid.', 'modal description', 'smart-manager-for-wp-e-commerce'); } content = '
          '+ '

          '+description+'

          '+ '
          '+ '
          ' window.smart_manager.modal = { title: title, content: content, width: 'w-2/6', autoHide: false, isFooterItemsCenterAligned: true, cta: { title: _x('Upgrade Now', 'button', 'smart-manager-for-wp-e-commerce'), callback: function() { window.open(window.smart_manager.pricingPageURL, "_blank"); jQuery( this ).dialog( "close" ); } } } window.smart_manager.showModal() } else if(['sm_beta_dup_entire_store', 'sm_beta_dup_selected'].includes(id)) { window.smart_manager.notification = {message: sprintf( /* translators: %s: pricing page link */ _x('Duplicate Records (Only in %s)', 'notification', 'smart-manager-for-wp-e-commerce'), ''+_x('Pro', 'notification', 'smart-manager-for-wp-e-commerce')+''),hideDelay: window.smart_manager.notificationHideDelayInMs} window.smart_manager.showNotification() } } else { window.smart_manager.notification = {message: sprintf( /* translators: %s: pricing page link */ _x('This feature is available only in the %s version', 'modal content', 'smart-manager-for-wp-e-commerce'), ''+_x('Pro', 'modal content', 'smart-manager-for-wp-e-commerce')+''),hideDelay: window.smart_manager.notificationHideDelayInMs} window.smart_manager.showNotification() } } }) .off('mouseover', '.sm_gallery_image > img').on('mouseover','.sm_gallery_image > img', function(e){ let params = { 'current_cell_value': jQuery(this).attr('src'), 'event': e, 'title': '' }; if( typeof( window.smart_manager.showImagePreview ) !== "undefined" && typeof( window.smart_manager.showImagePreview ) === "function" ) { window.smart_manager.showImagePreview(params); } }) .off('mouseout', '.sm_gallery_image > img').on('mouseout','.sm_gallery_image > img', function(e){ if( jQuery('#sm_img_preview').length > 0 ) { jQuery('#sm_img_preview').remove(); } }) //Code for handling the dropdown menu for the duplicate button .off('mouseenter', '.sm_beta_dropdown').on('mouseenter','.sm_beta_dropdown', function(){ jQuery(this).find('.sm_beta_dropdown_content').show(); }) //Code for handling the dropdown menu for the duplicate button .off('mouseleave', '.sm_beta_dropdown').on('mouseleave','.sm_beta_dropdown', function(){ jQuery(this).find('.sm_beta_dropdown_content').hide(); }) .off("click", ".sm_click_to_copy").on("click", ".sm_click_to_copy", function() { let temp = jQuery(""); jQuery("body").append(temp); temp.val(jQuery(this).html()).select(); document.execCommand("copy"); temp.remove(); }) .off("change","#sm_show_tasks_lbl").on("change","#sm_show_tasks_lbl", function(){ jQuery('#sm_editor_grid').trigger('sm_show_tasks_change'); if(0 == window.smart_manager.sm_beta_pro){ jQuery("#sm_show_tasks").prop('checked', false); window.smart_manager.notification = {message: sprintf( /* translators: %s: pricing page link */ _x('This feature is available only in the %s version','modal content', 'smart-manager-for-wp-e-commerce'),''+_x('Pro','modal content','smart-manager-for-wp-e-commerce')+''),hideDelay: window.smart_manager.notificationHideDelayInMs} window.smart_manager.showNotification() } }) .off('click','.sm-column-title-editor-icon').on('click','.sm-column-title-editor-icon', function(e){ if (window.smart_manager.sm_beta_pro == 1 && 'undefined' !== typeof(window.smart_manager.displayColumnTitleEditor) && 'function' === typeof(window.smart_manager.displayColumnTitleEditor)) { window.smart_manager.displayColumnTitleEditor(e); } else { window.smart_manager.notification = {message: sprintf( /* translators: %s: pricing page link */ _x('This feature is available only in the %s version', 'modal content', 'smart-manager-for-wp-e-commerce'), ''+_x('Pro', 'modal content', 'smart-manager-for-wp-e-commerce')+''),hideDelay: window.smart_manager.notificationHideDelayInMs} window.smart_manager.showNotification() } }) //Code to handle access privilege settings .off('click', '#sm_access_privilege_settings').on('click', '#sm_access_privilege_settings' ,function(e){ e.preventDefault(); if(0 == window.smart_manager.sm_beta_pro){ window.smart_manager.notification = {message: sprintf(_x('This feature is available only in the %s version','modal content', 'smart-manager-for-wp-e-commerce'),''+_x('Pro','modal content','smart-manager-for-wp-e-commerce')+''),hideDelay: window.smart_manager.notificationHideDelayInMs} window.smart_manager.showNotification() return false; } if(typeof(window.smart_manager.showPannelDialog) !== "undefined" && typeof (window.smart_manager.showPannelDialog) === "function"){ window.smart_manager.showPannelDialog(window.smart_manager.privilegeSettingsRoute) } }) //Code to handle the general settings .off('click','#sm_general_settings').on('click','#sm_general_settings', function(e){ e.preventDefault(); if ( typeof (window.smart_manager.showPannelDialog) !== "undefined" && typeof (window.smart_manager.showPannelDialog) === "function" ) { window.smart_manager.showPannelDialog(window.smart_manager.settingsRoute) } }) jQuery(document).trigger('sm_event_handler'); } //Function to equalize the enabled and disabled section height in column visibility dialog Smart_Manager.prototype.columnVisibilityEqualizeHeight = function() { let enabledHeight = jQuery('#sm-columns-enabled').height(), disabledHeight = jQuery('#sm-columns-disabled').height(), maxHeight = enabledHeight > disabledHeight ? enabledHeight : disabledHeight; if( maxHeight > 0 ) { jQuery('#sm-columns-enabled, #sm-columns-disabled').height(maxHeight); } } //Function to process Column Visibility Enabled & Disabled Columns Search Smart_Manager.prototype.processColumnVisibilitySearch = function(eventObj) { let searchString = jQuery(eventObj).val(), ulId = jQuery(eventObj).attr('data-ul-id'); if( ulId != '' ) { jQuery("#"+ulId).find('li').each( function() { let txtValue = jQuery(this).find('.sm-column-title-input').val(); if (txtValue.toUpperCase().indexOf(searchString.toUpperCase()) > -1) { jQuery(this).show(); } else { jQuery(this).hide(); } }); } } //Function to create column Visibility dialog Smart_Manager.prototype.createColumnVisibilityDialog = function() { if( 'undefined' === typeof (window.smart_manager.currentColModel) ) { return; } let enabledColumnsArray = new Array(), hiddenColumnsArray = new Array(), colText = '', colVal = '', temp = '', panelContent = ''; for( let key in window.smart_manager.currentColModel ) { colObj = window.smart_manager.currentColModel[key]; if( ! colObj.hasOwnProperty('data') ) { continue; } if( colObj.hasOwnProperty('allow_showhide') && true === colObj.allow_showhide ) { colText = ( colObj.hasOwnProperty('name_display') ) ? colObj.name_display : ''; colVal = ( colObj.hasOwnProperty('data') ) ? colObj.data : ''; colPosition = ( colObj.hasOwnProperty('position') ) ? ( ( colObj.position != '' ) ? colObj.position - 1 : '' ) : ''; temp = `
        • ::
        • `; if( colObj.hasOwnProperty('hidden') && false === colObj.hidden ) { enabledColumnsArray.push(temp); } else if( colObj.hasOwnProperty('hidden') && true === colObj.hidden ) { hiddenColumnsArray.push(temp); } } } panelContent = '
          '+ '
            '+ '
          • '+_x('Drag the enabled columns to the right to disable them and vise-versa. Drag the columns top or bottom to rearrange their position in the grid.', 'columns settings description', 'smart-manager-for-wp-e-commerce')+ '
          • '+ '
          • '+sprintf( /* translators: %s: reset columns link */ _x('Click %s to reset the Columns order to default.', 'columns settings description', 'smart-manager-for-wp-e-commerce'), ''+_x('here', 'columns settings description', 'smart-manager-for-wp-e-commerce')+'')+ '
          • '+ '
          • '+ '
            '+ '

            '+_x('Enabled', 'columns settings searchbox heading', 'smart-manager-for-wp-e-commerce')+'

            '+ ' '+ '
              '+ enabledColumnsArray.join("") + '
            '+ '
            '+ '
            '+ '

            '+_x('Disabled', 'columns settings searchbox heading', 'smart-manager-for-wp-e-commerce')+'

            '+ ' '+ '
              '+ hiddenColumnsArray.join("") + '
            '+ '
            '+ '
          • '+ '
          '+ ' '+ '
          '; document.getElementById('column-settings').innerHTML = panelContent; if ( "undefined" !== typeof (window.smart_manager.processColumnVisibility) && "function" === typeof (window.smart_manager.processColumnVisibility) ) { window.smart_manager.processColumnVisibility; } if ( "undefined" !== typeof (window.smart_manager.columnVisibilityEqualizeHeight) && "function" === typeof (window.smart_manager.columnVisibilityEqualizeHeight) ) { window.smart_manager.columnVisibilityEqualizeHeight(); } let $columns = document.getElementById('sm-columns-enabled'), $columnsDisabled = document.getElementById('sm-columns-disabled'); window.smart_manager.enabledSortable = Sortable.create($columns, { group: 'smartManagerColumns', animation: 100, onSort: function (evt) { if ( "undefined" !== typeof (window.smart_manager.columnsMoved) && "function" === typeof (window.smart_manager.columnsMoved) ) { window.smart_manager.columnsMoved(); } } }); window.smart_manager.disabledSortable = Sortable.create($columnsDisabled, { group: 'smartManagerColumns', animation: 100 }); } //Function to block Bulk Edit/Duplicate Records/Delete Records functionality when background process is running Smart_Manager.prototype.backgroundProcessRunningNotification = function( isBackgroundProcessRunning = false ) { isBackgroundProcessRunning = ( "undefined" !== typeof (window.smart_manager.isBackgroundProcessRunning) && "function" === typeof (window.smart_manager.isBackgroundProcessRunning) ) ? window.smart_manager.isBackgroundProcessRunning() : false; if( isBackgroundProcessRunning ) { window.smart_manager.notification = {message: window.smart_manager.backgroundProcessRunningMessage,hideDelay: window.smart_manager.notificationHideDelayInMs} window.smart_manager.showNotification() } return isBackgroundProcessRunning; } //Function to update the list of enabled columns on column move event Smart_Manager.prototype.columnsMoved = function() { let enabled = jQuery('#sm-column-visibility').find('.columns-enabled .js-column-key'); let allEnabled = enabled.map(function () { return jQuery(this).val(); }).get().join(','); jQuery('#sm-column-visibility').find('#sm-all-enabled-columns').val(allEnabled); window.smart_manager.columnsVisibilityUsed = true; } //Function to load the updated list of enabled columns in the grid Smart_Manager.prototype.processColumnVisibility = function() { if( false === window.smart_manager.columnsVisibilityUsed && Object.keys(window.smart_manager.editedColumnTitles).length == 0 ) { return false; } let enabledColumns = jQuery('#sm-column-visibility').find('#sm-all-enabled-columns').val(); if( 'undefined' === typeof (enabledColumns) || 'undefined' === typeof (window.smart_manager.currentColModel) ) { return; } if( enabledColumns.length > 0 ) { // let idKey = ( window.smart_manager.dashboard_key == 'user' ) ? 'users_id' : 'posts_id'; // enabledColumns = idKey + ',' + enabledColumns; let enabledColumnsArray = enabledColumns.split(','), colVal = '', position = 0; window.smart_manager.column_names = []; window.smart_manager.currentVisibleColumns = []; for( let key in window.smart_manager.currentColModel ) { colObj = window.smart_manager.currentColModel[key]; if( colObj.hasOwnProperty('allow_showhide') && true === colObj.allow_showhide ) { colVal = ( colObj.hasOwnProperty('data') ) ? colObj.data : ''; if( enabledColumnsArray.indexOf(colVal) != -1 ) { position = enabledColumnsArray.indexOf(colVal)+1; window.smart_manager.currentColModel[key].hidden = false; //Code for refreshing the column visibility window.smart_manager.currentColModel[key].position = position; //Code for refreshing the column position } else { window.smart_manager.currentColModel[key].hidden = true; } } } if ( "undefined" !== typeof (window.smart_manager.sortColumns) && "function" === typeof (window.smart_manager.sortColumns) ) { window.smart_manager.sortColumns(); } } if( enabledColumns.length > 0 || Object.keys(window.smart_manager.editedColumnTitles).length > 0 ){ let index = 0; window.smart_manager.currentColModel.forEach(function(colObj){ let hidden = ( 'undefined' !== typeof(colObj.hidden) ) ? colObj.hidden : true, data = (colObj.hasOwnProperty('data')) ? colObj.data : ''; // COde for updating the column titles if( Object.keys(window.smart_manager.editedColumnTitles).length > 0 && data && window.smart_manager.editedColumnTitles.hasOwnProperty(data) ){ colObj.name = colObj.key = colObj.name_display = window.smart_manager.editedColumnTitles[data] } if( false === hidden ) { if( false === colObj.hasOwnProperty('name_display') ) {// added for state management colObj.name_display = name; } let name = ( 'undefined' !== typeof(colObj.name) ) ? colObj.name.trim() : ''; window.smart_manager.column_names[index] = colObj.name_display; //Array for column headers window.smart_manager.currentVisibleColumns[index] = colObj; index++; } }); //code to trigger update state ajax call if ( "undefined" !== typeof (window.smart_manager.updateState) && "function" === typeof (window.smart_manager.updateState) ) { let params = { refreshDataModel : true, async: true }; if(window.smart_manager.isViewAuthor){ params.updateView = true } window.smart_manager.isColumnModelUpdated = true window.smart_manager.showLoader(); window.smart_manager.updateState(params); //refreshing the dashboard states if ( "undefined" !== typeof (window.smart_manager.refreshColumnsTitleAttribute) && "function" === typeof (window.smart_manager.refreshColumnsTitleAttribute) ) { setTimeout(() => { window.smart_manager.refreshColumnsTitleAttribute(); }, 1000); } } } } //Function to sort the columns in the current_col_model based on the 'position' key Smart_Manager.prototype.sortColumns = function() { if( typeof window.smart_manager.currentColModel == 'undefined' ) { return; } window.smart_manager.indexPointer = 0; let enabledColumns = new Array(), disabledColumns = new Array(); enabledColumnsFinal = new Array(); window.smart_manager.currentColModel.forEach(function(colObj){ enabled = 0; if( colObj.hasOwnProperty('position') != false && colObj.hasOwnProperty('hidden') != false ) { if( colObj.position != '' && colObj.hidden === false ) { enabledColumns[ colObj.position ] = colObj; enabled = 1; } } if( enabled == 0 ) { disabledColumns.push(colObj); } }); enabledColumns.forEach(function(colObj){ //done this to re-index the array for proper array length enabledColumnsFinal.push(colObj); }); enabledColumnsFinal.sort(function(a, b) { return parseInt(a.position) - parseInt(b.position); }); window.smart_manager.currentColModel = enabledColumnsFinal.concat(disabledColumns); } //Function to get the seleted IDs Smart_Manager.prototype.getSelectedKeyIds = function() { let idKey = window.smart_manager.getKeyID(), selectedIds = []; window.smart_manager.selectedRows.forEach((rowId) => { selectedIds.push(window.smart_manager.currentDashboardData[rowId][idKey]); }) return selectedIds; } //Function to show columns menu Smart_Manager.prototype.refreshIsViewAuthor = function(viewSlug) { let params = {}; params.data_type = 'json'; params.data = { cmd: 'is_view_author', module: 'custom_views', active_module: viewSlug, security: window.smart_manager.sm_nonce, slug: viewSlug, }; window.smart_manager.send_request(params, function(response){ window.smart_manager.isViewAuthor = (response) ? true : false window.smart_manager.displayShowHideColumnSettings(response); }); } //Function to delete records Smart_Manager.prototype.deleteRecords = function() { if( window.smart_manager.selectedRows.length == 0 && !window.smart_manager.selectAll ) { return; } let params = {}; params.data = { cmd: 'delete', active_module: window.smart_manager.dashboard_key, security: window.smart_manager.sm_nonce, ids: JSON.stringify(window.smart_manager.getSelectedKeyIds()) }; window.smart_manager.send_request(params, function(response) { if ( 'failed' !== response ) { if( jQuery('.sm_top_bar_action_btns #del_sm_editor_grid svg').hasClass('sm-ui-state-disabled') === false ) { jQuery('.sm_top_bar_action_btns #del_sm_editor_grid svg').addClass('sm-ui-state-disabled'); } window.smart_manager.refresh(); window.smart_manager.notification = {status:'success', message: response} window.smart_manager.showNotification() } }); } Smart_Manager.prototype.updateLitePromoMessage = function( countRows ) { let count = parseInt( countRows ); if( count >= 2 ) { jQuery('.sm_design_notice .sm_sub_headline.action').hide(); jQuery('.sm_design_notice .sm_sub_headline.response').show(); } } //Function to save inline edited data Smart_Manager.prototype.saveData = function(){ if(Object.getOwnPropertyNames(window.smart_manager.editedData).length <= 0){ return; } let params = {}; params.data = { cmd: 'inline_update', active_module: window.smart_manager.dashboard_key, edited_data: JSON.stringify(window.smart_manager.editedData), security: window.smart_manager.sm_nonce, pro: ( ( typeof(window.smart_manager.sm_beta_pro) != 'undefined' ) ? window.smart_manager.sm_beta_pro : 0 ), table_model: (window.smart_manager.currentDashboardModel.hasOwnProperty('tables') ) ? window.smart_manager.currentDashboardModel.tables : '', is_advanced_search: jQuery('#search_switch').is(':checked') }; params.data = ("undefined" !== typeof(window.smart_manager.addTasksParams) && "function" === typeof(window.smart_manager.addTasksParams) && 1 == window.smart_manager.sm_beta_pro) ? window.smart_manager.addTasksParams(params.data) : params.data; let hasInvalidClass = jQuery('.sm-grid-dirty-cell').hasClass('htInvalid'); if(hasInvalidClass == false){ window.smart_manager.send_request(params, function(response){ if('failed' !== response){ let title = 'success' if (window.smart_manager.isJSON(response)){ // title = 'note' response = JSON.parse(response); msg = response.msg; }else{ msg = response; } if(('undefined' === typeof(window.smart_manager.sm_beta_pro) || ('undefined' !== typeof(window.smart_manager.sm_beta_pro) && 1 != window.smart_manager.sm_beta_pro))){ if(typeof( response.sm_inline_update_count) != 'undefined'){ if("undefined" !== typeof(window.smart_manager.updateLitePromoMessage) && "function" === typeof(window.smart_manager.updateLitePromoMessage)){ window.smart_manager.updateLitePromoMessage(response.sm_inline_update_count); } } } if(window.smart_manager.editedCellIds.length > 0){ for(let i=0; i { modifiedPageNumbers.add(Math.ceil(((rowNo+1)/window.smart_manager.limit))) }) window.smart_manager.dirtyRowColIds = {}; window.smart_manager.editedData = {}; window.smart_manager.modifiedRows = new Array(); modifiedPageNumbers.forEach(r => window.smart_manager.getData({refreshPage: r})); window.smart_manager.isRefreshingLoadedPage = false; } window.smart_manager.hot.render(); if (('undefined' !== typeof(window.smart_manager.sm_beta_pro) && 1 != window.smart_manager.sm_beta_pro) && (response.hasOwnProperty('modal_message') && response.modal_message.trim() !== '') && sm_beta_params.hasOwnProperty('manHoursData') && ('success' === title)) { window.smart_manager.showManHoursSaved({message: response.modal_message, title:msg}); }else{ window.smart_manager.notification = {message: msg} if('success' === title){ window.smart_manager.notification.status = title } window.smart_manager.showNotification() } } }); }else{ window.smart_manager.notification = {status:'error', message: _x('You have entered incorrect data in the highlighted cells.', 'notification', 'smart-manager-for-wp-e-commerce')} window.smart_manager.showNotification() } } // Function to get default route Smart_Manager.prototype.getDefaultRoute = function(isReplaceRoute = false){ return (isReplaceRoute) ? ((window.location.href.includes(window.smart_manager.defaultRoute) ) ? '/'+window.smart_manager.defaultRoute : '#!/') : ((window.location.href.includes(window.smart_manager.defaultRoute) ) ? '#!/' : window.smart_manager.defaultRoute) } // Function to handle all modal dialog Smart_Manager.prototype.showModal = function(){ if(window.smart_manager.modal.hasOwnProperty('title') && '' !== window.smart_manager.modal.title && window.smart_manager.modal.hasOwnProperty('content') && '' !== window.smart_manager.modal.content && (typeof (window.smart_manager.showPannelDialog) !== "undefined" && typeof (window.smart_manager.showPannelDialog) === "function" && typeof (window.smart_manager.getDefaultRoute) !== "undefined" && typeof (window.smart_manager.getDefaultRoute) === "function")){ window.smart_manager.showPannelDialog(window.smart_manager.getDefaultRoute()) } } // Function to handle all notification alerts Smart_Manager.prototype.showNotification = function(){ if((!window.location.href.includes(window.smart_manager.advancedSearchRoute) && !window.location.href.includes(window.smart_manager.bulkEditRoute)) && window.smart_manager.notification.hasOwnProperty('message') && '' !== window.smart_manager.notification.message && (typeof (window.smart_manager.showPannelDialog) !== "undefined" && typeof (window.smart_manager.showPannelDialog) === "function" && typeof (window.smart_manager.getDefaultRoute) !== "undefined" && typeof (window.smart_manager.getDefaultRoute) === "function")){ if(window.location.href.includes(window.smart_manager.columnManagerRoute)){ // Added as Col manager HTML & click events are not coming from raw js -- flickers for chrome. Can fix later setTimeout(() => {window.smart_manager.showPannelDialog(window.smart_manager.columnManagerRoute)}, 1) } window.smart_manager.showPannelDialog(window.smart_manager.getDefaultRoute()) } } Smart_Manager.prototype.hideNotificationDialog = function() { jQuery( "#sm_inline_dialog" ).dialog("close"); } //Function to show notification messages Smart_Manager.prototype.showNotificationDialog = function( title = '', content = '', dlgparams = {} ) { window.smart_manager.modal = { title: ( title ) ? title : _x('Note', 'modal title', 'smart-manager-for-wp-e-commerce'), content: ( content ) ? content : sprintf( /* translators: %s: pricing page link */ _x('This feature is available only in the %s version', 'modal content', 'smart-manager-for-wp-e-commerce'), ''+_x('Pro', 'modal content', 'smart-manager-for-wp-e-commerce')+''), autoHide: ( dlgparams.hasOwnProperty('autoHide') ) ? dlgparams.autoHide : false } window.smart_manager.showModal() } //Function to show progress dialog Smart_Manager.prototype.showProgressDialog = function( title = '' ) { window.smart_manager.modal = { title: ( title != '' ) ? title : _x('Please Wait', 'progressbar modal title', 'smart-manager-for-wp-e-commerce'), content: '
          '+_x('Initializing...', 'progressbar modal content', 'smart-manager-for-wp-e-commerce')+'
          ', autoHide: false, showCloseIcon: false, cta: {} } window.smart_manager.showModal() } //Function to show confirm dialog Smart_Manager.prototype.showConfirmDialog = function( params ) { window.smart_manager.modal = { title: ( params.hasOwnProperty('title') !== false && params.title != '' ) ? params.title : _x('Warning', 'modal title', 'smart-manager-for-wp-e-commerce'), content: ( params.hasOwnProperty('content') !== false && params.content != '' ) ? params.content : _x('Are you sure?', 'modal content', 'smart-manager-for-wp-e-commerce'), autoHide: false, cta: { title: ( (params.btnParams.hasOwnProperty('yesText')) ? params.btnParams.yesText : _x('Yes', 'button', 'smart-manager-for-wp-e-commerce') ), closeModalOnClick: (params.btnParams.hasOwnProperty('hideOnYes')) ? params.btnParams.hideOnYes : true, callback: function() { if( params.btnParams.hasOwnProperty('yesCallback') && typeof params.btnParams.yesCallback === "function" ) { if( params.btnParams.hasOwnProperty('yesCallbackParams') ) { params.btnParams.yesCallback( params.btnParams.yesCallbackParams ); } else { params.btnParams.yesCallback(); } } } }, closeCTA: { title: ( (params.btnParams.hasOwnProperty('noText')) ? params.btnParams.noText : _x('No', 'button', 'smart-manager-for-wp-e-commerce') ), callback: function() { if( params.btnParams.hasOwnProperty('noCallback') && typeof params.btnParams.noCallback === "function" ) { params.btnParams.noCallback(); } } }, } window.smart_manager.showModal() } Smart_Manager.prototype.getCurrentDashboardState = function() { let tempDashModel = JSON.parse(JSON.stringify(window.smart_manager.currentDashboardModel)); let tempColModel = JSON.parse(JSON.stringify(window.smart_manager.currentColModel)); if(!Array.isArray(tempColModel)) { tempColModel = [] } tempDashModel.columns = new Array(); tempColModel.forEach(function(colObj) { if( typeof(colObj.hidden) != 'undefined' && colObj.hidden === false ) { tempDashModel.columns.push(colObj); } }); let dashboardState = {'columns': tempDashModel.columns, 'sort_params': tempDashModel.sort_params}; let viewSlug = window.smart_manager.getViewSlug(window.smart_manager.dashboardName); if(viewSlug){ dashboardState['search_params'] = { 'isAdvanceSearch': ((window.smart_manager.advancedSearchQuery.length > 0) ? 'true' : 'false'), 'params': ((window.smart_manager.advancedSearchQuery.length > 0) ? window.smart_manager.advancedSearchQuery : window.smart_manager.simpleSearchText) } } return JSON.stringify(dashboardState); } Smart_Manager.prototype.refreshDashboardStates = function() { window.smart_manager.dashboardStates[window.smart_manager.dashboard_key] = window.smart_manager.getCurrentDashboardState(); } //Function to handle the state apply at regular intervals Smart_Manager.prototype.updateState = function(refreshParams = {}){ let viewSlug = window.smart_manager.getViewSlug(window.smart_manager.dashboardName); if(1 == window.smart_manager.sm_beta_pro && viewSlug && !refreshParams.updateView){ //Added for skipping `save_state` when simply switching from custom views dashboards window.smart_manager.refresh(); return; } // do not refresh the states if view if("undefined" !== typeof(window.smart_manager.refreshDashboardStates) && "function" === typeof(window.smart_manager.refreshDashboardStates)){ window.smart_manager.refreshDashboardStates(); //refreshing the dashboard states } if(Object.getOwnPropertyNames(window.smart_manager.dashboardStates).length <= 0){ return; } //Ajax request to update the dashboard states let params = {}; params.data_type = 'json'; params.data = { cmd: 'save_state', security: window.smart_manager.sm_nonce, active_module: window.smart_manager.dashboard_key, dashboard_states: window.smart_manager.dashboardStates }; // Code for passing extra param for view handling if(1 == window.smart_manager.sm_beta_pro){ params.data['is_view'] = 0; if(viewSlug && (refreshParams.updateView || false)){ params.data['is_view'] = 1; params.data['active_module'] = viewSlug; } // Flag for handling taxonomy dashboards params.data['is_taxonomy'] = window.smart_manager.isTaxonomyDashboard(); // code for handling tasks of the current dashboard if(refreshParams && 'undefined' !== typeof(refreshParams.isTasksEnabled)){ params.data['isTasks'] = refreshParams.isTasksEnabled; } // Code for handling renaming of columns if(Object.keys(window.smart_manager.editedColumnTitles).length > 0){ params.data['edited_column_titles'] = window.smart_manager.editedColumnTitles; } } params.showLoader = false; if(refreshParams && 'undefined' !== typeof(refreshParams.async)){ params.async = refreshParams.async; } window.smart_manager.send_request(params,function(refreshParams,response){ window.smart_manager.dashboardStates = {}; if(refreshParams){ if('undefined' !== typeof(refreshParams.refreshDataModel)){ window.smart_manager.refresh(); } } }, refreshParams); } // Function to determine if the selected dashhboard is a taxonomy dashboard or not Smart_Manager.prototype.isTaxonomyDashboard = function() { let viewSlug = window.smart_manager.getViewSlug(window.smart_manager.dashboardName); return (window.smart_manager.allTaxonomyDashboards[(window.smart_manager.viewPostTypes.hasOwnProperty(viewSlug)) ? window.smart_manager.viewPostTypes[viewSlug] : window.smart_manager.dashboard_key]) ? 1: 0 } // Function to get keyId for the dashboard Smart_Manager.prototype.getKeyID = function() { switch (true){ case ("undefined" !== typeof(window.smart_manager.isTasksEnabled) && "function" === typeof(window.smart_manager.isTasksEnabled) && (1 === window.smart_manager.isTasksEnabled()) || ('product_stock_log' === window.smart_manager.dashboard_key)): return 'sm_tasks_id' case ('undefined' !== typeof window.smart_manager.taxonomyDashboards[window.smart_manager.dashboard_key]): return 'terms_term_id' case ('user' === window.smart_manager.dashboard_key): return 'users_id' case (['shop_order', 'shop_subscription'].includes(window.smart_manager.dashboard_key) && "undefined" !== typeof(window.smart_manager.sm_is_woo79) && ('true' === window.smart_manager.sm_is_woo79)): return 'wc_orders_id' default: return 'posts_id'; } } // Function to save settings Smart_Manager.prototype.saveSettings = function(settings = {}){ if(0 == Object.keys(settings).length || (0 < Object.keys(settings).length && !settings.hasOwnProperty('general'))){ return; } let params = {}; params.data = { cmd: 'save_settings', active_module: 'smart_manager_settings', settings: JSON.stringify(settings), security: window.smart_manager.sm_nonce, pro: ('undefined' !== typeof(window.smart_manager.sm_beta_pro)) ? window.smart_manager.sm_beta_pro : 0 }; params.data_type = 'json' window.smart_manager.send_request(params,function(response){ let ack = (response.hasOwnProperty('ACK')) ? response.ACK : '' if('Success' === ack){ window.smart_manager.notification = {status:'success', message: _x('Settings saved successfully!', 'notification', 'smart-manager-for-wp-e-commerce')} window.smart_manager.showNotification() } setTimeout(function () { location.reload(); }, 2000); }); }; // Function to change export CSV button text. Smart_Manager.prototype.exportButtonHtml = function() { if(document.getElementById('sm_export_csv') !== null){ document.getElementById('sm_export_csv').innerHTML = ''+_x('Selected Records', 'export button', 'smart-manager-for-wp-e-commerce')+''+''+_x('Entire Store', 'export button', 'smart-manager-for-wp-e-commerce')+''; } } Smart_Manager.prototype.showSelect2Childs = function ( parentID = '', parentElement = '' ) { // Check if dashboardSelect2Items exists. if ((!window.smart_manager.hasOwnProperty('dashboardSelect2Items')) || (!parentID ) || (typeof parentID === 'undefined') || (parentID.length === 0) || (!parentElement ) || (typeof parentElement === 'undefined') || (parentElement.length === 0)) { return; } parentElement.addClass("focus") let parent = window.smart_manager.dashboardSelect2Items.find((d) => d.id === parentID); if ((!parent ) || (typeof parentID === 'undefined') || (parentID.length === 0)) { return; } let childs_section = jQuery("#select2_childs_section"); if ((!childs_section ) || (typeof childs_section === 'undefined') || (childs_section.length === 0)) { return; } childs_section.html(""); // Clear previous content. // Get the value from the search field. let searchValue = jQuery(".select2-search__field").val().trim().toLowerCase(); // Filter children based on the search value if it exists, if not them display all childrens of the parent. let select2SearchResult = window.smart_manager.findSelect2ParentOrChildByText(jQuery("#sm_dashboard_select").val(), false); let selectedChildID = select2SearchResult.hasOwnProperty('childID') ? select2SearchResult.childID : ''; //this is to highlight the current selected child, ie. current dashboard element let matchingChildren = (searchValue && searchValue !== '') ? parent.children.filter((child) => child.text.toLowerCase().includes(searchValue)) : parent.children; if ((!matchingChildren) || (typeof matchingChildren === 'undefined') || (matchingChildren.length === 0)) { matchingChildren = parent.children; } if (matchingChildren.length) { let nestedList = jQuery("
            ").addClass("nested-list"); matchingChildren.forEach((child) => { let childElement = jQuery("
          • ").text(child.text).addClass("select2-child-item").attr("data-id", child.id); if(selectedChildID === child.id){ childElement.addClass("selected") } nestedList.append(childElement); }); childs_section.show().append(nestedList); } else { childs_section.hide(); } // Position the childs_section beside the hovered parent element. let offset = parentElement.offset(); let rootFontSize = parseFloat(getComputedStyle(document.documentElement).fontSize); childs_section.css({ top: `${(offset.top) / rootFontSize}rem`, left: `${(offset.left + parentElement.outerWidth() + 2) / rootFontSize}rem`, }); }; Smart_Manager.prototype.findSelect2ParentOrChildByText = function ( ParentOrChildText = '', matchExactChild = false ) { if((!ParentOrChildText ) || (typeof ParentOrChildText === 'undefined') || (ParentOrChildText.length === 0)){ return false; } ParentOrChildText = ParentOrChildText.trim().toLowerCase(); let parentID = window.smart_manager.dashboardSelect2Items.find((item) => {return item.text.trim().toLowerCase().startsWith(ParentOrChildText)})?.id; let childID = ''; // If matching parent is not found, search within children. if ((!parentID) || (typeof parentID === 'undefined') || (parentID.length === 0)) { window.smart_manager.dashboardSelect2Items.some((item) => { let matchingChild = item.children.find((child) => { if(matchExactChild){ if ((child.id === ParentOrChildText) || (child.text === ParentOrChildText)){ childID = child.id; return true; } }else{ if ((child.text.trim().toLowerCase().includes(ParentOrChildText)) || (child.id.includes(ParentOrChildText.toLowerCase()))){ childID = child.id; return true; } } return false; }); if (matchingChild) { parentID = item.id; return true; } return false; }); } return {parentID,childID}; } if(typeof window.smart_manager === 'undefined'){ window.smart_manager = new Smart_Manager(); } //Events to be handled on document ready jQuery(document).ready(function() { jQuery("body").append('
            '); if('#!/pricing' != document.location.hash){ window.smart_manager.init(); } jQuery(document) .on('select2:open', function(event) { if(event.target.id === 'sm_dashboard_select'){ setTimeout(() => { let select2SearchResult = window.smart_manager.findSelect2ParentOrChildByText(event.target.value, true); let select2ParentId = (!select2SearchResult || !select2SearchResult.hasOwnProperty('parentID')) ? false : select2SearchResult.parentID; if(!select2ParentId){ return; } let Select2ParentElement = jQuery(`span#${select2ParentId}`).parent(".select2-results__group"); if((!Select2ParentElement) || (!Select2ParentElement.length)){ return; } window.smart_manager.showSelect2Childs(select2ParentId, Select2ParentElement); }, 10); } jQuery('.select2-search__field').focus(); jQuery("#select2_childs_section").addClass("visible"); }) .on('click','#select2-sm_dashboard_select-container',function (event) { if(!(jQuery("#select2_childs_section").hasClass("visible"))){ jQuery('#select2_childs_section').hide(); } }) .on('click', function (event) { if (!jQuery(event.target).closest('.select2-container').length && !jQuery(event.target).closest('#select2_childs_section').length) { jQuery('#select2_childs_section').hide(); } }) .on('select2:close', function(event) { //not hiding #select2_childs_section here because click event will not work on this. jQuery("#select2_childs_section").removeClass("visible"); }) }); jQuery.widget('ui.dialog', jQuery.extend({}, jQuery.ui.dialog.prototype, { _title: function(title) { let $title = this.options.title || ' ' if( ('titleIsHtml' in this.options) && this.options.titleIsHtml == true ) title.html($title); else title.text($title); } })); //Code for custom rendrers and extending Handsontable (function(Handsontable){ let defaultTextEditor = Handsontable.editors.TextEditor.prototype.extend(); //Function to override the SelectEditor function to handle color codes Handsontable.editors.SelectEditor.prototype.prepare = function () { // Call the original prepare method Handsontable.editors.BaseEditor.prototype.prepare.apply(this, arguments); let _this2 = this, selectOptions = this.cellProperties.selectOptions, colorCodes = ( typeof(this.cellProperties.colorCodes) != 'undefined' ) ? this.cellProperties.colorCodes : '', options = ''; if (typeof selectOptions === 'function') { options = this.prepareOptions(selectOptions(this.row, this.col, this.prop)); } else { options = this.prepareOptions(selectOptions); } this.select.innerHTML = ''; Object.entries(options).forEach(([key, value]) => { let optionElement = document.createElement('OPTION'); optionElement.value = key; if( colorCodes != '' ) { for( let color in colorCodes ) { if( colorCodes[color].indexOf(key) != -1 ) { optionElement.className = 'sm_beta_select_'+color; break; } } } optionElement.innerHTML = value; _this2.select.appendChild(optionElement); }); }; Smart_Manager.prototype.dateEditor = function(currObj, arguments, format = 'Y-m-d H:i:s', placeholder = 'YYYY-MM-DD HH:MM:SS', cssClass = 'htDateTimeEditor') { // Call the original createElements method Handsontable.editors.TextEditor.prototype.createElements.apply(currObj, arguments); // Create datepicker input and update relevant properties currObj.TEXTAREA = document.createElement('input'); currObj.TEXTAREA.setAttribute('type', 'text'); currObj.TEXTAREA.className = cssClass; currObj.textareaStyle = currObj.TEXTAREA.style; currObj.textareaStyle.width = 0; currObj.textareaStyle.height = 0; // Replace textarea with datepicker Handsontable.dom.empty(currObj.TEXTAREA_PARENT); currObj.TEXTAREA_PARENT.appendChild(currObj.TEXTAREA); if(0 !== window.smart_manager.useDatePickerForDateTimeOrDateCols){ jQuery('.'+cssClass).Zebra_DatePicker({ format: format, show_icon: false, show_select_today: false, default_position: 'below', readonly_element: false, }) } jQuery('.'+cssClass).attr('placeholder',placeholder); }; function customNumericTextEditor(query, callback) { // ...your custom logic of the validator RegExp.escape= function(s) { return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); }; let regx = new RegExp("^[0-9]*"+ RegExp.escape(window.smart_manager.wooPriceDecimalSeparator) +"?[0-9]*$"); if (regx.test(query)) { callback(true); } else { callback(false); } } function customPhoneTextEditor(value, callback) { // ...your custom logic of the validator if (/^(\d|\-|\+|\.|\(|\)|\ )*$/.test(value)) { callback(true); } else { callback(false); } } // Register an alias Handsontable.validators.registerValidator('customNumericTextEditor', customNumericTextEditor); Handsontable.validators.registerValidator('customPhoneTextEditor', customPhoneTextEditor); let dateTimeEditor = Handsontable.editors.TextEditor.prototype.extend(), dateEditor = Handsontable.editors.TextEditor.prototype.extend(), timeEditor = Handsontable.editors.TextEditor.prototype.extend(), customNumericEditor = Handsontable.editors.NumericEditor.prototype.extend(); customNumericEditor.prototype.createElements = function() { // Call the original createElements method Handsontable.editors.NumericEditor.prototype.createElements.apply(this, arguments); // Create number input and update relevant properties this.TEXTAREA = document.createElement('input'); this.TEXTAREA.setAttribute('type', ((0 === window.smart_manager.useNumberFieldForNumericCols) ? 'text' : 'number')); // Replace textarea with number Handsontable.dom.empty(this.TEXTAREA_PARENT); this.TEXTAREA_PARENT.appendChild(this.TEXTAREA); } Handsontable.editors.registerEditor('customNumericEditor', customNumericEditor); dateTimeEditor.prototype.createElements = function() { window.smart_manager.dateEditor( this, arguments ) }; dateEditor.prototype.createElements = function() { window.smart_manager.dateEditor( this, arguments, 'Y-m-d', 'YYYY-MM-DD', 'htDateEditor' ) }; timeEditor.prototype.createElements = function() { window.smart_manager.dateEditor( this, arguments, 'H:i', 'HH:MM', 'htTimeEditor' ) }; function numericRenderer(hotInstance, td, row, col, prop, value, cellProperties) { Handsontable.renderers.NumericRenderer.apply(this, arguments); let currentRowData = (Object.keys(window.smart_manager.currentDashboardData).length > 0 && window.smart_manager.currentDashboardData.hasOwnProperty(row)) ? window.smart_manager.currentDashboardData[row] : {}; let colObj = ( window.smart_manager.currentVisibleColumns.indexOf(col) != -1 ) ? window.smart_manager.currentVisibleColumns[col] : {}; if( !value && '' === value && null === value ) { value = parseFloat(value); value = ( colObj.hasOwnProperty('decimalPlaces') ) ? value.toFixed( parseInt( colObj.decimalPlaces ) ) : value; } if(!value || value === '' || value == null || value === 0 || value === 0.00 || value === '0' || value === '0.00' ) { td.innerHTML = '
            ' + value + '
            '; } else { td.innerHTML = '
            ' + td.innerHTML + '
            '; } // Code for handling colorCodes highlighting for the cells let colorCodes = ( typeof(cellProperties.colorCodes) != 'undefined' ) ? cellProperties.colorCodes : ''; if( value !== '' && value != null ) { if( colorCodes != '' ) { if ( currentRowData && currentRowData.hasOwnProperty('custom_stock_color_code') ) { return td.classList.add(...['sm_beta_select_'+currentRowData['custom_stock_color_code'], 'sm_font_bold']); } for( let color in colorCodes ) { let min = (colorCodes[color].hasOwnProperty('min')) ? colorCodes[color]['min'] : -1, max = (colorCodes[color].hasOwnProperty('max')) ? colorCodes[color]['max'] : -1 if(min < 0 && max < 0){ continue; } let v = parseFloat(value); if(isNaN(v)){ continue; } if( ((min < 0 || max < 0) && ((min >= 0 && v >= min) || (max >= 0 && v <= max))) || ((min >= 0 && max >= 0) && (v >= min) && (v <= max)) ){ td.classList.add(...['sm_beta_select_'+color, 'sm_font_bold']) break; } } } } return td; } Handsontable.renderers.registerRenderer('numericRenderer', numericRenderer); function customTextRenderer(hotInstance, td, row, col, prop, value, cellProperties) { Handsontable.renderers.TextRenderer.apply(this, arguments); td.innerHTML = '
            ' + td.innerHTML + '
            '; return td; } Handsontable.renderers.registerRenderer('customTextRenderer', customTextRenderer); function customHtmlRenderer(hotInstance, td, row, col, prop, value, cellProperties) { Handsontable.renderers.HtmlRenderer.apply(this, arguments); td.innerHTML = '
            ' + td.innerHTML + '
            '; return td; } Handsontable.renderers.registerRenderer('customHtmlRenderer', customHtmlRenderer); function customCheckboxRenderer(hotInstance, td, row, col, prop, value, cellProperties) { Handsontable.renderers.CheckboxRenderer.apply(this, arguments); td.innerHTML = '
            ' + td.innerHTML + '
            '; return td; } Handsontable.renderers.registerRenderer('customCheckboxRenderer', customCheckboxRenderer); function customPasswordRenderer(hotInstance, td, row, col, prop, value, cellProperties) { Handsontable.renderers.PasswordRenderer.apply(this, arguments); td.innerHTML = '
            ' + td.innerHTML + '
            '; return td; } Handsontable.renderers.registerRenderer('customPasswordRenderer', customPasswordRenderer); function datetimeRenderer(hotInstance, td, row, column, prop, value, cellProperties) { if( typeof(cellProperties.className) != 'undefined' ) { //code to higlight the cell on selection td.setAttribute('class',cellProperties.className); } td.innerHTML = value; td.innerHTML = '
            ' + td.innerHTML + '
            '; return td; } function longstringRenderer(hotInstance, td, row, column, prop, value, cellProperties) { Handsontable.renderers.HtmlRenderer.apply(this, arguments); if( typeof(cellProperties.className) != 'undefined' ) { //code to higlight the cell on selection td.setAttribute('class',cellProperties.className); } td.innerHTML = '
            ' + td.innerHTML + '
            '; return td; } function selectValueRenderer(hotInstance, td, row, column, prop, value, cellProperties) { let source = cellProperties.selectOptions || {}, className = ( typeof(cellProperties.className) != 'undefined' ) ? cellProperties.className : '', colorCodes = ( typeof(cellProperties.colorCodes) != 'undefined' ) ? cellProperties.colorCodes : ''; // if( className != '' ) { //code to higlight the cell on selection // td.setAttribute('class',className); // } if( typeof source != 'undefined' && typeof value != 'undefined' && source.hasOwnProperty(value) ) { td.setAttribute('data-value',value); if( colorCodes != '' ) { for( let color in colorCodes ) { if( colorCodes[color].indexOf(value) != -1 ) { // className = (( className != '' ) ? className + ' ' : '') + 'sm_beta_select_'+color; // td.setAttribute('class',className); td.classList.add('sm_beta_select_'+color) break; } } } td.innerHTML = source[value]; } td.innerHTML = '
            ' + td.innerHTML + '
            '; return td; } function multilistRenderer(hotInstance, td, row, column, prop, value, cellProperties) { // ...renderer logic Handsontable.renderers.TextRenderer.apply(this, arguments); if( typeof(cellProperties.className) != 'undefined' ) { //code to higlight the cell on selection td.setAttribute('class',cellProperties.className); } td.innerHTML = '
            ' + td.innerHTML + '
            '; return td; } Handsontable.renderers.registerRenderer('selectValueRenderer', selectValueRenderer); function select2Renderer(instance, td, row, col, prop, value, cellProperties) { let selectedId; let optionsList = (cellProperties.select2Options.data) ? cellProperties.select2Options.data : []; let dynamicSelect2 = ( cellProperties.select2Options.hasOwnProperty('loadDataDynamically') ) ? true : false; if( (typeof optionsList === "undefined" || typeof optionsList.length === "undefined" || !optionsList.length) && !dynamicSelect2 ) { Handsontable.cellTypes.text.renderer(instance, td, row, col, prop, value, cellProperties); return td; } if( dynamicSelect2 && typeof(value) == 'object' ) { jQuery(td).attr('data-value', JSON.stringify(value)); let values = ( value ) ? value : []; value = []; var text = ''; values.forEach(function(obj) { if( obj.text ) { value.push(obj.text.trim()); } }); } else { let values = (value + "").split(","); value = []; for (let index = 0; index < optionsList.length; index++) { if (values.indexOf(optionsList[index].id + "") > -1) { selectedId = optionsList[index].id; value.push(optionsList[index].text); } } } value = value.join(", "); Handsontable.cellTypes.text.renderer(instance, td, row, col, prop, value, cellProperties); td.innerHTML = '
            ' + td.innerHTML + '
            '; return td; } Handsontable.renderers.registerRenderer('select2Renderer', select2Renderer); function generateImageHtml(params = {}){ if(!params.td || !params.value || !params.cellProperties || !params.currentInstance){ return } let escaped = Handsontable.helper.stringify(params.value), img, className = ((params.className) ? (params.className + ' ') : '') + 'sm_image_thumbnail'; if (escaped.indexOf('http') === 0) { img = document.createElement('IMG'); img.src = params.value; img.width = 30; img.height = 30; img.setAttribute('class',className); Handsontable.dom.addEvent(img, 'mousedown', function (e){ e.preventDefault(); // prevent selection quirk }); // Handsontable.dom.empty(td); params.td.appendChild(img); } else { // render as text Handsontable.renderers.TextRenderer.apply(params.currentInstance, arguments); } if( typeof(params.cellProperties.className) != 'undefined' ) { className += ' '+ params.cellProperties.className; params.td.setAttribute('class',params.cellProperties.className); } return params.td } function imageRenderer(hotInstance, td, row, column, prop, value, cellProperties) { try{ value = (!value || value == 0) ? window.smart_manager.defaultImagePlaceholder : value Handsontable.dom.empty(td); td = generateImageHtml({ td: td, value: value, cellProperties: cellProperties, currentInstance: this }) td.innerHTML = '
            ' + td.innerHTML + '
            '; }catch(e){ console.log('imageRenderer:: ', e) } return td; } function multipleImageRenderer(hotInstance, td, row, column, prop, value, cellProperties) { try{ value = (!Array.isArray(value)) ? [] : value; value = (value.length === 0) ? [{id:0, val:window.smart_manager.defaultImagePlaceholder}] : value Handsontable.dom.empty(td); value.map((obj) => { td = generateImageHtml({ td: td, value: obj.val || '', cellProperties: cellProperties, currentInstance: this }) }) td.innerHTML = '
            ' + td.innerHTML + '
            '; }catch(e){ console.log('multipleImageRenderer:: ', e) } return td; } // For passing tasks params when updating using inline edit Smart_Manager.prototype.addTasksParams = function(params = {}){ if(!params || !params.hasOwnProperty('cmd') || ("undefined" === typeof(window.smart_manager.isTasksEnabled) && "function" !== typeof(window.smart_manager.isTasksEnabled))) { return params; } let cmdNames = ['get_dashboard_model','get_data_model']; if(cmdNames.includes(params['cmd'])){ return Object.assign(params,{isTasks: (window.smart_manager.isTasksEnabled()) ? 1 : 0}); }else if('batch_update' !== params['cmd'] && params.hasOwnProperty('edited_data')){ params.updatedEditedData = ((window.smart_manager.updatedEditedData) && (Object.values(window.smart_manager.updatedEditedData).length > 0)) ? JSON.stringify(window.smart_manager.updatedEditedData) : params['edited_data']; } return Object.assign(params,{isTasks: (window.smart_manager.isTasksEnabled()) ? 1 : 0, title: (window.smart_manager.updatedTitle) ? window.smart_manager.updatedTitle : window.smart_manager.processContent, isScheduled: window.smart_manager.isScheduled, scheduledFor: (window.smart_manager.isScheduled) ? window.smart_manager.scheduledFor : '0000-00-00 00:00:00', scheduledActionAdminUrl: (window.smart_manager.isScheduled) ? window.smart_manager.scheduledActionAdminUrl : '' }); } // For getting edited column name Smart_Manager.prototype.getColDisplayName = function(colSrc = ''){ if(!colSrc || ('undefined' === typeof(window.smart_manager.excludedEditedFieldKeys)) || ('undefined' === typeof(window.smart_manager.currentColModel))){ return colSrc; } for(i = 0; i < window.smart_manager.currentColModel.length; i++){ if(('undefined' !== typeof(window.smart_manager.currentColModel[i])) && window.smart_manager.currentColModel[i] && window.smart_manager.currentColModel[i].hasOwnProperty('src') && window.smart_manager.currentColModel[i].hasOwnProperty('name_display') && (window.smart_manager.currentColModel[i].src === colSrc) && false === window.smart_manager.excludedEditedFieldKeys.includes(colSrc)){ return window.smart_manager.currentColModel[i].name_display; } } } // For updating image Smart_Manager.prototype.inlineUpdateImage = function(imageParams){ if(!imageParams || !((Object.keys(imageParams)).every(imageParam => imageParams.hasOwnProperty(imageParam)))){ return; } let params = {}; params.data = { cmd: 'inline_update', active_module: window.smart_manager.dashboard_key, edited_data: imageParams.editedImage, security: window.smart_manager.sm_nonce, pro: ('undefined' !== typeof(window.smart_manager.sm_beta_pro)) ? window.smart_manager.sm_beta_pro : 0, table_model: (window.smart_manager.currentDashboardModel.hasOwnProperty('tables')) ? window.smart_manager.currentDashboardModel.tables : '' }; params.data = ("undefined" !== typeof(window.smart_manager.addTasksParams) && "function" === typeof(window.smart_manager.addTasksParams) && 1 == window.smart_manager.sm_beta_pro) ? window.smart_manager.addTasksParams(params.data) : params.data; window.smart_manager.send_request(params, function(response){ if('failed' !== response){ window.smart_manager.hot.setDataAtCell(imageParams.row, imageParams.col, imageParams.value, imageParams.source); if(window.smart_manager.isJSON(response) && ('undefined' === typeof(window.smart_manager.sm_beta_pro) || ('undefined' !== typeof(window.smart_manager.sm_beta_pro) && 1 != window.smart_manager.sm_beta_pro))){ response = JSON.parse(response); msg = response.msg; if('undefined' !== typeof(response.sm_inline_update_count)){ if("undefined" !== typeof(window.smart_manager.updateLitePromoMessage) && "function" === typeof(window.smart_manager.updateLitePromoMessage)){ window.smart_manager.updateLitePromoMessage(response.sm_inline_update_count); } } }else{ msg = response; } } }); }; // For changing dashboard display name in bottom bar for tasks Smart_Manager.prototype.changeDashboardDisplayName = function(dashboardDisplayName = ''){ if(!dashboardDisplayName){ return; } window.smart_manager.dashboardDisplayName = ("undefined" !== typeof(window.smart_manager.isTasksEnabled) && "function" === typeof(window.smart_manager.isTasksEnabled) && window.smart_manager.isTasksEnabled()) ? _x('Tasks','bottom bar display name for tasks','smart-manager-for-wp-e-commerce') : dashboardDisplayName; } // Code for handling gallery image modal. Smart_Manager.prototype.displayGalleryImagesModal = function(galleryImageParams){ if(!galleryImageParams || !((Object.keys(galleryImageParams)).every(galleryImageParam => galleryImageParams.hasOwnProperty(galleryImageParam)))){ return; } let rowNo = (galleryImageParams.hasOwnProperty('rowNo')) ? galleryImageParams.rowNo : 0; window.smart_manager.modal = { title: _x('Gallery Images','gallery modal title','smart-manager-for-wp-e-commerce'), content: galleryImageParams.imageGalleryHtml, autoHide: false, cta: { title: _x('Add','button','smart-manager-for-wp-e-commerce'), closeModalOnClick: false, callback: function(){ if("undefined" !== typeof(window.smart_manager.handleMediaUpdate) && "function" === typeof(window.smart_manager.handleMediaUpdate)){ jQuery('.sm_ui_dialog_class, .ui-widget-overlay').hide(); let params = { UploaderText: _x('Add images to product gallery','button','smart-manager-for-wp-e-commerce'), UploaderButtonText: _x('Add to gallery','button','smart-manager-for-wp-e-commerce'), allowMultiple: true, row_data_id: galleryImageParams.id }; params.callback = function(attachments){ jQuery('.sm_ui_dialog_class , .ui-widget-overlay').show(); if('undefined' === typeof(attachments)){ return; } let imageGalleryHtml = `'; let args = {id:galleryImageParams.id,src:galleryImageParams.src,values:[...imageIds].join(','),imageGalleryHtml:imageGalleryHtml,rowNo:rowNo}; if(1 == window.smart_manager.sm_beta_pro && "undefined" !== typeof(window.smart_manager.displayTitleModal) && "function" === typeof(window.smart_manager.displayTitleModal)){ window.smart_manager.displayTitleModal(args); }else if("undefined" !== typeof(window.smart_manager.inlineUpdateMultipleImages) && "function" === typeof(window.smart_manager.inlineUpdateMultipleImages)){ jQuery('div.modal-body').html(imageGalleryHtml); window.smart_manager.inlineUpdateMultipleImages(args); } } window.smart_manager.handleMediaUpdate( params ); } } }, } window.smart_manager.showModal() } // Code for displaying title modal in case of gallery images. Smart_Manager.prototype.displayTitleModal = function(params){ if(!params || !((Object.keys(params)).every(param => params.hasOwnProperty(param)))){ return; } let editedColumnName = ''; if("undefined" !== typeof(window.smart_manager.getColDisplayName) && "function" === typeof(window.smart_manager.getColDisplayName)){ editedColumnName = window.smart_manager.getColDisplayName(params.src); } window.smart_manager.processName = _x('Inline Edit','process name','smart-manager-for-wp-e-commerce'); window.smart_manager.processContent = (editedColumnName) ? editedColumnName : params.src; if("undefined" !== typeof(window.smart_manager.inlineUpdateMultipleImages) && "function" === typeof(window.smart_manager.inlineUpdateMultipleImages)){ window.smart_manager.processCallback = window.smart_manager.inlineUpdateMultipleImages; } window.smart_manager.processCallbackParams = params; if("undefined" !== typeof(window.smart_manager.showTitleModal) && "function" === typeof (window.smart_manager.showTitleModal)){ window.smart_manager.showTitleModal() } } // Code for show/hide tasks Smart_Manager.prototype.displayTasks = function (params = {}){ let actionBtns = jQuery(".sm_top_bar_action_btns:nth-last-child(2), .sm_top_bar_action_btns:nth-last-child(3), .sm_top_bar_action_btns:nth-last-child(4), .sm_top_bar_action_btns #batch_update_sm_editor_grid, .sm_top_bar_action_btns #show_hide_cols_sm_editor_grid"); let revDelBtns = jQuery(".sm_top_bar_action_btns:nth-last-child(5) #undo_sm_editor_grid, .sm_top_bar_action_btns:nth-last-child(5) #delete_tasks_sm_editor_grid"); switch(true){ case (params.hasOwnProperty('hideTasks')): case params.hasOwnProperty('dashboardChange'): jQuery("#sm_show_tasks").prop('checked', false); actionBtns.show(); revDelBtns.hide(); (window.smart_manager.getViewSlug(window.smart_manager.dashboardName)) ? jQuery('#sm_show_tasks_container').hide() : jQuery('#sm_show_tasks_container').show(); break; case params.hasOwnProperty('showHideTasks'): actionBtns.toggle(); if(1 === params.showHideTasks){ revDelBtns.show(); jQuery('#sm_show_tasks_container').parents('div.sm_top_bar_action_btns').attr('style','width: 100% !important;'); window.smart_manager.updateState(); }else{ revDelBtns.hide(); jQuery('#sm_show_tasks_container').parents('div.sm_top_bar_action_btns').removeAttr('style'); window.smart_manager.updateState({isTasksEnabled:0}); } break; } } //Function to add title for each of the column headers Smart_Manager.prototype.refreshColumnsTitleAttribute = function(){ setTimeout(() => { window.smart_manager.hot.updateSettings({ data: window.smart_manager.currentDashboardData, columns: window.smart_manager.currentVisibleColumns, colHeaders: window.smart_manager.column_names }); jQuery('table.htCore').find('.colHeader').each(function() { jQuery(this).attr('title',jQuery(this).text()+' '+_x('(Click to sort)', 'tooltip', 'smart-manager-for-wp-e-commerce')); }); }, 1000); } // Code for resetting search functionalities. Smart_Manager.prototype.resetSearch = function(){ ('advanced' === window.smart_manager.searchType) ? jQuery('#search_switch').prop('checked', false).trigger('change') : jQuery('#sm_simple_search_box').val(''); } // Function to detect if filtered data or not Smart_Manager.prototype.isFilteredData = function(){ return (('simple' === window.smart_manager.searchType && window.smart_manager.simpleSearchText !== '') || ('simple' !== window.smart_manager.searchType && window.smart_manager.advancedSearchQuery.length > 0)) } // Function to toggle top bar in case of product stock log dashboard. Smart_Manager.prototype.toggleTopBar = function(){ ('product_stock_log' === window.smart_manager.dashboard_key) ? jQuery('#sm_top_bar').toggle(false) : jQuery('#sm_top_bar').toggle(true); } // Function for displaying warning modal before doing export csv Smart_Manager.prototype.getExportCsv = function(args){ if(!args || !((Object.keys(args)).every(arg => args.hasOwnProperty(arg)))){ return; } args.params.content = _x('Are you sure you want to export the ','modal content','smart-manager-for-wp-e-commerce') + args.btnText + '?'; if("undefined" !== typeof(window.smart_manager.generateCsvExport) && "function" === typeof(window.smart_manager.generateCsvExport)){ args.params.btnParams.yesCallback = window.smart_manager.generateCsvExport; } window.smart_manager.exportStore = (['sm_export_entire_store_stock_cols', 'sm_export_entire_store_visible_cols', 'sm_export_entire_store'].includes(args.id)) ? (args.id === 'sm_export_entire_store_stock_cols' ? 'entire_store_stock_cols' : 'entire_store') : ''; window.smart_manager.columnsToBeExported = (window.smart_manager.stockCols && window.smart_manager.stockCols.includes(args.id)) ? 'stock' : 'visible'; if("undefined" !== typeof(window.smart_manager.showConfirmDialog) && "function" === typeof(window.smart_manager.showConfirmDialog)){ window.smart_manager.showConfirmDialog(args.params); } } // ======================================================================== // EXPORT CSV // ======================================================================== Smart_Manager.prototype.generateCsvExport = function() { let params = { cmd: 'get_export_csv', active_module: window.smart_manager.dashboard_key, security: window.smart_manager.sm_nonce, pro: true, SM_IS_WOO30: window.smart_manager.sm_is_woo30, sort_params: (window.smart_manager.currentDashboardModel.hasOwnProperty('sort_params') ) ? window.smart_manager.currentDashboardModel.sort_params : '', table_model: (window.smart_manager.currentDashboardModel.hasOwnProperty('tables') ) ? window.smart_manager.currentDashboardModel.tables : '', search_text: (window.smart_manager.searchType == 'simple') ? window.smart_manager.simpleSearchText : '', advanced_search_query: JSON.stringify((window.smart_manager.searchType != 'simple') ? window.smart_manager.advancedSearchQuery : []), is_taxonomy: window.smart_manager.isTaxonomyDashboard() || 0, storewide_option: window.smart_manager.exportStore || '', selected_ids: (window.smart_manager.getSelectedKeyIds()) ? JSON.stringify(window.smart_manager.getSelectedKeyIds()) : '', columnsToBeExported: window.smart_manager.columnsToBeExported || '' }; //Code for handling views let viewSlug = window.smart_manager.getViewSlug(window.smart_manager.dashboardName); if(viewSlug){ params['is_view'] = 1; params['active_view'] = viewSlug; params['active_module'] = (window.smart_manager.viewPostTypes.hasOwnProperty(viewSlug)) ? window.smart_manager.viewPostTypes[viewSlug] : window.smart_manager.dashboard_key; } let export_url = window.smart_manager.sm_ajax_url + '&cmd='+ params['cmd'] +'&active_module='+ params['active_module'] +'&security='+ params['security'] +'&pro='+ params['pro'] +'&SM_IS_WOO30='+ params['SM_IS_WOO30'] +'&is_taxonomy='+ params['is_taxonomy'] +'&sort_params='+ encodeURIComponent(JSON.stringify(params['sort_params'])) +'&table_model='+ encodeURIComponent(JSON.stringify(params['table_model'])) +'&advanced_search_query='+params['advanced_search_query']+'&search_text='+ params['search_text'] + '&storewide_option=' + params['storewide_option'] + '&selected_ids=' + params['selected_ids'] + '&columnsToBeExported=' + params['columnsToBeExported']; export_url += ( window.smart_manager.date_params && window.smart_manager.date_params.hasOwnProperty('date_filter_params') ) ? '&date_filter_params='+ window.smart_manager.date_params['date_filter_params'] : ''; export_url += ( window.smart_manager.date_params && window.smart_manager.date_params.hasOwnProperty('date_filter_query') ) ? '&date_filter_query='+ window.smart_manager.date_params['date_filter_query'] : ''; if(viewSlug){ export_url += '&is_view='+params['is_view']+'&active_view='+params['active_view']; } setTimeout(()=>{window.location = export_url},500); } // Function for hiding modal Smart_Manager.prototype.hideModal = function() { setTimeout(() => { try{ window.smart_manager.modal = {} if(typeof (window.smart_manager.showPannelDialog) !== "undefined" && typeof (window.smart_manager.showPannelDialog) === "function" && typeof (window.smart_manager.getDefaultRoute) !== "undefined" && typeof (window.smart_manager.getDefaultRoute) === "function"){ window.smart_manager.showPannelDialog('',window.smart_manager.getDefaultRoute(true)) } } catch(e){ SMErrorHandler.log('Exception occurred in hideModal:: ', e) } },200) } // Function for displaying confirm dialog for unsaved changes. Smart_Manager.prototype.confirmUnsavedChanges = function(params ={}) { try{ window.smart_manager.modal = { title: _x('Attention!', 'modal title', 'smart-manager-for-wp-e-commerce'), content: '
            '+ _x('You have unsaved changes. Are you sure you want to continue?', 'modal content', 'smart-manager-for-wp-e-commerce')+'
            ', autoHide: false, cta: { title: _x('Yes', 'button', 'smart-manager-for-wp-e-commerce'), //closeModalOnClick: (params.hasOwnProperty('hideOnYes')) ? params.hideOnYes : true, callback: function() { setTimeout(() => { // TODO: improve it if(params.hasOwnProperty('modalVals')){ window.smart_manager.modal = params.modalVals } if(params.hasOwnProperty('yesCallback') && typeof params.yesCallback === "function"){ if(params.hasOwnProperty('yesCallbackParams')){ params.yesCallback( params.yesCallbackParams ); }else{ params.yesCallback(); } } },300) } }, closeCTA: { title: _x('No', 'button', 'smart-manager-for-wp-e-commerce'), callback: function() { if( params.hasOwnProperty('noCallback') && typeof params.noCallback === "function" ) { params.noCallback(); } } } } window.smart_manager.showModal() } catch(e){ SMErrorHandler.log('Exception occurred in confirmUnsavedChanges:: ', e) } } // Function to show man-hrs saved message, post inline-update in lite version Smart_Manager.prototype.showManHoursSaved = function(params ={}) { try{ window.smart_manager.modal = { title: _x( params.hasOwnProperty('title')?params.title:"", 'modal title', 'smart-manager-for-wp-e-commerce'), content: '
            '+ _x( params.hasOwnProperty('message')?params.message:"", 'modal content', 'smart-manager-for-wp-e-commerce')+'
            ', hideFooter:true, autoHide: false, isFooterItemsCenterAligned: true } window.smart_manager.showModal() } catch(e){ SMErrorHandler.log('Exception occurred in showManHoursSaved:: ', e) } } // Function for updating Advanced Search rule count. Smart_Manager.prototype.updateAdvancedSearchRuleCount = function(){ if(!window.smart_manager.advancedSearchQuery || !window.smart_manager.advancedSearchQuery.length > 0){ return; } let firstQuery = window.smart_manager.advancedSearchQuery[0]; if(Object.keys(firstQuery).length > 0){ let rules = firstQuery.hasOwnProperty('rules') ? firstQuery.rules : []; if(rules.length > 0){ rules.forEach(ruleSet => { window.smart_manager.advancedSearchRuleCount += ruleSet.rules.length; }); } } } // Register an alias for datetime Handsontable.cellTypes.registerCellType('sm.datetime', { editor: dateTimeEditor, renderer: datetimeRenderer, allowInvalid: true, }); // Register an alias for date Handsontable.cellTypes.registerCellType('sm.date', { editor: dateEditor, renderer: datetimeRenderer, allowInvalid: true, }); // Register an alias for time Handsontable.cellTypes.registerCellType('sm.time', { editor: timeEditor, renderer: datetimeRenderer, allowInvalid: true, }); // Register an alias for image Handsontable.cellTypes.registerCellType('sm.image', { renderer: imageRenderer, allowInvalid: true, }); // Register an alias for multiple gallery images Handsontable.cellTypes.registerCellType('sm.multipleImage', { // renderer: Handsontable.renderers.HtmlRenderer, renderer: multipleImageRenderer, allowInvalid: true, }); // Register an alias for longstrings Handsontable.cellTypes.registerCellType('sm.longstring', { editor: defaultTextEditor, renderer: multilistRenderer, allowInvalid: true, }); // Register an alias for serialized Handsontable.cellTypes.registerCellType('sm.serialized', { editor: defaultTextEditor, renderer: multilistRenderer, allowInvalid: true, }); // Register an alias for multilist Handsontable.cellTypes.registerCellType('sm.multilist', { editor: defaultTextEditor, renderer: multilistRenderer, allowInvalid: true, }); })(Handsontable); assets/js/error-handler.js000064400000000132147600337620011570 0ustar00class SMErrorHandler { static log(msg, error){ console.log(msg, error) } }assets/js/manage-with-smart-manager.js000064400000000563147600337620013771 0ustar00/* phpcs:ignoreFile */ jQuery(function() { if ( 'undefined' === typeof manage_with_sm ) { return; } let titleAction = jQuery( 'body' ).find( '.page-title-action' ).last(); if ( manage_with_sm.url ) { jQuery(titleAction).after( '' + manage_with_sm.string + '' ); } }); assets/js/admin.js000064400000352623147600337620010133 0ustar00!function(e){function t(t){for(var a,s,i=t[0],l=t[1],m=t[2],u=0,d=[];u0&&void 0!==arguments[0]?arguments[0]:-1;try{var r=o({},e.data.default.rule)||{};if(r.key=e.generateKey(),t>=0){var a=e.data.ruleGroups[t]||[];a&&a.rules.push(r)}else{var n=o({},e.data.default.ruleGroup)||{};n.rules=[r],n.key=e.generateKey(),e.data.ruleGroups.push(n)}}catch(e){SMErrorHandler.log("In DashboardModel add:: ",e)}}},{key:"delete",value:function(t){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:-1;try{if(r>=0){var a=e.data.ruleGroups[t]||[],n=a.rules||[];n.splice(r,1)}else e.data.ruleGroups.splice(t,1)}catch(e){SMErrorHandler.log("In DashboardModel delete:: ",e)}}},{key:"accessPrivilegeSettings",value:function(e,t,r){try{window.smart_manager.sm_ajax_url||(window.smart_manager.sm_ajax_url=-1!==ajaxurl.indexOf("?")?ajaxurl+"&action=sm_beta_include_file":ajaxurl+"?action=sm_beta_include_file"),m.request({method:"POST",url:window.smart_manager.sm_ajax_url,body:e,responseType:"json"}).then((function(e){void 0!==r?t(r,e):t(e)}))}catch(e){SMErrorHandler.log("In DashboardModel generateKey:: ",e)}}}],(r=null)&&i(t.prototype,r),a&&i(t,a),Object.defineProperty(t,"prototype",{writable:!1}),t;var t,r,a}(),u={type:"",operator:"",value:""};function d(e){return(d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function p(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var a,n,o,s,i=[],l=!0,m=!1;try{if(o=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;l=!1}else for(;!(l=(a=o.call(r)).done)&&(i.push(a.value),i.length!==t);l=!0);}catch(e){m=!0,n=e}finally{try{if(!l&&null!=r.return&&(s=r.return(),Object(s)!==s))return}finally{if(m)throw n}}return i}}(e,t)||w(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function g(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function f(e){for(var t=1;te.length)&&(t=e.length);for(var r=0,a=Array(t);r0&&(Object.values(a).forEach((function(e){n.add(e.id)})),t.value=y(n).join(",")),t.refreshRule(),m.redraw())})),e.open()}catch(e){SMErrorHandler.log("In Rule showWPMediaLib:: ",e)}}},{key:"setCurrentRule",value:function(){try{this.ruleGroup=c.data.ruleGroups[this.ruleGroupId]||[],this.rules=this.ruleGroup.rules||[],this.rule=this.rules[this.ruleId]||{},this.field=this.rule.type||"",this.op=this.rule.operator||"",this.value=this.rule.value||"",this.meta=f({},this.rule.meta)||{},""==this.field&&(this.field=Object.keys(c.data.fields)[0]||[])}catch(e){SMErrorHandler.log("In Rule setCurrentRule:: ",e)}}},{key:"refreshRule",value:function(e){try{var t=e||this;this.rules[t.ruleId]={type:t.field,operator:t.op,value:t.value,key:t.key,meta:t.meta}}catch(e){SMErrorHandler.log("In Rule refreshRule:: ",e)}}},{key:"refreshValues",value:function(){try{this.fieldObj=c.data.fields[this.field]||{},this.meta.displayTitles=this.meta.displayTitles?this.meta.displayTitles:{},this.fieldType=this.fieldObj.type||"text",this.field_src=this.fieldObj.src,this.possibleValues=this.fieldObj.values||[];var e=this.fieldType.indexOf("sm.");if(e>=0&&(this.fieldType=this.fieldType.substr(e+3)),this.possibleOperators=f({},c.data.possibleOperators[this.fieldType])||{},this.fieldObj.custom_actions&&(this.possibleOperators=f(f({},this.fieldObj.custom_actions),this.possibleOperators)),this.possibleOperators=1===c.flags.isPrivilegeSettings?{has_access:"has access",no_access:"no access"}:this.possibleOperators,this.fieldObj.actions&&(this.possibleOperators=this.fieldObj.actions||{},this.possibleValues=[]),0===Object.keys(this.possibleOperators).length&&(this.fieldType=this.possibleValues.length>0?" ":"text",this.possibleOperators=c.data.possibleOperators[this.fieldType]||{}),""==this.op&&Object.keys(this.possibleOperators).length>0&&(this.op=Object.keys(this.possibleOperators)[0]||"",this.meta.displayTitles.operator||(this.meta.displayTitles.field=this.fieldObj.title||this.field),this.meta.displayTitles.operator=Object.values(this.possibleOperators)[0]||this.op,this.refreshRule()),this.fieldObj.actions&&""!=this.op&&(this.possibleValues=this.fieldObj.values[this.op]||[]),this.fieldObj.additionalValues&&(this.additionalValues=this.fieldObj.additionalValues,"remove_from"===this.op?delete this.additionalValues.custom:"add_to"!==this.op||this.additionalValues.hasOwnProperty("custom")||(this.additionalValues.custom="Custom"),this.currentOp=Object.keys(this.additionalValues)[0],this.possibleValues=this.fieldObj.values[this.currentOp]||[],this.meta.attributeName?this.meta.attributeName?this.possibleValues=this.fieldObj.values[this.meta.attributeName]||[]:"custom"===this.meta.attributeName&&(this.possibleValues=[]):this.meta.attributeName=this.currentOp),""==this.value&&this.possibleValues.length>0){var t=this.possibleValues[0]||{};this.value=t.key||"",this.refreshRule()}"datetime"!=this.fieldType&&"sm.datetime"!=this.fieldType||1!=this.extraDateOperators.includes(this.op)||(this.dateDurations=Object.assign(this.dateDurations,this.timeDurations)),"time"!=this.fieldType&&"sm.time"!=this.fieldType||1!=this.extraDateOperators.includes(this.op)||(this.dateDurations=this.timeDurations)}catch(e){SMErrorHandler.log("In Rule refreshValues:: ",e)}}},{key:"intializeSelectwoo",value:function(){try{var e=this;jQuery(".sm-advanced-search-select").each((function(t){try{var r={width:"15em",dropdownCssClass:"sm_advanced_search_select2_dropdown",dropdownParent:jQuery("#sa_smart_manager_main aside")};if(jQuery(this).hasClass("select-value")&&("copy_from"===e.op||"remove_from"===e.op&&["custom_note_for_customer"].includes(e.field_src))){var a="",n="";switch(e.op){case"copy_from":a=sprintf(_x("Select %s","placeholder","smart-manager-for-wp-e-commerce"),window.smart_manager.dashboardDisplayName),n="get_batch_update_copy_from_record_ids";break;case"remove_from":a=_x("Select Notes","placeholder","smart-manager-for-wp-e-commerce"),n="get_order_notes_for_customer"}r=Object.assign({placeholder:a,ajax:{url:window.smart_manager.sm_ajax_url,dataType:"json",delay:250,data:function(e){return{search_term:e.term,cmd:n,active_module:window.smart_manager.dashboard_key,security:window.smart_manager.sm_nonce,is_taxonomy:window.smart_manager.taxonomyDashboards[window.smart_manager.dashboard_key]?1:0}},processResults:function(e){var t=[];return e&&jQuery.each(e,(function(e,r){t.push({id:e,text:r})})),{results:t}},cache:!0}},r)}else if(jQuery(this).hasClass("restrict-by-roles")||jQuery(this).hasClass("restrict-by-users")){var o=jQuery(this).hasClass("restrict-by-roles")?"get_user_roles":"get_users";r=Object.assign({placeholder:jQuery(this).hasClass("restrict-by-roles")?_x("Search user roles","placeholder","smart-manager-for-wp-e-commerce"):_x("Search user","placeholder","smart-manager-for-wp-e-commerce"),ajax:{url:window.smart_manager.sm_ajax_url,dataType:"json",delay:250,data:function(e){return{term:e.term,cmd:o,active_module:"access-privilege",security:window.smart_manager.sm_nonce,page:e.page||1,offset:e.offset||0,previous_roles:e.previous_roles||[]}},processResults:function(e,t){return e.hasOwnProperty("additional_params")&&(t.offset=e.additional_params.offset||0,t.previous_roles=e.additional_params.previous_roles||[]),t.page=t.page||1,{results:e.data.results||[],pagination:e.data.pagination||[]}},cache:!0}},r)}else jQuery(this).hasClass("dashboard-names")&&(r=Object.assign({placeholder:_x("Select Dashboards","placeholder","smart-manager-for-wp-e-commerce"),multiple:!0,ajax:{url:window.smart_manager.sm_ajax_url,dataType:"json",delay:250,data:function(e){return{term:e.term,cmd:"get_dashboards",active_module:"access-privilege",security:window.smart_manager.sm_nonce,page:e.page||1}},processResults:function(e,t){return t.page=t.page||1,{results:e.data.results||[]}},cache:!0}},r));var s=jQuery(this).parent().find(".dashboard-names option");if(s&&s.length)for(var i=new Set,l=0;l0&&t.target.options.hasOwnProperty(t.target.selectedIndex)?t.target.options[t.target.selectedIndex].text:r;e.ruleGroupId=t.target.getAttribute("rule-group-id"),e.ruleId=t.target.getAttribute("rule-id"),jQuery(this).parent().find(".select-op, .select-value, .select-copy-from-field-value, .select-attrName").select2("destroy"),e.setCurrentRule(),jQuery(this).hasClass("select-field")||jQuery(this).hasClass("restrict-by-roles")||jQuery(this).hasClass("restrict-by-users")?(e.op="",e.value="",jQuery(this).hasClass("restrict-by-roles")?e.meta.hasOwnProperty("user_roles")||(e.meta.user_roles={}):jQuery(this).hasClass("restrict-by-users")&&(e.meta.hasOwnProperty("user_emails")||(e.meta.user_emails={})),e.meta.hasOwnProperty("displayTitles")||(e.meta.displayTitles={}),e.meta.displayTitles.field=a||"",e.field=r,e.fieldObj=c.data.fields[e.field]||{title:a,type:"text",values:{}},e.refreshRule(e),e.fieldObj.custom_actions&&Object.keys(e.fieldObj.custom_actions).length>0&&(e.meta.hideValue=!0)):jQuery(this).hasClass("select-op")?(0==window.smart_manager.sm_beta_pro&&window.smart_manager.proAdvancedSearchOperators&&window.smart_manager.proAdvancedSearchOperators.hasOwnProperty(r)&&void 0!==window.smart_manager.showNotification&&"function"==typeof window.smart_manager.showNotification?(e.value="",window.smart_manager.notification={message:sprintf(_x("This feature is available only in the %s version","modal content","smart-manager-for-wp-e-commerce"),''+_x("Pro","modal content","smart-manager-for-wp-e-commerce")+""),hideDelay:window.smart_manager.notificationHideDelayInMs},window.smart_manager.showNotification()):(e.op=r,e.value="",e.meta.hideValue=!1,e.meta.displayTitles&&(e.meta.displayTitles.operator=e.meta.displayTitles.operator?a:""),e.fieldObj=c.data.fields[e.field]||{},e.fieldObj.custom_actions&&e.fieldObj.custom_actions[r]&&(e.meta.hideValue=!0),e.meta.attributeName="",e.meta["attribute-values"]="",e.meta.replace_value=""),e.refreshRule()):jQuery(this).hasClass("select-value")||jQuery(this).hasClass("select-copy-from-field-value")?e.updateRuleValue(t):jQuery(this).hasClass("dashboard-names")?(jQuery(this).off("select2:select").on("select2:select",(function(t){var r=t.params.data.optgroup||"",a=t.params.data.id||"";"string"==typeof r&&r.trim().length>0&&"string"==typeof a&&a.trim().length>0&&(e.meta.hasOwnProperty("user_roles")&&!e.meta.user_roles[r]&&(e.meta.user_roles[r]={}),e.meta.hasOwnProperty("user_roles")&&!e.meta.user_roles[r].hasOwnProperty(t.params.data.id)&&(e.meta.user_roles[r]=Object.assign(h({},t.params.data.id,t.params.data.text),e.meta.user_roles[r]),e.value=e.meta.user_roles),e.meta.hasOwnProperty("user_emails")&&!e.meta.user_emails[r]&&(e.meta.user_emails[r]={}),e.meta.hasOwnProperty("user_emails")&&!e.meta.user_emails[r].hasOwnProperty(t.params.data.id)&&(e.meta.user_emails[r]=Object.assign(h({},t.params.data.id,t.params.data.text),e.meta.user_emails[r]),e.value=e.meta.user_emails),e.refreshRule())})),jQuery(this).off("select2:unselect").on("select2:unselect",(function(t){(e.meta.user_roles||e.meta.user_emails)&&(e.meta.user_roles&&Object.entries(e.meta.user_roles).forEach((function(e){var r=p(e,2),a=(r[0],r[1]);if("object"===d(a)&&null!==a)for(var n in a)a.hasOwnProperty(n)&&n===t.params.data.id&&delete a[n]})),e.meta.user_emails&&Object.entries(e.meta.user_emails).forEach((function(e){var r=p(e,2),a=(r[0],r[1]);if("object"===d(a)&&null!==a)for(var n in a)a.hasOwnProperty(n)&&n===t.params.data.id&&delete a[n]})))})),e.refreshRule()):jQuery(this).hasClass("select-attrName")&&(e.value="",e.updateRuleValue(t)),m.redraw()}catch(t){SMErrorHandler.log("In Rule on-change:: ",t)}}))}catch(t){SMErrorHandler.log("In Rule sm-advanced-search-select jquery:: ",t)}}))}catch(e){SMErrorHandler.log("In Rule intializeSelectwoo:: ",e)}}},{key:"renderFieldSelect",value:function(){var e=this;try{return m("[",null," ",1===c.flags.isPrivilegeSettings?m("[",null," ",m("select",{"rule-group-id":this.ruleGroupId,"rule-id":this.ruleId,class:(0===this.ruleGroupId?"restrict-by-users":"restrict-by-roles")+" py-1 pl-3 pr-8 text-sm font-medium leading-5 capitalize text-gray-700 bg-transparent form-select sm-advanced-search-select"},m("option",{value:this.field,selected:"selected"},this.meta.hasOwnProperty("displayTitles")&&this.meta.displayTitles.hasOwnProperty("field")?this.meta.displayTitles.field:this.field))," "):m("select",{"rule-group-id":this.ruleGroupId,"rule-id":this.ruleId,class:"select-field py-1 pl-3 pr-8 text-sm font-medium leading-5 capitalize text-gray-700 bg-transparent form-select sm-advanced-search-select","data-placeholder":"Select"},Object.keys(c.data.fields).length>0?Object.entries(c.data.fields).map((function(t){var r=p(t,2),a=r[0],n=r[1];return m("option",{value:a,selected:e.field===a?"selected":""}," ",n.title||a)})):"")," ")}catch(e){SMErrorHandler.log("In Rule renderFieldSelect:: ",e)}}},{key:"renderOperatorSelect",value:function(){var e=this;try{return m("select",{"rule-group-id":this.ruleGroupId,"rule-id":this.ruleId,class:"py-1 pl-3 pr-8 text-sm leading-5 text-gray-500 bg-transparent form-select sm-advanced-search-select select-op"},Object.entries(this.possibleOperators).map((function(t){var r=p(t,2),a=r[0],n=r[1];return m("option",{value:a,selected:e.op===a?"selected":""},n||a)})))}catch(e){SMErrorHandler.log("In Rule renderOperatorSelect:: ",e)}}},{key:"updateRuleValue",value:function(e){try{var t=e.target.getAttribute("meta-key")||"";""!=t?this.meta[t]=e.target.value||"":this.value=e.target.value||"","custom"===this.meta[t]&&(this.value=""),this.ruleGroupId=e.target.getAttribute("rule-group-id"),this.ruleId=e.target.getAttribute("rule-id"),this.refreshRule()}catch(e){SMErrorHandler.log("In Rule updateRuleValue:: ",e)}}},{key:"renderValues",value:function(){var e=this;try{var t=!0===this.multiValueOperators.includes(this.op)?_x('Enter "|" separated values',"placeholder","smart-manager-for-wp-e-commerce"):_x("Enter value","placeholder","smart-manager-for-wp-e-commerce");if(this.valuePlaceholder=t,0==this.extraDateOperators.includes(this.op))switch(this.fieldType){case"date":this.valuePlaceholder="yyyy-mm-dd";break;case"sm.datetime":this.valuePlaceholder="yyyy-mm-dd hh:mm:ss";break;case"sm.time":this.valuePlaceholder="hh:mm";break;default:this.valuePlaceholder=t}var r="",a="";switch(""!=this.op){case"search_and_replace"===this.op:r="replace_value";break;case 1==this.extraDateOperators.includes(this.op):r="dateDuration",a=" flex items-center gap-2";break;case 1==this.multiListOperators.includes(this.op)&&"custom_product_attributes"===this.field_src:r="attributeName",a=" flex items-center gap-2";break;case 1===c.flags.isPrivilegeSettings:a=" dashboard-names";default:r="attribute_values"}var n="copy_from_field"===this.op?"select-copy-from-field-value":"select-value",o=["copy_from","copy_from_field"],s=["image","multipleImage"];return 1===c.flags.isPrivilegeSettings&&(this.possibleValues=this.meta.hasOwnProperty("user_roles")?this.meta.user_roles:this.meta.hasOwnProperty("user_emails")?this.meta.user_emails:this.possibleValues),m("div",{class:"flex-1 relative"+a},1===c.flags.isPrivilegeSettings?m("select",{"rule-group-id":this.ruleGroupId,"rule-id":this.ruleId,class:"py-1 pl-3 pr-8 text-sm font-medium leading-5 capitalize text-gray-700 bg-transparent form-select sm-advanced-search-select dashboard-names",name:"dashboards[]",multiple:"multiple"},Object.keys(this.possibleValues).length>0?Object.entries(this.possibleValues).map((function(e){var t=p(e,2),r=t[0],a=t[1];return"displayTitles"!==r?Object.entries(a).map((function(e){var t=p(e,2),r=t[0],a=t[1];return m("option",{value:r,selected:"selected"},a)})):""})):""):!(this.possibleValues.length>0||!0===o.includes(this.op)||"remove_from"===this.op&&["custom_note_for_customer"].includes(this.field_src))||!0===this.multiListOperators.includes(this.op)&&"custom_product_attributes"===this.field_src?function(){switch(""!=e.fieldType&&""!=e.op){case!0===s.includes(e.fieldType):return m("button",{type:"button",onclick:function(){e.showWPMediaLib()},class:"flex items-center justify-center p-1 text-xs leading-5 text-indigo-500 transition duration-150 ease-in-out border border-transparent rounded-md focus:outline-none"},e.meta.attachmentURL&&"multipleImage"!==e.fieldType?m("img",{src:e.meta.attachmentURL,class:"w-9 h-9"}):m("svg",{fill:"none",stroke:"currentColor",class:"w-5 h-5"},m("svg",{fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg"},m("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z"}),m("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 13a3 3 0 11-6 0 3 3 0 016 0z"}))));case 1==e.extraDateOperators.includes(e.op):return m("[",null,m("input",{type:"number",onkeydown:function(e){return"."===e.key?e.preventDefault():""},"rule-group-id":e.ruleGroupId,"rule-id":e.ruleId,placeholder:e.valuePlaceholder,class:"w-full max-w-full text-sm leading-5 text-gray-700 form-input",value:e.value,oninput:function(t){return e.updateRuleValue(t)}}),m("select",{"rule-group-id":e.ruleGroupId,"rule-id":e.ruleId,"meta-key":r,class:"py-1 pl-3 pr-8 text-sm leading-5 text-gray-500 bg-transparent form-select sm-advanced-search-select select-value"},m("[",null," ",Object.entries(e.dateDurations).map((function(t){var a=p(t,2),n=a[0],o=a[1];return m("[",null,m("option",{value:n,selected:e.meta[r]===n?"selected":""},o||n))}))," ")));case"search_and_replace"===e.op||"custom"===e.meta[r]:return m("[",null,"custom"===e.meta[r]?m("select",{"rule-group-id":e.ruleGroupId,"rule-id":e.ruleId,class:"py-1 pl-3 pr-8 text-sm leading-5 text-gray-500 bg-transparent form-select sm-advanced-search-select select-attrName","meta-key":r},Object.entries(e.additionalValues).map((function(t){var a=p(t,2),n=a[0],o=a[1];return m("option",{value:n,selected:e.meta[r]===n?"selected":""},o||n)}))):"",m("input",{type:"text","rule-group-id":e.ruleGroupId,"rule-id":e.ruleId,class:"w-full max-w-full text-sm leading-5 text-gray-700 form-input",placeholder:"search_and_replace"===e.op?_x("Search for...","placeholder","smart-manager-for-wp-e-commerce"):_x("Enter attribute name...","placeholder","smart-manager-for-wp-e-commerce"),value:e.value,oninput:function(t){return e.updateRuleValue(t)}}),m("input",{type:"text","rule-group-id":e.ruleGroupId,"rule-id":e.ruleId,"meta-key":"search_and_replace"===e.op?r:"attribute_values",class:"w-full max-w-full text-sm leading-5 text-gray-700 form-input",placeholder:"search_and_replace"===e.op?_x("Replace with...","placeholder","smart-manager-for-wp-e-commerce"):_x("Enter values...","placeholder","smart-manager-for-wp-e-commerce"),value:"search_and_replace"===e.op?e.meta.replace_value:e.meta.attribute_values,oninput:function(t){return e.updateRuleValue(t)}}));case!0===e.multiListOperators.includes(e.op)&&"custom_product_attributes"===e.field_src:return m("[",null,m("select",{"rule-group-id":e.ruleGroupId,"rule-id":e.ruleId,class:"py-1 pl-3 pr-8 text-sm leading-5 text-gray-500 bg-transparent form-select sm-advanced-search-select select-attrName","meta-key":r},Object.entries(e.additionalValues).map((function(t){var a=p(t,2),n=a[0],o=a[1];return m("option",{value:n,selected:e.meta[r]===n?"selected":""},o||n)}))),m("select",{"rule-group-id":e.ruleGroupId,"rule-id":e.ruleId,class:"py-1 pl-3 pr-8 text-sm font-medium leading-5 capitalize text-gray-700 bg-transparent form-select sm-advanced-search-select "+n},e.possibleValues.map((function(t){return m("option",{value:t.key,selected:e.value===t.key?"selected":""},t.value||t.key)}))));default:return m("input",{type:"numeric"==e.fieldType?"number":"text","rule-group-id":e.ruleGroupId,"rule-id":e.ruleId,class:"w-full max-w-full text-sm leading-5 text-gray-700 form-input",placeholder:e.valuePlaceholder,value:e.value,oninput:function(t){return e.updateRuleValue(t)}})}}():m("select",{"rule-group-id":this.ruleGroupId,"rule-id":this.ruleId,class:"py-1 pl-3 pr-8 text-sm font-medium leading-5 capitalize text-gray-700 bg-transparent form-select sm-advanced-search-select "+n},!1===o.includes(this.op)?this.possibleValues.map((function(t){return m("option",{value:t.key,selected:e.value===t.key?"selected":""},t.value||t.key)})):"copy_from_field"===this.op?Object.entries(c.data.fields).map((function(t){var r=p(t,2),a=r[0],n=r[1];return m("option",{value:a,selected:e.field===a?"selected":""},n.title||a)})):""))}catch(e){SMErrorHandler.log("In Rule renderValues:: ",e)}}},{key:"addConditionRow",value:function(e){var t=this;try{var r=this.meta.hideValue||!1;return m("div",{class:"flex items-center gap-2 w-full mb-3"},this.renderFieldSelect(),this.renderOperatorSelect(),r?"":this.renderValues(),m("button",{type:"button",onclick:function(){return c.add(t.ruleGroupId)},class:(this.showAddRule?"":"invisible")+" flex items-center justify-center p-1 text-xs leading-5 text-gray-300 transition duration-150 ease-in-out border border-transparent rounded-md hover:text-green-600 hover:border-green-600 focus:outline-none focus:shadow-outline-red focus:border-green-600"},m("svg",{fill:"none",stroke:"currentColor",class:"w-5 h-5"},m("svg",{id:"icon-add-condition","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",viewBox:"0 0 24 24"},m("path",{d:"M12 9v3m0 0v3m0-3h3m-3 0H9m12 0a9 9 0 11-18 0 9 9 0 0118 0z"})))),m("button",{type:"button",onclick:function(){return c.delete(t.ruleGroupId,t.ruleId)},class:(this.isOnlyChild?"invisible":"")+" flex items-center justify-center p-1 text-xs leading-5 text-gray-300 transition duration-150 ease-in-out border border-transparent rounded-md hover:text-red-600 hover:border-red-600 focus:outline-none focus:shadow-outline-red focus:border-red-600"},m("svg",{fill:"none",stroke:"currentColor",class:"w-5 h-5"},m("svg",{id:"icon-remove-condition","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",viewBox:"0 0 24 24"},m("path",{d:"M15 12H9m12 0a9 9 0 11-18 0 9 9 0 0118 0z"})))))}catch(e){SMErrorHandler.log("In Rule addConditionRow:: ",e)}}},{key:"view",value:function(e){try{return this.initialize(e),m("[",null,this.addConditionRow(this.ruleRow))}catch(e){SMErrorHandler.log("In Rule view:: ",e)}}}])}();function k(e){return(k="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function S(e,t){for(var r=0;r'+_x("Pro","modal content","smart-manager-for-wp-e-commerce")+""),hideDelay:window.smart_manager.notificationHideDelayInMs},window.smart_manager.showNotification())}},m("svg",{fill:"none",stroke:"currentColor",class:"w-5 h-5"},m("svg",{id:"icon-add-group","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",viewBox:"0 0 24 24"},m("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 13h6m-3-3v6m-9 1V7a2 2 0 012-2h6l2 2h6a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2z"})))," ",_x("Add another group","button","smart-manager-for-wp-e-commerce")," "),this.isOnlyChild?"":m("button",{type:"button",class:"flex items-center gap-1 justify-center px-1 py-0.5 text-xs leading-5 text-gray-400 transition duration-150 ease-in-out border border-transparent rounded-md hover:text-red-600 hover:border-red-600 focus:outline-none focus:shadow-outline-red focus:border-red-600",onclick:function(){c.delete(t.ruleGroupId)}},m("svg",{fill:"none",stroke:"currentColor",class:"w-5 h-5"},m("svg",{id:"icon-remove-group","stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",viewBox:"0 0 24 24"},m("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M9 13h6M3 17V7a2 2 0 012-2h6l2 2h6a2 2 0 012 2v8a2 2 0 01-2 2H5a2 2 0 01-2-2z"})))," ",_x("Remove this group","button","smart-manager-for-wp-e-commerce")," ")))}catch(e){SMErrorHandler.log("In RuleGroup view:: ",e)}}}])&&S(e.prototype,t),r&&S(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,t,r}();function P(e){return(P="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function M(e,t){for(var r=0;r0&&""!==this.notification.message,this.icons={success:'',error:'',warning:''}}catch(e){SMErrorHandler.log("In Notifications initialize:: ",e)}}},{key:"render",value:function(e){return window.smart_manager.parseHTML(e)}},{key:"view",value:function(){var e=this;try{return this.initialize(),setTimeout((function(){try{if(e.showNotification&&e.notification.autoHide){var t=document.getElementsByClassName("sm-notification-close");t.length>0&&t[0].click()}}catch(e){SMErrorHandler.log("In Notifications auto close:: ",e)}}),this.notification.hideDelay),this.showNotification?m("div",{class:"fixed inset-0 flex items-end justify-center px-4 py-6 pointer-events-none sm:p-6 sm:items-start sm:justify-end",style:"z-index: 121000;"},m("div",{class:"w-full max-w-sm bg-white rounded-lg shadow-lg pointer-events-auto bottom-2 fixed"},m("div",{class:"overflow-hidden rounded-lg shadow-xs text-gray-700"},m("div",{class:("bg-"+this.notification.status||!1)+" p-3"},m("div",{class:"flex items-center"},m("div",{class:"flex-shrink-0"},m.trust(this.icons[this.notification.status||"warning"]||"")),m("div",{class:"ml-3 flex-1"},m("p",{class:"text-sm leading-5"},m.trust(this.notification.message))),m("div",{class:"flex flex-shrink-0 ml-2"},m("button",{type:"button",class:"sm-notification-close inline-flex p-1 rounded-md hover:text-gray-700 focus:outline-none transition duration-150 ease-in-out",onclick:function(){setTimeout((function(){try{window.smart_manager.notification={},m.route.get()!=="/"+window.smart_manager.advancedSearchRoute&&m.route.get()!=="/"+window.smart_manager.bulkEditRoute&&m.route.get()!=="/"+window.smart_manager.columnManagerRoute&&void 0!==window.smart_manager.showPannelDialog&&"function"==typeof window.smart_manager.showPannelDialog&&void 0!==window.smart_manager.getDefaultRoute&&"function"==typeof window.smart_manager.getDefaultRoute&&window.smart_manager.showPannelDialog("",window.smart_manager.getDefaultRoute(!0))}catch(e){SMErrorHandler.log("In Notifications close:: ",e)}}),200)}},m("svg",{class:"h-4 w-4",stroke:"currentColor",fill:"none",viewBox:"0 0 24 24"},m("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M6 18L18 6M6 6l12 12"}))))))))):""}catch(e){SMErrorHandler.log("In Notifications view:: ",e)}}}])&&M(e.prototype,t),r&&M(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,t,r}();function E(e){return(E="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function D(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function T(e){for(var t=1;t1?_x("s","advanced search conditions","smart-manager-for-wp-e-commerce"):""))}catch(e){SMErrorHandler.log("In AdvancedSearchDialog updateRuleCountView:: ",e)}}},{key:"view",value:function(){var e=this;try{return m("aside",{style:"z-index: 120000;",class:"fixed inset-x-0 bottom-0 lg:inset-0 lg:flex lg:items-center lg:justify-end"},m("div",{class:"fixed inset-0 transition-opacity"},m("div",{class:"absolute inset-0 bg-gray-500 opacity-75"})),m("section",{class:"w-full h-full max-w-4xl max-h-full mt-12 overflow-scroll transition-all transform bg-gray-50 lg:ml-1/6 lg:mt-0"},m("div",{class:"sticky top-0 z-10 w-full bg-gray-100"},m("nav",{class:"px-4 py-2 xl:px-4 lg:py-2"},m("div",{class:"flex items-center justify-between"},m("div",{class:"flex items-center flex-1 gap-2"},m("label",{for:"name",class:"text-xl font-medium text-indigo-600 cursor-default"},_x("Advanced Search","side pannel - modal title","smart-manager-for-wp-e-commerce")," ")),m("div",{class:"flex items-center mt-2 text-right lg:mt-0"},m("div",{class:"flex items-center gap-4 ml-4 lg:ml-2"},m("span",{class:"rounded-md"},m("button",{onclick:function(){try{if(window.smart_manager.isViewContainSearchParams&&void 0!==window.smart_manager.showNotification&&"function"==typeof window.smart_manager.showNotification)return window.smart_manager.notification={message:e.noticeMsgForCustomViews,hideDelay:window.smart_manager.notificationHideDelayInMs},void window.smart_manager.showNotification();if(c.data.ruleGroups.length>0){var t=[];e.ruleCount=0,c.data.ruleGroups.map((function(r){var a=[];r.rules.map((function(t){var r=T({},t);delete r.key,r.meta&&delete r.meta,a.push(r),e.ruleCount++})),t.push({condition:r.condition,rules:a})})),window.smart_manager.advancedSearchQuery=[{condition:"OR",rules:t}],e.updateRuleCountView(),void 0!==window.smart_manager.load_dashboard&&"function"==typeof window.smart_manager.load_dashboard&&window.smart_manager.load_dashboard()}e.closeDialog()}catch(e){SMErrorHandler.log("In AdvancedSearchDialog search:: ",e)}},type:"button",class:"sm-button-primary inline-flex justify-center w-full px-4 py-1 text-sm font-medium leading-5 text-white transition duration-150 ease-in-out bg-indigo-600 border border-transparent rounded-md hover:bg-indigo-500 focus:outline-none focus:shadow-outline-indigo",title:_x("Search [ENTER]","advanced search button title","smart-manager-for-wp-e-commerce")},_x("Search","advanced search button","smart-manager-for-wp-e-commerce"))),m("button",{onclick:function(){try{if(window.smart_manager.isViewContainSearchParams&&void 0!==window.smart_manager.showNotification&&"function"==typeof window.smart_manager.showNotification)return window.smart_manager.notification={message:e.noticeMsgForCustomViews,hideDelay:window.smart_manager.notificationHideDelayInMs},void window.smart_manager.showNotification();window.smart_manager.advancedSearchQuery=[],e.ruleCount=0,e.initialize(),e.updateRuleCountView(),void 0!==window.smart_manager.load_dashboard&&"function"==typeof window.smart_manager.load_dashboard&&window.smart_manager.load_dashboard()}catch(e){SMErrorHandler.log("In AdvancedSearchDialog clear:: ",e)}},type:"button",class:"inline-flex justify-center w-full px-4 py-1 text-sm font-medium leading-5 text-gray-500 transition duration-150 ease-in-out bg-gray-200 border border-transparent rounded-md hover:bg-gray-300 focus:outline-none"},_x("Clear","advanced search button","smart-manager-for-wp-e-commerce")),m("button",{onclick:function(){try{e.closeDialog(),0==window.smart_manager.advancedSearchRuleCount&&jQuery("#search_switch").prop("checked",!1).trigger("change")}catch(e){SMErrorHandler.log("In AdvancedSearchDialog close:: ",e)}},class:"sm-button-close p-1 text-gray-400 transition duration-150 ease-in-out border-transparent rounded-full hover:text-gray-500 focus:outline-none focus:text-gray-500 focus:bg-gray-100",title:_x("Close [ESC]","advanced search close button title","smart-manager-for-wp-e-commerce")},m("svg",{class:"w-6 h-6",stroke:"currentColor","stroke-width":"2",fill:"none",viewBox:"0 0 24 24"},m("path",{d:"M6 18L18 6M6 6l12 12"})))))))),m("div",{class:"grid w-full gap-8 p-8 text-gray-600"},window.smart_manager.isViewContainSearchParams?m("div",{class:"w-full text-sm leading-5 text-gray-500 bg-warning p-2"},this.noticeMsgForCustomViews):"",m("div",{class:"w-full text-sm leading-5 text-gray-500"},m("div",{class:"flex items-baseline gap-1 mb-3 font-medium text-gray-500 -mt-1"},m("span",{class:"uppercase"},_x("When","advanced search content","smart-manager-for-wp-e-commerce")),m("span",{class:"text-gray-700"},_x("at least one","advanced search option","smart-manager-for-wp-e-commerce")," "),m("span",null,_x("condition groups pass","advanced search content","smart-manager-for-wp-e-commerce"))),c.data.ruleGroups.map((function(e,t){return m(j,{id:t,key:e.key,isOnlyChild:1==c.data.ruleGroups.length?1:0})}))))),Object.keys(window.smart_manager.notification||{}).length>0?m(I,null):null)}catch(e){SMErrorHandler.log("In AdvancedSearchDialog view:: ",e)}}}])&&H(e.prototype,t),r&&H(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,t,r}();function V(e){return(V="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function B(e){return function(e){if(Array.isArray(e))return U(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||z(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function N(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var a,n,o,s,i=[],l=!0,m=!1;try{if(o=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;l=!1}else for(;!(l=(a=o.call(r)).done)&&(i.push(a.value),i.length!==t);l=!0);}catch(e){m=!0,n=e}finally{try{if(!l&&null!=r.return&&(s=r.return(),Object(s)!==s))return}finally{if(m)throw n}}return i}}(e,t)||z(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function z(e,t){if(e){if("string"==typeof e)return U(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?U(e,t):void 0}}function U(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,a=Array(t);r0&&window.smart_manager.savedBulkEditConditions[0]&&(this.ruleGroups=window.smart_manager.savedBulkEditConditions[0].rules||this.ruleGroups,window.smart_manager.savedBulkEditConditions[0].meta,this.updateAll=window.smart_manager.savedBulkEditConditions[0].meta.updateAll||this.updateAll),new c({ruleGroups:this.ruleGroups,fields:window.smart_manager.column_names_batch_update||{},possibleOperators:window.smart_manager.batch_update_actions||{}})}catch(e){SMErrorHandler.log("In BulkEditDialog initialize:: ",e)}}},{key:"closeDialog",value:function(){try{void 0!==window.smart_manager.showPannelDialog&&"function"==typeof window.smart_manager.showPannelDialog&&window.smart_manager.showPannelDialog("",m.route.get())}catch(e){SMErrorHandler.log("In BulkEditDialog closeDialog:: ",e)}}},{key:"view",value:function(){var e=this;try{var t=""!=window.smart_manager.simpleSearchText&&"simple"==window.smart_manager.searchType||window.smart_manager.advancedSearchQuery.length>0&&"simple"!=window.smart_manager.searchType?_x("All Items In Search Results","bulk edit option","smart-manager-for-wp-e-commerce"):_x("All Items In Store","bulk edit option","smart-manager-for-wp-e-commerce");return this.ruleGroup=c.data.ruleGroups[0]||[],this.ruleGroupCondition=this.ruleGroup.condition||"AND",this.rules=this.ruleGroup.rules||[],m("aside",{style:"z-index: 120000;",class:"fixed inset-x-0 bottom-0 lg:inset-0 lg:flex lg:items-center lg:justify-end"},m("div",{class:"fixed inset-0 transition-opacity"},m("div",{class:"absolute inset-0 bg-gray-500 opacity-75"})),m("section",{class:"w-full h-full max-w-4xl max-h-full mt-12 overflow-scroll transition-all transform bg-gray-50 lg:ml-1/6 lg:mt-0"},m("div",{class:"sticky top-0 z-10 w-full bg-gray-100"},m("nav",{class:"px-4 py-2 xl:px-4 lg:py-2"},m("div",{class:"flex items-center justify-between"},m("div",{class:"flex items-center flex-1 gap-2"},m("label",{for:"name",class:"text-xl font-medium text-indigo-600 cursor-default"},_x("Bulk Edit","side pannel - modal title","smart-manager-for-wp-e-commerce"))),m("div",{class:"flex items-center mt-2 text-right lg:mt-0"},m("div",{class:"flex items-center gap-4 ml-4 lg:ml-2"},m("span",{class:"rounded-md"},m("div",{id:"update_sm_editor_grid",class:"sm_beta_dropdown"},m("button",{type:"button",class:"sm-button-primary inline-flex justify-center w-full px-4 py-1 text-sm font-medium leading-5 text-white transition duration-150 ease-in-out bg-indigo-600 border border-transparent rounded-md hover:bg-indigo-500 focus:outline-none focus:shadow-outline-indigo",title:_x("Update","bulk edit button title","smart-manager-for-wp-e-commerce")},_x("Update","bulk edit button","smart-manager-for-wp-e-commerce")),m("div",{class:"sm_beta_dropdown_content sm_bulk_edit_dropdown_content",style:"display: none;"},m("a",{id:"sm_update_now",href:"#",onclick:function(){try{window.smart_manager.scheduledActionContent="",window.smart_manager.isScheduled=!1,void 0!==e.processBulkUpdate&&"function"==typeof e.processBulkUpdate&&e.processBulkUpdate(),void 0!==window.smart_manager.showTitleModal&&"function"==typeof window.smart_manager.showTitleModal&&window.smart_manager.showTitleModal({btnParams:{hideOnYes:!1}}),e.closeDialog()}catch(e){SMErrorHandler.log("In BulkEditDialog Update click:: ",e)}}},"Now"),m("a",{id:"sm_schedule_update_for_later",href:"#",onclick:function(){try{void 0!==e.processBulkUpdate&&"function"==typeof e.processBulkUpdate&&e.processBulkUpdate(),window.smart_manager.isScheduled=!0,void 0!==window.smart_manager.showScheduleModal&&"function"==typeof window.smart_manager.showScheduleModal&&window.smart_manager.showScheduleModal({btnParams:{hideOnYes:!1}}),e.closeDialog()}catch(e){SMErrorHandler.log("In BulkEditDialog Update click:: ",e)}}},_x("Schedule for later","bulk edit button","smart-manager-for-wp-e-commerce"))))),m("button",{onclick:function(){try{window.smart_manager.savedBulkEditConditions=[],e.initialize()}catch(e){SMErrorHandler.log("In BulkEditDialog clear click:: ",e)}},type:"button",class:"inline-flex justify-center w-full px-4 py-1 text-sm font-medium leading-5 text-gray-500 transition duration-150 ease-in-out bg-gray-200 border border-transparent rounded-md hover:bg-gray-300 focus:outline-none"},_x("Clear","bulk edit button","smart-manager-for-wp-e-commerce")),m("button",{onclick:function(){try{e.closeDialog()}catch(e){SMErrorHandler.log("In BulkEditDialog close click:: ",e)}},class:"sm-button-close p-1 text-gray-400 transition duration-150 ease-in-out border-transparent rounded-full hover:text-gray-500 focus:outline-none focus:text-gray-500 focus:bg-gray-100",title:_x("Close [ESC]","bulk edit close button title","smart-manager-for-wp-e-commerce")},m("svg",{class:"w-6 h-6",stroke:"currentColor","stroke-width":"2",fill:"none",viewBox:"0 0 24 24"},m("path",{d:"M6 18L18 6M6 6l12 12"})))))))),m("div",{class:"grid w-full gap-8 p-8 text-gray-600"},m("div",{class:"w-full text-sm leading-5 text-gray-500"},m("div",{class:"flex items-baseline"},m("div",{class:"flex items-center gap-2 mb-6 mt-1"},m("label",null,m("input",{type:"radio",class:(this.updateAll?"bg-transparent":"bg-indigo-600")+" form-radio mr-2 -mt-1",name:"batch_update_storewide",value:"selected_ids",checked:this.updateAll?"":"checked",onchange:function(t){e.updateAll=!t.target.checked}}),m("span",{class:"mt-1"},_x("Selected Items","bulk edit option","smart-manager-for-wp-e-commerce"))),m("label",null,m("input",{type:"radio",class:(this.updateAll?"bg-indigo-600":"bg-transparent")+" form-radio mr-2 -mt-1",name:"batch_update_storewide",value:"entire_store",checked:this.updateAll?"checked":"",onchange:function(t){e.updateAll=!!t.target.checked}}),m("span",{class:"mt-1"},t)))),this.rules.map((function(t,r){return m(_,{key:t.key,id:r,ruleGroupId:"0",showAddRule:e.rules.length-1==r?1:0,isOnlyChild:1==e.rules.length?1:0})}))))),Object.keys(window.smart_manager.notification||{}).length>0?m(I,null):null)}catch(e){SMErrorHandler.log("In BulkEditDialog view:: ",e)}}},{key:"processBulkUpdate",value:function(){var e=this,t=[];if(this.ruleCount=0,c.data.ruleGroups.map((function(r){var a=[];r.rules.map((function(t){var r=Q({},t);delete r.key,a.push(r),e.ruleCount++})),t.push({condition:r.condition,rules:a})})),window.smart_manager.savedBulkEditConditions=[{condition:"AND",rules:t,meta:{updateAll:this.updateAll}}],!(t.length<=0)){var r=t[0].rules||[],a=new Set;Object.values(r).length>0&&c.data.fields&&Object.values(r).forEach((function(e){Object.entries(c.data.fields).map((function(t){var r=N(t,2),n=r[0],o=r[1];e.type===n&&o.title&&a.add(o.title)}))})),window.smart_manager.processName=_x("Bulk Edit","process name","smart-manager-for-wp-e-commerce"),window.smart_manager.processContent=B(a).join(", "),void 0!==window.smart_manager.processBatchUpdate&&"function"==typeof window.smart_manager.processBatchUpdate&&(window.smart_manager.processCallback=window.smart_manager.processBatchUpdate)}}}])&&W(e.prototype,t),r&&W(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,t,r}();function Y(e){return(Y="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function J(e,t){for(var r=0;r0?m(I,null):null)}catch(e){SMErrorHandler.log("In ColumnManagerDialog view:: ",e)}}}])&&J(e.prototype,t),r&&J(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,t,r}();function X(e){return(X="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function ee(e){return function(e){if(Array.isArray(e))return oe(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||ne(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function te(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function re(e,t,r){return(t=ie(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function ae(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var a,n,o,s,i=[],l=!0,m=!1;try{if(o=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;l=!1}else for(;!(l=(a=o.call(r)).done)&&(i.push(a.value),i.length!==t);l=!0);}catch(e){m=!0,n=e}finally{try{if(!l&&null!=r.return&&(s=r.return(),Object(s)!==s))return}finally{if(m)throw n}}return i}}(e,t)||ne(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ne(e,t){if(e){if("string"==typeof e)return oe(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?oe(e,t):void 0}}function oe(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,a=Array(t);r0&&void 0!==arguments[0]?arguments[0]:"";try{return(e=e.toLowerCase().replace(/(_)|(wp)/gi," ").replace(/( or )/gi,"/").trim()).charAt(0).toUpperCase()+e.slice(1)}catch(e){SMErrorHandler.log("In SettingsDialog format:: ",e)}}},{key:"sanitize",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";try{return"number"===t?parseInt(e):e}catch(e){SMErrorHandler.log("In SettingsDialog sanitize:: ",e)}}},{key:"showWPMediaLib",value:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"image",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";try{var r,a=this,n="multipleImage"===e;if(r)return void r.open();(r=wp.media.frames.file_frame=wp.media({multiple:n})).on("select",(function(){var o=!0===n?r.state().get("selection").toJSON():r.state().get("selection").first().toJSON(),s=new Set;o&&a.generalSettings[e].hasOwnProperty(t)&&(a.generalSettings[e][t]={id:o.id||"",url:o.url||""},!0===n&&o.length>0&&(Object.values(o).forEach((function(e){s.add(e.id)})),a.generalSettings[e][t]={id:ee(s).join(",")}),m.redraw())})),r.open()}catch(e){SMErrorHandler.log("In SettingsDialog showWPMediaLib:: ",e)}}},{key:"getSettingValueHTML",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"text",r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"";try{switch(this.settingsInputType[t]||"text"){case"checkbox":return m("input",{type:"checkbox",class:"w-5 h-5 text-left border border-gray-400",checked:"yes"===a,onchange:function(a){e.generalSettings[t][r]=a.target.checked?"yes":"no"}});case"image":return m("div",{class:" flex items-center gap-2"},m("button",{type:"button",onclick:function(){e.showWPMediaLib("image",r)},class:"flex items-center justify-center p-1 text-xs leading-5 text-indigo-500 transition duration-150 ease-in-out border border-transparent rounded-md focus:outline-none"},"object"===X(a)&&a.hasOwnProperty("url")&&"multipleImage"!==t?m("img",{src:a.url,class:"w-24 h-24"}):m("svg",{fill:"none",stroke:"currentColor",class:"w-5 h-5"},m("svg",{fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg"},m("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M3 9a2 2 0 012-2h.93a2 2 0 001.664-.89l.812-1.22A2 2 0 0110.07 4h3.86a2 2 0 011.664.89l.812 1.22A2 2 0 0018.07 7H19a2 2 0 012 2v9a2 2 0 01-2 2H5a2 2 0 01-2-2V9z"}),m("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M15 13a3 3 0 11-6 0 3 3 0 016 0z"})))),"object"===X(a)&&a.hasOwnProperty("url")&&"multipleImage"!==t?m("button",{type:"button",onclick:function(){e.generalSettings[t][r]=""},class:"flex items-center justify-center p-1 text-xs leading-5 text-gray-300 transition duration-150 ease-in-out hover:text-red-600 border border-transparent rounded-md focus:outline-none",title:_x("Remove image","delete button for image type settings","smart-manager-for-wp-e-commerce")},m("svg",{class:"w-5 h-5",fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",xmlns:"http://www.w3.org/2000/svg"},m("path",{"stroke-linecap":"round","stroke-linejoin":"round","stroke-width":"2",d:"M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"}))):"");default:return m("input",{type:this.settingsInputType[t]||"text",class:"p-1 w-20 sm:text-sm sm:leading-5 border border-gray-400",value:this.sanitize(a),onfocusout:function(n){e.generalSettings[t][r]="checkbox"!==e.settingsInputType[t]?e.sanitize(n.target.value,t):a}})}}catch(e){SMErrorHandler.log("In SettingsDialog getSettingValueHTML:: ",e)}}},{key:"view",value:function(){var e=this;try{return m("aside",{style:"z-index: 120000;",class:"fixed inset-x-0 bottom-0 lg:inset-0 lg:flex lg:items-center lg:justify-end"},m("div",{class:"fixed inset-0 transition-opacity"},m("div",{class:"absolute inset-0 bg-gray-500 opacity-75"})),m("section",{class:"w-full h-full max-w-lg max-h-full mt-12 overflow-scroll transition-all transform bg-gray-50 lg:ml-1/6 lg:mt-0"},m("div",{class:"sticky top-0 z-10 w-full bg-gray-100"},m("nav",{class:"px-4 py-2 xl:px-4 lg:py-2"},m("div",{class:"flex items-center justify-between"},m("div",{class:"flex items-center flex-1 gap-2"},m("label",{for:"name",class:"text-xl font-medium text-indigo-600 cursor-default"},_x("Settings","side pannel - modal title","smart-manager-for-wp-e-commerce"))),m("div",{class:"flex items-center mt-2 text-right lg:mt-0"},m("div",{class:"flex items-center gap-4 ml-4 lg:ml-2"},m("span",{class:"rounded-md"},m("button",{onclick:function(){try{void 0!==window.smart_manager.saveSettings&&"function"==typeof window.smart_manager.saveSettings&&window.smart_manager.saveSettings({general:e.generalSettings}),e.closeDialog()}catch(e){SMErrorHandler.log("In SettingsDialog Update click:: ",e)}},type:"button",class:"sm-button-primary inline-flex justify-center w-full px-4 py-1 text-sm font-medium leading-5 text-white transition duration-150 ease-in-out bg-indigo-600 border border-transparent rounded-md hover:bg-indigo-500 focus:outline-none focus:shadow-outline-indigo",title:_x("Save [ENTER]","settings button title","smart-manager-for-wp-e-commerce")},_x("Save","settings button","smart-manager-for-wp-e-commerce"))),m("button",{onclick:function(){try{e.closeDialog()}catch(e){SMErrorHandler.log("In SettingsDialog close click:: ",e)}},class:"sm-button-close p-1 text-gray-400 transition duration-150 ease-in-out border-transparent rounded-full hover:text-gray-500 focus:outline-none focus:text-gray-500 focus:bg-gray-100",title:_x("Close [ESC]","settings close button title","smart-manager-for-wp-e-commerce")},m("svg",{class:"w-6 h-6",stroke:"currentColor","stroke-width":"2",fill:"none",viewBox:"0 0 24 24"},m("path",{d:"M6 18L18 6M6 6l12 12"})))))))),m("div",{class:"grid w-full gap-8 p-8 text-gray-600"},m("div",{class:"w-full text-sm leading-5 text-gray-500"},m("div",{class:"flex items-baseline"},m("table",{class:"sm-settings-table table-auto text-left"},m("tbody",null,Object.entries(this.generalSettings).map((function(t){var r=ae(t,2),a=r[0],n=r[1];return Object.entries(n).map((function(t){var r=ae(t,2),n=r[0],o=r[1];return m("tr",{class:"bg-transparent"},m("th",{scope:"row",class:"bg-transparent p-4 pl-0"},m("label",null,_x(e.format(n),"setting label","smart-manager-for-wp-e-commerce"))),m("td",{class:"p-4"},e.getSettingValueHTML(a,n,o)))}))})))))))),Object.keys(window.smart_manager.notification||{}).length>0?m(I,null):null)}catch(e){SMErrorHandler.log("In SettingsDialog view:: ",e)}}}])&&se(e.prototype,t),r&&se(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,t,r}();function me(e){return(me="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function ce(e,t){for(var r=0;r0&&""!==this.modal.title&&""!==this.modal.content,this.showCloseCTA=Object.keys(window.smart_manager.modal||{}).length>0&&Object.keys(window.smart_manager.modal.closeCTA||{}).length>0,this.showCloseIcon=!(Object.keys(window.smart_manager.modal||{}).length>0&&window.smart_manager.modal.hasOwnProperty("showCloseIcon"))||window.smart_manager.modal.showCloseIcon}catch(e){SMErrorHandler.log("In Modal initialize:: ",e)}}},{key:"close",value:function(){try{setTimeout((function(){try{window.smart_manager.modal={},void 0!==window.smart_manager.showPannelDialog&&"function"==typeof window.smart_manager.showPannelDialog&&void 0!==window.smart_manager.getDefaultRoute&&"function"==typeof window.smart_manager.getDefaultRoute&&window.smart_manager.showPannelDialog("",window.smart_manager.getDefaultRoute(!0))}catch(e){SMErrorHandler.log("In Modal close:: ",e)}}),200)}catch(e){SMErrorHandler.log("In Modal close:: ",e)}}},{key:"oncreate",value:function(){try{this.modal.hasOwnProperty("onCreate")&&"function"==typeof this.modal.onCreate&&this.modal.onCreate()}catch(e){SMErrorHandler.log("In Modal oncreate:: ",e)}}},{key:"onupdate",value:function(){try{this.modal.hasOwnProperty("onUpdate")&&"function"==typeof this.modal.onUpdate&&this.modal.onUpdate()}catch(e){SMErrorHandler.log("In Modal onUpdate:: ",e)}}},{key:"view",value:function(){var e=this;try{return this.initialize(),this.modal.hideDelay>0&&setTimeout((function(){try{if(e.showModal&&e.modal.autoHide){var t=document.getElementsByClassName("sm-modal-close");t.length>0&&t[0].click()}}catch(e){SMErrorHandler.log("In Modal auto close:: ",e)}}),this.modal.hideDelay),this.showModal?m("div",{class:"modal fade fixed top-0 left-0 w-full h-full outline-none overflow-x-hidden overflow-y-auto bg-gray-300 bg-opacity-75",id:"staticBackdrop","data-bs-backdrop":"static","data-bs-keyboard":"false",tabindex:"-1","aria-labelledby":"staticBackdropLabel","aria-modal":"true",role:"dialog"},m("div",{class:"modal-dialog modal-dialog-centered relative pointer-events-none mx-auto ".concat(this.modal.width||"")},m("div",{class:"modal-content border-none shadow-lg relative flex flex-col w-full pointer-events-auto bg-white bg-clip-padding rounded-md outline-none text-current"},m("div",{class:"modal-header flex flex-shrink-0 items-center justify-between p-4 border-b border-gray-200 rounded-t-md"},m("h5",{class:"text-xl font-medium leading-normal text-gray-800",id:"exampleModalLabel"},m.trust(this.modal.title||"")),this.showCloseIcon?m("button",{type:"button",class:"sm-button-close sm-modal-close btn-close box-content w-4 h-4 p-1 text-black border-none rounded-none opacity-50 focus:shadow-none focus:outline-none focus:opacity-100 hover:text-black hover:opacity-75 hover:no-underline","data-bs-dismiss":"modal","aria-label":"Close",onclick:this.close,title:_x("Close [ESC]","modal close button title","smart-manager-for-wp-e-commerce")},m("svg",{xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24",stroke:"currentColor","stroke-width":"2"},m("path",{"stroke-linecap":"round","stroke-linejoin":"round",d:"M6 18L18 6M6 6l12 12"}))):""),m("div",{class:"modal-body relative p-4 max-h-96 overflow-y-auto"},m.trust(this.modal.content||"")),!this.modal.hideFooter&&m("div",{class:"modal-footer flex flex-shrink-0 flex-wrap items-center p-4 border-t border-gray-200 rounded-b-md ".concat(this.modal.isFooterItemsCenterAligned?"justify-center":"justify-end")},this.modal.cta.title?m("button",{type:"button",class:"inline-block px-6 py-2.5 bg-indigo-600 text-white font-medium text-sm leading-5 rounded shadow-md hover:bg-indigo-500 hover:shadow-lg focus:shadow-lg focus:outline-none focus:shadow-outline-indigo focus:ring-0 transition duration-150 ease-in-out ml-1",onclick:function(){e.modal.cta.callback&&"function"==typeof e.modal.cta.callback&&e.modal.cta.callback(),(!e.modal.cta.hasOwnProperty("closeModalOnClick")||e.modal.cta.closeModalOnClick)&&e.close()}},this.modal.cta.title):"",this.showCloseCTA&&this.modal.closeCTA.title?m("button",{type:"button",class:"inline-block px-6 py-2.5 text-sm font-medium leading-5 text-gray-500 transition duration-150 ease-in-out bg-gray-200 border border-transparent rounded-md hover:bg-gray-300 focus:outline-none ml-1","data-bs-dismiss":"modal",onclick:function(){e.modal.closeCTA.callback&&"function"==typeof e.modal.closeCTA.callback&&e.modal.closeCTA.callback(),(!e.modal.closeCTA.hasOwnProperty("closeModalOnClick")||e.modal.closeCTA.closeModalOnClick)&&e.close()}},this.modal.closeCTA.title):"")))):""}catch(e){SMErrorHandler.log("In Modal view:: ",e)}}}])&&ge(e.prototype,t),r&&ge(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,t,r}();function ye(e){return(ye="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function we(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,a)}return r}function be(e){for(var t=1;t0){var t=[];e.ruleCount=0,c.data.ruleGroups.map((function(r){var a=[];r.rules.map((function(t){var r=be({},t);delete r.key,a.push(r),e.ruleCount++})),t.push({condition:r.condition,rules:a})})),window.smart_manager.privilegeSettingsRules=t,window.smart_manager.privilegeSettingsUpdate()}e.closeDialog()}catch(e){SMErrorHandler.log("In PrivilegeSettingsDialog Update click:: ",e)}},type:"button",class:"inline-flex justify-center w-full px-4 py-1 text-sm font-medium leading-5 text-white transition duration-150 ease-in-out bg-indigo-600 border border-transparent rounded-md hover:bg-indigo-500 focus:outline-none focus:shadow-outline-indigo"},"Save")),m("button",{onclick:function(){try{e.closeDialog()}catch(e){SMErrorHandler.log("In PrivilegeSettingsDialog close click:: ",e)}},class:"p-1 text-gray-400 transition duration-150 ease-in-out border-transparent rounded-full hover:text-gray-500 focus:outline-none focus:text-gray-500 focus:bg-gray-100"},m("svg",{class:"w-6 h-6",stroke:"currentColor","stroke-width":"2",fill:"none",viewBox:"0 0 24 24"},m("path",{d:"M6 18L18 6M6 6l12 12"})))))))),m("div",{class:"grid w-full gap-8 p-8 text-gray-600"},m("div",{class:"w-full text-sm leading-5 text-gray-500"},m("div",{class:"flex items-baseline gap-2 mb-3 -mt-1"},m("span",{class:"mb-3 font-medium text-gray-700"},_x("Manage dashboards access for user roles and users","access privilege settings description","smart-manager-for-wp-e-commerce"))),m("div",{class:"flex items-baseline gap-2 mb-3 -mt-1"},m("span",{class:"text-gray-700"},m("i",null,_x("Note: The privilege setting for a user email will always take precedence over a user role","access privilege settings description","smart-manager-for-wp-e-commerce")))),c.data.ruleGroups?c.data.ruleGroups.map((function(e,t){return m(j,{id:t,key:e.key,isOnlyChild:1==c.data.ruleGroups.length?1:0})})):""))))}catch(e){SMErrorHandler.log("In PrivilegeSettingsDialog view:: ",e)}}}])&&ve(e.prototype,t),r&&ve(e,r),Object.defineProperty(e,"prototype",{writable:!1}),e;var e,t,r}(),Se=document.getElementById("sa_smart_manager_main"),Oe=function(e){try{return[m(I,e.attrs),m(he,e.attrs)]}catch(e){SMErrorHandler.log('In dashboard route "/":: ',e)}},je={"/advancedSearch":{view:function(e){try{if(Object.keys(window.smart_manager.colModelSearch).length>0)return[m(I,e.attrs),m(G,e.attrs)]}catch(e){SMErrorHandler.log('In dashboard route "/advancedSearch":: ',e)}}},"/bulkEdit":{view:function(e){try{if(window.smart_manager.column_names_batch_update&&Object.keys(window.smart_manager.column_names_batch_update).length>0&&1==window.smart_manager.sm_beta_pro)return[m(I,e.attrs),m(q,e.attrs)]}catch(e){SMErrorHandler.log('In dashboard route "/bulkEdit":: ',e)}}},"/columnManager":{view:function(e){try{if(window.smart_manager.currentColModel&&Object.keys(window.smart_manager.currentColModel).length>0)return[m(I,e.attrs),m(Z,e.attrs)]}catch(e){SMErrorHandler.log('In dashboard route "/columnManager":: ',e)}}},"/settings":{view:function(e){try{if(window.smart_manager.allSettings&&Object.keys(window.smart_manager.allSettings).length>0)return[m(I,e.attrs),m(le,e.attrs)]}catch(e){SMErrorHandler.log('In dashboard route "/settings":: ',e)}}},"/pricing":{view:function(e){try{return[m(I,e.attrs),m(de,e.attrs)]}catch(e){SMErrorHandler.log('In dashboard route "/pricing":: ',e)}}},"/privilegeSettings":{view:function(e){try{if(0==window.smart_manager.gettingData)return[m(I,e.attrs),m(ke,e.attrs)]}catch(e){SMErrorHandler.log('In dashboard route "/privilegeSettings":: ',e)}}},"/dashboard":{view:function(e){return Oe(e)}},"/":{view:function(e){return Oe(e)}}};m.route(Se,"/",je),jQuery(document).on("smart_manager_post_load_grid","#sm_editor_grid",(function(){m.route(Se,"/",je)})),document.addEventListener("keyup",(function(e){if(0!=window.smart_manager.sm_beta_pro&&("Enter"===e.key||"Escape"===e.key)){var t=document.getElementsByClassName("Enter"===e.key?"sm-button-primary":"sm-button-close")[0]||"";t&&t.click()}}))}]);assets/js/smart-manager-product.js000064400000077163147600337620013262 0ustar00function Smart_Manager_Product() { if(typeof Smart_Manager_Pro != 'undefined') { Smart_Manager_Pro.apply(); } else { Smart_Manager.apply(); } } Smart_Manager_Product.prototype = (typeof Smart_Manager_Pro != 'undefined') ? Object.create(Smart_Manager_Pro.prototype) : Object.create(Smart_Manager.prototype); Smart_Manager_Product.prototype.constructor = Smart_Manager_Product; Smart_Manager_Product.prototype.refreshDashboardStates = function() { Smart_Manager.prototype.refreshDashboardStates.apply(this); if( window.smart_manager.dashboard_key == 'product' ) { let tempDashModel = JSON.parse(JSON.stringify(window.smart_manager.currentDashboardModel)); window.smart_manager.dashboardStates[window.smart_manager.dashboard_key] = JSON.parse( window.smart_manager.dashboardStates[window.smart_manager.dashboard_key] ); window.smart_manager.dashboardStates[window.smart_manager.dashboard_key]['treegrid'] = ( tempDashModel.hasOwnProperty('treegrid') ) ? tempDashModel.treegrid : false; window.smart_manager.dashboardStates[window.smart_manager.dashboard_key] = JSON.stringify( window.smart_manager.dashboardStates[window.smart_manager.dashboard_key] ); } } if(typeof window.smart_manager_product === 'undefined'){ window.smart_manager = new Smart_Manager_Product(); } jQuery(document).on('sm_dashboard_change', '#sm_editor_grid', function() { if( window.smart_manager.dashboard_key != 'product' ) { //Code to hide the 'show variations' checkbox if( jQuery(".sm_top_bar_action_btns:nth-last-child(2)").find('#sm_products_show_variations_span').length > 0 ) { jQuery(".sm_top_bar_action_btns:nth-last-child(2) #sm_products_show_variations_span").remove(); } if( jQuery(".sm_top_bar_action_btns:nth-last-child(3)").find('#import_csv_sm_editor_grid').length > 0 ) { jQuery(".sm_top_bar_action_btns:nth-last-child(3) #import_csv_sm_editor_grid").remove(); } return; } }) .on('smart_manager_init', '#sm_editor_grid', function() { //For add row functionality if (typeof( window.smart_manager.defaultColumnsAddRow ) == 'undefined') { return; } window.smart_manager.defaultColumnsAddRow.push('terms_product_type'); }) .on('smart_manager_post_load_grid','#sm_editor_grid', function() { if( window.smart_manager.dashboard_key == 'product' ) { window.smart_manager.excludedEditedFieldKeys = ['postmeta/meta_key=_product_attributes/meta_value=_product_attributes']; window.smart_manager.showVariationsHtml(); //Call to function for 'show variations' checkbox window.smart_manager.showImportButtonHtml(); //Call to function for 'import CSV' button window.smart_manager.changeExportButtonHtml(); //Call to function for 'export CSV' button // ,'posts_post_status' let variationsDisabledColumns = new Array('posts_post_title','posts_post_date','posts_post_date_gmt','posts_post_modified','posts_post_modified_gmt','posts_post_content','posts_post_excerpt','posts_post_password','terms_product_cat','postmeta_meta_key__default_attributes_meta_value__default_attributes','custom_product_attributes','terms_product_type','terms_product_visibility','terms_product_visibility_featured','postmeta_meta_key__wc_mmax_prd_opt_enable_meta_value__wc_mmax_prd_opt_enable','postmeta_meta_key__wc_mmax_min_meta_value__wc_mmax_min','postmeta_meta_key__wc_mmax_max_meta_value__wc_mmax_max','postmeta_meta_key_allow_combination_meta_value_allow_combination','postmeta_meta_key_minimum_allowed_quantity_meta_value_minimum_allowed_quantity','postmeta_meta_key_maximum_allowed_quantity_meta_value_maximum_allowed_quantity','postmeta_meta_key_group_of_quantity_meta_value_group_of_quantity','postmeta_meta_key_min_quantity_meta_value_min_quantity','postmeta_meta_key_max_quantity_meta_value_max_quantity','postmeta_meta_key_minmax_do_not_count_meta_value_minmax_do_not_count','postmeta_meta_key_minmax_cart_exclude_meta_value_minmax_cart_exclude','postmeta_meta_key_minmax_category_group_of_exclude_meta_value_minmax_category_group_of_exclude'); let parentDisabledColumns = new Array('postmeta_meta_key_min_max_rules_meta_value_min_max_rules','postmeta_meta_key_variation_minimum_allowed_quantity_meta_value_variation_minimum_allowed_quantity','postmeta_meta_key_variation_maximum_allowed_quantity_meta_value_variation_maximum_allowed_quantity','postmeta_meta_key_variation_group_of_quantity_meta_value_variation_group_of_quantity','postmeta_meta_key_min_quantity_var_meta_value_min_quantity_var','postmeta_meta_key_max_quantity_var_meta_value_max_quantity_var','postmeta_meta_key_variation_minmax_do_not_count_meta_value_variation_minmax_do_not_count','postmeta_meta_key_variation_minmax_cart_exclude_meta_value_variation_minmax_cart_exclude','postmeta_meta_key_variation_minmax_category_group_of_exclude_meta_value_variation_minmax_category_group_of_exclude'); window.smart_manager.hot.updateSettings({ cells: function(row, col, prop){ let cellProperties = {}, isLeaf = window.smart_manager.hot.getDataAtRowProp(row, 'isLeaf'), isVariation = window.smart_manager.hot.getDataAtRowProp(row, 'posts_post_parent'), colObj = ( ( window.smart_manager.currentVisibleColumns.indexOf(col) != -1 ) ? window.smart_manager.currentVisibleColumns[col] : {} ), nonNumericRenderCols = new Array('postmeta_meta_key__sale_price_meta_value__sale_price', 'postmeta_meta_key__regular_price_meta_value__regular_price'); let customRenderer = window.smart_manager.getCustomRenderer( col ); isVariation = ( isVariation ) ? parseInt(isVariation) : 0; if( customRenderer != '' ) { cellProperties.renderer = customRenderer; } if( colObj.hasOwnProperty('type') ) { if( nonNumericRenderCols.indexOf(prop) != -1 ) { cellProperties.renderer = 'customTextRenderer'; } } if( isVariation > 0 && variationsDisabledColumns.indexOf(prop) != -1 ) { cellProperties.readOnly = 'true'; if( prop === 'posts_post_title' && true === isLeaf ) { cellProperties.renderer = 'customHtmlRenderer'; } if( 'terms_product_type' === prop || 'terms_product_visibility_featured' === prop ) { cellProperties.renderer = 'customTextRenderer'; cellProperties.readOnly = 'true'; } } if( 0 === isVariation && ( parentDisabledColumns.indexOf(prop) != -1 || (prop && prop.includes('postmeta_meta_key_attribute_pa_') ) ) ) { cellProperties.renderer = 'customTextRenderer'; cellProperties.readOnly = 'true'; } if( Object.entries(cellProperties).length !== 0 ) { return cellProperties; } } }); } }) .on('sm_grid_on_afterOnCellMouseUp','#sm_editor_grid', function(e, params) { //for handling attribute inline edit if( typeof( params.colObj.prop ) == 'undefined' || (typeof( params.colObj.prop ) != 'undefined' && params.colObj.prop != 'custom_product_attributes') || window.smart_manager.dashboard_key != 'product' ) { return; } window.smart_manager.defaultEditor = false; window.smart_manager.prodIsVariation = false; window.smart_manager.prodAttrDisplayIndex = 0; window.smart_manager.prodAttributeActualValues = ( typeof( params.colObj.values ) != 'undefined' ) ? params.colObj.values : ''; let attributeList = '', attrSelectedList = '', dlgTitle = '', dlgContent = '', isVariation = false, selectedAttributes = new Array(); //Code for setting is_variation flag if( typeof( window.smart_manager.currentColModel ) != 'undefined' ) { window.smart_manager.currentColModel.forEach(function(value) { if( value.hasOwnProperty('data') && value.hasOwnProperty('selectOptions') && value.data == 'terms_product_type' ) { window.smart_manager.productTypeValues = value.selectOptions; } }); let prodTypeId = window.smart_manager.hot.getDataAtRowProp( params.coords.row, 'terms_product_type' ); if( prodTypeId != '' && window.smart_manager.productTypeValues.hasOwnProperty(prodTypeId) ) { if( window.smart_manager.productTypeValues[prodTypeId] == 'Variable' || window.smart_manager.productTypeValues[prodTypeId] == 'Variable Subscription' ) { isVariation = true; } } } let productAttributesSerialized = window.smart_manager.hot.getDataAtRowProp(params.coords.row, 'postmeta_meta_key__product_attributes_meta_value__product_attributes'); productAttributesSerialized = ( window.smart_manager.isJSON( productAttributesSerialized ) ) ? JSON.parse( productAttributesSerialized ) : ''; if( productAttributesSerialized && typeof( productAttributesSerialized ) === 'object' ) { Object.entries(productAttributesSerialized).forEach(([key, obj]) => { let isTaxonomy = ( obj.hasOwnProperty('is_taxonomy') ) ? obj.is_taxonomy : ''; selectedAttributes.push(key); //Code for defined attributes if( isTaxonomy == 1 ) { attrLabel = ( typeof( window.smart_manager.prodAttributeActualValues[key] ) != 'undefined' && window.smart_manager.prodAttributeActualValues[key].hasOwnProperty('lbl') ) ? window.smart_manager.prodAttributeActualValues[key].lbl : ''; attrType = ( typeof( window.smart_manager.prodAttributeActualValues[key] ) != 'undefined' && window.smart_manager.prodAttributeActualValues[key].hasOwnProperty('type') ) ? window.smart_manager.prodAttributeActualValues[key].type : ''; attrValue = ( typeof( window.smart_manager.prodAttributeActualValues[key] ) != 'undefined' && window.smart_manager.prodAttributeActualValues[key].hasOwnProperty('val') ) ? window.smart_manager.prodAttributeActualValues[key].val : ''; if( attrType == 'text' ) { if( obj.hasOwnProperty('value') ) { let values = Object.values(obj.value); if( values.length > 0 ) { attrValue = values.reduce(( acc, cur ) => { return acc + cur.trim() + ' | '; }); } } } } else if (isTaxonomy == 0) { attrLabel = ( obj.hasOwnProperty('name') ) ? obj.name : ''; attrType = 'text'; attrValue = ( obj.hasOwnProperty('value') ) ? obj.value : ''; } let attrVisibilityFlag = ( ( obj.hasOwnProperty('is_visible') && obj.is_visible == 1 ) ? 'checked' : '' ), attrVariationFlag = ( ( obj.hasOwnProperty('is_variation') && obj.is_variation == 1 ) ? 'checked' : '' ), attrPosition = ( ( obj.hasOwnProperty('position') ) ? obj.position : '' ), attrChkboxList = ''; attrChkboxList += ' '+_x('Visible on the product page', 'visibility option for WooCommerce product attributes', 'smart-manager-for-wp-e-commerce')+' '; attrChkboxList += ' '+_x('Used for variations', 'use for variations option for WooCommerce product attributes', 'smart-manager-for-wp-e-commerce')+' '; attrChkboxList += ' '; attrChkboxList += ' '; if (isTaxonomy == 1) { attrSelectedList += ' '; if( "text" === attrType ) { attrSelectedList += ' '; } else { attrSelectedList += '
            '; attrSelectedList += ' '; attrSelectedList += ' '; } attrSelectedList += ' '; } else if (isTaxonomy == 0) { attrSelectedList += ' '; attrSelectedList += ' '; } attrSelectedList += ''; attrSelectedList += attrChkboxList; window.smart_manager.prodAttrDisplayIndex++; }); } Object.entries(params.colObj.values).forEach(([key, value]) => { let disabled = ( selectedAttributes.indexOf( key ) != -1 ) ? 'disabled' : ''; attributeList += ''; }); dlgContent += '
            '+ ''+ ''+ attrSelectedList + '
            '+ '
            '+ ''+ ''+ '
            '+ '
            '; let initializeChosen = function() { jQuery("select.multiselect").chosen(); jQuery(".chosen-container-multi").css({'width': '250px !important', 'margin-bottom': '7px'}); //Code for select all and none attributes jQuery(document) .off('click', 'button.select_all_attributes').on('click', 'button.select_all_attributes', function(){ jQuery(this).closest('td').find('select option').attr("selected","selected"); jQuery(this).closest('td').find('select').trigger("chosen:updated"); return false; }) .off('click', 'button.select_no_attributes').on('click', 'button.select_no_attributes', function(){ jQuery(this).closest('td').find('select option').removeAttr("selected"); jQuery(this).closest('td').find('select').trigger("chosen:updated"); return false; }); } window.smart_manager.modal = { title: _x('Attribute', 'modal title', 'smart-manager-for-wp-e-commerce'), content: dlgContent, autoHide: false, width: 'w-2/6', cta: { title: _x('Ok', 'button', 'smart-manager-for-wp-e-commerce'), callback: function() { if( typeof window.smart_manager.prodAttributeInlineEdit === "function" ) { window.smart_manager.prodAttributeInlineEdit(params); } } }, onCreate: initializeChosen, onUpdate: initializeChosen } window.smart_manager.showModal() }) .off('click', '#edit_attributes_add').on('click', '#edit_attributes_add', function(){ let taxonomySelected = jQuery("#edit_attributes_taxonomy_list").val(), isVariation = jQuery("#edit_product_attributes [name=isVariation]").val(), newAttribute = '', attrType = 'text', attrVal = '', isTaxonomy = 0, attrChkboxList = ''; //Code to reset the taxonomy list jQuery('#edit_attributes_taxonomy_list').find('option[value="custom"]').prop('selected', true); jQuery('#edit_attributes_taxonomy_list').find('option[value="'+ taxonomySelected +'"]').prop('disabled', true); if(taxonomySelected && ("custom" !== taxonomySelected)){ attrType = ( typeof(window.smart_manager.prodAttributeActualValues) != 'undefined' && typeof(window.smart_manager.prodAttributeActualValues[taxonomySelected]) != 'undefined' && window.smart_manager.prodAttributeActualValues[taxonomySelected].hasOwnProperty('type') ) ? window.smart_manager.prodAttributeActualValues[taxonomySelected].type : ''; attrVal = ( typeof(window.smart_manager.prodAttributeActualValues) != 'undefined' && typeof(window.smart_manager.prodAttributeActualValues[taxonomySelected]) != 'undefined' && window.smart_manager.prodAttributeActualValues[taxonomySelected].hasOwnProperty('val') ) ? window.smart_manager.prodAttributeActualValues[taxonomySelected].val : ''; isTaxonomy = 1; } attrChkboxList += ' '+_x('Visible on the product page', 'visibility option for WooCommerce product attributes', 'smart-manager-for-wp-e-commerce')+' '; attrChkboxList += ' '+_x('Used for variations', 'use for variations option for WooCommerce product attributes', 'smart-manager-for-wp-e-commerce')+' '; attrChkboxList += ' '; attrChkboxList += ' '; if (isTaxonomy == 1) { newAttribute += ' '; if( "text" === attrType ) { newAttribute += ' '; } else { newAttribute += '
            '; newAttribute += ' '; newAttribute += ' '; } newAttribute += ' '; } else if (isTaxonomy == 0) { newAttribute += ' '; newAttribute += ' '; } newAttribute += ''; newAttribute += attrChkboxList; jQuery('#table_edit_attributes').append(newAttribute); jQuery("select.multiselect").chosen(); window.smart_manager.prodAttrDisplayIndex++; }) // Code for handling the export records functionality .off( 'click', ".sm_top_bar_action_btns .sm_beta_dropdown_content a").on( 'click', ".sm_top_bar_action_btns .sm_beta_dropdown_content a", function(e){ if(window.smart_manager.dashboard_key === 'product'){ window.smart_manager.stockCols = ['sm_export_selected_stock_cols', 'sm_export_entire_store_stock_cols']; window.smart_manager.visibleCols = ['sm_export_selected_visible_cols', 'sm_export_entire_store_visible_cols']; if(window.smart_manager.sm_beta_pro == 0){ window.smart_manager.recordSelectNotification= (jQuery(this).attr('id') === 'sm_export_selected_stock_cols') ? true : false; window.smart_manager.exportCSVActions = window.smart_manager.stockCols; }else{ window.smart_manager.exportCSVActions = window.smart_manager.stockCols.concat(window.smart_manager.visibleCols); } } }) //Function to handle Product Attribute Inline Edit Smart_Manager.prototype.prodAttributeInlineEdit = function(params){ if('undefined' === typeof(window.smart_manager.editedAttribueSlugs)){ return; } let attributesEditedText = '', productAttributesPostmeta = {}; window.smart_manager.editedAttribueSlugs = ''; jQuery('#edit_product_attributes input[name^="attribute_names"]').each( function(){ let index = jQuery(this).attr('index'), attrNm = jQuery(this).val(), isTaxonomy = parseInt(jQuery("input[name='attribute_taxonomy["+index+"]']" ).val()), editedValue = '', editedText = '', selectedText = '', selectedVal = ''; if( attributesEditedText.length > 0 && (window.smart_manager.editedAttribueSlugs).length > 0) { attributesEditedText += ',
            '; window.smart_manager.editedAttribueSlugs += ',
            '; } if( jQuery( "input[name='attribute_values["+index+"]']" ).attr('type') !== undefined && jQuery( "input[name='attribute_values["+index+"]']" ).attr('type') == "text" ) { editedValue = jQuery( "input[name='attribute_values["+index+"]']" ).val(); if (editedValue == '') { return; } editedText = editedValue.split("|"); editedText = editedText.map(text => text.trim()); editedValue = editedText.join(" | "); if (isTaxonomy == 1) { attributesEditedText += attributesEditedText[attrNm] + ': [' + editedText + ']'; window.smart_manager.editedAttribueSlugs += window.smart_manager.editedAttribueSlugs[attrNm] + ': [' + editedText + ']'; editedValue = editedText; } else if (isTaxonomy == 0) { attributesEditedText += attrNm + ': [' + editedValue + ']'; window.smart_manager.editedAttribueSlugs += attrNm + ': [' + editedValue + ']'; attrNm = attrNm.replace(/( )/g,"-").replace(/([^a-z A-Z 0-9][^\w\s])/gi,'').toLowerCase(); } } else { selectedText = jQuery( "select[name='attribute_values["+index+"][]'] option:selected" ).map(function () { return jQuery(this).text(); }).get().join(' | '); if (selectedText == '') { return; } selectedVal = jQuery( "select[name='attribute_values["+index+"][]'] option:selected" ).map(function () { return jQuery(this).val(); }).get(); editedValue = {}; if( window.smart_manager.prodAttributeActualValues.hasOwnProperty(attrNm) && window.smart_manager.prodAttributeActualValues[attrNm].hasOwnProperty('val') ) { selectedVal.forEach((index) => { editedValue[index] = window.smart_manager.prodAttributeActualValues[attrNm].val[index]; }); } let attributeName = (attrNm) ? attrNm.substr(3) : ''; window.smart_manager.editedAttribueSlugs += ((attributeName) ? attributeName : '') + ': [' + selectedText + ']'; attributesEditedText += ( ( window.smart_manager.prodAttributeActualValues.hasOwnProperty(attrNm) && window.smart_manager.prodAttributeActualValues[attrNm].hasOwnProperty('lbl') ) ? window.smart_manager.prodAttributeActualValues[attrNm].lbl : '' ) + ': [' + selectedText + ']'; } productAttributesPostmeta [attrNm] = {}; productAttributesPostmeta [attrNm]['name'] = attrNm; productAttributesPostmeta [attrNm]['value'] = editedValue; productAttributesPostmeta [attrNm]['position'] = jQuery( "input[name='attribute_position["+index+"]']" ).val(); if (jQuery( "input[name='attribute_visibility["+index+"]']" ).is(":checked")) { productAttributesPostmeta [attrNm]['is_visible'] = 1; } else { productAttributesPostmeta [attrNm]['is_visible'] = 0; } if (jQuery( "input[name='attribute_variation["+index+"]']" ).is(":checked")) { productAttributesPostmeta [attrNm]['is_variation'] = 1; } else { productAttributesPostmeta [attrNm]['is_variation'] = 0; } productAttributesPostmeta [attrNm]['is_taxonomy'] = isTaxonomy; }); window.smart_manager.hot.setDataAtRowProp(params.coords.row, 'postmeta_meta_key__product_attributes_meta_value__product_attributes', ((Object.keys(productAttributesPostmeta).length > 0) ? JSON.stringify(productAttributesPostmeta) : ''), 'sm.longstring_product_attributes_inline_update'); window.smart_manager.hot.setDataAtCell(params.coords.row, params.coords.col, attributesEditedText, 'sm.longstring_product_attributes_inline_update'); } //Function to handle 'import CSV' button Smart_Manager.prototype.showImportButtonHtml = function() { if( jQuery(".sm_top_bar_action_btns:nth-last-child(3)").find('#import_csv_sm_editor_grid').length == 0 ) { jQuery(".sm_top_bar_action_btns:nth-last-child(3)").append('
            '+ ''+ ''+ ''+ ''+_x('Import CSV', 'button', 'smart-manager-for-wp-e-commerce')+''+ '
            '); } jQuery('.sm_top_bar_action_btns:nth-last-child(3) #import_csv_sm_editor_grid').off('click').on('click',function() { if((typeof window.smart_manager.dirtyRowColIds !== 'undefined') && Object.getOwnPropertyNames(window.smart_manager.dirtyRowColIds).length > 0){ window.smart_manager.confirmUnsavedChanges({'yesCallback': window.smart_manager.handleProductImportCSV}) }else if("undefined" !== typeof(window.smart_manager.handleProductImportCSV) && "function" === typeof(window.smart_manager.handleProductImportCSV)){ window.smart_manager.handleProductImportCSV() } }) } //Function to handle 'show variations' checkbox Smart_Manager.prototype.showVariationsHtml = function() { let show_variations_checked = ''; if( window.smart_manager.currentDashboardModel.hasOwnProperty('treegrid') && window.smart_manager.currentDashboardModel.treegrid == 'true' ) { show_variations_checked = 'checked'; } if( jQuery(".sm_top_bar_action_btns:nth-last-child(2)").find('#sm_products_show_variations_span').length == 0 ) { jQuery(".sm_top_bar_action_btns:nth-last-child(2)").append(""); } jQuery('.sm_top_bar_action_btns:nth-last-child(2) #sm_products_show_variations').off('change').on('change',function() { if( jQuery('#sm_products_show_variations').is(":checked") ) { window.smart_manager.currentDashboardModel.tables.posts.where.post_type = ['product', 'product_variation']; window.smart_manager.currentDashboardModel.treegrid = 'true'; } else { window.smart_manager.currentDashboardModel.tables.posts.where.post_type = 'product'; window.smart_manager.currentDashboardModel.treegrid = 'false'; } if((typeof window.smart_manager.dirtyRowColIds !== 'undefined') && Object.getOwnPropertyNames(window.smart_manager.dirtyRowColIds).length > 0){ window.smart_manager.confirmUnsavedChanges({'yesCallback': window.smart_manager.updateState}) }else if ( typeof (window.smart_manager.updateState) !== "undefined" && typeof (window.smart_manager.updateState) === "function" ) { window.smart_manager.updateState(); //refreshing the dashboard states } if((typeof window.smart_manager.dirtyRowColIds !== 'undefined') && Object.getOwnPropertyNames(window.smart_manager.dirtyRowColIds).length > 0){ window.smart_manager.confirmUnsavedChanges({'yesCallback': window.smart_manager.refresh, 'noCallback': window.smart_manager.handleShowVariations}) }else if ( typeof (window.smart_manager.refresh) !== "undefined" && typeof (window.smart_manager.refresh) === "function" ) { window.smart_manager.refresh(); //refreshing the dashboard states } }); } //Function to change 'export csv' button HTML Smart_Manager.prototype.changeExportButtonHtml = function() { if(document.getElementById('sm_export_csv') !== null){ document.getElementById('sm_export_csv').innerHTML = ''+_x('Selected Records - Stock Columns', 'export button', 'smart-manager-for-wp-e-commerce')+''+ ''+_x('Selected Records - Visible Columns', 'export button', 'smart-manager-for-wp-e-commerce')+''+ ''+_x('Entire Store - Stock Columns', 'export button', 'smart-manager-for-wp-e-commerce')+''+ ''+_x('Entire Store - Visible Columns', 'export button', 'smart-manager-for-wp-e-commerce')+''; } } Smart_Manager.prototype.setExportButtonHTML = function() { if(window.smart_manager.dashboard_key === 'product'){ if(document.getElementById('sm_export_entire_store_stock_cols') !== null){ document.getElementById('sm_export_entire_store_stock_cols').innerHTML = (window.smart_manager.isFilteredData()) ? _x('All Items In Search Results - Stock Columns', 'export button', 'smart-manager-for-wp-e-commerce') : _x('Entire Store - Stock Columns', 'export button', 'smart-manager-for-wp-e-commerce'); } if(document.getElementById('sm_export_entire_store_visible_cols') !== null){ document.getElementById('sm_export_entire_store_visible_cols').innerHTML = (window.smart_manager.isFilteredData()) ? _x('All Items In Search Results - Visible Columns', 'export button', 'smart-manager-for-wp-e-commerce') : _x('Entire Store - Visible Columns', 'export button', 'smart-manager-for-wp-e-commerce'); } } } // Function for handling the 'Show Variations' when click on it during unsaved changes. Smart_Manager.prototype.handleShowVariations = function(){ jQuery('#sm_products_show_variations').prop('checked', !jQuery('#sm_products_show_variations').prop('checked')); } //Function for redirecting to WC product import Smart_Manager.prototype.handleProductImportCSV = function(){ if(window.smart_manager.WCProductImportURL){ window.open(window.smart_manager.WCProductImportURL, '_blank'); } } assets-wp-repo/screenshot-1.png000064400000452307147600337620012501 0ustar00‰PNG  IHDR ¨OªqPLTEbbb`]™áèÿfffeeeeeefffffffffeeeeeefffffffffffffffeeeffffffffffffffffffffffffXPìeeeXPìïïòXPìïïñfffYPìfffXPíXPìXPìWPíXPíXPìffffffXPìXPíßæýáæÿ‚„‰ª­¹¶¶¶ÿÿÿññòáçþùùùîîîûûûõõõfffXPìêðóàááêêêääååíñÜÜݦ¥¦ÒÓÔ˜›§ÿý÷øþÿõùûðýþŸŸ ÎÎÎ×ìúþûí»½¿–hSÇÈÉéõûßñü×ØØh‡­½ÃÐþúàËèý]nŒúôéÓßè€|ñW^rÝéíÈÛëZt™«¾ÒûëÏÖäóÀÔåãüþ¤µË·ÎßÌâòþøÍãÉ°”ºÕ«ª«ÇÎÜa~¦ïֻƯŸÂ——™Œ±Ðƒ­É±ÇÙ­´¿¸·¶üñÜÙ¿§‘–òUdÍ·¦®Îí|¥Â¹Õït^dòçÛøáÄüÛª¿Ú¸Òû==@ÂÃ÷¡¥±QTd¡®ÁÁÞù}ñ\RR¦Åão’³ŽIINÆ«òÞÏ¿ÈÛÝä²€qYR‚g_žsYæßÖˆ‹òt¼²ƒ]ýê¶ees%##ÑÄ´ßÖÍìßÈš¦¹…`LcZdòíü½©œ¬°öôÈ–±¡£­¯´ÛÚûÖ§z»‹d黊ΙréöäÙÅôÆhƒ…‹‚¢¶¢”(.;­ãÙïѦopîàñÐÓ²’ZD5|~좢£ôɧ‡›žóªxU¹©§¡Žñˆ›´êÖól™ž‘‰¦™œáÞ¸Óͪ›’A1)ter…ñHf’¨ÁÏÑùÀ™u¸¹ò…€?WyqR>µ›ðª¿ù™´õí‘*¢ƒh`hî®s¿ïòiÊ«ALeäã­~À„ç┩ÌÄ‹ÚÇŽÀs³š…ËáÆ…½]}qí%;`‡ ô­ÊnbÁ‘㮞[«@óŠƒò³ –ɨÇ؇gµ]ùÁÐIœÝòrre¥Ûõö¦¶@‰Çê¨JÃ: ò¾nY2 ä2tRNS m2I=U'ˆ¦›ßÏveº]î°çúØímQ±‘ö1ÇÜɇB›UóÁfv‘PÀ‹°SìQDIDATxÚì] Ž! ùBB|%8÷?Xga&Ù¦éì*ÉòTµ˜O 6Û¤ËÄK\pð/ý•sJ,×"!¸'¤ª¶ ·BÔ˜–‰‰o 1EË nÕDiaù¨è½·IÑgBøã*†ZæûõõEúû ”#ý‰wAÈ;P{·\ðåæ–3ÌÚë¶ÉÚ«åÈœ³]~- wÐö_­`Ê9›õ_—W„å· ÉÓ6'„Ç\€^,?¶}ÝE©mÊœÉ hÅ`sŸ‹Êe÷äCrÕk/¿LLü(B /7D@ªbBJo3™ÐULˆáá)&”òãb¿â½½z2˜LèÛ>wH¯òä„xxx^,Œ–bƒÞ{ú²ò20^Ä„è6Ùe÷€¼á^;¥ÒËÄÄ"ä¾IåòR˜{ šLèr&”øFŸ?R-ïŒobBW|Ä"{„ÉüËñÿêµ-ÚpXÝm{üêòˆp •5e÷%ä}Ž£˜|âô Mübi‡ÛLHè!­ lfø‘ ±øFëÿ™ Å**¹fÙ“¿Ô2O$}p›#‰â3ÒP®€8§ 0±óqÚ¡["[€6$û¢¹×ªÝH¹sˆÇwãæ»)?Â40ǦD×RÊ;^å'B#Žê(YcZ(˜ÃË#MQÁQ/y U‘šXŽ½åÍZTÉŸé>òÃÍhP¹V:Í£×0!Ù>(Ì ÙLƒ.*ÃÖÄ·¶x:y¶•0?ÄݧZHM©é ÉßPnÏpCòë§ y’ ±}q÷™Å-&ú0â¦ôÕ7ähôÐè73U'&Ä»A§[ì&€Ãä9ÌVÒ“'º…H*ü7&DÓ +G™Ðh$™†And°/cŸûn`B3#ö Ág꣪^¸Ì¯§_ÄĈ܀2 –ì8lÜI°‚vPát&U ²K½)ð¼/80!ì†2«{LÈž5«ó)CW¥ÔŸóP?‘ ÑÞ^´¥N{+›9çì†ÀS|ë[“ J%¤š»¦Ž=À„F5•ú½šÎwk1úà‚Ïý{Õ'A3_è­DöQ´ïó»~ðÌ„8{à &¤cÍlo1!K}¢®[5·~ZÿÚT‡TK)©ÚCñ ½ÕéXYæõ¹02d˜mÎ'Ë°ëÃdBgÃ#LHQO'·ù¤ÄºZZòMJr®j“ZÅ%<<§Ý•–TS+FÊWÏ~½›žX/“Í-(¢Î¯k0¡ûƘœŠ;õ‹µŠ´>6;©A烓Š¤Av ³W'@Öô)–2ñ+½Ywᛑ‰É–RJŠ™«ÃæTÔ¤]ª}U×Ýs6á_Gîï‡P9 ±–MüfB ÚCŠœúY-ì(A–ßn¥.cú1&$tf`h×Q§D³>ÈîF¾F`O-”»ÙQcão\„&D²J_DÇ`ÿe'¼Á„€c’àE`o“ÏŽîøNÉÂ20£ØqÂÀ›r2lUißÉRŒB‰=3tþg2ƒƒò&xÓõéÃ(qŸ¶šb¿¨‘Kp+•†ÓÀ„BÆÔj™!(öùÉÚbvF/·¹ƒ$5-ë©ww­Àj   ‹àÙoë¿æ?#'rÜÆû& œ3ÔY f–¼×f&$÷©†µkHÓàÞÞ(ö>ñry6_¥éšÍá²®iöƒV™ ¶©™¥'˜Ðé÷fÇSÜúhÉtëºÐ ò»ÒøÖö …ŽL(þ… …nPg&ê¿#„S@·á¾40d–߉†ž˜U"î¶××á\ÏÒI´ÐÔ•xžû?&äŠÜ8EÊOUcJpéF (b#˜ †:† -Xÿ´ë\s¥—[ŒÌ ƒÍ…ÜyÛb'>vÌÄ–—#hDèÒ™eW•æÓ¸2ûËB) IßdB;ŽÓ¿)pþö¦œ'Ç&®eBèÈ 3þ'0nkƒÒ;`©‘¼IÊ¡‚&:/3!†Hæ”å#C…!³¼ÑÆ*RÏ~ÁU£m· f2¡?ìÛrÛ †Ý¤iâ›&“+Ì0Ãpœ'Ðû?XÄf9Èv8­Üò_´Â’Ãaù€pBâ ñ­'!ƒqQ¸ðDØœ _ÆÄ¢›š[%!Îò´–òÌYþê6 cý'gÇ×+:[‘UyŠnrœ#!òô¹– åÌ ‹ Ç”µ"¦‹C§è‘7–»<F=K²¹”²’ ÓéÏU<…ù&Å y©Y¦ÂŽ"!0,¥•GBÎ'I c-KkŽóäoø#ÒW,u…j±O‘ ÷ÿèI(VýõAB—’G“x†„àȘK×ÝÖÂéiú×HÖÏÐÝh?& Ço«AB¿±ŠΓÐ,K¦À_„òq«ø;N’Ï¿7¹…ñDä4¢ôæPþ< •CG>™úTŽyjV+‰E z÷\‚M§HȤ/¤Aâc$„žFë™ZY|«oq—Ž¡©ZE_O‹ŒçxÚ§Ž!È]¹ÐJ?IB²9h‰£ ÉæåjÀŠŽ„° :BB…‘YéHˆÒÑö$Û¦K¡ &×GfÇ$ê†<…{*: aŒ ¡®½³¢ðë$”$M^¯*²œ£,kE;;&"IæÒî¥oÊâ‘àÚÖÊ@0P'4ô$T$­ÐK> ÿ§°Àzï@œRŒ˜väæ 1¤E©ÎÌŽù¢bz¢9=M·4÷>´9õ$Tù:pD À±LX&±+Ôyåœ&!y†„BÁ)j)ë®– TkTKBèi7Hh„<ÃÎo9öj"à= Y,1è‘NË÷$doõ²U²ØùäÃOèªc±ð Vˆr¨L¢$:¥SÀV³È_@B<‘•Æ‡¶Óbœ4-9Ð)*‰µ¡‘OG'ž®íIˆ3%.úH`aVÓ”1ªz(N·—3ç'ü„hàô¤Çô®sƒ_'!tpZÚ‰¡¡ë‘­ç‘ 9–Ïz/Ehî5–Ƴ$ñ©- Ñ€…öPég«¥hÔnÙ4=„¨9H(/{·³¼ÑÔg-–¤zV’³Åq”- !¡.Ó)*;BB¡1J¡qƒ³—¤VŽ?Ce?âÚ1⤂ ‘.N³Ë…\Bu½Ï›‚0m³ó=&1O¥. !šk×í¡Ã¡–”XX¹¦Ëüv¶øó´ÜÎêôy•„vºöó˜Êì¦c#.†Òî $d+2ï€fik„ž„t¶*vÐÐIˆ*»‘Ücõ!ü È4U¸àË¢p‚„·ï j:FBxr3n‰00w鯶ùàݘíÈ%¹³ƒ„`je(k&m! Õaa„|ÇçF«žÛ-Y lŽ­¢ä2ªùÅ7£þ,zÄ™Ê#ÁºÌ‰D;ž(Ú®ˆ„ʵ97„„_*¬Ã¸OpRÄä×Þí1¨I^y!’{Ëy‹‚^BB¾Ýí’Š¼šò°à•Ê_Äé9"ìž9›ºy›™¥6ÑÖŸIv„l]ë%R &—E(ê$ë´ Õ6Ýë$”!K潦‘9#$™kΖ0#ð k$“­‡Ô‹º=! UŠí‘ „?œ€%”]*%R3(’Píú¼NB ú•hxöÓZ•›µ³h“ÝkH¨óÒµœ„îîîžfÝßßÿ@}/5_ßß?=Ý}y“Ø“ Ä$"!’^?wÌÕg—„ÖcšòÚ”±okž¬-Š@›kEÚ5.IiVï1MAa·FB“fc™ ª<Û‹’1v¾Ê&'¬¢½«mÿH. !5 (Üä˜Þjè¶"÷;¦S¾oe³cß÷€zêR;–3Á‚RˆÁúˆ^¾G© ÝiiZcAV†Æ×È\û®Tô$ÄÙmš—¡­i…„jÃÂdYæuq›¯ v‚„„= õ/¦C--k¸,ÐeMB=Pi¸2 Àç$ÈYèæññõõåpøùóùy¿ß»TûŸ‡×ï÷_„D= 9N^/Y:–$%OBÍÂշ׬¢§RMžêÛ™êIˆgÇË„+c3qK'¾õ$$ÇQJ—-{`5å«߈„?·ãI²Iµ^Èz¤H:‹Þ°Æ(Å¢¯f5Y IHNI¶&!´G_!°¢Èf7gµ¥b. N>¢“P ¡ž?Z²»ÙÀ¢œšÅss0ËŸ0.¯%ò³c6;úL{±Ê0‡dN2)]ÍòÞ˜Õòë– ®ÎR¾ÛˆèS1F„†>.ngñÕ͸œ3¯Ç´³$Ýk02Þ¼…øÌhs` X{¹ oO«÷Oç)Œ‚ ¼]Ò8>e£sx =F¢Óo_®ýË÷§Ý·’Óíç+Ϧ’Äoâô ,<7f§‚«ÜÍÊeÌ»Y<÷q¹SÓØPâZoE› /‘QV°‰‰ÌŸlF`C¬ë<ØhÂ[2ñY9\¾Eò¼4 ÆÃûEúBðY«ŸzqN7ºxà黎H1MØ\9i±®ž”¼Nåç-ìºÅKA$Þ…öysæehèvuŽ„öûççŸ?‡—××ÇYè4ë¾×â8ôørxÞ·y½‡Ý_ûÏêÿ¸ÌpÒú¯ôøÆ9‡Ä9äôüôðpwŸa¸{úñxx.ièðã78Hè Ú¬àéû˾zØý† ýbïnwÂ(ŽŸ™ ï(ÌßbÒ4~ÛÝ+8÷c+*mL[ܺ¨ç÷ɘO2€ƒÑ>TB"""ãæÒªSœ¥êC%$""2~IæÍžOq†J¨•ˆˆÈ]Hš’±úóúú:šßŽy(6õf§N """òtòÚìdú—*yBQmZ>‡ˆˆˆÈó‰ ÓÊ """ò|lfZkÝ!‘g”{³Uè‹Ó"""òŒlcZn!qøIVA'r_l2ìUº\Ƚ°!4ØÉCˆq½d^:œ“†`áBˆ€° $õS§û]ÎÎÈCÈñ̤ÈúØM~Sé5)4¯Z/“Æ⤲z²å[Š¾Îo·“ϸƑ¸ªbŒ’âÈî9‡›pÎb˜&Ã;ëîæVêº(ºÁ›¢XÃO=†KŠ"Eÿm„¢ÀC UgïäUÐ1U…ÏÜ”zK¬¯›=‡[ÐCäçåä ;œãzÒãˆÍ²ÇJÒ!%k8riq—e9:Ɇ;U ž?Q3²Áê%[oÆârQ»ÃÛÊ ³•bˆ N©¸Ø-ÿvˆ²ÌÐߦÝ.LiöGÙË+3BIÙËß1€¾áYbO6G y'<ßg]Þ‘´,%=,I4!Ã…~s‰‡äÙ)N]Ì<:sŸÅä pe>ž*˧5äæºÙ#dd$e9ÊK„<^B5™áHBN¾-!L9Åebr»âÁ2i'o–К3î‚óf+XBÓéô·üÙJÓüÔÍàZíÚU³ø.J(Yð`ò?KÈÏfù…@j žÍÒû*¡„dÜÞüËÞµ%¹nQ‰zKèý(ý¨ügï ÷¿±Ð§…±5™Ir“Ì8)Ÿª{m#hDÓ4GÐh’À þ&:dÌ´¾™ÑXíßaBê²o'?Þ Û¾Ddöáï2!9»ç7Þ8㥙P§Á_aBÑýe&„›­µJ† 5Rå/2!<‡Fi¸×Ñ‹3¡ƒ å¿Æ„4ßõDDéïŠVž R(úÀ„Tô‰}É„'âÔ3/µ§S­MW¬¸»ŸcBúî‘”¡ÂìñcBAïš\bµP¥êo2!Èx3! ý¸@ïÕy&$é„>ߟ1!ýœÃWé ´ÎòßLèoÀ&µåT‰‘G[ÙW韨úrƒÁnÍpÿH›&Òî7ºir;Pš,Ê©HxžèÒðÕ¨™ú0=1¡®é@sª>ÌQV~”›B‰&U[9µÊŠ¬ˆ¦Å6ÄXnîªT¶ÊF:œÀ†f †ij?ßzÑ@âãs}„ãôÓ‰bÚ©¯¸š—£yº˜¦"&„ÛŠ‚o¨Pý2‚Ú/FQ³FŠºŽ]×]3ÒÒçnê:ÅFØ•hݸÑåH4V‘•3Û/xºlj¢¹¸«1®ëa«i)•îm)[>©‘/¯ëF˜P[/´Ôë‘2ÕF߈êÍ÷Lš×ymÒ|(m(ÜîX:È,Íß²Tì'Is—¨xˆ•óL"wýÈŸKòo| “ r?¼´ LH¤åTÅ †‚MBa@„ˆS ÿB¢,QÜ‘,"}%fùÅ#ÊUq[v,&·U‹Ñ^Ì”±•V¬ÿ¨ªb Þꉪ¦7·F‰œÞô™0¡Ö–ªF”’âfnp IUeIq1•ôDaL9&„úZÕÜŒ5÷´4}Œ²­­¥ÒrCÄeóC&Òñdn_Fw—ÆØô€gB2$ã ÑŠFu—…3Lh›i™rÏ„8ßµLîz®ë0èk›VWâë‘h®3VàÌ® r½Yó˜†Ù ŠYÁª ùj¡îbUÅ}ˆï…s6æÒ ªª¶ó <ö¸‰Tæ[/Ú•TöÇ%‹Ü¯Wgm¿V\ê ö(’¶lO·õˆ8V¨U¿Ì„@ü"nFòгtj&äúf€ÎJY›ÒÔ«ë¿Þ+Èœ”r‡zÝS(£0¡×÷{Ê.ÆкžÑøÍñ"m "¿p±Çóa“A3£‘q ‹gVîƺÙ[×Q»ŒŽ£'®¡,-:W2ßàb3Ñô÷6`BQßÛ=@ä¢òêиº¢‚Aôu£Em6—& ãŽÌfî³ÿÀÁ5rÿ£-£rî`XÄœ ªoè†% <òúî(ûêݱú«ãs4àÃ$oWSVºr^=ªi6è®%øHÇ.e3ŒŸË(níIfкÚ+¾•×±ä–¨ˆÅCRôµç0D`ƒB$}NjHrï&KïÇ1kC­¬ÉÝ0WY¦$ˆ %t‹NDòBýóÚ'ÀÏhÉ(_Á„X¥õ!à7Nøט¬uÂñƒÜÃF|‹€Y{_c(˜EÝ=3!Zný…ݳD¾Ó5lnDÛ™ ¡™~„Ç2y^ÙUi¸ýé5V$šÐ Ò”©&DKo0,{û½³ÃR¯ìô0ßBôí-fdZŒù`1Òñmõm8â[4oãf.+ºzº­ïDÂT¨ûu&Ä>%=3!*³m†£ñLHÙ„i.ÖªºL“ØpS[V_³Bª;{ˆ˜ÖqŽèg1­Ò8á^  +mèO0¡sÄôl5þ€aE4BÛÄ,´v°ÂV‡cHý³ŸζPh›º³bÓ3r覾JCVÔãØíý)bºF)èÑõÆÀeÙ 8O–³/3Ç^ÐRÌ‚û΢§ýçôZ^«Òç!™”ã²nÕ¡öP§˜퀷艶?`BÊ¢žîÞ›W%û`Éáw ÃäH½­¡ê©ùÃc¡ñ¨2ÓÇhßLèoDr_ndíîÁ[9ÎÈy¼G÷Ç ?fB§yyÉ ñµþ΄*r0Ÿ3! ÁjûÄ„ÂLC ó­½*-F¢«m†ÃD5r]=ò¯pâŇ|3K…¶_dBØØQ™üО ñÏÜoàïë¸?0!Mw¤¿À„¾î™Wš¼U\æÚ‘;;vc&õl!…oxäÈ€Õ0ð$<‹aÆg&Ô¹ soZc·å‘ u#Yá7΀ LTtÃPü]&´¾’2?Ö®Œhù‡Œ5©'*SZ"#ÃÖëÌa v\ú” õbZ'&„^úC&TJÙ3ò2óÀHùDˆý?¥å#¦ŸC÷bidB°7Xæ•Ú?`B²,ç?åë£$˜Ð@wD¼ØíoTçN¶«àŽ×SßLèï†ZÜ|6‰¹E‚c¦é…@®ËºL¬ê¯3!ÅÓ‡@¹&ò4Ð|Á„ô}ž.¿dB畇ɉ¨Ü=bSÔܯ¶,fJ㊘Ðf«ÿy&„¨iýKLñ¡•,›™V,<* Q`D0uã™âFú‚ UÌ„ºÇÕº-~~úxBº¥L¡Å´Ÿ˜P-(ýšÍ$:pL¨øÓLH1£ oä™km¯B¦eÊÏDöÖ²”–”¨øO3¡ˆOpwwPw‚´ãjU8S‹†žÖ„€ØšÞõS&„d£“l>3¡ÍJø#&¤y>‰×r2Á„nQr9ÆšðkB¿Ë„$l!2ž Ás±ÌÕ•’?`Bñ‘TÁÈ]Ìtí50!ì0jü[$öÃ=œy/£QNt{3¡7¾ðâ&Á¬$;¿J¸Cˆá}V¡\¼°Ç±¹üç˜PÉîÃCpŽZ%NhBD7ûB~A~íóÃ_0¡=’<›‹F9Ç–cw¸Ê]ñ õZÁœó¸;¦å¨˜Ò?Æ„€ô¯Ÿã@)­ãâ*GÄB([ÏG\„èÔÓ©œÈÉl¾ôF;&TIO¦hâ3&”@YªzbBWå{f$ÆGpÅõüüìq 5¹ ¡ÕOLhGhDê™Ð±Þ󌒖 v3œvÇX×™ M~wÌM/¡gBÜ?ê'åç5C»b µ9þÓLˆµ2bì ‚y@ùJRÁRÑŽÆ¥Mä'ãÖå:vr¶G&ä[߉ú>쎥.Ìå &”‰ä»c^f'†p!û°xKæ³ x>Ä°‰¹¹Ý±KÍ°CØ\ëŸ6½÷qÑÎ"Õ® Ý9Ì€ÐÁ„ÔHx5h„ÿ9t`dí7ªÊÄ›@çª!:1Lè}rì)kéË•°þ¡ÖµK¶3¢:KtkÜŽ®DeWìîÔü!‚C»˜§„5KRÈ;3¡kŸpv +·…γKvbB©0¤~eܔߵþ‚ ÑÜtýÓ % uÑ@†hÕ´g§¨²Won0¶bvÏ„0­[wÙãeBØ‹ÿ"r˜Ó@”}aJÐ~«qžÖ3!9¬s1ܾ -M÷hqnSo íYʶšçè3&„“|s?“cB¢>sñ=Cëew§HøÏ9,úåUN;Eµmãf¼ñ¥NLÈÏL$ÙZj£§a…Œ1pÄ4Zª¨¥3Â<+݃ ‰uŽ m‘Â6Žãç¾S'H„vÁ„@”ú¯1¡”©gBš¾¥YY+ÑõP¢j×E3-a·³š ²üÙ1ëž(;© 7'&„0!üO·Ð‡ì·˜ n1fAYäQ|0!æµjËѸ]ÊAnK4Õߟl­:Ûpݵ\5·<ŠØïüOÿ4Ü/ƒm!ÿNˆôø1ãà<Þ ïclþ3kBÁÁ²B>ž¢w§Ùw‰Õ#õ‰ E»«D<û­ì¯Ö„$[ãæ[=;Ñ591k„Ý#`TЃ©—Å3!,aýÏ2¡<´P¿Â„ö*9føš£@@¡WÏ„œbÆôx³ÐEZlÔ7CÍús&ûXׄ6NÉï»c““€žqïrz…7@¾>†Éy&ä^ò0{&«“ ¡|Vz's†?Eßð‘ ©ÕŸ¢gîT5%¶­QçãÇ¢éé ‚P9&$A*Ù AWµû*LD0`ð£¡j‡‘fäM:z›{5ž #.‘{pbW0~`Bé+¯¿Šê¥ì™ y™¼xÊr–‚/»¡óïƒøŒ A9´¯Pˆs“¨‘óÔÒ‚î‰ Adz£¡#A^áÄ{\Ž\É1S,þC›t‰®TxGì^^·gNãä™Ô¼ñÆ¿ ]ÎìÈ… ª‰fYµŒo -—î!çt%’Ž4VÉÍTÖ¾A~ 3Æ:cBÎd ƒ¡¥çK+ï6ðè0FÙdc¿OfB±²óíx˜¨f¢:Lðw’70ç©iÝàlnW.éý¯™_ ™Æ˜£橼_h$D‡,ºò·›VO•ý¦ˆ¯ÎUÎéƶ4íMyüQd\æ§ÇµQïþŠó÷£³L(ûK†rÔ–ÕÄM£ÀFû3äÜòŽp(¦˜ª-:rÇü²oùÆòöñ)ÌDž¼ä[»Žã•ÜxyÙæ(¹’²)NAÏðOdÌ uQ–íK¼™Pí,¤yž™PtaZz&Äh®ÈûÐ- ¢Ó™0OÍBo˜1Ï»cî­¥ã Ó\`•£šjÛïXþíöÀ„R™T”½ß™b)Ꭰu}ߺ¨ú ­+ë±.ƾ˜úõ=·0¬)òï×ZǹïômÆuÓ}?°Œgÿæy:²ª¢/ÃÆ‚©*GÎ@Oó8åV´Y¢þ¡ï5ÇÆ÷ Â:^:›’s[2Dx™ '5U¡Á5PzMøDÈŽE‡4‘ç>âjjvHHÚ©Ê`«M} Õ„ÄÎÙ61>¦jðdS¨å]üS›Ÿ*})ɇ…Ê;tW¨îzóã­+m•‘Œ~}¿“Ük¶÷÷~ŸÐÿ>TôÉ_‰‰>ä<}ýsPŸÈ;@ûÐ$¥¾–ã2}ÌSÈô¥NÿJºzÝÿˆOÒÿC÷u¹ozæõ¡³nÐâöµ~øH»,RZ'’ P±Ëë5[Ý¿ûkéER,ÒÚžHUK…°”¯+÷ÝæÎ-å´»'dCn‹¸‹n÷fãg?“ë4%ÿUDó-x9HhqÁÜößØ»²åFu *!±ï›‹Š7üüÿ]õiÅq’™,ã!s9U‰m- hi¤–ú÷1Ò÷ò‰ z½¶aD»rþãíç&…ÔÉ„Ž /Ûvœ ®¿ª¶L|Æšœ(æ£Ñ;ƒËê·m /'~ñ|ÚAŸ8áàì'†øo M“B':2ºÓQÒdØ–þ-¾ÒbàÄâÎÀpUÞ‰à€œöĉ¿Š°¶®Hä· õ›#ìßø¨q¦Ðw@Öuà=QýoO‹K²ã=ç褅6ñïðÏ™|Ȳ¹\šä`ga8qâÄ?ŒMŸ8,„Rçû®'ÂÉ¿A5µQÄ'E½`wü ßÞ€s sE9còõ%@ƹÎôãðăªèÓµ§µ~5T’YNøz«+廽æN¢<š›»Ç"ˆ~˜Þ;qâƒßð¶'ÉD\ÐYÐ-N¥þ*‚q;Š—‡ßDùå±e[?™óJ9¿^9$ãøgŽÈ4=ü=>ºô$ú ÏÀiÓ·°®¯à¼D9ÜlÝy<û?¯ÙùÛv¾fœ8ñ]¨ò\?’ ¥tν·’^ãÁ¶ÍóÐû¢m;àqm¿Z{í‘O&ôPLIe›ì—‘$µ÷‡'ÉŸo4"ò*ðýLÎ9ïwÂ\ŸfBzûiïD':qâ @‡z ·B/º–v°…«¯À¿þ°Sðô[»ÇN&ôHÛðmLè>×ÔNÒ•O€û•?Å„‚ôõ¶_¦ñ¿Ï„„:6ÐZKq Å}âÄOG¨ö×7)…'B+¥m¸D¸ •í;Âd“3&œ%9H·8 äÈ(¥ùÉZO!lâ‹—Ò¦D`´•àÁV–æ¿.“{Jþüž„æâ8µ½/«ÂñMʃ.¤W¿>üE;ë}åüüìßã*Má:>ÃâD™Ø)MkÁLHÔYŸ9ƒ¤ï“`O¯ã$²a’¦IxÏ„X0' ¸âPŸ¿Ûk쮉”˜ŠÍú$bÉåñl:N&ô¡OøØÔSÜÖjï6¿ÚÀ2!x±.EÒA€ÄÒ êÖä”QtÈ™$ÞåÚ®¯Û:¸eB±L(¬k%(y˜âÝ{Jx¨¾/ã0ªËÄ¿ARN­’ïUy’fÜqÌ# R³×¿gLHÕµéš+§ÔŸò²^hëÈS~Zé™è­iQ4~LFüI­NüP”ùN„wîm· K8zŽá¾8 â<£ Yx`])6žÚ€Ðè“Ë.ÉB÷S„ì=uÛÆTò(©èW%SŠ•x7AüU? +ñâ%< G0å)ž{VÛxê§Lü( ¥\á/S¸—@a].»8k6Ûˆ'€;Y|»ÖÛvÐs{h‹òï*a»ô¤òuÁE'œïçFXwÒcâák2n¥§QÈËe[Ÿ\ðç<&9çÒ>}5³uȯ¯Ü3!—0±>îŸû»·wSpý÷4rÊ9òù+ïˆýË:,5ûõu–¯?MÔtsAJݬÛØ4h²A:tW bZÖ®ÇlšD§2!¼ë–Iˆ¾Iñ»§ƒ?Û¥[#Œ¼²vMÆ‘çK"Ø1i<ë¥õ‚¾@e¢*ÖîÚ¢`›F–—½˜[“¡Ê×KÉä²1‚2½‡×EÙ˜ú¿4µ7™áCv¸²AEWlèã÷ܶ˜ Á -Zðê˜z1œ'”µ‹§^já¸êéäæÈ_ŽÔîM6}ÓˆSfB5ZßZ³%4žH Ý†ƒœg-ƒhòßÆÛL(àÒ˜#0í劇’¶ë cB&ìÂ]QÁo6alqdzÒìô­Ì CawÐͪCúÒ;qâÂß è)ÁáÌ)¨•>Ea¾ ¤{0Ó†‰Šb\(l¥"“::ùÌ3JQŒ`<Ò—sŸô&"¼cB6!}^¿Û:J˜—…®«;º›n¯ƒuñ"j-Wª†–½¦.›‡ú·ŒÆ r²nyÇMÈcSZÝrÔ³†»y Â2îÅäsc áj‡÷ˆ¿ 󚽯yõÞ$Õ†í"£½<•)- [l1£tm œ%]!¤Pµe,—%F3ßIV"YòÅÃÏý$þÐ(Ù˜Ð^ê˜uc«ðqÏ„813õQÞ2!i‚/˼sæã˜Ð´YHOÛZ T»– QÝ Ew?b2hKÿxom¹KýØCûZ¸eVθ=cB¡r\¯t¸¢¼¦1ϒǔ޿‘)rêªn¸Q¹YbJðŸ;AüÄÿ¡iÒm¬r ù³Q…µòžGè*ÇœÐÖG¡— ±¦¸Pø:J©L/j•†±èdÊõ®&ÔõzÒh¤2#ç¯A\˜ Gº2’Á„ ¥ÛŽè 3¡e›†ÒCFŸàšÐ^Ž •™SÚ+l&÷(×mž§2ïž ™¸œãZB=Ѹ„Á"ÔípX&$?`(4˜ÂÐþ5—±—òØ’ÄžX·™feFzíN0HÞ&l%>“?q‹¦¢ÛF…¸Y’¬kìÆAÍD©z… A0µƒE€g&^6á…5J;3‘Ë^ÿåâ1Y4Ä„JæÊ{ â±T¹bð$Ú˜”Ô!@V¿*Hù·i·Íi òv©*4³˜Ž#%%‰ Q(p R•þí!ݯ¦÷ø|••qúæö%©íqþ »¾³ C—Y°Vï¸Gds2}FYS‡-”ArZaŸø‰(Ð0ôÃNȆ3S  ˜/¬¹”`GÓdŽ ‘2(z¶/¡S¬FL~¹£QÒm w&¤YͬÈÚ]Ö0ѽê_2!— ÒðøCXÔ+LÈÅ9&ôä'îäØLˆÞ¿å‡˜P¾YøÒ2KWÏ0‰‚CUF– YGÛ©ÛÌUîESÝ2¡pEy¾Ç„ÊÍböR¾–­wÖ´[»ÊÚ6“y.÷@ÔK¾”|ù•K‹‰˜hÏ­Å4º …7‰A±­Å`êíóPŸq®*w–‚0’ÔkT«LS–÷Lò,”¢ŠqÏm¯eB¢‡yãs&&¨C¡ühUÝ ->'K­ã☠ä5&¤Ú—‡¯Ž A©ÞÈ´suëm‹óôû?—møü-&4vŒHt¦“¤—Í1!ÒÛ+Çæ n˜PðLÈŽ„9w éÁŒd~É„j—I ÓÔ:ºgB.îŽ aL>8¢q'øéM‘0ƒ²c6•O`&äÆZ»w¬6¤re>Ý2!â@aû.ªÁËŽYÃvT´µ+wvd÷Žùňõ¡‡!ƒ™X÷’ ñÒ–'uLˆ?zB ÁLÈB1£¬öáƒò ‹´¦zÕLˆ‚ÕþÝ3!®ðÁ f²£™ç÷™ÐszüE&ø­÷9&æ{Ï„p“zAQ}˜ Í9ãWL(¡ÅÆlpLˆð«tý;LHG‰oQEø¼$1oó¤¦á%B#~Ÿ a¼TSþ‚ ÝÈÄÒ3!*¹!cü°INœ0è¹1k ýŽ ¡S¤·LÈ[M›A“8&t·Ï ËÍŒ’uŠÈ·Q¼Í„”]á®jÁ¦Ì…ør™l§e•ŒÛ☶LÈÅÝ3¡ ÇÝ;†G}ˆ aýkGÁƒ´¹@Õl±eBŠ‡'½cRRBÖ…\«ƒ`ƒÜà– ¸Ì»«c†FÍ Lj <Š%¶v½sTlÑ@ {„<r$+&ÝßÏ ñ÷yÏ„ÈJE1ö9!U5d£ŠVˆÑ™VÍh~B:öU1ô;sBåÞuƒW™$ž›Q*¿œ#þ’É'–ÆðÀ³fbíß3!|O)ê£LÈëP5–þÝssÈòÄ„.X›Õ– ¥§Q%^éÞ°ç-&¤({ë2 î´< uÍG£&J‰51‰mÜ=’ÃF8îÞ1Ï# ‚0!<I#»m%+w`´Å/ Èõ-®ªk>¾Ë„t¾«´vEHîï×hÝ1…2·5€ÍN@ê= bÞ†PÍji?XJ,Ž‰]“>gB(¼l“¼Á„Ô6$Q´pã°*ÓÕTRìÌó%ÔÚǬ-›9~‹ t)Í$M÷Lh+2ªŸ2'RO7sBɘµ7LHÒeë©ï1¡&1äg ºØl3x A¹,Þ˜ EÒƒ«ÎE·[ϘPý")oQùXãýâ v½VÙƒWÇܪX¥ô·)÷á:ŒwL(X¹s½g'”rÞLèV¦Âbn³nDÎ]ô'~&3½ô˜ 9DÃ~4™eB˜:Úxãt´RMЃ6@gÔÝv{´"[At-)4ô™"ðÞ`Bä9ůrhªLx a½‚à¼Î„ M3—É2!-7z7kpž{… yº·ÙoIÕoo[ò~¯>/•@ɦªúë¦þ cež³jTzUïó‚{ä&eºƒô0מrª2‹r0$AåyeÔ(åŒò\qŒK(ýÆqüˆÉã‚&Š0âùéK:o]Å2Úë¸9nüQ(™î½`BtEÚDñ ²ç ú– EŽ÷1'¨B:Kñ8ß*<µ•o3!ÑXQ÷Lˆ£*{˜×°>gB‚Z|sļp°Â¾Â„DòiGxÖMÞëLHÎT`B¨”ÜÊ1ñ‹³3~nF‰¶˜¦„36ܱ=pçÉ+•]òH&LO‹bñ· •òS£åy†&úß<àPWèî@–çÔò¼…ÂhLJÞæ´ÍsÓP Ö —<¥Äï2½8[šÉŽÓ…Ž&;¬Âˌɦ•m©D¬” m ÎPÞžýNƒôQ9…Öí†õ‹K²¬‘’/†O“UâwðÌó‡K1’¥ˆˆ2»L,×ÞÁjQe­M^eï.¶Y D,¼òÀ!HsŠëF—EH*_qoäݧtïJRÞe¸é‚\ÊÇBõE°ÿô³£E6±…ÖRô­”×%“2ƒ£Í^˜™x¬…ùœ!˾¸fŠ¿c¢”­Ñ—%˜L,×D˜¸ª)®ItBô.½Ì|'+J‹… Së,»µŠš¢Wl¸³,‰L²Ê< {.MëµY&]VYšëù‡dñΖž>oÓ†\Z˧­µ]tE$QRk¤žM&ñ‘¼)~—‹/øÅÈÆàÍ!œá63vÑã>ù4Tß,ú­mgB:/ÂØrÙ߇rPrâÄÏ‚aBGó)…¡,\·ñ°V€4ø­ÔNü°ïû¹Ÿ¿éÿ¡Æ¨c˜ÑÿÛеϨŽåéì×ð‡2 ¦áÀï‹'Nü  EÛ¶9ÖŽ ÚFžaö‘43m˜þ &Á|ÿû‡&ëa_F¾ñä3¦כŰŽï¿ÿĉã1!ö5»uv'H6ªñyâC¸lÏ ñÿ&+¡?ÂWšmËÿåF.ÂÊIÿD¾®9m¤OœøH}0"d UÝz²:6úóœ”þ‰H›ìÏŒî*IþJGR˜úˆÕ¿|LŸP‰L?ø)¬#Oœ8ñ{g¶Ü(FaP‰E,b1kù†â¿Áyÿt„Œ¤{Ò“qbwqªºM@[˯O úÿvE¾ï±CO êX²öª_nZìСC‡žCvkÅC‡~Xdò'žF~N]9¨yÅi±C‡z ‰?ñn .û¡GI=ÅŠµ—š¥ʧÒð¥¾ö¿H†òÔw˜ŸC/ $Ïóû>w2ù²Îy¾ÿæ—¹«ïOäùÏ[Øg•øü.ÑXžv³ì—Ró(ÿ’1·Çz3¶…¯°¶²;[}]~曽’²7V"̲àn×õ $Õu<è©8(jÛÔûº¸æGê°(tèùå·ûæ8G_Ö p‡ò«LþÙ»ìÇüÏ/õyšá›6Ë>éy7°Z?ï&ÿM 0z‘¦‡ƒûÿÿíìùÈ=#W¿,ñn§k‘çµsÖö»~œ¹:¿Œ­x6²Nö~}Qëò“? €¸gX­óGöÐÓK´XU>”„:}UõABÞ7;K€ÎK¼ï½³ß¹Êý»”Ð×#DÊõŠ¹åKÈɱG²%¡¨^hLHÄ–ƒª'bƒß’}-}Nçâ +kïÃâo³‡þF)@ã#I(¢¯OO–mæ$ô?)õýês[ù¥̇8–<'äú™ð˜JÂí‚4ƒ8r‡.ìõb“½À%à,Æ@×^ Ê£Fw':¼ft2Taîb†*m"{RRâæãœÚN¼R±=)ë´Ü<ðÓ2’J·í]ZòO±ž6m€#š4Uâ Z¥çÈ‘P¢”dÚ® wRJEûZÛ56in´aãõƒßJñº gÞ­7ŠF…gà´y„Häé—V)êa+ñž„òh‹ÜjŠ©=%n7¿¶»&öeú¢ôÊ¢ˆ¼¨(ÎñiZ2!ý~(ô5–î9ˆ;)¿w^ÌÂÀIÚÚrÍCz»VLœ@ùµãzÁBëÒš@×Ã(s`ã“}Ò ºÁE“a·ži)šqsÓ-@UÎMð¹¿nV t43þÕoqìvèg‹¨¶^d) ˆ€‹­Hdj¬]ÑeüÂÃ%æyÀF“´XÕŽÀ>üŠ± Ü5x=^GP…à"‰ ®çJO¹GÞ¡ÿèŒ~'¡p¥%I¨ÂÝíú  - sz[¥Q]Ih‚Ñ`h µœÔÑÅ„)úˆ„:7©‹a´§èà9_Àæ°¨Ûþ<ƒÑÓ„ó÷– €˜2XÒ›žs4[ó#‰‚,à&(ÓL7¼¥a”n$T‘DÞ’l$”á‹7´ëYů („.&¶¸ÒÍ¿ÙˆlË ï!Š¾¶›ƒ+•§÷$4oj`¼š ¶¤§–Íù¸’?™®[“-ül½%߈,ü=òÉÙׄU~ôÄ «ó5‰—÷$ÔÁ*v$DõLR¯À Ųų€¶p$ÔÀ^Ðâ å œ™Q|®ô¯1¨wè¯UeÊfbpÈciòtx'6ˆŠ¾Rç(-ñtéh׋ 0§Ù c®æFu@ÍúÕç~ÀÛd¦ÍbÏV¤4<÷¦ì ­×ˆ5ïÊè.6wkßïå)EšÇ‚»T~’„T ä*-ñèhèúÊ 4ȱ^2²éŸ€.H2c候Y7D; UI<Ûdqœ‘Ÿ&¥8—^ 4Z¥<ÊDôèmÉŠÉÔ*iZc†£Ed:¥ÃSŽøÝ’ù!iÞↄ0èMs2Ùã„Ä ·Í„[ ׬ bj@· ½þàd±7÷Ñ- qQ›’PŒÒ‘Ó‚©Ëz ë‹…™và¶wLÀÔÛc£_“Ðx}‘K§‚ºâw$Tf€ÎKcZÐÓÉ°ŽÐXÎAX •åw@‘7WÂåÌq˪lш©\ÃÿüÛKBùÔ÷qK拓zj›6uèUÍNB»¢z›@§y[%Ðß’P }BÕŸ‘¿! ?ïH¨Š¬À[â8ÿ½!¡Ì’Йí ?KMk–|DBÈ,b7™ úõ¬ÓÉ{BÝ’PÔcÕ‹{bíѾi/h÷ɶܑHƒ«Dfþ¯ÈˆoIˆ³Ò; M{>Å)°äƒä†„Î@oÐÃOV Ç’‹á×Ò-–Ï’P§ùS$DHÿ鵆Iù/Îï$ä oHèÂ"aIhò> !Þð! …@i©µ¦î4á u€î |@B £è±Ü“HY½^c„C«ä„«Ò7cBÑ€<–îRDå;šïÆ„”•ü`L(\¨Å§JQ¡wj¥Ç˜ÐãI¨R7dqGB‰µÕ{*(ß’¢øf‚†µé€ôcRŒ&ßñ‚Skþs¯þú‡½3[n†Â°ÐIlf_<Ü0¾³ßà¼ÿ‹µúغ¥'Õ7mì`´ýÖY´ñ˜VÅeB4À^ hØÚøK/O?k%„l5£X a6Ú)!%™‚€^Õ@_3ÎHÖºBîJ—7ᬜô?RBòcyåD},Tö§JÈ™5ÿH %D¥V„ªK¤ˆÖ‹[Tsoäæ)yPÍÜð®•\”Й³WBÜL;¤áíxŠ˜Þ*!9‡Cì”P}¯|£„au!zÑ RÏÿÁHúŸ¤ÌõŠ±:g=¿³ŽÍœ6+0è÷<^x3`äi*Õ¹ˆpÎœWäJ ÁOÈ}ê7JÈ&¯ û2 ŠþÏ•™hŠ„ œ Ù*!®j¯„Ô°É>"€^fˆ@9RŽäŒ§e!1mesXÉZb¹_úe#A¬~œ»ÁÕr=‹ê5cFf—¦­]~ÿg±ºSBKÅñ1_Ô˜¸á—µQB°GliiBæ¦*¹()¡ úèá'„ŒrþâÌý%CäZ9±3qFT=_ qèXô™À-ÍþL Õo”žE_¼Î'ü\ ÙùÖq‹£ts@3‡mP!¢¸+¡ Çl¦†EÕ¡yt&Æ®ìëæÂ4z}^ JŽþºë¦ul®3½(¡@Hî(QnWYl•PW¥W!õü'äDvD4›á§48Í—Fœ#ù•ÕnMÈ´Dy}ŒhƒB·\̱cYOD«þ3œ/îȈðê.Š’¶BŠ„*VJh¹º¢2µ¯9g¾Ã”ËDS¸QBð¡Lš²Ý)!wÚÎ6Ó:uÔ Pš&´x ¶ËÎD®¸.õ$¢vvy§ò%¸ÿ õ}­ëž2ñŠDk3r­½95RÈœú½Â}¨“ú;掴•¯Dv­„ÐØ%L9®åÖ© Çi\+!3ÑX}¹(8ýbV€§1ãVx¦Ì•ÎRH„â莨Ç)yä>x+×JèdCñ–sÆ­l½SB` ¡KÖJQ¨y1¦S±ò×tü™õ|~)!<ÂQz»RþvWB¿sÇV-g²@ó,Ýó«$ÿˆ4a곕Ï4‘åþqkªzoˉ‚¨8¡BCwmÁE^æ÷ÍåF i¢¦ÿE×s!Ú5@xõ*ŸSð—æÈܽŸBT–|B Áîó !õÞ*ÝÐùné· Þ(!“(ÖJŸÔ[’?¢„Dq…=ÞŠ­âJ¼v{%)l×%CrÆ¥ö¨äÈH`bÅd£1R®âž'+ªæ™¢·°« (á5·†µ®DÆI÷át%*÷JÈýtpÄ““ˆ­2=8ÅbF^L›(úê~}±Äu–Ë9Šp‡c¬U®d鎓ô*I{ ßêg ?:‘ã¼WB‹o·JH]Þ:—1”üL ©›83à(½UBåÄýí®„°$KZX¢©@óT'æ›gnËIœÝD,t³Ç•„Ÿ_·÷˜{äoå5žjŠ;Šê–4[%¤ÒÈïí9–&M³ÇŽÏ©äÓá÷Ãf~¹âÞ“žóÀ¤iÉ9¦çŒÐÈI}OmÓóé’ÄsŽésfŠ4 qYŸO9o-ÏI¤»«;ç‰IÓq)/לcÚ¦îçüœ}_y÷n@imøISZrÚ{-Ȧ¬”¾ç–ý/4?HxN®ý„dTŽñ=•qI.8*ÊFqEÅ£h=Ÿ|‚¿4™ª*K©Êâe¶¡|K1õ#{LgNh´¥ø‘Õ¥¿TðVY{N¹ýF ƒAÿ\‰;2q%_ì&³¢Ð9¿Ý¬„â @P’…ä@g¶ÅI¢Î­Aõ *#›¸Ì•Š®OrF½ Ìn]'‰¢H gOÌãöÔÝ(£Šå¥·:ÐkûÜ­k„N%T’@3%¥î²p>ÿ–iñÏY c‰GáZ¯ô7©u,[$£¹g={ Ï]w µåz)’¹§£Ë/˜{1º,,±æ^lµ]ŠÄ˜ÃEšûhŽH½þ_¸,Ó”eã¿åz<ž¿TB…x&k8[%$ÞϼpáH>Ó¸ ãýæM{”¸gXŸÿ¤Ì]9¡Ub‡±±âO‹€Ç´ ÃÕ)êÌSpîÀ~û…a¬‘â0 ã=çë‚ g‚\ÇòÃJ(ùçó)¡?äV[eƉ&%ŽJè Æ ðÿS°ä÷â•Çãñü¹ _–â9œ±7܇•PG.hí«*!K3ïT¥_E !—ƒçå c^ y<ž/L%J¨b'ñ¢QË­…%4âýè1R‚1aøªnA¾ DÃM‹ãm›Š÷ñyl´Ÿ›,[ŒÄîoÇ#DTH<ªypU¾r‚Âÿÿ¿_¼÷‘ ?L)=z÷)ÇãyqPÈUJ;Uz‡UÏQ@ ùäÀ?0Œ•_Í ìñx<¯ƒ X ÅAh'„JáñV&ýV8+Â1Œy<ÏWf„b%¤J·0ôyÆÏ_ |®ødÔè cÇó|l):%T"Ãï§A–Aé¥Ðû‰›Wµµ|cïŽu‚0ïn ¸ U°P0 Á%®ÜnKGCq:QÓò ¼Kó¼‹!péçà™Ùÿ+ˆI´qíŸfÜô'“à™†vpƒD€oi…\ ŠuQ´pkÆ6ñeݼÛF:jwj¥ˆŽB ÷Ȭsçî–N™ Dïé.íÆÌQŠ(§¶¹fûnÍp•݉$t6B(ÆùÀ-´õ³dÑÁ­„HÂÇU·TÞ[ã‰èo @£?ðê¡×H|Gºïü:!DôÜ@ ž.1kaŽ0†OZ€DÂ!€´t‰îûGÐhF€DÂ!€DzY=ÞT"(@FHB!PŸŽöŸp뢌d€l6þJBöc„@M´fØC¯ºZë·K™2ný±¶.½5~#„øk³ì¡W=fÕ<"hÈž¾?MBæ)VÁ!€ú–=ô®¨Üv)6@6´n$!ÓcÕňBÜõöÐ+s‹n4Ð m­ãæ! ™GŠ¼odº!P«Ãz¥˜Ý%Š˜ä8!ã*CÑ> E4ÃÚ'0B@ˆˆa½2ÜzÝh0D¤«uü=u›1»ãÉÿÒÄ!€úuøõЫ(¬ý²ÊËÖUô<îÜŠùOVpo Œ`æõd™¿9ó;NæìVLÕË6;sˆùÃ?=¸X¢@®Ȳ±Î:ãÄ­y™Ë¶¶§YVïÖy_e Ó«¹„ı…]ÆŠÛÒ7H¹l;{@u…U[/­³ ⇠”ø$”Lœ‘:O‡Ô 3ñ¯\$™¦ãþx6"þÎU$!qÜ6´ÍX!»¥Ó¶¤zÙ–va(¿Îfg-¯£Xø‚’Ð,÷uÐ/ž¥.ŸÕ‰Aî_¹Àh˜—žSÒåE$!qÈLÙ˶±%~¡üëP „ø$ô’{³ê’éç'ž'Š.$!qVÖÚŒ²[:mî²ýÌZÛÕVi½@a,Ò“Ð(ß{©, %/ù¹T‘…$$ÏŽÝÿáHBWùe­¥y± §8†ÂX(¤'¡~^U”„Ì0÷†ãt\f¢©¢ IHž»T$t•Ù$´ ¥8¶Ù¡0 áIÈäXÆ%¡4wƉr&û,4PD! ɳaÖC$t¥-Ùq ›0Šc«wÆÂ!< MóÂtèB¹8 ™AÁ}Æ,M'FIr'=/•õý—ßU–ÎudÜw™&ê"HBðOì*HBW œ„Ö!Ç|ç<Ñ‘NP5ñIè7{gûšTððÏ ĵ ôÓí”#¶È‚È%7LF·ru#zÙígo«ebV[«Ñ EPÐÀPDQP-ÉÞV}‚êSßÅÎs½îzu®£–î\ÏoÌs|<×9æçyΙ\Ê2Ød"4!ebhµL×=O1õ"À¤´f[Msµ½C›1˜KæBÌ„ƒ:©`&T³Ù„Ð ýÇXƒPƒ¡o2g½ÅCSy&Ô7ŵ/KaD^gSiQ¼"yME€±yÌ„:ƒ™PÌjòéýXÅ\ƒ®« ½›¬)­Jß´™Ü„4´Ç,E›Óæ*&¤bTSRÆ&‹‚Ó{V1!ï,6![GdB¢äÑ ÍÆVdÁÇ<¨Áѱ òÐ\­ )‰¦&SžA®iZ2+cý 7¡˜|&I2HHD"êÂX2ìÌÎB‘`ªÅ„®f~ãϱ573ÇÖdÒcþ@fô˜?ÃLˆBœr)…bŠL¨ÔV‚ˆò84òôÂÄ jÿ>¿˜ðÝØ\ëà䮋#g»_<>;±½óÚËp¸{ðÚË‘‘ð™S×ß„î*&$â\Z ¯(‘ y\N÷’)ܼ«î²!x)Ê<¨áѯ ™ÓRµ Ab6³éИ{˜õ0¡Ø9FbB‚ËÝÖ¶`Š¶ù¼GDu´Ç« œ`Äб ÙdI1åPÊXÕšÚýc4æ&æ9%L¨5+MfƒÙÚF@LèÜéÔøÚËkÇU`B?R©IH Å>ŒÿKÚØé¤ÇÖÆú7f@Œ x•™…À6úÝÅš(õö”À¥V†/t÷ãÏ7á}Ð'to]ß¡‘+[xGüâ×¾kG¯ta/úv£;ˆÐõ_ŸÆ/üìû<1©ô 'ˆþÅi}LÈ/(‰ Iüb{ŽU^qù·æp&1†j‰à9¡mC=̃éÙ„,ŠØ¨çMc¬U›(–‹yN ÒôLC„€:™–˜_¡®n!”E0¡D(‰oáïT 0Ã1ÂêH®&&ô èöiœTú¨Y%·‚g4ádþ žT1¡?ì[L#eÇÕx{6>5&ÆëƒOÃHk €´(DìÒÒE \, B¡€ˆRY±»¬ºí*¥ÊÄ˦ÅlŦԥ¡"Y·é*D7ñ £¾›M0zÎ×iwè¶+%ý'™ïô|³ ;íüæœó>_ý>”5ˆ;Ëeý… „ÆTL()Õ”ä%Ó1$¤/ÃxÚš·^ODÆ( -¼~Ùúê÷Æ ½ûb¨»q"4<þæï„„¬HB/úbx|¼²êôšëç6„$$¢Y––Ãþ,˲gEÔ>ʘ/ ID¼SÉèÕQ¹(GHBÚ Ð\ e«T‚¡¶µ–‹2Ÿ+:¤au¤ú%»ØA¸wÜ°Ž0 =ûë©‘ŸÿLB8ó!a ²_;‘R“˜âÐÁ»H†hUCòd¦ãn’-#I/Í G‹`ìÂýñÇ{M9úŸCÄ£-g¡¹Å߈ÙÌgåÐÃRääp©Âòè†Î>‚œØ_†ÎþþÛªJN)“¼d:†„š„f‹3Å"QZNëõQ!þNŸsúõ_*¦¿úâ­™é{KŸ©\Ó^>ñ¢yþÍçÌóª;}¹MÇåœîn«Wëõߟé³ó$gkE! ‰8ŸÍfZ=K±^“Ͷ¿§sE‰’¼÷Ï«:Q„„J›¨/EÜA­oôÑØ^i@À>Ö‹o™L¤½²ÔKÇ)&uh êPÓ)%‹ØAòDÍ‹da³Êá= î"7¬#LBÜ zX:h€U_Àö äØ?tS¬Ã‘$¡¨S¬àÞ0ÝÜuBå1³‘Ãïl€*nØ£ ÏØl67‚ÏI0Ølë#èb2‘ ¤Ê~ƒ71$ %ðGúcÎLhåáÜ&ÍÏèKΨFçAç5BB|øÔuB@o¿ÚYÝÙ²'!ÑáîNx`$$“dçQû¬\ ¡dfÕ­$¤Wïòd'¹…øB˜®w^ìU«íï\ªúiú˜ç+È‚uýðûK*û»KïþòOBæ–W*–\£¸u¶Œ]¬8ö ŹŒ^HB´Ím3i܃"/ìmnÇYê?ª|ý—7yI…í†+¾¯hÓòËKúï»!/†USVöÚCÓ'. äœ>1\‰ÂÃ_?|º¼wi=sczøMH.^9gzËÜõÊpÅs}Û†ƒPÍúæŽ!i*”´Bbi¬ÔÀÐþGÍd> ›5îøº F`T±?ÂÎ Ïó6“ÉLÇ¥ m ÅÏB^L^ñD H Éívÿ¼ üøÛw&ˆ ò‰ø IèÁYd]#!¢úôÆI¨úʸÓâôëòþ•„–-£Ô!R\$TÌX<S« v’AÚžI¨‚B™TÒ*†„€vr¢\'*nŠÕ^‘)™N(&dâX‡Û1!vP2\uÙY9’ u¾Ìzª¤|B©Ô¥-8§”ê¼þ1%<8Ȭv£ À•²Ÿßð×Ã$Ë€$W›WdmU6—tjóÊsÉ‹ÌÎO„„ô@AW77{åT”„r® w»FYë‡ÐK `gÚ@O™é3§NñÖ©pCîè@0?}fD«V/ Ÿù\¹ !~ˆÙ1-F—Z¡GÁ{ݹ§/¯ÿËžÝ.„‚QƒRÕAɨ“6 ±‹63·øLj ;$´ø1ž´­s环4°t|J‘ÐÑVb=¦±Ày]KB@.X}°+ £vBÿâ­1$)²ïL¨õ! -ÿµ ý5¶+ üúô.OP ±¡š’þ1£*ð{~ÎÓ˜Fn¹%T'š—=®Ùš «ÒX—AˆÒK Q¥iñ“PZ–uÎ_“eÍ…ìE©6}¢¸µY/‡zkqq8f`ü‘õ7‡独à“‚Âb¸ËÉp”ï·–Ámm¦õÏI•ÅÍûœ ËLîôØPœ¿<&¬2A+ ·›£°×\«*šwÖå > ¡ ú†€…iÏ^ð8¥5ý-,òëÊ<–Ó„\5˜[Ù¼«æÕ@U‰ÂI®:C ¶Äj|Á`©²ãì’DHˆêûsss³1›Š(ç‚"9¿"Ù|}iàëKëª}÷ÅÙW^‡)•D¾ÁÌYèÄ[ß‚+m… ?äIЧMAr¹ ;|v¹­ç•nÿhƒ„`Pj±X’ ÙmðÐm[wÿÎKB#4XÐ$ÄymÞAú$ÌvttÌv`sNKôtŒR$t´• ‘: U, aYÌ"$!ðB°Qáºz€d¡?OBBklv ˆ„$”¹üöÎjÈÚ„‚ÏÊ ¡—í!¥6³%ä„ïvùä†Çyq¼ñó ¿¢hÁ5Ò fW]×E¥jlÅi ê©QÖ¬ÅétZ”é‰Ô =?TQ¯~Óø‚¬AZ7÷$Ë”N^4VÀ0þš|òô¡ï¿À0Ìz¼ûM~ÌHƒzìi{I‘ýÆRûìó-×”îs;Ú¬sNÆâÚçZ!Q ˜JV]OB¹OR¼Äû‘K¤PH¸vÌk2ùp혞.4oÆŠºFBºW_š‘H$j°Ôj ¡à—~½!ä¯7„j_ÇWáST½T Á‡F7¹,…ÑòÅ—Ë®2;/!’ln^­ H¤íù¡›Î `",ëô¥Ñ+ݞʋÇ<Ý74Ö1¯¼hμ2]1ýz”„ÚÉP@B—Á6HB ]3† H¤ á 饢AGEìY=ŽÐë\˜„4Û’ŠsÚêæmyx4‹Œ¤ÄiŠ„Ž¶â&!nuã ¶y{Zgé“BBÇ—LÎáM“pïKBQ+ fC8ˆ8@™4S I(q ³cΡ g{ƒs CÜ j ðšwH–=Q:¦tñ²s4k†XNŒrž¶8-MYT¢$„}Q<Û3U™öÜ°¾yC=±T˜PU¶¸¼‡©Ê±3@7².¦]’-ª±Îøëeé’¬¿®s.¨“¤50o¨3³«çü:ˆ4ÕSû*L•RÉ*eYì"úVI4Üu]Å´qÏn´ø7 ¡ä,¥¡Ðö$„1¡¡2-©’-¸tÐÁwñ…A$0Ÿ·´ç M†\³ÆŸ\ºyÿ©™ÿÔ”¾Ù‰‘¥h¼Ú'§$”Ù\£†¾Û< Bû*¤ç§_¢B—ÖøÕw'.·© AeïØ+Q2°†˜,Ó AW‚¾Âg ;&!µZýý‰3*øOÚž‚ç§ø•7¶AH„±, ܳƲ'5ë,{î ‘!ÁBë;¤;kˆ|¶S$t´/ —bÛHqO, !­¬;¶TL£Éä[¹FB¬Õ“Ya“{+ ¬ƒpèó’UôKÂ3™þ0ï a?Î[FódðôŠ_êßâà5K„„thæë„^]qu¨Š„ž,dœ9¢ÄIHÖ%­éœyCÑ ­¡€ˆj,S­Ê€¿>R' £{R²¦V-‡‡|¿²uÎU÷$¤Íf\u¤6¨¨…ÌÀc0õíïʺt ¡Ù¤­™ÞJBj%Ä}rÅ|²x»Uô{¤L%‚53ÞUÂBô -,Žvõ ²cª¢±9KP HD! Hˆ¼pÆyK-Â1!äa¨L;Ï4I/H/0U%d¶"1¢J²å”„Æ àíža‚7ØÁö¯t·© Å$V ñ ç3Op©zU,yNœù5 uW†=× œŸ*ŽÝ Å“Ñâ|ð©¬#6j%}$Äz}^ÔA¹×k†4„Ék2ò­ HÇ‹ð¸íðzmë*¾!Åâ?¬):ÚJ€„~Fa'ÅXb¾¨9JBèN â&6R3$ðÀ9Äsq^ ±®í Èá[I¨hw˜lr†”FŒÒZŸ†5H‰“¤Çª&¿©*A¢ KÖrI ¤µú U¯Ô¾žiU¶!ä”Lé¬i€'!8•‚'!<É>ÿŒÉÜRh›ÎŠÆ\É“"‘XR<{ã!!ößš1=? õ¹5·†ƒÃU7£‚à¨:-]Ò™®r`±¸|~©ê€ÄâeKUÆd ˜CB!gm ’Зè/‡k*äÏ%˜½°T“— ¡„$4±2þÔ±3}ØG€nñ›éâÐøR£ŠÎžqÒ=.Ìn¡zœm*š¶‡ž?6 FWôo…aå€j,0¾4:SáTÇ^¡ñÐîív/ó?a۬܇Êè”’X쪿ì½&ŸYÃ5(‚µc³bÇáMwƒóg4‘~hwJ‘ÐQÓíwÝvcÙ1/¤]½¤O{ðz[ GzpŒïùÖð󙣗#p&ñA¡"CÿsáùŽ­V/\ßqÒ…1lö98þßÝ"á}BBPøY _ó~õ‚s4ã|¨ñs@ rÈŽ9[,>ï„ÄhÙÓöu@JÏL£n„„:g‚Æ¡š<$!ŒA,#-M,Š’Ð\@§%X.™žqµ1µÚ4pé’¶gwI1¡ÿ„°fÚ˜¬A¡í~mc¶57§´065ö¸Ó/…S½ñ¤Çô ¬³ r>÷ªœæL?{9Z½jz,ÌÓO¿¡î H› hÌ8»â×5¤³ež^qÕ}CB²å‹/öå! et[,5˜÷¥g—/žQÈ`vÀ¯‹—„tÊÌ­$Tøÿ.]×7dž‡:è”’WƒŽ7ï¢Évå"H¾+¥HèˆéΛo¾ù¾;$t…™^Hõ&Jœ„€œW{¾!`y:à7„\¡·ê«7œÒ¦ºIض^hZq;¼!!Ìya‚ê„$Ö¹`½ ªÓ%iyF‹jµÙå-Ò:ÉØ7du|š$ÍhÄ%gI†¸GZ—ÑÀ“ ¦k%Õ< •O¨åý¹Ù°ü9RA¡X"R# íò³cØòÏåUÑ;i¡â%E«ÇÊî'tÖ=âô˜.û˜)¨Õ—CÁ|A] †jJ` ­Éïï)€ã"{¼šÉ‹BU·´cK!å©|œ:«æ_5êò«5ù22;îUôlYq¦D åAä§ÔBšMU %¯¦Ç:|/"®>.z \W96{maŠ„Ž˜n¿u÷­‡™„Îy!Ãk"?¼±÷$ô¼½¬÷¯*ñ©µ¿…‘Ö•`Œa¦ÔyåöXü¬ ÌE[aª g,LÕ³Ô!PB$¹Š%¨‡²*€e_P!-mzƒôxél±HkÕÿ°wn¿©aŸÝÀrmY(^HßJR4ˆ¶/‘âuE´{ª¡‰F»j=J½D£‰FªQk4Æ[ŒU飗ÄÄ5>x‰sâñ<ß|ðŸðû†…-¥Ð-R`–ù%ÝݳK¡´üø¾ofÞû$—…·/6QðwµlîÎ ^ù1W]¿ó†û~ÌÕ~þl Mž¨®?ô†aBïý|òÄ#Ÿ­ÁîxžK8®ÊÛ" ùƒ\¨¶¹aŠÐ‰ÏOmm­`¦¦w*aiËLèÛÝÏÂèùg!é #ˆÁ„@WBk,LŠù¡U,›á¡ª;6–síTê6$LÈf8‚Ã#® ÁâÀ—P%Ý#ã¼ëu¯oÄÝýX{÷vn½¶v~ä¯U+¥+Ù² ›ëw”q‹•àìûl dðºMèzõu;ße«w”o-àYW<õîzõÎKñø©bùᵋwpß ât)Ù|ñ (C;úÞ·ùÎÔ‹kÚ‰B–È\"\Oƒ-+Áš¾yùˆíZ¨™¶hB»oÞö-Ìú,øæÇP'48Є:²[ÒõU}Íøº„`xHÔM'%ám¨$LÈv¸}âSäQ5!,2b¥A„z\wìÂŧ¾Ã Ö ñÃ¥YnW¤::;ןc `½ûë©­¿_z~ç‡S°®Ä]ÿ¼ð÷c'7~}–Šøæ«—·^¾ýñCk¦«VM誳oÞvÛm_g°dèÑ3éÁ&Ä"?6¦˜a¡Öò±jå|\d<©áB£iB „ õjBOmdß_»’7Jop[4Ý‹ avlåû{ž?ñç¹uX¢\:3æà¤ÉgJn=±¶º kF¬ý+JZ3­[4!œNèÌ™ù„ÒÝkŒ+Í°P•å¸M:O †Ýv´¡ÐÔ”ß<Œ‰ÎÈÄáÙèäÏÞäð4\¨iBÚû0^&ôÞæskWã¾XNsÄ"N4½”æ0¡8±ñÇ©­· ¸Üúkÿ>XÚÌmõÛão×—}ƨúéÔ[7*[4!ëŒ)°n$K+ BTW&öÂM)uÆ ¥$J©›XA¢È$×vè IŒól¾Ø²6ž&Ä+ËYàÒ4€ õƵœ{ÿƒ/¶VVnúó'Wè/ º·aBw? &tè2¬EaBAŸX­A!Ä°¡*šA\áúÍ¿ ð‰ NæDj,iIö¼”Î:œ1"\Sw¡óØœ á42¤{Lˆ[xÍõ–Ó×îZ~ýï}ìž»JåK^?wÏòõ·3‚ã“°¤5ZÍ%aBA¿¨4‚B&«çÇ%“ ÇKlƒJi” >JdÝ…O¡4NÈlZ‘ÍC–Ûo5Úî2hÏt…Є€ÊЇkô¨:ZûVdǸ†åÇ iîèÉ„ÞøáôéÓ/ÜþøýO>öý§'Wÿ:u˧_ÕM(sÿ“+ßö¢5bÿ¶k„‚¾¡WÛF"¤ˆìUT©‰/lrÄ(Uð ÊÜÆ ˜¸§btÎïbߣ›$êO 6cBD¢ èÂ`7*ñIšˆNžõ¢eø&)Žàa0pù¢pM¶KØ—œÉñÙÝÀ™ š€þÅB*«›sˆ ]xéráÚÑŽEŒ… ¥/Ër9¿bO&tù'§é;7½¨ØKKd°éö§amˆÌNîžÃL¨œtaBAß(·MO‘"ˆì ûL²Id(B©¿äI8Øw`BqʘöâQ˜U% y‚R§™U› Є‡4 S:I‘‰n <Ó”uà©Æ­~P9Ú,2rcgvx‘'F‘97,ó•\hh½tínB\RØÄHÄÆh‹Ð˜˜[“~ý¢4g€ =”… ×ì¿`èÕÖ PÊ̦(ª)Cv¨R@=ÐrPR rB˜Fqy¢ 3.lfåÑ =“t’4ðCSKô&ŒŽ …‚1&TÉYפ4È.Ÿð…a; ]S¯2ËbPJgâ¡$Er%è¤âRð^Ë|¦”o.ÂlçâéƒLhá¢Ë¯Í¯g¦ôZÀùk‹i¾® ±‘ôÛ™Ö×°AG´a!=c’"{!©AˆÿÀPÃ>ò¥ŠaB¨-ø°<”ºAU¢Ø%J#˜“9µY Ä¡*›&„(†aWÀô—áRx-&>2¶ù5ÜLâ¦Ð„|õ>nüIÊ<[.²š«“/Yú u|».÷«õÕ„/[ÞØÌ6àbìö˜˜P½T(?âº3¡R(ÚÍ„…-§ tG³’eÐkæ13¡2T8Y2…Ö3I&4C~ŽU¤Ô馱0Žâ¦¢€çh E)bšvx1b¸”'˜Ž8)°G=’$C×@l:âFCRP®êý]xQãn}d  µ¸PM·Ëø±}—›Ù°Ë–6jY€/ênB#^ãtÄR!†hBæ(%»˜ÐÈü»ÑÄ–ÃmÏÑÀöËeó8EÚÝñfÅ×I2/¥1GÔ¦iBQÚÀ‡ƒëU‰&!fä‰Ðis¢ ”§i•Rw'Âtr.ÑfB¡F»»›&4C àâe¾¥V©ËÃùt¼÷ª/]˜^¸tK‚öÁI‰îb7*ø\¤â`–²Àrš#.Êë™áRÃ1MhØ¢¼0ê1!Q=$8„T‡YŠÔžãBI0ž¨HÓ„íq2 -J““T‡‰ÌÑætÔZˆÏ–N&”d1$O› áåÙ5üèYIRowaŠLiÜí@™Ï4)Ur=3h}¼È«…Âf¶ëÌå·¸\è’ºÔóK‹ iÛ°‘.KóÂÂEÈ+—r·ühÈp_ »žÍ40UCTïø!E:àŒq!Žsdà01˜¦ H³®¼Ð “:žºÀøáDWgš©ÇÚL(Êq4!y,Ìáˆ'ЄâFªÌIE» íM’Um7õô®^X*Ô8ˆk®½|ôY*tÕÓb¾°d#®ÙÞÞ~€›Gtma>;è]†Ò?ûíÇgŸ&g¿þúLF à™éˆ+,1‚NÂ) #@Ø4!G|FõͲ² ¥>$ÞÃ$Z#g$ãÒ…~rGòƒåxÝm&„™8¯ÛÏ*©UÊ`!)y†ÒÙ / ×,ó™Vô‘ u@;ê-åR¨]³½ŸòEÐ :èÅŠ¨} lWx¡¸Úú<&ºÇN*]Ö{öëG‡‹!ï¤H† Åy-°ϴlšqÎP$¦¢'ÍÕ+˜§0Ô@F ¤]*¦]Q֧̈́¼ÓF;&Û0/G'XvŒxê¤Á2ŸÙOiO`¨”q´};+°Š(“ªÝ¢_¶ Äd<Ã9š±iÛöïú&媞²Á"2r«¯ 4! .äs.ñªªê! ªâNOLùUW]qTÕ ;·ªîyx.Õ?5¡Ît6/‚ÝêWRTÄÇŒøC2¶`ƒLŒkC»Â®ä {Q³dv÷p·A/0ó\a„³dZæÿ°ZɵP½(ôzÝ‹Àú˾d¯§L³²µÔE% ö¢íÝ[1¤•‰ „„ø­²OFËŠÑ2LêBj#(C½‚…P&¶;Ø–bí í¨Áž2þ×ÍÑía‡»ðFŠŠâ“€ ‹Ž@Nû¥©–) ùL'ôŠ© <Î>­uyDµª¡‘§Âõûºf¡Cß©ˆlo_gÚ¾­­Y´\{×mï“Lp¨ÂmáôPÍQ$$ĺ ±J'ÒŽew|´D¹ò¥2lí•J°#UþÞ×µþŸbýª\” ñ}áã§ìáø_)bEB"°Ž#$ù¥øp#ióÖü© 02¤u®)[+ŸŠ\‹<cQìÀÞ×k™q@;hcá”Ö~¡ô¼›·~ŠçàØ믺±„—eÈ—¯î=hví{ ‘ÞK’´NÍ¢ý?öΦGi( צÐòÍ”¯!ÄHÜÍ,\XEo„ ¬ZÓ7&ºp‹ 6ò£ú3=çp±S‹•Â8´xžƒôëÞÓN[âÛ÷Þ¶Yœ2ÿšù¥8žÎUv›nʾø#fÉé¡7ePB)øŒ&Ëz ¥8_‰oß$´ç}»ŸáêÉÅ‘•à9ÿ:ƒ|LQê“>Úíyû?Ÿç?ñï¥Hu7Ó'*¡†ü?J ‘òãSæZ™¾‚\KìÖô‰…P~¸ ‹ãIù–ñÈ09â¥Hð\Ù#¯Z }x.ÞÿէÀ}ÀOŸ?¼ÎF|þôà `Ô ‚.¾¥GÐàâ[‘§øî_øçàxÌH§„´|Út>^¼aXVѸ©L”­Ž0IÕ µzGSÀëõÎN U, q˜ÕZÝÒ„iueßê`­j­@µBÂb”¿ ùu!h{%d´êõ–¾_^ªëa¢§á¹}Ó…?wlŽ}QƳåöá&m½©}g;¶™ÜààAõΰ™DÆ[<ým†a‘g":>WÈyÀ9Ò•@ŒŸ½E^¿—HßD2@{€JÈ’²³ZR­§ hx'´önF)º/Úa®Ê_º£5î”5¢êå·„o¥= ÏíñÑAÈÄCé2ß.W¤>ÆOÀtµ‰¸TëÍŠæÓòß?8røñ\`B¿¦>|Éa;.°²ÃY|Æspœ©•¨ä¦«‰ïºxчo •ЭˆRŽš]5„¸‡åMPC1%ÔS ZÕ.ÖjàìÚ°ÚÑ¿ûsAþ» *!ʯwaÖIJ¨ ™ …†Aµ-7nv‰nvàÅ<¡1|Âñ1 ” Yƒrì§c VÐ:ªÇ<'º±Í¦PNÀãEG°Ÿ´}ßfÛKü!†'9\Ÿ0 s镽x£ª‹ìcJùÂÄÇ€”ntGÊ& ȳ)‚4ERý¦„°b£ †¿ú õä†ztG@bÈ_²‡Jˆò·`0¨B~¬Û‡q½!{¤„n`¢Mç’žŽïŽç¯ÝóÀ÷fÿÒ¢ÔΊDPTMl$¶!4‹¯‘óµ-l5áú|ð’‚”>þ,–ê,‡)‡wÇSzBD+'íc¦”-!H„èØ:&€y>BëÊ®h©åÍß”j›r¤Ç4ÎéöZ¡¾«¢õåH,‡J‡|#])­Z¨Éå¡:*Q—ò„âzèaû”ê¥Ñ%¾·šŒíGg>ªÞL\wËÇ.9ðƒ-Š$É šð.ãàxrOˆÚÇnDæÙ+¡{T"¤„Bõ‚D»!ë'®„Ð8*F•Ð:=ÕùG¡–R?:)!¥°(¡f}‡®òÄÅÉ’'¤"Ta›Uœy@’h2MëÇLÙÂ[úÛõüPÒÍb2Ž© d­ÃžP~X-áPÍ\€Œ-ßuŽÚc€‡ý͆9g"=7¹xÔ´)e•[y'öJ¨ŠóhQ;4·Q›4”îšÁL1”²Ž tRBTÏÀDÙ…±’&RM©ÒàWëWk7¯&ô[XITQÅÅɪ'5o<²‡3_[³ô¼Åb5›Lg êhâLf«…ç-—ÄUUØ7{/‚« ø9/ao×ÞØö•Å’h{ñmÊxîÙìM¡1ü g|¾sp<½'D÷U3ÿP!og/ ûäÀ(%dŒ@¾”[wRv„ß½r§I÷Ž•áÛ*Õ%*!½K  ƒÌ#«,†Ý–!ôä0îä APýz¹…‡{%„>ÐmµÔÚ­³iŠZ±P•Pëa¢{qˆŒzB M'ª1ëq™~TVAì]cgî®WSu'}ƒÀfYnaOMç¸ÇpÊE%Ä0Ìy<'`åÁ2AÜH¤k(%tn%B¦%‘QWöIÖXÁ¤ÛɈ*©yK½{pÞ“¬ˆe•«&”z* ÎÔ›rGñ—Š'Š“IO(¡"o³=_Q£Õ$"ºNò„ø 9?±ë/ì¸rqœß_bíú™B[RDì qp\ÆFL!ì'tÓ•²‚£Ý¸WsÛ _–@: )›f».O ÆC«Ñ0a¢Øáþ¥/`¤¢Wa)ÕÒÚwawê"å Ê߈VíÊÛ^±Ñ(ÐDtÔ}FïwËU¢N˜(F&=¡„Bá"g¶ò¨Á+(š¯·¾ê_”¼’߇ì]ÔûW1 \ö„Ž`{i3ÙI ¥ ¬l†aÎã™8Õ*‹l³ë1mÄ›fèb®‹ø¸*­í5±b¢kÔ#S±Dq2è %:¬?°/uZn6¾¿}ˆïû›åÒó°‘3T‹d:Õâëã<àì…s@ßk>€‹Í~om§sRB¼Ë88.á =¦)¡G§'KKô=¡äB!i\™ÄjGzBì]c/ÚFj3É`û˜Â§ï…Í0Ìy<'›B¦È4ÿF YVÖý[O(±PBÚÑálOˆ¯ŽóÈ8úR¹‹oSöcæFXðYÏÁqOHÙ¦P±Ùìˆÿœ³=¡äBR¸2‰JëHOˆ¡k€Ù„=¡”l\{B ó(<§ÑÊǃ¦ÿsÎõ„’ ÅãTåkVMƒW➢R«b³fU$„ ¹õiŸØ…”Ü„Ü3!ðQ…Šû@úöåÑð'$Óa!j6¡& u”-"‧A&DŽça-U¶MZ³Ö„¨g±C!GJwǨE§ÔMÛ‚ÔH&$l)÷Ä„2òxŸx ‚[&v¡Ÿ=æªhõTúÚ2%*'ÄJ‡Šdp;ÀA[ŒMÝ1¤ÞXgBdXHàX‘êÕ‘Ú™å@ú …t¼”Ê(™°µðÀ—Û±¾?&&$ygBš EÅUÁÊ„œdz® yh.cB`´C…8ëGLûl;\Èx‰ A¥)¤ ©LHØZøÄ~7Róly ‚_&¤¡ yPTnR‹Š±”ª/£Ÿ.™Pë´ µqFWª³´"ï„ !šI—„é'M¨“˜Qi4•ª’}i°„MˆÑÊžK3©LHØZž‰ e„î=ð)!¿LE~}ý§Z­°ƒ–¢ÙS¡E’ÓÔÀp“kÇlžHT™*¬œ0!;WIe|·K:*,ƒVUdB>ýФª¢ ­µ2!­M>ÆîS!™°½¼ÊÆ®dB‚s&šmwÄ´V§» E$3¾FÎúœô¨›Å&„=EþÂE!Uá„ 9h;%'R.è´Ñj<¶r#E&T ÕZ©ÎÖäâÒZ³‡e‰ ù(dŽPX”É„„-ûc÷b!ö÷Ç‚ \5ÚXt²N€ ì*$òqÒ)%׎5ÒÖ ) «pÒ„ÊEt ÐP ’ ÌèQ­Ï׎9¡"hCkGîÊ„Œ?KR!™°ÍÜÊÈ{É„ኙÐF›€áU=c™^ùÕ†Œéû&Tl[çqB4[F3“"˶­Õ¤Ü­z&/v”K¬nµkmÓ¶zË÷`ÊÞ²ØH37Ïå— ÷fÈD)äÇã;ñe½¸Ö¢?¡#p/Ûx[LHØ`&“ájF2¡›P*7vàZ‘)Ú;þ2ÆŸ'±p]™ì ã"Òç“<Ÿç/.\:zñãòãúÞ£º?›ŽÆxNg™T蘰±Ì¦$JÈÙ„J®׊,™P:?#‡óã~¼–ƒÁð`wððœ}É’ Àâó,þ§Üê_âýî/>ÆÌèÛ$ÕŸd6º?~ÿþóûÑ…Eüì•Ùx>&æ£L*Ô—û Éd¶˜æóù·Ùâ‚/x»CÉ„þ³ AqLJ_=šŒÆÇ äÛát²þS÷úÝ«_ß>:»âãó§GO^÷4³ñô'”#OñðJòð7;ç÷“TÆñ›jë¶õ—œ˜ÔúáXüpéJƒ`f­AE‡DHŠNíÀ˜tè‡2`´Pl®5Iak6+gg1»©¶ÚÚjuÕsqÓ󾜀BË~Ó:ßÍxQ|wÎyÎûœÏû}Kõ9ÛnüïïÉiT–Êc‘o}Ä2tü°^Ù¿¿yÙ'¿^£).=ž÷ óš¯TÈ”Çà°ëU…lJJ§²÷=üw]0A‚––¼À’l6çƒIŠ[2)uÜ1)Oè'µjUýþÙØ’s$™KòY¶*;$Ë®vÙ'ày¬î¹ŽvòõˆISSÓ¡¶«OLß2 )AA"ÄŽK %aTàÊ4«¼#¹ÚÕüÐRKÂÊþííüpÈéG/­ gÝi’\]°pd.YêCKesåý]y‚Æ‚Î\2;žÚ>ƒíÁý-KWÆŠEðƒŠÅ……Å⼦|ûƒé+·/ÑÙùiN Zu¥TÖWŠ@ /Á²:ŽÁ*;µhº¯9åàX¯š~ºþüA­ ý°ŽéO ¥”&IŠÍ§å>Š¢²?@U7ù¡Fþ]_ÂÖ)xB‚~•'”fß²¼²”¨üí±øIš¡£ÆEIèbüFam< yvûÐÏýqñµÍ"¡tŽeÁyó;0Ã0t`ïò‘ŠªN:ŸýΦXŒ„†&NÒ §¹y9$„ûÐXòY–*Tî/<Á¥»{eµ$ô%ª(‡ 'ˆ%äy¥1^CeºòMݤ¨%!<¬+ñ$TƒBW&`™éÌ_YXݪÀ6¶ÃHÀ «!!ÄjXd–?8~‚ÁçÁh ú5Ç-63€€x’ž?&9lÔô[NjTÓS§ôòE]ŠJc¼>,Ì‹Ë·oÂÕxþ5cÝK8ú-WMÍø¡Jwý´3Ë¡D]¨DB¢t’HÐn¤rÑvXfžƒz…ç Ö.5!±6ʤ±;’=/ñ¹à‹svpLåônÔvDf{á×C.aw"蟓˜#ó¢t·¢ayQ…œ{6 îoäW"¡Ø®FÂq°”=v±\ÕË¥`…Ÿ‚• ¹Êbj<¡ÿ\Ë÷„’9(Èò¢ªžTW6¸:•#:32{º#Sm%zóTÝ…Io«5ã!†y8{"³Á6öä$òýia~ŸYàÒbô¶BBvT|:ð4ÁÌú<Ãð†vm«-‘&“hû•†qu%>¢žÑyeÒé0“˜˜óknãxŸá"Ç…9¿ã5|ËÐÓˇh›bè’·†„Òéaq,~ÌW,¦îÉÙžsN¯¬ÏíŠE‚4ãô6 uG¬gŽ?euWÇk7x"׆OÞþŽ¸0Ox< Æ€„ª ÂÞI(Gh³f<œ€D$ôi¨:Iº¦g0u}”ÉJ$T 8x äßrŸŸD0l=ûXí;Õ+?ð{}­Ã m8‡s1ÉP°Í ìwÁ%D o•£N¿Ð¾'è_“˜cÉ‚z5(2ëƒä‘•½á9/öxKn·‘¤X&¶—ñ ¤70A«¾u‰ÎÛ<î¦7Ø[Oè?ײ=!q|K–•%ùÚ ÚP:%÷BêÞÏHH}KíWˆ„tw%§õcaƒ)¦Rc‚ Cö„Ñ'™¿…%Sò*’î ë®ï1Ê” ™Dt_8Ú’¹ôè¹Îvþ‚Ó_ëGã>1Ü/–®2\2 ût(°­#âôŸžó÷…P¼Kž3%¹71Û›I´ð‘cîèµ 'ákª·¦:Ʊ,?§ªIH ¨2T"¡—á€v_ÜÐ["!ý¨ÎÞ¾y½´¡á@ܪV÷ˆ•£‹ú<àOñý<¢ï=_@ÄƵ/lÕO‡¢7„úøáÌÎ610žÿ€ÊZÕ# !qwz%‰|¶Š„u“dw»tÜ}kƒ«%£³ogíp!6ж›*CoC‡ ÎÐ,. *Çݗ¢vQUoU@A‚¾­$ rKrò ÒÔ³‚œ/£Ôƒ‰VÀcÚÛ£¡$è\ˆîckd‹$„ÐR*5n^ôò`Úe¾¹[-¨ MS œ^Dï¢o4§6½‰?ÌK×xI¨R$!HBåôO ¡Œ:}iáV_¹¾|B#ÆŽ˜8zää_Æš‘Ó¦ ´gðüc$ÔM¿LBKrUe¿s9W–¹œË®,·9[ø-#¡ÍëÓÓ§4³×V3*·e¯I˜O9þ·%¢OZk=aøFÇfÌœ>õ¨ÅQ¥/…A[n³oº ò˜ž’þsÓ‰Û]<±<Õ/^¤+MÁpžîïûz1O(㑱dÖ%~ç,°–7ʆWHÿýÅ^î¦ÜI(¯"Ýt«*{½ÜŸgѱ5&êÉÈÛ:R]\1=¥°:ï ]޵⠔{îºéãׄr>~ñ%¡íŒ]gž•žç+פ§dÒÜ#OQ_šRfs–¦”–æ á·ïëÆ6ó[‰ôôÌ·ìwøÊù—…M}„ºý/Wí a]2iÓ²9úÔ™SgÎL1!B³ú˜¥ëDð† P™æÆ{©fd ![º5W!(ã¨%›ä¦û:|ø |ÉÚËûJfõLB)é4QÓ>!éøi'ùM m&KúK!‘j¹:2„9N)T{0C¦–GËBi‰ã† R©d!´ÈB]Ã8.Ê]³ä úIÆ1.ÄE°j¹B)• åbÉDŽ£Û("Z®‚AV3B¡– ‘ QÈaKXP˜B®F3ª¡ÃåòáC„ÎPkQRI 7‘Ärƒ„ê2Â>F&~Žä8i Ç…D¡*Z‰KŒŽþqŸPCUžÕjCºê ÞÙnÉ^v«ŠæšÜ¬Î«È¢$Ôå°ZOÏÃ<ë+ýÐêÞñ|MrP[þüâ›1½»ÝÚ^U|±Ã^ßb9¡]Z÷TN»uûª%?GB4=hêTn ¼kÔYÏ<;XØ)ìoÑ¥³´®øà–»ÃU¼)kñ%W«Ÿ"Vã¯4œÑ^÷HB‡tèžÎUv,ÏáÚ·óÍ™.G;b~ƒ‘…ÆhGç<ÆñÕòjóËUºú‚Ýb×{'!”¼÷݈ôáÂNâØ~zùÒº¼M&¡¸V›gß5:·ÏÉá#JB@¡ã¡ïò„ðܾî$R¨.Ù7½gu!É›n›Î°’[—•ì«N‹Ýa­ßvÝ­ª_I)öe0_:¨€T-²¤ÏÖšÍxÀ´ßõ ¹ùÊG6)ªˆL”–¹pöèÚÔ„ »n·Á‡Ô>¡£§ùj¬´ïObbâX¡8 Å1B‰µô“Âb ÕDŠàŠp/ÎD„HÄBHt<äi, gB YJ*‰C(–¨ÐF˜‚š¬g¥$´CÍðEG²™ÃDSXšP©¥À˜hÂD!*F(†‡pì=V¨+Ìg#æ£ÐL¹-0–˜ú§}Be„·;på)CxE·jÉê·Íó.¬Z»¥e¢`…o<Ïë ¦s6b®Ý2×v¸ƒTŒXÃÿ¥Ô¢{©~O‡òÐÆvBœK¶tºÿ’Z*–°‰öÚŸ$¡'ë´4óÚZ³ÛEì͸IþºMl¾qvö–íY§:ã0œ±«>?í‘ÕÐ-Κ}|BEb \<¹sÌÀ‘Cœùågö±EÞ­|nÿ|ÚQ]2èò ïÚtÓi×7uë:˜“¯Á¾¸kÙGtØØ4ñNCÖÒsûµìkêdCº>öúÅxV»¬÷ÙTª5·¨­Æ|6­¶­¦-×{zòæ•xxV|}>|¥CæÆbGÔâ¡!Kø+¸z}6ãÖóå·lDW±¤ò„àòSâˆÞ«‰Ì3Å1E%¢Ø_™B¡±Ô­"ñ6D{HH¡Tª+ PH8§Àk˜DÄŽ8'ÒÞP .° ö'¡p>4,Ö”ò$/WI¤á0ΩÀ=ƒÑ ® ¬iÃȽ h‚^ˆg¸" ej2ÖÂ’yzÆ4ò8|T4ð®£AýX™µæ¯Ì©ÒRÍ°s¦/?3}üjJL}cï\vÓ¢0|A;×8¸Šñ5%+ª^bµRÜ]7•òl²ŠÔ]W}“¾Pž¦ëž9ZBMõ|‹Øæb)BùôÏÅøÆÉÊ7°y@†98ß¿Ò‹6vẖLˆ‚ ‰…;Ÿú~G ñÂЗú†s†¥HaˆuCÄ•íðš€Hd*PÍßÇ.Ü"ŠÙmûBáŒÚ‘uñ» ‰SZÔ£WL¨‡&DÚ1jŸ_™+lšP¹*hPšö'™Éëv"Ѫ•HC9jצ޴?›°°»¶)Mp&G,ì )~Ü/¹çDˆyn¼ÿö“øöfñlùqÏß@†)QoŸÙ‰7ËZ2¡8EÖ¸t°¸ühžôkZâ‚ R½Ä‘ŸNTfGD¥ bš*üý]Hù‰8¿Ò«&DÂcö_X&$Pt^’¥Ǹ.çO&¢×’*2ªdBý2¡ã‘Z>D “°7MöÖÛ4!U§KrF&”?ÕLŽ8G;gBÏøÃ0 Ãü›ìu™Ò•µ³„âêꚟø W¿&¤+"Ø“V>ud TMˆJºx¯›5ÑÑm &d*Ð˃%Ð9£L¨›Š&kX”íð à˜ÛLHË/¶,ֱ㠹¨#u­KϺ›úo©«žË™–?MKvd(—{œ'´  Ã0 Ópî²udB®S*Ï4U=òÃËX~ˆ‡˜áø+ËñTQÑqüP<Ÿ‡ªìKÿõÇÓNöŠ ‘±h:ë³c¤ÈI5<:Ó†¦\Ò<Ã$ÆÐ.ð'Ý2ºr†ËY¬ж0=2ض»Å„¨‡sìŸ$L?iÙRv„m¾A1Á$ÔÔ6z@C䂤áÓ “FÁÏZÝ#ÃêÂA2¡Û× †a†i4o³ìS™YNŠÒŽbº h=µëy,òˆÊȦ!™yö’§Ç†a~±wG+ªaÀ‡c¢®‚]%£‹ŒâìUÁøÞÔkõ˜gr¦TÎÙù„ÿOحžù’.¾ý›dý*#{{&ä—öS"3¥iÜ/…û?[}357ùóIh”v¯ J’ïw™P®zr@S¦,ùþLÈçå÷í83থöë#£Þ×ÓIh¨Ì#3 mø¸ªÇ€F&Ô*…Óc@ÙQY? \;¶‰xÙN‰M¿>õËìÚñ§Ÿ{zÑóIˆy[SÓ|žPOh“ÄaÀyF>{ðv!/y'ÃÄèû;…z÷Øc,Öô/–èß)ëíôÍä^$Ù¥¾}ƒ´­º½­´M7 ¨dB2ê=ERÝ]È„–ã1k‹‹æèeB¹²N{Š~ÕƒX ZÊOFßv¿c`PË„Zeu{‚25¨Ö“ Ý® ¢4‰B¼Az„^&tV §Ç€°5hד ¥åXÂÀ — uê窧eBQùÀ1-ãO–ÿ»½FT@N{¹æ.:· è» ” 1æÙc¸RldùLH¶òçËà(gj[ù4W£«m$îVè/ã,H¡m×C(ô¥Q9RécÒÎZÊRèdfÁî2rpÊŠïªiÛVæ‚N&dx¦ ‰åß'$+ñŠ_u9(ë(fª+ñ4W£KÒ9îVè/ã,H¡m×C(ô¥Q9RécÒÎZÊRèd^ÁLMT®BYfƪ¦©¡L\–Ï„*!ŠÙ›èî“þy³jf“âS›Y ›dŽÃ­•5.ó¡¾õ*{a‘5½©ô1äõ”¥p¼g⨴F¸ լ몮›&ÏheB0A/ª”™„vО£@&ô?tþ-t·B™‚h&Tˆ4V r ~­‚г”ÕçŸZ!Ä_vΦGi ŒãcCyÇ —7=Ú:‘"ÖdMÕtåÄ&_ÁèÌzÕ“_aêM?wO&~*ŸçaºC¥ì¤ì¨óŸ¤/ÓÎôi;´ÿùµß—>²Ðù‹ž_ôz`„ÜNÇEGÔÑLè?ÒŸ3!ïÖ ‚äk&¤pR§[¨™fBÊ4GUâÐLh>­ á÷¥™‹ƒûqLh8軨ãö®fBÿ‘þœ ÝÐGš ©+Í„Ô«P3¡ó—*qh&”æ®Ágï<¡»Ö$.²a¯ß±DZ ¹š ýGús&4A't„Í‹¾ÖÐIRV3¡³ÓßЋO õP5šIÊí½*ÍQ•84Z-%ªÐº5鉞û-ËvàfåÌB'äZï8¾fBÿ•þ˜ ¹øXÌC'äX8ô4RVš ©W¡fBç/UâÐL(Å]ó¾ºây wr«Ç„úä„l§ãö–eBF†dD2sm“"Qdv&R_´Ê|;Ã)_Óÿ¸ß0²=|÷ÌEÍFGš ©›Ôéj&¤™2ÍQ•84Z-%ª0°lݪ@½[Þ\!á„`±ÜÞ²L¨É§ºx‰Ií𫧸—¬(rµ\„¹]Q¾b2T™‡j3R±Å·“!ÎËLk“Lˆ,6´Ѽ˜³4RUš ©W¡fBç/UâÐLh»ö5|CÈ;Œ‰L:¡å™P“‡jÊÌç9Q»ÑÈK'ªQ$'$tÁ˜wBdp¶X8X&­Í2¡ Xká„P‡è´õÇMêt 5ÒLH™æ¨Jš ­–U®1A'D.`BöêLh»R©lqÎ ’ú4k,ªKœÏ:¡ËP¤Ù‚¢ä„pæ2G¤CNèZ…”‹6M–HÕf‘i­Ÿ Yý^¨¾õûkB¾-(8ÒLHUi&¤^…š ¿T‰C3¡w­+Æà„¾.ŽlÐï8öêL¨ Æefär3M–ËåØt¦X/Ðd‰ó:̆Nèš· tB˜1ªœó,9¡¨‹‚Ê`ykÌ׳£ÊA˜eà¨PÃ\±"ʬׅw2²µ,äÑÚÙ:Lj-Ï„\ïðD×™]h{ Q¾eë÷„Mêt 5ÒLH™æ¨Jš ͧµ3!úÔ‹È™,ê„"Jì„jxÚ`c®ð ì¿ÊXóKÛœóÝ39©uB  PQ8!P³çP,eg/âëDE†¦Š®ai£Ìq%4Bœ_@´…9;H”ÚWqY•J-˜l•µZš Yþá jxèE¨ÐÀ–NHÈÑLHQi&¤^…š ¿T‰C3¡ô™CßT.(E&ÔãÁgœP‹£v3ñN(/™ªH³e¨§FÊE¨l›åpÀ`µWøTåÐ ™áØ -ÓÕ­ç%z8·ÓÜÂ'tZË1!{ô¤¹qA?²T:¡Ù¶•ò{BΞ,½<²Ué%Hi÷Bm<–h(§m9§G·R÷ÓvÔš~Ö>{'£[‰?AÑ2ËY9¥Í„æë&9i7OuhIÜÉ¿ÚJBÃÏ{ò+Pò]“}òÈuÂÂ/M§Æ„š¥Ò1YtBj>wâ„£¸þÃ0/ê13'Nèb©T*ï†ï ‰üBž2•ýÍ ]1B‹7Û¦÷±«à¬Ðálå3ÙË°¶pBH¥hÔwŠè¬®Aͬõ :#f–˜Ö²LÈó;ÝëBÝ® l©ÐhÈ×Ð6ñéãá¾fBêõ†òΟ¶x4ï-¿™î[ÿ`A±î»áͽM‘p'Úk^²L7q…¸ÂÙµÝ;>ØçÅ4•ÅÇèãÁþß»—1‘ànÝGì­7 Ç{Q&ä¢J ÉÿŽµ÷ PŽÉÒ0ö¿cÉ­ˆþ$v‰±‹ü²¾§Ud”Sž:!C2adìò*ÛFҤߧ^… y¾ENˆÔíƒy&$Ðñ`ô1|lØ ˜ñƒ xy3ùýmôúós¹ÎbÅomˆ[‚ ,-è߇Eᙥk©Ý9ÜÀËj‡]76 5oìØñzqû™<ÍTbt`iîãïoöm©3÷XÔõþÇ#Q —É& z5y:Ó®w?íwx¸ÄHê´v5‚]õÇl)ÎüVDlp¢–YºÉÁH,¸ÍÞŒÎø!œ±‘{‘ .ÃhóÞÁžBÞ¿Þ¾~t÷Ûm<ña®› aã¢c“(xIÒ°æd'ùi<þù蜓‘bÔ“˜°å^ίDÙ'Ís,O)L¯ûhËHèj<õu/><Œ†¼Ê£€ÐËôC¾ýìÓ—g7°UJ¶†N(H Éï µÉ¿DPm¡Ú-ÙŒÊA=+eI™ˆÂe„ƒ`x™ï°<=õjÁÈ4DN=QUFÖ@¡GËNc¬3­_ì]Ëk2WoK_ôý~ÐMé®ÛêcL#XE#)((FÑ"-ê´)º®³qgt!¤«¡4|P(¡ÚºqÓmw…ôÏèãh¦NÆTûH½ßqî¹÷Üsνó»¿{G焤¦ÐùžÇ†˜@BÂ1ùrœœšžlÒ7¯Œzç)~Šk$ôDÒ™Þ1ýžÙŽi =‹ÂðÁ3·"¡Ôù'ÞÀîi*zç„>0ç„f‘Š»ÖÛÜú옉K’ìÅ„dè½vŠi‰÷hä)œ¸Zt¾å¤©JÔi?Ý!€NF$TÃì&† 1<—“qNEv›¡¶‡™©I8©¾àv‡n¯¹¿Ä˜;Q:uã®-7 mÓ±O&Hèïä„ôp5é]òŶÛ+؆Hk#D# á1ÛA¿sUi7»À Ê|Áßâ80iq-e&õá‡lþ"c§HÛD&¹‡¤l›G2U~¹À=úèúa‚xP^„#T€½Qù¤°(†î+ž”««õ=°)ÈF&ÎÜ:-G5ª]¾MÆL$jñ_*EWk3”UêÁ¨]Í‚cÑxÜ> úç3´®i%jóÕ㊪!²Ø‚Ö6q!Á©lMV"7èNœ5Px.BBJ “ý-tMÎ9B5îª~vü_Y½U¶ì {²‰ZP9E +Bþ»éN‰)Æh˜œ>‡ÿ^B/ýäûî§öæ`«1«‡U{ØãÑQĪ0¸>©v=þÔÞ ;‰3w ò´¶< »4< 2IÜ&VÏÉÌÂó*…ît »TÖ\Êã°|Wk›DÑ€VÅ“‚É¢ðs ªãŒÿîd±¨D»á`±*:t8¹ô”‚d‘•ÐjŸ[ ñŽé$„Èo =…Þ§=Fæ«c\±žžxé]à¥uZ 't8…„B˜â)¯5–F¬u5GJÄ@§§4êÉ£ës%îÕwýÕî§LUí!1G”MùåJ ¡Õ’¢40m¬åI^îôp}üiYÍ.*™®èÔI9žL(;PK¸(†4™{›tBƒod2ùËs dûäã„DôÇIxÄŒ;7À0%ïjžQPô@c@Í\“nÑyÑF>OÇèÕ“ ÝÒbQ!!®¯è¶© —³J‘#­íÉHe‰XsÈ!9‡?ðWô^¤:8Oìu~@N„b 1U®rh¡|„j<¢ÃHH¢·s¥íœAÝ¢3ÂUá^÷ÓIUµÍdŒ"õ?)j"Пy‰Ö:WŠP†ããª'Eüƒ¼¥3­„›ÏÇ'ð&ñ6\ßže."‡tWÌ‚,E—ÞÈ7”îïýôî·ƒ—Nñp‰x@¨ ›²ËKä„`%éä)c¦&îÌŽø4G±ÒW CZÃ>ãàzÍ7tW–«Š2xøµó]ö'OJõl“5e,ЯïÒç^¸±9RÉÓÚˆô€(v’‰;ZÑÒ9K»©ñ˜“âízâÒ¨z|9¦šâ>u³¥rB‘†ò2ú>ˆ?pÓT%Ô‘ºÀŸ'î½£Å(2?f:åËó†î!FB۫ᄬ#¡—lzôÙgŸwYBBüÆÕòŽé'»¹cú©Ç^ÁŽé'è™{È¿ü8tá/]|Hèñ·ßzç‘uZ.'ôÑM$dË) “á K£¤1ÿêô»ÑÜ0½'ÙíQ!”ˆy¾gxÉ2Ϊ!¹ûçÂfõ³RþøÁáà{@{É¡¹-ÂDá³I1þÓºOˆ•‡Á è‘ò´hûg,…P»f&c9»U¤V%¡îRÕÝåc„Z=Ü%ƒÓæTbãæ'¸] ¥²CBZ–9!‚ŠÙF1Dõ $Ä/0!uùm ¡’F ]5Ñ<;ÞÉËã„$ÄQ’áq4¸Ú^_m w²%+x‡ZDO¶¨ÕŽUqBˆtOÂý ‰p¥Rì…:HHèÁ&›¦{zà‘ºI2X’ðõE Økßä„hm±Gôÿ¨ G(<Å>!NÂ¥ å†díe5m††`Ìý¤Ž~òÅV?}zö r´Öq·}B܆]td MeÞúÇ9!†,š ¡÷ß@.kH ȆŸˆ7ÿfÅ—^gLýžäßHiýýŠË儈r Ì"!L(>¶È aöh—‰›W°FÔïùŸ ¡*ð&Oæú¤ÇÑö‚¼X$t"²‡ŒœnTß/(õŒ—Ñ€„lø›–¹ïœðšÜÑpêÿfa$ôñ?³Oˆ6êÐâŠ"–Wˆé_ªM…÷ %‰n¸„$Ž‰¤Y‹ãð¤¬ï¸>¦H¨zâ'Hˆq‡ä|NA« B-øHe[¥orh…ûu¾uêÅPªõ¯v4ˆB/¸§2D9¿H¸qy®Ú·É˜‹gE8•//2|UÕÝåcz¡»j«Ê+zËÍ*‰¨ÍŸABJ´”b- uŽYÈ/ã$Õ+òú/¹«¦œ¸u±´XÄJT’m“G”hHˆ+}ÚO³;YC @iÄXÝ>¡8±0  ý&¶ =ð߈„àÀ0±Ç¦»o_S Ú°.2Ñ ’ïFBúžÿÎõÕï—>œ€[FB‘ÓžR·bmë x$ô Mâ~RD»òÝ^7ÕïÄ ã¸›”¯Qæ y …Wà ño^hé1q¢ÿÚ†þÙ“¯=­çÂe-=ÅéqcyÆ_Ûà·™\ó~mãéɯmh?¼ñ ²Ñe,½ýÈ:-•¢ð*L!!lo¦ÉÆ"û„°4å–%ë\îØy¼It‹´ $dËú@ÍJ^d‹ý) ƒæáZ7 ™xÖÃÙ û„Ħ”‡WQt5:Ñ‘ÐDæÞ¦i"Æå–pS&ØÑ¡íOÑíªZØñ°š}Bþ =Çvœ’$Yƪ‡“}Ko Qlä|:âI«Ž„hµT’!€LZ줷Q-ªñV}›F†éH(ÇëpP‚Br­VÆÝäèúJÖ·u#  `F©|ܧ¦Šq¹$ûåÅÏÈ u¨­ª£a ¤—sRAí“ž‰Ìµšº&âž±c˜“ÅYzF 9Ëàfh¥Å‰ÖófV-™W2¢æ«k82ïÉ‘µð¬“KǪKë—Æaí ¬½´:è/7-û-7„ûIÎ×H7?ð:÷,&Ë2?†“S 9/¯âÔËE º+'tÏÒ³®Ÿ¥_„ ï¸:Ú n9! ¯ †„°L8éÜŠÙïŽ Þwà+öc=O ¯ÐŽÍÒ~ ëÖ‡#„p¡„Çí›CôRÚÊ{JU…ö®â";«g¬-÷ëÕ§_©€\GBšÌý¥„¦¦ôµöaà%½IæèÀ Ø7ò Îwm+'¤»„nò`ß“T)õ '{ŒpªcA‘™‡„T ¸¿ÑöáõÆ”uºÅnñiŸËªa[ZS­ïO(oŸo¨!ùgjjDšŸ;ýùn˜ƒ/¡!!­z2‹ò±­œÅØÊ0úá ­*ß@]4oXOªU¡i›< ž§vÌL†2Έ”¦E¾ÁF¦›"þæá!úhªƒ¾úyžÔª£ãVÆWŠµ`¡ NáF0Ì«ä´ÇÍwÓq,7B«¯NN …>ñmÖÈ,¤±1«Ûšû- å”ãÀîÅYêÙã$«yªvÕN¡§fi±ˆaµ«‘"›ß7,Ysg•zJB<ܹ|ø5Ì´|NˆÕ™AB~èWÆh˜Ê7!ÕÐqö,›ìs·Ž„@h~™´}Ûðz0÷¬›œPvX/ÀSì…FùZxŽ£Â¥*øÎ)—Æ—dmÝïâaÞ¯ÐFX³œ÷p?7\|ðýïCVÍ:k1¥@)Ô·{êF¯,âGŠ1|WNèþ!¡Ç^}ô‘uZ€r·í²–ì;;v#'Ö¾¤ÁßÜß­UÅ× Yâ„XÄÆ÷æ!¸W|·o|xP¬}¦øŠîN€FÔVÕçK Ÿðg{4hRÚû{ñ×Êûh«ŠágËDvN†Ú©ðf ikîóŸ&so“NhÀÚaBŒ ›”âr'ïù×d¶*Uü¤ƒ­Y"ßû0ÒÒfâë#ªƒ"íR´ÉAQ+|²1 È¨ï8ç¬Äà2^Þ[Z,«eÉÍoN$µ>¥8ËuQ/¿ 8| ·’Þ9¬H¹MêpHÅ:|ŽHµ*4ÏìA!¢9l“bð÷ŒZÕ¶J§ap®ªH…:‡ú®ƒÚ&2¦"шQ«^~4݇ÞBW‹[¬®zìFÇ#S£'”’S-7¯¤õ÷=>–¨‘‰Mrt³2•ÇQ“++W‹1M‰ô“:6JEáð´ˆÎƒÃAXß—¹Ìïbg}T$õa)‚N‚¶Ä½xƒ;ã”ã#TÚ °KiÙqEœw jÌÁˆ§¹²E‰“¿®ÔXeMÕ¼ûÈ r¯R|Ç'$é—^gâ–Ø@obûã\„gnD€P%|,©5 k/oŸC|‘iHíyÜO †[óžÓ,n1”¡@qêÛ¸ƒÔ0ÓAÜPøˆ´[ÕÖšZ§;pB¶­àÎvXMÛ;ÁM›‘¢ðÚ1®¥ßÓ3/%µ‚…Ãô¯3ÔfHÿ§ï™žöì¼ô·«r3•A'ô@'ÌSï¶x¹­3¹ÛK\ ÀÚN¡p¶àCÞ‹«-d,‹,¬ŽµÖ/MºÊæiõ=ÖÐ-¬º3rÚ>Kì-µ×=¹°¹‘Zí³ºÊ´èÝhvX¿{ZV¹¨eÔe-öEFBkNhç„1®í-mÛñ‰ÚÑ6ä;¦¯Xâ„,vM‡Å»–¿yFSÕY1Cmæ5ÝÛdö£YæÖY¥*ŽWˆ8> ÍÓO×Ò1'‡I5¦c-ŸÝVâLææ"zEãF-¹ÃP‹E‡e]fñlÆJî^«l6X¯d™œÃÄž kõÌ£®ŠšÅCÖ-áoRpœÆVr2ã«·¶‘Ñ;·_.n1sµ m¬9¡uZœ2&#'‹¯ú¥Å9¡…~ÀÛDâFG2Öf^×ÿ†šk»ë`œøÌ?O'dÈaÆ ™¶iN.NÈ<ÊõdÑ´s8!k2ÖEôÙðâ٩ı('dÌc¡’%sBü9ÇÅËùgd8,|~0ô8c–[±NhŽŸïÊ ÝÊ;„„ÖœÐ:-Ì Y mý+8!㊱6sÉ{L ™pB]±zNÈ1Qå¿Î 94ñ5'´BNˆ%WÇ ™7IÆ'äÐNõÏKá„8Ûš"$´ùoà„ÖßiøïJËá„ hßZ|baé*¿j3‘¼×…þ`ïlvÓ¢(|±üÿ Û o,vö²MŽ”ViWTŠ*õ1ºi6}¨>fgÆ‘[1`ÈÎ;ã™{'ÎGŸ®à@&t‰µìcB¼½ &Ä5:˜ Ég¹ÆÙ‹¢ÉüI=ã>V… íþ}û˜ÐðóþìÐøõ™ÐÇ×gBN\y¤¥ÆaB|{I2¡Ó8Äa`çv0›•2—VGHBš i&Ä¢íÝu˜b4&t+•l÷~…Lèx$t«™Ð²ƒÀ¤J í]ö‚`lJäOZeB?ÙöúpCô“1!U*e^¡Ê„.°Í„4ê3!‰ùcC!I&$“]¾½磼>(\'ô•¿U½š>íägËEïr84®¦€KZ—dB ݜT'4¢zOŠlj@YŸ íµ¿š i&tæ:¡¿$*.U'4\)}LˆõÈßé®]/ºNhl&$ï„È0I;!•4úŶ×ÝqLè\HhÓÿʦ yv0%›®ÒLH‚ O¸Nß‹÷ûÔÜŠÔ GßûŸÖ in±KäLâª}Á~B~ê’•ÆÀ:µ(L#3*?M92ʤÎÖsrÓhRŸZù“U•­KqnÌ’*km°¢ŠC‹Ÿ.šºfóÚY¶žìÔkŠ: :‹å¤+ I]6bš°Á¥.Ѿúζ×F’  uí¯lŠ@‘‹«#$Š@!Í„4ê× õ$_½2Vê~»F&Ô[¸$º½Z&tÎ:¡ËpÉ*ÀU»âëÞ…<B.Å(bÀ±€‘™@(÷ d‘×Í ¹¡YA(ÚuW6Qø2 ‡Ðš(€PÑZ«Ë¼K²ÖVèüLˆí®ï¢W%&Ôª_'´?Õ›ÿœéûªüýš i&tº ê3!™d×Í„dwÄA¯Š× ‘ 5Ö‘oĨKË‹¹% QÛŽņ%@ùË&2['”E0M0·¢FN‡sªÔsË ð‰ÖÀj6[UùO'õÊ¡);³Ý˜“DŽ?d,ÑøŽ—]hÍ3Zq@DZçfBÛOŸ~^ÚÜ*ÂD“fBš i&¤™fB×Á„`³Ã˜³ƒÏ jÞe¾Ô ÅȬ–ØÌø˜_rÿ¬l¨ä‰Ad¸bÄŒ_c32¬ˆ)eˆL‘ÁR‡ 5úuBPð–i— =0'ô¨™úM3!Í„4ÒLè?gB÷çbB?„@0Õi j¦='”гZ°‡ÁŠéù:Nf·R3þÐj…¥AÔMNx†0À*rEh í~Åô.IèO0:7úÆœÐ&´ÑLè i&¤™Ðs4z#Lhs&´Q† mùÞ±ÍøLH8¡ÏjȈÀUøƒNh ,†œÐ@Œ› °»ÞEwæb'‹ì\‹™€+ï;¡Rx)q,IKŽ Ý¿—Ó—§íö‡Ü”–ã©œM])t†—¢~šË¬ûáã(STX×þhJH•uô–s-aUX‰DÀ¯Ûíöó¿À„" ´…,ö›¹ˆb ý œ±äÖÉ ¹…™¾ø—0Û3hìV7F³tÙ·¦yx='äa¯4’gBŸ%õøôôôø ¥¥¥¥¥¥®ø{Õ=×OgBò£Ã¼ÖÃĉ¸8!s‰ÚbƒÊÖ YÔÊiØ]AtÁù ¢ í^øžÎ„(šrUs¢ëÒ.+΄fÀ*÷{Nˆ»£*3L„ÏIr³eB2×°R€E:kLÉÌ€UØ ³¸ñÉ‚Ål•d#›x^øNUE ;|A?s ] x„¼â µ¤ë„äôøÄ>·ó”î6ïN’ÊÙÔ•B÷ax)ê§ ¨Â²³w~­MƒQoÃ’U×ØÖl°ɽlH›Ð¥¤eÇj¥‚‚¨7âvÑ‚Ô¯ "C¦xã…î¶_ÁÏâðcxò¶¦m¦É–íI8ÏnÞ¾ïvvv8çådzþYõ#y‘ÐÛ%@:i ‹I„€ïyBáZõ„Hë%[¨œ“´éê¶gÊìÐb7HBÄ9B³çþT|„!Ý$$•Åƒ]ú–m±Ü–V‘?}í™D¯~žÐþj®Ú×<”DBã8ž“P¶õžÛß³ü–Ûo™ jF“x½k1 +ø+>&¡î_ÒŽ³<Þþøòá㻓_Hèðë³÷> ž³'„™I”€GDBì ±¢{Bfç Þð½Å†ÓwƒžY'ê1 ¥A@uH= YŽÓšÊ©›i3 ]0ýßì[PUÆ)Ópm¡°túÒá> Ù)—"¤4)Å€ t @Á-ÔH €hÔ€1å&‰Ê 7+¶ àˆU¤¦ÊTÇñ6ôBµ…ŽÓŽ3Öw¿sv“À 1K±ðoN6›ÿÙ={6ûËw¾ÝÕ«Ž…ORMè\{ñ¡¤hy‹nèLR~²çPz4Ã䞣ÉRa¢±¸ï[¬çF^w­½dIÞyÿ[ï+¤k‘°çàÁ\¾4!7Ow mõóôÜãÁ݇ÌÇs§+GBÎ~ž>n 9»³eŠ[ö¸r´ÓóÓ„î.N;P$Ÿ°$„Y}<1ëBrñôtAÑÅÝ݉ý˜ûV§Íp°&ZàØ „l#$tx“„þ±ŽÚáÿNB¢¨ÃÌsÄ~±Wõ‰8ÚË% eßKj3Æl+É&]njgqOŠÌÖü*–.· ”cÉÒÕ¯Õ‰¸k¥t $T2Wo0ä•%¶|]­®ê«Öâ³ÈôÞ1ƒaF«”6 Õͱ–k¿ñáêv|ZIèC:+øÁçÏÒxQ¶ ‹AB¼hBÜç÷ùrÞÀÝ"Þrù€í΄„|è‹”„žð¶Þ#Þ…‡Ì¾uCË;Qdüw0'/áCIH€2b›³•„}„¯³Óv†¡·bõgv9mšP°Ð–„l5¡# ¡¨ÿJB‘‘‘á‘‘›$´L¬g.X÷‹Â ‰c/4Ï y䋽ª¤Í'Kµ\€”£JÖj|Tq.†Kœx*iñq¨äT’t‹\q&i™©ò¾ê™B¥MµÙÇbKŠ3dKÖíúØï9²Õ¯Ue=´ Ž„úMµI£úÚä–Ô²Pa®(b@—ƒéY45—¯•Vv¥fÎvavðÙ‚H‘9|ã/ïÓFSg*ÝA¬Ã%Åç—[þ4¡—>ùäÓ׸80áçÿ”ðŒBühBžÀ !!×½Œ÷¶@†Ž†íbü·xîc©&Äxíe˜½Î !Ä.‹ÜÀMA䣞(3Là6oÌèAHˆ„À™ÀWCIh7´ÅÓ—ñ¶jB\ •€„)î$Ïfð¡ ¦ Å€„¸/§s‡Ó¥òŽÏrssϤKWNB‘áŽ4‹ä•„¨%»ûFuHB´Ë%MíÅuà~Ò“q "Nîwd5$½Ù3 «i"Õ¬>!ìr6æ¹ðG¾¡¸!ž‘¤%Ý;ad öüzóÒ !IGqî‚Á!ÉU©!>®b?•åÚãBÛèn+”ýóni=àש«¤Ë‘Ðä«è*ì:’¾Ô²Êò"RË’Šì#¡ÚXn5²ú®• .§fX}B¨h„ªŒ,¦È0HÖ"k˜ •ŽÜøçŒd$îÄôrҩܾ´ØtÈkÿœt¹Få¥w‡rÃXOFGCƸðž#¡>4!g ‰Ô::¶Ç “v2Ì'ˆ9(» ( º:9ïfBB»Ü0è ÄÃ2?Å‹U{èô'ÎN~ ³ÛÃÉÙ“ÐV’ÊÛÚëú `\¼ c9A"ruÚŒ5ׄN„Â9]zz¦H–0eù­ßsVNB‘MÆv„±£)"’GJ¤–Èø,áFõGB¤Ëàø˜?­×ë´±˜ 7cà!>Ešv]oPç(VÍeR¤ó£)[Í([M[ͪ.6ÏE<ò Å~$áî/7¿ÓzûÖqG’áëjƒNU#[JBiGÓ¥«%!Ωœõ¯$T§×*…­]yY|{ØÕHjñÀ. Mh9êÅ"²Ü"ZÑŽÜø%äkTS3ðs$ ×W¿õVµ®P¹HHòÆkÏ"ÞüùÉ>ó5€ËZ$< æCr ³À1í²c`+™ä yÇ×ÇÍ꘦”#°:¦}ñeoîýÄ´c§‡lDGǸ”.VÇ4€ é–8¦12æNÐk§“kÀ¦‡ú‘hB= žf}ùÓc¿É„¡âàü†¼WW<:ÞÑ~Öl6gŸ=ÛÞâ‹„$æzͱÆ“Êsí=ĉ_¢gÎo(ˆm‡¦˜H!F1ȃ´ÁÑH)gåÔ"Ï”´“¶‘4áÏI¼àeQh—)”IÔ9çZ®‘ãiEœ*sܤUôš´ÆFU™C«–\oû&®f+[Í~®šÕ“P”­y.L¸~H(qd~žý’ ÎÏŸßßzûæÕó 9¦½(‘¼ ’œWØMBªÒpóy)I2IÇÉýÔÅGÓ)p}*SQY¯z™ì]xU|RAµ·ëºeIHÒÏ:••éÎd(( ±ýRHþœn:œ$cI( õÊÔUÁ4§…„¸ÎÛy½šíÙö‘PBŸN›,ŠL‹ËËPîÏï‚6¤© Ž^BB9ý¦æ䊮ÕÀˆ=UjfZÓ˜Âú´ch‹”°VmÒÔØQI«¯.-Э³+µL$¦ ÒqR!ï8¯ {{ ’jÞÆD)iT*ÒÚìøüÐóŸ|ò å–Ÿz ಠc@Bá|hB~Pq¬$些zyðŸò ÂËÅJB> I/\ܸ2ýK}@O,$!b=²’Кn—û"ò#å„A¸„›6cÍ5!ñÁƒ¹lOì<5ÞV$CA>ÐV%]9 5e›Íóó³ÙæìŽpÞHèÄeM©”єޗUÑX]U …ØvÀWyt/ŽJ½mUÙh õ7JjM-£›Œ¨$ªÓùÓx.MèƒCT]dùýÈ ‡R ¿ ©±ÊB¿©yç/§¾*!ƒ«F àê×O’Sì­Æ–„„ë•„fïüuç¯_b‰®pÿÎ_n´âõ­d2õÞ%YÂý;ݼtÿæ¥ÙÛ˜ÅÎJH«UÄ¥^«•C6¹Pm°XŠûÕ9ùSz}|VåØ»T™!Ùx¥©’¡?éÈϤåvËF8•-2ªJ áúek#„»w˵J–„„æúÚjÓÙœ Ž„Xwstšèz¶¦ÆBäÇé& ®|s¤E]•?Õöú”ËbR=…Ì‹I(mZ=teŒoÊK‰f…š^½Á`0é 39Šîz´u^•ßæêõ†Ú¬U÷)tûg„r(N3EÉß©«²jc+ÑÜ©HŠM¦+R’F¥"­ÍŽÏ QX‰&Ü¢`Ëü'Œ Eð¡ E|¬$„'_¿Þ¬Lä¶ÀÍ^eIh ¸EÀÉI.dä+/ü|¼‘냳èÛ flIh@Œ*C»7ýÒDŠ ‡Xti–„Z§âcW옎Œ0šYÊŸ5›a‘|‘tuö»+QŽïÌʆø¤ì.|µmœ`Ûa¸¼y°¥º9¹oòêeMUG‹¦ª¿>> G™óí¹g|gÒ&Eˆå"Ѩ^;¹ÄØøC E$Å:f2\¯ùÞ›;Íá*ùºî6i;²yŸA§×Õ¦ãe/­&•«¦èøãDB|:2ôxÐNp4Cˆ„ǯwnÝTüzóO”¥v“n"wZßHçƒXéZ$Œ Eñrî˜(ÄÅ 4òf‚@,¬Ö³{›€žÏµg1 1[Ü\öQ~ÚŽgw7<ïrv b¼œ1ÿBrƒäãæ¾›’PàntŠ…„0•Vë¡bÌ»é—æE:b5‡"` ±‰Ã ¡([*™Æ·ÖŠI(¼$Mˆþ3§O$”ÇZ"ÓæLPê) 7" ÉTßONM^i+¤G¡]¡â‚¦”ŽŽÕ€E³Z˵dû€"‡"¼éhbÛä|ù„Þ‰%G&d ËÏKnFÏÏ5¦ÝÁ;A{ØsÇ|@A^~Tòóf¾KÓ>A¬“(´ó3û(:oyï´!!vš€BŽ{ ƒ,pLûù“v²smú¥ùÒ„p㱘#–ˆYrÛ±ƒˆ[êgð¼*úN!pbô…öŽ°H~΢¯h$–È·_˜R=5ѱ®™¡ïõPæ7Npíp¢ñ"ü_ÇÇÊÇ™É+õy¯VLµ M© ÔN^®*x¹}ºmhΗ‡ïãØÂ_$„åzºAU:üqÑàẇSšÙpƒŠ8‡kGBÒœÕX¹´šÇ“„Jæ»óÖÈÝ{^"OwoÞR¶âïodb’þ7’Œ›& Ð=L“WT™ -ôJ;ÆÏN«s8JùÎ4ùôËç£I¯"×KxˆS¹}î{\ã ¦µqd¬Ï¢$4üqáq’s9{MEF;ënΑ¥Å]Ô¢W×*ªøêõ|=Í/"!ƒ¦+;ØB¬ÎmCOSÚGBu¦Éƒq×Nc02¿!~¾±í©9â T‘VomH-ÅözÚæêü‘WX£„¡ä¬|ÝwÌCàl): <¬“· 0Ý&–Ì„¢`«uv›á­¤Ã‡-¥]Œ—Ófð  QU(ê°%¢D!¶o†“Že%¡ü‚Óè€Ù™ÂÕ ³f8‘þ…v¸¦ù¹²bQµ'’ ßë&3+» &ÓĆº¸×’Ñ¡ÌPó‡52r)®ª#É¿nÒpj?ÜP3N“Ós@B:Ód~ñ‚.#ÅÅSt“§eùWrŽ§Í1ðª’Å0ÕfI[ ’bu–©æ±!!ùý[±­Þžø“(>iwoßþóFÈì]¨B%÷oß¼KÌnƒ0™$4þv¬»æ^]›M÷'™Vã³™83S­M¯øò˜,clY¸]drºÏeHÿÙ©<‘Ž½³M‹¡§¡ Ò/kS¤$‰[Ka%¡Q²Ãr9+®O$~xZƹ›Ñ«3BÍxý˜E=‘žÀú´%Ü£;¤¦PIšZ™óñšÓW½–$#š°çDÍ}£D³¥LªšA“ÔØähÔ`l/u!ÿ玽÷íû$Èïk•·`í±SZ÷áᲘ«7ƒM(´€~P²ŒˆØZ]Øú„ŒF#®&B¥Žð5¸ÛF%ñ m¬XíWþ b£±‰ÿÛEùºÛ†­y.bÝ\YqQ¬ïæ\E6zbew³H4öÍ<$´|ŸÐºØv¼²" € ÿ ­7³Cú_ÐßìÍjÛP…o„lËJ#'vä¼ Þ9Ëÿ Xr0mH  í:”®ò"] YzÓMw… ]ôú]õ]zG–…cìH:s‘“Éèr¯ôùx|gˆë­E1yBü#ÊEÑy£ª«HhâiùãÅ­öƒnï|Ï¿[œO ¡ë?…„ÖëÝýöñ^À÷ÔÄIțͣÅsÓ^êi眄^ÿúüi3âú—ú Ýˤóóû‡üÐÙ·¿¿Wzÿ&™€a»œzB§D§¶¥á ñ¼:÷û»w`Õ´XŒ½‰~èyéÀºò, ©ÄÖ‹þqñœ—~Ú9'¡ˆÀÏ 5œ³õÓ ¶ÛÈ©'d”ÄJ˺Ñ^£¿; 1 y¾7‘^ôQÁ_‚àS‰ï¢ëM¯Vš÷ÒÊ|BBñ ÛmäÔ¥æ y\&´# E%$ü%>•Q= PêBÉCH(‰€sþ#§ž(-O¨Ï]\¦BBÐ8 ¡LG”<„„ân2-žèE=¡!— yBBÐ8 ¡LG”<„„’Øã1@=¡¢ãȶˆ Ìâ2¡þÖ$t!$´Vð— øT„„ÎpÏe:¢ä!$ÀpkEPOè˜[°Š6”'ÄeBoc"¡^wéeT@ã $$$„2QòJ$àWýîÔÚ\XžWŸM·'¡áh%4Ä]zÐ8 ¡LG”<„„n(»'ýF»i‘ß›*¢å“RÉxLB†m>Ä1•èAyB¼7ƒ¿- ­G¡ÑxéeT@ã $$$„2QòJ$àLß´1xBu·Á‡šÛb¦qˆ¨`M±²j®ZuÝâ~wO²\·ÚnÔ4êì7ˆšuû„ìz“¨ü±Õ!"çP¶ z*(Oè†ñz[b /F½gôet1D^zÐ8 ¡LG”<„„ ÈßwÇà Ò :ÔÐÌCÔt)h=ߦ@'ˇQHBÅàIM ÔµV$du)БR…"·)½Äž”'4àâ³€„R_ @ÿ W@ã $$$„2QòJ$àXßµæ1xBQªPËTæQ]³L“*Ãj‘cPT;´îIˆ:‡eîÖª–_5Œ% ¹eîÔ5meWÄzª<¡ñ`C]]^^΃s!¡lh„„„„P¦#JBB‰ô4 Íbö„4ÌTKŠu@dëƒETTí¨¹S$:УK]SëDÇK*µù—ö”¤£‚ýgïüv¢8L]¨ü7za¸ZÙ˦´'FÂ’,YcÂcx£7¾†ï±¹ç t2HÙɯæ|$RZzz2™Æ/§3Œ5¡ù®ü|}}}àw5¡rÔjBjB(Ý%5!/3™ðüŸkB b¦*Õ¡a‡5Ä„¾½™ÐJxŽ‰N×kBrî¨ÃôhÄ{™ë~­¢là¡&´œíÆòùùù·¼O³dO²,)öÕpjw*ø—ñ“wœä„¼¶ƒtG”<Þ¥S–°™ìÐþž“øP5¡ÊYÏ:L½rN9ÆiB59¿[2”Ó\¼Ö¹õN¼ŒJwy̘ͤÈ8¡8Û“8Î €}5\€ÚÁ þeœÒv‚ƒÞQòx—NYÂ"d²gÀÔ1q*Væ&$Ô¢±”{:DµªåÈiBU¢–|Œˆ¢• E| ºBÔÛ§Cv"¥æŽíÄ“ ÂOtÄtij}:¦OÇPº#JútÌO@»ýáÇ u¬çt¯Ä„NÚ²g@c±#Û|ÈaBÌÈ:ÕW&T'n-*Åê·úìXÊGpjBv}¦&T€ÚAMHM¥;¢ä¡&ä'àL&~œP@D­&›P8 fõe"|Øb± Ì9u?1¡ÚÏgh&ŸEoˆz&Éø¡oEÁJÙ¦&4µKm¨ • vPRBéŽ(y¨ ù 8‘Q‡¯ U{Äô[bBfHB'äÝc®.\&$œôH0anB¡!AL(º&¡Y¯(ø¨ ¥»¼D­Õ„JP;¨ © ¡tG”<Ô„|Ì×`=üºcÕ3Ó¨ñƒ±®l_æl­=µÆiÐ>²C~ÚÕ·o·Ûk¿9jówe[¾°zŒ‰ìVØ L£«?'ä§&ô‡;T¬&T"€ÚAMHM¥;¢ä¡&ä)à ÿçJ×¢Wv¨&t+f¨ • vPRBéŽ(y¨ y (S}bĵè•ÝÁ© ÉñyaJ7)ô­WR€ÚAMHM¥;¢ä¡&ä) ]yLkBJñ¹cù̱¸  ¥‹øÆM– ßz%¨Ô„Ô„Pº#JjBžÊ\Ÿ;­ )ûÖ„âÛiÎm–ïœÙ™cMhqó9 à[¯¤µƒššJwDÉCMÈS@»Þ†Ö„”=kB“ùÓ?–“dÅ=÷¦YAJâ-&§¸·^Ij5!5!”îø!lñëýñ4Ý~>t#õ6ÂMÉ“}µ&´Axyù¥f©…?¾‡¬ ÅwOËiÎò~ž­ö²=&Mhq³î­÷—½³ÿi« ã¸éŸAš&„×~*Bë À°/–ÒZ,T ‚+Š¼ œ©³ ´ /‚ˆ ƒMØ`aNÈ^È–,nš6¶¹Áb¶˜è~÷{Îíë ®ƒ^ìFŸ„öÜsoŸszî¹ç~î÷<§¼ æGí ¡ ùKwt¯‡b Hí¶;_U@ósdÛ8ðçFö»Öö‡‹’„LÇ4!7ㆅ ÆÅ–ï݇ºZDøöGò°ŸìŽ$Çm}ˆ«+Ï£¢‘FŠÄ áøníX²*AèÀ"a²*‘&HЙj·$$ ЙÿA~_•ÿÐ ßß»£½ÚÁJCZ^¾23Û¶C<Ô(êÔ•J°Q²Ú†ü­ÍÙïZÛ.Ê òSxMÈÕÂ8·kâÀÜs‚¸o[D!@I€†`ÙÖ‡<íË}o“°(¦:°]kB)ò8À¡‹TÉ4×€¾$ Ћe~Ô ¿tG[=´sV“Ùضé$!E¯þ˜ƒ„eêí<øq#û]k{ÔäÛSKöÊ!ý•éÊ€&äb<7´ŠÜ·pâä?I³‡$B» ¹Dìâ"Ñ÷?ÄÒã^\òŸ±]óþ {FEÄ íÃÉ 9.³GBÂ8‘Ýâbý ÚÏõ±Pê³z9»L¬k€M¬`‹Ãüóúcê!>nÒ¼Ü^6DH¨©ÝðfŽTÑ«»VÐiœ6¼Y !³cMÛI¨GCZŽ£ ÷þä#–É÷n‚m:»_ðÄÏoQûT¶g‡ÛЄœuÀÝ¢X'!”Á6 qƒ0;Æu4¡¾ ¥Ñò©&”D_ì ˜å±¥¦²LÆßWæÍ;T–î4ñ¦ë¦#Ê“PL†Ê¹Œ YøÿWû¹>’¿™+ñ]½Ðel}EÝ$·9Öª<¢jjT9?&¡åÕ: y ÕlXÌæòmï•£º–ñù£fsf1É'ÉõútÅœÕl>Ú“jwÀÚÉ÷ŒNrÆ2ù¼ƒ(ÚÑ«ÆÐÁæ¸è)á|vîÜÏ_ø„¾ýò™Éý+&  ¹Ð,‚û '8*”¤^a‡„xáÔ¢ƒèÆîH($Òaá[‘Œ ò¡&äIBD]<$ôЄÄMò 3áÞ¡öš„(ü$%‰DäMHÜMžèœOrÍÖžÂn âûǼ¸õˆ'5u.›%]åÙÚrc©*â¦öÊ™Ï؆wÔL°À¥ÈH+Sûª˜œùû/ÆéP(¯LvYFArý„ij9ßF1ë=÷îžÞ ‰‡ ®’ø$ºŒ !ŽŸm‘1Wc}!ßÝÆú«d~LBÍ–ÌlÇ×0µåÌ™zr{õ ~§±:aÒXŠü⓵­C‹W뚇õEw†q¸x¨Òà°4†Y|ÖgÛÑȹžÑIö:îÌm·†kAº­SœºêB>‹†š¸Oc½*•BƸìCúÛŠMÈSì!O…s8)·mïI(ÌuÈ.Hh»]7¢Æ®&¤BG’Ç>­ iÛW׫ÑûšFWFz²½&¡$XnbBrFF µŒ„$VH(kâ îôE2' M‘A|ÿØÎHˆ¹©±SqÅF£®´°D‰3C‡|ÅE+Àó$ùk&³®Tí£bÆnž2«v]ŒÓ!¸,#ÈP‰ç$”õèö­§÷ô=¸_èSÊ‚Tb6jZež$”i¤–„Ú¨ÈCˆgâj?kQÿŽ#Nt0KHHӀ͖Nc©ŒrƒxÁbr˜±:Ý—£Õd©ÚÖ)D'ù’„nýúë£ëUé~@Bâ/¿x öÕﯞøù«/.{çDw¨š¹D8ÓÓ·(ý 7‚¬ÀŠÆ6“ ãØ?ƒMDñ"mâÁ¸Xðu <‚Jüa;xK‚ÙIˆËƒq˜ŠØš„Ây°°g‘':”ÊN 9GòxAäx|ŸkB1aq8Ê]ªXÿ$T³Ñ ÏÞ“PbrŠ|à“÷GGGg`£ç+““X!¡^M]Ó‚)3B™í'$4aœ>œ³oæȘvhJIÂ_.ùStWÊ’ðüIÃ"Ò]€ZBB!Ò AIÈ¢ù¡HÍÎhxdUón®”ß·r!]Àd(5.ŒÔ«ÇGêÛ»4 ¾"¡þR©€bêi1H¹£D1Ïë,#à»,#HÄ»¿vvs“™ýOmnv¨ûÜÆ«b™èéZòR@=Úi!‹¸æn–çaæË«âO’.“+!wRô-Å ú”ºÙ²t8-OÊGƒèFõØëF¿&¡¾a`9ЂH¸tÞ·"¡q] ý¶$ZÌÅ„¾3}Q·<פ’£ãñ°i Z&)j*iõçs‹  ë℃icËÔŠÁ5.ÿ´<8Õ|c(‹—wC+MrqÎ }|îÜ9Ê-¿ÿöÀeÏÆâfhBîA<ÑÏI¦(¼0˜ä”ê }¦àÄ%É`^Âm’ä6$Ä¥Žì¹L±‘„«¶$¡à ²‹û â’ÏÑB$D¶¸.«âx>ׄä$ô>ÖCJ[è ]´èãõ’„BòOf6ÖÖVWW×»,g‹„>ÅxWž}dÍb6Ö§‚Ld,-äïcÚ#»tw¥ñþÒ÷V ‰\K¯Y aJBóf¡ iô ”„ ¨”c¥*ŠIã4_Èsmñ´Ç©†tSÞ±¨?&FEe¾(^ûëÁ[îÅÈvPŒ“„RÜ—@i÷ºóðÉÃ'÷‰¾QóÏ“'·oõaûvrŸ<>-Ëúçá“»§ÿ¹{ú΃۩;-„´Ú¥þ’²-UX8 ¥ÍÜVL§•t¥+¤ÿ4ߤúk,éaµ-²ŠU“IþLBYÆk¹1qIùÊòâI]i|Å0´¡ÚÖ© •éÉív“eؘ¬HòíÑIæ“y½T=fA23ÏËÔVðÜ} Ý>›Ÿ…¯WO¬mi·¶¥6ã”é¨b a‹Ðœ/£›pÄ QX‰%Ü¢&é=tHÖ> šÍ8A6¨‰v'!'Ô„¹â{üs¨n#Þ7”îô’„(â?cvŒâ\ù¶- ùZ¢Kènšµ1âä¼Ùdl+öš„ä3kN‚m̨Ù!!<»®ëã'Gª»{k[) iêü}cL;œiì™ê=Šï¾tiQ×2ˆ–8nÉ옳´u@*˽n¬îž4Öß±êß¹hé™efÇÒìTƒ¯Ñ¤«Jo^é?ûMž„Á4 4‡Kd¸©/ôÍ {ÑÚÿÓçg1ã´=S àk$Ä÷Wºw÷þPG™´#¥³cH~°óáý[Sê{wÿFZ²cÒ]8¿jêÙ´“®ªÝf–!¡qcµ(NÚÜH"mÐj[ß.Ï›@¬Í¸Ñ¯Iˆ_¡4.}°|-£W×Z±RûÁ fM;G–^Ç“„ò»tÓËóì’PÍšq á<¶è¤Šáø+?Ö©«NX@³¢©;M= “ºÙŽHH7¤Ô7@µj$ZQܸ _PÓ:¸x£µ¹ˆ¤+í^¼ê¢•²GB”[^E`Ò{ç<Ì'4!Wê1Ó]×¼ P`‹[Šâ ’!aQÑàáÒÔ“|P³¹ñŽ„8(Šd¸šÓµhÇï!…Љ¹=Ó„Rˆ´èØÿ4 eáÖª4VI¼$¡\Hˆ"€Ð¨<1‰ºb6cŠ|¶Ë"Z¯¢$´ã„ ó ¬Ì—«VÚ>jìIç5Ö¯ÕÖÅì õè·¯£Eú¬™&ý£7Ë7YBAåÅùAÕ¶Ÿ_5gf;Eó‡oI¨i`Æj®V»ÓBŠISfÒb^2:-abƒJ=þ#GFÓÈ”‰ÁGß"qBÿz Ú1 ‘8¡žâ; ¡Ë@"ÙdHèb#¹ƒ“Nƒ»ø'75ßœ¾JN§¿Ç afvÃbÒÕ¼w¶*V-ÂÇò7,ºÒ¦‹$G–ßžÚ¸–:w¡˜›Øm:ÕÆîÚ±š÷­&MQ>!!}š™þajŽíFåÊÌ€„¼6ÅÀ¡Ckýv9†µê(.âQ„!!ñ„¦W¨ å lÝdҕ*VL¦+7êÄc7ÿ¬V#8`×ÃÐ%¡arÚ®í }÷»šè7{ëþ¢   ÙãP…°ᘂ⹥"«´hŽ+vD{ý{BAaïH(ŒAg‘P$S¼g•|ø{B"UFŒÐ–ÆÉå"¹»$ä1;†IörCó–„*gˆml,¯-¯QR%°'$lš¸ñ9D«¡P‚¨‘ôëýð÷‰Ùã‡Í™†•yM]Ÿr©!n\Wµ «ŠRÒX 1¸D‹i±¹×zR…BA ˆí”*°R•EkA£ÂaSom69÷Lc[ÁK[îDm‹l$ñI1â˜a¾ßöż¤$$Œ½óðöæƒû©Ò{î§Oƒ ©…R2;ÚEœãì1$DºÌ,Z$$jÇÍÕw°f …Ò¬E\rc#/ Õ@<êwDÑ°S­(^8¤¼zÉABô¯ÓX…&ðË„QlgqBÐìÕ'këŽtav¬±âÅ}õäüi1ßvIÄÄã´¹;g+Nè[©€$|é&žý¯ÇDMÈUÂÀ v‹r.F÷H1$ÄŽàEDcîÉ;¼ýiŽ7$Å<Ï$¡0òiû´ž5!«(”¬’gØM®J  Çc·Õ„øg¬š¬K |/I(a4sù2T!ðÐÌû)l­¢ï5N\¶èó.Z5¯üPa a΢yë¢ö‰¡˜;Ø)D ]ÉLU,Œ,-[ÊU¬ôO¯èªÔ”„F–.[k[ó×ú§~ž“5¡kZÕM¿[ÀJUÄsKËm©ï}ÿƯ¦Ììæ³ÕS×_ûé_öÎíµi8Šã’?£„@°I ÙÓJmì6»VwñÒ‰¨×‰ZÅ»((xaú0E¼LÅÙƒ"* ‚CD¦Cĉ ¢ât>Ì—íðüN²6©1½,Í~©ç Ó,'Ç_~É>;9çüÞBŠ-L¢±[ç»<ºòÇ_w¼…\PËiî²ÓœÃÓ°êéÆ$¡£““3¿&žLýž~Ìþ˜ú6‘½‡C0i(37JÃô鸲éN™uÛ!¯’h.¾Ø=ž;h’ÐÆ·†—œ¹´tääºöñ/BBu•éÎé7`²žŸ,!¡ ˜Àt~™ËÜhïØœ­„ j÷ŠwÛïAÒÀêÉ«7ÚÙÛ1–ýteõ£^¸/Û;ìƺ‘¹á³Á6Ö˜bB6ɺ2C6åHH7Ôª"!MD©aä— HϲPpì'$$ZX¸í}L•L­œU*‰½„–ÇœcB{@“‘n¨†®=•Æ„nBñ<ÔÏïÛ7x¤9¨$Ô=Ź—3,~?»‡žöz~%wð¿i®ÈÆùãáöøÈC¸TG‡ÎBW4¦Edñ³<Œ \=LšØÔ›Éfaמõqe 8p~G.HîåŽÌÞW»¶AjƱ¾UÍpàƒŒW½YNöçF» §c§¹e9MÃP÷ÌD×õéϙӄ¶Lýú1ý9öu ¢B[f~|›èÂf€A°¾–Õ:œ/×b#¹C]æ”IçÇBNÍ òµ­X³m dÖ}>Ðìð2¼å†{yî1Íмÿ`²®1²“Òæ×å X…Ašå2åÇûÏ^«¾vŒYl†jQ¨jIýͦ‡õÂì?Öw“ØÍÏÅÃëÙ­âCíا÷w˜°âÝ_ƒ öfƒbBI•pdwŠü£P«ÂΊˆ&!¡, ™ÒËwV”ÐúÆ„â%X´d;bŽ«mlè<>8ÈHhÞ‹¥Ú’­´kQ ûÈøj¼’P‰øN^¦#/~TàË üÿ²¤" ÀÅgƒXGO1!SbÉb¬ª; !É(² k"!ÏQ) …ä2$äSLÈÎDËYwNÛÇs$¡Ö–ÔÍ›Ç_¼€îa=-ÉVZ‹Þª†}䜄ìe-ÜtV,ßÃÉËtäÅòî°ÂµÆ!¡æŸÍjmÆoƒXGO1!CbH)l+åIH,Fj¤šHHÃÊxs¯èFBJsŠÊ‘‚†|‹ Á7mK@јg1!PkWÚèika+Ž YÕ°ü€“PiAtÞÝ& ¼6w‚b–Oj2˜dY*ÄÂê,!@¸`\2¦·uǬ1¡ˆaÚ‘„c™|­ ©Å£„°# 5y úΘw1!T«!Ø"²ˆÿG÷®Ôí¡Û¶2e)#HοÛDB÷ƒHÈWƒìGY‚bBLºÑGHkŠèšÙƒÐ=&dgBôKIh¡„T1ó„DÜ« ‚Šû{LKÎCRAÊl‹iI^ D`ˉ„‚ z˜'Äjo#y²‰HÈ.þAÜ»R¿‡n2Õ¹ÒPgO”·‰„ï‘ŸñõXÅ„Lœ±K.S;f(¢‹¢*9æ ‰E3ÎUô…QȶËyµ cÙ1—*z a®(»Kè.Jó.&ÔbTÐÛE$q4'!«xp›H(ð~ ùj_QL¥X)AÄ„T·Ú1¤T“k?!û‰ÃÎ$Š‡»‘H*Z²»„¦P =‹ %ncº4Å„*ŽÆHˆHˆ—éÈ‹DBþd?ÍB‰š…Qäî$Š¸ô©ÆÇ’[iÛ2!=âLBÈÑÊ ™–TÍæ’õ,¢G1!l%´gŠ71¡¥DBnâÿĽ+¼˜ ‘ ™P/Z#Ë “ÈNNÈ €ú@'D'„2Ž(:è„*/(g_#fBÄž ek ¿ ù Û@? w$IÂÀÞ  >Ø¥àoc-ˆ Û¶A×? ㈢cEŽ+e”ì_PÎ|Œ– 1j*ÖL¨Hÿ0ú2äEº¢$;É`ï† PìRð·±Dm[‚ Ë€>Ž(:Vä¸RAÉþ#ç:Zb&ÔTJJµá3 íðœ3õwÇxw eQtðîXõÇZë‚ç„ȆgÇ–‹3=~>¶ýÐ 9Pè„è„PÆEPõ?~¤ç9¡Æ³%Ÿ3X!fBnÔ:!:!”qDÑA'TCÁ¡„BÌ„ÏÖL(kÃ4Zù!~Ÿ›õNˆNeQtÐ ÕP°/oo13¡¦³-ú˜jÃ$CfBîÔ:!:!”qDÑA'TGÁ‰Ö:e&týt÷à{{,l_¼–»ðÒ÷غz피´së9 - e8˜ ¹Pè„è„PÆEP{ 5=j?*áí¶U~×nËÕfe)ß! Ð6únÊ {WoÞQ3¡h¨…‘ù“™Ð9Ô:!:!”qDÑA'TKA …zÍ΄Z]5£[ÞBt”º7¿n”êœÞ y/J=vK†BÏêÝ;V&$dZøLÅ,Šíö*Žq^)çPè„è„PÆEÇ{çÔFÆñ $á~/ 2}³/Ž „› w`j[Z*ˆA¡"´´•1*`Ä ÔRA§VÚbEehU¬Vœj™vdlu¦S­×Òq´:ê»ÿïì&$ÜÚÐDÖ!»9çìwNΞÝüò?ßîºIhU2Q(aMkB>Je¤ÜÓËãNe”È^’ÉEÎ'!O¥ÒãÖ y:0N(éHš9DȉšPFlâ⦈Ì‘â:& ~p“›„„2…Ò7 ­ŽC…ŠÖ´&´A© eÚP GQA¡Ì™Éåž,Y.'5ÆÉXòæ¨T†#ßS.‹ÄTÒˇÄ;ЇùÂæTÞ†„À(>¡bm÷(+—{óÞä^"™\qoƒ<¢¤X2ï’(™¬æ‡²äÔ\J&—‹¤ž"jœ,ÈÇ íŒò‰óÎÈ·Dê÷@ŒÆQQ{5¡$ŒË3WcUÉfS)ª e$.m‚9R\ÆÔnr“P†ã¼vÄehlóo&P º“×ÛÂ;(“iêC±–5!@J¤—Ø6f(ÌK$P®§0´"J‘X¦ ÈüHOòy#†g=½—FP!&4±ò$V•QŠ¿·(T©ôá“xõ&@¹Î2#¥Ô‚Z ,ó@ÕaÊ(z϶ bN×y!+\© ŽVÊE¨#œåw’19ó‰¢P~K' Â«>Ä.M(9•ç ¼x.”^W—ÇY]AQ¬5¡¸ØeH(6A(GŠË˜€úÁMBnÊp´mGîÁ‡µ6Ù­¥,}psæ„ÜÉ‚ëm”›½–5!FÑ!L† VFl ‰ 6H‡‰TFKˆI"ý6;– ! N46R†tx„à ÔYoEBÊ;ý¬ˆÃˆU,¤ûp[pQK!~hA0‘lŽ„‚ƒ<2"!‘ŸÁ¼Ë-$„bþT’yÆ:üÞª&„žŒqa‰‚Åf×%›­(/]á8M(#q9ËÌ‘â*& ~p“›„„2Íí(¬Ë«Û¼%¿xŸ¡~éE@Ñ~}5‰DÛ.w"}qp' ®·xPƧÁb×°&ªàŒ];æ!åR¼D^L‡ñ„àC¬¹%”’™I(S"¶P˜L$½“•÷%ñŽ`ååXŸ#!±ÈÛŸR|à†iM¡s$(ÉÂ(݇%‹C”ëÄDBëeb±DŽ|‰èt'¶ 0±†x¢ 0\$ŽD#Å”4GBR‘8€°,øå-ûØ¡ %gÉz4‹q‡YjAÖxS¤$;NR¸Ih9þ)HðMÜI×MBÂŽ|;JNö˜ÚL³s$”Û_þ,OB¼V´„ ¸“×ÛB<( ð…W·†5!KM;q Ž$40TÊpÄ_¹Žé22b ¹¶Nég1m!!¬¯WFã•6e”Cåý•¾¶ÓrðÊSr$éN–Ù1~ΕúÓ–¡T­y‡y± º(ʦzJ$Ķ&¼aø%E›lHˆ˜-ˆ¼øòüv‹$”œ^·# ²p,=;>!Á2c®*H¯ ¹Ièÿbê‡ÿ= )âUf‹@³Ý$t›íP»¤{ µëáCDB%]y÷mÍÈíן¹¯t¿q,ï¾R³c­]yy§hH=¢|³!w²àz{AK^{“3­fÕ*vЕôkXbaÑë”L¢Y¤èpFBAHÀTV$‘†ÙÖß ùYÊØ’”áÈÜòGFÙ’Œ0Ii±`"!©…„x)‰_Ú’ß$H$‚ÌEIÈ;8Tîåé-•HîPá„žœšžw$- Æ‘P›#Êa$d±“r†&”‚¨ì¤dUŠ›„–1'÷Ãòñ¡ÿËó²ÓH(¶¨Îb©ŠÕo¶]›¨ã2Ø. ™…¡ÆH[XìV¼© ‹¥¾T—·hœŽ:¡õ`^Yæí÷ö¶ÞóÍZ‚„¯u›L5e%ýçÚ®Vœj3™:«(«mW[ sI=jëËá·_…®v¸[tå2%÷ßúä~fOe®žÃtš‰[»š”½Š×ÓxÈ'Ô' 8Ã"y|å Bü@¾Ì|n‰„€0¸ò¶$„¢á¬L0\zÏ#!/"¡h徜y-$!¹ˆÃ™=$„¢ž‹‘ØÃbwe-°‚q$cEBÎÑ„R’»vîì|I•²J$TB‘.n·Ò‡.\úTùRQ¢På¿%!…Uð\Rz^Qܪ7Û®M¶Í–j×. s¨qkz ç¸${ÁáÔ˜½Us Þöäm]$5÷蹫õ‹ŒLõ¡‡z¥fÓí÷öÞnhA< kï|ñd{_iù®„˜ýÆ–¤Æj¤WhÚwÀ´w¨¼òû!'>³XÝæ Çîü¥ã´©«>@r»^dN—K§hB/|øá'ϸ¬žÃºF¨`ÍjBžÑl  ¦‰+gX¸P4ä ‹À÷òYš„‚‰Il,„#— ¶„¦€0D_Ï‘Peú¡x‰òÉóHHÎ(Š #$öP÷™dóIHº4 )HŠ5?mƒç"¡[Ԅԭ饼y kí!!Ur×`7v&§8‹„Ô/lÈ»o©ÓÕÞé–·[ø¶T×5/}®œ™jvì.ií¢=‚åÁ:Œ>lS|ŠƒªáG&^ hrcåÕX"\Î*x®¨@…4!z¢4sÁ^›Hœ=?þðžæv¤º†¼ˤ>¡k¶ Ä}\ý{w·TÌÛøðCæâ‘Êà‰¹ãr¿~Ÿf1šz6¦uá¼ñtͳO;„„:™ÈCÄsô|3<—?h‰Ú»»~‚HH·‹Ú·ßX‰b ¡IhGíüŸ¤æÈ°¥Á¼¼ûRÓ¦ÊWæ»–‡N\Ò)>kEŒ -±Æº'#2ÀeªÒ`ÉkT¢pãu~¡)Í^qÀÊG<·òôõ´ºÙa€Ì{)êDSy™ Èet¼ŒCVÃ\Äôz¹ ‰pŒ‚ž"±<| ‰ý¡ÉäÔ${HÈ;î}|#hBQ Iˆ´ ‚"wgÅjB%ƒýWë3!3Ÿk3o²‡„’o|ðçdÛUÎ"¡GÑ.SyåâÇGcÝ‹nMè&$¤®½/Ç¡MÉ=Ùmj+ߥÙr¥Ý¤¯ÖRg‡L¦â*sŠ£¾Uºú¯âkxÏeö}5¯š&Tc¯ÃùÁsÉ1 ¡¿}÷íüœ_~®p( mì?÷®Éˆi! í©Ûª±—„øH媛“Ðê5é:´N!¡¡šgù±Z…KWb¹  ‰Œ(ZÌbñ Gîü’Éî6ÓÅ}£PIB“—Ú¾|å]Èk !õ ÏÝ{ù›{Þúäåç.«é0›î4¿F5!ðoì6‹¾fNñÇ ƒy8)yŒˆ&HZ‚„À.|ùH+ºSi+Ú2 E“;ÎM8–ô.p> ‰d¬œJì"!¼’mX1!O™—<4ônü@€®›>GÀ+ׄj/Ÿú$40}¦0Á®Ù1ÕK;? q(””â,ê×5·N¶ç¨[³ë ´ýXRTªá3b\Õ¸~À ûoLOÉ¥.H$R¨Cp$¤?Cñ¡$šÜßzƒ®*@¨¨6¡µHËg8h—|üxÑŒ©¥bd¸¥+_·‹æFòuM·hùtk§OýjÈÄg«n=}¾Ù\ÑRý$”n<—#*™˜-ÔÐΘ}Q;ðËw³›µ¹H%½ˆr ABŠ‰ÍÚ•VrÒÉK5U˜¹Q¿´9ñ2Œ ÌcJ»·{êq&xW÷¢–©q3FCæâ‘ÊM©\È––‘?.Ù")pÅ‘Ðqý>Õö¡rˆC]uümÀ[ÇÐÆ£Æ ¥±ñ‰[òkª0Pk‡jªŽê: H¨úØpKÊÀÐr•:@¢ºT^ùRAi®9N;z„>±¹«ùN°Ï-ÐíÐPù®x;÷©_Ô"\ÛØES{ÛòuÏ  ‘SO­¥D'‘Ð}ø!ã–o¾~ಊŽÐõckSA„3HYOì 'hâIËH¾Ìz¤G„È,G£ÜR$ÈØ@å7XkBž‘@Ž6°Y2«8!/dr3j눓<$óINCøÅÚEBØ>d]@“k·ríX<ÏÀ+Ö„jó&0*.KÔØEBƒ7,$tcPå<zŠ~ùmÚ!¿Šr!m#üq|¨­ òÀÞž¾ .Ãu'ɸ~ÑWgŒà[iÿêíÓ&“þBa#‰ü5»4Œ„¸øP 5A­á´“G*z±Z ÁÈœá°ïúûû&N—?¥¦/¼®¯Ø–_ó"Ÿâ j02õ†ÌÜMñœ€qÌRͳ¬šPŒPIèûëÿüóÏÏ9¤sþýÏ?¿;€÷”Šõ÷27þ}ýŸÞûû‡÷¾ÿå»M+­„zmO~ùçù9¹MN´YBŠé«k§)Øxï¥6&qÛ§!ºud’G?“–‰TfKב ŠcãÒP8ÐÛfªygwK¡™„š:bJú/67Ît£Â­¤(šÎ9†„`µùÆ©¬/.õ7uŒ÷4=: IrÿðÔÓ.$¡=½ú±ÏN9™„º‹«p4Çi›†Ûé<ÜM'«2Jå;ÁN·äQU¯µ·]­EÜSmOç¦ñiRf·åc— …DB´¿®æPÙY$D°GÜ¢¥õUuHócYkS"“zzJøU Ö¥{Šm&—<¥6ùË—gæmI¡»6Úu&V½—sj¯‰Å:9ƒZ*¸©hŸ›SU ›š9Û­ûŒ‹aÕ”óÕÔgº ýøÃÏ£@|&¨A9±4;F«€d^ÿîÛQí?ü…uÍŠIH¦áJ{笙„Œ2 ëUñ{wwnFÌñDoSÇö¡š²Æú¤ã˜:_&R™ÂiŒ„¶ô6í£qIN÷¼Q™i&!\Ï~íÔù]ÇÚûRgôÕãÝåv9J‚Âcú¾­Û§ …µ—ÛiÒtËL»¾zçX¥fÏgûF¯]È9y¦*fo‘mz·Ó©×Žmë7N=¡†ÅiwÔ]Äͦýúú¤It+ºš:á„q_æŠHH(¿|¤Ñ]³¦D?Bû¯©cðôEô:Ioì=?§•:‘„·Ü“ñÖ'Xw¤ÃìuXÊ*Z›šÐm/öä [r¢ùÈ¥9”&Ùr$Äø‡_Þ–&Ä“PI×ÇÓ¦šMöÐv& 1ºáD:g2µ]4LôÏä]¾jP`Ê'êc B !s†ËN™„ÏN·ÕLwîìé+„&Ór¥©™³´¡¶‹Ì@3è)¾Ö>õøëÝ5Ïb¾¾äzkžÍ=ªk íç269èlØ8©¬/db?qQt?!Åñ$T â*ƒ8DzØTãZ$ôž†‹ ÚöÛï?•f²u$fªÁG¿ýþ-Å ]ÿãw€ÐŠIè\[›"™„hÈ Ïr$tv÷ÔC›3(N»õÉKºg†ÎÿĈ»`™He CVCõ ïî« @ýÞlēй¶S_þjHSv~ã#=jÜB$T¾ ÝÌþÑ9Œà)ªûê™<šY^ áÜ-N}ìÔ»õ4ç6ÙÞ2Ácý8é_/ä¾8°åDú”¸å­­¯½•“éh‡ö5×e=š¦Z«šÐjrš8óüÏHH­äÌOtšPQv¼UH„ª éfš;o5uØABIÛAâæLMH׬êÊ¿øxþ+q=ìåöös­IˆÏpÙÈi>Lù¸î³·§§>;``ß8x¹Œ¯2€N¥*©4°C'Ëk§œjêK¿F³Œ„KÝA$Äe8ˆ„J&•˜ûØ÷4a…Žß?lÈÜÖ[þ¹9Å‘$”‹¯ìÆ£8¿“ôd]ÁÅ4!3 ©ývýwHAX§D¼X‘D£•Ç u$ò37Ê7“PÉÎéöšyz„–šƒÈZŠ„(ð‡‡SzÁ—=ØtqÂÜ[OqUnÿ9šÇ©žÁ«BB$–“EҜܳ—jf9RÕíÂjEB›ùNX ÕNÓ¹¯Y}øÒ¯õZ 8õ.šÐ댄†Þ…óó•ÿ }ýM! BŽt¨]‘ÃØY>šçÖ„œo,úÈË:aCX¤È‰æN,,Z†„âo¦ ©¬žºªˆMÏVÝLRÄ*Zí"¡Lüùçñ?2íÄ8¡¸Ö£ŸéG¤"CAX;rÀŠ„F¹ —•„ø~€ d*nxÿ”®y ª,~Do˜Ñå³Kgˆw˜ýzDÙ—£P$î.ÎÁNµ"¡Ã\†ƒ®¢?»»/'s<æJ’RÆwwnïî,åS4Ž$! Ï®80P|ªM5øw©8!+ʈûþúw³¿ü\˜ñ#^FA…´Š š ÝFœ-©?K8¢!3R(JFL€FB. EÜFLu)ƒ8—‰T>6ÜWÚÚ¾ó£=5U—Õì´’ÔÍ\œú˜ÒHÍ48‡ûryÔM§ò{E•¨Ø“þs ±ÿýF©Cà#Du7±NXYœÐq£A{¢©yK¯®[× ­ØÝBû¯ä89¬b6|á™ÐIqB¯e$Њ#ªWæ0 $”•îÖ„œob©DôŸj”Š±¸M(.µ.»ÈlÙu„–ׄÔ]o¤}†¹;HhÐ&;˜”â,2Ž¡eå»ÎöèîM{L{l÷Ô›Ù± >#ÆU?clé}Ôw®8'wrxê3LÕN7=zYoÐ2žú¢§©cËåc;ß¼·G÷ô£ÁŠ„ø Ç4¥ñ´q¬¡áAíxðlÚû~ýèQåØ4d9>%Æ¡šÐŒrlÇ´®y|~591®IB³³_ÿyâ·ßÿz^°^8€åO(‚†4·GBê‘á©,\‰„ð/†š*‡×ŒéúøȽ'¡²™á±O—eëÖÝ‹yçÌe"•/# lsx¸só —UŒ„ö¾o¨°Š˜n„²‹€æ{Ó(Ü‚-¾¸ä¢$´ç‹G³.#k ™tYÓFÃ(Èr;× +#!„‚É?_yœ"¦‹g{›î½ÖüÑŸ¡^•Ü=•–VùßDLó+BpXÊJukBkÐn® ÁTÙfKGÞ2šPí£û2ÕPÇeû4!²ìÅiš»ÔD?V¦É¥¶°+¦ŒÅeãÏwh¶|ñС/ª`.|ƒEþŒ¡>ùveÂÙ÷1 ˆ.0N=¨QS€(§ö«ébÝc¸÷Εn„)ä>ÙcÂb#¢EÕ'Ï”<ó,Ÿ¡qLÈ.Ö3™0Dz³{BSû•¡b˫ʧ8 )ÆŸLC—®N2W³ÏRËPîß?ç üõ­fÛ_ïUy»Þ‰ûþ7„Ioùûú?ç° 3`Ð_Hý ¢ÐÊHhæÌ&©¯ájÉ9‹!3U™‰¡sáɱʳ=&cßV„WШ¡.qÒ‘e*P³\¤2®ÜÔ·lÅÔÓÔ.lE»…œÄÔ~Um&¡“cbO¾½O»ËU\ýõ…®IB8Ì‹µ‘‹ÓVOrÿûq#GÌË©)ª`\Áµc¯\ÈA'“÷ì+ ÕèTvß¾ÑIV£&÷äûâ¸7ZÏÿ9‰„¾y“]ñ.‡±;@Bi*·&´öìæšþæY‚£Ÿ;Æ“Ð΃l±=ÙýÜ1‹­ú,oÿצ8ëi¶ÁsÉ‚¹³â<vwÚá $¤¿°ÄãpZŸªq=ZÜ(Nèÿ)mo„h~F˜*RÓ@B;bÝšÐÒ&ñv„©·HXvSMh¡´ ÁA$tãGB]nš3!‘ýšâ,²Ï‘ÅfgÇ®z³]œ„ð\‹¥îô©·/G8ŸÊ©Ý‚Kø]‡„bÞúúC³mÊt´CÍJ%¥eá^Ó±nMÈÚÂý×[=¢Le›+÷÷÷²×£,7_” C Ý W7 Y™¿ÈþMq áÁcésÁsªÕo¶‹“• üS µ9Âù”Š8¡:ÄsÇŠ@Bi ±nMhÁ%î¾!~xZpŸfÜRZnU…xà•=UP& M(iû ‹íT¹Iˆ3ែßçtUésÁs±h¶›„þ÷íp“PÌê“P|z¬AåÖ„æ“?{ì†d½¿ìvHèN%éKÒO‘ Lšž;68gÉnâMø§ Á7E¸']7 f8 ¥nŠ )…²Ž$¯=Mˆ»²]"]†„lËKmIHì-YúZy¬›IȶˆÔæØžËì]N‚*DÆÖhá&!΄ |S„{Òu“`†£PÚá&¡!P\:=vcGÑÒ„äaa¡Aa˜÷Ëðz}¼Ã‚áÈ‘²#ÂüùÜ‘JbÕBBÞá¸]¢•:…Êuð“m@¦°Èy É‚ißhþI«È cïBèWwÄåÍ5!s“Ù„ |S„{Òu“`†£PÚá&¡AP( –ºv4!9EIšùƒQ¸'Å{âÙî y°ü0KJt4Kð1“ìN%³@³O?%gK|¦¯’ùg–'Îâ’#A?¾æ&øŠ(7Yp»¼¹Ž&”á&¡åLø§ Á7E¸']7 f8 ¥nŠ %d„ÍJ];šÐÃÇ‹Øeƒ<H#]HB^a€¢,)Ê€P/_l&åHHì¯ “‹½Ã•Þ¼OÙº(©$4Z-IB~^¡¯À¥`0OB‘€ä¡ÿ²sv»iÃPv¬4ü5@Ó±a¨B(DšD4 ¨ u“¦J<Ænvµ‡êcÎÇù)4 ÛÚ°óQljO,ËQ?;­Iû±¦VÙb—þU©æ˜¥rJ9¡Tò>à{Rr¢q "Â2±ôƒLhŠÄ„>lÁ„6_þ£œÐÞô[\&sÊ{&íŠkœI}1¥ ACTð4 P™«È6Låñ>!0!ø5†6"¤B¨3&‹³±m–ÙsœRNhž¶<¶˜ã{Rr¢q "Â2±ôƒLhŠÅ„Á„6_gÞÑ9!>²n×™tR.™8Ãð˜7±¥(™LjÀetiBШw)€@°o¨¡( 8—e’&Tì Új`Bª(¿2}Aãü9:¡œPš -柔œƒhÈ„È„°LG,ý š¢1!o»ÖGæ„,gѵØtàt‡ááwM¨›îG´˜„W}¿Ú»i‚ AoöM¨ â;aB̼‚HÍ"Kå„rBB…>/¼C,>Ï1>)9Ñ8 ‘ a™ŽXúA&4ÅcB«íÃFpwï“r—»LrmBÊó&d‚/ ͘…&Ñäî~)L,G;`B´À5 ‚Û˜¢4f©œRNè Ð?z9Ñ8 ‘ a™ŽXúA&4EdB·«ïàÇ*{N¨»LâæÖ„ >ìâo&tÃM¨iˆò(˜T×ÀdŠü1¤)¾*Âr Ü*3V7ä=®"*\û7EBTe *Ö!JM˜×ÇKá…sBëY/ñ³|K&”™™–鈥dBST&ä}¹“i¡/³Œ&ä,%}ǵAÑÊ« 1øG?½Ç„zÂXj± ùþU­)ô'z‹^ºÒóuPhúÕRÑl€ ÁòX³V•Û‚ZŠÆÒ„`YLˆj¿”4¡šU?WÞ,…Î }:2¡|€hÈ„È„°LG,ý šâ2!oý°¾m3™Ð(ð !¬> rkB¾àFÙ1!jÊñêØ9VË‘ qÝ—œ³:]÷¤ ©—>Ð*‡ÕªfŒšò.KšPåÚj*T§ð¢9¡íÇãØ®ó#Y@‹ß÷Ýð‚hwÿmÄÐíCM0ôK€}:zHú‘èN^ÂbèÉ_ èýbBÞì~#ùq›Á„÷á,€÷—m7:ºŽcO:¿š5-È"Tu†ñ5±W^ÏEɶÂ0pQ͵v_VsìÑŸ˜UÁ0Êà:† \†ò¡Uôºª†™’ñ†A¢j¤ ‡¢º á»®ëu(…œ‰…3A+ºRâÒºå +ì´1ƒ L3@‹TCÑ/Jòž­™Z}8ŽõÚ#‚ ˆ<“4!àö!r¡wYRBíG!±&<:Ó_8¤ u¡ŽI¢è†QúÜŽ·\ÛmY²åá0Œf‡ÁÛ‰wÕ^0¡WAkVX /ÿîØ<û‡vLçDã@«c´:†e:bé­ŽM‘­Ž³Oß6’÷gv ¹OÄ´­,&Ԇɰ—"r’¯¦M–ŒX*94!^íñ”ÓørBdB¹Ñ8 ‘ a™ŽXúA&4EhBž·º¿“&¤\hês‹c¶‡½Ü¡ÝÉ`B´ãR70¡]úQ¨v×±SÉ¡ 15E„^#'4?æC&”™™–鈥dBSl&þu\}¿ÔŸ–¡@Nö°–€mY£4šL&ä -w™( bêO,Ë•%¤„ú` ÜmOØ«¡•4vZPNèÑ8 ‘ a™ŽXúA&4ÅfBÀ,Ì £XàlûJ'^Ûâ](ZLh$&JýÈ„ºòÞn†šP¹A9!LwûÉÞ™…8 „q<†Ún×ZÛ­VWk±jw½¤µ¦ñj m—ºµ5ÞZA Šâ±^à…xŸx¡¢ ž"(¨à‚/*x!‚ï>ù&>ù}“nÔN5v›t&|L&¿ü“ièEõ`’IB´4GZâ0I(D }wd›`d¿.?ÔÍeg‹ó„úª´#ЈNHH-exá–¥ Ò'E`æ‡Ð4&¿.ezBÿ“(ª“„L¢¥9Ò‡IB!ºHˆHe¡þŒÅêîòCVäé[`ùgGÅ¿$¤áÃ$™†LªkOˆã¸H¡ •Ê=¥ÎEQ=˜$d’-Í‘–8L ÑEBOHd±6uSHÈÎh5X¹ ¦U‹úSÓ ù 6”„p½"¸O¨F²y¼¦ÎUkO(«¯h„Æ=¥ÎEQ=˜$d’-Í‘–8L ÑEB¿zBŠl ö~î..‹ÞÓWý?%°øø™üF{B8×Ú÷¯¢We·70äIn¦ÎUÔï …ÇÿPÔPO(5ö÷JQ¸§Ô¹(ª“„L¢¥9Ò‡IB!ºH¨Àú£|¿<>H~bÚG5÷ IB(¶e„rp™¿,‹üt~ø¼:W1žÐhQÊ|—$† ô„"á?P˜£oO©sQT& ™$DKs¤%“„Bt‘P'ôgµjPñ¥/°Í eH™:.LCBª‹4¨Lb"ŽËü]Y˜zWžP8-‰ã&È'f„¨1ž®%Ó˜Bôí)u.ŠêÁ$!“„hiŽ´Äa’Pˆ.*ÉRï^ ¹XåÇ¡ƒÊE³Vd”ùžjcv ÈìË$!¿ß'£Pe$ÄöózM,ι\VK7·Ÿ\Xc7¯§[#Î5¹š»×Æ0]!©{OHééæù®žLW—‹,aíîñºm8gw¹ð]÷†”èð8z² Õ*ŠgÇEÕ7Ñxv‚qžPô ŠLRED}(ôvº& QÓi‰Ã$¡]$T¢'Ä€T4Ì’'±"È´e6ñ3ÆI’?·Ê$¡Ĭ!>6à¯èêXCoål$>Ï@ò®‡2\}p¶OÌ6óN/Ï7Zàåa˜dfÓ$?ÞëËã8x”XJ.»wW†fuî E„ôhŽSGzÏÆó„TBÊç'ÄÅø„|,f’,ú» êC¡·Ó5IˆšæHKÿ) ]u™(—¬y•xB¨À -ù øȯ1tZÔôrIH³Â²Ùzyzà ‹$Äð êÞ$¹ÝÍ<ß$C›m¬³ÃÝ>ÐÄ8œât($ä…7ž2ý C’òöFLb<ü—ÝíìM·)T„'$¤ºc‡WÁŠ'¦ÓÙ̪´(ÃÐ_"!@¼ÿI¥t†Úê©y(´¬F-0:züw…#„ý§pzi)NÙ’W¢¶“H*©I+\ŒÎc3-q”N$Å_l‚«r}èGrãál¢­m5/°BOrù¡V¶€Z¹ÝÙ¯BPYwLkÙ+È”«.{X`’P³ Ï÷a'ï´@F3ïAêC®˜YÑDây‡zŸ’¦8md¾!¡&¬øx²Þ|´Æ趄Šó„Â! î Åbãâ‚´jéÒ¥€HŠýZž“ÄÑY¹Ðÿ »¸³ËFá¤CŒ%qZGŸª‘PX”TeãÑÚ‡ý‡¤.ë4ïÇÏsºPsyT²´•`;™Œ“öÓËr‚ÒVf¦g% ÷¶d¥%¢œ^òѬ4ë·=ÂêýÒ²œAµ@gÐ ÇUNû½oUmx›Jì—»ÁÕÒ\}„¨–'´ïÞƒ‡»\j^`…žÊ¦õm ¨i,p&ù•$ß äû*~HŽ$ÓÁ0ÕÃϵhŠ€LåÒš2Ê•¨&paŒ±*"OCWž÷ØA^Ìoæ›”ÅåèÞ“…- u#ðC.™Ùðê˜ú Öaè¹)¡"=¡P‘žP¢CÌ'ÉÁS€i‘$„ $I«VeÀ!ŽWƒ„:²4« MKÙY¹«'W`˜‹ßO™.‡ÿQg¡¶×f¬ÃéÕ“KÚ`4Nxì$ÛcÙØ$9„žÉfó$%{ G- E~F dÄHUÖ’XÝÑ1“+í›ràºÀ¨”zÖlMlç7ï&êóøáÛ¶ÎV’8*e¤t>õ½¨›r;YÒI÷[VwâãŠ6Ø»÷~$ºÄÓs¸e’ó>ÜÝöjIŽV‚ÑQ8?6*fÇWc-‰MŸ¿|ùú˜+%0îñ›c³g?Ø™ª" M;ñìÖ¶½O¶’ЦÌüdÉ$Ô~OVÅŒƒs¶$õÚå““¥,Å …mµ\i㘧Ra h D˜¤áÙjnî'¤hùdƒœy`lñá̼hÛ¶W[®—IB÷ï>{qêÖÞ•“) ¡Ä¾]³AÇ.ŽºñðØ.—š؉'ôϪ7?” ŽJB@4ÖHè&Ëò„ßÕê( ¡.°<æ{€š4$Ä°=Nžö_4ÔZþþî'$¡ö;¯oMB± q$Æãq$¤ø«ÊÕ±È賓f¬Åcüöãñ3ËrWÏO‘À€€¯ ÎÀ¦Æ¯Ìy4üˆVŠ7&Ž…ÿXhµK@ßÝ3|{åÓNê |T’fE¯Íyg¥I\=›³“Öî˜3¶7\þ½s j£ ãxu´õ/8¾8¾éc¸$ s0$` ˆÐJh4ˆ¡‚D.rI˜`¨ ”Km5Ä¢r”V¡ÒÒ¡ÁA tfpÆ;ÚuF­öÁÿ·'ÐFc -Ûn¯%—½œ|{v÷ìoÿßwöŒøÙ¢’wéM»Óµ¬B­Û>h/Õ´·6íTëÊ„JB‹Ý”e–-JYR4¿RôùŸýòçßÞe¬’)®¦ë@âœ6t¤q?>*Äa¡lŠ—Þ@BÞPBÊÍ¢7-­ÒóÆŒJ¦Qš€$tHWòêÀ”Ù¸;C‰s'²W?AÇ ]IŽ)MeùÈD7øñ•ý&íI(í•zÜ—Ô/NB¯¸šø!¡´ÎS Øj -5"Õ9eÃÝ–Í)ä;ŸbÜÑnu.ÝÊ)CÎ0(Q¨»ü¸ä$™P”ÁU5a!j}¹ áïx eáÒÝ(.’H”^”Š}•«Ö=‹‰œÛL¤õ[Ÿ*š¡ãufújÕU/ðšÐª&¡ûÙb2ÐuD7A»Q®ë!-J9>1jZ ¡ûHèf¶Þ-Á ?ÚtM~„’§oîWTÊ+Ü’÷ü.bé$ŸL$” ‹…Šå)c:÷¡†‰?z Åb:|BDnÃHÍÀ”m~böø'ó–­âUk¬ÚѲ·ãª´k)oÌeÓ[´tÿé2—)Xuðr½ —¦®6Û|©ÊÙæI(4¿©ß¶;+KBOB)Hìµ:C&¹kY[kÁÖ\µù­C†j9]‚„JBq¬$óÌ#NŠ(>~¥‚PÅ/YÆ*’éÆbŸ7Njèþ¸±ZÉ}û©ñé¡T…rÑéTT£ÆÓÙÓ'³{Š«½EJPô¼eCi•Og”G†i9 ¾¨’¡F^¡6S×&$6Êzm8Nj\tLo̙ܺ•S˜h( Û6æpY*ˆ°.ºM ¤|uNYŸ-àÊNìD$ÄhJœHoш¸3Jìr™·ÇHˆÒCðò–†°>q_†âòIˆüx&vgÎ;Œ2p‹¤Ll¦Û‚]ö>¢91 ~“è#Ô£@÷LòY³µJB Séf4øj:ó¸ÝÞ·Ù¦]œ„Ü)F%jÚ€ÿZ¤‘¶ ¦drÐ9év —ߪͩâÍ“Û¼¥»ÃZ•W_›Ú?Fû*WmsÙì-‘PÅÍ÷s“"X #nÑÒç•,Çÿº&´Tƒö|ÝÝÐyº…ë;öðƒwBź\‡×›6ÞvÛ9 ¢è­ĉHÜ}3#¡ëiï@ÝéOB÷Ýç-×o|êÑF’j+© ÁÚˆ„²æúöÖ/CŠ‹g12P\l@ˆ7’ïFú²[-ZgkST—ÝB$ÔµÇ$ëîЕ¬êÎd¬úËK»¾ìî0;¤7í;duŽºSÞpÔ¦ïÌ*ŠêÂP•,RJJ æ‚„rteáYˆŽIVԕŘɨ[÷•»–Zu¢hǨ¹&*. )58@gΖ(ù"¡þ?ÿòæþòçïËXÅ;|RKòçôé„éÓ©G†O'0. íyã¤VâõBòÑÔ5V{½Êé¡ýÅ3š#ÃÜ,nš²§q_f¼Ã§³`¹éâT¯2°&¤Ÿ(œs@=ñ‘½`÷¤½à3FBíöY¸²Ò]›>àhú¬ÁêÜæ1±HT×|@Êm/á|´ÞæÒ9U ! #tMKƒÍfþ¸¼TËH¨Òƒƒ‚¬ßehß,輪 ÜTYÞ¤½ò÷ƒ£ŒA7G€ó&DèÑGDqá*8/0…È{­%â¢9‡k":Ö3|òÃá™­”'ôô§'5â:HH4«®¸+ %PžÈè›o†Orˆ“ò„ˆ HÇI‹'å#¡Ñò‘g2””'„«ø+nÝKOªÇàÀ{:°øÁbICÎ6¡$TÔ`­Ú‡hieymzdÅûÛUŒ„:t<¤E*w¶B¤²ðþ©”W@A8FU—CBþ~är”A·MØ8‰x—½4ª×nbLRõNüòèr¾÷`q "-äŸjs×f‡K –jABœÇíÖ*¥˜@1R¹„C¬è=·ËC¿Šõ©šé3HrÇ0µcþpþ$jäÒHhw|>6DU¼`+ÅÙ¥„WâN{A9AÑD~ó ¿0%_$žííIP]õת&'衈GîïpyBEÁAø{°sï}7QMÆ!cæâë(èõpðCA×o‰hM·ß,º›K2=Ìå‰(„v«3*{SÐ#÷o¨-AJFJÄ9’%E]DÊm°N : ™Š¥ö“EÅÆÆ1¢<¡d¦ñ¨ …GEQt= ©ºk’„~ô£±‘£{,ýåÖþòÚY¶ñ9ÑQi”œS4à¶7©N€Aü“¥ªuPà ò²à2£ìl-P —„JÎþá´œ=“-æ„*ËZ I@> b$Tã#!‚"Ü+7~J$¤"úéS¨D*1‚tRËHèëÆÆFðÿ$¤sFú"7‹$¤^ ¡4„VÍ™>zâÏ.Ã^Ìú_bb €Ã„„1«ûJ—¤~BÎËN €mïI8¤ÐÙ+ £né0”]Vž¿¹DÈYÛŒ’›ò„*AÄ$89à¹J[·ëœÊ3j©×½ž®ÄJTÙ½Œ`XžP'âRHˆT²)ó)FBrœ–8CH(_’Þ|5;oº4ÊCÐÝíämS?[4‰ØŠŸpBÕ:‘çm>¾ýŠÐôŒ¶ú \³šÐâÐùŒ„ðÅo†Ÿ]hæõ.{Ó#·o¨-aܱè¤óF] ‰‹—]Dª˜µÙŽ¿ýsÁÖeiu ì)k¼4Am®”ƒt%-jsfH»Þ2‰´© 5؃rª©´¨cÞ4ùo2Ô H%—…B¢bÀeÙýõµVg8\pžÆtV&ᄈ‚~ -DZ:dH(½ˆs©üHHéú”äž …Ü£TJ{c¿¦§‘›•@ Êñ¢DX 0¤‘(%ò ;h·¥1’Žºq%5 I¥ií.‚¢€½õ)Æ0i±“´­5 µxÌ\ií xÁÅb` jsP¿OÀ±‰|¹loCBÚóD=æòI~0Mˆ(lÆËÁ{ "W‰„üž¯) —.FÇäÛfºíýŒ„Œ~$”È¢ââ÷+Og©Ç-’ýA[™ê™]Ö*T©¸´bÏJ¥žÞÈGžW)¡+Y ïƒx]Z¶1âÇn¸ãÞMjKЄ$ÉùñD),x•v± á°²OdHÃ#‘´§}µÙZ‚"ZÀOiíÜ5¡H¸Œ„²ÔÖªH)ø˜%“YE‡Ì5cŽ&Õe‘¿ #x ¤ï`¼°ÿ©³µ4¦Âøèd$$ JÙëOB´fˆ’âÖ‹§Ëõøcsmþ$äÒ=1k·tcãq†<þÜví¥‘Ð®Ö¾Â†ñÄëpÛqªA÷îÇàþðWn³`”9€Và¹-W&cÚ÷A®iMˆo‚=(Üç+Ô„üU¨BñI Jº€&”÷&Ëà«8úìòH(Šž¨Hº¯$´ùÇ錄Æ\.«IÓÿ¦SW»1y ¯ ˆ0é°ãI«Ö|õ qJFbWAÙ¢çÍ:ôÚpV»]ú-Õ ªÿQq¸*b)ëvÕ “JG’ýn$Ëjò¾³hÑk{†»uNÉT™„Äeg,ÙbÞH–öë/„–µ¥ÞºáF¤Bãb0£÷ìOà&56WkÄÔi ÔC¥§³1Û‹?L£YlAZ 8UjDß1* 03L²Ó»Íá²—&:£ËQÉ·M¼òÑöQk¾)»âhÕÖÍ?N$а¥Ý‰¬EÀþƒ{ßc_MìœÕ÷u4%´µÖ¦ƒŸèš\I$TyHH>êÖ÷=æ9A°¤ Ç=| 9IÞ~|¼fEzÑ÷3?’}”1«7iÚ[þKB`†\€„² ?øØÝôò¿H¨ 8˜³³°pÎnY Í¡nk›ç&徿].™Ä,ÚmȽ®Í^~#ˆÅE8á\)ñø(ìÛ²šÃªnìªyœs‰ƒÝõ.¿¦'šù3êñ.„×5!PPÐÖž-EÂ?ÿ <Œ;FÎŃ…È¢cÖG`õ³ÕX×øh Ib4’ºên_Ã#°V̹]vÀ׋A\„‚Ÿ(„D8%îÿn„(èÄáAÿG`*,N&§PÚŠ•H~ŒŽ€2z“Vœ—,/ã×àI7¸nà°Q܆¯äÇ'ˆÉ0E&Òp\ð¿âMÐ #ZILù8Mïyè7.µ’‰¨±ïVîɊ̪UB(p]Z³¶Mæ7‡±èAB0ÈBë$äg‚¾] ®ðEB~ÝÄÑIÑWÝík˜„–` !ëD€Ñ.äû^)Ãfèuå¶*ÂÎ4 ³+XÉ ªÕCBâžé!Ÿ}Q£ZáS×5¡u[yMH³&$ó=_á·¸u:Ï„|!»\á‹„dIÉÒsÝâãC®ºÛ«œ„ÐKk>@´&qҸƳ2¯ÜV!*HÑdŸ º’xòKÄZàº&´fMšPLL, ¼šÿ$aMŠ]'!fÂo‚ï onr~\ì¹nÑWßíUNBç™À·J¨îg+¯ºBšÐ¦·øO¸E؃•®Jˆ&„§+惃`@¡uò™ð› Á»Â_£+;× .Dn¯“Ð5ïÇ: ‰…EBËÔ„n¸õààûﻇ>ŠDKpôöˆ{®‰n=ïû7,B‘HôàAÚ4êÆ%Fw½aƒ°Lš >–ãz§ÅE­“3á7A‚wE¸î: ýÃÞùýª Cq¼6X)`|!¼É£7ËöÍ~f{ßóþÿÿcç´ŽiæîÆ6swý,A¬¥šâ>9-^1ÃQJÁ„Ž²LhZNhÞÀ³Kýiÿ]š.Ò@=¾ÏÏc,•HþÞ„2kå$¿„ä„h~ìË;âË—÷Äë`Bù_AâC‘û¥LHÌp”G0¡£,š–ÚMVç@›L2¡µº0¡ò°Õÿƒ Õ€$zʜЧ×ßyïxÍLÈ#ÿ+H|(r¿tƒ ‰ŽRâ&t”eB“rB Ðh~-ÖêdB:?âÇ&Ǽ qýst¬ÏL(ŽÔ ‰’E¢ý®v»žÔ˜ÔFtúÄ…0_ð«7¡Øø²ïu汯cNåÚU'¢H/lB:Ú±oѸÚ#Úø|íȘë÷ŒrBdB?çá…¼;åÎÔÁ„‚ IŽRâ&t”eB“rBhbÞÑÊ›)»÷ ˆà°¢OgyÎuŠ<ã#ò¼t“cÚ™PÒS¥µr•45³: ÍoBÑÌùZÝŠe:ùŒCß[PÜ%—–9ˆ]B»=l’cNe µ+Í&Tm¹ª9Ëô$*¾0®ÃqŸªgtѶ\ÔÞ„J8b_ÛùèA³–›å‹‡v=/öŒrB/_=bB¯^Ê»SîAýL(˜”á(%Ž`BGY&4)'”èê}ª”7¡Ž„Þìün“ª(]ú¨ØX-ŒËѧ-£TæfŒ³€(‡#S·a äCî‚]Rl; eïÜ®å¨lÄ&Ôvîž%Ó±ú» €J-ZjŽö2ׄvÔÚÏM(ípŠ3Ùà™± ùs\ˆ{N9!R¡GDHàrçê‡`BÁ„¤ G)q:Ê2¡ië„28v{oB‹ظŠ²h«"'3°0¨¹Ÿs&„¾Zô,Þ„* [šu%5°Žb:l¡nBm iNqGJ×èH¶{­¢ÚÉ[ÏftJQíã4«]N¨YDI¤ßM¨Y›H[ä©S*CE¬|óLýhB±é©†Ñkçƒq¦•gOg2qeÝä€Mœn+é°ç”"úôêáôw%Þ)wŽ ~&LHÊp”G0¡£,šöì˜Þà("6žÁ¯w^ñ~£•“‰„6V©9j•º´‡²v&ÔkW?;™PídI6¡”›q- ê&ôhW‹èd3©Ÿ–ÚóK’*??×ãÀ×°äò1d|I¢˜ñØÊG®rdì|uE…&t¹bz ezne˜ûV2û ÷!üÀsÊ ýñ·Þ"¨‚ ’2¥ÄLè(Ë„¦þÆ´®²ÆÏëøÓþrÃD ¬Ý:ãíÞæ49öíÙ±è» åèÆgÇ* È.» ˜Þ8]³ŒS¸¼8édBV¼Èùòٱͅ EÊe¼–hQ¨ybW>bB±Ñl´ò´Ø)ß#÷ßì‘èžSNè:âo½;EP? &$e8J‰#˜ÐQ– ýÉoLÏ·@~aB 7E¦ükJ›eQÕ°~rìª 5hF*1¢ÕM0C Â8ò¬8ŽÝjÛþ™ 1Å_;ÚüÜ„TšY+åÁzªœÐ»‡i¼ &tê‡`BÁ„¤ G)q:Ê2¡i9¡r¡NîÒ\˜Pâ-G-O‹ƒúk•a{@æ'Ç®šPáœÃK€¡fbº:¡ø¶|î¹:Ñ!§ØÌhBÞrÊ_™ÐØ_4¼¶°ÜZÏï~0!f¾o¸Ä±CûiÁìÉsB§Lè>ÔÁ„‚ IŽRâ&t”eBÓžëP›HñòÞí… ©Æ­tNè"v "U •Ÿ»jB3*ÑJ¯X´…M¹¹T݆r+'i, =E©×šç© ¯!£ ±ÕÙ…Ö«Ù#&whæÜhÌ2¹æY=‹6Qq}iB‰VñxÅâ|ƒ}ª’0OžúüaŸß½z9‘WtÄŸ#ûlrÔ×C‘š« JûÚ!â"¤G)qœxpáÜK³"ùg >üENhƒ‘äÒ„**Ú´Ùx—`ÁÐÝ·'é×M(mÛ[8 ؇ղîzu"‹¶ÏÆݺ¡ïNO¬Õå²93!Ž—âæKù¹ ñ'm±µÜòç"ÜÅÑpfB3ª×Æ<—mÙº­ž<'D&ôò÷ÿ…gÇîAýfÇÂ옔á(%Ž¯ìL[UÇ¡£-¥@ðá¿ùg‘QÂ6p–6£ãÇp¤C6I™² °6"âø5¹)hü1ÎÉÈÀˆÓ‰‚’‰›3ÝuÆhLÔ~ϽíƒÎâ(¥òØzíë»÷{î}½ï}zî½çyFÇ4âsrí˜D(—y‡JhS¥ò·½Aü”2Y°õV/U©Ø •Ê"…ÜÊ"*©9Øp[ ,Ð×Ùl‘æ.ñW)ü¬$ „ÜVe¨Ä× ë|a†ìKï¾¾’ù7f£G"Š’òݾ¡ÊP_ëQx|ˆï:!§Oh””*ʳÌË:Ê¥ ^6û·ˆÍ'äY;¶fDDíà!! ‰åë(;<$¤ ]ïòÈÍ+ŸÐ­$"j yHH,_G±Øá!!¸Hh¡‡ÀCB7·x|B·’,©âãN²Ï#¦S"Þ‹®‡„DÓ-Åb‡‡„4â"!OèÖOèV’¥´Ã¡-Iÿ‘T¹=)ÅQ’îPrÛ0nÉ5ˆè”ˆ÷¢ë!!ÑtK±Øá!!¸HÈãºuÄ㺕d í ;™]½XÚ‰ª–¡£ÅAÇ8;Y JÒhê»j EtJÄ{Ñõhº¥XìðF\$äñ Ý:²ê>¡øÅD”=e‹ë$T·­È±O¨ì®ÔŽ£ )ò¸L^CvxHH#.òø„nYmŸ>6ѱhãÄØSÖ¸ðv8”œ¨©LN¢Ý¡­éí‰MÎñô­&='¡¼óé%I)¶]ºCÇÙGÝ‘­é½U-t”›q&ŒŽu ´–çÖwMÎ¥çêÅrJÄ{Ñõhº¥XìðF\$äñ Ý:²$ŸvÃ&›à{²’>!}ââ/ž²Æ…·Ã‰¼â”fCÇÑâ²ÏÛ,Í™9–¶ÒÚFBãË•aWÁåfË•žÝºûf,m\Äè˜Y_öù¸¥ªÁ€¼ 4ÍfWwŒXZõX,ùµ)"9%â½èzHH4ÝR,vxHH#.Z–O(@êbd•ÄK\,¶ý‚¤×,—û®di¡r¹ $ÝéÚ°½|›MÊ“cã®H(>6qq‰_OYãÂÛaô`Íð ¥gx0º7¯øø¹ª–©Î¬ö±æÖÜãå%¦Ù¼âgæw™N6ÖlŸm4ŸíÎ+>ÒËH¨ò\UÃ}ý¥{yJÐT{$”W¬ÇèXÖ®±æžö­å%"8%â½èzHH4ÝR,vxHH#.Z–O(јíÄG*u&. "L‹„‚ØsñUJ¾ªú:r¡Çª­ Èé¹l΋û}BÚ­åÛ7Úd˶-Ú¸ó éÿKôâë)k\x;ìëκ6c)½6Óz¬«5SóÂ@ÍåªÍŽÞì;ú?¸Ø玦#Ï<ÈwMwç7iúº²ŽìÉä3¦Í£Ù÷–§]x™ï˜±iJ ó„PÀû—F.ÔŠà”ˆ÷¢ë!!ÑtK±Øá!!¸HÈÎC°l“Ɣ7 )"ñºn}‚êæ$¡ú„’Ó7j…ÚäôÍ+çÒÚ‘O‰‡„Ü(¼Œ§²ß}ufò]@ÍÁžB¸ˆZ?ý³÷oNÞ{ÛCG?ì延¥•îÔìK+}9m$téi Àö"óAS†= •îÙœlÒ‹à”ˆ÷¢ë!!ÑtK±Øá!!¸Hh¡OÈCBDB?¯›“„näŠÛ²uC|¼°ÒkSzòÊù„´v d‚xHÈ}"´Ã ÍY½>ž]Ý×UZ{"¯b6Ï[—VÚd[;Þ±îjiL‡‘ªå$TוUw½&:l‡è­$Ô$’S"Þ‹®‡„DÓ-ÅbÇ-JBÏÝþ2Éí)«®ÐÅçŽ)Õê(‰•„ü½Õjö 0%îì!JlIäjöô1A|”2µ·ÔË–i6òS*}ÉÃÞ¢”¡^2µR‚G‘©½)S€RIGxû³b£äjy¨Kôä/“ùKCÂ#£¼|¼#2°ŽŸLJÈdœ„T²è„õ2¹uO Lîã­Wû $„ÚÇ„GÊ竧”ɼ”AÈà„ÎO~Þ‘¶LRµ"<uâ¥û‡x#'RÕ¾œ„|IÿBáAÁ”ßW&“ú«åÿ·O$´`ÆNü{|B¦Üööö\S’{IÈÕøÉkZ¬íP6Òs¶÷ƒ¬TãìÀäûùµõ3Uw~žg.\@Be|WÆTçä3U-”óþnFB9³§_z©Ý`§‰íÊ~tÿ}· ÅÅn°IlœÌvê]\ÊÊÙ%ô ÜBìö9ȶm:®Å^Ø‚ÅÝúŲ莤§›VêFŠj¸©Ûëâ]>“Žmt]-¯§»û¦Cý¯¼}7“G «®Ð%ŸŸ"I$ä“`{ü|4ÛðöòG2$bÞ°žíQK¼$2ž¦´’Í$M ¡¨ð„ÈÛXFU^£Á!ôz)/îʬåØÍ´‡³:`;Avqòféažõ ^ ùE² Ñ°ˆK¶O®ãö­÷§ú¬2Á~’H?¦™eÖšD ù0CXõ¹òÏŠuÐÍ êUð ÅjìHÈ=>¡¤Üi’vÓêñx®â$;œdSŠ5Ær¦fM‹µtc“-ñS¯cùWåDgÛäžÖå™3yÚéZÍè«-)Ö]Æ]mÙ-”ÓÒ–µ‹Rè ‹Å;Mt˜û[¿[\¸ã»ó©7; i,#Àðñê›íÔ!•×L)+g×!>9Þx¸$CˆAnÜš›r}¡[PèµܵÛQÿüà‡šÌŲì˜é)\™Ö¦jØÛ½ÕÄöÉÕ»BÏäfÊÍpÊÇ¥’+þÑç¶U–; ïFŸÐ“o¾ùöã.«®Ð%ŸîûÑ·Å.$"ÖËe_¯ÈpìQƒ6Âå!@‰ÍÉdE0LJ0#:&‡†:&!Üú)5BÍBˆ!B°ÛËK¨—¸DBPLE„¢ø\OB‚OȶõF¢f+ Å$DJC>\%·QúS‚J‘ýB1òhàLjÌÄ A:ŠjFûˆ„QóuRy˜ßü\„ŒÒ"©UPzˆr5|Bš¥ú„mç‘hoÆY2•ÌÝ3wïƒÓ¦$w‘î‘ŽñˆÃ›@ßLëîYÇAëgj2lÔ/ :%ÍÚñ8ÈSpV¶$á%½×_Þ´ˆc”Ââåfˆ¯ÆV…qöË’ãÜQŠ.§   'Þ©C†ÿýÅ4'^ÿÿú«3.-œ$ÁCsŠ÷‹}iY;‡Ž6ðòëþ+Âæ G͇'LjXU[…~G^CŠ#šlÒÚZNeéëªq™„¸¨†­fŒ[:+‚ª÷y+ößHد)chÚq®tשÉÚ%šC—Ñ’¤}ÝŽJ¥¦^f0±ôrÜk‹*Å©«p¾)·Dƺýv}Ü8—UWèŠOˆ¶|³žŽ©¢[8ÕÐ' ÷øØF|bØ~I —_;4 ☄¢¥Œ,ä,œmGÁ Mù A¨Öå ×êƒòAjÈõ$$ÌöDÃ` ªÊIHÊóÃ$å< …rÕØCú¢o¼ ýÝÑ€!ˆJJ ÔÁ•Þ†òaDÕHXN‰Œ,—‚û„ŒÏ\¾Ra Ð3–‹ çH(É4=wï½÷Ε¸„°êôs¬—rLB©ˆ“ìðtù¬†Ú¹„úºðyí‰IHW—öCqʾ´F,¬IuSý–¶Ö"Ä1Ç—(Ct5¶*Ü(,#ˆMJÔnOßäŽRv|ý×_Šwæ¿üâ__ío¿)\IBGÂÙj›Ü«ÿ7 Q rgI(ç@×8üE7&¡ã(7{¿Á$$Øq Õ ÍoHÈxlホ'«Z¨%Jw:&¡¦Ãwe.Í è…0ŒRW’„fÇ?øè£KM¦HH÷äãwCžúìöWÞ~êq€Ëª+tÅ'Eˆ ̘ö –{K} ò ”úªèŽaÜd(Áƒ¯C¢ŒH„^+ EE…CEéÚãN-ëbðê½$ ·çÍIˆ G O™'!z“C%„%¨É“Ä êy¾*&”—Ž:Ë…ÓJò…DQvÞX07ˆœ^¢°-bŸBîýPa€chãXgVªS$””´±dîÁÇœkߘ”äv²NÆ@üÄd?¿>˜•zhc6·"…ý¬ËÐaþ71íë®z¬$É~Y !«¼³µ¶¸Ì¢’PååqPßÌùL½uSöþ‰ÆšŒ͘¥]+º[ Ëôµæ=úMé›ÝQJßßCýuŸÞI2ž…07.çìYSFß·¿\3h/ù‹r($ïÑr;Ò¹ìêCcã¥EGLz¸MbOU}H݀ɉ<yýÁÉ9êød}KŸhtDB`ßKU÷&»+“÷FFB\ú'Þ6m7¥pf4l»”ß„,ñp×0Lï‚®“nˆÛñ ªÁ´šRŒ½y¦›:OS:Ôý1ÙÙ…ƒ<—ÿEBtmØ‚¬:ªCÚýHú±þÒ&2››Ì5§þRþÞ#é¦8k©Û“‘›jkj«g'$lx¦?¿vƒ…·'ÒEÿz~ÝÚ—–}oz{#!XO›vâzêÍ7ßü”¸åÓOÄ°ê ]ñ ¤žH£Ù|›…$¤L 60 ³?”Þœ!¡6ÇgÔÈVƒ„ðAÎHøb“H{R 1ÐÆÓ8õ ïQ°@BV…á¾ö…wµ@Bâõ •=4q´‚.¶‡/Ô:CBI˜.===÷àÜ4›4ín‚Ã'§º,–ìCåÄ%‹e$‹bâ°é0­EÈ<˜]½c°ª+Éïïê9›öôÈÅ{fyøåy²ê‰§¨Ë#ùµB¨f±ŠøHÈ8öú ~rã¤äj¹ã` ¢7’ösùè:"¶ÛHh _F¿ë?Š° r£JÈhu/üuà9'Ièê÷¿ýöÛ7©ôé×ß~ûéLß÷?ÿÆ÷~yÆóë÷¿}uæׯÎ\ýÞ£å’P~“® -:­5ÕØ›_{Ê‚~ÑZÄFÇòŠËºÇ-¥»ê/±Xãqe3HÞb¨C±àg’ÃðVªé4Ûz#aNÙ bŸgÔuCÇkÑå8 fTžË¯E*—Â:°Û“ê: vP5rø¬8#œ_WŠ™'ªu7í?AW€ŠLfª¥þ Õѵ¡&Ug­Šq .žò›Nå×ZMFË Ú™U„¯˜PêùH /@ Üg´×ªÆÉZrã0± Ö™‡5¬l&kç(ª“¿k_*uÑœA$Tw¹™¬¶Sà"X‰'nɤíUWèŠO(Ô"P$îêþ IÈÓlTþ*…@B~V·‡$••ü&!/I¨ ZA+LBÞNú„˜Hÿå ¶&8ð …Úû„d ¡¦*ªVмm ù„pc$4Ú?r±Eï %±uc%4aº}º¤Ýä.Â/¼ô œÜ܃ÀÉeýÙûïÃ/¤!ÄSžêd$ô6gé·«OÀÀ¹`&ëH¨»tg¼î$â,#ü²@BF«žáÞFóÆ^:¸”â2§jÄ*â#¡²™'Ž‚„fò^}l7݇ˆ~às˜ÆåšQ‘Øj¡¯¿úf¨c q±/Sõlt¬ïûŸÎ\ý‰øÎøú«_B)Ë&¡¼Ë/7·^³‘PcÅ‘SˆCÎIèDcŦ úúNkü,ú ’!KòÉ+I9ù LöÞýÌáSy.¯á0À¤þ`knbÙ{û 6j<Ÿþ]sVê< 5 5·&Ÿjl0¸LB‚ èš³Úa½ …Äk:k6žj,Æþ¢SU Ϥ]¨îƒ©Wû‘|W‚;˜™˜þð%ªqÍöÁÆâCÝU¼*ù{p­!²šL픨_Ì>o̺ˤg¥‚W.]¤vÜÙ‘W±q¢­‡šÚVóe‘nÓ¦gÒòkûÒ&g²«Sr6m‚5gÓªZŽw_¬ ãtﶋê.âÜr»þÉ·1¬ºBW|BR>€#aŽ6—ÙK Æ+G •@Bœ_Ê„4~¨OXB„D !9 ›-„||HÉz¸Â$D ƒíH(|á! iŒÔç—NB!" ’ôòmÓp •¸„0½ÁòÁHëY89-ëµ =;ktÓÇâ$·œj<Vê)¤Ñòž©®Î8Xq$$Ìê8jN±‘Ð>«„jNÕÍâ`èaŽ'±ŠèH(gv²v$”søÅKVªõ¡hhÃm¸ÔSôk“ÐîâZ}Ò'iÜFBBS4N“Й>7¨ïǟΘ l; :ðÑ?‘'èëïþ 3…–MBèHä™°‘úE_Ö5NBS'q§yB¸‹?Ü™?‡€äs lš“ûíà(6èàRæÔwöd_&YIåÒ²$4x…:lM¡Ë$$ØAì1x¡š<_{zmó„@g‰I0^‹Â;ð[‰ Pé&.µÍ ù®N²kÌGù×Pc4JëΚBTÅŒïµó„@B{¹Éc¬5‡­ëÌßCÖ€žP]öOC‡;ºó§±×ª¦py$„;w¡Z74> ˜0Ö\Cx¥j¬¥ºV=–Þ{Ñn6–»Hèâ–Wv?÷Jªa%¦Báÿê’ÐR.UT$[;–Pd¨¿hGB„”È*'@ B¢J© Pà$‰¦´%,\¹N‚yÚê%! Šñ¾-A !f¤Ì[ !,å’Ãàpaíò«Ôö$IJ†„x‡©ê%y«iÌKj( Þâ$Äj-“‡³µcÞhKÿPÔ\°çÇŽUó mÇ”ˆyÚtcŸD¸p‚„Bä:öðéÓ ¡Ü$7‘PUÃæÍS­äáÆ”~—ªéÈûaVÚ?ˆ üß…ô›lòãW»&?În©_HBCv$Äõ<€Ì ¡ý¤ÇH/bÑ‘ž\¿m°±‡f;{«ª™O7\ê)$ÑHUl5ž'¡–?o1ÿùÇnÛHH·ÐòIH÷ÌcÛ´/ IÈ°|Ên¡ÞI0`%!lÛH(qJwYIèqü’!!à>u7yzÁÍžØ! ažÐñs¯ 2º·—uX³ë$DvØ|B¹„Y¨Ù^¼;"!2•Ï/¦‡S ¢¥Ñ±<óæÍWûK¯‘Ëh_ÖØ@«Ê,±’Õäáý€KYÌ6^8^z“n0»Öˆÿ¦&¿œläj–GBuŸ7ãÊÕº.ý`Πð–æh‚©Œ„úé´]Üÿ¿Ð'Ÿf¾ÿºO(€ÇÊ ž/e}Lx4#!Éz6G lˆ ‹HH˜Bîg›ëVâ$DÃk$Š“è‚I„ÿŠ’Ì ¹M !2âg#¡°H[d NBpï0 ²'!!ÐSíÏ ó'm<»Ï< ù(˜Ê ¾vìºðDJ!þЪù„6§o× Ð»eë¦ø„tÚXí!ÜÖ–NB&NB[Ž=_^‚Ñ1[ç íÍnÑŽvµ>p°55Cå'A°o&‹|B'ŽgÄé‰üt'®œŸˆh›lb$”ߤÕÚ“P\Ü«žÃÕœ‚žØ:ò‰UDGB£ýôú‡†X­–N„qsÒ(ÎÉhWV.>m€MÄó„2ÌBjãÝGB;þþ«ã™Êœøå“P\FÄ®~ûM¦þk¼äÀEDÃfqzûÉ…Ñ1þ±ÖæpÒNuâNZJ$„Sy¢ ÃHèHNs¬µðŒil4'icc‡z2spÝx”á¨xQF‰„Œ›Sæç Åå`Iz|9´ð ŽÐa]Ÿ1M—fG"H¡ãà±ux„Ùqÿ"¡â¡šÌ>pÃâó„h¢jÜYs•U…RI$„æb&ÇDZv*\Ìã†XmAÚ…i„Ø?~($Â0ÆG\Íòæ l4gœªª.è>Ú™Á¾ü¢¾ƒ58M¬Õ±‰3«Õ:PîŽyBÏéãiC ]‹1-%׎¯ZA0 ÄÒwµT¡Pg(;ÇKâõõÞ*…B* Âa2?‚o°P¤RB ¢Pàm]LD‚B ¡…š4*DB àJ¦`ó’YQ~,¬iË_¹ÜŸŠ–3sår˜$ Œ‰TKýär)=í ’ûð=`#|Œ”ùÎ?‹^¢ ‰ŒTÏ?G?J.ç’(Je >Á1Š˜@?3:(2„e÷å J*×ѳèIkŒâ6ïu mDþ(Ê¿Ž[ûû„â㶗oI¶ÉÖòq7ð Ýqÿåæ¬K&¡$S;In{ù”cÃí$”i œ\ðyÞùï:[w–¥UÑ;ͪïªzö¥{nç‹7~0×õÔ‚„†N?¸}vž„pÄK/•Œq=9³Í§ïï¿PÍB57ââ&V ‘`t,îð[/}‡¯LýÇgóNÏT50Æò.&nˆ®Æó$¤ÙýÇŸb¿ûH¨‹èÿþ{jòI¨òÚµ_¿ÿæì?ÍÁË/ØÎìûö§¹kÈÂfL§¸FBº“Í“÷cžÝÉÓ/öWµÀçÚL8þÐC—ÍVÚEÉÌÕuf?Š½ŽH8ÜxúŽ÷;L½±¹'õ…VŽz¿³´‰-ůÝ\(Ì:ýÐûZ¦ZSIc÷Å6ö¥ý™®“`ÇösU¤=Ùœqb`ò¥]ÿ&¡ºn˜:þ_$&ĵ¡ +.xUŠ ºóN¿u©”¨Æjrk§EI¨îÅ;é2zí:j˾† “\ÍòH¨càô¶î {’£]˜ï•ýìÄð—A˜ çØ®Tü¥=ÿÇŒiaC ]}î˜D²`Ûë_Û>‹ l:PàD±ÿ——èæ’%ø„@:[Ë­’íÿÐè ¬’ •$š¥“P.à'977·==}ºbr ÍžnÂæÝ )prnbX!ÑKu´ö+¯8q’ i¼-«‰gŸl2NLVãs!".WÝÃÃ/ÓàyÁçHV‘UOVZ|p¡–‡jqj[XÀ¸Õ_Þ& Zt¿î@¿å F Ê>®ÈÄ9Á©@lë~Œ±¤ˆ™„4µ˜wkÜIBÿ™ÚäÄ!Æ_¿Ùyõ—/Röýr†Íú «Æâ®~‹×‚¿ÿ ÊtWéYâ¾þåŒa¹é<‡€‚Ùf¬LêbQ~tS]¿ºªÝwÝLj5~ù|jåw´æÉxyò÷:Ž1M •qzcÏnÄU`Ë«èì÷A‰ftž„ Úrer¯²ð…š»x‡-r„ìí@52žL‹C¯˜¼º—,Fm&py‘lq¸4blrYcýÎnÐX«Â”_©0Mœ.²šÌÛi1sxþÖ¢—?L¥c¬ÿãmm™:²‘«qº–dœ¦à»fÌôÚ åº‰É=fXè"¾`.Å8q´ax¬ÖÚ]ÊÜBBŸ¾|;äeZñ.…7ð yäf&¡ú„ðg'ñ+ýÜ1"¡¹í¹ö½%Bkì ¬º#åÛžïj¬Emœªy²æÜSn%¡ø¤Œx ­ºÙ7ùXƒUîÖ/ÞÇ\&!'Œ9¼mÛwG‹¾×ºnÍŹ[¹ÈŠ¶g„‰Aáø„<$t³“Ð|Bö. >!—I¨$(Tšž›ÎMZkÏ¢g^0ü:½Ø§”®>´­qº~ÁæU7û&'!Z¥å(0²ðܱ+æÿ„*Éyä¼ÇÄusÈ!u‘Ð+o¼i“&ƒz|BK”¨À`¯›Kþaï\Zœ†¢8~ y´Õ1­¶M‡nÊìÆeÂØê ÑÂøv¥øÀ…Š "¢âF܈àJÑ¥ nÅ­ß@pЭ{îüž›4uZ3µ#•þ¯9¿q¨ÍëžÞɽü8Mr0rBkk:)¤Y»k  ƒ˜Ð¬È·P®»`u5š{Øÿ¹ ­üS¡†ƒó)ãÔJN¨° ä„zçŸóÓùî±+ü˜i1¡foBi9]!)—›Õ™èä5§Iwô6‚}ó[LÈø8Ä„B,’œPq@È ñÍcÌó5æÎw.Á*&”ñïL(+ ¢¯œüüõYVé œèä5¯Iwïꉌƒ@ØbBÆÇ!&b™ä„ŠDN(»l:áìùž˜PÆ?3¡¤0HZwä,?BdPwäi8ÐÉËÔIWLfX¢Ä!&b™ä„¸[+ê?"'”°Ÿ3Cû5=1¡ŒfBW…AÖø9ú>/ÞÞæº#“ïK¼LtÅ„`†%JbB!– INÈJªšy-ZTSaÛ–2˜œPÂ~ýOLhÈ?3¡ ƒÂ ÷ø)kÚ„tµ/ýÈ81!Œ¸Å„&þ©PÃÁù”¸ƒRrBcl#²7cB ZRf2ßœP¿7‰¼‘b8Czú^9~qMWA`ú¤+¼›\+tò2uÒ‚–(qˆ …X&$9¡Ô„”»¥òÿ›ÐvïËLJá€N^¦NºbB0Ã%1¡Ë„ “²|"¿¹UG›Óàßàwbڪͫ›K¼ƒ¥R©³mÁ'_e&dñZZ¦tÒ´Ö7ɬrBs @­áò{?\;® cNõ!#ÿ$¸“®˜Ì°D‰CL(Ä2¡Â䄪DUö¡XÚ„–<åD¶å5‰ÏšïÚ–½L¾­Tyè4ÑV~qKÊöx穼eEUüä¨D´Å±5ÑÀ¼»l9!1!Sê1!1!”Ó%1¡Ë„ “ò)°—ÈÕ&TI¯•ö²+¦3JVÔYlÆçe qN¨í¬»bz‘~[!ò“oÇÆ›@$7'´/Ú{Ą̨Ä„Ä„PNG”8Ä„B,*LN¨CíÌ„¶ä™/áõÛ3\²XšÐvZVš@¿5G›¨*DrsB7˾¸»IbÞãïÁn  ~È¿™Ü"„· B\ úéˆÇH8¦ö/ˆbÔFÍ 5¨³3¥þGªùé¶M5Àm6ˆ¨SùeBÁa‰ 7HnNèôÍqz_$‚ &SÐœÐ.jy*å&T&ÚªF°ø·Âk«Úw|~Ó$*kA"½Qs¼ åá]+´ÁuB‘+¦M¨äÛ1ùv åtD‰C¾ ±¾+LN¨N´ÄúSZÈ1¡viÔ„¬€Zu–™­%5`iAP@ÇÑ Ô¨WêQ93¡±&O±Ñ½cÝéÄ„Œ¨Ä„Ä„PNG”8Ä„B,*LNHgq(èÕÆL¨JŒ3bBÊmu¢í–J(ÿ±E˼v—>ŽR ”²M%&4Þï ÷X!É   ~B9Qâ ±L¨09!¥j "jmóÆLÈò‰¨>jBª´DŒ_Vv,&ïKzU@‰UõáU•šÐx ´ WÛ>?'49 $wÑ› P?ˆ ‰ ¡œŽ(qˆ …X&Tœœ㸎••ŸÏ^§ä¥%æ³%¯ÄK™ßß[¥’•n¬<}ÖãàÝœP‘ê1!1!”Ó%1¡Ë„ ”*<’*@ý &$&„r:¢Ä!&b™P¡rBgî9¡îF@ŽÃê1!1!”Ó%1¡Ë„$'TæZ‰{ùÄ+ˆ#Åp€úALHLåtD‰CL(Ä2!É ‡9ç„ú½ ‰VGŠáõƒ˜˜Ê鈇˜PˆeB’*Så„âÝ{3vÇ³Ì u£ÞÆD]¼‘b8@ý &$&”´C+ݼ¥VWÏ÷'nr&:NÍѨ8,Ä„LHrBÅašœPtúÖ±Œ[¢å„òRBûGÞõñFŠáõƒ˜˜PþÑ.8Ÿg.ï>ÿxpjÒ&‡î_>N͇7W‡…˜’ IN¨8L‘ŠWÞ“qðØÁxv9¡xÔƒ4bB¿ÀŸ‚àCÁt²wö?mUqÿŸŠ¥5ЖÛ6m--u*nŽQe.eì€1°±"mQ@^F±¨h€"n@(D'ŠÙÂ"Ô˜)¨›,FðeûÝçÜ—Ò èÚ®z¾Ë ÷öôÛÓÓsÏýœç<—ËH(šÍÔoÈ >%ÍÚÝHh¡EV,(@A¾Èî%\QÐ`(Ô<@ê°ûh<, ÑDBLÊœH@Ê+ÈUF7”yjù}±O$¤QçæªUŒ„¶ƒþ!ˆúªÐ;è2’²Õ^›õ´Ù*LB#³“ý´> qƒ<ž5—•‘­ÿ}5y÷ !téOÈ4¡ŒßwLžoÈV(¢×¼« òR¤ ©ƒµµíAµ&M$„ÏxèíðH ¡8pÖ­Ô‘<+[Š,ÕNê%0Úìg½Äd6âõìÚ-·¸ê~¡pài«©Û`®1ßPl‘‘=Ū¼R­È9awscdÕÑ‚"ŠF­ÉµÈŠº ùí6 Õô¶ù_ ž¹ 'ÒFÞ$‰dØ@)ä+À[RHm®H6mò9Sü?úâY>^Ó§=!Ó„26Єò 1#½"$”MHÜúôÓÈÙvµ&-$d ë1°êHdŒm,ÔìùT¾¦(O£¥Q3 )cÌs¹(OI½¤f£T»õj¼`á¡ö—,5y9BbSþŽw(®]²Õt-Õñ$³Ø Á縞`ÎI¨D+NK_—Çã¸|®Þ%!Ÿ¬fÞÑ€"¦^GƒlÄí«™ xÚzŒÛ$4ÖÚcåkdÕó§+x£úE,Õg¾:éq4hã’ºM8Å£}“\·´†Èa¸âïT±v:H"9S§ ½õÅg_¼¹$„„Ÿ‰ ™&Äb?5¡,Y ÅÕ„øe™ÉY’$!j`.üO8|67e$Äñ¤cêÞõ$ÐwÍÿü²½Nv¨#³%Þ»pâëwêéD”ÇKBréXó\ž"íÕûøx©~äƒNîß~Ò>Êd(ˆ1öpB—9a¶=3Öß,¼Ó¹úc÷½x¸ß¥ß%[SÀö ÿ;d?]⟚ùg;©éœ¿8çäקõ y¯æZmÆmjkõNx›¥¨Ì Vθ¬,ù„»Y•=áu»–ÄR$_¤‹GBèîÅÆ|„!BƒÅ–ÆbKbܘG šîyÓ]~4•ÔÖB3WKê»ÃW‡0ìãçLQïŽ.cÉ!ã\ÒžiB‰iB²Ä4!Óàµj=WyÍãYiÖ'IBê0‰Ô‘Б^ûk8Î;ýÖÝIÈxò)£ìPÇ£“Ðù§Ê˜&„ȽÇþ×/?ïèÚ·nÛOÂi¥má¨n' ªB›4 ùùîÃëÒsP}€9Mè:ÃCÕëR‰„ð¾ä²]»R0¸‰’ÐèŠϾP:ao@•Ü/ô®8{…Rë8Ç“Z $´‡s»œ‚ã¹¥£Ä©•0äÙÖžÐtd¾ªlÕN¨‘Ã^§^j)LÇ-HB˳¿ývÒSo¥€„¸· Ü ~|â£/Þ&à’ö„LÊØØWMèäO³VëMµ/¾Y­z&)Ò¨ræBsy*MÊI——«KÞ›µçlÆÆmÛÁáŒèlâ]ù/ú1ð©¥9>.¹n(ÌÑJ»¸F¡© Fݾ¢Üÿ"mˆòxIè~óœ:íÕÞ&!ÓÌÌL®EË_F53Sjé»õßF©Þ4ŽÇD:!O‚„äPöMæíu‘Ùª œð¹ÆÒ¬ ÷urÐ3)ߧÈAÕtnáXr¤ÎBºÑœwWê cÅüAä0gxh³ Aæ ί9QÊ4Ê“Ð €2âÞ&!B¨¡£Œ'¡ÐE<½òû¼P*. IÎím›´H$Åø”#L´+ µ´?mM¬‘§ q#^gvاH^ÈFƒñ›'ÌöçpäòÔ‚§ð0QCBö`ÈÑ­Ä—t!‡ë.¶p19qr¦†„Þ~õ³Ï~ Üòþ÷o¾¦O{B¦ elì«&tòÌåþj½ ã:Z’!!º»ýì\xy.²5ÓtªI¨üƬg­çyÁ™àÓ×Ì­z<“6#ä"b(ÀÜïp†Ð#ÙG¼.]G¿ìêYqYøO]U¦åIhçŒz«´Kh*#wBßÕ¬Ž¹täEnŸž2DyÌ$”cž 妽ÚÛ$´~ûï»woÉÖ»w7§ú°MöÞ½ûË”ÞtçöÝ_§îü:µ~ êÑÃ’£…+7;¾1ûD›™ðxÈáįŽ•8OvÍzeM«`GïøYòéÏ£Ïx0MÚõ°ôº4ʬ¬±!ôº^wÀ£©ÓVQ„n:MHȤ—G}Bò¢o5žÒM¸}JhB€#¥\§Øö ªÊ”5f„Žt9tJ9'–jŠCB‚s;oàéAÖ½îë/i:¼W °!!CaŽ0…®x$–à‹ ¥ÉÆ€¹ª³-1¹@Œ{6ò ,êÉjPÿéNÚóÈ(ŽÔ3¨š°yÂŒ6Ç‘K>Q9¼P+ÎÝDL;²< 2ÇÜfðr†È™"°¢·ü`%ÓžiBûìHÈ´—c$¤É VnmmE"ü¬mW§Š„ w"¿u¤µ§pÙ[}2ä>] gÂX êÂb€'¡á€íÂ2™»ÊÚç—ñQOÏø¨ý›ÞgpÞí[DDZýÅAÃKšåç v »JÃ|S¹áÜèîåI&ŽæJÌã)C”ÇNB±U$ôÛ¯7Ç:z².ö‹1GǯŽõÝÞœZ¿'ñ¿šÐ!íC“û‚?Zý y«»aÈ™HhÄ[­ÊÖÁýƒþÓ3ƒ®„ÎR1á­Ï ¯íBBˆé÷Ò‹¼ÑÞUrIÃCþÒå¡K—Ž~‰­é“¨âö^:s9´â[òÇŽ»V|ÓöwÎœ¶FIçøVû;ï­ $Äu -|xæ¨E,—„NˆÎm^Úš[%×õ› 8ýé$×î·ùyÐÃÃɵj+‡)ÔÕÉc<â§õÂLaŠ€6.:Z°:&Ú·Ïóĸg#9HO– ‹T*4éŒÙqTEî¤M·/صR‡O”C¼Pf`S2$Ä©TƒfGC_çÂ5{6&§9NΔÀ-OèÞúâ5}Ú2M(cc_5!‰„L•U-I8¦5êöÚ-)>À*”¸69yuÒ?Å Æ Ûå!¸š0¿\vû°é ù&ˆ's¨ç˜ìP†4äÛ6®]ÅÿñLa)âŠÙ¡‹+Nbï(qM»¾á›ªÓ6p%yÇ´«)àx®g Ê…‘Ð6 MioPß_›S¥zþ1vê9ðÑ_›D úíöß›p =4 á@(œH]¦/dÛHh,°ðt©C ã,é,æ¥ßqöÝÃ'„¼Ñ Ô¨€neIVsƒÀÂj[ÕQmßwÎc²émZ„vÛæ8®'E+D´ä*!:Ù*¢$„ÚæðVç.aÓuÔ[QʃR$ß‘WŒ ítnKÆïVÛ…¹ÖžR|8 Lõ¹kN쯀 {мT×s÷zʼnð rioê6 ¬VU„½õ…£^gcWIs;^‚£æxeˆoß]i†,«ÊÙ[‚ƒÜÿ|¸Ä§…˜ ôÌ䫳9æ­ž>€YzÁ€|Ú¤HŸ_ªã:f'›È #ùý9{cr¦„¾$Üò‘ñÝž×ïsB#Ó„X¤Sâ¦;±†Ÿ © ñrпø‰Ô楊„ÜÍjõb$Tõ x ê—gýë£ö:‘„NÂPÿP“iÂþÕÇ×¾êwMŸóá‚šŸÐ¦Qûiuž:+ŒÇcý×{…]OaØ$cçË()’ÐôêE¨èK ”! #¡$Ä­ßÂê˜DBZüˆ%!ýÓݗ£˜A$!<–H¨(j³•‰$ôò,é,ŽSxjWJ8L£îâ\»%‘PÂÚùMˆg 5À£½’O¨ t€ýЙ°ÙLÌÝ( ŽEĺz³­o8p€‡þÚ@=™l¸0áÒÃ':>ºvWÀUG†žÖÄ!!|âñ„å<“QªØÞDZžZ/”/)ub±»Ž›^ýÓe1%’3u$ôýÖ ßÐiB hB…†ìXKă5¡ó× ÚdHHݾµuD‚,ukRëšÁi^9ÝéÇéÝZ„¥ò‘—EÔ„Â%N‹\~¸Ó²á'[mŸÒj¯ë묪Pv”TcE,ë¼`íâr‰».ˆMÕ•O.¢ |é´! #¡]HH.ÇŠØú­›VÝoØQ‰èÎæ”N® «c›°:æhÄEH3 )‰NQEHH)/i«^Hªc…\)'kxà¡IÌ1‹ žâ—¸’ÄŠíØ¥£{8·Qëbraš©×~¿w#!bîæIdÕv(ÉêX‰K­^Umðä²E†ªyó÷2^"’hò'ÄX¡ÝóËÇ« ®¾£¢¯3JBÒfU‹è¤š¼PŠ¤VÇÂ^—eÂ]W>ßÀ0@r">`Üœ)ò ½«S4$dšPÆF÷SÆ\0œoP=@âFZm§ ^ÊI˜„4Ý•[íµÿJ$T™j².^¼æn.ÿ Îhâ'Íîw. ÕMwºyÛÁá qÄ(7cØ{Õf4?.%iêt¿þ“Cö6 M »,c|SùPráÃ.ž„Šð¢3¯g¼cúPÍÆÆúí›3mþ>…ÿݹ}ÓØwkó÷ áÓÚG#!.ܺð"ºOxèÊç!·ö!¨!xæ©å!‰„ÊFù΢#®ž8¯Syÿ‡Xç¶2‹/Äa}Þ\U6 Æ“ï !'ÌÝ–> IŸÐ…yGƒr:гŽyƒr„‰µ†'¡,±é`ß–óÄx,²t]„òZn¶¿ª’¸ÙE†¬ªà[Ùˆà…JŠ„F†.=5¿t–s\£&å4ó9+³bGÎÔ‘ô€†„LÊØHä^ô…§òó¤0œÊw/úé›õ¦¹YØq–| “ ·Ù+yú”8¦SåZ&ξï®3Õ†<îf‹ìüYødœx UäRo;€Éép†R.Ξí>ÅØ'Ízñc8Žjñ©Û`åŸC#àkôiÅ]RSÕ×’‘gð"ÏšóeˆÂHˆïãwn>³þßÏÚÿMñ>¡»¸j º~–ãñM#Y0Ão‘çÐCHˆ×`.†ø»ÁG\öãÓØjóG-9åË«ä‹‘näY:®¥˜„$çv!€kÌ\–ïÂ+e;Iè¼Ù}åòl\z¦S3™Bx/d)‡üs؇@BÓÞ¾=bôºâlì@ ­J,×3ÄÞDTØ\RZÓ\óx$@®öL´Où ™ðÍáõ†Ÿ`éY8Z»Ó“³:&gŠHè‡'ø W¼ÓiBö )@:†SRðÜ>ßwLª mKB*vV)Ò~‚ã V%ÓHè¾ »9i鎱Îí5ÿó:+Ö+.+†5WäãÓÄ»= !.ìal’ùÒ$lE;#²pTÆ 1߸}˜l,¯d!³.ð É Ú·AŒx³L¾«ð‡¥{„ÑiB‰hB ù}Ûû|ß1 Ñ„ò*yútn+¨f÷¢—âІ„`žÛÞGÑ_V¼/ènNZºcÒõ0Oú£_’EÓ^ƒÕÚ1àòѯŠñY‹ž†„LÊØH@Ú!í÷½è5…g#íyí[„„FÂ/UŒ„¤8´ƒáA'!\8py.+íÕf$ôøêQ}Ç];J{uVk£&Ü°˜iB,¨Ó„rrà jßú¿œ§a$$ýCõUIÙ {¯yNþj3:ðõ`$$£‹„˜&”9Aƒ&”£ÊíV«ÛAAÿà_m.#!1肨¯Jê]•¡@Šü, ªÍHèÀ׃‘Œ.bšPæšxÙ‰ZØ„ AÿD}Uèt QÓi©#!]$Ä4¡Ì *4!•š•JÃHH ú‡ ê«Bï ËHˆšîHK= Éè"!¦ eNP£ !4üÌa$$ýCõU¡wÐe$DMw¤¥Œ„dt‘Ó„2'Ò« érâ…œ¾#å€EíÀHˆ‘-Ý‘–z0’ÑEBLÊœH¯&¤PÆ!¥‚¾#å€EíÀHˆ‘-Ý‘–z0’ÑEBLÊœH§&„PdÅ! ”µ#!FB´tGZêÁHHF 1M(s"­šB¡Ãæìü§Ô)hÿ’Ó÷ÓYAi|"k°Ø¹y;h}t­ŸIœUânJfBf fBi-iÚó®&Þ»`¿.@s·‚ÿ2Á‚m‡þ¡¯ôË¥?íh)»>F-1²JÙsB®2_Ï E„ÔcyŸ3!fBV)ùß±Õð‰i¥ÍÁg9GR}ż;†ZM¼;&Xwǘ Ù¡4ªþCRÐ|!ôÓ„P«éïƒ&$X&ÄLÈÍ3!~ž€æà³°¡¯˜&„ZM4!Á2!fBv`&d  9ø,,Bè+¦ ¡VÓßMH°Lˆ™˜ Y¢Ò\_¹ï#qý àµD„ÀÏhB‚eBÌ„ìÀLÈUæ0O;RÂYÚŸt;ÉÏÑr0–œÉîtó”à¾éÒ„`¶%J4!Á2!fBvh=re@îåT˜ÃèeïBJx:¿{~<þå<‡'·’³¸ºœažÜ7]š̶Déƒ&$X&ÄLÈmgB±ï„ñ1âNQNsºÞÞOhBEÚ¦ ©ïƒ&$X&ÄL蓽³Jããøÿ…»†Ü•AJ…r€"øR_êKª5˨­J+¾Õ·ˆ66vLjL¢ŽÚ™ŒMS¢§NbÛɤ5í$Ói¦3m¦Óßúì"Õ&uSxfðؽÛe¹½}øìw_L‹I"¥{F&TbdO5±Öò‚›pL:xÉЋòæªÌ:ˆPå*i„,*³ŒÞ¢à˜ Atåyw'¤·c*ŽH(Ïéyò*>gÖ«Êå\ª_§›&!lš%.åH“/JkB©c±hBâÜ7³wíÍLr¿`ôš!–=ÝH¿–ò‚›p¦-¥ô´¥ZÝ3RZqwÙw§TgZêõù Vš'¡å9ßv~7*ÿÞ²o{PCU¬û|kw`t¬šA‰Üjž„Ö|¾íjÐÌù¼·E=#-Ô—}>_¹•Æ¤Jðuºi¦YâRŽ4 ‰ð"¡´&”:ƒ&Dfeçfìš*[E&NbdÏ2¿–ò‚›p·ø]BC–Òî~w痽奎.ó@V@¹i) ®¸;Ï QÜ'ƒ¹›mÕÞKéÀOBuC––’‰r+\¼Øoië¿ÓEBÃ6×RÇ y ÿÿ¯ÓM“6Í—r¤IH„ ¥5¡Ô±ׄ$™9äåæ($ ›'DÊ¢L‰,MBÉ4á>¯®¯Á«ëL_—^tîÃÆ{îN‘q(ojbôçÒM˜'Ôc©ž¢Bý¶wDÃ}†3§àJ~Ætõé [mVÿ­›pño0O¥¿¿GB=†¬3å«Ë£·š0¨|nš„°i–¸”#MB"¼H(­ ¥ŽÅ  ©²¤Yé%Ïɔ쳄‘ÇqÊ4 %Ñ„ûÀÎæ­^Z¿¾:R½pj°&ùtÝúaÏçÕ*23ÄhÆô…‘!!*[[þš¨X[^ W†IhaktÎç»å‚‹óy:&¡DBÓkè¬Á:É1T ¾N7MBØ4K\Ê‘¢$töìK¼1GÿÕÒšPÊZ š*K¼7c‡æd&GRræ@ `æ”x‘ñ”hâP¹QI¹‘³‰½ç^î0|öiG^ˆ=Ed¥FÄÈ|Pv׎ï„£@DäB_Ww_y‘D ¡ HÀîÚ1Óô‡Õ }ƒúOÜ-Ì´¥å‡z8‹‹_N IÄ# ŠWJB'²\‘ý5‰g=Ó…ço3.å8bŠÔϾæ›ì’\¼ö:oo«üŽ¥5¡”µ˜4!±(Š„’¥ )Í!d'¢ä2Æ$=X´„ê0V—e¦E1æFI…f3”tbïC¾vnpqhÍð»ùáå+¶¦Ó}îÖ{m5…Q$´ Dé.ô^cÝÝÂnv\~«Ÿ'!$ÊÎ6ó3¦W,WzmMÃZÛ;_öæ}|÷NK~¿åóìW9\~}’FBdæÞ2‚œ ”§¸’Ô=äèÄ•Ë+L c»Ët‘G™Í=ð &ˆÂ’@’W"±Å¡¤b::l’1 ü–Ô€™ ï“š‡‡&ôþµ“'±$¡´&”:›&$ŠI‚×üjÊ«ÊÊ23ñ‘’+ÛÙ±ïœqÊÿ–„(±˜ û˜ƒV÷™]Wr¢è@|Åþòg»,òCåæR *WÈeÄ3sc=N½¦VØû@]Íë$ø=ë®nùlš*YGëÅøsK—›Dç.µÐá(viÂçnÑ¡+Ñš0t¦nsË·]Š°‰å#4{u¤tæêÖä%j¾» Cg1­‹<2ü“ñ_Û^½?¦23øýÈ…3”ü}A&T%$DÍÈ<,ìŒlu<øaþ9HUTÒníP³ÂTÅZÃkFZÔ¢§l1un¤Zý¿%!JJÒ›°\|èâ@ìû=v}”ƒ¡êÛ âͪLu„…úªúDÉ´Èý‹éââ5I(­ ¥Ž%RbÑÂk[]Ü?:7WþN¼$Úq:;eÿ5 ±žv  {áSHÈ›«‹›„š§€bØúV+ý$D+WýUv}Ì$„‘ËO씥¥-ôÈï­Ž~õs) ·¦dÂ÷^Wà¬ïoQc÷Ãfì[F ‡8HÈøË÷ßí?3üÓ… %!ãL{ﺃ9HBÍÙEô JBtPQ½—xäÔ²ºcú°Å)9ŽœGþ”]w@µ3VB<ãâÍvsyô«¯Fçõõþ»¯#ûö¥‹×ÒšPÚâ3œ5¡ÜŒÍ¶ÆÂáõÏõL|£c°j,£lçDû‰§T ‘ Ôðúœ×k$REêœI Š¤÷‘Pär8ŠÃAÉ?EÔe©x8—?ÈsUÓmX“±Ò©çáåŸn UïÔì‹:8ô—PBÞx¨ÕAJÐæ)SØ1P|Ð8ÙnV2Ï$ÖñîœE .Wœ°9¤¤W¥ÿãU0P (³PIÅZ›"y¢¤cèm”%‡„>8yòäGB|ôõ»ø‘PZJKì.b»¯TUÕêþNB‘Ë+ý~¸,¬Cþò›tržö>ÒÁ'‘!!Ö3.ôœ½ž*ÿ¸ƒ‰Ê­Îã÷·çðN…|!±HH‡dðŠV+_4§†>r‘¸*ñÂ#ƒ¤vÚ‚hM~!¬U ¬Øަи’*z<'C$†„î?úõÉ“5(ôû“'ç‡!ŒbŸÀ_5ûŽó¿ÿ0ÿ'PKB­ùZ[HÛ¥a‡lM³°éæ{ƒ~t v£ê_öÙ¬§·ææ@í#*Öa°´–i† :×~®y!HˆÞê ðAR êÇË$:6‰Ýn‹,Ò{!% N󱄈‚kKŽž„ØÊv ÿ'ÒïwjØúUÿ¸jÒ®‚ÆÉÛþ 3¸ÞKÙõDÉMä,Ô14 ¹9›†‡»$ÔV3v~»zQ ¡é¶¹”9ÝkÀ›‹+n´ gÑl[cæ'Û/ ±žU¿ú*l÷À…׳ Iýmx?#tl cä÷_v0|GÆÊÔU›ŒM¹ ¿sûÓo%ÄÐunõòáIH„N>ô‰(±¸ä×L¥³@lª´ëÃA`"‚ªGîÀÎuß^¨r£ V¢äò ˆ°Ã}××óh“\µ¶¨uwvkï4 Éf۪ǴÑ;‚%„zIòþ5üH(­ ¥Ž%xí˜ ¶%Öƒ¼Ñç3hâЄ83" PΛÙ!†Ê’JBŽ?÷¬'¡Û~°Kvð5Qݤ½$mä†ê[‹`žOBàzÝS@ ì™U¿SÏ“1r¹‹6zœ\8X™ÜxÛ©7VŽ;õ­Ž’cµCDHHüG!86O¹º÷r€¡°èyBpÖ»GBÇì€QGî1X%¦«ƒz5þ'÷H‚³áW•×‡Ò$tš§…¹Aÿ<žç‚H5RÐ/‘ôàѯa¦Ð¡Ihƒµ8LBhžÐðD×C„`µ¡KÉ yB yzaNí­øõÅ}žP„„LÁ+N}3@†”$Ädð¦] - JPǧ½ ù†“«8æšñ´}Œ@sV’ùS.5!)Xè¯@‚ã.ùshB‚—(Av4H£v Hd„?áà$¸DBõã"œGØCб’ Z®Üj z–ç ÁèØRo#"YÑ…¶š…SE·œYçï´De—4âAè¢æìÅìH(­ ¥ŽÅ  åfI£ž¡ ÿ“ó8° »Æ¡ ! þbïLšÂ0þ?-ÖÝÄ¥HUQÚ@µ*Å)(Ò ^h ¢âÑŠTA5ÞŠÄhˆGÁhb¼£ÑxÇèõ»Ïì¶+*ÖÖ‚}×}BÛ¥Óí0Ýþö™÷)·úJ¢ !WÞ?êv»?"H¨Lt‡aaþÔ·×:â$ä Ü?³ys£€e,â…â$d åÄ6 J©ŸBò Êêw;ƒù2HȃàJÜ¿ïíWjÚ?„„nœ#qÿ IsE€ÿêu=ÄÓ[ú¯ÎˆŠ9³'” ©/Þ|ýô,NB…¸JBEOB•yv=Ä6NBx#!çÅž-Skc$ä»h:w§aÊT3‘œ2ô4O\|T#N%:ܸ° ºk%< œ¾¢¼€ Iܨm€O¤Æ•ëëÈÇ9žVœ8§»;Qƒ‘Æg ÊÓ6 rµŠ14ŒÃ§HB"ÃsðÁ2µïá‡E¥"ÕekèW õˆíAç?!¡GËNÁ¢p–³'dY%á å–äI“)(÷;OHU[¾ÖlŠÍy/Ê«ÖI¨ |ñJC¸ò21}²µ£Ö†û}"ÐãY°…ìqO¨Ým—åsÇœ±âAG'ZÛ,Å0˜^½ è¢d¼P–¤‚qB ³Ù†â5e6”3öÑ=!5Ë®“C<+FÇPý\Û/ê!g¾ÇH_Ê÷C¦=ójÌÍ(²Ž³ûVnr¬î™êJga²FÂqBf !› #b/ðØþ7NXD6³ÛdŒŽ½ÿ”ÆèØU»ì™±Â©“­¯ ߤ  ÙmΣ[¿ÐIë¹8ðÍ"b¬í‡&¡I Õ$È$´ÿZcãý Ò.lBxB#¡ñÞ"aÚ$ä÷ቶqµÒ±óÐÌ4I¯ÈqÙä‰$´3¶‰ÝË2ðGtM¢HŠ$tbÝ¢ÒÓ-Ëœtƒ„(4¡¢ ¸nܼñňH²7-eÞÓ¬ÇUãý{;~”Øg±?ªVžŸù#})±Cæ$í¯ß’«ï/º°»j“ªùE·º®tMN6wÌ$ä÷$táͧW¡ ?½þòþµc6Þ‰"xbzš$¤žXw¶sž¨ê¿ÖÓÒ‰ð¡N„yíkh¸w NB¡cëÄ4œömg,yJ;wlR1? ÈÂð„ÄõÈn#Uc[žæÓ.lTs†»HÝwh³¸Ì!Ó,TZû×™…H’{BÖQž$'"#yH¨ä¿ÑWQWuÇ’Ð$}" ä û'ÏÎ< ©z¢ê2a¿§’„M(uLž&ÄÈÒ„x˱|VßmB¼qBÚÊùùÒù}•¶-Ö„xN¥Ç«ŠÃëóþPj*xÖì¯þЩ_ÿŒiš‘ªúK{øŒFÅ®[•±ÉeŽänéÏUÔüº¼ñÆî §*bÆ«ÝG«’÷¶-»ÞÔД /ùYYR›Á¦.]nDT|Èý[…Ñà9.]…à9ͦœ…·X,×!ä_ìAÆW°Çølaie$’Z[}áwÈ]ÿ$än‰=]2þ¢Ôdvç¼áT»yM“8wªÖ@1 I˜Á£ãF,èpüà^ûAîÇ©Sw¸ta ûÖ”šc˜ˆo”Å[­&? –¯]ã—tÿ¤[W'«7'Þ)G¦g¿¾N# )šPêØFjBÆéG³“%­zïÜÕɇí†ø4!­6pÍ»æABÚ­$!0G › d¥»^CB¾|Sü$Tþc½ ¯öµ$ÄÖÜêÝë2'% ùsìú%!ÇÑ?+ô»sOŸ>]EÆa¾|x¶£§Œ 7"ZI(<ǶÖ:M^æ¦|6;¾[ZZ¹<ùqÌÂJZp¦–_®À¿¼ˆ¢Q,öÄMB…'fOO~ZåÔ¯%!ÿ>>II¨°ÆeáåßßàÊ^·K¾M¿¡$T¾ƒô4ÇX©)Æ‹3V!ÊDØÌjŠ·Ú¹ÙÓ?ýtz²ÅL ñŸ}ò±_ßúúº¢ )—Q­ ËϘëjÙuøPÏ@nQk<$³çÀ|05½õ$Ä¥iÈ!¯’$ušf$DžÕ$‡}™„b‹k¸p2òW~ë§@H(Z[”„ü—‡*5ä ±*¢áP|ã N‰^Y±K̈:‘øu°dš"?|šNT^D5O/‘Pqm~†IÙÅã=ƒh4]þùÆnÌ~`“$‘PQ= ‹{iA¬Õè#rì[â ¼;c–Žqä6–ÎuÕ™H#.i¥–„²Tyž?÷`AÆ&œP²´@œxà©zayÑ7µ°2Â[8Qò™Bš“Ä"/’LI³á¤ñÙò¢Eͱ­–ä$Ž©õüºVÔ웾ZåÑhõ¼OË]lt‘6B>IѤæÑv 'HÚ”‚Ôr,¼+9HH šmº4hVE_œØæÒÐ)¥ ôõH·%%ÐI±—¤yNêðx«N€„üÒ³Ô'‡jUâð¢%c/& G]V­š0úàœ[Æ«.qj8—õÙÜ@Aówç–Ôã^‰$$O’Mœ„>ÿ裾xëÆõÏýùúHHÑ„RÇ66NÈÒ÷¤¸bâDÑÇüáâZ}\$d †æ÷ís͇¢(´I$$˜Wͤ%!ËÀÞõ&~p´·7àÑûîôööbvìK±ïrïÞzÓË$)î«‹…“^Œ§„„ÞÝ;dgABRmeú á|C’Šd *ÖÛt«wÈ)x›z{ïç‘I¥;œäŠxu§=ìDâ×a¼¸]?ŽûsøTÅàc(/& Ô¼Ž»^$¡«““OëÌ‘]h3O[²ùꣳ“³1;V+T?¾Úq¯Û ’ÐlÇäÓZHhâ|ÑÇÌáSíêÛ¹³U¨J¦„1ýíÝbБãe‚$œmÙµ;·*x h9“Ëž¿hØ´Í!!ÿÒò ÿÂò¸àI,Þ¶°è]^ˆä3µ´´´8"‰E ˜ÚÂi’\´<[«fË‹jÆÔŠï» øˆ]—„JYKB¹=ÙÆ%­;&gÿ<ž-ÎŽW ¢¥”ØÛMNâ‹[p<¹Š2uIABFôÆ^tRn‡ÓGú¦GÝðàÒ7Î ÒÇÉèÅ“Ž˜e¼è«3cîÁ˽¾½_&î-Ó[ð†Bú7wã’/~Œ®lcíޙ¬ÑR³”,}piÆŠ‘Ç(µ·ÔÌ–ßÇ ]½ë}¦ð º5†êÆîÁÜÏÔðìd•}wnG  á~‘MÞ&FB„~Ø×?øÕü…$¤hB©c© ácíêd‰Gœ29•@~œÖ†ucA÷üü¼Û Z7SâÝÏÿŽÚ¯»™t:5šÁ1 Ï»õ™ ;ܾÑ!ëà¨+Û?æ² þ(’Ù,ïtꥧ@½HBl¤xÍÝ7ê2‡“–¾J!¡Î¼W6HÈKj»ìÊŽ’eX$UP8¦å|yv!!iW ùÇJm p"áëpŽpKÇq°Ký‰®Ú¾£Ýçú«‚Ó‡zlDz¬isø,»ÖØÙ5~èxþù®ZßµâŠ3'Dòž(n/®²£ð•£ÅígŽ>ìŽ!¡“Ã%îéCÇwɼ%ƒ¾?U¡o;R|É•M~µÃ h! × ¢:½$TÖÞ*¤×½¨Õ2›EBSKË#Þ…¥Å8q,, xÛ½°â‹Ðò VÌÁ.?´¢6‰r Ý°¨I–øxñcù?œ÷»„Ö%¡F×ιCDH¨«îÌù§µW$廙`ÒÖ_€öÓråZc{yçbW‹î«§ÉAB–Wz¦Ùÿ£Ë–Ʊ*nðN©åËIw”‘ŒêwÜR·-sŒ¡Û:ÆÜV]þ®{ãÁàe°Ã­)ßñæ$ÄÇÇ"£JEª…S* â„ÂI0„*âK©­òQF¡šûerIˆ‡`5\rðäðÍ»EÍz‹Fƒ»v%·±½/÷a3HÈDniî=’lÂ$$Ð[jIHÑ„RÇ6xí˜åûC=Wî’±Çe‘±09C!wÈ펪B›DBÎç«Ö,’ЃK½½.•N4¹²Á'¥}ï¸õdjèô NH$!Œ€šê±zCžÌ\f‘„ cŠcÛN†k0ÿ‡úN»(#%!ǘT&’ª8 ãsû~À)bâ„°«/BBð'ìDÂ×Áq·à»³øé8Òc&*Ì“ÆnÝytúÏŠ9}@Ñ»(í ÅãÿÉ#PRŒ˜®m.©?s´‘þ ÐKŽÿm•„0«F åŠqîfëwàÎpGÁE¢á¼9øTõ!zI¨ûÅóæÚÏ=Ì&’ÐJ¼$ä_!¦ð% Ç ¡àO›”æ ú°¤€äX^ôBjaúÐú$„¨®ˆB“99Üó‡DBÎTjõdÂ"QSUèÌÑ{óøôMš8!¤Ó5 •1âä7tlˆ"2]ÓÐlò0 ŸAtFRž@C^x<¬˜c.kfM@‡žDℤ!ŒzÌ{áLpJŒ˜'G1dDœ4â¡ › )-›„tù'î5ó‡¯N¢Y2óo÷·’e.tÕMÝ+Í?ÿ°]†÷ “¦Æ(”=òuu$¤hB©c2¾cš‡®’fMHŠÁ‡§øñh=;†©± 0È„¹C ¡­²§¥AšÀHH†ÃN'ò¨lDHÈ iJ7Æ;2[¯ÒK$S$”Nš£$Ä—ø#@GªÍ©UŠd *?Rñø·–„êWI(v"q2^,ºuéÈÍ;§0æaDDÇc|”!eê2T$bú©û'¤]û1l’±³d&¡©G§1ñqvHò_˜„š Ï’Ü™$Ôv¤ „Ð2“†ÛØŒ72­ê½V"5_ Z2Õ¾€µ²›GBm˜sÄ« jÄ7ï+$tŽ¼#ÑN[ž-€… y—ÉËÂJ5XI NZäþƒ„Šºµ‚b!!l‡IÈ2Ýÿi'LB5WÅƲ?·€z2Š·:JBÖ&qeÖàèÞÞaEì "C$¡wÜò´%¡ÂdøïB÷–&HB|ÃPÆ ¾oloï¥( iÅd”„à$æÐà8HÈ'!?&-O?læ§ýYk0N÷wÌN¿"=}ˆ$4LnÛÃî-!¡Ÿ1}ýc ½\Ñ„RÖdhB™y:NÍJ¦æ²ò4¯Ó„xŽSûsKì¬å¾B,Š’PÈJHÈi·Ûƒö`(ÚŽµcM‹÷>(Òj d!!¬ !…+ðòÚ1ËjqÈNš8N/‘øèÁŒÝOjƒ¼´'Ô€HV- †3DMÈeVCnwâ9A"¡l² ¹ÄÈq"ñëpîíC?|{¨¨b‡;|¶3bœY;Þ ï !8–›:ÒÓw¤Ê£–H¨úHÁû,"kÇÈñSGŽ›¿jìtál‹ ¹2]¹ýêÂO¶£åXÐlxMúÔãÙmÃÖp#¢8Nˆñ<ñ¢ÝÄl ù¡ÎL-Å'DB ÕfÜkÁ˜Ù± )™Þ„³¤ÃI|i³Uœ$4Þ5“wâž.Sý˜Ö,rMŸ 5F•l®òŒº™“c—C'‰“6(%!EJ“¡ ±P…öäH¶g'ò^§ 9žˆËŒÈ÷ uàk…Ùš•ÐOÐnw‚„°ŽÚ*(Í&‡i~,þ²°}k/A_Í-²£/§Œ¬! 6˜¨YžHqRì’ËNz›$êÙW†^Ž×pmQB½MXîáÒJbU–¾;{±ŒÌ»ßm“¹M8´”)Ó“\#Ù¬uâÍu÷Ùi|G"YÃÞQâÖóå¹O[ÌRÞÍVæÜ·í‚´K¼™¡|x¿ÇZ²;r¤ådµ› ÅN½ñûSµâv+ÑÝ'ïuëåß’s—ºqqÁÙÔݳÿqÇÓZ鼨™j´éìf’ƒE]`šø~Si!'m,,ŽQ‡Sl`µôEF±ë}†2Æjlƒ} ±oÅ÷lqÄñŽX‡„Îs‰ôx|ùÓm,=jì6ð·´L[:ýh²£ÀsòAí®ÂÇ3 ~×Ø=7Õ$DVsî-Õâ)+BËK³Å´ûXÓ-²d½u‡[Õw{Lèêâ<5–‹¢¢ÛbÍ^ĵ¦÷ËÄE¤v²d Ym¶ˆ%z…ahN‰žIIƒc´wÆ '1{‡¤è/ƒ/s’CB{²¥;W•÷øx¶ñ«›îÜ@¬$›#ûìèÍÅí¤G¢ûË°„Hè—·FˆýL' )šPê˜ MèUc7ø$dÍ ƒÜ"Qó×6d¯ÉÈèûPFøN„„â·¤¸tº²‰ß¬ÈÄÏen»ÛÊ_`Ý2?Œ™ Uê ú"Swµ×~³"1*IHÑ„RÇähB¯ü[c ‘ž ‘„€BˆšY±“ú¿À+A9’õ5?ƒ9žø«ÿŸ†ÉNB/Ï‹¶Ým…„¶ÌÄYÄEÓT_dê®v }}ý£ˆ¤‘„M(uŒMHk ÍW"Vȉÿó®M›TšP2E×!ÉIˆÉÚ<—¹ýn+$”ô~¤ ÑW¡¢ ¥¬Q¡ Ù°` ?¡P}h>@H(=‰4¡d2Š®C²“ƒà¹ˆíL£Àm…„’Þ…„ºHHÑ„RǨЄ´6›M Õד¿FO¾MHÑ„D£¢Þz]…„¨iŽ´ø¡C )šPêš–˜5(™U«hBa£¢Þz]…„¨iŽ´ø¡C )šÐ?ì±nÚP…ßéwͽ’ Fˆ¸BŠ@™’ŠªR‡ªªTu‹ºeèұʔ­K–n}†vËSdaèž("@0ÄÖ=Ÿ+¤"a7¿o>@ ‡º;¡dq<¡Nèþ„ÂÝteB˜q¤ä Ë„Ô …CíК -îHdBø-…»éÊ„0ãHÉ!2– © ‡z;¡,I—ŽÙ¿§C&Äß‚ðQ¸›®L3Ž”2!c™:¡p¨·rQš&›ïxWJíƒLH&DGJ™±LHP8ÔÛ Ym¡È¯”†Z™Lˆ2Ž”2!c™:¡p¨±šá|’OæˆWJíƒLH&DGJ™±LHP8TÕ Õ~1€ž hdB2!Ê8RrÈ„ŒeBê„Â!·êør´eBÍ´2!™e)9dBÆ2!uBáÛ õÊ"j u É„(ãHÉ!2– © ‡ÜNè´$½Žw%ñÞíûÙ¸€Ö!? ÿirOHˆ÷B®-øØ! äX‰Ó”Ó’TvBuBÁ²ásBåèt"!„¢É¨ •Mßs%}bº)€ÖAïŽéÝ1Ê8RrèÝ1c½;¦N(vï„ôݱæZ™Lˆ2Ž”2!c™:¡pP' u É„(ãHÉ!2– © uB!Z™Lˆ2Ž”2!c™:¡pP' u É„(ãHÉ!2– © uB!Z™Lˆ2Ž”2!c™:¡p¨½r`^) ´2!™e)9dBÆ2!uBáPc'´ýÑ{ýVãoAø(ÜMW&„GJ™±LHP8ê„|Ôšù¸ÊN(KÒ|šÞí€WJíƒLH&DGJ™±LHP8鄢9_Ú>~Æ&ä’tã‘DŽw¥4Ð:È„dB”q¤ä Ë„Ô …CNÈNzí9½“SWÖ eIºåÈxWJíƒLH&DGJ™±LHP8è„Úåȟ;ÕuB~E}f,ý_&„ß‚ðQ¸›®L3Ž”2!c™:¡px¹Š{ƒ–sö€sGÃnuOWDh<OoeBsø[> wÓ• aÆ‘’#PŠoÈêiê„‚¥@'ÔDÎæ¸Ö°»ŸN(M¯no¯ÎbBÎÊãb·Û©ª_‡’yš÷!öý™óO8@ìRé;W]®Å\¬œ4çôw3%GÍ&´ø‘­íSûMòûï›ß^×¾bê„‚¥P'Ù’ í­:ŸÜO&“«qšrL¨ßJŽ}´䬓Xi.{¯Ìv8ÕaÖá¢=² œµ“³£z»?˜ ÅK_#vÍS©‡\üW—ëòadú?ÏG‹ùèwÓãçã3½ i ”/Æé{¿²‚>r¾Êþå8›ýœkñ×xóãëõ5Ò„Ô …C±NÈŠuB¾Óm'ÇS}hwÓ¬t't{www?ÏEèP&4Û]úÑôv‹?ïF¿°ç|þô~ûfGÙâvñ _o÷³ÖQË»b§:ô–ßÿÏÞ¹7µQ…aü;!q a³±ÙÒ¤HI$@  T MäÒ°C@ š¨@¹V,ä>”Ît¨XZÀ‘ÔéT©Vm§cÇtÿóyÏ&i¤*áb]$ï”äÜöìv÷ìÙßyÎ{6ƒ)e—×_R?p¹P³¿‡ÂEÅêdœR¥Û ‚1hDDˆ*/½‡œ¯ByÐ2Õ‘£*\MIgÀ¹ÛbÜÐsmû»o'ö@B\Ô%ît¹¿þa±Éä$&¸x9Wl•çËOnÙø*ÚŽ$ d?Žƒ‹àÿ"Q©ØõáÐlk¿”\®Ç—?sÔdì´Ú(³­­ÄýÄKW´õÒýKç›ÿ@4µüÓO¤HBaMèðØ~jBÂõõÅñ<³Üyoq|©žß™&ä'¡yæ*ô5!¡´F+“Yn¥Ÿüª8®Û9 ÙîëðYm~ž„¸Š‚¹w–þ@’ó¬Y½¿‡b™y’«ÎIlooÏ«¥ýOö,^hÈÙW¦Ç×ê5RxÈýU…[—(e2IPòOß|½5§í‡ïOî+ %·¶·¿›gV?OBÎ3fõ%!\þ†h˜üó ³Ü²>ßX¯dªw{8¶:“–¾ô@ïÃT7M€‰~ɨÛiµ+‹íŸÞ>Þ¢— qï½ó:ÙW/}úIX ÛŽLÊš½·;~åÝ–¡k©U]Íiµ;ЄÈLÞÍof7ÅÙ1–øâI(2JÍ3Í’ ):Q] !…‚§`¿•„Å!ñð¾¨_À¶ÍfòDBÚ$äK8¥D&f°ª(Á³š"0T„#ÊÁ§o÷r‘QN„|÷çÁ äñ§ÀŸŽä;Pó •ªbu$΋¨(ô­”Ôc ƈ‡¥"Ì)IT(i Ÿ¨ÃbT¨zÛKbX™ µ}6«ËZKÒW\Eº‹u =iç¤JB[—Äâ[*$Ä ÁpÉ`B¶#J©ÑZP(=NÜ=¶˜sgi…Ž¹”Vïú<ô§V©éú`&£ òÝZ®ŽÔ¼ Iâa .ŽoéýI¤Íl”k¹üæÅñÅ5šã÷¦Ç—Š5TÁöñ´Zè8ãIflñ¤EËÙIL¾¿ØN¢Î6—„¸ñY*H¨©EË‹ÂÁ•ò“m‰yÞ™”·9:H©’P|‹‚„bdÒ!¡þù×ïõûåןŸN´!ÎRýækµðÝcdþòíÄÔPvKBiµ@Ö´ùĭКvnxq¼WžHh 5—IÂç*×ÛÑ2Ìò|j,Vµåþôøâ“¢ƒABþ¡†Š(D0eF8RÄ NÄŽe‰L„c(¤TFË}©2|僄v8è—|8ÇÜPÇÜÈl|oº^Œ&÷®ŽÌ1;Æ¡—M×Ëm î‘„LͶՒô“wB–|º}#w¨µ¤¾+1){²§}[Ä_RGSƒžT˜û%õpþHYXÇe[I)Ž‹Ió4ÍÙÖ”Ôq%EéÊžSR¢Ÿý32šM…æM/ÖO¨ÛMh=!u‡Õ™à”êSŽ? K£Åš`M(9¨8H(ÆÕHˆ³½q #Ö–©Þª ù3P•“ ÿ ¢¤ ùvï™Ã—[$!,hÛõy†Sæn4Ý^¸Œ>Ý <:îáQ&@"º¤2F "Òõø3) jT¸Í÷ä'Îé>ŽC"Ê=òŒ„X4@BFšÛ  å‡NB­^h_+ã&ןäj„ëÇ[¦ÄÑ#¡žvØZUMdï$ôŇú?y[#…»<¬ Z AŠ=¦RÈýFËdþNâ&›ÄÅrÃÀ:î¶P5¡h“W$!2 ã`/|íÍ:ÉñíA ’,Ä4!3þïö˜Ä⤠iЉš|Q‚W‹$>Z5;ÅÚ²Ÿù a ÇIË÷eˆš^ŽA¦…HˆSð4 „ú !ßîoXy| {#!ØÕ—ë’nݨK)kÃS\¼R´’ZÅ[D'wN$¡B_Ò<œc#'›Mù^IAà#!¸ZWñh˜)Ó!;'$º»ÞŽ¥,OrÑû BqQŠÉó-úÊž$#HL1˜Z%a?¡ƒ@Br3b–‡iBhD˜{¼—Ù1q=DšŒHˆÚH#ž¤yDB|¤S- ‘–¨¥Ö0“rŽ¿*mi‘P~€„DBäηZ(’P/ If½È`$„;Ÿ¤Ü  á\A¡åã½é{$!lý<hädy¦ ]£Ù1úòMÜ! º uÃ%eö™ËuiçÚzÒ²ÛÎ3MHÑïÊešPZmdh/XÜ»ŸÐ¼ü½w$IBaMèðX(¿Eô ¬xuÊßþ}r+„âM¼ÁóãúR™:äµclrÌ;?11?ñP$¡ÿfíX~_V<¤mCiõ) îz»ñÍHÈÒ[ãU™‚üH÷· øB–Þ¿uÇkz‘„PêÇYs²¯¶ r^;Þyê’/UEÛ^}­³·&ƒ‘åì)ÑO¨¸³·›‘Ì·{;¶P£÷NB–D góN+®†^¬ÐªìI©¹ï*?DB“b’n ñöÙæÔ*a¥®át+#!Ã5×ìéÓF5]qÏö,1’ѧOé-Í©ËÇ^3…FBd˜‹ôœ==¶žW›¿Z8Õš:{/5Ws·ñöÜŒ$»vì@ý‘$ô臧½ðúþ—ÇßhÛà/ôÈ„"ÈÐî‘„84Ÿ£‰ ¡ÔÙÒĵz¸•ÁÍ«ëØ‘›Wü$äE 9vÚÈ_¬»}fÅ%m‚ÔIC €&DZàF2!.Ç€G‹! ijœ&³Ñ È¡êúIHg#é—\{är”Å{"!pÏ*È;0hv,Æ¥¾ e髉‡›!¿CêwÍi]²bñÄd#¦5SÒW@B)5½ëiµ˜þÎî¯K:zÚ ì„( …5¡ÃcÛkBL:ê7(B[%!¹Ÿ„rîÑÄHZíÝƆì¼cÚ2z' Áæ/ô}BéZZªeÕp]cîîL Âsoº¯$ež3lWð2ZCGw¶¿8ƒó/j/©ç Îg;“¨M$!2r©|3+NÌ`Ul ädi?K]ê-+[;‡ËÕe-{÷ÌCÓ(€µ8jÞ½î~ór½œ½ϾÂVöÐz¯r½˜wûœìê*Þ—$`®ƒ‘ØoÒ*13rÔlô¤°It [:G©øßb‘ù´­>ù~à ªkÛK‚Õ³…jx?ÍdS¹K6 Åý¦S‡IhÇ$tâÁæ3?!Z/ùà1>-?ýú+؇{€´ïQ$ëÇ4»ÜɵÑZ©± /¢÷ˆ•Ôk09ÞrýFúõõvÌŽµÝ(<™s¯á5– LÀ  Zš”IH–¿Ð}¤ãÖeùHÈÙ‡H,ƒt VTqžWÓéÕÈ8Þñ¦UáÀkü$Ô5†É³hƒ£ú5zsaþ¬ã{òÂÝAÅèW¨*Å’RbTcé…ïvÇ-4+Z²ÊÙtž1†BB¸*ìÊç»×¢S¬ܹXI¶Ânqµ=xè&îHÜþ[lßIèË—> ûBš$Ö„…  …¶Ä÷õwÇD2 A !)üÚFÆ)cb=oXC¸‘‰„B5x4ÆvÞ JZ/Óý“U9RÚÔpB ‡&¡¿H”öé” 9h„B¼ÁÈ‚ £ÖKsô ŒBF­ž sùcnäh lc9‹ñ>‰i± JM0k˜Ow†Z2§E*gûù7+’I’„šÐá±4¡­ÐÖ¸|/$ÄPÓ^Ì‘(„¥c^8 IåwÇB°dˆ7 ¯mo]G³C'!ÏõÊï EÐr¤p(/š„‚TJèÍŠ[LÚ§S*Ï懃©´äHú$Kîl“Ð'ïûì­Z)’PX:<& MÈ4¿9O¾B…67á%t 4¡ƒd:œ„bÅDÊý¦ÀòÊÿü°Ã$ôÂŽÃBÓæAN4’>É’;Û8 ü`qX ›ä4!z¿´d›³Mú-úÿ™Iè<p’ÅŸ^Fûßv˜„þ`ç R‚(z§Ó \ÈÚ;xåyr0Ä LCÔyM½×Yt>MMñø »Ï¡ Ë„ì„ò°|'4žÃá°=}4Ú¯ Ù 5ø+å~Kwóv|ýâøòˆ­ uŸC – Ù åÐ ÛFûuÅóù|²ú¿‚ðQ¸KWÂŒ#%‡&,²Ê£Ï/vBßðW> wéjB˜q¤äЄ‚eBvBy@tB×*tù&„_Aø(Ü¥« aÆ‘’C – Ù åaÙNh?l¯Îø§ ]௠|îÒÕ„0ãHÉ¡ Ë„ì„ò°l'TV­š>µðÞ”Î݃&¤ QÆ‘’C – Ù åaÙN(Öß"´*À7¥s@÷  iB”q¤äЄ‚eBvByX°j”:L³/Ä7¥s@÷  iB”q¤äЄ‚eBvBy¸U'´øËzÐ=hBše)94¡`™PnÑ iB½ºMH¢Œ#%‡&,²ÊÃd'´©óxÖ„útš&DGJM(X&d'”‡ÉNh7M¨@÷  iB”q¤äЄ‚eBvBy˜ì„vïóØmj™I­¥ÄÃN{štc”Sj}Hìu™GûÈ#ra¿í_9(¯Å'{g°¢0DÁê iHÈÊ‚þˆ§ýaes0’]ÖÐU¹KÛö ÅGåà?;Ô¼¿à>˜ •eå{Bcš:‘–1ªÊÚݱ~ûãݱfõÁÓ1OÇ(ãH©ÃÓ±`Ž™ Õá?™·è[ÔMH¢Œ#¥M(X&d&T‡•L¨õx‹¾U@}Є4!Ê8RêЄ‚eBfBu0ª¨š&DGJšP°LÈL¨fB•õAÒ„(ãH©C – ™ ÕÁL¨ >hBše)uhBÁ2!3¡:¼?êŸÃ\)êƒ&¤ QÆ‘R‡&,2ªÃ»3¡CÏIÿ‹>ø[¾ aÆ‘R‡&,2ªÃ¦ßÊî—Ü5š‡Uºp¥4¨š&DGJšP°LÈL¨[2¡<ÞÎncî˜ õÝ°Nö¼•Ò8 >hBše)uhBÁ2!3¡:lÈ„òtþ<Ž?ÏéëšûeBóðŠ™·RÔMH¢Œ#¥M(X&d&T‡ ™ÐxYä@y½LûeB9,ø¸£ -àoAøR¸›®&„GJšP°LÈL蛽³j£ãøÿDL.yA¸»T"$Pš ÂKB°€– ï• ¼(/^”)…:@†Š¶•tÚ)¨Ó©Z_Ûal}©ãø›ßÝ» ‚„ ËÜÞnžÝävŸ|î»ÏÂÑIÿ¯ É#_T0L`£—:6"xšÐ“áÒjF£=&¡µú.(仲N—Q’œ n“СïÇ%!ù‡Bâþ­kBG6ý¿&’­yzFÚMH«éq8›"Ô‡ƒ„˜Ý¼FÎH6uÎÙË»fBÌ/ï É×ÏÅj˜ƒï¶´—0\0ûňOⳘÙ\-D¿›C¥NBÌ—n{òñ§/Óô†îÀ?±cMèȦiB²°u$´_š¶çÑ'ŸL—ôhB‰„X™Œ“ÿGè¶Y.ÝXe¤»4Å*”OÇšU†­Ê̪p½zÛnèUZ.¤¾}ö‹„<'$ÏE0ÞmI/Iˆ3rAëcÖÐ!Ãö$Ìj^¯›G‚^Î…$£¬’—:i¥wpëópMA|—le2O§ù‹É»ãä]öäÃ÷Þÿ$¡cMèè¤iBa;Ó„”Xß‚³cñ¬å%’Ví™ù}d¤D¥}Ê$¤Tr¢#ÛœŠ®¤µöMçs_IßÞYÈao£§ÊýÈ"®«àƒFÉÎL‰ÉõŠ{.Ÿ1•nU6T\?|.;u¾¢@'±+,ùòd*•ðÕ‰CÆ€£ "ÉÍÈaF×7c&ÍH7¸1xNs¡@B¬ÙÀmÆùMoð‡ï'Iµ]7¢Q©4áŒßþ¨0d²bâOµœË@UEYÆÆÁ±Ê$¤ä·v˜ÊÛ`Ö+6ÝæIûB:·ÛîÀwlbŸ„¼T£Ÿ‰ÐÖY›&Õ,¹täâmî½~Â¥+ÈØ\º£›—Å8æ³OC‘„Ž5¡£“‚© é§Wº'r,aEwg&¾Ë7H$!g„çi“¾¤6š8²ÔŒ-H¨2Î „× ux¬±l&!¶2ïêXc¦ñP’댅 . YçV³¹¬˜îÛÝ)o“ö/ÅøV;¢ÃŠg&–ë·3&½¹£ß7qÓÆÑfúw׌hpcðœÏ¡@B ¿~ûÍÆ’®ŸÊ* %tâj½oá6“ëu wHI(!/ÓHáå¿FëÌŒÞÖ†92™ * 9¢È'iO½¨ºéL„óíÍ©fïún#MtC€„Ø÷ !}ýÜgŸkBÇIZ aM¨h &rñÝŽŒ¡ ÚçŠK¥6\­‚&4:2ë‰PkŠ„äøÐ(«”QɆQ**ABr38Åo$¡µêxfÄ,½Yƒ»z1§$$Z[#!×xÔiu{¢A, ¦`‡Ô’ & ÖZ…fr_ ™<ýÕ+xV&ˆ$rªæ $Tœ­QNQmF­4”Åâz=^'¾ˆšR«4<#äYÈ+ÃH%!óâ H¨ëƼQ°h)N]tZê<ý`£­“ôfôyQ_LÏÀÝojF: E® ž ©ð*$Äš½^¯ %è½Þp$”α2¯—èE¬×«àAB¼2œÛm#s¦ÒÊÙ™œS fWŽWcŒpä›ãƒ(FZ¾ª¢¡™ÈFÈiÂyò„ÁqHHÓM!8:Iò‹EÆÓY)([7m•˜¶,^†bvݤÝ ¹®à3¢ÒyÒ ÁÛ Ž¥Ù„Ìd™\pM~ïƒç¸\uoŠM­T‹Ä(ÂyV±¡†J„ë—cÃD¦$ÄJÐJ÷BBï#QúúÓwB„Ž5¡£“‚'Tu¶!yÔT/:W/‰„Ôª¦’ÙÅÅÙigSF»Ÿ$ÄÖ’Ž[OBfÇBc”ÍÀT46Ö¦qlÓBcãVÇ>²³Mã O’P z^ãXcªAÌåÑ›Glj×úì Hˆ­ùIíõÙIÎ_@L•\mì³ð %c·bICzÇÕ±yK%9ŸÆ™=‘.„†’ª¹–¤l+½w|ËÕªæÅ Ýñuw¯æNA4é^-32¹m¾ ß2Yã\wfDe%ÂÍ[!úV%’;|îºÒu¶#š„ƒÊ2ºbršçLo°C(ÙÆ„ôfpwÿöúfRÄf¤“ÐúIR$tïÁo¿ýõ“‘äÿõÛÃÉ.äéÙ¿¾ý†Ó“çŸ?9õ3ԣݒØ1+&勘†h}gJù¨oc$šÐpR¶ëŽ¯ûfyÕJ7ˆäÖ ŽCABzçÕ±±[vŽÎz¦72rçÒØE›×³Ð8oáÙÜqäÒu´åŠHžA[ïøØåËeiäl­Ò¦s»ïüœSškœ(ȤSó‘©F!›0°ÿ€Õ1x©¥‹©FƱ06jú_³tœ K¸ëëþ.ÛÛY\êŠÉ±_"b¾=+Æçë†7 $]‡ÑD: Qúa=÷^’б&ttR05!$ýðë­)gÎÆŸ’@BdßØ£G¦g§ñèìÑì# ±¶þ¤¯3™ÔXŠÞA ϵT3*½r /±w<3Ú5˜™Ü{’9tÖ¯Fn9JBŒX½(¯ÏR9i³æ¦Ó¨A±@"P‘`Í ¡¢dü0¥'­æõÙcZeå«Í:Êgi2sIM:©â8Q¨vD„ÎW”y/¼Ùá5vºó›bŠëÏ·¦œž­ëHÆ­¡l$)¿§­¸TR×·øD‚4{.›«:ë†;'o 4‡/à®+ÛZ“Þ .ÿõŠ2c ™”@3Ï ýðýOS¿>œÔÑu±èpž®Že=x8yï ñ›þÃ÷þüð›=hBõí³3ñ÷ý$ä.ë¹ð]þ”@BCî|µš¯jož­+›šKªv®ÄÛGÞ%ƒãp9/3L;×µÌdµR.“õ.¤j ëˆMPÖ[BœÅ­4ë ¦­uЦcä¹'p¶ÆÒ;žªE]LÚÝ“”9+n‹ô2lyÑ®ŒÄ ‰Y0„*¡/ÈGNx!ôe§$ĪչÐB«úsî×sfµzèÝ‚©˜âꦘ›¥„„FÜ8,ßd$ø$$‚Š$t¬ \MH~½¢!!¾îÕ qBZM“ó‘?}2P¡}$¡ôÖR)%¡¥±±±¥±ToIf4ø$µ ëPÄ 9k숢$ä¨I+!ò‡Ü™e) %¬«Žãd1 ‹¢s zj,T G.@Bð›ô£ñÀ”õ N¹m•WЄÍÍX`Š’¾80U0ㄲnÄß¿áÃo¼çlƒ‘È#w‹ëÉ×ÛÂÊíÕüES)8!Q8õEnÿ»ÎÆ{*PSˆ˜†÷Loï4]EåšXÄü¨)9NH¿øyù0¥È³Ðÿ&†+‚(¦—ð­J…›mLHo†„¡Ç‚.ZkæÙ"¡IŽÒHèÛIƒpŒ“:öñÃÉljôÃhE»—+溩à“å'! ™®þ†û µÔÅ7‡s$N"‘³5>½}Îô#¾}Mœ¼A ÃÙ° k_•XŠBœ‘iŽšfgŸ= äC=ê RøMVäÕFà†gOqBÔQb”Ä÷xÑ)1-fà2üÔÃAà²ÓNIH¦QuÞ,e[f&0ø±~½µŒlØ°»àR (¥P5º\0·$DAèãç>|ëTȑб&ttÒŽ4!Å:§¯ÞFb¯·b.éGÎÕWvb현ÔP„¦‰ô~¦§Ú§'Ô'hB^xBâ=5éà”šÓð-" %: ,]$˜¢T«eœ@B몃„TbÖ !ÖQ3ÐÁZ:·QòÀ˜‰xÑÂ$äúå2Ú½«Á$!ý¨iáòÙÏÎÁçÁ "¢ã¾ÊôL…íq‰²Ÿ»Õ)œ:·I|gjŠ$tiå6¾o’ÊÖ¶Ð'5%“S›‡Ü”š Ôã FÅš6XÛAÔ‘´fB)¸ÏÝ  ?sšŸ„Ø{°"æ'!Ž<ü2Õky!ÄÖOB8IÈ<½òf¼]$¡¼qpÄÊ P"dY$XÄ^ÊHhœøùf¬§Szðƒ˜ ™óð ׂ0iR÷HB,½2b)‹ôk$D³J$}aÑSâ­rwNBd…»{¹”­ZYÍÖ±Ó+¾î‰Ž)ᶀ’P7ÒêÚòØ~’З_?ûô ](ü­ŒcMèȦ-4¡'¢ù“†·Ò„ØKtM, â3ü|nÇ$¤izô¨DYk×DÄ´þ„Ás|š$!ˆ hB¼÷'#¦õþêð‡p¢ÉbÖ ç„ÀGKóŠaÍЄÈRÏ@H MÈÈ o%$Ä¢³" Ñó C[ æÞ±áçë>¿r¹ÎTÚ… &,&UóV\6ÿÞ1ðŽxê‹9S¹ Ñ„šŒ@BÈE‹ŸF!!1OÂhå矗FBÈ&¹}{5›—3æÑâzVÆŸ¯è0võÇ'‚Ä”#IÛâ´ôfzcRÊaqs3ÏTœÐ:bX¬ˆÝÃ1óôTšÄèÃêVɸ½Ä ‰—ß,üRkƒ¸:Æ3f,µÜHÈSAGV†ÑùÐŽ˜&| ™øMˆÌzrVé<ƒiNÞ ëDE"áB´arkÖ4!x …†¡a>ÌžHõJTºŽÜ9Y×4¡v1KWÇÄN†“HB#î|ÃhqiQçóu)å]ý)ö® ª É[ÜÙ„„M÷„ÇÛG ûÇÒXH’б&ttÒNþ}äK‘*zñ¥ˆ-ÿ}BgR~\„Ö¼øAÙ‹w’v® iÛœMÎ?ü$ä8ÊȽ–W‚Èž’šÓMDæèkî¤$d¨mV%¯ë îÎ_=¯æt¢ ĬÙsÒ(’4yK‚h-@BØu2®çt»XSáÎ'{jÓ( YϤëDÒ;O’?³Ó‰ŽàíÃÆ)ÜÎùrNéGÝóyý7Ë/õ›^¿ë†ê³FBþS-­ŸŸiKª6/ºb;) ™/¸çcc9? %y¾¥.Û±$ï¢GcÙLÓK±ã+)oç.åOu&õÝqgë†[sZá²·NÒ›‘¸Ëâ"’yÒÌÜ“Í<›$”p $tÿ燓͈úéñƒo£ï!^è~2ªÜCf$¤Ç x5$”t˳\Ÿ€ £ÐÚÚc#g?ð“Ps'É9'Ý!MBa¹ µ§= ˆFIÈ5XÛ¡A¬¡lj“ZljÔl¹r]«ó¼fS:£NöŒ×FûIhj¼6Qn.‰*TE„ÓI»§8!pÏÒ­4hȵ‰ëVÇTbÞC¥:猲ñIhÈ=Ùyӆ˄½ßoJ½NHÈ”™‡YXÕšcª‹?ùjâÓ‰˜ÆAˆ’б&ttÒþ=H'ví  l+M(«­éæÛdŸÈröÎã„Ô=NgOC!¤&ÕS%!çëÑX³„½"QÀ²ùƒ  6wEáNïõ4¶9€)ÌPôWÇæ’F‰Ù¢z^·c‚;>J¬i×ÿeEìÃöd±¦ìfÏÙnRt†¸Ô+t˜Áyb“í…"Þg  a§|5ÓBÖ*Šé¶/ÖÑïÃæZ6ûyyØùËÕ¼x {ÈèÅDÍr”pV®ælJ¸Ûˆót·Ùr½d‚IúÒ”tîÒÙ2£« {ŒŒ´]"àl“¤7³èÃ]®ßÜ̳EB®Å ýö×Ãoä÷`ï˜õW²w,ŒöŽý9)Çþ1Ý.¹ÿ¶€ÔXUi°‹‹ãÓ¦j’˱w]ÎÏȺÓp ÎÛ ýƒ#¤IˆN³L²a«ÐÈŠ³þba;ÙZhÀl½h“a;)ŽÉTÇ®2ÙCw‰Y¯À à¡i,‹¥áì&-­„m¢{¸ø¹×l:Ú+Øó–À-èñ duX´›·xàºÐIlYE£‰ÓÙ µaÒZïú0ã^½Ñ­1Ù®¯ý¢^:ÅÓ9n¶wv¥{ó > }eü¤/C“„Ž5¡£“þeïìUÛ¢(üN³(;°?&B HŸ&RØi‚ÁMêtQåTVšTÛ€H‘äBF–lkeïbÙû]Ýó©¶t¸Ì Ÿvµ:¡ ò?w,™ÐûÆ„«J¨Â ÷Е a–#%‡L(°LHЊj–:¡ebZ2¡5ü#…{èÊ„0Ë‘’C&X&¤NȈNhŸªË²NTc™Ðü#…{èÊ„0Ë‘’C&X&¤NȘN¨ãD‘ ]Á?‚ðQ¸‡®L³)9dBeBê„ü0l'tXÜEÎÛ)ÆÍA&$¢,GJ™P`™:!? Û åY±(ÂAø(ÜCW&„YŽ”2¡À2!uB~¶ £í*”åÀbÐdB2!Êr¤ä – ©òàP"Y»æÄbÐdB2!Êr¤ä – ©òî:¡Á7èÓ¸€æ ’ Q–#%‡L(°LHvÑ É„¬šƒLH&DYŽ”2¡À2!uB~hí„êØR&dÐdB2!Êr¤ä – ©òCk'tЗ:æ=‰é/“½âU¾àüÅ™CG¹ÅY½aâ b÷ãÑÚä¾h‘ ãP¦½N2øviG[Z;¡ƒ×ý8¨38ŸÏUæžZsÐ…í¨òÊ–ë„îÆÞÓÿËàõþf¿k! ¶¾3ŸCߎÖ·cê„ü°íÞ±¼ûËŠ I„Hs0mB"ˆ-2ŸC&X&¤NÈï„LÜ;vA€^ìó,›Ð¦bË„Ìç – ©òƒ›N"½Øç96¡Ä– ™Ï! ,R'ä'Ðœ"½Øç9˜5¡y›bË„Ìç – ©òƒ“NsôbŸç`Ö„ô{BÐw³ŸC&X&¤NÈÃwBy;ÌbÐdB2!Êr¤ä – ©òÃÐÐ(íD=5ð |î¡+Â,GJ™P`™:!?té„ò³†¸ÛNè°ØJ6îã€æ ’ Q–#%‡L(°LHºtBqrü©á¸Œ· £tByVl'æ¼bÐdBÿÙ;ÿŸ6Ê8ŽÿþWËÕÀµ^‹¥Ð²‚|Uq¤(,_u‘6“Á:ùnÀ„˜B•`„à ÊÂŒYæ†_·m¨[tÉ~ðý‡3ê,{Ñ[-LÔb­¬»…FBJ"!ÍR¢ð„ ¶´d³$[Uæ!zBÖĽdU^O‰s)è8h$¤‘ÐεU'›˜í²ÎR÷*Ÿ:†×£Õ«o—*±[h$¤$ÒÉa6l`Q¦Ã¨?´<¡“„L ‰Rþ¤ø¦(wÐÕH(R¯ãŒ\¢äÑ´æù,;‘Ðlc猤 -²s ZmJÁòÙS­.¿»…FBJ"!ÍR¢ð„’m ,YèÅ9Ìú­:2‘ÿÈ@gÒÄ%Bÿ§w†ƒE䜰×÷ÆÄda)’ƒ¬!{‚•Ñã]ÖM$”Ýq¶üyÛgÇSô FÎÀhE y`Í'Ëÿ‰„XVöAPîüèó¨ÞL‰y…š'¤ZEå é˜M$$‡'d2öž ŒŒü=255A`(V$Ä÷f:™]”ctÒ" ‚ãTò«mù…4%æ$¤7W¤IrÙØ7{_oÉÏ°^»¤žÑ›ë$lBÅM‚ÝÙ^[ö̲ßB‰¨o~´°Ž>g®Íw/ûRÎÀ,Zø­­=#BB~wÕ¡ˆ½£°Ž yý9+Ýkµ$4ÐÈ  À £•ãK“¤"»Pª3æSyÁHˆek t¨¸ ñ:iìáß0 ø—œo9ø E2žÝ|÷Þ{ïPp‰y…š'¤ZEç 1ÑzBa ä1Û qI'îM…Fþþ$Ý»×c6É@BhœD2ôx»YeAÁaG)#g Û2“Ô‡]5 Ôp¡]isâˆÈC]i N0( Qþ[b·.#0³25'¨'àð°ÎMBÑí=×mëI?ýxé$Äç0väôçG„žQ–žu´µË-\~êk‹™­èò¤ìP[g_ÖQá~áµS+åG9Ù3ž–ô…š†ú@®éÕ¯|N‰„òÜƹ|Ê 4g\öI®Cèõüˆ×gL7V¢¢:±ê;?} Û‹„t[›™“”Á}‰Oh0'Ѻÿƒœ­6OäPIÇZ8Ì•ÅûªVg¤Ú¾+{×)ÏÙ­£X,ûåç\b^¡æ ©V‡ê ñÕxRÖ0×Ȉš„LÜE€ÐÔÔï¡ß§¨îõr2P¸Ñc!n9éï¡f4¡.ÿŽ$„îEhŒ E×'‘P ’PuUIJdTŠ3 ÑëœÂå¿%¡$G’AOeÐ ÉN–Oá«ï¬ß8Êœ¹³¾þà—¨zTö?0©ó×_Š•„²;º»ÏfX¶“ЙñìþH¨¡MXÖÚèIááúsˆ 4Ô_¹*U"‘Ð|w÷âšÇ¹AB¾Áe·q¨Å$\öcûÔ1Óˆ«M*,1†—Ý  #­¯²˜´rBðŒãt´€ô !„ëÜ–h;<&MÌ/ )hÓÑ";j‹ú S¢ÃÁÉJÝdå~Íy@œ_„FÛ3@Bü»pn ïSÁ-\­Â§¿ü\ó„4ÅÌz58¿9Œîƒ„¸ÞS!(<žtZOhŒŽ*­ýh"h~Í“BHˆŽ:2ñF–!!=üòä\[y±‹ùð¹ÀùžçMá.—`Å+H>HàLEÁÙãx9®$uxzáî4M£à8ÁLో(¡§ 1%6 €„¬:š4F&ë‰Â»Y©ŒªH(²Œ€-ð·r£Ÿb_½½²ß_ð`ýÁ¥”(IH°„9²[ ¡|§ÏR_‰Þƒ„¬pþ- ͸J.NO–Õ¡Š~ÄEz½’òÒ9ÕPßžéV8R¸êß‘„èÔ !*Fn€9ý¸õ×n#!¯›k Þ$E샔„^"PÖ=º‰„ ´°°$„ºñòÚÛ3B©=IHÊܾµABø¦ Ù †ŠèØ0’ÖžK‡e䎯™A/]rÈèŽHÆû×æÅ4 iñÎæ×Ù®´à<ñÁ˜j’gávÚçP v¢Ëó~:ß6¬,..Ô!›ct¡Ä"–Q %ëzñáÖs$ÉBBwb²óe·×aìDGBà'ÑBʾ¿¾~÷RçmÜ’gÜøÁºÂ‹÷¼4þ+Ü£KB…MÄnù:=J¼™Ò3jS c å¹IŽÏB]ÃJ7IÉaé9Rg!¾*™&íœ'ä³²zëPc¥Ó>B=!t½T}kžg $–²nŸÕ£ÜtžøUì`ÒÍyBYGõÕA„pqobY–K5ìIBbæöû( N ì.?gmÍ»JVådÀÓÑ=Ú)^‰¨z¢r‰:Ì•"4ˆ©n…ò›^Ø:“¾ðÚDsûð`c¥ÙøFÐõM?æb ÑÉÒÄÊòKùV>œçé zk@BãAW w&XÞo«ÉÄÙf}íðàÙöá×k$Ã[3ÐVX2ÝÜžš`4ub°Å?_Ï…¬óx&#ÔX‹< ZÀlêú$èª!«qp‰Ê`³;òܧÚÊKÅ2ª#!ò•5ùá›  A9Ã÷ABØàº}÷’%JúéÇ_ÆïÜ%Ü ÔD+Ž•¡‚ÕÛ7Žâï‡üÄŸ~üó×»?ÀòOè–DBµ½7=ã …= „u·škÇgò|§V²JÃçÚ3—nîHB ›_Tœ~ 'âÛÓͨ¢ŸtÆ/N÷ÖÑ[÷îâHžÐÕäÓ}Ë~Éhm.‘°6×1Û+ÎMkÇÏëéHˆ5g=ïÈMÁùKJíIB ²‹$¢ÖípœF+C“½v ztÓí$³§î"L¨ ó-2Wò 4XÊÖõuwg]Ÿ_ìβ (F3Z5ºSH˜0ÇÈ…ÏUŽ§çŠÐé¡×G:Ù#1j_$ÄsÜ«}…M }Y×0!Œ¦N¹HHä–lǼBÍR­Á: A\˽‰‰i˜BôÿߧN`å˜,$„f!Ù²ßÓ™ŽQì7¯o®¾ýzUóßO/ï¡M. NžE-BB´h\ó›ò„ˆQNIh¶)Žó„Š®dݺ2¿,ºÓp® kr¾YY\»:èªAlõB{qY°üVÐå7b*»D}ý¡æ³ËðÑæ—¿¡—¨¾ò‚‹®Ÿ…2n‹ÊHÈä/`žG# A¼@Bü*µ„¢&¡K!7¨¾SØÆ“)üý»—îß%NÐO·× YýkBÃ2‰„Ð3:û·jmÎ*0X1:Nµe\œqýŒ«ïnyB4ªNˆwĘ,êX¨)Zš$ncçeÄiu‹œÓJ¾OÈëO!ElŒ.ççÀ°¨ÄPöô !—óuxr¥ÚSÅR —=Åe×;“Pg:´HBÍå¯ µz;Ç"BUk¼éÆó¥#`…¾…ºÎ>ï±Ušèmà6ÉiI}*ð"giÐ jm¬4&²2(>ù Óü)طćk«%˜I›¶é!ܱ±z Í…òYöEBhøàB ß:I"‹ÑÔ) QnùòéÞ=šr¸¾uTó„4ª'”°‰„¸Cö„ coK˽øXQ®oVDœëõ`aÏešÉ¨dçµåù[1QÃ(y²¾½˜кG›HˆÅppfæ¦g ã=!þIœß\¾0ûMWåšúÀ5ìž}íbf®s虫×]5 " ¥Ó<‹«(‚c^cɹ˜™OÓäÈ-W eÜ)*#!ÿ£‡uîGKÙIˆ¸ ÚµA!"&‘…Ü܉,¡xB&«À  a[$!¬k?(Iè$=GªðÒŽ$µpzú{¶˜’PÔ í’¹M‰'b€Ç;¤<¡Ðž'>è„$wSoÉ>2ÙF‰„à¡&²¢õ"!!šåõ£¶æ@®ÁÅ?~vDz‰ŸX!þ“DB¥Á[”Z„\(_Ê~H¨è‰„¡¡+è¸|tuÊFBßg|ùù›)J¨Pó„T«(9-9I’-ͬ?lO2SèJB÷d$!X>˜EH k¾¢`ÞUÛ+¦ìÁsÇ+ïgÏ">¿%cºçåç{‚7+ó„%sõ•üx̘fŠÒ1œ™/?j§ù Èbp½¾$2"š\óYDj"ÙŽ\çX›÷%Gnk—g®^.:Ó½/½’„wÛlùV¡Œê2¦™Ò‡!Q\v ÝÚì—„²ÇóAB·~½{)wü×»¿Ü¿}#uùB·òQdHBö‘Æ/*ÒAByW{Ò—ñ-@ÞPÃE[æt³DBç;pŽ8òYrŽ„á¤(ò÷¶fn Q0¿©Äƒ.@þ6rAœ„„vÍEÌ­·’P+OPP,Ž YHB0å5x·’ºŽ\Y¨C®TÌ…Ú !·/sÐ[‚}kkoÙRgÓF›F`ùHHÚPB…š'¤Z=Ñ¢¤ãH“ä ”´»'4vÙCIèÊû#!®÷žd M„é"Ð ËL¸üd‰[’¥°ìV@ý| ù†îD»@BäwŒ*M¡YÄÿ/»;¯ÔŽ£²ÒiH(ž$bñ°­d†^-äc` ;¿V+E17ÆÎWgc7骲ɳÀÝÉËn}(ì3§i6VÓ‹eTGBŒÿ/ÄÆd&!ð VÑ\öKBª1=…Ý!kÇ^Z;¦Ç_Ê¿ý>!1UÔ¨ ØÐ5Gü\[ût—o‚.DBŠMÉ)º9GÐË”LBRæv/VŒµ¾~kÙÂíÏçn'!ä ½treª¶eεm#!,k«(è%  !{šÇ²MÁñ`$„á!–¯Ò_`Ë^jt ¹PQ“*!Ñ1¼¿â ½Â®’‰MuÖIunM —‹„œpQB…š'¤ZEá m“ ¿;&‘ôlj$ù5™Q¥”réùŸÕdb%Šy³ã÷Xc®­™Ûmí© ÿ5`È™™yòå> r­Ç¯JIöbæ0:šµ#|ðaDÔ°T ~MÐÒw ¹ü¬(CJøo“µ_`|¢ôaJ¨Pó„T«h<¡íÿm{p2q½)Ó'.šä&!ÝËŒ*¥œÁ0îIhË‚JÎaŒy³5úïÚa7gfN÷{Dc'æ͉¯£½\>ORSŠ*ÔZÛ¸/êÀY iB4!˜áˆRMHLÈ×µoî˜ éâ™Pn&´rOÜ‹:pCšMf8¢ÔAªƒ ñsBªÍ„*“ÆMV&T»#ÚÀY iB4¡ƒw+Íz}+ã`÷ µœ^âNÊ­ ùhBÌ„1š 5©deB­ë©E8‹!Mˆ&tènæ÷ßÿÿþü’~˜oýr¯PËÁé%PËLH£™PãÓh*S¦!Æ„ov˜a}×s Qu˜¯(=Ž¥äØÌÛÔ[I£+,·ÇyønÃ7Ä¿w>-žr>·ExÞñ†§ahBÌ„T±çsBiTÕ*ªï[Ö+B!¤ƒ™Vö~wìБõwÇjçÔnáäÜãîÌpD©ƒ»c‚µ;ÆLhÀäËr~u6¦Ëåä* ¸L¨ÌË„Z÷„Æ_aÅY iB4!˜áˆRMH°LHK&ô©Lǯ]Çkñdf­½N÷§b—ÅîåEÿÒ´°öC² 1:¦µÛòPŠ.pCšMf8¢ÔA,Ò’ -l`Ÿ …KÑ„æ60K7!»ËìeË‹èb6ð9¾2¼V‰˜ ÑÚÊ ¸]à,†4!šÌpD©ƒ&$X&¤%B2¡¢;yÌ„Ž™)µsz·ÇpCšMf8¢ÔA,b&Ô›P¿;VÌÏeBqwìã$Ñ„˜ 3SZ×ñ r{ g1¤ Ñ„`†#J4!Á2!fBìÝŠ£0Ç%!"Hcô*‹cÐéÇöb 0^ïìM¯úPó˜›sè±ãêî ¥9+ù0Ñ\$áÇ? %•U=FBz;)['¡(©J…î µKy)´Mh¸b°7A‰Ïd($$$Ħ;ri‡áEBázBI–,H´V†¤’L­“PºZ[M$D Ùjm8ôýüY¶õ2Rh›Ðh…”øL†BBBBlº#—v ^$œ'Tk­ó(+G6å_«cîd•.L£$Ç2uD*Ó2rõ ºÕÖå}uL;)ø>¾Zñ€ü{Bö®¦y¦'ôÐs€{ñë#…¶ íM(ôÛ%>“¡›îÈ¥BB† ç å€-uwS=#¡‹T.¬’âE†N¢©R¼ýš„²©6‘P)… ¡÷> ßž=^®¤Ë«mz˜„Z¤¼úEäGëa¤À6¡w»ŒöÝ…;’øL†BBBBlº#—v >$ÒÑÏH(îHq²NBX†”!ÁCª•-IHÝ¥?}‚ }í ßOGÒù:6Í“»ûŠvq ’øL†BBBBlº#—v .$tr$4†é 9SŠ1]¤ÀA3Êc̊㘣'ô:í”°ã°ž'd‘{¦ë&Jz !·MhØÑñy@¡’øL†BBBBlº#—v &$4" …é u…"Þ©ÿIBí"Zù*!²EðÑPêÿ$”L‹hª˜“ï³cÍéüÒ¶Ó1¯Ýp|ž'd?qè—„Þ<¡Ñ1Цoéáç‹ H|&C!!!¡?ìYLAÇ£ñöÅŸÔ˜¯÷­íl¤E­»­=(Õ”C h«U  Q¡ïF…ˆV­‚JÔxã‘x$Æ+(Öh0¨1&5†hxÐw¿™Ý…•RX°ÖÀgtvw¾ùèÌ|ûÛÿvQ1ÓQ)q RBÎØÿÑ é—,Y¢· ZMh&”<øÌŠAB‚ì3”<ÏðH3³G" °3MA$Ô«&¤7‰¾±ƒ4¶qׄ Jou·zÒóy“„üVDùÅ_2I{<†â ê{-BŠI†IvTH^–„ºÓÂîÛ)HŽ¸ú?¯ÍJ‰C)$5ŽòFrùÁ2b[Œþ‰ Ym˜„L¶A« Mã¥G‚Rä>ûÎæ oï‘„æt4Û "! šŠ‘ š`PUÓ‹P0*òÜ­UéNÙHQhÕ_¿QQ+átf³.f,•¿.RRZÒ%°T´©U†Øµ—$ ›¤ŸË±%z'Û³GšŽÄÊLOVÆÕG6BZ¿ugV› |Ø}:ÅqÓÎÆ/®4u#™Éd'1j.[à" D)qôÝâݸ4+¤9.åZ¢–¹¼?à©7»íR Ù`5›ôz½ ^¬ïŽõ™„¦ÎëbÓ»~czj‡ ç•$’Mˆ’¦ ©U Z–`ª 9›²…¡`(TðùÅÅ«ò‚2±Ëÿ²,Gb7àш?$6K™ÛΧš©F°a@+ÏzñŽë~q2ç!y;Ý`ƒwëf¹3+wxcÖ2¥kÍíà~,å_8ZÈòA©ènséÅÔ ¸\Q“—")ÉœQAãxS£1àã )ï"Ç7ˆÈkZò^#X‘*ƒ„øù'6&ºµÏŸnü ÑNÓ1©™+ü¨'-M©>êã¦på¦òÜ.'Ÿ>ZhT$Ä#¦;(aT†~‡ƒhDš·à(ȲC!Œ3Sº#»¯ÍÂÐi¢f ?~ÜÐåRr­îú\ =z  ÒÃëÑ6“ $¡uVí&ÔOšû-zቘI(~šåÖëðõ<¯ãp¸¹¹¹­•BBÄœàŸ@Q(Tî à-_qº,$DÌ$¤SÈ¢ˆ´¤žÀÎÊÇ#ü»-£{r´Ü»ŠÒŽ564¸< ¥O72ÈUb#nu^ö_IȲÿiKà /ôÃ*€„ðu..$„Ò.n/4B†)“¹7‘Ÿ¾2SŽ—·ÃÏ÷•p‘ë®A­M+z@oÓQ”"HÈñãÃû®5G¾~É+ áÞºÔËF“PþÙ ö%!µÅ ž"¿MHœ­Îàœ’¿ÐÃbj¼šÃBjNÊÁE§©UµgÜNZéeq–/Öˆµš¨6%îlØí°’‚5টOÚA„uˆ¢H¡æ²/i„«…~H6úH(ÿ±Û¹yAôçá*ÞAÍ9ñ;¤N‘¹iµ ÂÀ_|ÇŠ@€-¢æq'0xƒ{G ÍB q€Ãp $d Uˆ$Ë`vbðÙHð!$´>j !!¾ŠsŠ5$ù5‘6¸>yöÐÎ ·«f}ÖËíEÆêÝÁc'2w*•„º¾F¥RHˆ¡U*šû4a“F@BNšÅ›xˆI‰IöúÛɽTÏÁ»·óRhšÅsåJêur%åæ”N…*7…²50§EsäÂIE“£Àm'ðbìŽñKÝ枟 ël\I¨âq1ÎK‹r dQsYV?CvõYNØ5°œVL‘‚F½7›¦«=‘éÑÑ0Hx¨T¸=¯nš]‘”·2!!~M‹L&:tè¡·v)‚„´&«Õï÷[­z­nH’DB·«EÖ# Í"½ ÆÙ„IcÆ —ë{B•‚N˜jœô$jBÎb ?˜k­‚ò¼EOŽ-^gà%‚O]6e)­óRDZSçE˜„6´4@fL+mlx± ÌmT2rºMV.pÆ6/|æb`óª­$#!ý^âN+)kl¨Ë`1ëXöƒŸ'Ù¹»Í|#p×æCß®ûãæzÜ¿ˆ„æ8Ù¨öÈR½œ®u]}Êl9Öxt£ ¸=µ”í0ÇúÎ-°ÕË},<ɨ} ¿ ™RPó‚)äÆýdy®ãpªµ&Ò|=3ƒ*iæ•ÏÈ<‡ò[G k“âV¾nn~¾¡Î~îayBB‘p¸­ÜŽI¨z}€ÅÂïÔ}(ß–c:PnG”Ðÿ‘¤¼ªÃ©[˜s¤RIH/¢; !-¥úø½½ý÷;ž¤¿ÚÛÞ8û?ßã?¼g™ß¡òק®¯Þ÷›„2wíf6%͖Ù¯ð£$ta¹Ï…|cåë0ˆþ˜#‘p¤­èÿ !þ6¹áï8ðƒ( ÔYAó·I,W@"äoQ¸]Â&°hÙþ‡+–qv^Ûv $¢‡úú,;·ë¨‡A1ùO[®'£•O[p’0§xR@Ö‹„Û—î­ßàJÊÛyšˆù+’"aœ 0 ‘57' úÁ 4wŸ2H(Q£5ùý6½N§Ò„$’)'Oا7šÝyhêŒh"ÝÈj£‡‰lü”±cFs$¿ï a" ¸ ?‘LBØ;ט¶Ê0ŽG£Æè5~0f!Yœ—&ÆV85ÐŽB¡ã2n2hÆ]ŠÀV­´á2nŠT°ÇMÉF€Ù–w« d„aŒÙEݲ¸˜¨ñ‹ü?ï9§=PA«ž†> ðžÓç¼çå\žþÞÿû¼§Ë¼„_(˜ x/cvèdFÆ_ ö-A …+ðM<X`~=± HÈZÔgh9oQÚÂêàÔò7㎣‡æ"!r59ûÒã9È99ÕE}y ”QD-¥áTi8³`1¨§wÓçŸÏÔØÂsRÉ=µû@<ã% ­’PuQí_/’X'Ü,ÊF¦óÁa°¼me>Peï©Ü´þ¡µŽÃ±ªÊÑá·;F?M±tÚÍ-{g+Ž92ŒŸ5v$(ƒ‚»ðqÖu¤¹ûHR+­jì ‡ 8„îy5¼­¬‚:ùU —äN{Íq0OðÁzÕ¼½²gøFɤ›„Fy§}žM‘Ž™ÔöÛOò˜ šÃE„kP‘Y/_’Þ²"¡¾ÿqò—;ãz6.ÉFÇÞ¸ug|éÖõ}ø¹–üÃ÷Ë?ݹ¶M¨¢zjúàM‘„pÖ;o”$4d/QuÐT9ùùþ:ÛbÒ¾ïu$Îßð t C‘¡ë=…þ ºDX´-`P\Ù I§7ÆNïÊhàÛJ=ǽNtQ*³Ñé¡­SáûîÉ»'!R¦#²vèÞ7Ž!\Pž°&bxV­8¿Ø¨·õ¥WÌeo”„tµ ’kmÒweM©õ‰æɽeu-ý³DB'ìf%º¾Iˆ'‚PÒUªýšÐ†I‰BXÇÆÄvx’ÐÓϸìy¬zš¡Ðs;v¾ÈJž$´kÇNTæ={èÑûVÙãO¾œ¨¡³|4!ÝGs4ŸP¢Wl8cº5·`yÎ\Pð#^ ¡Vâ o=cZ¥=yöàŸ¢U e dÆ›ês(žYºëÓkŽÓo“Ö ªi÷Ï,\$Ä\ãÛ‹Þ ÏQQž¶f$„H*æ4ÖüLÒë؉[!ÈÉTë@&¹Kó„°ªÝMB-Z#í?Á1]]~®ØÂd#´87Á$:0í‹]P•óëóL…9kŽŽu]Jºyé뤛mIÝPðH…¹ZÖDoÎÅ˷箦Tàô-éxÊÎͶ”Š ¡ý%ópÀim|ûJSÄÐ×—¯8) a4¯º3e™÷)î¿|º+ºúQµ‹„–x§ŠõIÈÚ}nñ4©‰ ÒH“§*Ó‡ü$t$4ÁçuA÷‰äËX©×ý~gü÷;¤ýp ZÑÝËŸEªIÆá7Dbg½ù&OB×4Dr$lŽfvàÓWîyB.JÅw¯37 C­ T*{™»q[q¤z !ºÆ™›m:o-Ïi}dÏÜ­Džë¢ Ô§cƒônÔ¶ð-QÑîmGXXt´XÆ´m„;m”„TÊ áÙ ÝÓ§qasÂQ9I÷܈݀Õà2OÚ…ÛµWíGzòñ,ôÒž=ÚÁCQ¡®³Ž—‡&$}ú zM Ärî’1´±áYô4…þ@k¦™!‚¡:FBÁ^ Óz|ÆÎÖ׊±$Œ•«Uˆ%PyŽƒ„Ρ7–ÛsÜ¢'‚-!!æJiÖ…6"¡BÒ¡_Ì4¡<F¨‡B[/‘sËM[EBXÕ#!!¶ ÁRó‹-K¬R“è@FÔ…1FBTÁÜ›Ùk‡˜áç™#gUæ hªš¿K© µ–öDƒrä#‚¡Z„(“x"¡i ‰E¤¶'¦MІǦéÍ+¥¼O‰&1T=?DZFB1ºÀ;ý ±‹¦¬Â¥ eø5¡{AB ûãú5V¦•ôë ]Û ¥4ÑÕM"HB( $”:µøvs¶@BEâ5’äK$”™ BëdÒ'DÙ"h(äÓ T!‚ Zæ»(ÄEÐ{CQÜRžÅŽD4‰¿·Ý$Ä]$d@äbDD$dÚ8 ÑæQÜ•µ‹·ù±oLS˜ä{Œ„úÙ=-ó" }ùmÂW_¾¥—Ã]îׄPrÛ®õIˆÕ-ØÓ».â«‚r¬&!så Á‘Õcâ5!Ä.Z&wª…‘Ð`Vñš‚'¢j Û¿dîÃ7ÁE¯à(T`EGÕú…‹„bʵá–øµÃÈ«gÎ8ˆwš£¹Ò„ê8+%À².=õqs´@B­mï`Ǻy8pÜÈGcŽÙÃl‘û:G[cí¼8wŒVÓèØòHâë“]Y'ÊštªÈc¨ª’2R šdœ'ä$¤àÀB×—Pæ0d&hB㇥ß0J¦ØBžð™úŽ@B\­£y’'¡H.fè=óOBåUÂ5r˜;æ#ÓDB"d@‹-zwìL #!ë)6s”úMŒ„(uIy.¢oE“œæ*[#!l]nÔÓ¬V‰&Ô.,Š£c 2ŽZ¾IÂŒÍøOË*’;_Î8ÜÕŸ‘×UÅ4!î{ ‘άÇ]ë­Ñ±O"14&KòkB#!Ø Ïˆpóìýë’œvíô̘¦ïëà›óÙý<üäcŒ„¤6—¨Y© qaÈ£×0£ÌúÐ5¿‹>¹s†žžvìU³~ƒ$äáe¡:„MÈ{ß;F’Pìêw!ùÌä)D¢‘­ä ÕÐh”Èﱄh@i6D) éÚ£BÛËÃ+Iua;åʹc¡íaÛKÏ@_6…5Ì -OO%÷Ôî׈„´È" Og]ʾÖ-Òê[±7 UG…†t,AŸÏVª¬¼_IC½nÂp­]ó8tí=Ý<ùùуûb†íåH˜èOÉœo„ÌÃhfúv]„@Bï 5&]Œ2è'³™Q$]@Ê«!%ó€fØ^•Æ >lÛýæî¶uÉÈĬíŸÍœúyBÌ)b]ÒõŠ*ZÌxÇ´P‚Ä’¾«˜X?Ò˜Tä8(ß¹c>ABÉ“i ¡›?Ý7Lâ×ï·®G/!_h2 .KXØ" Å|jŸ‰Û Ú_Ò½÷FéCôÚÃB§+jí¯‘ƒ‡ì²&!Êéãh¶„[Ê‹àH€&„e"`‰Èè¸Q÷¦Þ­ !g0tB8óÝ ¡K†Ä+n÷^ ‹,ÎØ(Ÿº!Iˆ‘›$¡!»9d¸ÌˆÓuÁÑÑ‚Ùd !ÜÔå‹Hvw$e56ˆ2H#°÷H™’ÐvÑ„v¾»_(ìòš…âzO\±CXñœ{;… ž}>àùgQÍJ{Abn÷/Âù÷ï§÷Ä-žx{úOí—ãb ÷¬²âB.9¶âqº´råK$¡7ÚèAB³o)h`d3šå Y€BL yMR‘$¤öxÛäÌŒJàšÔž‡´œJŽL¥ÉV<$HÌɱ ÏüÑáù>4ß+ÃP5ƒ9X= /Ê:Z@‚Ðêç èO’0¡©Zœcá9úrj5ñ?èÝH¨ß´ãê"öÇEB½Øš³ŸiîX:ïÀWÀ§p©:4ˆ…áõt÷ûë¸!ê¡[çibšÕôv‡°Im?"e×%|}‡ÁϦ1«,Zw¡>û¨ 6ç¡­g]>zÛüºà£`«Ùì–/&”³®~MNëP>f 5däDLTu$Ô`^½H‰UПü$´b³ÆÆÙXXÖO¿b¤Láš;ˆýÝ>Oè,¨Y˜a˜”'žõ).‘º©é˘ˆT{Ä ”nÞÇNÉë1̧IÎ$„»°¡µÅÙ,P³Á Q#퇴óÑ% Æ“34šÝ‘H 2àÉc*HÏ©†h‘„ªO墋ƒîõ11¿•:{è½>M1âäà$^¥ù¢‡#’çí£tO#"¸ÍK$I&SÚ.šßø¹cêШCƒZ íÑ i¸LèiܽüÞ1ñÛW ¡:¯kBQìùÒ¾eŒ„6e©-È—–ù× øø·mÈ•„V™¼§\.G¡: #7-"FèP0±´,œËŒ·–8”Ôý±Ä£„ia ³±YbôÐ WnßLvjù9BùÎäEÈæ°Èåh{>Y‘L–$´]4!¿ ‰¦IŒ+-”ŒñP\˜FÊCÜš‡mVj ‘-½¦ áò¹/Ÿ×åÇn’„LçÐI”y0ôy’N¨”Ñ“W™¼§\.ÇͶ#F­VÛúÜú‹¬²ìŽö úP4Y’_Ú>&}žCÂâJ÷HHHÊCÞÓ„‚ÓZ™&TbÆS¦/iB\)þ•8Å66ùC_'!ÍÊiQAÿ{³ý$ôŸµ#à4¾íZ–õA–ÝѦ–ȵB¿&´mMúŒi‘ˆB4üx™'Ñô²@˜74!â ÊJsIÅà%M(Šþ•b›|‚¡¯“",6QãžFòÿ7ÛOB>ß? )äEB~Mhû˜ä{Ç`AÒç ©Ô‰Q±…ÿÀCqà¡{® -˜;`••sË^Ò„4ZXˆb;›|‚¡Ï“T¡XÑâ‚dÐl? ù|;ü$¤ ù5¡ícÿ¨ IgÑ3ÔzØ {~Ù=Ñ„–çAs ¹Ë˽“'¤,ôÁti¹F ŸiŠ|ƒ®Ÿ„ds9Ê¥~RÈ‹„üšÐö1©&$"Hˆ^¢©O }ÈÃJ‰‡¶® ‘¥1cEohBªAÂ7Ùƒ™ìCì›"ß ë'!Ù\Žri‡Ÿ„ò"!¿&´}l}Mh©Øü2­§ F…q[ЄðKTð –ÒÀž¯Í“}’}Sþfïü~‚8~PüE‹ØørñÍ>.±°9ë>\¼¤1ñÏð¥÷Òÿ?÷Ý)wT¯XëMù’4ã³c3N>Ž Ð-ºLBdÒ‘JLB‚ qO¨>zeO¨ø ¿—ý±žúçOCè%•r÷;€çðvFŠž–ÐBÔ\tŠ!““™t¤“ EBܪªô„ 6T¸¾ $”k‡çuÜG¯½®=úz„’XœKw:Э¨»èC&!&!2éH%&!A‹„¸'TUï •yèi“P‘‡Éßswöå Eg¡ÝZ‰Ú‹N1db"“ŽTâ`´Hˆ{BõÑ =¡²½ØÎË ªóvÍÝ8ùò²¾Ÿ„æ»5ƒ±bÈ$Ä$D&©ÄÁ$$h‘÷„ꣷõ„`®¢× ªñPü¯>–ñf¹\óOcÄŠ!““™t¤“ EB5é µÇiîMè÷½–ãÕ}–O1GQ†ãXÇÏo"¬Ã¢ØZ̊ɤoÈX’¾Au|ñå\-Zïj¿XšX1db"“ŽTâ`´H¨&=!_B–6Êü|<)ÍÃ[te)ßm)Ã?LÊÆñó{²{l÷û÷„I2Ë6¥üUÉÎÌyù~BX@tð†Œw³‹},£ÇtÖ{Á"U ™„˜„Ȥ#•8˜„-ªIOH“PGYFpvÚ;0§²G›„^è ­ªêÐâèì³2¥ ªß[Ñf©µ‰Èj"_‚ȇB·è2 ‘IG*q0 Z$T§žÐÔ€u-ß„>Yc“6 •{B'PtLú÷»uIjÑí¼Ë6Xkí¾é x‹î(ý#¢ècNC6ì—O!ýî©d#•8öÛÿ6ɾµúö„¤k’“P»ßñ\û™„Lß÷1n\cØÊÏ4|ßÆPÇè¸^ßT0å;Ú§ßLI¨íÃiß7Ó^¬†7hH¨Õ÷:JÊ&±3²]ÏÅѬN_›æÀ«AK7áÏ´|¿•ÔpR7Ž2·®Š«l¯{ÚzMù‚êõr¯=‰³*þö”y_Å”¾Uý/cäC¡ûõ“{BdÒ‘JÜܺ¸4 Vz š„ Ojy{20>Ý`°ÐÊ1¥¼ÒCã„nÀœ¨=ŸåUJBŽÔ²0r«G:úìä$4þ,¡ ™‡c‡Rih€„B}ôÈÆÔ©Ml]y£œ*.ÒV€¿ð` ¥RÏ„™Úo»v¬‚*>5Ò˜„JJ(o×lþ¸'®MD«TÕŠñaB¡[t™„Ȥ#•8˜„-ªOOÈ»¬(N¹Ö$dòª1Iéd$äi*2C9ò\Õãy&!9š„ ÙíÁn¾@BÜA{OBx1™â„VFB˜°Ûè„šj´ÚSuH ÃH;' ¥!øHN‡[L× éqøí¤2[O>ʹÞH…àbïØíŽÚ—ë ò,úd¾Â—Zå5D+õÔŽSu¿}È}mjE ¢¨VŒ Ý¢Ë$D&©ÄÁ$$h‘P}zBžp0¦24Ò_Ç®-Œ71–’нŒº025r ­OPh ÷ú%Ê× å$ÔhhÜ”„pn{[¦J5T‘|2 žžu§êã}åÄ«)á¯-á¶Ä1­H#Ú‹£ì[ Hxt±žP|ú³èÑ íÑvQ ‰ðûÛÃîÙÁ*¡W*ŠjÅø0¡Ð-ºLB¿Ø;›E( K!Š0ØaCÜéRÓÄÇÌb’ILOú1Ü°ò¡|Ì9· ºýi’vº—À1-‹[פ¼ùrŠR6Ó‘K -y‘P‹<¡\™|R‘øf8ž‡ dðFL"Á=ЄHCÉ,цR ÉH-jN‘‚ŠæeH‘Ç.Š„LÏðûÆ( 9‚ —ž{ÈI‘#¬ÒF ãí ]ÎÝõvWDÐéX€‰vÛ«š"ËÖOŠ¨Î/:[–EàNq­I…oÑíHˆÍtä’GGBK^$Ô"Oˆ("¦”$dËZhŠªõ0œ+%Ÿ#!¼% ª´„ÞQ\í‹ |¬T¥tNBS 5¤Ü5 …¹Ö‚>)ð„®Ú~h ªÕáp<î÷…Ö~<ž·½ž·Ó"p§¸VŒÆ¤Â·èv$Äf:rÉ£#¡%/j“'!)Ih„kh‚Ò¾2aæãRŸô„0J¬Hˆ.r«˜¦9{„6¾•Ä×$d£»&!),cydk…Óù5ɺT¦×ÌþK‡âå‰q¸S\+FcRá[t;b3¹äÑ‘Ð’ µÉ"œÉ Åj­Jh å¾°€8F«–„¦ôFtABö Ñf®¤b/C“Ì™;D]ÃK2U.=ëš„pP›Æœ(¬§Ã«¾Ìe=¡+=®¶;º¯úôQRÿoƼÜ)®£1©ð-º ±™Ž\òèHhÉ‹„Úä ÈLEEB³<ª[’à dÆè¢8DZ¿$êI(F“•Èü„p­1¯$ôàYíJ«öŽ…ˆ<ý±¯³IT?2.HHDŠÅ¼rÈÊMq´hË[šØ¦µmùSϦ%2·!žP¶Þü|O›uvÖùiûýåןçb»v8÷í6[eM(÷‰} bŸ ߢۑ›éÈ%Ž„–¼H¨UžÀÂéU$4Éó4p#MBfOHµ1ÌÈKùu$¤»<¼yBY¯$DÐBœT‘ç$B¯JaÙÏIHÝÈ膄ÄLu&O¨º™rUÂ9½š|©'´~Ó×zB¿7€ž÷›Ú˜Èg¥´~ÌšVîûÄ>¾E·#!6Ó‘K -y‘PK<¡”Nž´q”R Ð xŵ¤ª8Ršð‡¤Œmtu±ÿê •WŽ¥ÄÝbåQhÇpåK„T,5ôÐR®Ž…Q>7Á–ҧƊpŒVSC„%Ot ×Iw¢ÆX reˆ£H‚Ùxè—Ëný0†‡ëHDq_¹wl½+ŽZÅöñÚ0ú„'”Õ‚3~ß”ìÏ‹Ó@Çq)VD\Ñ«gf_¤­Ô’¤„jl¥ºÑÀ®VV½(«Ô…UDñ"ëÁË‚‚zô²€Þòx×þþÎ67í̲ÝvÒ¼Ðù^ÒN¦¯¯óãõ÷ ͹ƒ&!MBX–#–<4 \$4'žTÅ‚¼}A8!öXZ’ÿD&v(ÈD±F‰"/‰9CEžŸE•'ävÝ*—Ûm)ô„œRio*9øvJÎ…h4 i²±ä¡Iˆà"¡9ñ„f%NBJU<{ìðÑ#§wnœ—J'DË^Õ¤\fË»@•]'d[B±ø3MBèKúTð]MBh–#–<4 \$4ÏžP,ô$tò|¤3Ò¸J=¡š»@"T¼*Ö4$4ŠAA°‹Bš„ð— ô©¤Wt!! ikÊ}sJBÎ@ýGÓžPÊ:±¸XTòÔ9vaÒñC,lÚžPÍ5€pÁ’WUï Eøa?ìùAEÚ@Ö㹫˩‘”v¹¼ dŸ6„)ç(,$$Lcº™|ûyc WõÌGL{B¹T!:¤ï $ABê=!¦Àïõÿ2õCC˜%,GSÖh Û<Õñþøë RÒžÐüh(&w{Ãò¤‹W±¹7œé=Ì+Ÿïmi°Cìq>%…•µÚúª<-'›8~}xš­.&_Ù†Jº/ 96 ·"¡Û÷~ÿýÏ_´t]=üý÷=õ÷ðz“^¼É+oßÃƇ?õì½õèiI(¡Èšp%¼B­©KÈ?sµ¡á~ž–H¨#Ž®)ûH~áXƒâ:ûɼåùd.ÒXIÆ5ðʦn4T4G¬È­hQƀơ®ÁxÚÀZ9šYW³‰·¤£Ùžn³Ùôs7wLiüû/ɾ#H /nà› l¢AXÒ›c]Ê °BÙªËyg×)ô6 ‘«y¸9>ŒS¦I>œÞlât攘,èN¹GÚŒ†0 ¦AœšVæ¦J½”¨°†&ëÐÉèIßVš/%ê±·ˆGî„KS7ê"Ä—HHi=˜b ã–˜â˜Ól*€H%ýðÛ —tºœÐxÒ#Fr öùIïÃg‡ò:Û߯í<“UWœy,|$÷³Êã…²Z-¾Öã㬾ª¢±*ÊF%meµäÐ ‡Û;N„VgçÒWþÞC —èºâ}ÖÊ´Ý¢O ÊÛÊ¢l§ãöVEÅn7‡dµ•åuŠ^Ÿäí¨»µO5ù”ï¨ [ŠAs´JˆÍá ºkPQ¦j‰„ž˜„~þé—¾ßô¨Ø¸˜zkÛ{ïAÏí{?îÆÏMýÖŸ¿óàæ,4¡ÜÃçûÓîNPqÞɺ[" µg`†Aae”ÎþŸ}—Ç¢vŸ>ZyíÖ !]zŠ¡i8E[p)E€Ë½i8q+ ƒãRß@+.Q §Ì—Œ9¡É5­£†¤Sh¶I§ŒÐ’Ìh¸9Gⱃ6õ¬`kèÓ’,ÃcIèv4©¡ÆÎtt”'$®‚‰˜P…JƦ4ª¬Íñ‡Q—™’R¡0CrÅYú>»œ×)‚OßÊì Ï.:Öˆ .ΣE§ ®'!„8w$¡E¢ ymZ?ýì+<"Ì‘„ïy!¡ë^]1 ­ÌU$äzMHy¹²B]W~¸½¸ˆŸižPì8 (Dÿˆ„Ä{ Í å %µ&F˜$[ZºÄœÊÂ+$ 0PM ¸‡xæàA(. ‘+2uZ?L£ùE¢6ÐZbñP|^$!ÊèþpÔ$G9)NÉaÀ69ꬒò³€¡c×ãPð›ü>Ôu÷›«Qw«£¡à‘ óCv9}¼ ÷ÛïÖÅä"¡ãvUíž½Õiw«òÚâ2®ÁyBeïß(çÛ ÷ SxǤk|¶ØÏ}]± ãH›>Û ÂÓr¯\J2rH t¼dd–Æ¡±sµZQ°‚&õ&>U™>´DBOAB=¼Tì “±eª”ô<|@JÐÏ÷ =½\q±ÁÅ0¯HB”'TßRqW !Œkä,Ohd­¬0èêlKLžm˜ ÃÚlšÐHýh·Û‘Ð"Ñ„¦2//Ï©Iˆl2 yz{yLÉ@3ùx{>"¡3—# ùM{$¸‰‘|ž¥&Ä]ÆwúH}t‡=3ϲÙhd "š×{Lc– (¢ D_•çHhh–qˆA¤rýl– 1Wž’€B“­DBûHH¹%õǞ¨¡ umMDBp#L‘HˆõÁ GN9ù+ýŒe$´_"!2ˆó£DH5BIcd`8TOfÃ`#!M JP§4åö˜áª¯‡e^f@sèì÷1¹TšU‹lŽÑbr E¢Lfˆ„úíHbÖÁ«—vü¬Ÿ6Þø\ðÉعã6úR‰„@L°„tÁK ¡ªÉ$„K»i¸Ù¹’&”°¤ ¹‚„0†1¶L…ôò›DB7gABÙåtu“$’-‹$¤»Ð‘V‘„ijÿ.6-4ŠE§@ £cŒ„,Ýl¾õŒ„0`Ž6h”Hˆ)ÀìáFUfGBˆ‰*¡µ_ïêzDBâ*…+ɈˆHÈIÔ„Þy—åûH%â„H?šLBxq0Ê‚'¾q¢&„¾‹K5!DSDaIEÁY¦t"!ìÁa¾ä" íp3‰õÓ¿ öK$dùâuÈI“ß°JÙ×­•1åÈêRsLâ,”üAþÆï“ µHB¶ê„RV^ƒ‡ýÆ ˜ Ó{8Ú¥{˜°x|BŠËT¡\ô’MMB½!áÍTžÆ1ä!t}K” ìÅAZÊš 1úñö$Mˆ—aíÈE²Yä ‰Ÿ©¥" q…•} ñœ¦íhæm„rÕj9ž¸0Üœ„ˆc8Ê|¤ ™x*5AsÑc]lÜ8ŠšgvЄRÑؘ”#p•zv$„½¿5ªhV«ƒ&T#®¶bU¬$GÇzB:]œq&;7º.¨?¡´¾%ÁT/hBÜñâ "!øà´9ÚÜŽ}†¡1·$¡E¢ 9“žgºj~þƒ„Ö1ññùIÚ¡ÎŠä ˆ!ó[9 ùlf73z!ØÁ<&‘s² -gæŠRež§z¢¾d¾ËV"í´Ö¥šþ…¼¢˜°÷¨Áù}¨?WÑw±!m·¦½8¯±…Ò€b¯•Õ ØéþûE¼HB¥Hü9«ê­I ‰=~"ƒT?!&Ñv¸®8/2Dω>,ççhÅ®º[Œ„à“½oGäöhÁ‹Ÿ’„ •ã’áNî IK(5_Ïè»WÒ^œ¡ê(‹Jwï¹c €„¢ûô ¡»wôèûðòðÞj¬÷ôéá‚õ,Iˆ.ŸÕ ¡¸Œcá·Š,Õ1ùôjB¶/ËIȆL4vM;ÐVìÖ$$3—ØŽ —¨£E*.‰U§7Ç“Œ‹ÜÅVš/ªØÎ#7gî·@ÉÝ%ê :Ü‚™"lr'5\Êý›Mž}%Cë IH\Íi¶)„Jî@=ž˜„2g²8]—+ko·$$÷ ÅdYñUÉCêÓG+l!±Ž=ðÜ‘Ü”„«&äôü2È9+—-·lxiåÔ$„‡ˆ­g÷_¹ÌcÄ*›Ù d%¯e/‚l–{ÃÑ×s ZO[½Öú ynÆA½WnÀë¿Iˆåí…`/8eL¯b,µÁÛ/èUŠñÈk/"ù­òb²–K5!˜ãƒèù«ÓhB¸) lä=Íy6—艞¶kCŠ€Bó® ¡ œÈJý$D2 »m¦‰Ðí€m¸I:$1ã'K†cÃ×å›úF©>g$/lÇL.Çî`Ö~Ñ]…h.Y F°“Ur·ß25ØŠI)Œ„ŽŒø*1¾DBT ×°Ôw"áGÃb$—h¤Œj…±5HˆŸh ÝýZ\Ç>—,í4û Õjiæu¶ §¬ÿdßcðƒ&ƒE©•—áPqáÄ>9í†ãœï§¹c혀’¹Gô¡}…)BEõŒxÌÕàËyÑ ƒf¼P$\2ùˆp.óË  TÓ<$‚bÆ™ûÞOhA›5Ö#gcaIwhîD"”ÑÜ19~TO{?¡¯D¥9‚˜ˆ‹ÁN Ï—á)jùL‹/¬ÊJGíN¢IJìÁÅàÖ$DÓ°ºR ¼F$!6.…/0˜5VaIÇùV4/d*Ñ‚»Ð6ÙÄR¦[€„ð‚h|&L¥ÙžJa>(?‹“o>ˆþ@‰)iè¤Ñ1aUÕÔa:Âaê¨òIH(ŠŽÙFÞ¦D¯3ÙåçÇìh¢?PY>}æVF'µÈZGTž#Šà`r7%¡Åª ù^ö™&cZòÞöð€ì"Nñz<ÂŒð$â´i™‡?H(yÉ™„°u3m]K$´‘…! òDB¨Õp&!!š_ÐæË<ý‚Vy£t_0•K5!'òqésÇDê!bŠ[lÏ¢ܲå0¦’ÍàΊOdrÆÐæõ}ÐmSœ¼“ï>§dÎHÈ1yÎî¬8ÉÜûít—fù¤õÐlÙ²Åê@ný&»Ý»í|gE2·$¡Åª Aæ½ò¼çãHh•ŸÀ1/aq5ì• ÑÍ 1¨øe,!(Ì%Î$àZ/Í{aEÈgRž­ø;’ßKÌX˜uAp Øj2 ™K5!÷82âfýVHèŠ AZtÏ¢oú•t#þ¿H#iOb+žTóú>tŒÙé6$îsJ抄»ŽÉs;·<ój/‘мÕº/©>Òº[¿Én÷nOIB»% -VMh™çs¾A° Ó“³Œl${”3íë± ?Œ‰KB/8’–Ùïÿ$!qQ$! »\U£¢­^€šË‡áÓz”..MhZûßv† „d;ߌTLØÎw·=ûj/‘Ђ¯Çb#!÷ ¸¸5¡õ Á¼6®b<Ž„ÖùbÊ–Ä ŽØYKƒ]ä¶A<ÂF6Ž$Ä„%‰„Ö \å±*ÈÏcæ$$ŽªàÇlí£D¤…¦ mÅDzš?'…(ez‘iBÓ˜ûwAn_•¹ëto¿9a»¶¸Aµ—HhÁ×c‰„dîEB‹Iú‡½sÙuÂpåž:εIÕMÕ]» ‚2â*HlØ!ñ °bÃ[ð¼Œ݄r)p ˆ ™?ÒIšØã9>Žõé{‚€Ñ„Ž·2$¤2r ›­¸ß#!íÆÆ5r[Øû_¾%ÌÝ#ž@b›…ë t !S…6Ñú3¨hlÌž ˆYZÌBý”„b+·aÅ4ÅJ1VR¤µGõ=g’žrŠXè¥xBVü§ ö©ðt…„Ø G.y õ¼HhNžbtY§çXkµÈ_èt»»ð-ú¥ùYcÅj©‰Š)»~Úßl0¶Q‚»}¨xd¼Ú*°uÚ‹$?#¡Q´L»;}‹>ê( uÓ ²Zf°œœ'„züÑbxBgâ?±O…ï¤+$Äf8rÉCH¨çEBsò„œ˜(¨É‰„¶¥¹ˆò¾OB^f`¥n€töÊß,Þ!E}ºtà#X/Î^Ôf¦ 9ig®ûί“PnËÕÐùNÐÚœÇHÛtRžÐ½†^½zõȾhcvß» þSûTøNºBBl†#—<„„z^$4+OÈIò´ôÜ8öé¸,ŠÚ³,S‘cÄ^ŠcÏŠÅt?i™œ‡lh½´‘àµðT¿('ŒãÓGÛf횈¨°Lñú([0ˆMë±Ý™ÃQx1vmIßdQ”ÈF²é{qœLÈÂÍâÏi?»ïŽ]ÿ)ˆ}*|']!!6ÑKBB=/šƒ'äš/®‡× Z’W3-ý[Oè)Ï°ÙÝù !!öSûTøNºBBl†#—<„„z^$4O(Í4-Š¾¦[ ¯sMKÿÖ:ÞBä¹´Ý=ò»S&.Fý $$$Äe8rÉCH¨çEBsð„Ö´Ž9ºjÈÐû7&¦ë ‘)tq;2¼S&.Fý $$$Äe8rÉCH¨çEBsð„¼:/½ë†ŒóÚs¦¦é ‘Žwíc±o9Þ)£~â2¹ä!$Ôó"¡9xB"žÐ±¿õ&*Fý $$$Äe8rÉCH¨çEBsð„D?ô„n"!¡ÉˆQ? qŽ\òêy‘xBóÑw=¡'7•Ð4Ĩ„„„„¸ G.y õ¼HH…J žß8Ôª ?T^銨Ä`¥üáB˜ô!÷(ŠRµW´JR°ÔzØ_‡Â»Wñ„Ž7Ù„„¦"Fý $$$Äe8rÉCH¨çEB3ñ„¢ŒxœA¦!QTtÐ>“PÜ)ó?>kØzÖö)¨ i;TØé@«ÎåØZ›Æ3[ú›’ÚÚƒÑÆñÍ~t”‚½­»ig2o¨y5æ®m’‰xBŒ'éî!!!!.ÑKBB=/š‰'”t뢤—…%DB°]©Ö EÈ/ ÏŒ$ÔBGyV!nl³´L÷DL€Ò@O¬êM6¾vLi­ˆ„`­“ƒGª.È\"!Ȩl—«Ž®Z óRáY7Ñ-VÕÁ)UlQ+DÖ#‚f¹Ü/9"Û sUŽ£¡[ÔÅÖâ 1žn¤ÿ¹„„„„¸ G.y õ¼Hh&žœ–ãÔDBû`GÇdŸ«‘„<$#Ï„Tǵ>Pîx[Ø™*+óƒÊ5°øfí–*°/ª÷  Èrw[lUÑÕ“Œ´ Ð:_'DER§ Ðk̤&3ËÝÂÖÇÌJó9wŒÛ‹'Äw¸‘þç~â2¹ä!$Ôó"¡™xBN¤ªeo%³VJ;" ýÕŠirŒv©O‡¾ªVeDDB\’8)–"àQ%j úÛÓC¨V¢B R“ à¬!³,Œp¶¬–AiNœ“P["°l~Šl""¡€ŽI&›œÂoA‰'Äw¸‘þç~â2¹ä!$Ôó"¡™xB e_“Pb!朄ìê BŒz¨Sû%uZ‚™í/“Ðí.’PjÃCB¦GÚCö Õ”¼Uƒª)yBøÖï뮼µç?±O…ï¤+$Äf8rÉCH¨çEB3ñ„ØÇaT}MB!ÀᜄHn¼ÐPc¹®£Õ2m›¢ËÒê2 Ñ.[&¾@BT«Â@CB-ìO×õמÐâ³'TØðÁµ=!d»ƒðøšžÐÓ{uëÈðN™¸õƒ—áÈ%!¡ž ÍÃòìâžožŽ9Euæ yô©Ã¨ìaaÉÈ3Ÿ+LçÁ«¯H(&‚±….‘¹L¶V0ž}ÙDé$äuЄ20m¤cu}UOèþ›·ƒÞ<¼¦'t¼uï²îùÝ)£~â2¹ä!$Ôó"¡yxBîÚÐqÕ7$„¼±UÅFq³¶ˆ’œh¤…&qÜÔ‚Œ·Å2«Ó£©*ˆ6ºƒw°-Ê/HÈ],ƒ(Ïê‹$hÏñVt‚*íŠä„b6T`+ûðœ„L®Í¢ÐÍmñ|-V-0üõ<¡ÛÏÞ>{<èÙÛ·¯ç ‘%tY·ùÝ)£~â2¹ä!$Ôó"¡yxBÄ ’Í7$„ÈBÒ# ø eá ´]s" 5Ð’§Á¨]¡•ÿ‚„œ$#}‘„5¤Xú¦ì†Xô% ¹Õ¸6ÈoíáÁXHËëyB÷Ÿ?¾;~¸ûâùÃëyBß]$ôh8xÊïN™¸õƒ—áÈ%!¡ž ÍÃrœZ7ë4ªªÙ¡RtfU-ˆkÒl¿‹ãªò+¯Øµ.sâ]“¥~UÕt÷«áßUïšF§á;\5ÙÒ ª*¸óM½o9†IlU°Ø†¬òõ^ç1Ö²ééx¸à/³}¦ŠRU95PUÃH‡¦Ù™#/]cø‹…µö¯öÞ±ÛOžÝ9{«ãñÁóÇ×ó„î~I@ Ý:‰ÿÄ>¾“®›áÈ%™’ÐqпÿÕæé ‰~Å":[¼|¼ƒ$ô7<¡G¯>|üáõ»÷>ÂOBB¤#³Éð{çþÔFÅñÿƒˆ‹ »‰)A›„  Q2 hÔÐ Ãû¡ 8¼Z VQªÔI‡â8Ž}øl§cësÔßüž{³iH-„W»HŽÂî&çÞl÷Þ=ùÜï=w9|IìHBÂ]SÂi‡IèПÇ%¡÷^{–Ù+º‡þO;¢šPØBÔ„T$tšP¬¦Ï¹855õ÷ÔÌ )‹„ÄÇÔÚû¾Åß„jRGK!p¹ÕÄÇn:=ìëP‘b–vXĤ’þŸ$$,#8¦VÀi行1&ZÚ¿óÒ?¦¥ØnÖŠ‘‚(TÒ=·Q”¤Èïf¥œÇö§#A‡ûQmðͪ‹Åöà,øLÞùò5…’PX::š&š&„Ä!Ò‰°: ÅƸï|01õ÷ß !Ø;½q±Œ„!`#`so€Ñ» ²s$LöÅŽh{×J¹9’¹Gpá@Ñ€Üt¡ ÇG9T›ýÝ, ìrÈï.“"|-ZM]_´$nu*Á]†W¾}èìwÿ Ÿz:>N¶c/ÅÐKŠ ¡ÿúr¼÷:~÷íì^HHØtƒ‹Sé•´-JJM;YÌ;xÝËUA…‡»ËtŠ$}9A¸ß0i—ëj…{«5–ä>NtžÌÛqµhºûDgj?ÞtåÁMw@×û®¦úÉÇJ$¡°&ttl?5!ýü†÷Üq+î(¯×»z*dRÇØî€~ ýŠ-±PŸúA‘hKÈ—ÀC vl,:ünÈúo2–xÈ>%'Sï²gºÐì#!S_†Žy¸«Œ»­Y¥Ý“Þ½B5Ð'(†„è{nÏ$$w™ÔM]ÆžÔs®Ã¡_\èY­”ñ%÷Æ‹ñ-# †‹?¦~èßͼˆñç«Wîi„(ØW2vöxY³ÝKBè²Òa%!AØBgÙn4wä?îìÚ'ò¥ÝžŽ3®dîÙÀx¢G ™ˆ"DÿóÉ;­MGÖ’¨ßäbЇ‰Ÿ|ք¶3S°&Tq6ᩱ7: º¾XJÔJ!ÏŽ©ÛB0¨B´¹ &T;B1Åþ„E"ZžÉ—8 0ŸòC$Ä¢Tý#…fU$TiŽ¦=#$Éý˜«±®LSRšcnåÕq‚öùÆ?òcååX¼‰„jW 3Úã¢ñ²¬“pG¹(¯Œoø϶ÃBAþ‘käùMú%‹5Øúˆ„°aÁ²Ã —öûÈÞò16]omMBE+Ôeª¨Ëx—)j;Qx©±\wº)µw0û”RI(x[Å Ë–¼[ rGá["!íöCΧ[ÚŽ§ñV&Bƒ³oRAn~Á¯íñž1ü¶¢Iˆn]/ºÿp…‰[Ï7>•!í+ Õ^pP\z2_ ìÐ8”ƒ8ƒ4 ¡Z“º0Û¢ŽÀûBÛøÚÏŠ-'!þR€ qúêã×”GBaMèèØ~ç Õ½Õbèú¢‘7TR§€ƒmñƒy·úàò„A+›$±8¡wX#˜&TŠ"¡š’õiDF“sÙ³ç*L´?áÐqU'§¹„h[öxfòu@œhìÎ|>„Àðg{ÒŠ™\ëÓKY‘Þ ?‹NOî/ L$äùÉ3íˆv/“‹h‡4@BvNQ´ÿ'RKV~j%¬híYô½85kíêuáõ-¯Ãhf½„Y étwqî7{.7ëÄÏ6zÎqf~»ªÀØ™þt[·úžÒÌåz8@»éXì.«mK¯¦fÞðz/Wæv^ìY­–|>t5æÉm’Cïéé9—š¸]“ÔA—ñ‚ ~WÒñÖÎôjq'©TŠXFŠ‰P ]¿ùË/2HÿÇ/¿ÜžíÂñí+ôûêI¼~oþñílÑ·¯ìš„€¨Eç³?OjIÔwfWO]ìñÞ*7 g£WxW«ë6z˜@œû5ë#—.z{n•bбy€BQ|ßÿFàþÁÚì…„ŒtãfΫ]aw¸áâ)ð?4RœÉÂI‰ˆ3`&Û BC–nÛjIú9žaD#ݪŸ<¿Z™ÛvüÔ0ó‹’ÐŽˆDBÆK  Õ qú!zôM’PX::¶ŸšL&¡]ЬÄsƒº€=Ï‹:ñÛ³0%è»›¿*íš„l¥§H&!´z×`Ë NB§›Zò–'4r¢uM¶§”ž'ä'!SIa^ÿJ¡Æ$jU¤JÕ¿’Í4!(¼íPqkWNæÙiø‘ßúÈɉUåŽXØ@Åñ˜+! ’i`ãLØ  áÇî$ .üA‹ U$MëK ±ËØ)D¢Ù¯©ÕJñô¹*‰Yh¯9ºçÆËß¹|í5z¹> º#¡O¾}òè;ožR …5¡£cûª á[ 7Ï©<ÑrÆ´¦Ïí¾sWêÕ<Ø'+ŠÎVÌ(‰*µ: ±ÍHhÙ[ëC$‘Ðú ¶~b®%%ä;‰„ž &!Zx«¥’|Ö­õPhë‡[ s+4“Ð6cT´™„`&g©£$Ħä|§Æ ÃÓu`}6ÕB÷bÞ6×A?–¾âyëÓ•—Ë?c@óòÌ×é•ôª£=%#yüí5ðL„(“x"¡/’˜MðzŸ /Л—ßå>å1)qêKDBƒr™êíIˆØÙße*ÚÐþ’¦Â0#&“D¿~ö“Е=ЉfêÝ$É$„} ™0Óê#¡ÞG^Â[‡ˆ„r 2òøPhdFžy$F"DÐ]òéª?APÿEš,^ŤVjÛSžÅª„ßáwIˆÊ$”ÈňˆHÈ: Ѥ%æ·1Í}«^¢Éq,S˜ã£FBü.h¯ƒ#¡B¿¢SÂ]Ö„Ž¬…  a™L@r(þÚÆý4!ˆ„0­>‘Y¿ƒUô|õ¹0 SžC¬H#ܬ/eÙŸ³H²–ƒ˜ôâG Ÿ„ü$ð&!Æ7AyBB &D±+WÖ„A&! ³lá,h=[ÚÖNkO 6;}xÑ Qá-“Þõ\‚£`»ë0ÞÝôéçLz3©:Â8Ó„àÇ+ìøÅ#o·$úH¨µ%-‹SpPγ‘]Á3¦™&d ÈÊ}`hv® ñ2™ÍÒ¶$ô>@Hî2ôËLm…4%@RpžÐ! !ÆBW¯ß£ áèwÈE{Éâß©2 Q¶×'!)B?úFùuNB.¤Ö3Ïìä „8dÐýP²îñ”1ª8Ë+4nb$Dw#Róü$Äæ‘Ç[Jªì„0mOQ‡VµhBí¾Ã!r\ã¡c‡$4ÑX–D¥Ò }ÇR\«¯„LB0 ‰B¿=$2ºÖ—¬2 ÑÌÖò„Z!ü ¿Ç¡Vƒ3Ìм¥@Ûã55®K é] ùÕæµc1påyBy4hDªO å ‘» É>œ„([;Ç !)÷ì@FÿH ÕÄghzKs@B5˜‹ŠD / Ê˽KB8wä/lwº’ε̵õàkl¬±ªwi@ÙŽKXõÇiæâ­bÉGB§F›R[S2tïo¬:Ŗ»Ë(çƒjLwdÔt6VÅ¥˜ŸLB"÷eh© M}m½›u‘u™ìSöõ²¹¶Ì“ceºñ¦T—’׎ Â1AvãÇ«³æ9_ž~fçÌpÁNâIH?v­*¾ $”YìNºV_lzHzí)æñ¦* µž¿V—+Œ¾´¡FE“e'³pW²rUWOšè‡X‰‹Èy~MÈ  ±r&$sÕÞHC2$þ€„ò6‘?DШp’˜Â‹q–Z´;'¡Xšë³3׳ó¯ e[œÈBŠÃÄ-­}æÀ|p$„…’PX::¶½& xœî ßGb…Á²‘ù/= f'$¤î»#KBwl–„`vLëèäkÇåˆZ{ž-Cgð^«×¡S´ ‹Œ¢-³³v‹”š–K‹”xÁº$%“ÂÀÉV÷ÊZ¢ÑGBHÊP9²L d)k¢mOb°-Ù/Æ`™‚Ê…áÍÙµ<™„jFh ¢Ç«±êhÁ†ÇgØ÷'³-ªD; 4þÙ1~¨«Eœi%üégkÇÄîÕÜóqß½Ô’¦‡Þ‹%Ÿh¤IÜÎl-èÔµ²Iº#ƒF1CB,¬ …mÏvðšþÛlÂþÿÝ1"!Ùl1á¿ÀJÆIhG&DÑÔÙ¡¸‡ü¯m(•„‚LÙ—S)Ý‘ŸcŽé“y’LB4ʘv´!/§­Xgº µ¢Ž ““–•I2 ÙØ@ÅŠe4ÒáKc)Å\¥\íàç qS$ …5¡£c¡hBÁ"ÐüÝ1NB¿qj “ÐîHȾ •êp\‡ÿ )çÉŠA¦ìËù/{g”Ò@ EÑ=%L&à$“/A„B—ÓÅè þö§‹pEf‹­0¡5'枌—ÇK<\†²Ž¿Íñì¬;O =dÜ´+2!uBíé„æÿÊÈ„~ðo/ÃÚM(nboÎ^#pÅcË„þ,Gþ øÜú˜è!ã¦='¡>PP³0:¡/š¦·iŸ?:&Zà_Aø(wüë6žx}õø8)ëHÉ!2,R'ÔœNhŸ=(3M‡× ú„á£ÜïÒ߯l ¶L¨ú2!Ã2!uBíé„Âvw|Ï4»—¤Nhá£p/]™f)9dB¦¼ «N¨E Ð8ŽáÄ8êݱþ„½teB˜u¤ä ‚ yuB é„.‘ -ð¯ |î¥+¬#%‡LÈ0L¨S'Ôe;¡Ç‡kt¼“R9 9È„dB”u¤ä Œ 9uBmQ¶êíÃ:¾ç”ÊÍA&$¢¬#%‡L¨ôý0ççJÈŤN¨%ÊvB¦[W!ÛOJå€æ ’ QÖ‘’C&dŠ›PŠÎzïmˆIPKí„2½_m„ˆ'¥r@s É„(ëHÉ!*ý@ÓÜü‹0ê„šâVPñÃúi\@s É„(ëHÉ!*ý@RŠ!çrHPCÜ¢’ Õh2!™e)9dB¥軸MCŒqHÉzuB ±Ò ]GP¥€æ ’ QÖ‘’ãƒ3Hmˆ¡èFEÉ¢4¡‹î}_ÀwÈrˆÐ+r¡Æ˜0nÑ&.ßU^B>Ê!/¡¼„(ëHñ‘—Pé~ •"ïÃ0|ìKI&I• -µM:ÿžªYº½ÐÓ¸EÊAÄçèƒñ'e)>ªOm7÷¥´¤¢É„^^˜Ð?û)Õ©Û„žÆ(Û ŒÙ`Ûú Á×]ôu¤øøeÇKÛ-â¾”jÔ¢¼„^[É„"'‡YÇ• Íò'e)>ª?m LH3¡¥òzi%Š$LjZáQ*²Á㤬#ÅG ÙM[ÒdB©dBÀiÜ¢ä°Èß¡2¡EãT@Q|Ô½´mÅ„@G[2¡J&Iì³›?F©LÈ6F“²Ž5d'm1!=L·þ:K2¡@J&©9<ämŒP™ÐC¾â¤¬#ÇG ÙGÛVLèp¿ûërN&HÉ„" ‘ƒ}vóÇ(• ÙÆèqRÖ䣆ì¢m+&¤×ñúU:k÷v¹$ ¤dB‘ŠC•¯1BeBUžâ¤¬#ÍÇ"mÛ1¡iì~•²›NÉ„)™P$r°?Ñü1JeB¶1zœ”u$ùÐZÚ6dBÓXºž’ R2¡HÕ?‡µ<*ZËOœ”u$ùX‹ß¶Á\BÉ„â(™P$uÏÁþHóÇ(• ÙÆèqRÖ‘äC×…oÛŽ i2¡ö®Åm ßÉräÂWÃ6»ÍB„]˜ÀžA`\V¥R0*\M9•ˆi–À':D¾7#ÅŽ#%1IØ1ÒÓÚOšy<†åó7ãÝAþDNèa?ô}üùðüyœ4†®œÐò(íÔe9êTÇÜkŽ¥ïÛêLúÆ´«ñeù›BEºn³ÀÄqn\=ÎŽßíŒ?ã„&ÿà ÐÀ 2pBý”íCǯsýÓ˜ºrBí…éÞN]–£Nuü¯&+ÜádÙjJ÷ÿR„½ß&›Ï¯gž½i­IœÂ嵋6wqB–>þN(ÄÀ 2pB½¼ ú|ì5%¡+'t+ÑN]–£Nuüq“g,Ë2gMè†ÔEÓÄjÚh \㎒'Å”îsˆŒ ¬ºI§0Tñq¿l©¹ÉûíP°mne¶8Ás›kY]C&qJ¶-œÐD¤/£Vnµ€ú,ÒWj]¼ÏÁ­!~DBŸDº8¡þÊÀ õI>²¿ÿõOcêÊ µ¦{;uYŽ:ÕñÇMü8óÒßJtËåE{çÕ{£ðñJ?ÈVðœJMA’¼Óy湜'[åÌ!I>ï†3׈†ç7X Ù~ÄçE'¦ºpB‡S²ÿ%¢|O£ +“çQ»|bœ[–¿[ü !›ÿuà„ú+'Ô§ ¢ÏÇ^ã1ÒºrB?Ë#´S—å¨SÜdB58¡%0€ºÉ¶Ñ3 Ðåy£ ã²)›Š€8çj*‘K]Î4Æ–†tbž¬(˜3Ÿ1Ê®bǼ0™³ÆíJåJœ2ªŒò6XI(~ 0Ì¡É;ÅɳJz†dwÕ‹$4Ž“¾(5Í“:A©{öŸavNÞ£OGRòa¡P•znòv`4r8AÔ„ Ji‚×è3 ƒ˜Êñ!ÅíÓÀ õON¨Oòq}èX6ú§1uå„Ú Ó½º,G긣ÉrIaŒ5î7ß5 ¦¥ÑͦI#ùél»˜"8U˜P]Î4yÃøнm<³×’,ʧ3—üœlhû‹žzNeb1/åf\=cq 0 .ÕRH¼Ó3qMˆ„g˜wrB—–•¿<ß²Š—é´JÞ !+ÿÌ\žì#ÔnÙ{ôDHÈÊG/Ù —ûá3såxã{šCË/ŽTö΃Aþ4pBý“êÓÑçc¯ñi ]9¡6Ñ¿º,Gê¸§É PD ázËk½æ˜ˆiô…Í)€i@1)5“­¡:œ‚–5‚ò×3)sˆ,:•É:‚~‡–XJæ´Ìäq?“ÍÀ×GÕ1ÂðJÃ5€NcnŸ\ÒÍ AåNœì@ß°8Ù£°Ôk8¡$®ŽžZ»ÆCéñH®ÿªÐgqxaÜMDÏuˆ aÞIÙÆÔÓãx8'ÔC8¡>ɇõÁl» ©+'ÔZ˜öíÔe9êTÇ=MÃâ[ RäÁ'Y­·@8<ŠZo†y®©0R"ý``[¼X²ç’7šP€ð+æ‘瀦…/房$¸$†r5Ç(g:oŽÿ5•’bCŒæ)ŸI!Ö@#øY *¤›nõuÂÊb"œ ˜Ð¥9'ÄÜʳ"·p¬¼1’3˜Ãt¯vÇ‚¸¬^™UŒhþ Ð'¯C4Hˆ†‘&®¾Žˆ·ç„z('Ô§ ¢ÏÇ^Cÿ4†®œP»èÞN]–£Nu܉Lá‹!BøÂQºJ%Lá&Y­÷0$†Gbœ›CδU•lY‡ó¶áŠ$­sæ<ñ‹µôddÁ”%ŧðTÆ’r}ÿ ‹K3¯³5I¨RŠÉíò(tý·2B7'$a9±e[×HhÂ, žý=ˆ¹BBÜ·í𪷋72•ö£k$M/&$iB[pÅËÀ õON¨OòA}0Û/íÓ˜ºrB…iÞN]–£NuÜßd‚# Oð¢Ñ£=¬*UšàŽðxn 01ö·ßÙ’@§Ëùx"Çõá`D›b_¦Ê“acÌ„…èÏœ¢$¤2AŸJº¡“ñjJIpOó+è)ôž•gߎ¶´ÝeÒ˜a¶rBùx<¦Í­#n ´ä>ׯ ༀ®v á!OÓã“DBÅø70‘˜êHëð-jŸt<>àïc´ãmà„ú''Ô§ ¢ÏÇ^C÷4†®œP—èÝN]–£NuÜ×d“9©sÂ~ é÷FÓvÑ/ž$Ê'"{#˜ó¹6’Hè€;ÚêÓ2A@Ïòa´¨C|n –iOÃv0öJ?ʼ(¶ª×êŸ œPŸäCú`v]š§1uå„: Óºº,G긳É@VÉý AU¨ÑSáA'ùw­NéÀ¸ÚÊ]2•L©cYeRÌÉDÙp§FÀc~ E×\Á i„ØÀš2—UP@?£ð¼˜+µÅ˜EAcØgµ'¸ú›YÁhå„X ž,Œòçž^'‹¢pOHH{i(‚ݨ1òòÅH>„»[‚Ba輌šŸ(bþJÃ}7-*šH‡ïŽõPN¨ODŸ½†Þi ]9¡nѹº,G긳ÉÆŒ…àHèA³ðG-NØjš+íÌ›aAsŠÍ!¡Ù6ìd“ÑÎΕ3á„l)=X´¹x* ̳`e’el§…ü3Ûái£@I^¸B¶:YY°&BÃå]"\8¡áÑò­½3H¢è¦àg1 slr‹†¬½Ï2½È!B®#Å‚:"²KØÏT}A0Ž(}ÿ.hé5M{”LèT‡>˜ÈAí^FT&¤öÇIiG’Þå.\æjþ~ÕÃ÷#ªÛ`)×-m[+‹>åS2¡úhcçØkäeŒÊ„–Ä“ÒŽ$Ý![±Zý†|¹_ï…þ==?þ-7oæÈÖŠ•»Å‘SªöBŽ§ýú“L(åS2¡úpÚ=0„(Ø¿þcØ8)íHòѲŠÕÂxê]Êå×jÓÿrS7SÅTÖTßÄí 2y ˜’ ¥¼J&tšCoÌâ{»ŒQ™Ð²¨qRÚ‘äÃÆ™P SJájÒR±RªräV]º­ºöt¹ûs¼¦dB‘”L(’vÎA„!@ÁMúA㤴#ɇƘP™ÖÞu´wReJ»X™Ws÷¨ó3¡Ëëá[¡»—ë{2¡@J&iÌâ{ºŒQ™Ðš˜qRÚ‘äƘP5­ñQ”­3!-³&Ô`T>&¤ûëÛt¸®ïS2¡@J&I»æ ÂÐá7>T¿1dœ”v$ùÐú}šªKy˜µ‹iœ Õé:™ÙÃõr¸Þ&K&HÉ„"Yœc¯1—1*Z1NJ;’|ØjOûyi>&¤V1fB \µ0¶A¶dB”L(’vÌA„!¤o‡‹~cÀ8)íHò±5duìŽ5Æ„LãL¨«–é¦'L¦dB”L(Ò˜Å9öq£2!xqRÚ‘äckÈ=¯…‘˜lÍYù¦'”L(–’ EÒn9ˆƒ0ôíòÑo '¥I>¶†ÜóZˆÅ„|!²dB¡”L(Ò˜Å9öo£2!ŸhqRÚ‘äckÈ][ºÍ™4$¤dB¡”L(’vÊA$„!œo§“~c°8)íHò!ßÚóè”L‡„b0¡OÅ,«²SEªIEND®B`‚assets-wp-repo/icon-512x512.png000064400000017145147600337620012040 0ustar00‰PNG  IHDRæ$ÈõPLTEGpLHHÚUUÿ\EçbNëUUðYLòXNëUUéffÿ_OïÿUUæ__ßXMèUUîLLå7‹Õ.ŸÊ(ªÆ%«Å,£ÊFyØ"±Ã µÁ!¶Â!´Â$¯Ä(¨È!³Ã"³Â3—Î$®Å'¨Ç&ªÆ)¥É"±Ä+¢È"±Â$¬Æšv±ÖyÚŸtÔœ{sbÕn]ÔÊ–„Œr»°†Â‘ŠÇ–†Ñ›~Å“‰½ŽŽ¶ˆ”ÿ»Pÿ¸Uÿ¶Uÿ¸RÿªUÿ·Sÿ¶RÀŒÿ¹U•v´Í˜€ÿµUÿµWk¬¤r¬ z¡£7±¹S«±k ª…›¡A°µ!³Ã ´Á$±Ã!´Â•¦“D±²&´ÀÄ¢~%®ÄH±±@²´~«›2°½%µÁ$°Ä!´Â)¤É!¶Á)§È/Ì!µÁ ¶Á(¨Æ"³Â"´Âo·1´»iWÛ&­Å"µÂ/œÌ#µÀ±¤† ´Á#°Ä!¶Â¦ã§jó­_R°­Û¢t8²·ã¦léªg$³À½ ƒx«ž[®ªŸ¤Vœ»Jª¶<ª¾Õžz¯¤†G°³ø³X<±¸+µ¼á¤o$µÀe­¤Œ©•WOïYOëYPìXOìZOéYOëÖzXOìXOëߤqñ°aYOëYOëø²YWOëZOìXOëYOìXOìtaÔ¢|¨iÆm\ØaVäÏ™}r`ÓÌ™ƒÿ¶Uÿ¸UOËtRNS  7Sb(¸òÿãªpÕÆE›s~i¿^Æ”+kveS&7HN_LB<ZfS@ME3)W-&£ªjÊaZÃãñ±ó‡È÷¢ÌÕ¡¶ç©÷hýtQþùyØ×'ä“åPú‡ê¦ü]kÃtÝqTØt™»sS…{O‡¹N¿îWõ²˜  ÿ°0ð^Ààs7P€(@`Ðp¿/”¸DA<$-˜%xIDATxìÚWÝ DQeI·ýo6=ùIÕÀ=[˜¡É€þ¤_t,§4©Îfædf³ê”R– %U³ð„™jJ‚&-I‹…?@XÑ´ZQ“–Õn-šªàÒò¦þDaºeÁ¥iÞý%öyJ‚+Ijþb¦IÐ@ø=—yšýÍæ) Þb;v¿„ýدUÏ9üBb>« õŸÃ uZý²Ö© ž»óûÅ=ï,ÀV¼ e“‡C>voÆ~dy ÔÓ¼1ö°£¹„7(J–ûá4o–rTݽi»V¹rñÜx ™wÂ’` £ÿþËÎÝ;³Ÿrâ§ÄOˆŸ ?àá×÷£‹ù l‘Û1õëp:ˆªáC ­ò¶Ý‡³or®½©‡ë¨ä¿…,6[6œe˜†/TFµ¬þ ÖE†¤þ ”åÏ&0öò‡²üÙ†1ù/`üí«Œþ:Å`É?_¸ýq<ÃÿqJ·ŠÿéS^ýŸ`ÍÒ¡þ‰ÙoW˜ ×Ùÿ æÊñß.ÿ\N¿ NéÂá7Â!í«Åo†R¥quõ;`­Ò´e÷»`_¤aKø ÿ~ð—Ï?žƒäOxþ3àç~!@þ4€üiùÓò§äOÈŸ? ð‘ûÊn&„¡ü×\w›Ž˜–ý¯2϶Ž»IÉßèÜ#˜Cþk¬óñN…¸È¸”I®Ò…ˆúsíÿ~ ù:«xlq+¤ÃhQÛv~õ_¶£ÑW%v¹ÿc"U²S8Ö;œ3Ò¦‹¨j·žQý¿Í¤Ï•½X᜞*x€Õ\ KU¼GÀ~À”I«AOðçÄBz}¢®f®8'‘fU-þ4¤ZÖqø³ —ÇÎK“ÆÙþ7þÿ›'&û 2…Ž8#ÿ7¹ß8¯ðîË$:Õ¡²ß y4L­Ït"BøApƒóHÇb‡Ê6í–ýÏL•Ó nÕl £#y‚Žk;´YÂB :ÒKýDˆ%@L案öÌ=@`´Ç%FãÀ/¿£ÜJñí]3a‚ <þÂ7ض–ðÓP†ö‹½»ÉM¢8.…0CË ÔM„„ZúuÿV¬³B­þ~ï] ›_ÇöŒq Ý€xèášÏ“¥/ľÿ»pyZçm~wø%ðjÛºR´@¡gÀZ G­Àhè"Pô@‘Z £Ò`<l(š  P €&È‘™0~&© À2ˆ!°dÃóÁ”fþÈ#Ð0€h3 @@Hì €ìçjúêÌ÷ @@Ž@ÐrýÀ)  9ñG@ààGÁ0€^ýŒðð—cÂúð[À _¨Ð€Êà€% @_*VxÀ—€j½¨Pà_ªô "€`| ¨Ð#€ €ð%  OŒiÀƒ`B%`Hè@ÀM@€ð·çü—sƒ¼ß>Î " gö·kN[#ß2%•kñ h…ô ¨3à*o‹# è ¸ÊçâÜó•m31/­ó½8÷ܲm3¿4!yâ·€ëïFzÐå6pÈ?ägq$ä¼ çc 0€#ß4%x `ø»a“lÀ‚î\[þq2> @¸°7€­Ø£+€€5`' À€oKØ€´ ¶ƒwÂ~Ù9 ]…¡ ˆâËs<Š»;ÿÿMχÍÝn*3ñÁéIº2¹@áúä­B±Ät¾Œ²xpA@«P(TΖ!×Üû¨Öê5£ð¡&×Ù~J­d> ŠÛh …úšSá;»ŸbUò†÷€8°€R»Ù1q/"Š«l‚Àö‡“Ct¥Û¿ïÉUàÈ0Î?Óôcfä‰ `Ÿ¿'!.€}þ†À¡ `Ÿ¿¥‡@€èGùçŸy¹ÓFПDЪ\â(¿Â+6‚þ  #SÜÁù+tÙúƒ#Ъ]DyçU5ÿÞ¶ÍkIãõAPƒFÐ (ï༡å¿?ü+o^W‚ìFЀF¸]^ÿ/'[gm~/`ràèù¯²Åbcm@tú‘fek rló·7 rz”¿½@€Ú°ÍßÞ€úépccÊÍǯ½7¦ ~þö ˜ Œó†Ÿ¿½ (.À4äooÀÎ?䤖Ÿ¿½{6ä¥4?ÿÌ5å惈 Ðóüe±Ý  ·ùgÆ[Ÿ85 º;Ð~ÈË?3Uî?iD€ÉG3óÏ,ÓcôVà“DÍ?3å_¸]ðégÜü3cå-$€Lû9;ÿÌ’èôòúßึùSX¹D çÿ|A(î(ÿ}ÌudQi¹´ù? ¡¸£|â:²¨4‚\ÞüŸ†PÜQ¾oYTA.aþO¦awÒcÌ™ëÈ¢Òró2Í/îÌ•ç¬udQi¹ÔùŸ ù& -„ˆßðóg0Þj# €Ÿ?ÁP Y €Ÿ?Ù€&)×€$\€þïh;m…ºüü¿üJ3€vÂJ¨¸üçÿ‹µf넉0qøù‹èpNØ—è¥Pzþ<”&ÂÅ[Áüüi('\2.?–Ê çc!ãðó' Ð @áëâ2EÉüÝ€òÞF{;]â.}DŒ\1"¦¨„úGÑüÝ€Ò£´¾a/©ŽˆqÊËeó_tŠŽÒO¸O]•È… ¸LÑÎÑ (9J?ý+òˆ˜ÑÿM€Ò2E[<ÿE7¥ŸÀ_%2ºbDL5\ úßÀÚ ´.1l?¾û.!l?Ò¨Ø蔧C1À>‰.%‚Öùcö\N:Ø~þŒ…Á(L‡e€}þ—F¹8šöùøÞ@Bþ,ìó—Ú äÏ2À>©}u¬AþÀóü}w°}þØûü±Ñ@ép °Ï?]Rÿ~èiýŸoîëLlÅ 6‚2Þ*ïÿ€Ï!µÿs|0¡ÂV#Hyà Âþ'Ð*ïÿpA!¨ L=x¾%öJ~G7 ¼ÿCnÕ!¨ Ì‘7‚Êû?E¿£ðayÿ‡Û: Ame*¿ ètÿCœ`˜‰.ÈŸi€}þ‡ƒÀ>l€}þrƒÀ>l€}þ'ÝðâÌ”@“ü±öùŸÄÑGÎ(ùó °Ï_Ž¢¨öùcìó—* â@°Ï`Ÿ¿Ä€8¨öùcìó—ã9«Ô.¬ò|JÚ0G(´Â^L½á–}þü(ÔS O€YéÌûü©Ts:<¾#¥3K‰›ÿ÷ ±å4`ö†w ðlÓÀþOáüd0ÿçGÜÿ!7‚öB&7‚Άvp¶ipÿçŸü7»­iÒOøñ'ðè ³É ÑÐxµiŠú?M¾Ÿxò©GêMÚ3¤Ý¥÷öèÛÄ= j2<Ò7ÿÕ]øO`<«7ß|óÛÇ™ÿ¿î¤vý·"ã±Ðž Iðßéö¿Èxœë/ÿ¾Ñ럱 Nô€Œ_*ö) à?~ˆW¨ô2. ý âßëö¿È¸œ‹€~ÿRÿ˜p9‘(ýþ}£Ô?¦lT€ˆÎoPªô2>‡,€ÂTá%fIß»4á%•)$ý4 Õþ/2>g+€¼q~Mµ=pÑV~kò#ø÷V£p–ñ9•.è÷¨Ûyýµ@“Ðÿªw­Ø?²LnR­ó1!6›ãÚƒùÿQ©ö›íÂÝ! `ð€4Ûº”°oŒážÿƒw}Ÿÿq çÿÈ$‚~@þ‡Hù 2c ¿cØçÿ¸Ñÿ»ïc˜ÿ¡Ïÿ‘Oýˆü•O% úxBð‹nvúº=—ÆðÎÿÆæÝwÂLÜ$¿ÿK2ô3ò?d"\H@±–ÚÚUKãb!víÛ5Ū© {,ÌŒù€uþO*ûJdõ¢åÌåó?R‰ _‘ÿ!Aà^¸líWÔÅFã0U2ñ?ØêÁÕÜy‚1³ÎÿiW­}WÙ-˜ÊçÄA¿!ÿC&‚À•p˜ù™q_O¤¬ý×ýü­™ÿ“ö^þ/ å¹ÊväB´¬Û¶÷^mÜ´µÿjÛ½³ï½Â¸ ñ+\0Ë^©ÿ‹lWÎD  _¯¾7ÿ‘7º•óïÃÜO†¶W矿 NE  "ž®@{M.÷J¡ÝôÂè|DÊ\‰zàZ²Æ;LÿQéËt9ÿ=¾Ð,½"ÿ×Ùîœ @Aoå5 ÿØH,׿­'þ£8«Æ?ñ€àJ°–«Æå¶kÚ?ýIÒüwkÿhk‡à"ÿ½"ÿÄ€àB®ÌÿýÏ1¬ŸYÐ?È—fRªü_dûp/^Û/Îq!ñÔ—,€ÿ¨Mâ³´üƒûl®Ä  g.ÐlwJ@’ïfW{!Á¿žßàR¨° P$Í ¸HðYbÍß(õ™íÇͱV¥ß¤LXpíù„N½ú`Š[©°žÊXµ¼—.×¼ ߎŸ§xè¿Tæÿ6Û—;± ŽPÛF;T·.Éÿ$;ÓÁÏ0öÿ†•ÿùýfpG>tçÐBs*Vå¨Øþ»'Q¶ffõYùÐÿù×/_Lû®ú”ðÏÊÿtpƒ;ò‰ Ó¹üZHRoá5ñÓ@²_þ„ä«}Þÿõ÷æš¿yÕ§Åòò?–Ü‘O-fó?h!¹Ë4ófó°%râz‚ö~ÿ—-W½ÍË–àŸ™ÿAp´DÐýlþ-$WO¥ wsfK÷`§µ_7”suâò´ù•¦  xÑò/ê›ÿAp¬DÐÓ«ÙüZh.Å2%Ì£DÛÖ> õm­õî‰ 6ev>`•ÑFײ+Lé&8•K7t1C˜¿…¶›lÌÓtü\¸I±^/U{þ1Lb!V0ìf¿°ÿ«Vê;cà’uú_diÜKavˆÇb¢Nò;xÔ Õ?¦€‰ÜŠa¶.¢~KGÔ Á2ÅN;Î2æ›ýßf©œKòýSÌÜ´†S'CŠ! €(òγT®D ´XÌnr£Yaà.ÅNÐì\eÉ\>J„­ýzêñ ü’Їq^JØ ±IvÔû§×€ò+A=T=4…O9àE½z (¿,ŽW9¯œîLN [¥þÙcp’PÄ=”'¤ŒAF¿ú`8ù!ÀÓ“y’Î úýÓ€üfPç'Gž,w S¬ÿ÷°Oÿ)ÿü—£Bî‰øZä6ƒ?¡;òÀî¦Èq]‹>iç¿ÈBø¯ˆB‹èPÐ;wâT~“z·0æ€ ú$žÿrø@:"7Ôþ¨óÀ©¨f·0…Áeè“xþËÁ!è@ˆà0Ðoñ¦Ÿ©>~˜"À?ú$žÿrð@:"8äô!”~B¾ÏðÑ$Ìÿõ?Jÿg$K€øâí;ì"WŠý§=@g–Åc³g pɧ€Z­þ1u0^g,]| Gýíþ1w°µ—ÄõTžczò¨´ûÇpä! ÷¢¸œ»yÎÞy¤» Ã@˜iêrSu“tªä)H/·Î&íµùä‰I|œ%¶C{(à_¦A·ÿþ؉@µ·ª6¢ùIDÕéö?2××þ2nQ[ ƒðÕþóc@¤Hâ ¨æñ »Çådl(ž€š…Aôû”,Çtàäú`Äÿ3cGO“˜ÓM®ÿªjÄwÿ@.ôŽ@Ûí-© ƒè÷ßÑ»@ùŠÇsì´„¦ù0éü"h•þTlï ; ×÷ÿÜ·AL‡àA%à@ÅÁ‡åÇé|]ÿ»v> B`:ÿ#€Šÿ*VonÜ®“‡ãn> Ba:ÿ#€Jÿ*N6Ç-ƒ˜Áÿ ‚Ö˜ÿa‰ ~k–äàÿýÿÆF »*c"aýþÇ¥±®(/Ñîdìë©üÀ0ˆ~ÿÝôA?Pº&̃ê÷ßE¨ˆ…‹‡Atû_7JcÙÂ0ˆ~ÿñ8„†Aôû „†AÔøÏ@_Ôû „†Aôû „†A´û „€Aæh¬Ž€„ ¾--h9¦ivUwã·ùiDÐ3@û€ŠG3 ƒ`š¦ÝÕWü"è=¦}pEÿLà ˜¦ùðê#à”ÿ#‰z÷ Ñ>¸Â«Ôƒxf<}þ¬ü0"è ¦}æUtÓA˜½Ï€È'ø DÐW‚ÿ¹Q!•:aùêîÿq‘›…”&ê`mƒÑd…þ'©YLU0Èxºù”¯Ñ¼ ½2áÁ€„ŽàpyäcóCP×`°¿,òGÁ‘B­!íCT|è Dþ–@pA¦}ˆŠ»™‘ߎ,"¨È1íCTܯsÿðíå÷¦#Zå€í!*ÞÀ=Ž|Ó‘H%)`{ˆŠ?'`‘O( Ú(Ѷ‡‘ÏKÉ" ÐûOù|‹Gi œ€íð;òù©Nð_uCh[ÕµêÈÇZÿlï¾dEÁ(ÿ ‚¦uL|šü4«šL¶¬ÎyrØæäpm,*(4Xç{»¡ÿŽù´RÔ´‚*€HÖ Àú#X$ë`ý‘¬?€õG5èAÚ®ò„h¥ŸG¿&F£ ”vMÐѯI¨Ô8ª<A)W…ýštA­«Ê®”~mµŽ*O€FÐñª:BP„ï¤ßCÿ+«‰]a¨[ÿ^%‡_Êhu4ÐG­?jb¨¡*ê†ú'.pú/Õ ä´ &WpÜв´8¬P°§‚‘ídNP)ù¾MŽ¯¾îÖýŽ1QÖ„PÑ{79úMç´éwŒ ­-Ô(„œµû79λ.´{Lp«R9¡ryµ“ãºÛéÆ=&<Ó(B>»= ÉqamðöAà+÷[2-t?nºókºè,_StŒT0Jr:€Þ<_é¾qGñÉŒÈè Ã+À5}Õ8§Ùç‚P®è ½}º?~Up;ÃË»÷k-öýI?v¶ "ì’ßü-wÝÀ5mOÀ=-ðÑÏÃø©ž^w–5vËÚüíÃýÝ0Š–(°ü… š€úÏ}÷Å‹K\ûÓÄXgzÖ#"ŠYUàÖßáì=ýÓöœSÔL£NVcèXÖƒ ~kž(r+©N’\Ñã}ˆîþðôê?hŠ^U« ÞŽ¨TWSÞí2ÜÊ¿ùhp‹xèÞ1&&ÌõÀ·Ñ4‚ a&¾Ûe€ïèÖ͠ͽkLD¸V¼I#HóÞí¢ÇóÃgBwî1§v*ðn ¹šçÝ.ÛžûoÀ1&&L*ß>~ùFds½ÛexÃWÓ¿~°à—¶V W·4›n౧èXû ˆ@ÝÒŒ¶•ÀÉ"þòÛ¶=øíí ËY~+V-àÉ"þòÛ:ËF?¿pG‰j¥ZÙ’[:Àëá_$‹Iµ’ €þÚJD²¸V  9yÒYû§‹ç‰HšµJZ- yÓ¹ÙÀÉ@ü‡~ÀÆu¡ThN„Ì´2½ß!óáM­’Q7œxìvzÔ´•V3ðßÿÑ•·o;yœÓæj*ÏýŸ¼5Þ¾íäapzLVªI|öÊÌxü¶“‡ÁiâY®&ðÕÿù1ãþ¿íäqpjÇ‚BM7[ÿ租?¹%òûm'ƒÓV5u,çüAü?òŒÓK&¤z!R0JB€Å_–åµ ¢Î3F#^ Y( )*N5Ä.ÕìJ-˜¡TÀŠ -‹y¶z-ØŠ’Œ ! B!¥Œ,g,"—R*')e.DÆ'X06‚NÀ©ùÅKM tü꣦ƒFPªüwb þ‹;Q†ˆ‹;h€¿Xr–ƒIÌÿIEND®B`‚assets-wp-repo/banner-772x250.png000064400000036306147600337620012364 0ustar00‰PNG  IHDRú(Up$ýPLTE"\"]#]# ^# _# `$!a$!b%!c%"c%"d&"f&#g&#h'#h'$j($k($l(%l(%m)%n)&p*&q*&r+'s+'t,(v,(w-(x-)y.){.*|D?z³¥ªhe›0+€0+0,0,‚1,ƒ1-…2-†2.ˆ3.‰4/‹4/Œ50Ž5061‘71’72”82•83–83—93˜94™:4›:5œ;5ž<6¡=7£>8¦?9¨@9ª@:¬A;®B;°C<²D=µD>·E>¹F?»G@½HAÀIBÃJCÆKDÉLDËMEÍNFÏOGÒOGÓPHÕQIØRJÛSKÝTKßTLáUMâUMãVMäVNåWNçXOêXPëYPì/*~_\Œ~y™tí±ð¦˜ï/+$!cUPg\ã"] N99¥8$d*6PaelÕ¤˜ö¶Ÿ’‡y®›P;`UU`trzqdÁº”ÀYJÄsm¤®›•hf¨Ý¼]ÿßP÷¼ˆôÔWRF¼ñÙzåÆN‹Ž–ʹm”|ªV\¤Šc«ŒRžÀ™b;…u)ƒtÆPA£—’»šg[i>xb&xzSn¹z]¨oYÆØð»Ê䜛̶¸Ñ­«ÏŒ^]ÊÊãÅÃÒÜÉààÈÃäãíÿÿÿÐÏëÔâôûðÓÒÓÉûüýéïùñöûîâ£ÍÝòÝè÷òåÖª¦ÃÓÓà83w€|ªññõùÜÃãìø5.kSM}‹‰®C:>6ÖÖæGE–sy´€‰¾ñó´´±™©%'&887HII—¦¹¢±ÎYNâ@6YG±YMÔYI¹àà࣠£))'â‘Rÿ¢PÔ‰T6+^ã‘T·wVÅ€VñšQ|T[`D`nM_C5gU@mã’Výòé5@’õ¬mñ’;ï€:y_—XgSHÍ4N¥l]†Õn#±V6LXk‚&L~¿¼•|r=«¨pjƒ‰Ààß—ÎÑ7ž˜.’Šb²­RC®!eœ|–œâ,oËŸkmMŠ\91‚}¤iæh;œÁéÜ.DpÛ‚§e"ø\ AK,V†…À\æ@Gp+Æ#(ÁÆƶyAfŽÃÆ€/Ë[‚Ôü#Ä,÷‰`=W1à"8ÑÁYŸnQGði._ý#²½jK( ØP=‚i Ú:P–àQ Z RJ¿ÁÞùÖ ·è x‡ˆ@È 0‚4³h.ÁÝY)Ff“j³O¨ húOB† 3Hû§!8œ.‚ãn;îƇ@È‚Á s])Á9‚C!ë‹`MQ›«B`>b#d >V€@HF€€À‚„–àµ=k …0‚ís!ØEø`#ø2Áw ‚néÁB8×€OkƒEp ŽÀAÝ–ÀEð s ð¬ `A-Ág»Þ$¢JŒ€—àUcïs/Á7?Áˆ"8It 8KAþ9#ØŠŽa îæFð˜Êü€!p~b̶Àìù‚û«CpèK~]):‚cj´p‰`ôà/Aþwö.‚—Ô—À(`A 8ƒ³÷ý#À_øË2hq…tøDpa>€‡e@Ïó"xqªGuœê}Š¾FARïìa%e‡.å}N€‹ GOœêéSJéÝ9²Cå!H» !€?1¾[~{ë‰ÒöŒÝ×sœÂGÀí-|e‡zõì{Ð1âí-÷ge1èÞhçpt èÂGp1¬ÝU5Û€ºÐ! àA°Ù!Oö;´R¯Ðtæ8@'‚[”¨Ý—žÁ‹+ àâŠE{€î”Öº`†„SÕg‡#¸…‡àÖzph¸`xdt‚@ÞÍâBÀ:¥õÐä êV{+8uAÀº¾±IVA,8@gp€îÔÐôïˆg 8@güfﬖÂ0úVëîîî;>w+ã’'t‡±GÝØvá„.ÒÉßA¢·§þ`èÚ$X{ö ½A{+ÒIðäw‹ëᶷ $ˆavhcs«E‚ßH Înqåìèo/d³#%`d,­é Ðõ:] @—˜2ÈçG’\Ré í:ý ;„]b‰‘‹œŒ$lKs€@ýº)FP+©Í1è¾C‚ØI€]"C-$]v¨-õŸÇ^è ÛfÔFO hIg€ @§S‚GSÔ‚IêdIcl @§ÐÞR– MÝ0F=XRí­Xè¦(8YLu ÐÞŠm€n›QpØZü'tZÛ[êħ½•0h2í­ðt¹ü8Éš)P+)£F­,™ƒÉsÑ 7w!zqe2tç÷ö¹ˆNãÀ*ö¤TN‘$%Ô0§ã%Ú[±“`o_DCA*P* Ìè?U >ˆM@è.eE4pé€3DìC–!ÏŠäï¼R”`"Ú[ÐI ö«µ¼³¬Wk¦½àjƒ‡:¤b EKÎ .Ô0oÜx  ë'Áe.|ªÕjÓ^˜þ2k/÷Ex0ò(ÅŠEƒ< ÊܼùFI‚‰Ð!@'zHP·—y{™¡qH…¢JÑJ)_I J zý-Ó¬~ Š¡ùZÃt–ûÍ&÷–õ𯆘%‚P"®.ÁÍ>?'ø6=ã0 nŒ ƒ@Rô©ŒOÉìŒË"$€š!’†Åûm«}d@ÐÞW×EAÐ9žzŽ;Ë€àç¥BÐö¾±ê>àÌÁ7EÀ!– â =ŸÈP2ÐeE©'Ø°oÚvÌ‹á*Ÿ½uálçhÜ¡=úW=?å‹ U‰ö 6?¬>)}e§•D„„ \2„íB|ÚhS`HËq TÆxÐDV‚²QÝC0²‡,uö/RÙÿ•àÍÅâÜè*AP7²CË àÛ•JÝG& ‚zèCøi±Ï.½P8ÐJ <Iµšd—„Àq}ßµúÖQª µéqÏ?^gB¤> _I²Wf@Ëçø½‘+Ø«Š ‚Zʲ²M*7$ÝÔÂO»›ÔÝ. êìÐÖ ÖÆ8ö†z±‚€=ˆ[ºÏ ø+°ÇRk÷oecÐì+ >y„wª `—×MAN½@vÙ#?õÝÐrOþ0(Ó>!0†¦óf.½âˆ¾ä3tU¼”ú°òÓ!® A¥ºþõee/‚V`iØTAõjµD©‚ ñ %lB0yº»öÂh#1” ‚ž€RÔ#ºþÝZQ—è^„€jH•%H´Vó!S¤£i¿h‚IIB`Ó9çN\ ¡5d4A5cÊÕèJÄú·%è·F7ö5lzü¸?zž+!x-².¯— 9ìY;—8Ãÿx0à ‡CBðyu! /Vˆ¸;Ù:‚– ܈ j vª}ÇÊÆÝ»Œáæ¦*mm©’†`Û„€/p¥!pyo ø35C$xôèS3†ÍO¦'xbn›ØÙQÛ&Ó¡åBÐ>Þ—9,B|ît¼|æü°L6}S#«/ü°ìæ¬ÇY¬;c­¯—gÿm~ÿÜFÙwö›‚ÍMé‹·¶² tÛßosü}]Iîݿ̉+ÏÏŸ¸Bè ýºòédÿÜßK›XBvè윇$GÇHr‘ DDˆ’ArŸ"àrƒ(–€ À¿ –çø¶CJ•‹Ž¨ a±¢C""/Á“y„óR„>k/— jÅ8£ Óh‚œXb¼Ýž³ÿówÚó´½·ú$AyïÐ í»P:€5)¶¤HÑžÐK3Øôß>í{ï­3–`ÑA¬u 6a« â$hÍ”r¼÷|Û¡H0v7bË´1ʨöYyì%p4“À7 »Ë“eX 'NÄÂCe ‡.+ëNcÒ\/o@×\‚Š3Ƴñ5ÌÍ+•0Ç F x˜}VŽG€»It¼Õ# |ºc$Ç{¢Ž—ÊT –a‘•·¤I 8ê¿Õt߀ÎKp¬ΊEíÁ±Ž5¸ÈÊCVÂiŠã4¿ñ¼ë%8Q‚n`úòàÊ—¹º «-\VÆ(¿´2’¬vße4bQ)Á…?r÷}‘ÀKðå­J°¨®cê˜ ®eå²20@ 8P6Å–$ION‚gýä¶=þÇþƒ»“¡^/Á‡¯¡uU¾ SꘪXíBIÀp¨¡2Hã8@ a•ß?{à$ø÷?7ÚË÷ü?öTIðA; >郘Vœ 'ÓêÀy{[HSÀpÂEJˆƒ!”¨dôüÆKeN‚û÷k7‘>ô3Á]Hð˹HP9¢Å¢“P¢0+mÁtl±E€¤áq‚r0~äƒqo$øâL%ˆ¦]5›ˆÐ=ì hœ_ '+£¯-&^‚7L‚¯»”`Þ\¼¿Úr%æ º¢—°Ùþ®ˆHY*Qzs#ˆ±…c 0l:J”Mw¥Q 8 êx ~íJ‚útD5¿³Ëu|nŒZ’Œ^P|!LD,TB²V§Ê†«b e8µ©+Òô0+“—àuàóvÔ÷Þª‹ Š`|¸•š.ôÑšy¾Ü°&ÒÌKÉÈ®‰HÄ¡5o8³Âby¿IÏÁ© x†û§ŒËÊ©c|ƒ?8 Üú@ù^ý /¼}ƒ÷îT‚ÏH‚ïj$¨åpinðš$#žÓÅ¢+Yò’¶ÈzC›µI&KÒ——Rš "œŠWq°›†¬Ä?ÖIëÕ^c Þ«—àýc%ø¨çŒw4› ŠÑ–ñ\²Lˆ2Ù qa»¯|¬áL2ÙIm/YY‚ ND'#@ïK#~ž•º¨éNZ'¨~p ›H½õ§+ïH‚ UU–CÑfþÒL0¿’¥ºp¬y q• œH<:ØmvkËET©\'hŸ ú Á;oŽ_5–àÛ¦̨‚YE0/7̆ _¾È6#kÜ_‰˜2ë2Aþ0Ëlþfû™à•ÝF±H Úc/AóÓ•}à›æÔSªä#jÆe>W\¿VÖ!&þŸ½3jnâÊò¸±œÄرÁ@°‹š8³[•­}ÚÙ§­Ú¯°;o»„ä!åÔÖÔo vŠPÅK òBѶݦͅ‰¡†Ñ ÌKŠÍÉ=·¥¾jµ…À†Ý|Š=÷ÜÛ¢-]ËQ£†è_ãî–ú¶šTé7çœ{úþ¥@n5 ÔXCØÀC,ÛÍ N³ 0X‚l”F!€\\Ŀξ Ͳº—쓱¨3Ícàý}Çö©’à̳ y‡¨‚€±X!`ì9‡à›‰«õApºáÇ&2+V öý×^¤=›xàv™!àÍÓ.Ï<Ö\ejC°+¡0è2C€5Aœ žköIJ2:°œŽ×Œ7Ú,Û{³, AÚ‘w;;tª 0GÈwÁKjD ,‚ Àû‹³ gH@lüæÓÖ?•â¬ÇÍ ü,D@~2Aàw_Bá'3GB †à—_sð²½}E¼ !¶AÑžVÐmƒ dóBxÁàà’b6;49úM›ð ^DpÞRB!xóÛ1ÒÕ¤C@ œÁ—o´Y¶+öfFBÒBØyàn!X'g–Ål‚ a1°Šò"ÛfAAäñM'„ÀBw· éŠsüC°]y[¤@~²„ Ü•‘À€ à¥pBÌÂëz‹Àq_Œ@@ÿb ˆWåEÐ¯Ç déj>¸$„= <;“²)+`ÖÏYVÎ&è½5¦4‘|”0$ÄbÀm–튽YÆ@‹uzàwv:àD#‹›<&C.A€#dQìÈt¨S¿±¾Ë•‘ ½~=íä1-â”Ù€$ €—öôøàÉHàÊt(à"MéžÁ-u€CÞÛëõFæE °6À߸1Ûßïå0ä¼¼ú•W‚ì þà¾>4@noÚ 0‹éP6¡toû †H°@ýãs ±…„?ÆRP³ì)ׂÊð¢à ‚9ª&LnÁ+×ÀtMàÊlæ1ÝyáÀ!ŠòË_€´ =ô ˜PMÀ  jº&ðäA/£œ¨”"`EÀžúûAi ª$9Y€79, ‚èšÀ‘sk;ôö˜Ô;M® ʼe ’T.Ÿ®*tmù5 ðÀ)Zä@Æ"ïy)á0¯|M/J @eO@º_ðÖ„`³ü¯™M&Ø!˜øvìÛýõÐ5Á¹ðy…[Òû7ÕÛÁZ÷fBɆò¾ð|£!áI@8—("éfA<„ÀÇÙ!ªÒ!_¥ADC‚nÆE^ÏyL8©<§'š ,‚À2¤C‚<¤ûúÒ}F²F°úóBz€Ò¡Áh:B`…éÙ ÃÃ~@$ó·µ è‡ lóÎýÛ¿«ôûÆw·Õ—üf´G¬ôéM<÷aù|ÃZh¸\>›(Ê…± Üb !p·,Á%áˆ2Y `빎Ý!@QÏ:iÚôD c¦§H9øAO@…1D ã‚@0+¾KØx®Øˆœc(Œ5.Œ³ê¿fx JϨíP㜠׸ÿæ74óáûÿ±/“ùËßݼ}Ÿºñþ¾<’$ìû6#%Ÿ+Bd,øZ®,xÿ»ßÊ!_göÞ¼y²ÎÔOÎ×åÉž(ÊS¤”à—Ó¡ð°0–R#"}<É‹²&àxI‚4hÒÀS©Xª':Eª!3O‘–!èKs`2`Š8˜9X㘜eœ"UlZâjŠ”þk²ÃYnÿl!¸yòö øM—_ò½¸là6}ÝOî-¯#SO˜–ª>yÏÒ‹¯?½‰?¦Rg¹ü{üÅã¥Î×ödoyŸ òüþ¡äíLͲŽzŸŸ[ ÐZ¿Ê²TÅ“Ô½}O´°l°ï­Í›6È^ÙÈ0þbÙÏ‚32ó¹!WϨÕ¸¥'¦éH¾¥#Ax6\Y€ûðŇ7n~Zojtçú$ézãuqü}‚ø×Ù[\¸AÛ€.dC@kŒo ¾¦HP n>En‡‘àë*>Íüeo¦nݹ„ 웫ߓÝÔ'x+æ>A,``…¶]R 8S†€2Û´ÁµÃ71ÝÏèex„ÿ£Ê!Õ5žU+ èlX |w²‘BùüÕåååù•3¨çë«‹Ã>Aã%A h{o% 5Gz~rÏÞÌÓ×ï–%º\Vµòùëõµ´©&h mÚÐs|Œ‰É¥L¥.âîäø 8.!8^nH\ÇZyòãc¡Ž8Ú† m@?Z²H½žY©?qOÜ»wネ ƒ9 ÁµòË[oMNž*ÿãO\¾|² AÛ€îiA KÔÏ2+uð~Yˆ ‚y ÁÕòËkßÿý~ý êéÓsG/_¾z±6ÿ’é½Õ6 k‚“Á¡Š\èþcÝÔWáËÃÁñòÉý—Q>uüw§V‡àŸÛô¶ èšÁÂkÏžis PŒ%%:E,†/¿@°p}„à›Ãû'®žZµYFÄÞ,K¾÷VÛ€® ‘`úáÇÌ‘@ëR&aÎs1ÁÙB¸¬tõè‰ÕšeÿƒÄÛ,kÐýl xX Á»+ 8 –#óCó®kHö¯Ö,û§ØšeÉ7 k{oÅÁÑ &'ïÞ»ÿÄÅñ™ÓõhQ…‚9zqKB°xLêãIÔ˜ ‡¯ÉG(ÎÆX´ èÚœ|žY¡Ï&Qâþ ‰úJƒú=o-“Ó ‚@NJ}D sªÜH +0ú3CÀ7îZ0ø©0äêJ!°Á1@ä0+Û$º ³À—4%ݺul„om€ »wƒTi&29ƒ]3!øÜÁ¥IÔÁ* ê„ Î5•sËJ‹e~ÐèlHapÜ´èþ©AÀPN0ÖÕYô† §òPèí-C8¤« èO#Lo³0ù†·n™BÀai5D©TXŠß€.>0TFD[R«S×4Ç%ßKÍiˆh)r[¯8— +‰Ø pÀêíµ`†tˆƒƒË l( M€J[,Ðà­·nµ(m_ ‚¦CØ-ƒàM€kTXßmp–èܱ†ò!EA°X†àÁåP‹*j(`õC€Š‚´\SÃûŠ¯‚`cò´¨&½±9”øî)¶/AiëÖR f¶ÍÀlMÞ…RË 8Ö"‘àîÝ{ ȸ~¿>)Xœ;öC9 '‡t,˜0ý,sü}‚h$Xi´¢þ° ‚p9™^ü%(ªHh×-m‰…ß|‡ +„O –Æ3^J¸ü2Þâà¡å ]Š¤Õò4Z^†#Zk/d9àÈ’€Î o–ÖmØ`ƒ¿QK½…@Î9u³Áýs²–àE„€¬¹h¡½#6ggåâ³áµø¬œyB׀غUÞz›ƒ%Á…YÞÒk¯•`ª4³/*9eF|-vîœáÀg«%k|œv „à£ÊÇçT( îà6Ôd¦™úd9ÔáùE ó*ÓÙé°éé‰øûÑš€»U>pËbÌÕþXk³\ A躥-±º»‹ä™BÜ&¤]E*ÏÂ=B@#ìô¥/ÊõŶ@Â;¤}(2¯O®/Ö‹›³Y½Y-¯$…o!òf9y³Y„@îsò d@Ys!Bä²xÚ|˜nV*]Pu± ¥ <;äÁ’3%oÛ,L] áb !¥© f­’м‹ ¼ B”vÎÐf^ŸÁÓ³bTï’¡O€=[ î]Ï ±=D¡«€ 8¬ ü@G‚'&¾2]ø”ú HvG%i`HyÌ]·. ŽÒˆš‘tH»n1pÑ¿û`8à!<•bÐ ã”Y„€÷ôr‘q—{‘œ&„ï„Ñ‚À‚½ë㢯ÏC^vèß°aƒ^|«¿ßBøÀ@‚Árƒ¸ ¤óV††¼Fœ'#Av3Ž²Ã^);2²1ÀK%qaË쌂À¶Y¥m\lwäüÐx2¼¶_íؽƒKHâ F‚+;wz%̆JÞëL_ÇÝo\yã—‰ƒ`Ú´ô …+ÎÄý{Þ‹‡‚SW—£ ûeø,•Ä—/ÏgNé¡-¬ ¬ªtˆ @¤@‰©j€U@ºn1À2 © €IR):°…°™„€á£C¾ôEå9„„w"|°mÞ[Ð|N0Y€çÁ‘tȃ~TNÈtHB€5A@ ì ¤|‡r€5ÁÈð(•$ÌÌÀlAðÝzÛŒ¼õv¶£J!À’ +f‡ìÑw, @éõQ|vt\íw\‰‚ß?”’ß5C]ðÒpýî}¡à`³Ÿ§^ÉÁâü<æC{L\¾üż™€Æ€KA XQÊ7C@®[uAà€]tDº4 Ax§^’`Ü–p ” ã*«!ÐÖ\ OB€ˆ’º•Å Aàâ‚ŠÛD‰ÛÛFå­Í„5ÁÎÁgPX\q<W»DA!V>FzâЃ©iÒÔyfÅSwš»´Æ ‰wö\7Œmåé Ë-iE‚ ¾4#í²Œé0ÜD!`” A ' Èv%šá†@wŒ=‰ð«Ó¡Èi˜Õ€`–ÐsE;Ðéthd|œ ¨$Àu ;ìË[Ë&LEÒ!„`·BÀ˳C(‚ïð‹_,!£ãã£`]Á(€»X øÕ“B0U ÑM]¼t?¶²`qÙ¨/Låp ›eË-ús“ î…mñ°0 –/!à•‘ @e¯«2èKUaÌ‚@ßIAà¤eÓ úúª ã åfYøV ¤5×,ø ]¨›©Â¸%ü‚†ÀXÚ†e1FHaŒ‘`” c¨‚`TȘzÝ6îgô®éüÝOࣇRÓŠ‚óVkzÏý¨2Oƒ‚Ã_­Á¯ŸÞcQË-ú+@^v :Ò+t­KÓ ÃDj^QD¦HS5TÔêÒè)ÝIG¡À‚pŠ´7œ"Ý°1|l"œ"­tÞÊY:Œ¨)R,Š=€RÚæ” äø)ìðe»ø5‡ZezŠTA°[M‘V@€úGŽ^¿‚ƒKŽÞÅj;Ô8§*=úüó¦õ¿÷ãʇhŽQW¿j=¡BË-ƒ:t³l]\kjÒ˜ù¯{MMõósƒ5m‡†ªžŸ{uDiËõôÜ«²KV~€n;=@·ýñ“Ô;Â^ÙîÝ;v¼[õ g‡ÆÇU¯ì—oP³ì¯ÿ*QP>T[…x—Ìn”j–ý:†fYò–§!oÙüçÐ{+Qœ¯€ q.¸¼xÔHAØ&‹³Y–üuöðÒmº˜!È]‚û+%bXkyÍDÉu%Ú,{+îfYl$΀® AæP‹!@}yÀ@Á|íšà­†Õ†àgá½õ÷C€:1] ‚ÿ{KŽçM Q‚¶÷ÖÓŠ¨óº=öè‘™‚Ø=XN-t¢ A‚¸#AŸ×Ž÷.5ú£eõÊXÓ™6mºø#AT'j¤D÷Ö·¢àÌ“üj¥q¢ôÖ1ZN’ê½Õ6 ‹!dÌüøãþSÍ]ZV×Ô¹3Æ>Á[ñ÷ ’o;Ô6 ‹!d¦W£uªÎkWõÉSŸà­øûm’ï½G$07Kü¶N?×–ÍùéË„ö ÚÞ[I„ ÁH`¨[ÍMƒ³Ó‚CÑg¾¬ÐÙŸÁâr|è\bj‚6É÷Þj,œ1œ9n„àè ÁTíýRY®4”:y:¸M€Xƒ5½·ä㣸¬’Á0Ø Ä C²Ï.š Œ§Ì|±&¨…&GÔ‰AÀØS‚À/>†€13~±~"ärƒ~ÑüèPLÄè¸Ò„H`.a§W‡àA¿Bßdçq@`°bðÎÍ0X ‚5!à|0 ‡ õ‘ÀÁþ) Áѧ $‚†zeÍ‚õÄô @5‚íÏK$0Ïè¿m‚`âG©¹Úz.Ó|~h! Ô¦“œ°ÔJ{펅kË8pAö¼tƒ"¾™îŸ׻y€¼zp!ú’n5<¥=¹R)—Öá×_l½(+„€‚ÀîªÄé룖9žQdi”†€¼µ†ð£yQB9ºthHl)×­ç‚Æg‡Î|Y­&(<2ŒŽwv5g†àâo–•!(BÞÊ — ÐîX¶Í4œY³»”É–påó]&È.+ôàê.êKºÕð”ÎS4ƒßláh«XA œ(! 1}ú£_ÖwÎJ²úãí­5%/•ÃK‡–„°ggÉuëç Œz°j³ìd&Æ>Á­e³n)j7ËÞ;òÅ;ÿù^óèÔÆŸf†Ž‡Ò„ß[çj Ožì ÐÑKF‚õëH£ý8¡W·~wW€ÇtÈ%ç­‡”Òz‹y=s1€M‡4é—úþ3/’¡'u !6lpÀ‘8ôýgAàå¤çŠ7€ç^y%P¨tÈhß–®[ÏU:„Š šÊ´‚E‚ v³lב#½säHóèÔÆÀó!¬“6´ïÔØ ˜ò“re=‰…\ºÀ- §š€6 ”zôž `P;¥ÇdÕG뚘„ E€Ò@¨&ˆ@ rC(ð‚:j‚VW>›‘àdK ¸¶vM€€ô^\5ëxÒ«CÐU”Ž¢xP(¢|åÁ… ›†—!Ћ=¡Á–8I| }tá(‚@{k5ÁH x³µ‘`zeZÁá: 8nGÇHàÊÈZ£ICàwÉh¦CŽ‚¤íJÙƒ«/éîðw Êà@Y÷ôä)/ ^0@P°ÀzÉ!+Òt8;Ô§ž *rðû¯ ã< áJz`Àª‘!~ð<@ð«æE‚UÁÔÅäBS$Ж[Ò/*ÅD cWpËË}r%¿'=E¼K[çÚüø$}OÿØŒÏ _Eí ö²z©æKV‚/‘Ÿ÷ìUÝþpžÝ¤:6#×7ÿ. ¸¸ùÇŽ‘ÓŒ _©b7êÆxo¨²‰ÂÐm÷‡÷9HŠÀgðIFoç¹¾¾Ù˜çââæÚ󼉑*Fc\@ð8„@!Pt‚ý]þ=Áøíbno=/ ~3 åZ á9TŠ^;Ô«^Š›B„ üw륂c‚¢O…À0kBº·}á¼ ´Ðb0ä•BPäî-mˆMt¹~÷E°Ýß¿7 Á„u5äM2@à†d0 Tôî­ši"CLÝöNß"LYWCÞ¤#m>ÓnE½T³Ç¿,“‹@uoõÊÈÄÈìñЂm_–A§i/gÌÞÔŽ“.ˆÀŽz©fOâ² R Ú! *&Â!Cd÷VrŒâÜ®eY‹y[Œ«¶¤e™êÞJAiXE÷ÌžDì]ãj¤{lÂe×–¿,@ÐmÔ2ç!¼€n—÷sxWé#°˜ƒ·"<.>‚GÅEÐ3L0`öø èxf\G¶öQj“9ª¶BÀà;©Ý[ü'#?saœ!‚v·¹œã[ÒŒ““6Dc…¯†Šàk‘¾Í9‚ÍËÚ‡a`HBç é„" Òä¾/nQŠà+ùÀ´º^yF@ÞÉA`Q5Û°=| ¾ñ¤bÔ«cùÁ[zþŒ¨1™wé#p)‚óVø¶Xþž@!7 tÝÿ󲊃QPÙÊá$SSŠ`–%˦Îí ] {I~-8‚ù/M‚16ôá–žo„Ü­…à„ó ikÝÂIØ(é5®è\×7Ô´'ÁéÙÇ–ÜOÒŒ‡`FÈŒI’4ùœS5z#ƒc… «Ú¡Á‘£©Ð‚Îç¾I?z´€`DåŒç ©å–ùsŒ‚o’"ø>'úW?×ü¦U@Ȫtc! ë# íNâ ˆëøˆ~¢½BPƒ×Ú¦¦§W@ÚdEÎâ"˜P©AŽý( ñ9eýAÚµC€ Ù!QiŸØqÜ-"˜dˆ€,"ˆÀìÈnO ïŲGl\)9Zâ$‚‰L. 8&!{éTíÐàÙB@üt% °ˆŸc@àˆ =ÁS©‚Ò‘–{Sº.žŒ¼–è{‚òS©T÷–M äÁT—Ìc‚‚È{‚u€I‚ç‘Š í‚7¢€9TÝÑ m»¼F!pŒt–ù$ø ¸¢€…@N÷Öà* .cú€tž™,í•7]> @!€`Ó‰Dð“0Ž“‚1I?V±V]9@B ¥€N+½vظ»·(‚SHÁ({«®‡šÿ¯¿,+ƒIµCª€®Tb#àíÞ¢ü<;å@0ƒ¤Aî¤! €À$ËiøüeÙ/k-ËÊ @U@—‚ŸƒAƒØ4‚‚FÒüþýÒ¹Ï ‡þ½ü…CäÐ r ~pByñ¾3jc»Â0ÏT7LÆC*Ò‰yóÞà IaÇH€„ˆ-#!I»h(éKk‚†,ÌD3€;µvú~ìÂ4Ä­ o Fv‘¡‰ð¼½÷ìY{¹Úá~Èãqå-öÓ¿çþì©F áÝ%WeJp$H¹{‹="]ëV‚?w‘à/ÏŸáØ/˜üàU×ý7zÕ!æÑÍ”àW0ö—¯ ÁWö:/®°»  »"ñ:k4®“0?áðª)A%‰LF‘]” 2955=5Q¢ÓÓÓD‚Ke7°Cr÷– F­#Ò_w?¿]ç%aÌYBÛÏH0jJð3HðJÐ~¥øÎPð*ñ: ¿›l… ŒÏD-¨O¦‘(ani¥ìi0~$H¹{ëí:H°ûîߨ€ß èðæzú„^À(þïæaìÉŸ,Ø1Û\¿øÔÜîkJ@oT$ŒD(“È” Þ©”0C‰^¾2™3IR©J0OH§Ók9@Tƒåå`H H0ºûîóú›7ëŸ>íâLàû:û7,¶ˆ8ܸøK ÎÌÛ6Þ â³”¿R^P^" äUÛÝMIQæ)i CÉf³¶»{Ë´ O(òMŒ‚jQÓ´Ri X¦x‘s@„rÝOÆkÅ?ÿ×ø.ëôNŸL¸– ‰ßÝ÷)nJ°O%0ØÇ(ØòW‚Èt%@ny±LlÄš ÁŒ]‚/~I4%H¹Ü±)AÆ jJð"B,¨b|дϡœù `Ÿ r& Pe†ªÀ‚5l—ì3ÁŠÛ™`TËIoíÐÐûJE'Ù½ü$8§À¡&Å_ Ò·H *êH°M$8lT}’Àp™AM”í„'Á¡¡€N² Çvo‰ItàîI@%8½)A“·€ºÏC˜ÛÖXÀK‚aQ`¼m>ÈmãÊã×FÏÇÞ\;„p[@wûáPänœß‹YV@5Gã}”€ðÏIœ$`îzm¤¯/Ñ6L‚ßCè˜F‚gŽ|àHàE‚9¸³:+Ac{$¨ò‘ ÄÞïøoíwAÛ½õž†’O;H0ñýIÑO‡f¾Ð®Œ·8¨Ðÿk% «•ÿÿïââ’Éò5ÎgE‘ I0DO‡†zsÿ+>$Jø+[–eíeAU« : ..^^`A$p[–ÝdÄöøïh¸t€ž@Jà" @‚s^I`/˲ö² $8x ü³ž Z :pE$(y-ËnòŒ•ÅÐÊ6†÷våc#ÜI “ ‰U™•秧§ç~IP«Ï_—eY{Y¬µô-B¥¥‚Ç-âÀÕÕe ʲ%eÙí磃x`”)³ŒÊt¾KðKo&Áôô¹5cÌ^w‘à•Û™@¹ž ”Ë+ó[ß .¯./‹%m±x³'(»Â9 °ÕŸ%Ë ”»·DH š €%åÜ’>Iîv: ò(Áââb~‰”8à)2Û}&Ë&‚˜è€]ti2#Á·+ W ”œåÀ5,ù+’±5cƒVd¼ŸɵCü%pñ›Ô]ß'ˆEc3(5þÌÆï' 8Ís— - fC¡H0VfP=÷r÷– Ü$íuH” >7˜£$|LEà×&xK€„T¶+k;%M¢RÎ<“S·H€ÌâþHÐÖ¤oôjNÍ LOäQŸ{ÛѸC…’»·|Z@‡p_@Ç&w âƇÂ> ¹– ]ëÖ(µúq>oxpÀôD‚ÒAKüí P$ÚR‹ìÞâ’ñøŒ/{‚–Õ(y±Õìh/Õ,ñè P$aNÆÃ$ è<® @°5sO€Á}Î(’î£0ÈtA€p]6a Æt@ŒØ„ ä:Ë&z6 &ï&A“€ïÆåû$Xæ%¢’'¢¨x €Ð!^$˜ à½vH¼È8J wo‰“@Àî-›‚%(Þ¿ã#ÁƒÚ½%woµÆ<%p.ŒóÂ%ÐÂj™!$r㊔@@ÄìðJ‚J6%È ¹<À”eÅû+Ë.žœ¼^=9úQ. ë$/Y–å̲L²ŒH`yB ˲ZK¡ÔìeÙ §²Œ—ý'›ºÉêG)¸$ˆ“`Þ.Y–å̲L1Ë2UU°,[cʲ"[–-”¨œÊ2NR“(L‚yÏ3¾N€#Ÿ3ÁHòƒÞ%x´£ÛYå°{K¨üwo L‚x/Iø,Aw¼Kp¨ßdõ~$ èÚƒ@„R‚þ½#ŽW¹€Ž ‚žL‚ìÃI‚UÝÅH Ðq ë²‰/AÿG݉¡Ètâ%0>Ù®=ÁÛ”ì=ÁŠ‡žÀ…ž’`GwbS¼ríØ$He²]{‚«'Ðøö\%èXÕâ·€NJ€$ doë ¤'XÀž€·ž€lêŽñ±LJø™`Áš 4¾=_ éΊ@. ã*çe*#³“Ú§Ý[ÈoIÆÌAt³ŽRIEND®B`‚assets-wp-repo/icon-128x128.png000064400000004301147600337620012034 0ustar00‰PNG  IHDR€€ôà‘ùYPLTEGpLHHÚ__ßbNëUUîYLòXMèXNëffÿ\EçUUðUUÿLLåUUéÿUUæ_Oï7‹Õ%«Å"³Â"±Ã(ªÆFyØ$¯Ä!¶Â µÁ!³Ã$®Å,£Ê.ŸÊ!´Â3—Î$°Ä#³Â!´Á&ªÆ—y°•v´Ì–¶ˆ”Η€®„›iÊŒr»^Uâ(¨Èn]Ô «ÿ¶SÿµW‰nÀ1ªÁÿ°NJª¶-³¼””Ÿ7§Á'±Á"´Â#´Ã"´Á`ªª0±½!´Â"³Â&²Â!µÁ&¬Æ!µÁ)¤É?±·šv±k ª(¨Æ/ŸÌ!¶Á!´Â!µÂ9‹Ó#²ÂMš¾Þ¢qk„¿B ¿E¯³±‹û³Y.­À_£¯ˆ¥™½Œ‘M®°,²¾Í›‚,®Á’s±š¦<¥À¿‘YOëYPìXOì zªYOëXOìZOìXOëYOìYO릂¦WOë‘t¶YPê­‹–ÿ´R'Ê’«stRNS   7Ƹ(ªÿòÕ›bSãE©Êê~*)U9m(˜kÈݦ°÷Ž{/é.é‰Ó{òý¿DX­"vÅÎê,lò˸ܖ?ÞÜ›aâÄ\Ÿ1àõÃ(öB’f£èúYo©7sýe%Æ ò¿·…BŽq˜ÛÎü]ä_ˆI(| K5ËDG*ÓùÈ…'²@ÃæÂæɤ矈„¸bwãüK„7$€H0lm ˜‚@pl“à"l‰iPŽOEà8¹ÿSë× ÁtÒ€)ðSH& @[ D›GpÒM ` q #Á ,°ö?Nc,r׊5ÄÔÇø:H{@rÌE>#)Îì‡ÀA–†€càK¯«€äñañ¶œ='Äù B\ìþ©ÿ.^ê^\³O ,ÌÑóÏ~qõ»ÆMÑ’oÈupÔŸ€?Ž.í?‹i h áH×®k»ßéƒÝ…xã¦mñn»Í¢¤º2^™›àŽDo^YëLÎÜI¼- QRdŽ Ћ|=îÝ_ï±¥=°ýÆ‘ CÑfÍC݃uÛÚ;# þ~IUرD×E;¬OØK¤=1À#Œ``ê»ìq=êÍÜXÚOšÞnOÑáÝ5&ÜÓ&Ü[/AÌQx/6x¿û÷AÜÌ¥ý÷a³l7ÕƒfhÂ=mÂ`” ¹ÿz”"žDb<^ß|‹!F ùó‘­v¨ §’ö€/’?ZKí @¾f*ix ýÿØ\‘Y åxšèÿ¬°¨]×"ã&Üó#Àüצ>iÀÞhÚSVþhú«EýçxùÐV²óG÷àújQ?ï>åA´ëO€\ÿ½ º>߯1Žy}À×7ãxÔ É “?º~/òKÅà­?¹#ÚÖð½%»ºzÿ³2mtŒþk=°õï]±×4”›óß0ÈE¿?äs? i}O?sÔøÚT|¾øÒ®ß$€øŸ¬NÉÒÌUßÊŸ—Eb\fòç+÷Ò̽8%°òçë‘q™ÉõŽ™°[œÞñ\žý€$ý'8º¯ Š¨b©jÕ@9#õUÁ×çplÑä@Y‘È ,WÇlŸ?÷[Ù¨<Æ:.j:êÌVëwj6ªâwr”ßwúß³æóÀ7•Èu  H­+ ÍQ¤Y™[»Ù¢¾–T&ø1G­è¿Ù‡”üwØv½& "¨B³åW õjþç(Õ[wÿ飻`}È$Ž«P½Êã8õ÷¡5J¼fýÀñÈ&矑èá®ÏÙ´lI¯QÍ öžú ÅÏkó‡™ðå?ýŸÝ³–)ªÈFÓ·Yï©Òʇ »ò `tÏ”¢GÛºûO@\@Ôæ@%Èý‡Ÿ†y,cÞ@»¬-ÉâãôË`–¡ \>áa$¥ùC<°ÕIo{€,‘´~ý»î#H]Í£>9ÂAD`HW–ÛMê¨ïaò“üõ7(ØùÃMø{W†˜Pdr£ ‘Íþ(a`ç5áŸs˜ õQ.E%‘ `G¹8¶ɨ:I±ol¿‰ã´Q_<ú—~éÍ‹!Nì¯eõwÆg8ÑKo^x0È¢8’S*ýŸ«à`1±1á Ë{ú…/ƒ}zϼ¸râŸâÍ€ £Bwec½k÷öj«þ?ºs9«AãæcÆ(8¾Ø'ì­ÿÇížÏûÁÁŠS+ŸYÒË/ŠâaÁÀå(G õƒ0°©ä’€’æ“Ð @ö"Œ±® T¯›á®›)“™Vr3ï¢C¨ÂoöîÝB™Ì¼rx@·ÕýÆ'á‘OŠ‘òY«~R>¿j—©ÿJ¯ëêûg»ª]¦~øk¿®â³A^Õn­P¢”¬üíœ7µ³†ó5¦PýtåiÂӊѦ°ÜmnËS5¿²’{-óo•”pðÿ€P À'0@ àP`а öOkôò#& $y@M9 oIDATxìÔÇaD! „a“5Äí¿ZïÅáâlа¯ƒ_ =ÇqÇRÆZçïÂ+ç¬5^n£OAð ÉGûîsÁ·IöôªK‚_äêþ/ÿËøwCØø'4_ðŠo[ÖwÁ¿‘¾Ù ªü3ñuŸ½˜"lqj˜ftöo`& –8ß G¯0î|þðçóÀ((–$¿( • ßx(òF»? TIÔ}þ uYñÄ#ò??ÿ'à~¶O`:¨ôÅŸ )mŸï¿ÿtPê«Ö?€T0KÖ_ HÿØbÃÎîw çæöß@ï6³?aéâý@ºx?.Þ¤‹÷‰­ÿ <“wìäHôLI+0ÙnÉjö3ßy—}ÌÌ ÿÿƒ]ëK%Šb¥¬š²Ëî} ‘iœ÷¦«ô$•Ô÷øçÅ¡¥ù›¹Ý/ʪ–T ð?¦±hµ”# ü¯î¬ šBÊ•‡¼·b0* c¦ñ¯?þÓ½Ä"qlÈ2:eÊCg%ÑÔ* Ç ÉLy0~fîö_óN¥aÆ=ÿ×ØkÌj¨«›ï-ö=Ox¢|R:b@^‚ð*', 0—àï áÐjŸ‰p¬#‘&µ#œørê/ÁÞ:Tôåz×( ´Ö¡Ujoi`tµY€RI "‡ß5ÎÔfº#@Q`(¨Z GRœ©á@ ‚5 A0ʆ$a\8UÃ@MëÕÐP„I€A 0#ÌD áù8'LƒBÂ4y6L2Â0—@6T2úp¼.l¸dô àX \ÙÈÈ&ðH ØÁ.À㎈äñG?Öñqf”a '€0.¿‹'Ù ñ +O2ïªÀgB=|ÊÊãÓÊûüèDºŸÙm=ýL =Ô OƒM‚xœn%@_Ñ Ÿå`Jp@FÆu˜ÚݺÜö~ÜçŽRÿR+UY@3¯Yù1§Wýuòw•‹]"µ(- Ô¬ü—L*a=N¿ ¯I·=ÿøæƉÙÐùSמ¦ PÜ+SkƒúíãïÝÍ·¹‰ü9ÇúáHÍ‹rè<þ Šø¶¦¥ÚˆvçüÕ˜ã&+6WD˜@Á ² Lê -x"Ú‡·4Ðù“æ—@ù„—@ùr£MÉ÷ ³ÿF~¦^KoÈK@mbë^fÍÝ`÷?И€‚Ÿ©—€n@J«t,`WÓf›²‚móÜþY`€žMÏ•½A‡c¾ÔÊÇÊ:ôÑXjzüÓ3@Ò%PÚ€;”çÐ]óÏÈ·Ü ý)Xùê!¤–þÌàœMnƒ¨ `©‹¢ÙÁ¼' ¤‘áš@úˆ@¯ˆ'"uÖa.ÃÆpëm@Ý6”$˜Mþ¼þà{#D¼ÛDnª-`"#‰¨_ÙÿQþ&1ÜÁí÷¹62êWpÿCod0„!À‰bL†tñïŠÃSq¦˜Ñ@Zà–ÎæGÙ“!…ä&ƒô  L†ð‡ ˜ à }|{mZ üåâdH`S^øû¼·>þá#ÄÓø'øÜ…xÄŸ´çNŠªû— `ÜKœ÷“ø7øŸ#+&„“!?\¬:»æÆÁp¡óÿ›#¸dK0†|ÈŸWP"œ4L,ƒ÷Ññ? ,,Š¾­ØZ(3Å 6¯ °šØõ¸°³QtÕB«Ýàœêøa$è»ÿþ/Òsø€«Kèí > aGmËe?_摜ˌ¡·§úÀ„ËÊöÿ5Ò3ø€ ôötxŠ1t+BÈSðÔ‡qúÄ> m\!d¡w•U@é"‡¦y”†Èy|¿Âo„ÞkǼ#a(zi÷]“6}¶×oN¶M#²&¤œñª+Çx²†I&@¾"#Bž,‡/BR ¯ˆ'Ëቀeï?òV,0ºÏ¹ý^Cœ¶Î·ÿºÅP.×þÂqèòì¿ÃÑ(úüD¨/6Ùλ!þÁpÂ!ÆA /B§í&Û9‹ÿpΡ?P]^"t¡6Ù΄&O”'Büm B_`#çñ–3?‹Ì1ªÊ¥ÿJa#‹ûù{L"±Ìé,”?±¢}å ð ÐGÙø‰?>L(ŒJž¶ýP`;=OnX‰eŸ²»Ëýè\yÓÅ]kŒMó5~?Š¹»Ÿ}üíÐ?~úóF&\Ú€N×¢Ï|ªõÞgoø2Å5þ냰Eh&õ(øÆ¡`yöùóê[3Dˆ Áà â='t"L!† Ù´OÄðs @>ñö“˜ø³(¡tûNàlˆ²M'èÇ}× ‰øSˆ£Œ¾Q7€ ŽAc÷Ÿ‰"lCâÂ_P•£íöd"B¡kI\FYP¥µ5ãiˆjý½%qiAUe<ëj Þ(R›U, göhuV ù:#¤7d°™ÌŽ»6À,h»³›Zdlš1Mó±Id#¯ðf¹àc„tlÇŽmÀ,h¿³Û€áç …d;Ëúbi@™‹2H»û¾v:»¹5êhCgšTðá.ž%¤mÐ&u¿j{g¿6ºîlÊÍLî)Vïl^‚å¹õÎÌ]‰:#½èlìÒ¼&¹"ÙÒÙGÿÃn;› Þu›™Ý 6„Ö´³d,V®Jm¯³±€ÁGÛ;SÆS‹øy1iÕ™r6!wÕÙÀ‡=¿wbs»ûΰ. íh§NÓÎfpƒ½I³}?ÚÐY*‡£Ù™~Ö”ªF@ªHzgÆm! rŸÒ·-my'ön¬YîŒϬUg1M†d«ÎW@3®³E0PgÄþÎÔ¤ÏáäÔw>GÌ5/)Ë#ŽD;A%?.G,töëKøÀ#ŠCµyãå…ðúOÑó‡¸÷Câê‚ßûyˆëì„КeÖz}önºUg·A9>oôé— (Wë;Sg®_§÷mĆΔ;ér~$ƒI×NqYÀÎòÅüž?›Êdrʨ£œÇø:ïlÉÿrèïúÌó-¼¾ç¼-®ƒ áOž[áõà{~<;!´f™µîL‰·èL“ É=‰êwô4åÃÎh}Fììl'WIÇÖÌy£4œÎÕæxA–gñJÇ=ó¾=zòcëó¹ ߟjÇo=·ž¬‰ot»c¥ˆY ×HxÔ¤³DæuFzØ™r>„û²Ñ™w ®+fgQAwe¥ËΖü^~ãy½…Û‡½îŒ! ÔY½”Ùã¡‚1n}’!I[;3F/ÐÛâ:›qhÙøagׄRÉVærÚ;k‰:#}þ:#¤]ô»„ôý!ÿUlV¤ß•#¤×Z–~'õ{wl ÅP!èÙ"2 û2€Ë$R~t·ÃkmHo»jßž»“Ýo6àÇЬKgté ‚Î  AФ3˜ïàgßîBš ã8Žÿk­=hÔ…5í¢ábà] ax1Æ ÌåÌAY7á¬.2•yÑ áEÝ„Ì ‘ š"A›`)t1"X/Ô(ºéyŽçåY³WR)~Ÿ›­ãžó,8_Ïó ð»z«•@ Rí¥ÁìN·Ûigð?[ÙsQãY¡à³Ù|ðÿz¾¨ ?£ïš¹C?µþ&J¿Ëát88‡ãàf¡ù³_(sù*üÛVÂ<0A<®Ðw°Î»Œjåm}Tk°­™6¸>ÍÒ/ñ9 »“Œ%w7lÚÙ±)Hyå9ÿHÞÝJ;¦wÏk†‡æé%ÃÛB0]šûAgƒ‰¦Í;›L4e–FèW0›o’iÏ’û}6i Gÿpmg-±ûõsÖ;Õß^XvBQWã¡ÔyØ1U‘YàÓ]"´*éZb7.Eoqgö IÒ%4’i`-8õ:c“ê´­çMÁŽªˆ»ÙË]ÜqG«˜—«ê%ÍÛ÷ÁҜ֙¸7¤Wã÷ˆâð ¢(wÍcëïƒjAêLQúÏëcif"˜.>.(âùÛ‚¢Z :w33‰ÝN©.~šúÎä93:½Ï]3JÉ«w&&TŠãÄùË¿BAEI41þªâmíÍ*ÝL? ÀÖ ˆÎv ODgë~’ëÓc¯ÝYÕ+:su–Þ=(t3פú9r.:ØöêÐMãØٱĥ{rgwŽê3Ç&l |L¹m8³´º72K·/I¦¤ÏM†ÌÒ±–رúÎä9Ö¦#Yeq¾g-G¡Ôǃ‘¸Þ™˜ðÄÆ›amíZg©¹£ÇÙ£ôëȲê¥õiä•~|žÛÀSÛ™‡tl&XzçÑŒ¡ÃcS¢3íÂ_hn‰˜ëFã¿ýÕ­­±]LüŒ3¤µ:cdbRg ‰fWçݾºÎä9R×HLÄÏߧÍOFgbÂÿ)—)§‹ïiëÆ|¹›ñ7ÔÍ7[§!€-W ËëÆp…Lùž‚:äïP„nÑ_{qýí¡”×ìÌ8v%Ñ\×™5¶‹ñ zŸ¸²]“éÕWdr:äÎNk$§S×™<'ïŒWs]ë9_V_ÏÊñ—‘À>-›´Î.hõwŽáY§!€-W^Š}ÑY•$þŽDkG×!®Uë,5ÇŸÚûäÎŒc›vfŽíbüò‰Ë>3ã²Ûåu£½ÑZµ*ÂT]gòœåDgQrñ•éÜ™˜LZ©ëÌ: l¹^ïÌöÜ$Ù`ÿðd[œ8qék>íQ¯Ê8öͺñìÒécåÎÄ?¯ð—é˜MÞ±öõ¯$ö:G_ŒFk;«SîLÛòèb›w–YÊñUdýºq„¶ÉJ8lf&}N½~ù’­'6X»1¹ÕÄ›wuªÏm÷Ɖ?ò}x(=ywZ?–/—žF^˜ñ;áü½Y}¬ÜYþ–ûLYÚœ÷9­}}§t¼=ÞÃc‹ñ–X®UïLž³¦³õ§ùžÕuæÏ>œ,§]XZ´‹.ðábDëÌøïl‡gFhaù{Wbë[]Ýø¼º§õ‚¶®¨sDâ±ÔîÏÓÝGŒc™eñú¨Þ¹¢ÞÖÇÊe ŠRºM$…ÆqŒY™Q(uR¿Ñ£‰W6åÕ;“ç¬é,4¡¤‹³›u6Á'œcôH|!öõÅìZg¤Ÿ`[¬xšúq£oÿ~_#¾G ÿ¹ÞjÅã©ToÒoÁßÅ|eïŽq"†¡ ûÅ’†]Ë Ò*E„(\-  ÚËÐRs.À 87£!´ !‘}xþ¯I=ÊLW+ZŠÝHmÐŽÂaš£ yò}Ê°Ë£ucÌ»A9fµ–`‚B©58Ö²u%o•c†ÚLVó<´ÔÑgþÓ˜”cª «Ž£u&*ÇœŠ +SpK¤€"1gɳٗ%¾["$¦‚Üêî͈P$&;óJ¤€"1Ù™W"‰Éμ) HL;ÛlØ™jEbž~gÛc\Ûj;»z»³à xóúnž°³UvVRLûœ÷Ë£¬´³ëË[ûÞãó“Ü|x¹·ß8;¿0OØÙ{gÅà']ã²jËOÉ°\Bw Y+`Y—ÀFB `Ø…e‰Z¨16ŒLƒ±–ŸkšB£Ö@*hÓ´þÔZšŠZQ›bb›T-&ÚúRÓ>´IÏeDfXf¹ç{ØÌw–{&çã^ÎÌìõ†g‚°TÖ!PϪD½ið¾eNž¥¶êEçGÀÅ;o‡Á‚3CVø…Zž]ÎqGqß•Pß³Ë;’ð5tãÁs5á°øQÝ3¨(§SųÐä‡'7¶Ú sñ,;ÿÏ‚¡Ñ¾8Ð3' Jž-ïùô÷{Ip!=TAý0?úÍt=3ß>öUóNXü¨íY€°ÔóM€:ž•˜ã7„AôÕûp8@ôx«Xÿ¦!uË.€ Hó,¥G4­Ûk7:ľC̳ñgy±;];–­ðƒªÓ˜¬ßš[¼ÃJAbå ¨ø²>;nØ´5×ù©ŒÜãT‡h¯±@hw«iL9xÜéA‡éÊsPI8¬M( ûÞ.cÂö¼{E *†©P1öÏôlÏ=tìö·˜kLƒ¦=ËÔMÜtªy+ü–w¶_ê/ÞÕçGK,žžUuŒÄÚ0éîÖž v{–²ùºkzfŒ·ŸHì*Èh+èÎ?ÞA' :˜µgËún%Žç¿±íuG\}w÷ø£®‚_›‹àBß_]áò©pyÖq¾ntƒß²£¯bÀVé?=ktOQšæ HK6f"ÄOöŒ™%O¢$ÏÌwç'¹v gå±Û¥6éá˜ÑÞšªV ÂjÃì=Ã~¢+ÏA|V°¼Gé±t&®C…ô#÷©p·*Ï°–gAå)g›ŠÅ»›^¸uµÇ?P5LÅ3¦Ø+•(Û¢GeÏüÙ´1ðy |®v©à¯Šgz½ÞôV0TèéÁ²Âó,zÜálI÷ð,›Ú&걂z¨ï«ëP]_Ku}¨l¶b1»UŒ“ªÞvG‰önÍÅú>oïxmïh®èG€°ÔóM€žeç»ÄJéMë¶1Ϥ!®þ¸ì™ *9Ò²/'×ôÞ²~PµÑaó“›,(+‰•³òÌxÖ!Öã¾Ó•8ÔK¯?· @Þ0ï˯ƞ«-bV˜ÜŒ+Ú×ÊØ_ %Ïζˆ,ré„6évˆÎuûåØ?ýªè«-öápõÂ$ϼF¦nÒà¦Só˜â U]#±6ɳˆŒ¶‚îüCžJ,AYg¾CÏŒñö‰]¥J“D' ºÙg•Í÷ Nnƒ¦ügîlKÙüYT ÛµÑÔ<|rÜMDñpA­EnffÁÞ>öê$Ïþ®=ÓÝ—Ò €å§ïÖŽ d»v0ÏššÛ‡¶-ïl¿Ô_¼]µ0i<óBˆç»A ÏÌg[ëÞñ%á̳øôpXþìNÙ3󗿶HzVËRGi²V ÂjÃì<ËÎ _C“m¨RF’缑í-4@ug (ŠÒ,›}t²gH^F‘tB< ϱ?Vò<\ú4vX˜ƒ"-j…Ižy 6m |^Ÿ«]*ø«Ro í°ÑãgK:ólm‚žasy†[ÎÃឥî`ùª4YPv Ân˜gË“ímûÙ4‹<=c/¨¥‡ËžM4Ã`óÌŒóC§i²gør}Â3öiH…ž‘¬R˜ôÿ™WP<[²JB=Ϫ„¬°S7¢dÏJVEEE­‘ë ™ÏóLn²ÀøûϺb¼8pîsœ&b·CÂgòLn¦xVèö ' Ã™§ŽgÕ“<³Jžõ^ÃÏx_¥0©2šŸ7J\8ö/›VHžAü†0¥Þ('¤2od;°‰Ö*ü3y&•sB; -€ì¹‰rÈÓÍåfVÉ3æ Ë³HXvÔ=œâY96t{†”ú’ ª7úóQYÿãùÄ‘Ø’5 72q<+­))noL|<­gÆV v7Ñ3x¶÷Áêº2h:ØV[÷ŽÇCû䦃ÉX™ðLiÖw«îαW!ß÷7¿ñ½Ÿàx&|ã9žî8_7ºÁoÂ3×ÁGöàþDö;È3Ÿc>êú›¶¶èY]zïh®èDQA}° (èö%èKAç}·W-’Vœ¶³=ÏïÓÔóÁg>ß³³÷ìˆ ÉEHÊ$¢Br’2‰¨(‹¤L",)–H7ép—I!„B!„B!„B!„B!„BHhtÎXºÁÖ©Ã]¦$ MÉÊH*‰ Ɇ$eJ’Åb–!Él±HC²I™’Å h9E’ ýHÊjÄ,O‘|@ ’2SÌ€˜9E’DRfÊ×fV¾°4 •‰À¶s$ ˆ¤LÊ™¨4 ’2)g¢BÒ€Hʤœ‰ I")SˆœÑ9ƒxI™‘ÏYðÜ\çÊÙ€ã!*…Ò€‡žn†±ac‚rÖÕ“]çÀg¥€.ùwoQ…Ò€•é3á_è{öAPΑ3³,w—T&Y6óÉÙ¨¹Å™·÷v‘³1Ï FPmY› ¢ oάMõø'&œË̪©­­]xpÏYœlîˆ\—œUä<»^õtk9›’sfZÕ›†Á ¼ðæL?ñí«²´1Ïy<1üË<ú©¨hàÁ;g&¹{ç/LJ´”Í×h/ÉV+Ó¿¥yÅaêȯLÍ°M5ù€ÇÿÈ™®—Š_Î_îÄÔ »[û¯ 欬Wÿþý‡×AŠº~Í™6$Âà¯sv†ýâÉi?å¬æ‹ò=GKÁ•^Í¥`¿yþÚ%m`眭éݧrÎ*­—søÝisJNevpÝæ-¿ß9güçš–cß•IàB5gàR_•t¬ƒ0óFõlˆh+üòŸ–Uæ{¦;€ ÖÁ* þŒI,s°<–‚ºò£ ÔFÙÝIì b«ŒZrçŒ×—±œ‡0 œEû:Ȩ'×óæ” ÉÝÝZÄ®g9K˳æíZŸ÷!é·9³¯SÖ’CDúSþ¡Õu6vó7ì\Yõ‚u¨9Sß?ìz–Á®g>dT_  TèO¿ÈkjØ¡,ÕõëèÇ5çH3Kå)¶U7Ø/4®êtoLvsaõVà€kÎâ4Ôž^‘xDÃûÔ±BK™ û9à¯Dg™Q&*ah@k¯MéáïDa™Ñ' ï#ŽZah@}Äo¡œ…{_Œ‰öŸ¡l@$eF>g’¤KHÐÑ>O¤ ˆ¤LrFŸ[€¸‘”I9’DR&åLTHI™”3Q!i@úÜï_Ñç~‡òœÑ9¢Br`’2qŸË”,ð¹LHàCR&êsM"Ÿ3ˆä@Y$eb>77Y䘱4ÅÒé&î2éxB!„B!„B!„B!„B!„3–n°uêp—I÷ Ɇ$ebÞcz_ ’ HÊD½ÏÓ)rÐlèGR&îÏ-øÁÞùÆ4uE|‡—`(å0ZJS B‚°ƒZ †‘ñ×”ŸÉ$Ëæa-fÁàQ¦1Â&j æbÆÀà`Î9g¦ËXâ–(j2“-ãË–}Ø>ì¼×^[»<à¶÷þko¹ïÑç×w8í{7„âÒ‘‘ Ô0&¿­0’€Œ„ɯ+G+Œ$ “øuR—‡' “{æy0’€Œ„É=£F‘0¹g´ÂH2&žrÏXM@FÂ\{ÏœëænY Ï6~½<…JÀ¤á?Á ®ŽÂ<#LÏÆ“Ö?s –¢Þ žÂ$àÁ¾Fø?<n Ú „§àž= Ýž Â:çaM‚åñl{i¾aê$Ld«½Ù³†S—òì‹ý©x«Éí9`ã—†óàÅÈ(QÎWÏ*f®4}wØÛ=C˜ñìÌCÃ8zw¿tØÖšÙì;¹ø€÷"·gAº…ƒ 9<Ë)L‘ …BQõ¹Ãó‡âÞÊÓ5=kÛO«k!‚Dˆ+ (ù²=¯C×|EØUš_}!)×¢|G<œ7ŸH·èÌ/ǃ¦·Ã0£Å#@»ù«Hi»KSÃõÓqª²HHÚVÈX^¾îú{%Ž6Eodž™¿ðçu=kÎÓM}@v»«´CW¤\¥0 U3íC­>n¸?©­)L…ú7”àµÈíÙ‹¾‹n¾rx¶ÉŠé…L¬ŸŽ9•lmº…G¶6Û1ãµZô¬ÆzhÅW@|ÁeÏüïáËŠ>¡«µétÀ¥†Ôú¬c»{ ß3=»ïÙöÂÄà»{"º»¦‡­uÏŽ_iº•áïw®ÒŠQeÀG´Ä3i ÷uP+±J7<[ﮄA2†J*ÂäÌH¼×ˆfÇm¨’¾”sn'Ä©6Ä“Y•Y‰•Y{¡fßRÖDo&žIã‰l-ÞO•î7tWÝŠßR¦0Ýö K¨ÙŸ*)6†²y-2{(–Áx^í:!P–~£fxÄü‘óôý{óÄ”V\ˆÞšå½¼&¯{ž¡LIÛŠÈ#X *DLXàµWç›ðP×üs9T)D2çmlx7ª€¶l5ñ¬ kï"ÏüÎù‹I÷AUö:Ù­ä™,arÏV×3ŸP ùˆÚ:h:ž%µ¬?ž€ëž¡6]­C¿JI÷¿¨ÓŠç¦?é6ÁÕÖØakâAl~¯Dì–ÜA1ãTÕNgˆg9ø3¶-öLê‘ n%»]KϤ¾þMÞק¤¯˜(ª±•Ÿt¿Ãð R“Ûn苾¾ù2z‹+<â•Ð Ï°é®3¼Œ·é»´ðEžNg¾cí ó»åØ×ïÐMm¤¾×¢<5V,ò,ê%‹¢úúÎEžåé Øó'»];Ï–¾O}¼OxŸÚ[V:Ì‚Ç4¼‘È?wå©Ÿ»òV6ãb~ŸÅ>ÿÚÃ=óðÏ{:+›€ ݆çk¸g«{^L?ÿŒÉd$̵÷ŒŸçÉt2&žñë°›€Œ„É=£F‘0¹g´ÂH2&÷ŒVI@~Ýï¥ðë~¯"Œ{Æ×± F,b$L¶×e §x]&Fàc$L¦× ¢yAF”e$L–×Í §Y3ÌÀ oZ =ȇí0ù:ð‡Ãáp8‡Ãáp8‡Ãáp8‡Ãáp8‡Ãáp8×ðÙâM°ÝâÃv˜¬~Ž˜ú3rÂ#a2{^Ì3Á!tŸÃÈ Œ„Éòyž[¨‘ú “éë„Ð\:2rFÂdú:<4_†‡•d$L¦¯+GóeåXI@&P|™TïûÍ0’€Œ„É=£F‘0¹g´ÂH2&÷ŒVI@FÂ\aÏù:ƒ<y˜+éYw‹k³¸g+€ŸŽ}Èf}îIð„ÿ»Â;mëÀìkBýoÛŽºÝ³¸‹€>–ÓýßåÁïë` »Jíý)õ¹ö %x ‚;š Â:çK‚]›%‹gõÛt ÃÔÏåð/4œº „ô}¯âíÛoh.¸gó\-5ØŸ\öwyô)ÏÎÏh„{F¨Ìʾ2ôÝaøOˆgG.ö|g<•Ñ©8VÝ𠃙{ž9ŽSÁ>ŽAÐò³â,y<«ÀÛ7‹‹âAÓk1<_‹ÿuf´X½[ 3þ»J;tEφÁö¼ÝÔy%¤w(Ùj¿õþÒ„çŒåå뮿«Nˆ âRÖ÷ZtÕâ³}+/ßp6~Ùnþ*r>¨…ãfqüň®ÙB‡g.‡IH?›Óip×9þr¤XÆú ­Ô>þ –xÕ’±ôÖ üg·÷—´ØíöFçV¸Q§½ˆnïÜðìEÇÁ)4ÔqØò]vÌ’É3¨ê/‰J¸óéH‘rbðÝ=‘QÉæ‹Æžr¿³w?‰žù Þêí<ŠÇ³ßbN(Ñ3œ0Út+[ ªìM·2´°êø ˆ¯k/ô—¸9"=ÛÖO> èÖ͵`l|T˜5Ö=ï'Ðá™Ëaô6S< ~ýw‡Ž×A@_Ùô°- ss­×N‹žÕ÷7³Lij´¬Û€Äµdøë£ÏG„?ÓRñÙʯÔHyé†gBøBÏÂ…egÈ,¹<Ë)L©ÌÚ €Ua6T&ÔHcôLº¥ÊT;êFIôY‰ Ú „šèÍ°ê(c!Vé¢gl²î•ž-äœÛ qª ñ$¨…ã´â0HÎVÓS7º&!î-ÛÀµ~\KfyNÿ«(цøû“Z=¹_éôl“m/8¼|U¿/UîŽÈVâ^(ÇuÅ‚08""66"KÇuBà¿ÌBÈ,Y=Ê9ûª>¡Û"éû÷,õ GçJæ=“&4t›¤Ì-@GWŸ×á5pÝ3¼¹íð¬J!’©&A-kvÜNÚVDÓßg.‡Iøøý¼þ$ÏPž’*»Èäs³7ÀéÙ™SÕãÕ™ÿî™s«rïóÌ'44664”´ì,„Ì’µnL·ýšaËÀÎå<«Ù·‡Ï 0Üñ¬aÞ³o0ÔóA‘±Ã3ež¹&¡~vR+’ƒže|ƒ/Ì'’æ=Ã?ÈîÄñ¬0/ßüJ<ÀÛÝÌ)!sÛ ]‡ÀS<›²®Ÿ‡gشƆþVÏÄx¾®ùЇ žíú±ÛöhÈø”að)8ƒ}àG_¿¢¡/ 6âÙæ¢xxÛV"gNáûÔÇjagd+/óìïöîa¢¨ÄÜæþ'%5 „ÖùïÕ4ƒv¥H‰=xO}Í9‚³ÿï÷φúö¹q—'¾ÐwWöl+öìÆßï0’öÌž]:³>û•s1ɃY‘˜ÎyNÀHL÷LÀHL{6Ud#1íÙT‘ŒÄ´gSEнß/ÜûýKñ=Óc1U¤°(3ÝËtLîeŠðEb–{×èžÁH¡l$f¸7÷½fç®;¤¯G;¦xfz×cE;xð¯AIEND®B`‚assets-wp-repo/banner-1544x500.png000064400000111045147600337620012432 0ustar00‰PNG  IHDRôßCV,PLTE"\"]#]# ^# _# `$ `$!a$!b%!c%"d%"e&"f&#f&#g&#h'#i'$j($k($l(%m)%n)%o*&p*&q*&r+'s+'t+'u,(v,(w-(x-)y-)z.){.*{.*|\YŠ³¥©˜Ÿ?5€0+€0,‚1,ƒ1-…2-†3.ˆ3.‰4/‹4/Œ50Ž5061‘71’72”82•83•83–93˜94š:4›;5;6Ÿ<6¡=7£=7¤>8¥?8§?9©@:«@:¬A;®B;¯B;°B<±C<³D=µD>·E>¸E?¹F?ºF?»G@½HAÀIBÃJBÅKCÇKDÈLDÊLEËMEÍNFÏOGÑOGÓPHÕQI×RIÙRJÛSKÝTKßTLàVLâVMäWNæWOèXOêYPëYP줣£}™NH€/*}C9³³²/+£¡Ú±ðsií L8"]:ACE v°‡VWZöµŸ1(]ݦœag€YfHMR@2_sa»º”ÁYJÃi¶XI¼jg«®›•Ö½nÿßPùÙh™ƒ™ø¿„åÆN®›|ôÕR‰†¬XJÌXG´nbÒ—•¿Œ¹“[¡„W›‚uÅRB¡u)ƒo)}yKwÔ¶W¾Ÿc³ƒdšg[c%yYG­½»Èªq_Zd¨ÆÅٞȱ¹ÚÆØðºÍãPC¬«¦ÇpK”Ç‚Z×Ðâêɱõà€ññôÿÿÿÕãõéïùûçÒããìñöûûúúâë÷òã©ÖÒÎáààÐßóXT™:5v4.ka^‘khCD”<9Š}†¾OA˜ÎÑëF6m3*c'(&˜¦¸vv{cek566YMØ@6ŽQî†ÇaÉ(:îîJÑã®S­cØÑËþ;£…dªõQIêÝ3Èð¬ôÊW™‹Cü4AÏŽÉDLm³ ¸’ w=‡àÇAðsg Ð;@#èžLî@Zô @°×/.l%£¹†€fzf×—`.ò_9` œÞ44 ‚ßÈBð'G h€@× æV÷ pÁïA=¡’@ƒ@ÄK!P ê8-©@ð7CÚÓ‡ of&z:õ`Nã€gÐ÷ x @)B $Ðß+A°3Ý…î @ð,¤(Á& ø•eÐô@9½@CðÔÊå’{ôh!èH0¹)˜ sÆxN¦Áù8€à…%”ÊøÆ hv‚î$hN‡”¦Á) ȹ+‚rÙr€º6æth* iù† ` ¶½0Q‚ø&Ä!ø­èØ :Í!XÓ æ>õ ‚ïAp7·”Ë@`ðÔÍA´Ì­èéA°"8”€¼„ Ú æ>9° €ô}<† )Çl›\ÕrÁáL!8— WC0 ›L €À+¢D;ê@@ é@`Ë@°m›’ ÒÄ!‚T!¸fA唀< o}Â0œŒôvä‚xÜ…` ú€·Ì„ê³C‘>`#@@#È‚’0LÁ?²‡ !ÁôT˜9Ct‚‹†\—j@P.3˜O¢ÀB† !8s)CðÀJ@B»4¶AUhˆ‡à†I#0‡À|ŽÀÊe !è€ ‚ì¶ë3€ ‚„)Kì‚´'‹ \û!øwüS‚^ XåV@ðÄzJnCð °‚¿KAû=„@à©!¶ëå!(¯û ë!°`©2ð‚"8½]/Á7l€ _&‹…T<†þ”€hæ)Vä!ù¥J·!h‚ø§†€€FðZ‚b€€€F` /å!ÐK@`Õv½<æ¯Pïtf²˜F¤Á=žY’`€Œç€fÁDz©¤ü 2‚ €ÀžZ A±@à"Ý@Áv}æÛõ@ð"SVK] h Hg©R ߥQXÌ7² •à´ß»4æ°T) Áo\„àŒ[àóƒsÕy•·ê·ï—VCÐ Âd1Án p‚ÂXáfMey^å]ùYü×WZÃz}0 𠂦|@€`¥;k¼Ÿ_¯Õs›,  ‚s©@p51£à˜úcÿn~M¾J@`Õ@™@0“)öB…±[c –Ö2=º `»Þ ¸fAð½FpS]¬›åÏ\  ð‚ĸ ¾¨ÕÅyM—þ]¯‡Ê 0“Å@`º]#¹‚à¢!×Ók…cóúüçîÝ;w@$@@0$ÁA Ø`#¸õQ½ÿU X ý“Å@ 0Y¬à€ûèh €`,øÖÆôü/!€`ýœ•…àƧ˜ ”…oà¿Úƒ¡;Œæ€ y€tÁj€À´Œ‘;‚àÿÚƒ! P·¶ë4x ùdqPP FÐÈìÝE¿ÛFÇñåó”aUÆM™6efffn½ 'vdGÇ%—ïȇå†_YÀÎ$ÒÈê•ä‘FsõÿµË»|?Gcé¬ º0$® €@t@:7@v"x¯\YešTê@­œ*ßW±È6€àʤ Ìs^Mr"øuIƒêC¨5ÔÊ€àglªœÿ‚[„¨ßT0”k ª4Ȭ•3Á€@¨‡Ü-¬,–?TV[äM` N®Ìšî@p©&\A*A¹Ö ±ªÀ€µj%  P¿©R=€@ñ^Låù«û® ù)È?@jv×@ `"à ˆO. R…à»üBÁµª ˆ°Ž€§ËÊb@pÖšEC«Bà®Q‘Á×R ød‚ÿç@ Ýîz@P1) á| °+å?s@ ‚àM•€,  êa! ³¨àᣪ!À^@ V© Ê¢C pw}Å$ µf>BÁåA©Ýõ€ài ¨Y\Õ#Yp55(¹±ýw×@À_4´šxñÏx rµ—¤ Á€èÁ³YœÊ&ÍQ¸€@ »ë ¸ d‚ÈPµ>` NaZî\–?ÁJ!x^!‚ÁUOEa[•>€@^ ‚ ‚Òª‚¸‚óT@~W Á= !òàÁˆ@€Ýõ€ &¯G…À¤Dj¬  x@áЂՔP& ˆVÑ@^Š Á!!x«F‰µŒ €à>™ˆ^…’ËZ«@´YY ’_YÌ!xTDBCðæ\Œ™”` \¹@ :´…à¹(Ç‹²[@‰V3FkbÒ˜šöýçyƒÿg3?@è@ Ÿ™4¦ÿ»©)¦2›É«IA5ZíNÈX‹¥ÙÔÄO€ ý„‰Ù‰ËS Vk]³%{i›ZÊRmªÁ<„àê ¸9WDyÔГë7°\µ‘üY»={c€),ݦgAA6!¸d‚MÜœèm´T|&àèv× ¸5îÎ ÏnfyÍnüìŽÊ‘€7õ  ;ô‡@ÒS¨·Lç} hðqÀ¶mÆ‚þ³mNÁR‹|5YÊ/¾ý ‘!¸T®IBðøl)çwÀ¶YäÎX`7H¬úHðÜsϽö Ðõ›*ÕC”í¥™`¾¦¶:½-®·'zNÏpLnuœ­úŽ­¡pâY`·HÈbi÷ïé3>‘  Zî®Q!(ùpN·•ñ¶õßžäonï~³§«M꟰ꞮMBYÊû7è}. @A„uR ¸7Côœ~œAìL¥Á›Û˜ží oãŽÂPÐR}\¼½ÁKߺ!ød‚ÿ ÈÙîú'§˜˜ãxFÃÄG€­Ÿ´Ì"O-îÀH ;'PÁóï!@æÚT žˆ Á6­'‚&y[Ê]˜j xþÛ8þ9Õß@ :´‡àÆx‚mžøù¥¢ÓàNhY‡<µ%8À/-¾µ">ŽxDÀèSè€~HØ]øiðÆ3„Ãá-:_jøNŠ“%KoG‚€;À‹6Uw×s?c›ç.³í““Æv×ÛS§Þfšæ˜¬|ÇM5¼‚ÿqUH¬,æ)\PAžZ*žØL¢ÞïÞÑ‚Â?î€@p ÈìACÎ@À^CÚÒ‚¿=A¾!¸ ä‚'òAK¸‡Àf³»M3€@²~Vlw™Ô„Œ›€ B€à<@ ‚ß•Bp P‘p3™ÍäÖm*XJ Pµ©è;Ùº.“œÝm%uZŒÃb@ÁIA´³¾´íôýßøsþ¶Í˜½R‚-!w“%O›wŽÞ†]t®Ý;õg¯ŒÆ#CÀSûòQ¬,¢€à¾Ô!ØçHlÿÞlw€\í>xh¯ä9èþ{Ó¬n(€<–G2ÁQruôà^é>¸›Î¥Æ@PBE0‚Ó‹ÀñA!t*T"(!‚C€ÃŽdj¡ÁáÛJÓÁ!q† "G3;¬ÍRèXÊö ŒXŠ`„j"¨ü¡R;LHÜ‹#ÈÅ“Š A%‚·]|1t¢ Ž`"ŽÞW"˜ 6<‘=cXNÊI"ˆt„ ‚ò…Å œà"Õ"@7Ä2"aÃ)Eà‚ï|‹`{ÎU"xÝN1&L!W"˜ &ˆ5[8r’ÀZ•Ôl8Ë"¸€ 6ˆ ðRB)dÀEP·Ñ>Õžs÷! f*‚Ÿ“>$ô rp‚º‡ÉCÝ…Ük(èu4¦õž¨÷ÏsÁ_ž+ø`$\^ « ÁA0œÑÈœFíL’ >F$"‚Þ©D€0àÍKO§"‚ÝEÁA&ãðôä¨ '‚îi©âi†Df‹ç,‚¿?Ã"° š–e9Áw° "€¡’*&“ˆàÒ¢‰`„¸I)/‚ '“$¸bs¸üÆ©D ÅK/Ž—'^<;Ë"èÂäŒAwÑÞéom@G2ÍЀ¼­Dpz\ü0í%¤éCBsù‚ˆ ¹*h™þÈÒ"@6™$A=Äá"1D¸»y ¿/©#Hn?xàpD ³ŠTY‰ ´´”k/* °5WŒ¦*ÇÞ1«K»•¦@)Î’Ä!,#óA¨¥ŠÏ°ÖñG¾É(¿ õ··C=IP ˜î¸*Nq.ͶÈm‡ QP¶ý‘§#²"x<©*ô Ù0X@tÿYˆàUUž±ï‰Þ-€þ–zÏn—sØn@|g¨\^JĬ0-ò{Å„„0™À^El#eR³Éì›×D ôËŠ`ØlGIK»iôd"!"£l‡ÕjÍQt,ÀÕ“6pFqnñ¨åá4Î '‚¾hk¨'= +‹ï7"ªûá#᥻YýÓ¿:Þ'&ô’KƒÄ£ÌâQ]}}ü^ß,‚V‚AߥOC|ÞÓEðÚeø¯ç"‚P’žAxÃnt{§ç âõý{CŠ`ZT"hj7——–H±–-_]Xza .‰-E0tH|©eÅN»¡þ8-]¼àM]ÙI¥ð¹Kƒ8¤)Dí·¦"Û¢Ñüv¥F¾ÚQˆRF×ÙO©k û#s¨CGªÇÚ`Ÿ{FߎÔ$A}ÃQôX×Rh-mo°¥pOokH¼gk[LÜëS <æ)‚‡±Þ]Š¿ÅïåQ?ÑÀGqIúÜøè/ÕGwv~ø¢<*E°ÓR?þ¾T¤´ž÷Óv.õiâ*"Іy=ô $Gúºòžé~èÌ‹ß¼Q uN9…ÜcéèäßJ¥‰´²Œ8€°<²Er&¸àÐifDИH.›`¨¥Š]Mµü¤Y4‰ÖŒ"È÷S¶Ö NFøSÞÐ0‹@( !Ö:¢•;  ¿y½jCBˆI5E€‹GóÓl rm}.‚I~E€&h<|ü˜/jäºgEà©­€œ Œîè ü^VŸdž¿pdܯ/‚.”åCNÇœcÙíÌ‘䋆Q_ÈTCƒÞ›_3ÞÃWäóùA /‚T½­½LY¶!‡¥‰ € E0ÐÒÅMõ&ŠÀ8©.‚4ÈŠÀÔo$ò™ÆPÁZMDpË$‚›ƒ²45`A½Ã0HpÓÁÚu5E३Ã4j`³ahc"ØÂß”ä˜Ê™ºë"ÐúöQEE<ËüºPD°§Ž‰‚IEð*?ÌÁAV]ãïJn9Ò–‹†;Ó†oPtÈEð¾"ÿt¾DÐi;¶QYh`šÀ‡‘&˜Tßøjº8d_Ô"Ó¤R&œ4"0õ[C0‚" C¢BÁ­„6䱸sDÀ‡KE`%vRWR¸xÔ8 šÀÔÖgÏ E€ì›º£ŠüÕÁ4A¡G™Èáª"@P¦§S˜f/‚?Ÿ•zÆß“èˆyò.‚#í{œnh@~Í9ªDP–!eКEàû!(„òÒb!•öOËÜÍÓ‰-e+UÅM]ÆIs"ˆ”oÞ§"¨°ßh¤ôcñÀ(Ý¢ŒÖb`¸#š2ÆG'‰à–AëâQ¾½h`Î#ZEÀÆÄ쎒"ˆèæ£uÏ0â;2 iÁ½M>ÍVok`oKDp/Æýñ"ÝQ>âÝUøû®W‡U8˜UˆGÓ‚§ŽÿºÿùB”.u…Ý>+#xÕ'ÁKÊ Ì'¿æuÿCxH0{t¾²ç+‚6Ëÿº3ÁïèŸá»7Q·AY–㲦&~5„W¿tÄòQ¥ ¬ )ªœ Ê°Q¦‹q¼ßg#‚Ú°&Á‡44/qpJ¬^–`¿5ÊP>(\%„³D ËÉ™%üòÖñ•Å¼Œ D§ˆ‚2Rb)gÉE–LŒX/¾éàÎ0ÒsipK”ñi`[Ÿ×’mûòuÐèdð »·8ß3>Ử'ûdƒådüÑÆ'%"Àÿ©ÀemŠÜç/ž#!~;/vY=Ùîë—¯Ò/p˜Ý$iÌpE–€{àl‰àp|²ø¨3Wö ü+MãÎ22ùÝ)¿¬D€8yÄzæÇx©[yX“‹`E¤‹}LgE rÉ2ˆÀÅ–&‚Ë #Eøµ# ‹!‚kh‰ø*çº _Š`T¬²ø:®-*‹oâ÷çJŒÆŠà["’.?Šp率CSðide1Ÿfk‹·msîöñwp‘ˆàQ»ËÊbÞ]«#@ Åã…Åx©× ضƒH ZRlF_«#@^ìAʾ(,æ|Äõ¢°x÷5f*"øÓ9ˆ {ÌÕ½ùŠàŸÿ•¥q:³GK!W"(ƒd\@†“‹Ëq}Çž–Dº˜‡yÈIk5³8\ ÙOŸ1/‚|p¤¢‹ HD€CÅr‹ ŒüB"D’ ‡“Å)Š€OCE€à4[[¼m[°…m…r¨ŠŠ€‚Ýg%‚η@!ºþ4Š@Â9 z „þd¾"0fb»òé9òWvv¾.¸AQ%‚É458“Š`)&J’aJ"àébSÅš(¦IÍ"XSEPÓú)"¸êà×B×ð:ÁÌpÒˆ€_ÙR˜% ºÌGo8Ø5æ°Ñ¾*ÁÍG'‹ ÉâLµÁþ4¦R|yHâ-Y¼‰l“Ŷé»j"ØNwMxcw%G€Ýg$‚–ZF€¨)äJÓ¶#TÀ·ïo—ÁeÃE°:dPVˆIZA™i¯¡‘ˆš/ŒŠˆàf&"ж˜ ð DëEƒÀ¯#6ŠÀãÓ ø4[ÛúÞ–?³ø"Ï,V·˜@ðî¿ønF"àI‚੤ež-&}AŸZ’ PDЪD0ŽÞ›“Å õž¨œ¶[jƵ9‘ø@1Š`).&‚ ù]o/‚UŸ§Š³"¨Yú«¡‹qÁˆ`¤¿ªÅŠ® ‰²§&ÿEp7º\6Ä…D GÙMçÖ“qNQ @à¡”§Cêܦsw÷ÔM綵Mç¶dŠàQxqì¸pbZZ,ºSh›ÎÍ("ø„3þ(6Ú‡ÖX¨›Î½|‰›Î¥¥Å|^YÜ߇Ï3Ù…ºD,$x×YDð=Q%‚ÆM¸ÅÄg™â“’ÅM±Ñ0 N>Ú̉࢘S¤`D ú1ð~EÎ#à‘“dŒq¦JE·ÆnC]@_OèI—‰ aÜ6Ô”±ÛP3!ŒÁ;aêYˆ€ÂgŒ¼~bVúñïiê}mÝPD+þ6ÌÇJ34Á›ÎBƒgÜL$‚¿÷ÀxS»?>¥vŽÁ3rìÁË1Óì©D0Žß¼y×Y|º?K ƒL4—'ÝtîIÁ‚2$}‚\Hps"Hê“®#0÷3žYL2gCÈ1*$ª¼U8"°„ˆê ‚ÅxTåöVŠñ¨Êíû× ¦îg)‚§ŸBÈÑ#‚±GUò#tZ•fÅAçLÐ;þþŒŠqd!ÖòÄ"XÑ‚ ✠õ@çx°êâI5ã¤ÌÇí5´fì·†\Y“Ÿ‰o_ÑEp·¥VUQ&"H¸a>¼¾ ê·#-E % ÚR›Ûã¯ß¼g<¼þ¾B~“ò°/Î,~l:¼þ³Aîðz ŸŸÁKóáõ» ùaªˆ`f|èœ ~ž"@†ÍTˆ3\ž\. |à뤈`©YTk~ZUœ¥¦Ojy¯¡5­ßE a{“†ÁH«,¦ÐuB¾þi]¿Y&" &¸¡EœÁú­â" H­ºÀ†ƒ"HÙ¼«Mã ¶$÷¶ô¶Æ½m]÷î;>(„ÎÃ¥ Åz÷Ç3ABKûø½½±Éâõiâ² v)ú0îÇs‘,î&ÀÂqÔ9+ô~Æ"ÀGýˆånkiyRð8‚%ËõÓ+Xý½Kä»ö7Ç°ªq1C-ALZÓ¸4&‚µË¢ßå5zCçê•+Éÿ/ÑBL„BW×®5œvÈ>­Öh˜E q ¹a9éÒ$?hÖ%:f u…Ûwu²¹iy83ØÜÒ¸¿Ùm©¸ärÏ Øûž­^OÏ%{$»S  ßK~¥òC–_*ìdy‚0ì$YboŸ}ü^ëÙógÏ%/»}×€ZýóG¾ÛPÊ«/.ãÒ½%ξºxÿÃ!,ÝΙ᨜þ@§œ’¾Éÿ—/¬ci%ùMO·¤()4Á OSXH­ÆÁp Qª‰Û(¬"“õdeE€Ü{ÎmÙÈ•»’z}S°¥³¼=blnÞK¹ŸåÞFRbŒñz€’þñ)$‚Ê‹€BÏ+~–Ö’=Oþ/äånzBÙî«—/¸ÐXG€ø?öîkKq戸sÎ9g[Î9çl¿Èv—^›[£+9^á†J'g΀ÃmµZ½~Ó*1êö€v@ZLý¿0BÎ\é7tWuu‚ËÔÃ#ç(sèLR† 9e^~ë¼âÉ©wÀ&`gœØ|úÑÃÊu ‘° °ÒÊÛ(í@@Ù•ÔLª$(Ç‚€(>Pž a@q!°;‹;Á œÌ=Ý+ļCÐE^Ý 3¾„àߣ åß~@À¸¹éÀ]„€ððøQ T eä33†€!(Bà ƣçWs(Åh¼.?½¿0 Á²ö‰6Û3Óy³Lo …"1¢ð†€!ø÷£MÝ‘ÿ>,oeîß?ѨÊN—©ûËe82~CÀ04ÀÍøáë‚F Á †×/á”™:)¤˜Ã)Ã0¯­€òðF×éß>ýú= `>á _>sf55ñéÉ 2¡Jo„@džAÀ0o\;ç¬=¯Ýé `>ÇÔC°¥>séG ÿÜn'Ã0H Àìhå \5ÄXùÏóeƒÝàù‡«gÿëÏ ‚÷= †àëçøQß:[QGQñ†@ÅP&AApÁAðò3€€B#‹ßH0çÁW[€à» ›Ôú B(MECa^Ø L_Ϙ`Joj‚w0Çàk{Bð†`kRk³:Á$—° Åu 4aàAf Cp¼Û/Þ#˜ZרÀ$1d˜¬·Âœ0€Ów O†  CPçC`;à ³šåîNš¥õ»PT{JÓe€AµP”ØÈ££ÿ¶ CÀ0†€û–g‹€þÎW¸úG´"”aB$ªÄé@FáãCÀ¼áì x |œ!°h‚yÝ·óÓ1ඓÅßùŠŠ†PX[B†#·y$8j¦ •F0~Bð^† v8jÈÿ³†.Û;qŽ’‰X…¢Ãªt(Ž #-…Óì&!ZÎ%Cp‚6†€!`Z:}tîùPš # è½A,Q*·ÙÀÚÏ„!ð‚Wv‚73;(k‚/µÁ7}„€rys§Ø‹LaKê(Äb‹`€áHÉÈE†B‰”&;ZMÊ0­A@0 Á]œP–¶ … ” nr.†2–zX¬!ÁÚËœ!¸ã¼nOÞx^ ÁMü†€2-ï/é¶YBm€@ ¤Û\¼_annhR¢å“(f†€!`†€B¾>n•@P{Û #€XƒI„CP1d#ÌÀŠ-m0 ¼½9Ím‚æ§PS:5²ØäÛ¹öð<3Ø!¹t;-„,*ŒBÄXØû x¢-‚à—¿úéwZB@Üꅧءvžzáé£AÀ¼æ.@À|¡Ã,›?\ý‡`»dT~°w è^QÏY®óÈêTŽqx¢-zGð£OúÓm_\\<~@©¹qî0 Aý¤J† ùÚвC¤°{¨™"JPP²³E ãƒmÐ;‚ß® ø³ ÁŸ/..þü€r»÷Ÿºó¼â\ `>º; 4þ#Û`ŸÕICCzÒpT4 ;þ\&€â4ídå;‚ÿ® ø£ Á/..þø€rë~á)†€! ºAóÙõ Á²ia~zF[7:cˆuRÅ‘ÛV–tÞò‰sõülÁSÖ^ñý§^¼xñ™”Ýo0 Á9ή¯‡€!€ål²c.SèShQC-ó<4& p«NdtÝ‚¬âäçV§;B@ùµS4Dÿ§ìr£<©²m^ß" C@5ÿ³2O:A “ˆ(ʤ ä0‡ub™ÀZ†Pb(QdIK'ÎÕ—\>êÅÈb†€!øb§ hï!XÂa2J¨ç ”gÅXóÄ\fGP†ZEÖÖ^1CÀø?²˜!ð‚ï·ÁlžšL=Ü+nž@ÐÖ1e(µD •Â!aMJäšÜ aø;ö!O:CÀ0 ÁÌ¿²Ò)81–¡L`$"ØÃΖu¥Ô‚¼ÓDüôAÀ¼–!8¿9)_¾ ¤î.´—ídÍ“e`¢0³:íagCª+¥äûÔëú̆€!ðwvýYCÎvÌt )¸ñB‚ZJ@™[ÃÎhr†YÙ‚¬ôu5Q4Ø"h†€!`‚´Qi¾õíóÚ¢ø~$Q«Å¤.Øw_âúˈ§Þ"¨IÓÛ€²¢$2§Ý«šè6¹<xd1CÐ|v=Cðõ–!hÖ¼ ‚YíJ‡B5¡ì¯.¯¶BÐs_bP^O€àJÕ›Õn„¦z"H0 bM¯ìj"Pqƒv²ó…€!`‚¯¶Áw@ÐàAZW³À>y0p÷õhY^i]A›ï7®'Z—E±4Î&±ª‰ 춳æ{Å CàÿÈb† ý‘ÅßÙ˜dà²nóÓzRïAPòÑÇ`_R8b¨tHH)ÊWv5`𤅢i{0 CÀ´_54­ýw€ƒj•Í‹…ÒöÊçxˆ2_¬!ÈõbíBQT<éÇÅ·ô±øTOË|¼ˆ¤^Y¡W?Roo';^*¢5 óÀ©&J¬…¢™1 C°ÇÈb†à[¾@0¯oŠPã‹•2,z:7·rÙ[\)96Æ×ohLXà € ÒýÅ ÒR] t¸º¡p<¸o>é¨T'’–ËAv5‘ÒÕB‘¹9Tf ¾“É^üôû?u!°æÐôCйÙõ C@x‰’(óÁõP™Ë…¹îQqЕùŒí€y©•ùV]¬ýrQü s¿øÆ1öÍÕi·ª$×ï›d»š(Žì…¢õ@|{à Ý‚_–ƒiîoLsè CÐïo‚3>A`2P£1=î¯Ê¥"N&¡ªžü¶æe`¶‹e`žôë¯3—æSte.·C`~«ã͈ûªÙª&rÛÎF¨œø&ó½Þ”ƒiîoLsÐÝ€àe ß¼—!h ‚o7 [¹åfñ˜ô¥¢'w«]^óÚÄ\å¸pöŽÇ«ÿz8¶¿n3>ìÓC™Ý‚\U™÷ÕBÑz6~dîº[{¦¹¿y0Í¡oð¤Ê³†€!øÌ]…`ÿ†²ÛoW d-2Ò‘[D”‡“0Ÿt‚­ÕDBÚ EÖ@ü*“½ øé ‚§mì)3‡½Ñ9‚73§‡àK‡‡`ï~²öÊêë!Çîƒa- EÕÒP4^Èõ«õRÏ|)- u“„: ª…"{ þ:Ë= 0ùõ¯«Á4í¦û0oéð†`†² ' ¢hëfñ€>3À¾ÓVâÊŠr³¸øªslh;[Cð[\>Ê´8©²û0ßh“éåªÌr¶K6®þ\Ö1±ÐR ½P^M&Z] œòQå”xeCУÿ[å£ à ?Þ¿jèø EC# Ä¿ÎÔ;†àø³ë‚cC°v?tn„ëCçúR[ÊúäÂÂ:ƒn¬Çæ{ª†²®?en–— ëÍ}&¹ˆŸËÿ±w6½mg—EVcÃpùE Ú )`¡‡¢M çÐÜZ èi±ŒV—@1xËÁç¢WšÔƒ²Yå²6‹d)Â;KŠâÛ.Õ|‹>ÿ™}™‡2¹|Wž?`qfv÷Ù!óóó<ó"5?Xh@†eFAðÓ1‚ üqáAðÉ9:ótkZ,„ß…zb„ñc%¬Aö´50îFŒ1Ó¯™T!âf™ULé½*˜Ô;".ÓÇÏ®¯’ÅÓA€;zf  î{üJƒ@íìm ["y€IDjEÅ%º;ÀøžkŒñ #UúA±ZtAPg¬þÆàc ‚3´ýØÃÀðO-ÞÍw3©X!:±=1zXúH{ÚÑ #`½Ñ0;8Ð z º @ïÏ3BY¬Aðr”‡×?yLÚÉád»±‚È%DŸ±Ò=Z]¼"G†¶5Æ‚cMò úÁa­v]TëõjO ˜‹"Ÿ]%¼xöìÙ«!‚à³áƒ`üŠzž[/åWS¡AÐg®Xƒ AÆ(ô‚w È‚>Ô>z£@ðìÁ-èÞ«x“ª§OïM þ{ïÛàï¨A0>`8ÇgXÌhhŒ¿½óü–«´G0 ¶wàL¬v¢  ‚‹ ×#øÏ-_ÕÁ Ú~2±0èž\× hY ÖhÚqQÃP(‰»\æmV…±r2qq»Yc«Å+eæHA"Yf ëPL¡É„º`9@”©å€ I¯¥c/ÐרÌBÎ—È òÑŸú, GVk†Ñ¥ª ׊.\¾Œ¯V6srf¹^§j¸ŸôQ½Z%#mk?ȪÕÆ·ï +ìd=dÍfµ7Žd×yµåPƒýõ£cjÚwAp´Ñf›kY¨³Íä~¿ Ð xuKÒ½ÁÏ®s=9N´3yq"±è"üÁ42¾ð•nà îŽÛÃî ÀMA’9J@`4œær¢ ìšh²\$¼»¬N،՘Ô1×#hÑE^0ð]x‰¬$iàÏù_ÂÚdpH×%¾•ª·­ã hÕ;Œ® p~£º!ƒÀÿá\;džãc&´1nusßgX€`Ãéؾÿ}‚@ƒ@8_9$x50ÞpÀ×Äʼnö¶Â‚@L#@éƒiÔ ˜JÔ˜§VWTMµ2mS-ßD-¡ÁÿŽŠA\z­Ù‚8^ @@ˆIz¡!j>Äg†¼–ÙÙÀ—pAPaX°)…†‚]V\4¼^ü¡v›Çjø”}¼oã ç‡d;<$„Ÿפj“Ìp[69¼q¿-@°Ž{77Ѳ~† øË™‚à7á@€D±Ï‚gÚ#* &)…ü8,>ÓDû`Ö¡ $ N–q!abEW¼X-yHC…1ó-’ÝhHAš‰· ß2GPão™NØ æxeV¶ãÓq›®4:@0C–š3ê M¢>+°’>BÆ}ñ%fÅ—@tÈésµêà3åèÒ»N—aå’cÅ+·.çðp›@«Ó9ŠYTW‚$°sWùø³¾GЦ—ãÓ>>æq!º¼‘¥Ï ² ¡nî¿olæçê5ªÒ¸ÏA¬g¯ ÃãþzöF«Éèk7IëÇÇ ŽôÙõ}‚@è¹ö†®';#›"¦ ˆôÁ4j`Ä4/à²R74ã¼ oAqC†Iž/*@`Ãö4RqË ™Ó÷ à­Ý^ö“ŦpôÁ˜-\ƒ¦öÍYÈpJ¼Ï9)Y ƒ–œ,æ]⥜%@PEË%ˆ[q@`]†’T"˜dõ W“±–íÜUÞWõA@5QÈìÌqÁ€ÿ„ü ÷³ë5 {·dý0ùÁÓ'|HÝ{¼µòöÙ¦·Bƒ'Ó“Åw} ½aÄ (›žÊåE°Ç_ Ñl*ÉV\ž4„€¾á; 2*N‚à°YÃô£. €!€x•4}” ÙÈ×%`HÌÎâKð4rN€@š>šC*º¬8 àV:A€×™Žêü‡k'[Ù9ÒÕý Š á'ôAÀ«×qƒ0a¦n¸¯Xp¥A à€ ·s_õ6kèwgèìHíÛ:…<¸_¥§b¾àåÓA¯0!øªE(+@Ë'@`1![ Œ¹ÆÌLóH%$©~1o€úߺh‹É£"c,„rÐídpê Ð"8 Ê ¸‚¿’úA¶íf‚1ô„š2„¿¾C€ª»ŽeÐ ‡Àô ‚>#¸ý@š5ô¬;ÔÁØ=‚½ao½ yGƒ` €ì²;;h0´UMšÉSƒ`óB$ెûbH°è¦@ dœ ï‡Û-æzÁÉeë›î<£Ð øÙèÅyAxŒÅ#Ø ÷Ö®ò§Ò ðCCP¡!è­C³Ÿ ŸÐP­#4Ô¤㨛]@`cýÌW#dÑ?D‰ôÀ AêЫ4’APë?4t%‡·_ñÕ ªÙ¦Ö š,DûòÊ⬗+††H]BCFGhˆëh¿¢OhÜ~å’àw¸˜àäØùðÄ"©L>&WqÀX¯Jàx³ô–úùè§ÕËÉ4‚Éâ$’Å=€€„н2Y\Q'‹ËÉbLÕïž,vÒÄ-ŒÍA4©¥Æ*"J„n\œ $‹ñ%f;@P3ª'g •OK'•Éâ+HÛaAÍQë"Ylû ð“ÅóÉâ¶:YŒÑ­Ð:½¢h@ŸÞyvïÁƒÏ_Ü ‚ÏÆ㨷{N<Ç5_ÅB~ׯ©Oœ_Nm)TÌ,§ …Ì–úùÈÏ.U.'Ó ð§BòôÑâÍÚˆšyú(Ômú(Úíi(nõ K„öãA¥šXLpÈKM€@=}Ô¢BI¼QïRÓG 0áW} jûóHÅôÑã¬oú輘>:¯œ>A“O…ÖŽÖP•(]ÛØWs`˜ øÅùt›ÿ;žÂO©G  ýýþýožnI*,–Š¯ÈK1  éÒJ7DÝ5PçŠ5” Ê⌠­ q»Â:@Paå8€ @Ð낲xÇ‚22^>54ô¶Á k&‚ƒ k(ÙrA™ w‡‰„‚\ Ê À‚²v•°Xµ´é‡Ã'=|AìPaƒI ÊæÕ ÊT 8ê\P¶ÙÖÈ4€ž<îwÄßð µG vþíþýìN ’“Y,¼n Ϥ;ÛRù”s±˜V>ý ŠºçÕ5:¶˜„p¥#V„-&p¡å€ n1¡ZYl3W)Ylš&ªÁ;A@ Þ%ZkN”ˆ”T[Lt€À¥¤•Åöé[L\V@¤‹ëå:lõç1þ\kŽ$Û[ ¶˜˜Wm1\¡cÀüŽ‡‰Á/G‚_Bï<9¹Ýþ}’{ŠÅ¶2ùe^L/–ò+KKyÐ!],Ò™X¡„k¸A´Åà¨)^ZÉ—ŠxpÐJ©­Ez6ͯ,Ç ÎŽb † N!okô¾éÜ”Qõdë$¦ZÞPiJ{ÎMMÉ›Î)Aà‘ÀRMUƒÀDŸ:¶¡NÂ/áÉ ¶¡Vl:§³ÉÄ»$Po:§HÐpo1ÀAàì1™sÐ|õ˜v{/¸éÜ yÓ95ÜMçþgp,ø¯X[ !iœÕ  ‚O'Ö#ØQà_rªx‰ÃŠ•–3©X)Á¼´˜I•V¨¡˜§¡7¡mw÷ v ä JKâàb< ŠKÄ2+î¦J¸RŠ¥2Ë…"q`%•I¬ ;NôhuuõÑîw#]N¦AÙÍk”͸SJXl­HOÅMº—U,i‡ ˆÚÉM¨4mÅŒRyê桼  ›P'¦»‚ Žw€t²½(Q’ƒr¾DnV ¨"M…D—ÛP»V.)AåÌf»^¶l”{”å?\Û2üm¨agc½Ë6Ôײæ&U›ë €’·¡þ »Ö‚Å|ƒuE‘õ-æ½üMç—] -íŽÿËxЕ¸¢(@ÀQ-àJ‘¿–ŠÂRfØ)äU, 2´û(üo¨A Òµ‚ÔçÒL½kúµzG’Á´ÈOøƒi~¢Ô»J]ý¹4êƒiÞ›ëv.͵×Y|sᆫ›’>>¤¿h„8»>âAé€î‹ˆõ·üÑÛ-aLÇ?§†¢*à<›Êg‚ œ¼²ËŒ"…œYu¼Ü]]}9úåd!(>Ä~sçÃ?»ÒeQóö¤Œï²ìˆ!º`Ì’[ó˽ƒ ƒ¬Bjäï=<â¿gŠ@}0 ä*3ô !7E`GƒGŸœC`ûôdñA>ó©~AFa2‹1DŠF‰‚A@°5>÷¦¹;¶ƒi4â ª„=»>ú Ð þÙõÑ÷ UŽÀ›™Î»:è+4KéÁBCÞ£Ð÷ƒƒ`/<HþÁ4wÇv0˜¨jhL0>Ö 8‹•Å; @Jﺋ„Ó~²¸7¤K±´ G)Ý‘,.,Ê¦Ô Ø(ÂÇ(”F\èË/o}õüÅ7cJ¨¦¹̓i&Ó}ƒ+Ö’ñ ‚IÁÏ5ÎÒ#€NÁJÌ›EºèL=(õÄø ÅåÔR -'§ þLÔ. HR™ÝØÊÖÈôí‹…^†Z…üd üž@ðg9Eà*3‚ ¡ó‚¹H‚`Rή×´Ý»þZÌçO± L¬ó·Ë/ãŸ[CÑÓR¬€Ude¸¦ ùØ2Š¾å¥fº+ËF¦¯tôOÔžv[xöhuh;Îù À¹4Û¤! Á Æ ‚&Ú#,.Þý?{wÛ4püÝ^½|Ä‚`„‚}gBbB 'u2B§Tl^ê¡B±²t©P·$j”K:Ddh•xvÇfµÏ5ûF¯±S×_rÒ˜äâç¿ ™­ËOçç⧸ú…A‡Î!¨&} ¨‹³Œ `s†àïl!ø€Àw&8»NYüDò‘èAP  ¨ëýàLg¿7ˆª³\@ð לOŒñ(5íÕ–Æ?bÌ(™}‰âôߨ¿Ÿ¢líÁœ ¸‘?‚WÙCÀÞ‰t:&vÓR YÔÍnpÁ! §5’®—*È@† @À;¡š8í‘@RzlmÛZ I#üÕ7½Ú$œ|p³"G+ˆ¥¹ƒàŸy@|œ+rš‰Ú¶EÇY”Z*ÇÃbs‹„«‚p¸Vĸ1BÖ«GÒ›*‚ÝHrªdÓPÇ”H8a”‡„ÿviKoˈU@ð„s45Ý@µh(‹ÚüBpBBé‚›œ¤ìib ö/Á{€`\Ø€`1!ð/+DKF£²¨Jøªf& ª‚ ×F^ë—‚à@àçÀÜ!¨¯b–S&IÙ42‰p–nŽ«‘`ýºÈÍ0dRC¨'ïÁ”\Í‚©¾0d¿²ØƒàÅ¢Aàl0>;%’”Ec³U>!¨DΊY¿¢.–Ö‘—!*ŠÜCH&Ñ@p‡+‚¶ãln¬WoÓBÀ×í!3áÝ)ŒªD½>+ÐyÆ`] yŠÅ4 (Œ—Êdð ‚…ƒàÙ‚BPsÜHb6MÈ&üthŽë“@B *Æ! £7@%y"Øbš7XL“3þ_:ne@ðr^”ÓA % ?‰ñG‚ýT<ªx’”I6”±Å4ß |,¦‚›‚»¹‚àùÂAPwFm’Ä4œ$—÷GCG=‚&v+P ±*Nº˜ækÓx,@l¦ƒ@Åئ±©„›¶ÌØ#ÁN4Øk 2Öʼn x} Á[ÿR™™?€M•9gü:lAãß½¨"V\"ЉôA"²¸öåYSå"x Í^؈@ÑÈA4‰Ó[òFËDTå"x=Çš­SàM4 áDpÆ/PÜP9À’Åñ‹àZdø†‡ôØSÇØ :¦±!p3@_ˆàgXE0Äe©ãð"¸ðb‰@ÏÇ$‚6Q›2FcD0›:xùÙÅš];"àWCŠÀ2h@w²D€÷t)ke½"€þ:vDUäìˆWçÖ€ÂÄÔ®OE ¯*~f …“-‚Ë^ !EJæUöm ˜(boþ‘G9k|!'‹·¡€ID©VAˆšð@€µˆAtE(¬]üÞÖ˜4´L†W¼3éÝòXy8cº<ÿÌ?¸"ø£áYC?õ/#xS¶§ÔIÁËqŠ üæ£xªìˆFOdš„FÀíÊ~«9Q•*«vDÐ"2}"€þZb &…‚,RëŒú܆Aì"øm˜é£@ÁÏŸ¹|ðìîÝàyCl‚+C&°s¾¢0 ¸ì–“ýa€ ¾—=°=EP ª{Þ÷h‰ S'ÒYnÚ¦åŠ _ШÝm¸o~ô°S#GøSÜkŸáFv©MõnÞqîÐÔŒO»qº»aêºÙ`/ÿŽhØ"°Ì6Q½ŸæàÎiÑ雦ýÔ¦+‚Ž‰‡ÔöQÓAÓþN^àUnB*‘%ÕMÔ,Ó ^·3ãÒé¶ÑIí50k!ˆ¬#8àäŠ;Å>õM«b‹oÍrõ‹U&µ„ÆA€÷ñ¡–if‹i ÃŽ*Ù’a”²ÛèãÈ‘\©täxÿ9G­b§C9‚>Qî¤bµ¼"x úËB%vQ"0ÁRÎ4h¹8'D€ÏøûŒ0À¥j¾ ‚wD·Ÿa·Ÿ§íïpZXà|«È´S*\< þ¤s6jÒPDð7ãŠàn`’໧Fùiü <Œ7$Àz‚o¾yxc ‚+ßî| @ašnÙ·-–CˆÀ­Gp!éõd´‰º¡D`{`0Õ4£‘M[,³tât×AÞ½ØuEP Ž®Ø觞AÇ$N§æ4vƒF›Ö4ðtº‡!=ÕAM~Amðd 5 ã¨Õzvj ë¤ç¹Z~†3è¤ù0‰Œ¡e³ç®~ÓÒ#`TÝD åŠÓ°=Ð1DŠ+‚J‰"¨²#§W–ìSÜêA‘ÝÂó¹'eDjÀ„ˆ–Y{"è‹A«O6¥ª+ücC9ñ¡Šþ-ØÁ¹˜s¾ÃE[ ‚ÁYRE6O_•Wçë iC?¿÷ìÞ½ðËÊ&†ÇÃ&ø¬_dfŠÁ÷?YYÍ©GðÏ„’\@AÞDò3Œðâ³Ðdt¼aµ6~ÂSr¨¯!ü©ƒ*DÐ&ö(H}ùEàüuÛtÜ4@<²7M~*)?"¨ÉßIAA,)#ê½ÊÚM,'‘A‡\ ˜`6oK"è™~¼V•ïb"ØßBdcöE£H¿è›N8ŸÝëáÅ;ƒпk‚cÇ*85J}~«G§âä†W/ÛKÊZˆXûÔ©7ªvŠàmùKW…ØÁësä°ìÁûï_Ä—c-û—Á¥9 Π˜à\­×Vîìyù,y"øë›\/G žŠ<»/eËwHhDõK@%u±|ŒºÊμÕ&YA94+³+ƒ¢-D@mv¥ƒ>2Ì ^ÅV楎IÃ" zg·R—y&‚šNÝÎôt^ÅÇ€ìNkÓ¼Ó3žZÛSãO…šü!µ½„ðšìÝÏ¿“,‚Ž½¤¬‰E‘ÊƃDŠ fj~F(µzë*¯UUü£CD¤BpWQ™µïªˆˆ€Lå@Ç°Ñè P¯sHéÉ*Æ… ÖªÙuGdZ­#GJ¼ÿ£Õ¬A9°Ó^‹U“5¼AË€:ª[Lì%eY,"(ò%e;E°„­¾Ñ*âO¹@qnŽ% ´ZoWs}òGsø]Ž5œÛÙ¸¾:]d:x‡Á”=ËÈõûì'ÎÎ1ØÙ¹óÉÁ&G ÅÏÅ«þù³ç÷Gî5‘ª.n8I°àÍ“¥Šûý÷ áE Õ#¸ôz$¡[S!DÐ!Œ Àe=ó#ŸwÔaC„ %¦°€¬»–ò*?ð^ó¶êçBÃÒž,V‡E ÕØ{ª0Ùñe4%x©Ã4 Dm!‚z ¹btŠ´@^ÝÃáOe"0ñ½@ÅÜ zí¾“$þÚ·S¯æ‰4;èˆT“ż“™èEåÉb­"àwÍ2ò»„ ,M|ˆ+—½ÿŒ†A©rèÐaþ•Y–àÈdÙ¹,ÆÇ"0+Ghegé%Ç~°Scé8[%àm/Æ…Ž--yD€$–”•0c(Çî9õVÁNdñÞx›¥xKD­·X¬ðv½±Tñ¥KKÅ e}·_<ƒ”1¾ƒ 6™cØ‘ˆx²øÜi$ ˆÈ~ýŸ¾­Á¶Œ@9’ ž>ÿ— ¶¢ìçI¬`ùÓ@`éPQ‚{Á;Εòkx ¼Üz’^€<¨k‹@Ñý« ºDêl0!rçN“HóM  îp@ˆ@'Rƒf ‰d1jL ð87YÌ' ¸àœ‰Ùkc‹ßé|'G Ç—”™DùW_mÙ¨Ù#D*;ˆP ;3Ã:ÑĬ!•¨=B¸kÖF%ê;ÉbÀn² Ág ô‰.8¢è䎀"“ÇQÎq$‹Ùiö˜ n•DP 2LÈŒ½ü;FÖUX?€%eÖTY‡§6FŠ Ïº{Æ])Ú"`Ñ& ™ìF>i(xe±qQˆ€E€u%rYOì€ °Á™­€³çÏ'VñGWWB.$÷ïÝue`_îÝ}š< ,A0® nxLpMN V®øÎbøçyê\Hx=we±Xêj­% ê·3 Ǭ øØÞˆ¡EÐ0uÒ ùQ"@òV‰,K#]Sk£EдŸ*DÀâï;É"(ð%e:µÙî£]$ 4;EPC'B*»43Ó#R…È"8GÐ *ìwD0»–ª|Å®Êÿ'ê¹³†@˱>Q1+ðŒ µÐÕ v÷2{÷›D9W`KÊ{UqI;E°ÄÖݲHÛ³G! .‚À½†Jð€˜5ÄàIƒ¬À*c¹0w8ïž1Äüù„G·WÂN8"¸o§×ý½{Ï“e‚ŸŒF”§YC¡] \ù5ÁÁÀ6œ>šÁÉZ"¨ïCA^Ä[?¤ºdcþ⥈"¨Õ‰£«£D0x*ÎyŠ`¯GäEnn*D&Oˆ®;ëО™Á@[Ìò‰¿™ ½žˆ E<"ÀÒ2ò2ITYKõ¶l¨NdyëᇆLžf¨#D ¬chH“…jÝ"ÀSk{ª-ehhßiTaÈd=+(Lc>j!‡†‚V‹¡!àâƒa"‚ ;TË Aì4¸²=¡. ¢ƒŒ%I€X7}»–›H¬14d¸CCA+‹e€Ó„—³çζøþtE±²Xœ%T ~\26tûö‡s·oß‘òÈ0AŒòIJð$,¿ùð§" Bˆ@W¾YCX¬yD …OQgõd1ENã!µU“ÅxêêÉb|§Q"P‰ô6é¼B¦`ò7YÜó'‹ v²xÖÝkð½†ädqÁ›,Þï¼ÿgÃ$‹s#D€d±$‚;%‚Áñ¥e"_@&2yi2æ‰>RÞd1ûuÑ#‚’›,>³–¾Ãð,#2„þäùó8K#‚UDðÕŠËj/ÍÛ×®C>®õi™ƒq!„‰ºù$<¿ùÙ|Š`Ô¦s¼ïq`dÌ!`T¨ ~ï€Ë–"Ê‘‘µdºéNµâAðôQ7$P|"hиp;O„™>¼û(¿Kh­'"ÀôѾØ\BñŠ@L –àÔ YxmóJ•¸ÃªT™%=L4‘"p¦ÞòˆWr\KÅ"Àw›KØ‘A+ÇDˆèìÙVîœ M‚þÒ¤F×V\Þ!!‹‘üßÿ'B‚`ž–“nÁ÷?KEàŸ5ÚÄÈ°÷?;è«NÁ+‹ë¾ 6^`XI ˜üuŸYuA™ºÓˆ€u¥­:4ôRCZPN|¦ÿªCCxª<4¼ ŒÔ4`RSò  rp) EnAY`=ÿ‚²ÙuDL¯ÅP-RË+yA €Óì4`RKA·-8Ù ŽСSœ ·: DºA™Á’´ ,„° l¹õÎ;g.²ï€h`™JsðÆœÎò³s œ%@mË"‚;+‚2 W¯¯¬Å‡_#i<Šï’oÁ•…TòR/v=X ^t’2mbÔ5"1&do1Á §m™„ê,†I‚v”d±&^µ"ð<µ¼Å„ü|"°mÁE°RC[L0ü[LW(ón1±®ˆ@¤‹º*ùDPñn1±Ôç­áVI¸îl=A¾Ù£€À):GŠm1!D€e‚åµDäïÀD NùùÜYÏÙ¤ˆ úVCqG@éYð[â«•0\ÿ"±˜ á&xôåÆEðï_@˜SôWta…N ¦¦|›Lü(㪣®ì”MÐmøDP  †ž> ºN×qM•¶˜«×ü›ÎáÁ> [bGˆ@“k¸›Î•ò3`ַ阪YüšoÓ¹ý‘#Ðê;(È›Î-39¼dŸâ\‘+Næ’ øD€¿*²!·Á›om:'Dð¾c‚b˜Á;rð."=0ç,ËÒÙ¹äŠ îˆÈïú래àöõ•püþ÷s<Iù1¸Qö“Š@µë§òÝ:6†ÞbÔqE.GÐ(hz[+4vNIÛP›¾m¨Šž3žeÄ®Œ\Pì¢3Q”Õ‰ê«/(ãOµÏÅ6Ômö½ò6ÔöwjzS"IÐ"P=µjªfPÏ´X^`ÆÆbݶ5µöÚ€ýÍnÇ,U·v½eö©¯©Ö\WD*Y³g”Š¹ÃÇ<"GÝm¨1Ø6…’Ñ/ZÇŽŸ”Lpj)[Â~Òljž0nyEÀKŠ ”œŠØfæÞxß+À·¡6[!f ³§³æ2¾Ã;L vŠ=NíåÅçܳsçCÔ®»þbb"‚;+2ל `AŒ …4Á³$Š|ù(’ §"`À!4ÁuiÐMĒżõ²ŸÝ£‰V—"pÉQ~t2KÈÚõÁ¬³ï¨+‚³/P¢Ö¥''ÁqyÏ9‰7N¹¼þ¯;Ø%i¤Úõï;"xÿÌ%öÓÞnTpÉ{ÿŸq9kO’¦+ŠÏŸÅ!©"ˆ="¾þõk×®^û #ˆ ûl4÷ÊÍÂc0A*°1€±‰Ä(á¦"DÐ%jï '‚W×+³`ëEpÂÆ@NI"ðÆ€àe`´dF(n=šÍÁ_HZD€]&6Lç™ aHÁýÅÇq›@.Lã[T&† ©bA]Wkˆ©&m d’š$üHË2Ñ Ó\˜ÀÂ4©¦#ŠäU­Nm­ àd"HEðæˆ ÀõG†Pª,Dz¼Nü]&‚#‹À-*Ç…Tñ‹À%ªR¼1Y"H#°p=Ayñfè¨àËu‰uiø¬¡ ÑIg y<Š`vÜ"HEF0A*Æ—ã"€ 6[©Rø=°u"x}"¸4V¤AL&x–øË•ƒC‰A*‚—cA¤"8•Š )x/®YCOË âÆ“p,$R©v§"HEì4",\[· Ìä‚/ÃîDú≠A*‚TiD®~5TyfÃHï–“ÄÃè‹ âA*‚Tû·ŸRüõ­ˆwn_||{!ôb³ßwïAèⱉ A*‚Tð@*‚­Š6°êX Ô€q¯œ0BoA÷p{ˆ ÁžMA*‚·'EzÂ"‚äˆà÷mx—¡{±o7v®„^UöÀæÛÅû“#‚T©RœÝ2¤TÐÐ<¸{Ÿíç66¾ýf~S€ÂqËý›‡ß¾¸"HEŠàØZ"HEðç_ôˆ`a%Jy7U`Ž¹RñâÃùM"üös¥¿z¸˜Š *’!‚T©þl "ø«“€H"Fƒý¼S'ß΃ Áó2‹©B’Š`_ì"8¸9"HEðçÖ)9 ˜üˆD)X)ñi="1¾<:&p Óü=Þ5db¹Š Aˆ­†&@©DØ¢zNÁÊ8SÂó›Èåð"¸âý× _˜æ‹]˜&A*á€T~$6"¸^¿ýT2Áçå±ñÍüdFæ=,†.Ls!-L“Š A*‚$EŸ‡Áõ¯¥Ñ¡Ëcc~3¹õ$<—×úçM Ó¤"ø/œŽÇ ‚·RLdD"ˆ ü?"˜Kb†4á³Å_I`1"¸‘Š Hm¢ö‹%‚Z³Ù ¾j°~j1ˆà@°úD}ˆ ÕjU\lvíú¸E~jÈ’ÅñE‹ó¡ùj}"¸5¿!¾M„®¬G^x4t½‘„¯Kƒ—r šºÞŒ"üÙ扠e8Âi*‚äÖ®ÿ›“ ‚+QD0Øcb~ˆ@$ R°MD&W`âEðf*‚DD᧠ýfþ¶+‚ÿ?ÿ [©& AâDŠà¤‰ Í„Ÿ6t}þš+‚«ó/|²\Þ¤"HE0›HLPíú4"ˆ¾qCxH³G7øÉ¿MˆGÁ?~AD€Wé ÅÓÝ:‘VÈïxÿâˆ_²ß´©ÞÅ/@¾ QÛlð[<"p:à'øÃîìàÔ¹Ò0õ] £jº®©™]–Ù&ªòŽøSºœÞ" ç7´MkÚŹh$²ju"]šÝ:- p]À?u¯ˆ ¦ö¨×U†D úAEÕ CS+®ZÅ•ÔŠ›#`ǃ*וœiP¯Ø"ÀõÃ-Óˆ¿Re*‚‰\GðM "Œ ]ƒ’ ‚/æA*‚ ~ˆßèÊ`‘M×/‚Aâµßш£e\àž]ŒŽNœ¶bk Ñ&e‹ÀÒ¥§ÀƒÞ¹äµÔ4rºœæH‹ã©ƒ"h>µ#E\²¼"¨ úòŠ c§¯‰Ó«ŽÒ'›RÕþ1¶§ÒˆåÇ=´:rdè›H<¸_N„@$ 0G¢†L 6Wx¿ëšF Ë+‚6 4áAÝ+¹v*ÿ¡¹ˆ?!x€p‚3]á  <БŸȽCòÇâÐù ¸¨sx.DA€äEД?µAI3¼î Þ—¡È"èþ¦‡ë¶ \ßõl̉àp‡\ŒªA¶­þdİ휴åÜ×å¤n:w%šnF(Ls!ù…iü"¨‹¥ÄV»í‹¨mevtðZÌìØ‘Á±«ìÈ«mòŠàÈ:Àu+“±tôï\¡n§³k:éfرËîØ….»žWqD`?奼Õ&[èýeë}7ÃþXµÝücÕØõÔ`ïÿ¼ÉçBpŽ Pøê+ tÐdGtÐ ÌÔ êvöí³?µ™~Á¨Iƺh²—}I"€ Šv,²ëð€‚¿ÌUtL’#‚ƒ‡9ü‘­þX)"&à"ÅNgâDŠà¯H€T©2±"xüd½ÙâÅ…iF•ù/½wí½kWÞüÂ4~ð?È(>ÔÙûjªcߦòˆaŠý—ñED´““QÄiÇ)E!ºRví`ï}•]ÙÅ1‰:8B ŒOµ10„·ñK®€øOPS„êxÿ#¶@Ú¸A¤×¦9èrzÚw!´Ð_—çÐÁ+t˜,îtì#>µ53òÂZ®p0*û9èk üCÌrpCNhpP_‡ñ ïÿƒY\³E°¬>vt‚EŠào&Uw¶G(L3ª¨ÌGŸ}ö3Á{Ÿ}4ñ…iü"ЉD:xjÊŸ,¢eb„ˆãOóv‚)75 à]\éس†ÚD"7 uqt¦¡OöúÇSÄžs"GÀ{ì9‡ÞåV—H³†Ðåô4.L.„¬U vè H.øSï¬!Ȉ}1=ô5AŸH™å°ëEöþ7ˆTwÖPpDÐ'ÊþئDT´EÀ£ Áû[*‚?=¤Á\yÛˆà‹"ø»LÿFTT`°ˆ€ýü(øŽ6Y]bÔ Ì0Rm"5Xn8‘D0¥°fÞ¹²‹‘g-U€±!`i„IDBxŠWnïÁ"hu¥.§§}BŠy¶x;è‹ÀÒÈÐÔÚ°TÖÏ@¾¾¼V•ÿ!06„ Š+‚Àˆ b!AO$‹Cˆ ­]]iDpgûˆà‡ð"@]šQ³†ØDŸI¼›°YC™:Ùtó£E ŸûE u ‹@4e4È»âü­®Ú"À­^H½‰€¼LO“—"ÀC ¯pÈK`Ž GC0€87"h’6u?WpþcÚ©Òˆ Žb•n†`›ˆŒiú¨ð€à£Ä­#°4âèù¨"Øi3è ª x «jW§`€Aïq‰@ „>u}jƒÖ'‚ƒ!D0;„¨]ŸŠàÏÇ$R+_o'܃Àg’&ÐPëDÔ:4´ÓEtàÁÐÐPvÉè"UéÚ"Ð}CCÑ{€Øu˳²ä…Å!EPo;cCè`•ÅQÇZw¡¡ë+h‡ óTå•ÅÊÐÐÐÁQCC ôÐP*×1ˆà¯&&"øQql"HEà÷@’#‚ë‘"‚•;åí%‚/Æ44ôQ’’Å* t{_9ÞÔ4œuF‹¢pðFžFm1q3îÕp^@CU m‚–o‹ OïA"¨µùÍ‘ò\؈“_K ÙƒBv=»YšØ]hŸçSCòw¶ä½†*r_Žw‡¡¸.BAß”äXHàÙbBA*‚¿¶EÁýÅ0DôÀ"çÛ`q»‰|”¤é£Î|L-o¿á;: Ô«‰À5HÁ›#˜’:ðm:×ÍøE€Mæä]çüÓGaï¦sRﻃDðrMsÕ¡LùÂP  ®%w“‰A=EA‡€<}4xÓ¹}©/Y›}òî:WtnóEâ©LGäMç$Tðg¡Dp\&î’Å©â¾ ·éÜÕ•&XÏ~¸˜<“d|4ñõ2ªFºi¹ÉâŒÊ7‚î*«-(bƒè¡d±ÛÁjÛPï°›ëºÖµ°å°êDugA›]»Éb·÷Àe QÐô¶VhL;8öÔ:µ»µ5DÀ¨ã M»ƒ¦¯x=œa*|AY¨'”­µ uA3Ð×ð6ÔfÏЊ–» uÇÞ†ú žÊw™¨dKõÌÓ€<4”3úŠ×©bAÄ=çÀlC}qÓ=î'c÷Q0È&ø(Y…ivñ‡PXDm!Sîk_œo¤RåË~v»„¯]ÌÞ!BÔ¥^}uß0n=·ác¤Â4½¶ëÒU—æXbDpf›‰àoL@aš•ðx=°*”[ãÁ»vžà#Ü(„'c9 lœ$àŠl̸Ä(‚5 ”m-‚?ƒƲ 5¸›Ž½t=Š×ÅĈàæXDį^\LÈKÞª+aåR”‰4gÁñSÌÖo¶ßsöì8$5(ðªWÌ*øÖY{üÙ¾ìËxÆñËÌ›÷æùû/ÏC~û=˜æº@€¼O*Ã×@¢QY¼7ÖÎfRôD z €üZÀ_«âlŒ»˜Æ¥CFÀ!`ó ‚¡#‚×!Z@ AwýTb¬ÖÍfAp|x½ôŽ‘ ý¸€•!µ!0ró|º ÁwØ-‚n‡ŒêC€ ΂2„R;ÉXOî¯o ¡ÀÁõ: .EÆ Ë²x ˜yxvöìDÐý¾ úAð*„@<›*‚©±Ú­ìu÷¦LÜ`Û¹ñâÖÁ¶®7à (–¨òŒUsV'ÜÅ4)ñA4‡à‘„@|w½l×Ø¿G) “æáIn´‡ƒ­ƒF€nm]¿Ùè¦NÅD=¶k(ÀÁÃB:Þ8!ß]LíÕØl‹½GÀ‘Ö¡g7oö€ÛcƒB 4¯ ‚7ú†!@Æjlö 8ô8 »KKKc} AµZµ-@ÎÌZ„ Š8@‚Iõ!Pe"X0èdÍôŒ… áCðv„@0FZ•=7ò!ht… ‚ Áè@p[Ú²T™8½G öGŽ¯ i Á‚é•,B0b¼^ÁÅ0!ˆY³6É: õø(ëÀ¦—λWÜЂ?„!Ш»¾šµ²¹Iu Øfe&‚¡)ÇGå¯ Í#B]j¹¬eš5_Ü$ìÒ‡øoˇ © Ž•!¿ ¯DÔ†àÝ:C^4ÁÅI… ˜Nl9^5$ôf±Ï½â†¶p­ -G„!@bü?mšfš¿©2 ¦Ø0ïŸÞÞÛN‚ª, ÕZB°&‚O'>}‚N‡Œ š¼¥?ò›*G‚ªÿKga _YÌBðÀÙ$¦à+u 8‚›ÍRP‘ A…ÇkÎbš”ÞÅ4Bðþ(@PËuÖz³0(„a ‘¼GP*’³Óze¨Q'¥(‚ÂUL“’\Lƒ AzÑŠM•šB€|Ü1Ãd`…'‚ið­ ÕG‚þ•!„€;ë@h Õ¬ ±NȦÅApo0A{$ÈK†àxø•¡F°­+’ ØçqÀZF‚à!x[D xoÄ ¯YÌpovbL* Át²óIöÒÐñà@àDP–Á—u„!ßT‰H€ŽŒ:ÈÆ@pOà8Výj¹A`kqj¨Â³C0O„@>êw×+AÌ8õK:“”†`Z(tÃÇ5‚º$Àl8È’¾W¼à½2„ 8êªY7²1µš*Ù„u³¸xþ‰€€!XuÌ.ò÷Š –[È9 H! Bð:!@Æk¹Ó“½É C{Âß>Z^Y=++C¥† ¥ R–ù®!–=W†î ã€x`sÀÕÔŸ¦¥7”yLMzÔÁ *(« 쯹B°†¨ÜKƒ( Á‡Â„`ÜÈ:N|dÙ@u¦“‚îøo# ô¨Ñ—#!(W'#A¼#’Hꮿf™L—'~ZCPq\!XFÔoªDä7UJ„à¼OÂk€ {Òû<Úêm!t… à>¸B`sCÐ.¦ùFŠÉ#Ð!#âB ‚7"ÊAO_3Œ\>ögû°&T‡ÒÙ-ΫÁª+u}!Xs…`žðBð‰X,ö…”Å4Ø]¯?|ùÑ8¼Z"]ísÀ¬NF‚i¶³X)ZÔ‚¦|] ÷ÊW1ÍÓ)ÝŠiU+‹Hçë‰ ~ìtÀšPv‹FÉ´ B€Ì2(ÌDpÉïéQÈ é%€7LP¯‰ ©)´—«–3ŽÝõ x+BÀYP64ã›680· € ˜^—>‚âJ‰?+EÇ´›²=",xCPV„!@âyp ÒtV†’»$Èø‡À¦½Œ ·€,g®Rž¸Ó¤ CFÄ¡ o ÁÛ"Á{•‡`ö¢ œJ>(ï•¡~l=!¨ÜÚGöwlHÏb„@~w½7mïø‡@ve1ì(Ak„!ðylHÛb„@:ò»ëåA0>‚%2.Ì=‚‡ƒ€©£tB°®'W)õ:6´ÀA¸Å4™Q†!@âÙqÿÜ!"H$¤B@úÛŠ½! ºCàs· øt‚¯¦˜t:dD=x™1¬Áë!°wD‚é¤A³:r”©ßÝbv³xvv6ÄSC>šQ„!ø°HÈf”!`_1¡ÇÌOÞ (ÄÿK&$ŒŒ†½4Á;¢Á‡Â`‡lj2<¨6…¸¾lèHüm€aCÐN!@dB ±»^ ò'‚c'tä X Ôÿ&LŒ 6U†Á%@ gw½\zP)Z ¨ë ARÿ›2!ðž °²!Ð{ˆÓ£êBÀ jMuʤî¼X¬?¾nHƒÀÈŒ$B0ñû|ô!HÈŸZ}oeÒÔ‚ *>Þ;·/ Ñ3B je1Nsd3²$NMs*A@G‚²åÌótØ\–‘‰Bp1 vl{'ª°u‰äÓê@pL™8 ˆÖøÝÐSR ð9 ¯2A|Žäù!¸]­‰ CAR!šâñ²![ü¬ •®H…ÀÈ d7UN>F칈BÀÖ¼[ìïUCt%ªE*!(ŸûÜÐ¥‰@2#B€´³ô˜ý˜`î½G0 U 5ª?>.¿pE>g¬,FÞqà£@M• ˜»[œøIQê£ÁUo|¬ •~1ÓŠi~bòtȈzÀ@ɨBð„ d ò+‹à‚ ãd·¨Ž]€’ób±æø¸Sö8@1Í_Ã*¦qB`dÔ‚!ß]¯:#Aâ©À$ðõª!ꈖ”Ï€ Â§¬tiæ³=Ú}?üEhÅ4ø™!@œ "&‚dâ7ù¢|Z#ð®!Èó.W ö{ù3¾Ã>È?ueæs3=þ‹íý,¼b'F!@YÜwzoMöråñü>Ù'¤ï‹{öm;ï–ǸR?ÁÑcŽœ† ÷pwNVö˜ž÷üŸ½³Ð• Â0!4Ž»× WÛ»^Ü"¸»Å7"¸DpaíCàå9p'ÊL™Êôôf]ÓïHÒí¿òevÛžçÏŸ÷âLö‚ž  ÃB_Ê#6`!™Ngîãd³9"9ãùŒT.A~.1øÉÍ#æYX0ø,4ge{Èì§=dj°@"àÔY±·F×@“k'‚«ýŠàÍût3ˆ ð&@‰TÚ?vìè±ãÆBîc܇ØƇ|'O†}ÒX¾OUVúÆDð]’%ER|˜¾«Ÿ¦* \UT-@8YìØ:¼H;„<½õž£‡A°¾à¡Ÿ+e‰#•L¦"ð¸,Š€ñ2,‚{·ÈNÄ|bA€… —ìÞ Õfa@™A,‚X#ÛDöéh¨m˺Ú”ñðQº‘À£ƒ2SÓìÁ“-EG~1ȼØR´¿\„¦jŠFÌHµ¨HéË’ Ê3¥4}`‡FÔ!Nhzt $‚0)lQ"È‹"àÜ›à=‰) ‚%;÷ï?P7Â"h¢?‹Æ"ˆEPœ¶#EðoÏz«4¿¨"àß`õÁDð‹¢õP¾Eˆ€pŽ”ª§1tbE@„òÔ=膣‚Â"àD‹àë9Î×l®PIP´VïÝß8äOÆ;U6§†Å"(ƒ²"ì«L¤Û²N¼æÛÔ@ݵ¨}rã*‚o‚þÁl­_`ë€FDZH†îØ㬚²ï¢EP°$˜WPk¶íG%ò@,‚æÁðXÕüÐzÁkGϵ5D@#•êU|g"@XE@™b¢tÚìœ |]§9¬C.ˆI,XŠ,óYî°Y‰¬BV¸tŽqaËZâ´P¬[ï²ÙˆlÞl¶ûöík  ×±ZvïúF‰`LÓ‹¸j=~-»€žXÿÚ»¯îÆ‘; àtt¶5뜓œ&8ÛzÒ¶Ò$IÍî%…ÖÎ~´6oŸ^-µ‡N¢6aóróòC´3åÃ×ù :휤^IE,aP¬*ð5gžõ›‹pî~ß{S@ `²˜ýôAÀòa–Fÿû5îwìô11w2~Ž™™ 2w–™ðË~Û²<ä±¾_¸‹'?}Y:Ïr4ðÛ–åÊY®¹†Y‰¤ržÕ kç©FR³v£4쳬‡ù2/ÁWH®Ÿf“å‰0j!Æ‚€ `üïçÖ­î­[ßù+¿ øgÄ]&€ÄFðAéà,üÿcðÿŽ¹ÿCHÁ/‚0é!€hA­…`·‚ú~_%Ðó?>J`ŒÜ®—AòW¨ƒD¾Ûùù¿ø¶OÀ{˜†Lû¨…àR2óÁO2ƒ`)VÒ7‚à °í&/ASOÀq…€ Þœ 0¾Ã8{°=ÔA® ¨Õ¾•Óû'¾ô„!p]ý¦* ‚çŠ x³tàó£þ ¡048#Ђ¹~Í…`-þ`Ÿ‡ ^¯ÿ9_ ¶5†à zMÁ›F$DÀF€{œÂLg Á/fÆþà«<L‚¾óâ}}!r±KC¼Œ HJ`Ò£ +îOÁƒã AuÀcC§ Ø>ý7‡ ØRÁ…úÀĤ`Ì€ P1PAÒAð9 ÖÔBpˆGC 8—/Árg9 A¹UŽBpµu5 Áµ•“FPÝ?-^_ÛY;¡oá#¤½›=tàú¦½×‹BÀoȸ2/.Ò&J–{,N´T)t€ @äB ¿s?Á#ý!À>°Øívva X]ö/,#—½®W èEï }ųçyÞs€I`7øJ°ïìµÛ=„ XˆAØ…QÓˆ÷:îS.š?Yl_'2nï3p@&Cpéï Å@PÔˆ×ív=„ ã_è`#èt½n!èxþ…‚woèFAˇ uV Öù/Mü³Ój{íBÀbZ»0ÊaqÜ‹§R$FÁ˾ðõl! Fð>jÌü" |ŸL/‚ßûC èz]¯@Påî 5‚3êûü1As§Ýöv¢x훿!#y˜FØI7M ‚Ñm×lo3 ÆjSJA ^ ‚‡…!X”»ñSFÊ^×»Š\õ/¬ ×<Ï«ø°4c Ö:^§B{Lp£íµl„Ànµ[¿!ãJ½P>'.»©2IŒ‚—ùl7˜cÁ§©ðeê ÀF0£!W H÷ÔPýé§×ûËHzáa1ûêM‚ݞÇśו>5ô4 7†0Vî!xž&ø°4¿žc°(m÷h”©o¿ÁOâ¿ði €Ku›“ ‚íØ×Ê®kóø¨`Š–›2SÁ( ðû@˜ é'‹Ñ# ðb± ð©¡dæ%@°¤V/ú½¡mþõ0`Ü4‚iw`¬…²›§HŒ‚À裄àÕ¦C ¿|@z#P A©ÿˆ€k?Ék#°¸ÏLô@°ÑÛå „`Âqãã”&†Ý5*Éœ,&ÐèŠFpŸ>fV#˜ƒ $Á£¦5–µ¿ãï ÅCPï“`ß<ý’g‡:nr& ÒN£Ð ²š# F0²Éb„ Y` €àûdÙ@ÀÍH€`U«©»qÄw‚ê™Áä€:0)ô\i™ 1_΂ߣF A)ñˆ€å'â<–¦¤‡ ý.MA5Z öyw‚Ýža”ãx}‚˜Ii(Ac;Ì×^ª9è5tÀ€Fø©¡ŸH†£ Vô¥²íÄH`øŠKÑK&>4Ô Ìl6 $Bp ž”Ä x<“FP–eYÜ)Ao ÎFïËç7†¾üŽï8Æ@ðèè‚ø«fSÀÇGÓB€°|ý¥j!xÞBЭœsnn6‚ùÙÙsæý˜?YŒXÑw o 9uÇÙxÇÏ~wäçØ(¦‡)VÜ!q^ ûéQ‚àL‚¯©ß®7@þd±|æ~GAèÀüüO²ÿÔÐ’6ôz8Yù•Ó+Nó?;:˱!$<:Z)œåõŽ;$Ó! ଦ7‚˜Ö‚ag#ùh܇¶@àKàl8ÇG˜M„à ­!Xð»½p î2»^%/À— ìÁ¤„Fp·2(S;Y Ÿ:ÁÃgüD»Fp92LS9¦Yå‡iª0LøVvQ‚0L"P½Y n Õ¸à0͉Ã4R/œ8nl>X@ *ÙV‚ ÅW¨Ù9Á÷B‚¬`#P³]¯“Á!ЫpÃ4•p˜ Xîv½å¦F`íy·ðæÐîÉ0 @üûÆÆÆñŸMM†i†æn7é™!Ñs‚Šùh¿TéŸ|ý¥šAðZjrçX`?š@0sɸFÀ ÓTNö‚Õ³ašêù0×Aü ‘óâ`˜ hym¯ãÀñ&Óì(¦š’›Ð’ï a‚QM4‚æª<ˆGÆ4¦I€†iª8Lƒ°ßûÛ(Á7Ù0 BÀþsàøΦ³¹é„w†Ã4éw¦ \¦Ü¤L*!xyjäo×K†@à+Ô·ë•7‚á<|xô›£#öçÙeâÀ0 Bpùt˜f•¦©â0 ¯t¼ÎñÏ~wöó³l˜ ¨¶½¶uîÀñ±å_¨;ÎõÓF°9t˜Fî…ô,øL:y†à¹Á8@ðÞ4àÞ±n‡çc‡ñÌÏÍeVÄ¿9·:ì©!«Vãnú¯¯ÛüSCÇ'À7€ýÄ>=ÊóÐЖ+ñBzœbÏë+A9oVüF`þÁCÀÀ`fçîÀïHà x|c÷=>ê³×®;aP‚dä'=xH€GÆj!x¦ñ)&‹©L1 Ò”¥‡à!ÀB€¿)góÏËqÜ&Ž©”G(y ÝyA0J^f$úm×¼ÉâdBÁìäN¾ @ ý°ðèòb±ûTÆŠ§/ðú™¥å@A`êv=5<ˆ $ŸŘÔäC c»þ°?¥`áF&‹«V{ýø°÷T5‚’h#`@!W$B8¦fû°„… g P\H}SˆÅa!Ûõ(ÞÀ‹Åš7‚! »(€ 4‚Ù”àQ%àZòÁÛ#ðºÜ×½‚\es!,ë±{Á^Ûkï!Ñ=‚-­ö±‡G‹A@Œm#¸OÓµ”0<âgšFÐIÜ#X²G‚àcàT‚Ø=„ ÕnwZ·G°¥ÝAÂ9°s·Ðëdâ“Åjç¨H˜,F°Èiò!˜e#X~*·†b÷`©2y î´°´ú÷Ú;ÁNÛ¿€€‡@§=„@ð»sw5éÐæ¢Cð˜x#È‚ö*á@îÀÁ Û#€B`±=‚µó>`¯¯Åí µv»mÜÁ–n{ɸ >Av²˜Á‡Mh B€gÅøJYz¤4‚䇆VÎ VP Î+Ázp`\Ozjˆ%ùñQõ{⸕"AÑv=A@!?P&ñ3é“Åé!`I†€°Ã÷ɲ…@ZÒC±^Ïÿ‡ÁxCð ¼…B`X#`D$P?YœV !8o¡õ±€?2¶2‚àézC@¼ÊP hÉU#˜ík $€4‚q‚€?2Nþ¾„ K•æC@LÝ>bj#˜k yjVl#`¹0OJðz /&@ÀïÒH€àCÚ6‚²„` ÁXBàNâ—JåC@¼Ä^kz#0l ! FÀoœ |³˜ ¿TIØ$ìÒ°> y#ðÛK~J‚Í<@óÅ ®Žò·ë©ȇÀÜF0ŸßFP»È“wÊ‡î ‚àuJ!˜#€¸]¯m#€÷$4æ@¬dÔz:®± yƒà¹Á8@€…@ÂR%5Ó X„ dÀs¦ÙùÀ¢K™CðfdÙèŒA~!°l+©lä8,ž˜v\Õ<Óx‚“ÅÔ¦ ”¥†àRž¦AÂa„`eg!†i¢Gl˜!†i‚ÞÍ^‚ÞÞzò0+óB6LMãH%A ‚— ~Ûõ†œHœ,ÎIO %Τ‡ ¦Vƒa„€}Ÿ´ Ô‚a|hh]€²àß‚½v»³D‡i¶Ì¦ácßûÞ× C·ë9¨èÜbÀÂ=l§Ã4ÕÈ0 6‚àÞ:¦©ã0 BÐj{í¾FÀöZÃ4ÆCðõ4'i<ùý‘APŒ A }# Lõ@t»~%‚®ÇCÐm!Áï}h6»°ì°ç!Øá!¸ 0Lc6ß’!€9ø:@†4t@SàÍbS ¨”q˜f-n˜æšçy«A%¦3‚Óaš:Ó ¦¢Ã4[ü0 ‹Ô cÁ³þðv#&Í'Í„@Âd1AÑ‚)¥ $~}ÔÒ?5Tó쳬³Ü¥ÙùÂÄu…ï“ŸÂ6€ùä× ƒ€ Ð-!ÀoÎè€0‹šB€Oâ,­í. Aðt¬|žT¾T)Aði¥Ü£ì=½Ž×«àÊh àA.!˜vÓ¦RÔ‚ï7I9 äC`Ìv½à‹Åz6d q²8o°ä‚ÂÝÓ)S,hÁ&;À$ ã 8P&¿¤‡`‰ „¨ž,Nî(AÀCÅv=Aðé@'fOÂ90'0Y,»Á³Ãó¶ôÁ} ø˜y`6þ°85éç‚€Ïí†H¾§&‹  “ųAÂksb<&ÞäB°š?‚çþYC(ÍÌ ÒO:7‚‡!À2`@ ÅA`b#ødC,·•A@–ÐÔB€_•ÑÔCP#Ìàßkˆæû:m×:`R#€¾(˜,¦F@ˆ¨é! ^#‚·ä©eêAD‚œN³$O Êð„@ M‚@‚W’!0¿ ™jhI"—Ë!8Lƒ\ÛY !€aš08LS2$OÆC0)‚»©¤œ,žŸåÒ¿t–‚`˜!({^·Œ„Ã4,0Lô Ó¬µ½öÞuó†iL†à…fC<úAðâ|B@d3PfÀd18`@#`›Áj8LS¦±`˜ °ÃašzÂ0M»ÓBZl!FëaóÁ÷HÓ^b¯%äC€@7p`ΠFP)c#ˆ ëµB`˜†Êv~˜fÇÐa“!(|ªIùÜÑÛõê! ¤ìÒ°> y#˜c0¡p‡ÅׂaÜ®÷<¯‚¬„Ã4,8LS¦Ù¦‘xa\n ýøB|/G°]Oä¿Ìq GO Óp{~êüSCþ¡¡ä§†ä]žwp!>EAú9–*õmøAö‡ÅK™@°’ ,è@¸Pö” pGš±8#h^‚Û ä‚à½ê! F 9ßœ³ø×­ xö³s!H\ª$DÊÔCä+ùÅbÍ!øØŽFùoÀ×IEND®B`‚classes/deactivation-survey/class-sa-smart-manager-deactivation-modal.php000064400000034227147600337620022743 0ustar00' . $reason['html'] . '' : ''; $sa_reason_input_type = ( isset( $reason['input_type'] ) && ( ! empty( $reason['input_type'] ) ) ) ? $reason['input_type'] : ''; $sa_reason_input_placeholder = ( isset( $reason['input_placeholder'] ) && ( ! empty( $reason['input_placeholder'] ) ) ) ? $reason['input_placeholder'] : ''; $sa_reason_id = ( isset( $reason['id'] ) && ( ! empty( $reason['id'] ) ) ) ? $reason['id'] : ''; $sa_reason_text = ( isset( $reason['text'] ) && ( ! empty( $reason['text'] ) ) ) ? $reason['text'] : ''; $selected = ""; $reasons_list_items_html .= '
          • ' . $reason_html . '
          • '; $incr ++; } ?> classes/deactivation-survey/class-sa-smart-manager-deactivation.php000064400000016637147600337620021656 0ustar00'; } return $links; } /** * Localizes all the string used */ public static function sa_load_all_str() { self::$sm_deactivation_string = array( 'deactivation-headline' => __( 'Quick Feedback for Smart Manager plugin', 'smart-manager-for-wp-e-commerce' ), 'deactivation-share-reason' => __( 'Take a moment to let us know why you are deactivating', 'smart-manager-for-wp-e-commerce' ), 'deactivation-modal-button-submit' => __( 'Submit & Deactivate', 'smart-manager-for-wp-e-commerce' ), 'deactivation-modal-button-cancel' => __( 'Skip & Deactivate', 'smart-manager-for-wp-e-commerce' ), 'deactivation-modal-button-confirm' => __( 'Yes - Deactivate', 'smart-manager-for-wp-e-commerce' ), 'deactivation-modal-skip-deactivate' => __( 'Submit a reason to deactivate', 'smart-manager-for-wp-e-commerce' ), 'deactivation-modal-error' => __( 'Please select an option', 'smart-manager-for-wp-e-commerce' ), ); } /** * Checking current page and pushing html, js and css for this task * @global string $pagenow current admin page * @global array $vars global vars to pass to view file */ public static function maybe_load_deactivate_options() { global $pagenow; if ( $pagenow == 'plugins.php' ) { global $vars; $vars = array( 'slug' => "asvbsd", 'reasons' => self::deactivate_options() ); include_once self::$sa_plugin_url . '/class-sa-smart-manager-deactivation-modal.php'; } } /** * deactivation reasons in array format * @return array reasons array * @since 1.0.0 */ public static function deactivate_options() { $reasons = array(); $reasons = array( array( 'id' => 1, 'text' => __( 'The plugin is not working / not compatible with another plugin.' , 'smart-manager-for-wp-e-commerce' ), 'input_type' => 'textarea', 'input_placeholder' => __( 'Kindly share what did not work for you / conflicting with which plugin so we can fix it...', 'smart-manager-for-wp-e-commerce' ) ), array( 'id' => 2, 'text' => __( 'I only needed the plugin for a short period' , 'smart-manager-for-wp-e-commerce' ), 'input_type' => 'textarea', 'input_placeholder' => __( 'What did you wanted to do in short period?', 'smart-manager-for-wp-e-commerce' ) ), array( 'id' => 3, 'text' => __( 'The plugin is great, but I need specific feature that you don\'t support' , 'smart-manager-for-wp-e-commerce' ), 'input_type' => 'textarea', 'input_placeholder' => __( 'What specific feature you need?', 'smart-manager-for-wp-e-commerce' ) ), array( 'id' => 4, 'text' => __( 'I found another plugin for my needs' , 'smart-manager-for-wp-e-commerce' ), 'input_type' => 'textfield', 'input_placeholder' => __( 'What is that plugin name?', 'smart-manager-for-wp-e-commerce' ) ), array( 'id' => 5, 'text' => __( 'It is a temporary deactivation. I am just debugging an issue.' , 'smart-manager-for-wp-e-commerce' ), 'input_type' => '', 'input_placeholder' => '' ), array( 'id' => 6, 'text' => __( 'Other' , 'smart-manager-for-wp-e-commerce' ), 'input_type' => 'textarea', 'input_placeholder' => __( 'Please mention...', 'smart-manager-for-wp-e-commerce' ) ) ); $uninstall_reasons['default'] = $reasons; return $uninstall_reasons; } /** * get exact str against the slug * * @param type $slug * * @return type */ public static function load_str( $slug ) { return self::$sm_deactivation_string[ $slug ]; } /** * Called after the user has submitted his reason for deactivating the plugin. * * @since 1.1.2 */ public static function sa_submit_deactivation_reason_action() { // Check nonce for security. check_ajax_referer( 'sm_deactivation_survey', 'security' ); // Check if user has the required capability. if ( ! current_user_can( 'manage_options' ) ) { wp_send_json_error( array( 'message' => 'Insufficient permissions' ) ); } if ( ! isset( $_POST[ 'reason_id' ] ) ) { exit; } $api_url = 'https://www.storeapps.org/wp-admin/admin-ajax.php'; // Plugin specific options should be added from here $sm_lite_activation_date = get_option( 'sm_lite_activation_date', false ); $sm_update_416_date = get_option( '_sm_update_416_date', false ); $sm_update_417_date = get_option( '_sm_update_417_date', false ); $sm_update_418_date = get_option( '_sm_update_418_date', false ); $sm_inline_update_count = get_option( 'sm_inline_update_count', 0 ); if( !empty( $_POST ) ) { $plugin_data = $_POST; $plugin_data['sm_activation_date'] = array( $sm_lite_activation_date, $sm_update_416_date, $sm_update_417_date, $sm_update_418_date ); $plugin_data['sm_inline_update_count'] = $sm_inline_update_count; $plugin_data['domain'] = home_url(); $plugin_data['action'] = 'submit_survey'; } else { exit(); } $method = 'POST'; $qs = http_build_query( $plugin_data ); $options = array( 'timeout' => 45, 'method' => $method ); if ( $method == 'POST' ) { $options['body'] = $qs; } else { if ( strpos( $api_url, '?' ) !== false ) { $api_url .= '&'.$qs; } else { $api_url .= '?'.$qs; } } $response = wp_remote_request( $api_url, $options ); if ( wp_remote_retrieve_response_code( $response ) == 200 ) { $data = json_decode( $response['body'], true ); if ( empty( $data['error'] ) ) { if( !empty( $data ) && !empty( $data['success'] ) ) { echo 1; } echo ( json_encode( $data ) ); exit(); } } // Print '1' for successful operation. echo 1; exit(); } } // End of Class } classes/sa-includes/images/bfcm-2023.png000064400000524313147600337620013676 0ustar00‰PNG  IHDR È…¨’IDATxä½ dIU7~n§—óä°3»³Ë&`IJ^LÀ²A…DñAAA§€%ç¼ HFT$ˆHØ›gv'ϼ7ïÍË©Óý×ïTºUÕu»ûÍ̾í¾éî{ëVºÎïĤ¿¿?M’„Ò4%I±k’û ¾oäÙ°œ°Œ°=±<Ê ¿»åžm»Ï¦¿ÿ/$ô}x D»¶õF¡^Oiÿ᥮Ÿ½‡0 Š •K* TP¿+å•Ôo\Ã#¸¦ 1%Îwó•ËVu¤¦.â÷–P³™Ú¬F굧¼[äõZhêIͧTk«Çµ$ûΨ߉´×ä.˜yÔ@ùê>©I¶oó ‘ÛÝЬ`´ÅT„2Ðäª7ð½ÉÏ×êú>>;Í]wmÄÖyì}å=ÛÍs±öü¨­±p9›¶ý¨ïxMå&-U öZloî´Ÿ†ï;ìóÖ̓tÞ®a:~b‘ŽO.EëêfœbùbuÇΆ¼óG¾wšï?Š {çæñ^Ú<Ö«öNgt»áî™AJíff¾È>—¸ï0 ÊK‰úOv§„Üí«uXýF†MnŸÚåît‚ ¼ýÓÑy™˜Üë‘ñ^\©ÑÉéUZ\®uœW±ý7v/öÜ™&œ±Û&zib¤GJ£èÀðÏàºé¾w¦ivòs‘²ÌØe3*•ÃŽçŽÿ{?Iü)j›åÍ-žzó.(:5¥/®4øâ`_‘b©ZkÒÉ™uγm¼‡ÇÌï’®df®J'O¯ñ­›úTy%ê)'-äŠ.ofj¶„‰‘ mWï¡R*P8^È?³P¥™ù*UëÙ>%Ï¡®J9i¡‹ªõ&?smï"usþo„ŽNòHKÆœ;U6ìLÒFçv‡ÏÝÝäb11‹@_KÌ}?_kr)U=K@ìJâï¸ÝZ_ÓttšÓ&ÜO¢ý(Po¥À„éüRƒÔ|Œnd¥BÊ ±Ö,P^êí-ÒE{‡¹íóKU:|l9š/V>~\ùãWV £\ÐÀgb6Cgc€`>1M3<>ŠàFj45ଦŸöpw³ÑÙòÍk!'«ýN~6Šdn‘âòR³©A@DÁƒ¾Ž1RCÄc à’ˆ ÄjB#Uy ú»[‘‹Œ P3u4 pi˜ßR;B³Ûç~S¸)K:[fÆF™+)ûlÓFAg»gc{ulóp^}yccl!*kl¤Ž)ðS­5rßë[PDÎy;á’÷¾ÚldI…IØ’/ÛsÎdTÛmÉü;É4n³²gÜ+­e·äIå Í.é|Yn·ÛYY~i´ã´"ü¦1º¶ÞØÐz‰]o÷|ì¹3I}=E:Ç€&®)~že•_œLþûHý£ˆÌùŒø;k½æ÷?ÖÏnNÜØ㺮ÅÕ:— ˆ³7˜bÁÌ;¡Þ)ÞýÖñ ƒ…X§X89[åïÃ*E@‹§3 2>\6@$ié€ò  pÇCžë)%Î’×ëÏŸ^cs¦Ì•3Âi;¥«àlØsõ\ÞÕî™3¯‹˜ VÿŽ´æÊ̆y.¨p®ùø^—O‰ó«õwn{M¾Ôßšpm6Qiˆíf@DŽ $4ܯ7ä_¯¥tj¾-¿ÝÁ¯ÇEÿÆ"¨Ðüº%Z%¿%hŠEõ—0À(´4C¤Øìå€â6§ÒŠo[š0n`BŸX*Ü,îëj·Ç…§XP”ó"(dxµlÒØc `¤¦6¦F½U23¤Þ'ÆliU¿Gw=ëw@¬€Œªç´ú]*$Ñ.#asEÙuTj =ßЩKR7RsMÔusøžËòcœs÷º¤¾žM iy½I³‹ ÚH:W€á\¦¼s!¶?¸ÏtûÞcåÆΤÀÈ«·AÂZ¸ï½¶ñw¬¯ë¾7ÙRNøÜÚ{‘ Òᣠ¼ŸîÜÒGcÃ=>Q—:k[˜#ΧŸ/Õ„´Ý×6@¼%Ý?‡cíô’1< »o·@ ÊÎÖÔ)N M7¼ÏÚ1 gΦäŸÉöÝ'ö¬Êÿ;ÎÄS³Š œ[gâ2«7N¯äõN€$Þ·ˆ±4®æm9œx—ÙV­7¨˜èsŹmÁ¡‡Q÷‡ÍI.$©.u%(­“,û& ÑÉãÑ mŽâC²´Úà÷7¨˜®È샩`$´m¬¢Án%©™×ºnü“³ZjÁ㊼®¤Â4’%"§Dêö}¸ø@$›¥\ÿL–ß D<)M6Îð¬ñsy©&7» zˆ[pìÁsÁ‰;öFÊ8Ûú˜«\Тk&ÒŠt$Ô “Ú¥RF;`ÑM7¯àžÃ‚„äh_ƒUz\.Ä©y¢z³c•QbŒ \U` jQE¨Gù{`£d¤@I¶þe3°¨×T4TÛ4àh6´D#i"ç‘=Y=ÛjœÓØ»lOÛ6;µæ©ó¸Wl»2Î q}æÄøÔ±* ùPORš_n*nM¼Òpï•Š#…"‡å’ÚöÚVd *wÜ–Òh© €IÞA‰Ôí=ÛµÜ-0éD8‡×ÝöÅ®Kš­Ðè`‘Üá“kôÿBj,±î/¾p‚¦¦—iòÔr.ñÔ ¨{Ro^jwøåÕ#eb¿ß½5Y¯6èÆ›&£å´‹°.ì­Í3Ÿ¶g•6õ("±×p×)Fû¥± ­é½œœ3((ÌRŒyv¸±g¥ëñ ¡ÔQi÷^ŸDÍ28û{n2$l—{GyÚMx¬Ñ)EDÊœÈ[^9Îœ ¯ç­¿–žl–‹¥¾2Q%¥Ó+ú]°ZÖx¯·eS µœË`~B]8wôR’µ¼bÉ“8ð4gš¸$xFee´ŒŸ[Œ^‰ësÇ}]ÿ1é!®Ì-×Yc`°¿Èç¤7ûUGN­óó[  g<ˆ~ü"¨@d»’ž@­œ‚= yO­+T·×DXí+ÒF"§«žEÒøPÙ¨‹©6§B«ê±B¿ŽZ³ê\ÞصÙGÝëažè|‡ VËÅ3˜¤y~7G§²ÎuŠµUÔ~˜ø*h)’75"ŸŸ/$vE$N¾øwAåêP«¤CRì~kYÙ¿±4>Ú«¸,9ÄŽÙ {“ªb*4Y›¶Ú.h=í±Œ‚vï h‰T=f•²h‰/ø›–Ä!”|ê>͆04Âñ ÷33²ê¢X›åq¹ÕF’mTrÈ%Aiþ^çTÖæ0 òû›TVl§çºJ9«wÏv#u.gó¤·PgiRU10f ¸¼ƒªÓ¦á5DU!1 <Ñ,Jð]ìY§Ùu#5qIKÓ4[s]®ýN‡nìÚÞ8 ª0vðÇÒÐ`…ªŠ1‹ƒdt¤B‹‹UZ«æ£ûvt,ÏJ Ç{ý/ÛBÓ§Wèȱ›¯$#üæësS^¹íž‰=;¢$ýŠÒš›_£•ÕZ.êôŽ6šº%r»I؇wmígÝrS:¹DOJ9Gá™e×n”Œ¤X1…¸ÂŒÔÿXºÀ¹î[¿žá¥yÏxDhdcM(ÏO#ýÊIŒd?&GZ"a¯™ž«²Ôç_ÞÞcæåÍe7_ìٰ̼=k#óçm…h! ) Ù·«ßHC‚öÙõ`fDnΤJ³§Z[C{éþ´™ ÁÌMnùn“%I¤U!‘,`, ᙳK5–ˆ@b"@$,¨ªÎF€Ù¥ºbÚ& X”il°äIXR3Ž§My®ýæ„‘ ”#@d€BID Iqç òN( ²i´ÌÚ¶Ów£“jîÖêçI§}<–ZÈÙnª?Š$’Û®‚%  $­kÂœáïÄ]fqeÛeWÉCß퀉ün+ñ0 ¤”CÊÑS«5íÚÕ÷(èg“ÊÍuþDš… 5“’íšî*ÆIm@Æ6CÏئÈê9u­*IÍ´IÆ ÚÙ ;ôÓç€8}67 êdìiÚMh¥¦úZNªÔå{‡Ž¿Ÿùï3-í¡ÎgrÛg‚ÍÎÛ8™u—¸Ý&¯5‘Žœz xïéºÞ©ÌÀ¬^kzŸîn¾JT·?v˜IYrëˆUêŠZr’´—þÃÆæ‚"g³‡´#è0]aŸÚ‚ùD¬Š‹Äý1V£#½´ªˆXvél÷KØf5ÒŒC|wwžG(aœëõfW ¢¡^‹Í×vÀÐÍ–÷|ØÆNãr¦¢›õ×î7Aê±Eq4‹|žÅ÷4Ní6°–{þ.h·/÷Lqsµì­N†.†(Ë–×ÈpÓŒäM)º»íŠž¹rÖ¤‰œÌ8ÈS·~•×륬2ÊŠ ‡>¥œ÷C IÎõÜ™/nø{Jλ&rù“YYM¹SÒé“ÿ„ÿï’mXKm‰8ÛÏ.îw"öä;þeµ¼‚æ˜Ì£ ?ë5Qá‚ y’’N‡m7¢]:2Ò—(¢¿Ï.«qÞ˜™ÇY¥JQYZ`IàÝ:ÑR^%õ(·œY®ÖC,Õ…g·ÃÎÍnwªLºú‹{‡¢Ï´ìÆäï`vÌ¥œqò9f~9±Í3Rc«×Ivÿv·jgv¯ƒ…qyè(OÊ®©ów³ãT05½BS ÄÄʉ•–ßî¹s°·Ãðp4¥îWÓ¦”À‘½¿VÀèžšG5™Â{VFêäs×€ BÄFö+<–I‘J©`Hâôia¥NÓ u!DÜþ‹¤c~¥I#ýjÌ”ô!fPp1©ˆ~ÐW=êüÜ¢@Bêò)k;L*°;·Ü°ïùQ®­ßY˜—“s5#á^¢O™Õ³ˆÜ5*Ë£j눵ÛÛÛ¥\Í| â‡<l”´ËV,äpËË#⬔$±È {ÐM9›™ÎêLr˵vDÒB(¶nÉ.š*D!‘{"\¸DaG ‰% 6*ecç’$Ú°Ûªìy‰¥Úð¹ÙLŒ®”â\…¬§c£}¬ v×á6÷ZÐZ^XÐ õÙó,­®'äËñ¥íjñSÕÖXKËÔH\÷x QÎœsÇÚom– Ž(R\Vjˆì»,¯RË&Á¹••Ê߉sbYà¥ûƒŸšCæ˜&…Nðdîˆñ9Ûó¤ºQl/C¹ÓR—Á݄҆îˆB¯w‘g΄“\2RH^§ì@Æ%«‘”Ôèn|/é–(ì”7á²iP{#CZVÅ¥uŸÈfÀa<§©[‰ƒ›º,n9Ð5ê#u8süa™á5·­aÙíæ÷™ g’ºyöE[”ä£T(P[õ–x D–ÛoˆèNχÇI$ùgZ„übÚ•v¸ç>›¶<˜¶tÃ[ƒ‘Âýžë_ywÐË?1½¦Î­†Sgþ¼s¿»sz˦~Úµmˆߺÿ4­¬Õl^É“W>±¯Ž(Âsv±nÏ»|¸il°Ì@Ds÷…f1ô‚ms°ʹȯ­I¾FIëÙ¸‘”Œ};K†²J<d[^kð5ûbkp¡»°Ú`à0ÐSpŽ](€À¡SkÌ<Uï „¿Ô“­¡„ÁÆŽU,'*¬Êå4•ËïЩu PlW’áþbK'j ¸8¹ÆÎd¸‹Î<,²ä%¦*vRÕ÷¹¼Ôi?õH7›ï†ÎÝPf^¹/•ôïPš€äÏyñ •m6…B;bÞ©B @N.ÿ¥ ½íK mBÂä(áýV{·î°ezlJ儽O• Úh;ã}ÜxPk@‰uá—šW£›…JýŠ-<¦È±K^˳A0ê9æ„aõ`Oݶ}­^ Z3#JÝ‘-P’& ׋Ô(”loÉ¡ññY4ïSlq[ë\gOf²­®ˆE·1¨Am¸5eeϹ¹ÍfœUyĹ-kH<¡iIà¤ÆU³¾ÞhjÁªÚ<׫þ!Õ‰ÔmÈ?PÏ$¿û»XÐ]p—LJÅÌ %ÖŒIµ–¼o4ÅénòçM%¡¡^=®³+gǽÿQLyòÛ}.oìðn·oäÏã'—x.âÀ(²·°PuÓ-+¯Ì˜¤àîbš!ß–M´{çݶ†—ªmç–Û‡ð~'0>ÃR-½Ì)÷¤©)Q+ÓÉ–DÑ”Ê?IöXš­9!„²{¡eEëé`:Ýòë©ó;<»ZËÞP ÷g!*#% “’ȳ-­I´'£”¬="Ñ©ÙuZ^mDÁmR‡ùꦡ {c[Y«·Ý£¢s£7± KcÏt œmÂþ½E¾žÀMö Î6¹"íµÇcêþ ÜL—N´™´#Ž3²'Á+ϧát„ä÷†œ!2¥@äO))fÞVD|Y:±¤C ´61 À T­ ]ÃûlI2tÃj^®½‡Î_æ÷âÍ2jYòm.ӦᒶñIüö Íh»ä=“d½`ë úƒ˜ôC BÛß\2ð!³J_Z½[<û¤D>ä% w,AñºDÂ=rÕ¥‚¼)ß”—ï<ëæhÙlx£K-MJ:w¾g·Ø¸\.ÚqÑv.d“ÔÑÁ‡tCK6ÔÙ<@=JüpØŽ CN8J29 ‰ü‹’á®]€Ÿ»·Ä©¦%ª§Å( (ðR’„TŒ q7+‡LênjNyB˜#i/a©ÕÛm6Å6ÁÝu¬ ùec‹Pë¡, ;ȃÏDÞþ±þf0HvóKRc·d¤2Dv óœ¹ÔH~í¦'׌J]ݸö• âf·Q#ÝûaÊ;PqèîRÄ ——–3®l,()fó^Þ‹ˆÄYJñ¼•×®v„^ø¬¤³!l\SHЇ÷òR;€´g÷MŒõñl\PÄûíf6TNxÇÖ!&Ú&§—së<Œ.)Ÿ[· Ò¢n§zµÖöÙn ɼT)éz+•2íVàC;mðϸì»$î=\kò§Ï˜ l;äI²ßö9¿ÉÉ'· až8g.‘>¥RFêlÃa¦#~û2•ÕàXήú›°)&ç·Œ·s~'þéå7„öœcSkžG¢,kþÙnj·Æ:û˜Tä‡@¶Œjײv.˜É ÛçÐNÁpsŠìµišæ†üæ¿{Uæ\ÇEœ1e£ÆïÎJíô¥N}•‚‘6øia¥AÇgªìwb¨dU¥.0¡n€ò/ÜÑÇö”a[.\›­l{S²ŒVi(ÎÁ*ß\ f)Ë&„Š²u˜ë (Œ|˜D-‹íPœgˆ´}Èk]3Žé¹ò‚õƒJ"éâÚÝäüŒú…IÌБÈV*º{œMÉî¢!…J‘Š’!Ý@µ“µãfþ¿”bN»ñ‘<ݸ Å»AZ\ZWä4IBð`uáùc¼Vn¹}Úz±Šµ3SU)ðù^ßHꆀŒÝëêÂ2z!eÓ׆•¸­R.û‘¿9$12Ý$¹R÷4 èl³·gG’Tè—ÞÕ†ª³ùäš|1 =—î—S%$S늀->4Âé‡ÿLbÛâÁ-û7ö;kˆ ­óøïJ®µyà!ö\Þ5©/\sg²ÿºi³’êÍήœ‘t9–°Gof{„¸mH¾(ù&_Ч`®%Áùk.æ^K\Z. i¡ü3|y­Éç)8'¦Þ ÃÞ#ˆ¡D^ç^¨>Ž ”içD¥E- ãxâ´®_òºc P´m¬LäSIÜž»N®ZÛ=y¶]Úú:i‚TÛ…$ÛyB»!@µ*‘&Jfbt: Žn|Ô½l›yÌ·S¢Œ›Ž”ŒWUçzl%g#£V0"îLËŠëûa#d/Tªÿ뵆!°È¥™)¾ùS´‹þÒ—ƒ€r`JJ®”Ä58CÝ#eb÷¬°;)àÐ/ò»ñc†deŠ:SݼËFÓ&DÜl4Íf›óÎálûQçã²Óá§ð¾ÜðöQ/CÐ{+ÿ n{ór“T‹KÓ¤HØ—ûQ6Gà.±NL.Ycvi?ÎX…f&å@Â…Ì%s©˜xÆûÒ§LÝO"¸§FjÒ욈óÊL;s˜™é`Ö?¸5îz‘îëÕ¦5¢Ë+§[8–Š‰vûãš:õ½ÛñùA0³òˆ®¡ÁT‡ìéÙÕŽîÝ祼s!‘[ĆÁü;~r‘Dásnn¬¶1R±à§R2j©úÉVb=Xso™ €÷ðàÑv{Fö.÷ÜËÊheš¸OeÅøZ²&€¢H-äö)–\0éÔ$ñÞ¯¬7é˜â ×Ú¸ðî”B°‘ÇøèÀ·+»SÛÜk#J*1¿Ô^uð\&ìÉ zz#jI“Ͼ§4˜!ŒQ•ä»¿‡ffÙÛÖƒ›ìø9Ï[ªÚÌ9/½)áÏ¥¥5}>Ž ”Z €Mˆø›zYzzö„kÛIEèC%j³’ˆh÷ÙYM gM­q9""Þ «eùócR•ãÓk¶ï.¨?'j |Vhu½éÍ äGdt¯ù€#uŠe¤.Ãeò5^Ò« vê]CþÈŒs4EÚã6HeW ã‚R{q[ \|ò¤u¦¨ei‰l´Îlª»dvìòH³|^%’Ï fûìaòµlÈÙ»ãOr==‡óe@ÚxXG¾®"Ý3<Œ­™ E ïõ»yÒðGâ°g=)Õ/\ǦP®˜(Ú…‚‰È›Øç%fHÓÄ ‘@…M-CÎ?LòRp(Êïؑ⦑kä^w…ɘþ9S¤`"Ê?M[Ú°-~›k¬‘ ý…5ï ÞóDÞÔŒºGq 1ÇŽŸX¢%¨=…ý QkÒîqåµÄÂBAl4Œ”ÖL<–§©#5#=qEþy™{=Vf,¿xÛÑQݳEÝÈmhcŒ¿b´R‚Ñ_B«Õ”VéÇ.íÙ5ÂQÌW¬¤HÝŒ—«:’ÒÆží”zÔK¸ç¥›ù;@ô÷n™êúÙvR‹À ½ð¾6T¶¿Ñž›o?åÅ£‰%ŠÙµ *bÈÝ€üß.bËßTJ” 7~XÉ´ÉÝlùkäÈ‘¸?—,r}¤Ëáy .S¡»¿²–Ænæµ›/o½¸ùcs(o>Å®·[—y ôÅ s W9ÛIÈæ‘R|nt…ÖHÈè­JŸbšQCÑ~óS§J±?F-g¦ÃÀ¶’¾¡¿—þ­N‹²qè-:`Fç…Z;"‡©uZ.'äª45Œº>Aè‡A9RúÔ*—±MI:Ýäf‚^” ²}¢×ªQË0¼ãȲ0±@Û&4@ÇñiNÌd1%ÿy[zi°¿D!ÉÒ“õ*MÝ‘¢˜FƒF=4©í£Ú¥’$‰áXjb;qf¦»ž©vÇɲ©v“*± áÉ°~Q: ·öÄj…øFÔ’ÜYlÚãÝ£àz„ö;ÚZ®p++ê­R ¤0)±dƒ‡¸!Mý"Ü1Š7sêÐ÷vÁ¥™Ê—Þøü滌ñü‘DQ™Òeh.ë8˜Õ¦uí+Ù±¡ ‡Hr¥yùƒó$M[ö¡p/ó±Mä½&æ_kÐØMŠ‚‡“1¦ø´ŠM'é—\ÄõbsídÜ”JT§J¼°Ü6jõÄÁ ž[sæŽè[›ï¦h‡v‡ÛèH$†`@$$å’ñVgÔíÂA¨:±@D+,+ËìÖ›w ßцž²Ljþ*‡@0{«åKGºIØZ&ÔẴÚdnS· ’¨m[Ø*bHýƒHØO/¹h“’ˆ-*ÉÁZ[ÂÈM (g’&ÆûiïîûûúïŸl @Ùm½1"ùÜ”7÷.»x3¿[7<#©uÛ¡$؃‘jêp=>S£Õª–m(„Ïä=×-8ÉK˜+?*ë6l_^‚d`Û(æ}ööûRƒóŸÈ{oüŠû2ϼyà?î4̹߲*²³>œG|îÕ´üP_ëz=½Pcš""pïôB•Õ­˜È¦‰ü5¾¿}“0L‚FÌG4AÏ.F{[ºv\1^NÛÍØèa Â^¬’Ä®)•ÛMyî|@þí, )z´ËºHC‚üv,x!KB[À¼gÎ¥¤Ó„ÎÔ¬tç I0£5q„Ã^ˆ $–’X Î"ýDAµªU”J…,·;•,Ç%M¬am±à•‰[&yÏh(nÈ‘ä4¯l‚©iõª í6M[kx¤Nÿ3B–, èEtðRÓ¶§Ö(ÐZ- zÕ]rGŸâ! RˆÝôBÎJ#wÖѯk•™x±M4oãã.vØAl–Mdìx«;]󓔉‰’ò/×%¡˜Mpii|¼Èi§gcy$— BXÆETæ¼¢å…;'ª¼ó ÉÛ²Þ8Ô×V35,…{úûÙ8/Iô\F“+™´¾ÿ¬Ý™»bùä†XŒ”Kš Ö@E—ÆÆÌBÓö=/Ŷð^Þ|ª˜y*6E¥bFDp¬=‰â|â°Ó|•ëÚí31 )§ ©©‹Õ´êéY{½ Ç¢}«(m›¯›tÁžQvg @§²òÆ¿Ûôƒ$fî®Î WR×ÎiBñßkƒbï\Z©yõð}µGíÞÒª#Þn“ϸ²ôÀ#ÒÝ~e÷]b>LvpCÐ÷šD‘v†äœåŠPšÓ¯”÷±ro°ª3G-i°×œIûÝŽfYoOÄ^€jÓ Æ©GÎÞp¦Ò…v 7Þg§òó®µ»þ£˜0÷÷l®˜8ΤY†k0¶7&ILÞðòÏâhJœù›]±šê÷¬ƒjm‹DCò#6ȱS«´ksæ™JÚ‚sꤒ$(ŠÕ€‚¢Ó?MsÝqx‰ËÙ¡žŸîq›Äé¸*` ÿŽÍÚHÝ]`fÝvhÁJCDº±I–Ì/žî ÊtçŸ8#=ä½õÿ •WÔ½d¼e®q{xÒ ûúuÛáE+ ù¨` ð¿Èz311D£IVåH’µïp=&¥>±Ç:éFj R‘Žè –)È/q!ÊŽÇ«èäò>M[Ý>9Ä <«±~y‘“ë}GK8L¸4s©–øIS.(¤[ÈÔ1ÖEª§j›œÅ*C¦uð ÖÀ?óú¥ëÃpV¥2nŒ¥ÕÀkP;.P7›v;P‚;çÝ›;d)yÃñÐàB«Í5…ÈïŸ ,[NÊ$;|@4S#ÈÀEæ^1#Â3P!mŒœ…Áá.U °t<Øþdå´¡2ÜÍNˆB †:h’y)e›Šó΃õ˜éïPE”klÃ#ß\hm™Y«ç…b´×2x–wDÆKÞg§#ÚòˆÁŒ[¬¥#=å‚uÃë¾p¶!id6%Í”¢ '{íç-¯Õß¡þÏS‚ö¨UK7FD8ô„t®ìI`H>7ŸyHÉK?*DÊÙLç‚Øê&Úq­Ãçó~»ù‘úz ´kS%eÙ°±‹Ûš‰â“»íÊúÛJÐ圱CÉÆ1ª[.@¼mÁ> ›Á|‡›½¸µ!4.¿d-.©M÷èœÚŒÏ€’%#õÎ`FÿgcãŽ_·÷:åo÷ÎUúa–æË“hHÞX¹yc”4Ú}ŸÖ‘‰³B  h’çË=ª×j¶¼Í!$ÃS/‘ì›vos™<üËü FžãRËcÀ   '·m`d /Gè[m]ƒõš’†4H8¨`L $óKqÇÁ-ÜÝaõ 0-§æTNG÷„~»3+ï~Þ˜7wòïݵN;=¿Ñ=%L`„×Ý—Y›GĘ;{¿r&û¿)çe‡^⟳Ù|§(.1§(Ų¨ÿöõ½gpÞÁ¥1ŠÊ¢Iz9u['#¬ZzCáô,ÃyL­™N˜â¿v>ÃÙΛ>*ÏT°²ënÞÄ98ôo+†7ÏU*E 8ÊšxÔc¨ ¬†!ÂàŨaì|ào¶èT<5ï6}wÛƒD‚jµ'’$ßv'1{®I4nô½Q×àU “u`±Ö÷Ü–š·¿³uM-›±~^榶uðç† (dóÕZAFâLp»éµ’ ö~@Ü£µnpÊ:;‘‚q¢  DŠŽ}LA’ð&œVé"=n:NÊÔïϤžGÀyc9ˆó8‡åRæ~·RL¼QÕû^¯õ&µ%Jå7úuáctúô*šÑjMje¸Ë6`DÞd­®=¦¬G"Êæ½1b¤S:Ï(ÿþ»f;¼3áìÿ¿žÂù$cÐŽ8”C7µÑX ²FŠÔ¡…Dã–Í{K³mŸâ©u_Éjiw!§iDm¶Ûl_L‚É4Ò9Ü"Ò¸¿ììW’>}ä©=}yn?óû–¶—ïÊéåÍ,6ZöNs?¶>:­™ht[¦ÛžX‰}n4md¯é”÷lJ, õÁ»RYíÝ™G&9Æ=5;Ò_“ŒŸ~ ¯}‰óoö%¾:ô},fg¼öåxÄJõY7¿\ã¸lã#=NýÚÒHÑ·Œ÷z¥ƒÎ‚JÓœbníÝ1È`Äm*4Pî:¾H‹ªlŒó]ñNÏ­3ºôüC4º¬®¹a »íûn¶Î?©§SjÇ9dû³Rbl¤_Y´t‘Xž)æªÐîíÃtjzAq§ú@J3 R<òînüÛùp j@òÊnG@wJÝ®ÿ—ñyà¶["/öÜ/)¢b½Z·yp&AåJì=RwêàË©ÎãzJ³F{ç•·üÍ?þþ⶷¥óòm˜-ÜTh 8t„‡Lš[Dù'%˜ƒc^uµÕuZ]Z’4{.M)Ü#É\÷úˆÚ[NÎÖ8>Ol°ÏmTQ PóÄî·+Û-3Vo·Ïœ-=÷£ØUïÖ^-)Nò%­2;ßÄÙœ ÏÆ4Ë›Ä÷ÔP%Kž«±7¬u&îÅöT¤~oWD|c‚g!¥8|r…¶Mô1¡/]‘™ IÔ©Pç…ç SoÉë2T²n½kÎÚX@²sË@Ö6SÛq„ŽMe®ÞQÞE{Ty=%wˆùl¹E•'\¥ïi‘j Þ[Îç~pÙ©ÚdÛ|.$ h¸×lãa_²$s×R/ÐÞ ÄD‰·9ê •¹£u²R&^‹Y<¦³ÁÈc⦳h€‡¥Ë pÜÕ!± Äó*bžcõ¥²6΃fVíi4u¼÷æè[#ò‹´¼R¥è¦mj"Ê‹$$X[r97¾d>e¸9|=51CÒhÊp£—wåJp4gšZÞol£n—˜ó\ѱMà鬤(>‘hØúâ¶J´mÖÛ¯5[ܬ†©lx^Œ“ã=ìœ6¹éë-Óî]: ØNÛ6eà#^®øQ¸LZûšõÁ-Ç­'u¨ ·dó}Ó;®ÉÞ“öømÎ@”=<B" ¶éV÷„î!îö;a ir”l,‚“®ôŸmêuZ•¦fkL¼(ú;ïƦT"ÃTÐ{dÑHï'¢>Ù4ab¬ƒø:6Osê é­h #À°.Y­6=›”vå‡)FàÄòt;§Ý2ÝrÏe**“»„œM{Ã=-vß1GÃí´ÓØËç{ÇøLXY­ñïÅÜ1^Ñ{–³˜ôRÎΨ–~ù #d H!ržÉKâh;Vr`&-4}lgMÂòÌÞábº¼ØŽœd”ÓV­101êå]_QDÛò¹ôA6äõ=kSö~fëlhÞª±Öºtšáw¿O“xt*3Üb)<“óæf·{ãZÂÞ¼m¬L£ƒe;…“A™nö 4×dŽ™ ¥­QûýRî9ô©Ûœk+ëuÕ¾Š{Ìò9û¨ e¶:!°åQ`#!®×¥ ánWD<ʸøü‘–g!¹ë˜6äv†yœŸ¸8>µbÁÂ¥ûÆt9i¶TVÖê\˜#Òÿ°HîcJ²"€Å¯P­âüΪ^'gVb£Éô4÷KŽI___êu÷’–^$±wÊ ­F8£sËê5 ²^°Pn©J)²=R<#Å jÙ˜±Q¨àòœ<þ«ë‘vo¥`½@%6DX±Mï²K6ó™Ó+4É/*P›¨¡àsmd“öVÙïbcÂA ÿÊÚ}oê’E#"rU|ªWÿn4dÌÛsó6+l@õK{r6õWoj´i¢×c9jj±zð;ÔÑ·@„H«œyêxÙ˜vCÙ>,i&MÑÌaôíEäyì’g¤aê\Ä@[f;bf£c÷£–6Òö˜”#ÆÙŽ=שþ°¼ÑmâÈÄáÎYÿ-å·ªa麼,d9;nÑ‘=ßïLëµ$,4äžØÛ±[“K0–ÔB+UÔ>Ú¨Sm­j«IÆ ÑË}=<¸¶2¿È.Æ¥½ñÑOMS³±ØŸš¯ÑZÕ'òc@À+© ðw¿¡ßm±úò~ÇÀSl^ŸëÔí^t®ÊÙ2ZQeKÓPLð/&îR;§2ZË&®$ùy#eÚYn~ÀSa±èsÿWêL\‹ ‡!x—Âù²e¼Ï¶ gÊÁcK¬–É€=HIÓdǧViz~•AÁÖ‰þ¬DZ•ê؃‘þÞ¢’^Œ²ú½›çÔ¬’¦_d ¦üέƒ´mS¿íTBÚï!ffÖí{€Tå¢=ðQ™§˜::¹Ô" Ù¬o;·ö;¶+ú“ðª¥ház$,Úsž’Þ3i÷òó&Þ1K¢Àƒ ðð+ÖÞj²˜ D>1Y G¬ÑqJþD`C †öbT2DK!‰€Š”Œ8J×m¹‘Ù81‘Á†ŠM±-`H9À×^tR+¤~&ÔäêWÄéÉÉEÂ.ú¸1tÞÄnžÅiOZåBæ~•Ä°=µ ÃnÈÑÀ?4±˜:õh;Z#_Ý%¶áá6&zO¥hÁšÞ ™ â—ÇMª!8…ÈÚè†ØisrËa;„Dæ‚C|™Í üÌî»oFœ»ã»ß‚ˆ$ .(66z:'äOÔNýK²Í(M[‰†ÖžÚVúS0#Z’ðÑ€6h:Þ¾˜vOSp ÍhšhœMC§á<òšèœ>†—ä3§W³>¦àÑEì-ñ;!Í`p»¦íˆËfÿhvIl‡ÉÚDK[+Æ®£`O½¯Uëù.x;Í× Ö¶‘I U´6r°w³>6B”ü¸H›ÆÕߪ’,=±¸¡gÛI/òH'Ÿˆå2?¿n¹Š’ob¨DãCEç|6ëß®0gr±¬u¦<çR’µ­DdåeLç9Ðçfï‘r“¤»± ÷œlßkiDK*”´¹”R]^µ}t©ÂDTWši6ÞáÜL"[mª÷‘zäN×ÂëA»g;¥vycÀøî^§íÖHÞ~r¶ {âø`QÆznžáþíÜÔ“9Ô‘µ’dRtNIâñÙ5²)õ%Ç?9_]/8õð›HÁõᯧîÜBUÑ‘Eêëñ½K( lèÍÂC˜g -˜_\§}çi©€[ݤ:;"vnðìzQÔ±Žž\bzl—›Æû¼.,Ür`Ö2ÅpÏÎ!&íöesì7ÐŽÛ´G­$Sý]wóÓ-*V¨ÿ‚]Ãp5ÓÂÐn€Qÿš#eñ^‰Ø"‹qrPDoO>ðÐ6©·)0ÑjŒŒÝ-J^€€yFl7,M²Ol,Èbmè)gÏ5Ljõ 8=FÅÃF "!å(šhäº=ZÒ¡¹óiNôãlÎGF€¢°Ì6so¸_룣ó+)ßQ¯f6¢VU5.|›mìÚÝÅá.B·^—g#ózæbVgoÝÔÊŒèÆxúr»ÊêhÓ¤a¹ÛͳеèÄÉq¯…ßÝ$žÔÜM núÐf‘¦Š4Èóô”µÃVb•ã—ó¢iù¦?ïíü1¢‹XŽÁ©ßÑ‘>*«±^]©òÆä-¦Þ,âzÖNw€™k¢jp†–»êF}¬.ÔÔŸMC Èwñ4&-Ù½s˜úú2‘ò‚jÿÉ“‹úÊ8‚G€·zÇ"ÛÝ$J4³ ¢y¿¢’I¨¬D±;SG Rg¹˜y×*Û&ž†!Ð… Þ° ¨TY}•ÄºŒF«NyÝÌóvuĸº?.£]Âp!º¸Ì³©ÉyµïÔij¶ÞUßÚo툪رªš 7&ˆ> ©MóÎw—î÷§ŒÞ0¶m…!ó1=³¬%äÍ8ï·_v0.”þ‰ó.yß-î~’‘þ ff 8K’–ZçKìýÁ΢²Bÿ} Ê]Cb±êTmQýˆVeªE¼JIL »š¦ÌþËlN¬bh¤‡íIx¨†s‰½^OŠÛí\ð¶+WúUáìÙá¸.‘×ë á°ìØï¼6Húq&£á>Å)Ýfö|9-!ªÌ&ÁøÇw¯M’sŠœþ`½Ë9ž•žE¬h»y%rPÚOtKÜÌ:•z*ÔÓŸqiPÇ]òuËmÅæñ4ÍZbKóÆ>)§æ!õ¨w$;­ÉnÞ·ŽœgÎdK©Š›Î0ä=ûÃ!’°o…]ÈPÅiƒÌÁÄYj©"Éç·»þ²ë¶TjÑœp¦uƒcb9†æ¤%ˆ‘ÁF襂w,Ã6ô' Íeý#±÷s´i¬×'âIƒ»Ž,ªý­F;Խ훼=÷oÙ¯%ýŠ1sñcÈ1:qj™ˤÅ{³pû– õümwž¦eGÅ\‹¸õ•tR•wôÄ’aBfw†+´o·Qár6ä… —¤¨ H6øÙËЪP†ËJÎXª ‚eçXE+f’$V:Ñp8ÀåRnÜ$àF´„JB`Äò5u^H±2â@«nôAe¨\0ûVb8÷:R[†ì«Ò.¹îNFJãôy²>ëße6hWßÚH—Kuˆ*p‚¶Tà …ÎËs7v»çÛR¨…cDZ˜hñŽ—¨Aͤ§¢G¥àGáM8â@å¤ÚŒ¶·Kí6Ën%!1€ÛLlª—\(h7«x¯PÍagi& ³Ärª¥ ì¶2Õª?iÓçà§QlŒœ"Ú¦ØÁË“ä<'Ï¢ýî'P¢}ÌxdB­ÍŠ]ó&n.$ÊÀTö>L‰.÷ŒŒŠ›âÄ!2ÞÌtÞ æSYÏéZM«@4Œ«[ñrÕlú6GUÇù@^‘^­ww8‹t¤R*xmÃG£!Ò‹f Ó$:>9D½0B´ÝH–ŸË®“ã¹/i[RÁP,*¨¹çáµG‚)æ•Ó À¯ßÝ ãî(gÑ@OBKë) *°‹@‹ý½šQrÚø­ï&uK<¹ûPŸÚ#ûóha5õbÄúˆ3jÇxÉžU²?‹Æ–­&ñ¯¸çI–»6-h‘’|jÉ?¨\¢˜ÚíSN<ðàìQ+'~Oö£X*1C«ººf$ÇMŠîbiØâøz]]or@AaP´›ççr-tÃË{.lC^Ù`NŒð\:uz…Ö×ëm󇩛¹ÞŽ‘ñÃarö_DÛ*Û©“R6¶Y“‡^¢ìßB8Ê˜î ”ÍMYGöAŪ®è¨B‹ÁøäÌ WŒÔBçÆ€A7hÐÝ;†¼uŒ³é®£ \æžÃ-åA’ƒp¨d§„»mÀÎözñ@P¢Œôzý€ÊêmJš"*TÛ6pD-LÒÁ£ó,áwòv)ÉÊ–M­€å¦;fZæ${É:L¡’7R0|Gý #Ø©€+ ‰>ñ&U,´Nn†Ú ÛŽ¦Ë¢;ï¿EQŸrU‰DªÎo”¥…&áÚ—ù„ü Œ$E•[’ˆÈ‰æäƒøè©`òl¬ˆº1€ζ-/¤ûq=õ=D>=—º“ß´O"£ƒX–vàNum]ô5Õ&ÅÑMu§ôyÑþxÐõ ‘M1ŒcÛè2¦p]s~50ƒ7'˜ áÙ4®O!ÕXc±Iyóâ\¤Ç sgËx·çôBç t-‹%ír8si—zç,$u·¤QoÎºîƒ êDu§° Õ#Â>$ÞÎׂ[dƒ"j•S…p}!‡ƒþ΃³‘§Ü”xߤ]˜ð‰a¬pM!aœàÉiqµ™u1Òû=ILCqôP0{‡»- !Ê€ \F+"¢jÞÝÙ¨ñÙö9sL$¦=å$$¦ŠZC«t®› ¡y‡mx(KÙH8Ë°õ¯Z©=t¹¼¥ù{© %·²°w ôi ¿ÌªxiªA Œj]Pã¸vZ³w7ðÈKI¢×l3ýá3í8ÚyL7 õ€$ @ÖjiîØBJ³m´˜Ù†…ï<$|(iåж”«s:y_}âÊaWØÃ+²o$Î2m¢+¥°å­IöD—5Fù¬]Î%³©[Æž©Š¯»}1ÍÌ×hz¡ÖZtĽû;|æ\¬“غŒåiW÷—oc»s‡nºuÒãPÿ ¥? @Òn]nUôþÂù¶Ñ$–f³`%qn%ä­ç¥áºÈʇê%Þ“k‚Û0ÆA®U«²Õ)JH"<òDÛdÌ( qɾqë½Jbäœ<µÂ@ÌW­J•©€áù#'Ùžã·ð»¶9ûƒ·Þ9ÃíE}zÏ‹7Û9&m„ùÁ#sÞY²{ûíRÀȲ¦ÀÇ!XfL B÷]´ìÚ>äõ š m¢­nEV¬’Sk|úÏÑQ)%-T žõ)[GbÔ­Üwm>æ°e—º\&96'™( SŽ;B)½ja£¢õÞ5a½¼Ú`t˜:V©Ý€z ˆñ4F×¥Ù¤HÝ¡ˆ%3y„(ñiéÓT¼DFwÇ-õ‡·õ{4¥-„´&s©Y¥`m9$W3ÕѪ!ºÓ¾Rß(¾CêvsÎã¬È'n1Ð…-Et–­oìõjjýY#IävíµKÇ]Á$®Kdó ˆ2Çòœ´3øm¯µ ÕÈg·)Ì¯Ú #±ññ~Û~qOϬ´õ êI8ç tó˜†@Âýþ.—!\P€´VPk-i)¨u¼¨M÷Dz"*S Ð]0`Öƒá†Q2€DT§BÀÊuï9$4c©lÜÿVƒp<ª#¦›¸$ÍîT <鯀–Ì‘í—k¤#Ý”{šñÑ^:v|A1,ªÖVcPƒròúÚŽèùaJ15gAB?èdáoíè ób›g˜+y’:äRÒ˜Í#·ÓîËîAD‰¥@ ™¾œ´™ëiK-ôù-ÎyÎ,RKŒ%ùì$zÕ©>暘2jÏ»šèuzlzÍz¸ÒÙü÷ë^o÷þ7º& •‰n^ê¦Ì¼6È÷᡺ä¢M¦Ä€óàÎC³^¿Â´p¶€âHÚ1S`ܽu¬‡ææW˜ ;#X 8$aàG6­'q.$N1Ù”L"mÑR}¨”=¦¼LÁ1$nMxבy–f ô‰‡<ý Tœ4Ø{ÕæÛäàøûg¸ïûöŒÒÈßßÓó«jŽÌñ^5¦¤ {•4ªTä0îRàâ„*ßAëïÝ=¢$ý^ßVó õ¸Fç¬bµwT1'K䢱#êœ:q²YÑ4([Ÿ³‰måa•×Æ‘—[6Aº,—ÆŒGšhiDÝDžv'ƒ—ãvÔŸ$uã­J.ëàyFE*õ7I–4´w&©•™A´i½®gs°¯` ¸…I²¶ÞPn_›¬.v[U¿«­$™åå¤LËg1E(ëGF¯L°5Cä75Xcw¹õ&yTjË»± @12ÒG§*ÞŠÐN¥½¢U”´í‰¾°Á ¨š ØÆ|¦IÊÉÛ„]£vxù*Š· ]oo‘ú{´TFKmÖØÃQ«Á¼´ÿLۉϢQ/´¶.2ÑwDd©ä®+# Oh1t¿÷}îK÷¹â¾|{ppÿðÀà@…ç=ÞÓÊj•Nž¼ýío§ï~÷»ôØÇ>–¶oßž[þg?ûY:qâ„#¿ø ?¯òoã<ÔMpÍÿRmD[¯¾új[ž|â ª¨CuçÿúÚMO¤ï«±:pàÞ'W«M«ê%Ï¢mÝ$Ì·‹.ºˆîw¿ûѳŸýlî—$´gÇŽμT€¡!ûÝgüáYô÷LÊ~âŸH÷¸Ç=¸M( ãûí·ÓWÕüÅ5´é…/|!-.êCíÆ\‰%<ûᘿ㴴ý†®§Ç<ê'é'~ò¡tôøÞ'òb^\sÍ5ü>óR ¶ÃÐVq–Ѯ㓋tÜp›óêÍ++v/|ŽÈ…€È;azøèœ÷ìFAÀ™J8b÷ò˜Œç2å1kÜ¢nz!`æ9gGÞ‚wŠq9Nó4ù%R Áš,qÿ ºú—\&h,ŽX®ow™0çv•¶m°m0¹óð‚ =´]ÔÔ…•‚gn¾c†¶Lô«97dC/ ±×€$†çv¸íãgoŸæOЃ—ßc“!ó€Aƒú“¶@k÷Îrå—UEKß¼šCȘ÷¨r 5éõ\õ&¼Ž›oaÒ@Šs¯K6©3­ä¾ÔL’ÁB€%Âe­ÑlÑ`ýLfÌ+©aŒ>¬÷¨lãyd[ Þ¥jè°h ¤a¼7ÁÍ€‡60Ö9ëÆ_ÿòšæšj€–yï0}fɉ­vXп—M#B0l‘‰‹Tªiì,juGÒ‘¶bœàw†Ðcid Q‡Ä(•Õ$˜šZb#ß²UóÂX'6¢9Ú=i­ÖÒ>îÆFˆzäqãr„›KÑÊzl@H•mÀÀlØa{ÎÒ¶&PÃwD”Áµ´\mÛÞv©[Ñ·Þ†n7›Ø;£ <$bAú5 !ËFÛf£ÒÝRy›ÒK^þºç½îMQ”IS“'é?þý ô¡¼›êëU®õ‚ù¥Ç=‘~÷÷þ°EµCÒ÷pyÑ ÿˆëaР•,¨“¨î?ós¦?yþŸ{Ï» éÉ¿ö«Šð:N–sd2ÉwÉ»Mñ/xá‹èŠûÜ—:¥®¿Žž÷‡¿Ïß_óÚ×·ó™ÏpºMOzÒ“è·û·-‘ß.½öµ¯µÀc À’—\Pðòâ¿8šyþàžCïy÷Ûèò˯`}æf—Lôm*¥+ @žøä§Óã·Ú<Ÿƒ7ÿzú›?®ýýª|;í=ÿBÚHú¯ÿø<}ôCïR uÒg˜IÐ ¡ÿñÓ¦§þös„t¬ã?¿@ÿüúWµ\¿R—gýþ Ú>ûÒ¿ü#ºIõ3¶ÕaÎýåKþP^ºVõíƒï˜Y:xÓ›Þd×ðFÒ[ßúVzÛÛÞæƒyç ¯{_º…NÆøæÛ¦<•¨¼Ô&V÷ÅNÐ<×:é&*ëÞ³ÎDÜÇù¶À &©=©]¹a2‚.Ü»c@Ñ¥EJ ëîå¢!cé:;†‹Èšu*FóµM ÒT,%ŽÆÖªYfû´’Vu7t#˜Š‡-°Ä#óB¥Ë9|t5gv ‘š{ëë –B€Y{ñùã<]¦ßÁcd,ÓŽ-C´Sˆr)kö²;β7J0}µ”cÀ”¯AgßrÇ´•rlë§ó•T¥§Ç *߇N+°½è͵ ÎS€|À¸Üýþ­§X5KÒP‰FË´ibÃUi{±\.ÿ5¯^ã)({_Z}I‚e…Ä0Ôž|UÙ+aL'hÊ‚^l©Øºýjû ,4 !?Ÿ9é&Šp_/:Râ¡Ý¨hKŠSŽƒM6-: Üú„yÑHÈ] cM=ùÜkn{9zrQGĆ~v‘2°”GM,¸^[]o0ðh1&O"ßÝäÎ(›ÇæÙïRRgÉN¡T¢º‰ŠŽ¾BêÓ³ UZ^­ñ¤r½œ«M£E5¡Td0†@}àÚŽ öðâc€VÒNhË:sõëjATia©JkkZ*£•uy˜¸®.¾l±úÝ{n÷š»aÎÄã7$¼Ë&þ Ûí°ÓØÌTxÞñ_Ÿê“éW¥\4àªh¢ÓëM¨(ѯ+ï¬^d ®Ož0*ôåÿ<?z„.TÀÜñp:@þÄ'>aÇmëY^[ÞPÚ µ{offÆJ¶>m#¤7Ýt=’HSÐFè ž÷¼ç=4==Cei+£›ÐW Hz°&ÜçQÞO]ùúÆ~šç8ôǦûÜ?\‹J¢«æ벺<˜ŽåŠî¾oÙº¾¬¤ XwÌIDSjPÒ!’C mÿŠ!–3L–µ~![YY¢Ñ±qžçDþqÐ|³HOìÔ2/œp-^xî=o#}ñK_¦;Íxj¹n:~ü8·'¥æ>òct“À]ß"ÁÜ ª;­¸ÚÕ .B7çl7çþ¦O¯¨³¼Ê 9©µz#÷yI1B¾S›:Ñn™ç|¸åå•Ûíx‚nXPÒ‡aEì‹Ù¼rÊQºÒ×ð–k„ç¦yÏ"5зVë×j›&^›S~ƒ>„];Ê)jõw|Âdêô*?W1†Íøn¼Ñv¸Ô…44?£òmVÅ¥u6 ëå{â¹rlD8<¦¤PÙF|$C%UþÖ ­¾5·°N§ÆˆªKž‡tdb¼Ÿç±V!«q¾‰±~®Gï¦Ò®õ%Í*é<ú‹>±Ýt¢Û;®ž_ZcZgtHÑËŠfÍsðØ"Ÿo¨Ÿ‡ul¸?uƒÝ‰¢s¦›æŠ‡Úµ¤Äc¶š—ÃÒ‰À«L¥”XCT—¢G ¹ïf+YCò,Â7ƒ3£ÊÄ‘‰ZàB0<ö{˜'‰á ¼}õ²v‹wĪeê·¨w±¤c½³'¡NI6qa éIȵqU©Øe¯ù<Õ®„ëM¾ÑÈÆÚu…Ú­&í®·m<Ü›Òj£ÄÒ›¤ ´vG›8ã®)4UjTkTéë×±>ÒԸ氠m¡ðXÃqÙ+R;¦ºSNãȾ_¨z|àÃ×zm÷»Þ¡þÞN1éÙÏùzüžèM‹?~Þsèöï×ΧZ3¡w¾ÿZڮʓ<7\©Âsüq‘n€½l¨²H|"\Ïû?B[·nwÆTB]êE/üC¯\a³Šßñ·¿çÃúY3& ¨¸Ì'Oj•“xÝ<•ž_|ì£5 *ºâ>÷Q’7xU¼õ­oc(7xx÷»ßE²I¾ú•/£ÿTR"׶GKxȸ“•L‚¸}ÃÞà©R…\|¨í@:"iRµÿÉ¿ñ«¼íÚ¹Þôæw1¡(ïŸT’yÞÓ¯|å+­tDòã÷8ko° .ýÿé‹ø¾ÄY.¾”ƒö†\^HzªëËÌDPøÙ/~•ë”e†2P–›~çw~‡%’B5,ÔóÆ7¾Ñ{&Ìó‡ø‡,ÁpˆŒc^ÂÞré=6)NؽþMôlâ>ô¡YI Þ Ú ïåŠdIîüã÷Ê@yÁ 47>ä*?ïyϳíÅ\û¹Ÿû9ûò8‡ Üqü!a¾‚ÓŽy‡7R2gá;ßúzú,T¨ ÛòÕ¯{í½ #¤AD?ûwt½²Žêg¯¢§=ã÷­ZÕ»Þöúܧ®µ ªPox˽¶@ ðѽ۔“Ð#TÏúý? ò¼›®ýð»)–½öÿùýªží$§ÀÅ?½þ•6ÿfŒþèkAúñÏ|²Ë ÖÉ2ÏzÝ›ÞÇm5<ûÜg=Ù\4gsꟌ›·lUmú€×æ|ð]ôÆz‹"hêö™AŠë‡_úÒ—¼ë˜3/yÉK¼=ùÏxÏIÔ°ÜĉA `ªŠYvã-S´‘ÔN²‘çºMyÀ¢“:Õ¹’r´S›îIÞnÏ0÷í²1ÞdÑ" Îo­U“ZÐ! Æ b83½H㊣Ϛ DÖ³*ÜàZÄ£n@í €H‹g9ª¤  K´}G¦ˆ>­Àɉ©%ºø‚q_ ¡2=¾ÀvûΣ‰Ñ>¯<b)6Rj($D«óPbúI4:¢¤ e €ˆXµ ^Xfç×ÕX@ÒQ׆ög >ÜWµUã “\:ö¨Ó§&P/ :ûâWÒ cØmœ8µ¢ôºBìUZUmð¼ž?JWÜs Ýó’Mfbgýû‘0…blÓD*4(‚¤9ÁE·jëæ~ÅAèSܼ>J*½jLµDú‹ fÕ{]F´RÅe‚w ¸²;5נŵ"sæTß µYRy nGW×¼áàYöÀņÓM'²¸éOØ'}Rk2ļÞWRz÷;ßÞòØCz%­ÖµæóÙZt,¥îB4cB·nŒ®!É°¾äÒ{³¤ïö˜’<àSŒÁ/SR˜¡M¬ç €Šþë˜Úhûšß|ºËn·@›þ‹ÿìiuyšõt”ôòØÑ»è_?ñQ¯û¢ëž¦i´#Ú š?`¯xÅ+ì>€ríÇ?E§j `iEKÜ ù`îï)Ðp&°¦û‹ô~÷wh‡>`kâW¸¤H ^\‚œÞzC{»õÀ1úÀ?d%©#Mz¯ü<×U*d#e—³"œ'ˆº7m¤ÕV”)+µíH¢8GÞ¥Q?r@ ú9¯öÄ%ýcFÚSŠì{’@TKygjÃ!„yØžv ê–àê^tñ=[Œxaïá&‘fHŠÙÝ„IÀ_¹˜‹®z¾çIJÃ$ù070G˜ÙåxÓûÉ=œÈrUÉÚ*Øç)c¬¦¦<¨3]«ˆk$ä?tð€UùÐêI¬!—V«]…uÁ–ƒ\N®ó—š2ð¹çü}|-ïàÁý6/sß•Tâ5¯ü«° 6¿MFBzÙåWÐ> IuG ÞwràÙ²ZÇúÔ\Õ‚›¼Ô­ú¤žÿõ_ÿÅß1÷ݹÐ)!Èäþ;gè®C³tÓíÓ^»º)#œgÝ‚Šv„{¬LùËkW'@òòêÌKnýÝHQòÊm¤ÂÚåöƒ |6Éôj‘t1\©GŸÀ²Ö¤#d%'ø›ØUö¦/€LK‚Òµ¢ü "vÏ]œ@¿ý}E&Ü8Æ”ˆÛ£*SKjž]§“§Vijz…Ð’jDny’Œ Ô¢Ô¢y_{v ³Î£äí´!É"€Hƒ³^Ú¤Ú°Åq ¹ÌŒÆmà‘…­ÐäôM*°ŽD‰ß%CT£xÏ«&è"KâÒŒxOïšWb$ÆvÉ™÷Η֔çnÖ.l ­8ïE#Öeñjª…6BîLƒâÜk±M7q.>ꪫí÷WýÝK=¢eýÜ#c¥bXPA\T„ÂÃúQ¼±6Íßõ×_GGŽgƒÿt|Ž„Y­˜úëW€_ÂgÔ' C 7Í[á¹Ï}.s¬‘@HC:"sH· ó´AsªM3 ªmêûZUKåvíÜÁ‡bQé¨ÿÆ®£µÕeSW¶÷A%H8àâ% }9zì8×'R2H« º°3ª€¢?ã¿c‰g”¢uBeÀ>“¬jµT‰OSâqQ"î"Ç¿¸óÀ~j—À”AŸ,¸#ï+e­¢8H5ðw&DŒ²ÝªÇÒ1uxNŸnµµ÷馂#ì-÷Ø7ÎA=Ý=%oÏ ¥íòÜpýwç{ÅËCòŒÐJF’ìN¢®¡þûŒ’xüÍ‹þ~ëÉ¿@7ÿ ø[†CYâF—sð®”í1I* c±Z­+0°ÀêºI’„¬Z´mË–í,‰Z€Ä-ªmÒY‰Tä;ìI$ýóë_Í*Yn®ü©G ¬´ƒ®œK f1Æ:ѹyŒ«0Oø~a»óË¿üËô¬g=‹ç×Fj¨³Ì(ÎvÃqÚ®î~Ò tS·Ô•÷|ŒÈï\‡ùbßc¥›±Ÿi×ß<Ôm}’p>8º¤R˜R N-¸H² LŽDŸñDÎù-Ï8ítÛenô0ýXÑ.nµ1¦˜ŸÐâ99µl<>wmbBªu¶1 Tl+tñ¾ :pp–ŽžXpì;a(®€„’Âœ\d7¹Ò½¦{sw Ó wžeƒpÛX€¦±~ `ò½[§˜6ÊÔ³:O¢KŸáðöÔªe£òK·rŸ$¡¼ë¾w‚¦ØŽ0¦‹öMðØ€ ݯè2иEc–.ØÙÏDÄ2Û4˜ˆAeÝ~¨FAŠáÚz$díCܹ€í)»7á@iB©n‚±×(£š•im4>”AP!o£Q 6 ]_{M8Ä‚êâº=Ç ‰h€‹Å¡½Úõ‚ð×”ÃNT›‹´OijÅc¶Wæ‚·É# )ÃXLTß’"l›ˆ™ ºêÚ5.”Íq´ËÞFî†#`ÃMÐýPP*èCP¸`ëF¢%͵í‰Ö?déˆPÙd°;Òº6ôo˜`ƒ."´öbìtQ*»’R}cÝy.7k©¾ÎË×÷3·¼»´•"IýMÕå¨[zôÕüÁ}öïÿö9'r½žp…ÄWÚ(Ä@<)k0í¼3ï`ÔÏß÷¾÷³ Þ©pí:ÅõuÈ} Ð8qòx¾ÔçEµz%‚ôÆÒ2¦»¬®¦>abûo5º&kÀéÆ.ša° ]~0+N¨²_ü¢?ãgÄ®¨Ýa&÷®|Ä#,–œšYàyÏ®ÈKd½‰¬-LÑ þøÔ¼kz±Œd^C•D¼k›)Èû?ð!š[\¤ç>åéöõé‹Ÿ£åù“4Ô‡¨îj/¬Ù…±ÄêëM–2c…äI3Ü&/¡"¶ÿŽÛIf@þÖMƒ<¬§³¦Þ7—V›Š0/päðgÿÞ3ègUY·Ývýæo>ÕŽÑFÀ$¡÷*!ìÜñŽ¥˜›d±ù€4 }“ç1ÆøkG IÂþ599OS§×;¶!Ü3Û%¬·ÚEö€ º@ÌC Ê%Æ-¨.XïƒI!±1‹~â¥ßûƒ²]Äï?óÉÔ1MK²÷ü}^>6ô¦$[Ojî³¼ÉxX €•þþ¬/pnðŠ¿ }ì#ïQïµ×oQ úIÓ¿ M›7oåï7_ƒ*8«p¥"ìæW­_ô;uŽœñsJ ÝI꾧ؙÓ.aïx„Zÿ˜Oú§Úœ ØÛÑ©]½c®ä’¼ó?,+–g#¬¼Øï¼2ÜÔÍ>”÷~ò€ÞáKj^õÓöÍ}DÏy€\·W”˜³Phù ‘w–Ë‘º´ è:¡I{zÊ4«á¡^mOšøJXª±kÇ èZø…çÑþ»fÙ¾£×—_²™Üušö+iÈùçZ #ÒŽï+)Æ÷o›Rß·Úç ý Ô'O-±¨Wõ˜ ýî£$!·Ü~ŠÏ H8êŠß½cD†íD.WåßzÇ4;‚·,HLîe$,H8ƒaorXIZæçW¯Ìgê„&Éömhp9Ï·‰×8´!H&!"ðpŸõ÷ÝFe>Ä`Ü Û‹åuHJÞæ€Áë‘ÈçV0Pkd›CÅÄÿÀöõ §]¨X¡\bCJ¾%"Ù„ÕÃztà0"ò„µŠhfÝ{mÐic:$ÙŸÕ; ø@ÒýÓö$ ðˆœ1œR¿,„d JÉgF§Ù3E£^U*ì1(.h-谜䒥ùå”9£iêÕÝŒ<)‡Q[â1PÁ½Ç.p›%EhÕ4ç)BÈÅ6¦®k›ë¸1#L %uØÀfcÛæþ–¸3:2vUùʨ[ læQ™í6y¼ê¾²´Eï7Š!H‹k´áÄóÚHž47^_/XéYν½F’Ç|³k£ðv¨õõÕ&Uf]j‰¿ðKç îgÿêEÏc1ojQ­ž 5Þ) s|x¨œÓ²ãèâxõ}ìÏË~«¤_cOßüï¯ùs[¥‡<üáŠ3úa¯Ì­še¨o¥”1 (þž0§Q»ý6ñ†ÜÍDt©2@/åë¡4 8- |¼ð¹´ºtŠÆ†JöÝ4S­\k4¬jhx` „ÃA‡cõ%$íÝ$af Þ:KŒÇ-“èæ¢þ‚Ù à°ÂØDôUW]­¥-êú[Þò6~Ž"pq ï‘Õœà|ÂeaŽ8?û(­ú†9|£‡ïx˸ï°Áhƒ Åáá —_mfh ãÛ¤{]~1{ÐÂ4aÉöøÆ9ŒÐÝp u¸nˆHBà&}…á? äC ’'yuÛÉé5éÄå•|y gÜöñ ¯)Ø2ˆËZÙ¢ݹŸ¬iµÞ Kñ=mËÖí&f†«.eÚ#…š¶Å€‡ì3¨÷ñO|j‹ûÜ÷¼ãM@‘¼,\¯QYÄEãýóŸþzܯñê×åþ¦’†<šÈW¾üod÷™ÄÍEÙoUö•x¤-çÖ›µ·«o}ëëôèù^ûPîµlH/§{ÂsojvzªmÁG;W^ÂÂC>|| uãöà­W»yÔiÎvœÚ‘¼çóÎïXÙìó臼gòòä#6Vø¾e¼—&gVí³MˆHŽâÔær¦Lv|ä³!Þ–ö‰½–¹Œs tVb‚½Ä)%ñì±Úp… Cî}{ǵ!8èhuAˆ:îvÁŒ½ä¢Í8îmEÚ{4¾wË$ÿ]¦@†¸¹Åܽð‚ Î 5ªï«ûhúŒ3æ®Ã³l/røè<Ó£{wÛ^Á R€aHßpÓ$] $5°F.œ·ˆx>2P¢f`ÏÆ÷PÕߣ¤)8;SÓ—óÏã ‰ðêUš¯Ñ@_ SMÏ÷]o2˜°€ÛÙ͉V_Ñ3Ôµph•]»óÙ07¡˜L˜°.DŒËp˜#O»3sˆó¢q°"õU|WÁd:_e›Œ„UÅ:“‹¥jbŒêM71œAí5J»~Ÿ=Ú(œãáy`ÁŠžÄšÃkÌtÕ2x[¦M㪪¥KþBŠlòI†ˆjü¬,Êü @/d nn«AOØPת:î¤]yu;J»ÀýÎÒ(ã¢ݘ:µÌmáw€ÅZ)jƒ÷Õ† 8¨îÃÕò(lFÌ°Œ)jR§™ùÖø í;´Î÷nö/eã¢ZÔ¿Ø-­±À9.ØÉL¯ÂpJiÂ_K±D¥ÍM¿öOã?&ÕeOTãqà ×ÑßþÕ‹4·U°ª•mµ¹ÄÒ"H°ÌŒâE·+õÚ]0\l}øíšÛí·ÜÈkŸšktÓ÷oà’~Zä_øÌǘÈoÝF¸ñuûJvLRSkêmä2'‰RrcÅÒ#}=ø¡ㄨóe/{)ÝuðX&éIRÍXH@0b³/jÏž¯:jCÏ•Nv èOƒU¶tB¹Âüà?­ÃÉk Qè¿§Þ o×#¾#𢤷)búÐí*j-½lâ#!®mf ž³Â„{o{ëÛéªú^úê—¿ØzØs£õ9 ˆ$H>p ªj°õºÌÜCÿX +ÉÊÀœ;:¹Ì̃íñ~»D²üæ‚ó*–8tt›¤¬F—Ž]ºgB8» ýµ54ÄÒÈ@Q1'*4³PezÍmK»s=v=/_»vvÓ·ìÔ„ýšž]§³M!¨bû¦þŒIúíÑ"cv}I!#ÉRCŸ™ßPq,–tÞžŒñ·yB1˦—i8éµ6 Ëö)q@I<öìÕ €–š|@­ v#Ã=$ 8÷9>Ï@âž t°Ê•ª·¢Ê¼BI3nUÒŒïÝ<É cbÌ€,ÕFVÝRù›£›YrÊìÝ=ÊàéÈqÕ\ 9"`c"A!í¸çÅ[è¶;ghMI5 ¡r\µ£^`aIƒ dáØ™[ZÌhw•ÿÁÓ/¤×¨ÅVT»a ãöÒÑSš ŒCl¨¿Àj8ÚTœ¼—‚s}t°ÄdÀ$«l'27ÏUÏèÕà… šF­r¤H­æƒ¤ƒÕ9“Û|BªQ­eF«V"aÞ=;Dà:E¤ÖjuÕ3›˜hë+XŽµ­×yÃÃ!Ïf!ií§X㺾÷ö×Ú|nº×½ïK¯ÿ§·Ó×¾öUEh¼]­¡%|u_9ΈSTïë”MîŒü!¦g¿ šÔ×7`Ï©é9#ŒKØäž½Çðð0­,/òEÆÐSÊÝ41ÂjžšÈ¯_ëš9Ípå…éO_ø"zãë_G_ûêWL]JRZ«iI‘`” Zªbü™cìÁån‡N ×Ûd5DÝQ»oÆ|[60O®ýà;éᱬ҂rr„ðÉ€}W©ŽˆŽ=A«djÆ‘b5›i®<ˆr‘hfCã(-/­r›$îQ^æÍâjÝÆìÁ¡³Vk²‡¿X %Hd@ÈóB”ÇíĸÀ64yAE- ó¡æ¼½#Ü#Ï4¡ÅûÎߥ${Û‰ãl<èáôˆŸ¹Š\2ü3ÿz-G×çL¦ì—­̀‡sË3àÝhI.è@‚]$𪵲²Òr°Î/ ®¯ sycdþÒ¿ȸ†sõ¯P˃”ôÿ½ïþ'²,aÃÿ—‰ú•zv-S•]?0â‚Ϋ€òœV{ùäLgQtžŠå2Â~Sã®Û¶‡gu»<Åç~ý,R+ˆk÷l7ŒÈN %¯Ýa ™ á9.×ƪÛñ„—N$Ž:î0ÄR©ÏÎ+g)Ò/qA‡ô‹2Æ8žì­èð`\ʱ¶eó Í/®1­âtb))291¹¨$"ƒœ@SEKî©Ã$ÇðؾMâð¤¬"…:!í€ô¢×€’j"“CzrÛþiÚ¥@‡µQùwíbàp×á9öб}K†öá‘ ];zb‘VqtÓm§8r:y¨çË¥ŽÓñK´°\åþžž]aÉðÐPeLâ¦ý]`,‰}ö}UÞ¥âؼcdŒÇ® l4iZ‡G§Öéøô:<]U•5˜pÀ'Ü2D½±á2íØÔC»¶ôЖѲ2ú ÛªDÖãê{rR™TæᎬÆà@l>ì»f¢ @L´½‡y»©‰6^×ÄÀ’d ^´üíÀ#PoB€üÁ5'.à‘êÒˆDÿÙù›C‘ÛàÄØœÀ{êÅaB¬frxÏ‚ú¤–CØý»• J³Ù ‚ 1Ž$Pc˜ c Õ„‡mQhtd¨Â’&IÕÌÜ:M© ~F‰·WVµqvLäã(É»¯A¯i x1Žý}%V Ú²Iö*zÞs³ØH Ÿð„'Ò?üãœõBù›;9 Ç™Æ2yÑ’Þb]êú&TsdJBGkkŒ†o}ëÛš(6ÆýØ\ü°GÒÂ’ö€…wŠ>KTry³#ÃC¼.±'€Á†Ä`¿V3Ãç@_IKGád ¨çTê`Òç?ûYÚûÓ@ŒÅK^ö ºêªÇÚ¾`¿Ðj• Èx¨©vú¹¥{ÀãƒíŠ Ms=`¡ÎK/¹‡T1Àõï„Çëà´*†âPñý‰Ä–+vŠŽœ\é |„)œcº‰ù'æëø@þƒ×«$wíwóu›?–bûJ' œ§â”W¾äŸS´%^¬ç®•° Ëm … ¿Ûõk“[v¬îXj·g‡ äÄ©erÝêš-§§sÖþ$,ÛLpñ€IIæ Nâk$6Ÿ¾·®! Îå2˜ŸtLÍ,3$D!ömØtÀ½-ì+R9SÓ&ˆC…ëÆ›&Ù¶ƒï&ŒØIñ>`€NB««¿m[é¢óǹlxÏÂýÔ‰_†çöíåó-†­ÆÊJ•ëD€…];9¢öòXTgÚ«˜™᣹O¢ vX;D$hb\¯€Ï¤’I[ñO‰ƒûRÜ[XÑœr¸¯D‚$cX‰ôú™»8Äz–Àm„Ø‘Ê‘X_é¢ñMÏöFåDl"„¡„ª‘ ôŠºVší`଩H_YsÇQ Êêí)X< дZÓ ™ ²QП†MÉÈgs°¯o—B“Oc£¢¦™Ó§;îü[Z\š¥Ô!úÂá²ë#hKÆùJ,‡]ˆ}ý\Ê¢7­»`õÒñ°VëÒFüµz“B‘¦|†‹:üæuï1Q K_‘íx …Lå€=QU›&²¹ŠÈ\ÿœ ,V‡û{q©ÆîAȾ°8_–Ç’—J‘9¿Exòbâ!àö˜G ©Ä¾Èbw°§+ã&¶ÙQ"ÑZ·,â¼ï›Úceï]sWÈê†jŸwéòØ…íïþöÓèþ˜§6„@~“èÚ~¨­à@¤-â"xëöml“€tíµ¡eø¿WÀŒÌš{ØÃnŸ]V¢ÔûÞï~HµÍ³{Ø朗rpêM·Ýv;=òQñ¸ÀÛw]Àn¬eªHjU6ÒAJ ¡Ìí5Ë`_ÉD—%«’„ÈÌoxýkémïx7m•uãö"6†ÇXi)­–ºíQ› ¤p7ÞN÷¼×}Ìa§»tÁžtÃ`Ѭ;í nŒ@ü¾åÀi¦%Áu0¼êŽŽöó°•Š×zܨ)EÜëâ:ô˜(°XÆê¬Ãìzã‘FÄî2û+©úÓF’KlK¦ãps÷W jÍH5¬G­DoY2œh£w}8öôû•TûÏבÁý |M£òQ´gBʇF“‘]ÒÂì9Sð41þ8Å?¤¸Â¯±D39Ÿ\»óÝK¬›‹²ÙØ@pDpfÆŒU«ªu%îjµå7˜paÇîËoùX1»Pw6_æ–bŒC¼V‹ëµÛ,Úq7 “~×ÑEÖ3p A¬íæ®hlK V½Ï/Hàz½a½e¥Mm ЭÊS·)ì Š64NÉxVζ,äˆ×Ržòa½¯ŒËkU£ì‰ Lêi. ÷?ýéÏ0q/ÀfIõ„ßuøôô²+BHɪõ|»%à ÒqL'`¼¨·€ ~ÁiÂÒ¸ÏÅ@Þ¶-Ctrj1Ê<=Û‚}}÷60÷sæ¤fdt­ñ•d8¯å‚¿þ9¬„cfñòò:Û=”  ÃnôaJI¶(b^Û«~nÕ’ x›Ú¼i€äà†TâèñEunÌÑž]#¶lhoŠì! »¶Ú5·s»>Ç2pÞâ9?¬Éž¡®uû3 D¬ðµ[íæЯÚzÞŽ!:vr‘Ï €‘-›ààÄØ{$P»êe<°f< "–È÷oŸfÐÁ´=iO«—\0FwœcM 'pŽM+iÏ’ú½Kõ7#ÉSÍ!\¯ùàã µ‰RQ8 Z¬•†É¹:ÿÍ-kõ+wÛwFBJá9xÀ.Ñž­=´WýM •XýJ8œ¬rÕ•«‚ÿòSmk‚»¿G«l è?ÆkFÅjyEG¥†ÚKbš FdÅBv-1}`ݽ€Qµ}ërÁÇêê-J,õEô£viÏ®ßVÄú®(÷{”>${µ¡ßˆVmïå¨Þƒý%~Э!Õ*D×\^©S'n2bâRIC…Ð{ië¦~ÖAÑ>ø¶FÝðp0…ˆçó:0b>ºå¨´K¬â¥þæç×|`B£=JU3Ä5–Š­7XÅ ÑÊgN¯)Qß*«HAm íåˆÝÕú9y µ€¶Y«g¯ÞŽ±¼2ñhÈÿc÷ÐÆŽ†óÁ‹Åá»øÝ»ûÐw¬¼ljbû PZY¿¹¹{×N]Žú{€â"–Ù³rˆ`í¶£Û÷¼B^Á%¬´ Dããõ‰¶LL…áA¬_mãÃî• q5ÅU1††êaÃØ24ÉüNé{7\Oß¿á»V‚‚¾îܹƒý1¡^Ò¸@\XXµ\#7Ýyç~6ü+c7܆ͅ—\A§ë•ASë m,Þ¯˜-C}8Ô« ¾Ã ~-s 5Á"Up›=3»®æò*A>Œ ‚£ýêýT\fKûOèßô>zúƒa¹pUC,ƒ%ìõ›oºÑ‚©ö,I²v¸ÏÆÂœ‚êû&%åÀßý~â¡æ}ozfŠ>~íûø/L"‘q}Àâ·SˆVç™eÆîO€dø\7Ä%ò¹öBØ·6’Ü9óÞ÷¾—>ñ‰OðÖP»k8Æ{wôÓù;øûFžu“GÜR>c.¶Ot#™‰IQÜßî_ Dtól§¼H Çò¥±þá7ÀGX6ROààñLh ¤)E'<&s"[¦ÐŒ`K†!g“~Èe‡í„‹Ý%ŠóSÆ ç2ÎîãJ"@]i$'øzV'®ã|‡Awêü76ÜËž¯0F0"g^,²V dÛZFŒ"åúÚyÔ=ØÝo‘ãˆÀ ¼i8õ¨×a£­(&3€Ìœ:»$žÚIh·•xÂ6$—^0N;7÷QŸ¢gpÆCUm=¨ê,˜~óU <>°š“cÌœ%µxt°Ì÷ñ\o8]§#ÓU:5WcÎæ:›Nel`.w 7¡Í£%Ú5Q¦‘Á"« ÌrÉ—È4 8×î&GˆAàzcC›™×Ñ­u5nTR­ª%†Æ tÌÆÞ4Kâˆ8û.íÛû<Š¥Ù¹/ÑM·þ’’n|Sl;©]*•†éž—üƒ«¬‚Ÿ¹#š5 о mU\€¨¾!óêj‰ýSŠ¸† ѧí³Î&Øæa¿Ž|Èâg×Ëj1ÀãÂV5QÆ ØÇ”£ž+p[’ÉS«tzN7ây,µ“lÄÊ*‚†L[Ltó1µ©±]K‰´šˆª~,,¬)h,jÛQ?ûA&Vë0 „>6Ø"@ööVXïzXõ À ®wîð9¬~‹û\ù³ÀÂØF ï»víÐsÙ™N««Ë RzL<—B’Íe!: 5+›@›ØT®|Ä•fM€hßab•Ä\yå#ì½W¼ìÅô+?ÿSêï§é—ûSôKW?‚~ñ꟢_Âcm©€¶¥((nÏ2}^IkÂô4%u¹ð¢{XIìz íÈ×Ø»’YŸiÀ:MSa4˜_P€÷­Š‹)FÚ|_e}ÜžH÷»ÿý„À³ßÛ—Ø»T¥œ˜ñÑP#ºñÆë[Ú › ŘC°Yþ bhTz9þ öD:Ç_OÁFgÏKèå¼ÂG`ħÊZ0M´}Û@¯. ™¤Ãƒ´±Ò;E:O5ˆ=yô—“I£[LØ;ð‡½sæ vÑOþÄýiçŽíÜo7"´¬oCÉØ}@¤—Ùî¯V]1©EA%û T]I‡<·Cq%¿øù°êPËxšýó-lIW]Ñ­[¼x!¹ñJÈ6+æFÞ¦nû /ç†D7÷vv· 3·…"—2`Œý€³ÛVõ}+ƒ—šq‰x})±ÏãêPä0ëðÿãõhÈuÑOÏšÉÞôLºò§iúFF}Tgü—½ß´)2æÜÿ¶×Þúæ×Ð5¿~ýƯ>Òþý’ÚC~ægÙ¢Úêz¦jG`‡yðé¾GÌÛ3!>|dð<þ šK1)Ò„Ú¿aï&Ô’a7…³3öl§Ô g?lGâìgÝž·yÒ™¼ï! ¿»mhWVlýÇÊÏ“ˆÄêX¯QǾÅRìÌÌ­)²`׈S¨¦-È0„¬YDf‡ÌÖ¨Ónû§~CÝ ôI]<°¤Zš.pÓ´iϹJ’|l£‘ŠD&eÕ*HTLÔ5w‹ÁŒ:ÃáÙêäÔÇÑuê{;HØwÞŒÈèpÃ-ñ¡Àt„¡:èH(]äÀ×Ò\ßwÞ(Çöã Ò’ÉSËgM}Bëü]¡) dyµjú·)KXʪí`î ø¸joaóHIÇýè)XÃl­ò£í*Ü—† ùûõA{Ž¥UíUJì6P)ü°;U¥;Ž­Óá)F³|,¹RÿŒ¨òDöl.Ó&0@tãP÷MŒTÔÁ „ñ ¤0dŸž¯2jcYF ¦ƒj}ôJÉl”Í­’àGk®ÖŽm¿ªˆ½]Kw~-ӧ^KÒ¸’¢¸’™ˆ‰­ÕŒ+iŽ7¸±ÃÃàì÷hãO O: 逄GíÓö-á†.Ð*#Í4š¿A´‚èĆ bînQ/€ê…w’éUŽRÒI±Ñı`ÔûÄ„QÓ–‰^ÅAê5»îÕ‚ °«É¯þÐ-Ñзùh7¯>,ÐF ¸ºÛ4ÑÇqLØ A£z‡ƒ=œºœ0ÈáÏQˆ“ÄsÆ+ZMÛì¤iæBW\DÃø @Î —«tñ%:r·ûwÓÍ·±q<þ0&ýݹÏn®qÆñŠèÜw{q4¹¯‰ì:ÿAﻯÀzð‚-Ç;©k£r2kfmm™c‘àíëu”°:ÅÖ-c,‘ĸüÛçþ…Á‘Fo}û»XUê EÄOŸ®* C™î©¤¯ùÇ7Òk^÷FK4ºô”ýô¦[B×}÷:Ž˜é ã1®¿ýŒç(b`€Eýh7ÔááoLm joÌÄ÷xãþ™UôÜB¶ ðöâóQ®ÑÎWýÃëé·~÷÷i~¥É{ö'¶e+ƒ€€€b¡u¹kP‚ Î/7¸,VÅ"͘q Øce } ¾Pš¸?Æœ¹cÿ~^ÓÃjM –(&œqÕÄ _köÐ+^õ| õ­©wV[_Éá²ê9 5ZìCX¿xß·ßú½¤ 1b%ä|ºÄ•‚°Ô[ÍËþA+‘$€Cö²€`i8¿a¨ÃuìJp>¶©=ˆ"DÌÀÀC¼ ’MÊĈÑ=)2þ®ôA\ÜôgÞh<àð«´]ôÚòíoÞ —º·Ä€«*–øŸÓÓ“¶ÞK/»·ðO!ü¸œ9w,zä]Âøû†œ37}ï:j@ôkž™«²íÌé¹xbCœíÒ3žñ Ïm³KÐv› ûË¿üKûûöÛo÷ÊsSŒ»48©³–â2CËÑgÏ6¹Äºœÿnùy}1Ã{1I„[¯û=4ò@J^ûÝvtj·ûû\e^9p(s×ÑOòhs&ñçù[*6ÑN¦Äé›qwÎ da512IH™½¸ž˜\Î8mx˜¨ä#ñ@¤,xƒÎU˸ 8Á=WåÇõäå‚H|˜Gụ̈鳟¾–Õ° Ù”1“’Ä‚¡AXá²ÖML¸ôý%—]A—_~oSVÂÞ¨VV3 HŸËtèšÍlk‘Ù-Š~ÄÀäEõ*zÍßÿ­Ž $Ù׼˻ÎDÝûÚWþMõuJ_ûÕ§pÌ‘Ô<75yÂÞkõ-î’y­›iRíM˜ GO.3cy1ÿb±w0O\ÞEL óP$d!ˆD•*̇˜+g\“¹¶ˆ{lĸs±kB7ÕkTG­h+£.væ¥n€Xx.w"âC€æµÉmGŒ¾È«·][ò$5±1rë‹•uw%‡ƒNÙ±mÀ0ȳú &,CJî˜úÏ3M™/DüÛ<76* +Lá"4@kà:ŒÄ…B… ì0Žž\`OY<ÅÔ;a¯¡Ö×-wÌÐEçéoMM§_²oŒÕ›ðÜ ëc1eÕÙ‚’†?µB‡Ž-²»DEǹ{ážQ >n½s–.½`Ìx ÔL6¸ž]š£†ºÆ4Ô¡w«1*š1éWm¸xïÝ~pžâþ-.hwð}=™{û¦^n'$N<^÷½h4yç&!!¼ÄcPÊjkÕ”;¸!ÂIsu…pBY,UÎŒ F ³ &ÑSöà¥3ѼO‹ÀÀ1\­jU/|¼ËWe‚ µ‘Æ%ÉÁ(î=;1t.öö¢’ÜçvÊKß¾á×L¸¦u[&E—_ò÷êGŸ9=÷ úöõ¿fŸ)ÉÒù{ϧ¿Ý›èz_ÿØG?HôÇBo|Ó›é^÷ºWK9_ýêWé9Ïy=ó™¿G/|áŸÑèè(:tˆ^ö²—±ëÞ½{éóŸÿ¼÷ ®ÿÝß½œîqÑùô‰O~ÖÕ“ôË¿t5ØP6™kà={öоðþâë†nh¹Ž4??OŸúÔ§Ø-è/üÂ/Ы_ýjïÚõùÏFIFé]ïù€ÕÑýâ?K/ùëÑá#‡øŠázhØ{w%,r§BÇüº·AìL²ôvª ·¦ b‡ëõzÃØ"4M,‹3o3ª|å+_Á\_×ð FˈŽÒÃØHû÷ßAù¢?³îya_ñÔ§=½¥œN镯xŠßzúïXÜMˆ7òâ½PØÄî=®70aHœ§>í·éš§>Ý>'@Ä (é…/|!½Úö›ÃÄî»ßýnE@m7ÌãÄö/5‹ ‹ôE`ƒø ¤..Á_0ã„+KFUQ³Q^Å0Œ×€`ô-DTÈñˆ+•4uˆ 9L¸NÒÂk?úazó?¿AÌÿé´oß…À¸ ’ ¬ýÛn»×Ô_ÿõ_Òc£‰{ˆ ŸÈ—«oÜ @@&ôêY ]OX ï÷~/êªÄ$L, a˜Ð~”ƒzFÇzë¸V›ù½?xKä)”W«öÂuîWþó ô™O}Ì0ø„@†G}}ÌÏ?žžðÄk<@ÄäÞIP…J7+0˜Hôü¿b{·IBï{×›ü:pÕc™®ùÍg¶ä8yÙKþÔV’تu»'6mQ’Çw’ÓPÛÌéé)^›Œq9€Ú'Â5 N$vƧôÿþ:ýþsÿÈÚ{4@¢˜yïá%/y‰ÝD(wÓ³žõ,š3 8( Fé1›¦v üüó†™Aª»Ÿrüƒå•irׇxl—Ú7OX¶ûlL2Ò-(鶮vÏåÕ&œÛçš/™W/T†Ø0[ò™˜&5g _*´‚9Ycöô0ÒþjòM+Iìl{*™+p0€g•„dÛ&Yó:÷±“zÿß½k„Ëi6´„ j]ûHÐQ½…}Ûa%j¤£Š¦A{è0 .}ñ£&`¯® Œ¨ÛîBܯ¦¢ÍË t (ZºhÇÌ2܇Æú ÏŠ—œ?j@¸n.´VâJ±Ý!L Ƈ}ÕDhö@âRâàW=°ÎÉ@¥F¼Ãÿ°M ì-ó ×êÚ3 ¤$°9h^6áî#0›F`ÚÞ¡jâ€à_U¿×æëLB}Z*Å$µœ%õ'$'9®¸Uü\UsQÔRåŠñ©}魯Ðb"\ØR±`âè>‹`mý¨jw\ ÆéVšAº¬©™/ÒÒwC¼ÿç¢ ¤Q_àÏJQcü Êú£ç¿ÁÇ›ÞôFE(ŒÐSžòºå¶LØÌÍÍÑyçÇD;€€þž¯žyÑ‹^Ä~øñwÍ5×Ð[Þò&øn¼ñFúÞ÷nTDí}˜™Ÿ=Iÿó¯ó=\¿á†mÛŽŸfQ »!<\ŒÈ‹„6 A’òñ‡|Ò€!ÜûÜç>ÍÄúæ÷¼€þðy/à~¼õ-ÿÄ\¹'?ùuøßIò'ϧ»3ÍûÅ{†êS¥ÜOf:æ¿6N7À¢¡ÁPµv÷J`°¬n»ízØÃZ (Aà·€uHƒèþÂç?§Ààç<ñbcl|\Ýuô55¿ö°‡ë uiÒõwR=³ûÂËR^=IýÀûí3_ÿêWèê÷Sëé\Ï ‹Ônh;Üø~é‹ŸÓkT•sûí·Ñ>³Ë„ää±;YMïîÍJÒ‚ ðq¢Î`ŠÖv()‰Ë9!º2 ­®¥ì ïõoz+}ü“Ÿ¦ß~ºöºd«³®‰n¸þ»ô¶·½¾ù-íºÓ•@"ˆa 85É¡%*ŸËs“4ܧÝñV(©›šÍ¦¤MƒÔ§¸çg °æ¿ªÖÞ'>ù)úöw|õ#´ïˆ¥Æá@&Q)v ‹|ëÛße•¿•Õ„ææí{u%)H¢²‚ö¿êUO³³óô¿ñëVíŽÕÂŒ‹_;âñýCúZØ+0~ @C"&ˆT|¸Ä®ÿʯü «çØÄ€êÁÞ„?|‡ºÌÖ s0ªb&wcmJ'§"þØ{þ>ú؇O:Þ¯ü¬ØÛAœ˜2<|ÁÓ0ñ‹h±ïüïÛK‡ÝIø ߸[ŒÀ>`ÛõùÏ~BÕ9DW]ýË`A2ï…Cï²lgÈÐ “KI=.¹ä^´gï|o“'nºU™÷½÷-Jjr€Ë<åJVœþ€ÁxÛþCžæJ;P{ÈIÅFÞ!xNL(‚$[”CB/ڰР(º´‰úëeHŽEtèU­mpm?5 £Ë9yj™Ÿ‡P7Á#)¼îÞ>ÈjSÒ0Qo»k–éì{(àPt4ƒ Å`i‡ÊŠ{°Ç‚ çšH:p^ÜCIù\ä¬ÅZ?:¹ÌÚN¸O´»¶ös=²—BcêèÔ²J(Æ TÓaË ®n* À NŸŽ¥í©ftTcuЀcÉCYàfž^4!’Š¾{ÊZì Þ­äÔ˜»Lìu?¤8Ì*Æ+OɨD¡.J”hõ)Ä5_©êC*Ø‹Àfâ¾`ÒH³¿¢þ&J«[‰ê~Þ"Ê'f@ô¿ï}™KDôë¦ïßH¿®|xTB‚>ñãŸðëtée—óïÿ÷/[oY˜àI€„›puô =P¹‚o~7ßÄø]zÉ… =™ŸšÂ¸Ûã«0ÀÌi}È!®…xJ õbï¤BpK9Y;],!›¡H‰ð]8P`4“^«ÜA©wÈ' t Àël3- HSxØÆê=3àÑÍ“Õ¹¢Ü;v‚ÁŒ¬—þÞBö¼*¿ÞÔýÐ.]ž‡úgµ‘z’¼.-Ž"ÙÃYIì=ÔKOSë8U ëgñ3Œ§Ýw¯Çƒt0ĺ–—9Ö‘–ÔÁ/õhiíz];ÐNžgžÞC~à͘À¡`M”¸jT Iƒ÷r¨žZ{µGÜ ÞMHbŸÜ¼y„7“JÜÃh^¿Ô™ÃÉU·㦛o层^3;™,33 ’wÝI=p$à¶ýFŸCâ L©jƒºH¡—+IhÓö‰^Bp™°+%3?Z¹ËVåJºI<Á%Y9dßy(‡¸d.Ô¥l^g½ 8Î’ ŒÈ«ù :5MSøIœ…mö3†ÏCê€Dä–[¾Ç¢ýö'ÕHÐ6sëðñvu.ã#BÔGd·#–mwÏ!!z¦à)lÃÅmÖçñà@…Ϭã'»Q"É]î5‘º C¸Ó8¹íŒYXNž U dxÀ;í¬–Õ©¿ÝäûA‚$–„$ÚCÔªàÙÉ•ÊK»˜Èš1g¾V£Ó—@·¬­épBÌÀ{zVÛC€–bmµw¢<8ÞÙÄ`Cï7[ÆûlÌ(Ð2>ÖcÏCHSp¾Üqxžm9D­ õ\¼w”n;8Çø.Á€Î¿÷ž£É©%Õ¿A>Gк è€1;[GØÀrÑwx×:¦®¯ÁœB]†›aÇ Ècx×–~ºý°ö¬…tìÔ*ÓbØ{õ˜©²î±wœ·$1‡·×W7‚ñ¡cY«J• Z¢a`±t¡àÐ? sIRã±÷êM-Ai6 ¬€Ø!p¡‹ú´Ê–ÏÙƒä^cï1У]U"°djÄ+‰‰»oP‰‚z{xš „üÜì »û”ÎBÕf½ÚÆÞ %ö\õ€+ZuAW׎ҷox’ÇtL™ˆùqñ…­R“o|ûBÞuƒ¦¬ þÏ3uÐ-ØQ@íº« Îô í5KÔ« íЃ„ûã~ù±¬Îâå«ß¸^­ ôô§ýýÏÿúD=ò>úÑfé ¤@HY1 ÚÀþA… yî¿{Ò¾ Χo~Ë/÷~úe‰Ç›ßüïêA? ¢õ¯ÿú¯\6Ô¶ð[â´KLð±tLO“›ö`n¦†ÝÌ‚OÖ°›“H@˜ ¨(.}ÁHÞ´» <ªßM†»Àë)ÉÎ~×è]ˆÿbZUk¨Ä„/®5ÓÔrS%¯î¬Á$¼¢@bˆïï°ËZ*K¬à¡–Äù&–>Ò‡%Yw¹MãºO|Á§®}ìÈîàMÞnO³12„$r2€âŠÑ¥-u<šÆÉ…/mwJ9,µ¨-ö&Ÿ`/'§” ¢Öè< Æ!AQ”X7±€PNÃè‚Ç̯^ÆšÁ³u£êZ ~· v½Ý#6QZº½ ìØ÷/¼`œ›tX1t–WŽ%"&ÅÒJͨն¨Òõž^±Yi0w/æ`"½‡ðúFˆQ0£ÎÛ>àè­sËR΂âÑuvm„D—ÙìzuIâ,z)[C>ˆJÐÞ!å ¶·Ý¤ÏmÝ ’(Î>WW×½¸´NG5¹™ï%1ö®ò¸áî<Ó™‚Ìc¸/]]­yQ™Ï$ujÃýî½]2òxam|ÿ–IÚhêʺÃسyeä1>7ÚÖnû‘WÏÝ0 íÄ~º²÷Þ)î!žÆ®m¾š}â8;kÜíÏE×E;Eë5fê¸I$! NÌþ É1Â/À]¿[æôÜŸc›ÇûìúET`jU(Gæàí €`ŸgIˆ³¡}`šaï#»¯'³ Á’fIG­ÉçÔ¶‰>èͤÃ8»ç”ä¥V«óóËŠÑ~þŽÁ,Èx¢™w^äóUÒæÑÚ¹¹—3”À)QŽ kk¾¤‚±`nø}D@,)£ê÷²jSj¥$i£aU¸X^˜ø|ljÆ%¡èW‡­"¤@¨»j÷ðÎÃÖô¬®¥Ë\V€emU÷ûÖ¥®8o¦®¢Ô[á­»Öi°ŸÚxÅB•!¼äEi.E¤¸âÃtÃM¿Ë’dÃÁ_¯ßÍ‘XÈŨÖõ!IÃsžóº÷½ïÍ@:Ýø“¼¾ê†ŽÅòÚxýõß¾œ¾òµÿ¦ûÂg鑺š¥ 0Ÿ[¨r^èT@@ÇÀÃMP©r;$P‡BB{ðû©OÕR\äÏþ49z˜¯Áàõ“Ÿü$>|˜ÛüB£^6¢Ûç:`X/Rƒ¶Œs8ËZºQ6Q× … p°kZŽSÓd1&¾ÿ  2¡–ñTf¼bɪõŒ·N ¡›šàz 5¹Al7àëÛãÄœ”†ÙÝ\ˆ\“jb%ÐÌoê¨CÙ¶§§6œ2ÂÃýaÚe®‹mæЦ¼¾‰@ÁP§–ð×ú¡1çU”cŒ‡#mȬc*¥Í ”¸]sÁ•û¯•ÆgKÐD…Ëýn´ë¦bŽ¬U¦z#-c£nL¨z»P¯h¬7yC_]_áͼ¡ö HU ÑÆ›Áû…„¥Þˆ®Z2¢íã ISõ|Ùi_µž˜½#iá~â`]^Uûb’»¶ÄDsR퇘_<ð¨êWíEÛÖJܼ„LYE ªXÍ•UUnƒ_s£¦ `Õ% U/p É‹©Ò”ëNFÊM„|ˆn¾íÉŠ¾ÛÓS¡œYkÛŒ/PP‚$¤ %Á‰$€‘£ŠèO«j²õð˜½ëÿL³³³ôÛÏx=÷y/`{€H@èƒð‘²^þò—³úÊÆ}Ü ñ¸$±;aö´§ý&×÷ëOüEõy„ïÃõýúWú…_~½ä%/å2 ªvÕÀ¤­rï«Æû‘$ôõÀ¦Eú àÃD)ˆ%µA4iÑc–˜pRó‘m6jB@Ý=I¸2J¥‚µOÒ®‚ýü\¤˜KuM4(|×q3È‹]ÐŽ«K’I¬á ¸jQa¹®%>ù‘4Dy„IkÈ'v Ñ!›¾c•5ÄÈ ë S~=Ú_?ˆ¢ÞSŠ¢~fÀô8ËIÑÒP,ýRâÖ%Åe•@x6öEšµ•"c’C4a?0êW2Ú(›Œ[^-5é^–ØÆF„%#¾å-›øÀ^HÄ-ï©Ùuî—HŠ¡ª¥U¤t›ê ŸGÔÁÂ$ýBŒ Î!­²š0àÁ=ì³pÀÁ*i‰   -N˜™E`ƒ}Zœ_­ißÚ/;ìÙ Ã:öˆ87°Bê¸ÎÑÂWìXË3ÇÅå¦Dp!Š½–pø}〱ŠkŸ÷`¦@ 1ˆÀ¤ú,F¼vámG4¹‰ÝoÈܶ[ºÁ™èÖp¡A6Κª0gb@È%yò³ ¹˜A„VU*€6!@¤©•€Qd Gúšu)Œµ ï#Iâ÷= ¾ûˆC:ªùРƒ‡3oOQÉJλŒåÍÞk7û*b/HQÏ>G/ÐÝ•Ž›§]Ûµ#ì!ÌÓFS $ø{i!äI „÷Üú»nÞvíõo#L„¼ùÕíy:³xvR/é÷aõn±ïo™Ðâ\{ªCEhž^°XuÍ4µg3ÒÀ€4+i ¯Â „‰}Óx‹ØÌâ@Aí Þ±NN¯räqI'¦4-›{UÀîE{†5ðIS>“.:oˆƒ6#¢9âÍÉ»¬°ºÔÉÓš¡ ãÙ ¶vû»_ DD_U Œ1¨ïÎÛu€a5»¨¥áû.iRÒã˜[îP×—Y*8U8#?LAè¸/SÛhÉÝïpeµaó¡7®Ðdäã`qSKl £”ƒ"²lTÊEm7‚E”$FÄ œ°±y¡[HMÑF€Ÿ‰!A$ †ú‹‰Öï¯h£U~éìÅÅÙˆI«F€ ²¸šRÆ Ið`2>HíR£±@ߺî~ªoƒJäúé¨ç¬/~yý‚‚ãDD6w!Çá¯Ýë¼:X>ì›Íøsnêf±â7‡£â$L:íªÁ¾“kÜNõk#ÿŒëR6sªÇ¸<æq0c^«ju¸p»;ƒ bN”Ùö¨À6p%]Œq(IƒŠz­iˆ>½>ê†Í—sÅÍi•‚iC¯BÈM:”v‘§›çÝrÜnYîhL<Â?6’1üNHUÌ-[†ø-/­ÑÊrµµÞTíø¬3@Ñï@Àbs o£Qˆbaý¬º•$v=¸´ªÿ˜§Cƒ½¬VtRqŒÍö®YxΕȓh ðš)«ÖðÁHŒ°(™ø¬.en5x­6=ãõXÀ¾X†£Þ¢ ÈŠüZ*Ò¤<®§Ùžaë›ß 3ÑÑ(«ßk&¸e³Ùº&îK9ØhªÕ²–µ¬¬¨­ÉUå½<ÿ=`Üöîð‚;jÜÏg=Fy`>ñÖ€ýílDÎsÞU¢˜”ƒ|‚Þ~`^(^¹âG~×çeÐX;SòT[À‰Ã)—Ë…Äï—w[°•fê•H«k5:ttÏ¥žkm³†Ï„ß7 ,;¥Ë.Þ̾2ˆ:ˆÑImGÙx^\ âjÅRŸZ P ë”bĻ̹'§-· b½šé!ãYü‡ø¬\Öö$²IB\ÉDHQãPšÒ²ê"$Ö ÈP ŠQÇ ©e/6*È1RÒzàäœ7.ý#|âÀ„g«ûß»=W,xĂǬ¡ÁË¢y@ÐL¬7ÓèBÄ'€À{,'–°Â ‚*„¸ƒífl—‡ñ g³âèÖà¤蜫ÂQ6b¸Cz’ê˜2M[ßÝDˆ"ÔφëFºaÈ’ƒ¹iT 4°ÈŒÖµ©Bk›:wG?¤L6˜®dqKdÓ DôÐ}‚'Ôw lhu¨ YI€¬M„! Ó€0–î5ÐpÞîQEŒ/òA‚|‘ÕÉ–ß?÷~+²PbÍ!Å©™žYfUDzÑ^°Ä#VÁ…žÛÔ2â7ÕRUÖèš²M³˜˜vãyé\3[À”öÆ)Y;8™v^£¬ÎWÔÆìeÃb€OXjIŠŒwŒciH¹˜Ù|$ ïÚ^$ÛkÄuiŠ€ íK’çÍi0 4Ñ÷Y5k-“p„ ì/ÈẼu.$¹õ ÈÑam´ÈÁ¶¶VïȤq¿õÁ5» 3K ŠaA¬}H>Êe‡kì®ã$ ù $±ë*›Q¿ÿ9©õV,¯ GZh6~wÝX({°9Ë;uëH5·ÖnúÙŒè¯!íB.HÃNLµzujG¼†óØŽD08y ålA$ »wh/F8ošeBîîHgÓÖqÞLt{uèÌ+«Û6ÄÞk'@“7Ng2†ç¨¶+üRV56$0&¿ô¢Mê|*›e${HJ!3SÎP¦5@£*ÒÃ1ôˆó"(b‚hþGÂûØ‘“‹jßô§N¯1}¢AHVÑa l Æe׬Jˆ³ÕX¨Š³<…}üø©UηgG¿uˆƒ´¤ökH;ÐŽÝ[„íìGóKuÆ ܨûCeÓQ}î?¶ÄN—„¨òqfÉ6„½þØô:Í-ééû†SáœÔSvÄoUm“Cda%;D4AY´Ä<jQ‹&$™ KµÊƒt×aLƒwá¤L(aÐÓ”%#ƒ 0ô–à ‚M}`‹Þœ¦Z²ð°².ƒ®‰$€ðâ.‘£¯W e=–¤<ØŠTz~’î}y{ÒMúÂîaòÌ¿01Ћæ—c^ DH™ÎQpÃîŒ!2j Öó¤ªu¼»‘6tã–¨XT7Êìí) ؃ç:ð`Óþž«äb!“j8‰l#m¢ÆÒn£ ÓÙræDz'ÑÖ DŸ¼XlÍ'óZ‹Ø)ÀîáuÅîµÞÊà œL—.q:èåÔM$!5ìí¦%½ð¤7ÐÃÚ÷“KJjÁö†¹ €@[þø¶&‡[à¶ÏI<~Æð¼X ,¸¤ó¾fªUhȸíD.~®;kñûƹÜcÇçxÏrA^&!ÑŸ¦‡€VAt‚H¡}5–øfÜÓ˜J„¶MJØ›IÁMë&¬¨Z… — Ú 0’’f<1€ žñ$"jÿ“D\¢³DR‹f|-ˆ@ÊQ(ès`àb=Nôõ±Ʋe&Í)î\£K‡ÿ?œÛØ›*L >¶X×Ãf98_4ÒÄY2®Þ½}ÌJ äºVÈ_Oò<Åæ{l~äL˜¦Iãy£D¦&Úe~Á5š <é%ÙÂŽ•ƒ÷29½ÌÞwbÃýí¶§ÁÙ‰X=WD%ú-‰nR'É͹Ja™–ÙdT¬bgQ¸¸Ï…eÆÖÞYw&ïµÝ;÷,÷zXþ¹×s‘ÚÍI|â\¾×e[Y½Ê[ø¦+z™¦ÖÜ@¼|w‡•Ž¨=x€mBÈ0ÐR–X5ŠœNL¯pl¼­›zu» “ªS ÆG|"W{lräõ¢è@« Ž » 05÷í$×Nþ´‡'Wø;ÀËøPIÖ48pl…FÇhë暟žg»yŒ§ýêþZ5!íêg¦¡4ÐíwžXá~3ÁÃ…R‰‹ˆD—‚DòT£ƒû'Ä3¸ªZ͈XÛnÞ¤-åµ}IÊS±QD͸ŽÉ Æ’‘^6ÄL©WPeñÃcâÑñpBaU‘%…R3Ï$ú!¶c%­›ÝÃꆘf¯V^|ÿÀOÒž½ï§³MŸüÂ.Ï&ú/ö}E•]ƒ% Rù4Èíf±ŠÑº™étèzΊë훋=Æ%®И7˜€ëëõs.á(™1äØe6,-‘P 8º3XïÄ ÊËï&‰4/±´]žÏwÆįh!øƒ$„˜¨öážWë„‘fÏ`iœØÕï8¡AµñLŒ÷[5 áøø"aéw",Saæ"¿ìuæQØÒ4,ÐØX½kz~~ÅpaeëtÚ’ÔpF“ß• ´”¥ŒXlIqúŽÈ;mt.ß5ݘdBêxÄJõïPòƒ0øÁÜ»íÀi^ODõ§ƒÙXšQ7`¤žCOË:GsØ«WŽ¤=S±G«zöŽcsU; à/ëRÝ83#1Ĩ¸D/ºŽõFTu IT³ŠÆA„–ˆ4<õ)i£x¯C~g5 KÕ¨êÊ(3ÐAÁÇn¹Rl_lNÞèo{feßíü7„zÛúuÇ-1Ÿf¥Q¸@³±m¹åneÔv¾§©ŸÏfÖ8ÚRÈ€W¨î¬µÛÉ €§NK´íÐá£ó "[úœ¦Ï«°Ï±ã¬ÿ(¥wwŠôy`£]¾¼÷–«³][$uÓ¦XYy ),w£é\Îœ#}D³Ë™“¼v|\v-VHÖè˜ðنˮøÄQŠÚ÷JnÌŽK€u,±ƒ÷)nMªë‡dkvwºQ\5«cA-ÊJ-ÌÙ‚@€§æ«´oç Óì’{,ÜäâìØ·sÀcÜÎ.V¨Y§‘míá³)uÚ_+ThÓ¦AúöõÇhËp‰ÆDBú À€0bnØ•`¨¯H®¶;hœã3ë”Üç‘´à DB†³ ꆖ,à@€çÑ_ž¦É¥ „€NI­(ÿ‰ôÚäO­:cb”ŠN…×Ö‚¸^OØéh[W"&î‚’bŒUœí$eU(ìñp1L¦4oò´6l0R }tkû 0¥.:Ï‘v¨ë³FÚáTïd`XÏ+ ²¢Î‚íã=& ­N óO­±v v—J"aZÈg„ø\7gÉÖ±Šv6cv.œ­Éy;FÒrI¥¢‰‚ÞlX5è@±Tj!n4@ùÿØûYŽâìšÙx9¼œŸA`²@Ûd„1c²ÁÁ`@€MÆ` &gƒm!r0 ²É²M´!^Î÷.ßmœ¿¿ª®îžÙÙ½½þUÒ½ÝéééééP_EAv¼À¼?G j«š^L»kŸm±Û¢~Â&¼À0NrdÍ(`öS¶Žðx€ZÃ^k¶óñá"k2JÅœIÆÏ'‰c¸Íùy´ÝKqÉ ’ßaó܆ŽK{ÿìbÛ2a!µ­“MƒÍšëP^Ž\~^ÂXfãæg©ß‰â2cðë†& £uB CUt¡ä÷`›ó’PÚÍÄú¨œ:߬oDËêVA·´8¿y“ª¶jU|Aíöð™àW²n8$#`œÛå^¦„CÛÁ¶ãëG«Ïü¨ÓGÊR¶¼šI7ݱm̼‡eÖHåmòeéšcUÙËZ$÷ê¼®à4ÞœHæ ž{6PD±(×°Ö´Öv‰¤:ÊCÃÓ,¬ßuP¤/Ö:´>±ÕX"šáü¢,ÎAØV³}5YÀ²Øè[Â>I›†yýðƒ.mvÿx| ©"7æ¢(ØÉï+Ýɶ—têôd¨¦ërc6`6r… A{üuá±(x¦È£(ÎFõ¢ÑG=:µÈÛýh.º1+IßõÚ~nÙûœ(I)ò~øx½§5ö=h§Ž/1;Ô‹¹ÏcÞ»†•l<à·»¾«n÷Ì;×ëYò~÷b²÷:] d5”Ê@à!49cûDÊÏ":Èž– „‰ð|r!0d}Òö~º–·€i4㬠Öàq£}Ð-·„¯Æî8k%äfØ/¯Ù+þ[4ˆtÎÃäjÏá%öËƹŽLMˆÑ `Û¹q Ž°0Z ì‡Xa62P.¸çD[ŽÍ6Ä1=áÜƉ ®Áô×úuc®7Yc±Øt’¸JĘ‘UíUMAdcõG¶sašnòN{«™ÂÕ÷@ØÇùŶ$Q‹$K¯n˜ØüQo˜Ö±œí›Í"iJ›E*NœI×FA§ª3¼48rVo jµý1ÍŠŽ—2Ê~(Qð‚ü ”™°vev±Eaˆo‡Ô3”dP¡Ÿ Xd˜ÕŽì9PV "e© áÒr~ÔÕLxÎuaý9ËMº¶HoO¥FÅy& {+’fÔN“³:î]´ ¶ Ó¥ŒWPŠ˜áh‹–‚#t%,¼xЊQ~S46s˜×$'˜©\7Q JÊ\:l,lˆ#Ãéä2Jðx<ÊèFŽy˲G”{,ÅG‘J•)pI+>U[¢þF Tl6máÐá €' ŸQîYPP{æ´Ý²€ÓæöhZgõ•ˆ}~bÉíR°Z—ê@‰&'‡yî^¿ë8×ÕMâ(Ú7 a4­ºÕŒ„¦Máõ¢Q‰½†#IÜš´\Ïd$v~C¬EYn:úì:¦Y%ÑPc“@tVìRgKu>ÏÖ‹¶"†‘Y\Z™ øP³¯ì½ý€©%;ÔðŽ“¨!§ÆfÞúÃc. Ù~J‚¹\ÜyiÒYY^@…È^Ÿ÷ÌVÔ1ï\¤+ßçïôGŒ`l#s÷ñé完ÿj@Dž$=~SŒèæ5^Œ(<½¢§Ýì&ki`@B†^õ‹Ãá¥OucÈ»Ókºý^ üuc¤WÙö†¿³méfzi²ß[”’³çD¸±eŽ4“í[‚” ÌþEô;6R|J…47_g¦Ú Í°¾h´¾=1ÌcGbëñár°FE´ûàïï.`"Ží×쓜åÔÜþåžy®ûÆÐ7`×M˜ú‡ª¡¹¦Ñ’Ì78zö M“eÉñ‘ài™ý瀹{ žaÓdÉòÎr-L‘N‰ém"273Mª°P¢¹œ:¼$-%+õn6…QŸo8SÄ Fäøj”­ÿoø‚qÐ4Äz¸Í¶&Ö©<†I¤Èds>;±5éú-™®%#z88$RM‹cä£06ç¡Š€‘Öûû†š°‘¹$[\s-·Ùr2pîÄ‹€ýZvN¨T¸^‡Ï ®oó­Bm˜f˜ôÒvô»€¨_Gµì}hȵS‘²ò¨ŸI[‡hÔ_­úg€Ät¹vjãUj Œ›Bʉ7áp¼pćY^óû¼DM§ÀPY€¹¿™$E/upmh‹ÿ‚äŒhówq(Î_Lõ÷JÒ»é7p°’i;"5A׈qÀDqþdFˬ‰ˆ2 ‚3v3óÇk#ÙnwŽiŠB$‘Îc"Ï›žF¢j–ï­¶×,&®lšñ÷’ÜÕõ‡ÖE¾+ñfqù\°R¦È0ùû Ú a[†‡«4Œèæ¿cÇiÚ0ZaYÊ7;ðgwµéÕõ ¥9pÖ£.€$|æØn.“#fÁ¯×(q8êf»C¸áúÃn€vé8hYáJ­žB„ãCa—ÄÔn‰F±›à} 'ñªÕ&à=£,Öƒì¸.ØPÑÇKd+ Ç›GÐp(à=@çóÜ·nµ”§!èU&<Êyç²u­$ôìGË’7.º=Ëo\ôKÝž ÓJÒ>ÄÁqrótÔhx7oµûPp}Ûï,l›È8Jì>ÿ*M¾¬4k„càÇJêãjn«¬§^ø'ù4F$§šö0xÂk÷/жuìs¬„½åºýbrµ³‘“[ÁÇÂBm_3b…8ö>Ççš4=ßtB…`º÷M™sek"œ|ì3bÞñúÃ˼?ÐÎ3ÖW$PÔúu£ vl,x(°Ý.ü,-‘ìs„&«A§ #Ùé·¶ ®³È9\·›¢ŠáøÆQäuæMLlÆtŠ„A»Fp¼iµ.d_$„R©4¨°¯ÀÈ€døe§É$q¡¼y€|#pÊAD-i–s7j£s:ü…©‚:¬ U Y¶¶o':át’—K¾AÌ 7Ey²fOêD®þ) Ò“>M¿”2á "œ©ã/ßç$G–ð®‹l°V£ 2$ÅêŠejPÑùˆ OþÆš÷L[6Ž²ôÚ¼¾ÛÆã>‘hQ±€ ͪÎ*Ê‚Øjgcþw„M:Û§ßdœ“7k´CÒ©ã î ²žßŽsRÆ6t§Mm&ÌXäëíò*ÛÖÑ\h¹(ÞQ߀ önÕYÇòH49ZØ6Ç¡Ÿ0 ~“f¦]¿jžä\`D4\bÊ•â%3ä6X“š°y•˜®F®Ô¯Ñ´š’vïX“zßÑœªÏHÞ<Ô÷¯-tÕ¶±Sc½+qdS‘9úqt3ϳq‚ÂrZ#R òG…÷h‹„ãEd?'Y-€ÌpñÆk5mê)I3Êb^p9«¹‚o‚&ÁSZ;Q¥5U="}^ûÛ¾œ¬¯–½ë´/ØU2ïËi<ÂböLîKÒ׺›ëIpQÌ{c¢‘s‚"9[—Ÿoüns²³k„=õ›ä¬ÐQ”’9 ?wí™Mit{I²³ÔM*žÇ”æÕÝNµT{ø@)a“ðÀ0—`Ž0¾ó†œ_¨Ó©¤•4½ÊçÏõÝÀd/ÍDöX^zÔß7 Ÿ‡…³‘5ËŽ½Uä$bvÿ°üÌÆ #†7qu¡74’kbÿZMXûFÖÓª5_b­I$ù@àËQP|60džʎÀ™köÍÓö ƒ))ð£».ÒÎMƒØI—'54¼ñäh)µÌdLИû®+¥ÖÂ)BfšÌ-lZSA²†`ÉžYlsx]ìW;ׇ># ê:B!Ù`HDX“D`ØË–alZ߉fKlÛÒ°(Ƽ•¬úF*a¦›™ÿHÔQîEÂÌ RÖ`ULºÀ„ضöˆq!‚7I§ ïYkØü L¬}}PŒH!– _(ÊÓ²ÎA#,ýKì‹û»„R/Žÿêb˯›ØP5b;9ï+’ݬÌKXh±y4+y”'¥ ï¡RÛê(ЦÔÞ¯ãd¤îšÃ¥šW%b’Q? ãC’¦ù{èþÚ°ù?4$ïÉêÖ¼’G%îXÙƒ6,uôI­Y ¥fäêZI"¤´vÍm6 ì¤÷œwÏ­í‘»b"W°™Õ 9› (¼c;å”Î^EâgEîœú<$AT¬$ì8ß„~ êd°³•aëh§À ðœ3Í´L+ö»†oÕƒ˜Þ/Õ‰ñþyÃèY¨h›UyïÙ7Ó)7?''hÌH¥ ½Ý³W2³&#KžÊþ‘]/È9 ·íOÍuóݾ'í>QËKߧµ{$9Ct“¨Ãþ:$„U*øˆV(W·~#º€ëñ8Ñ'_+’mXˆ4»Ho‡/mö¯ªåÇ`ʈ$Ôb7 ,‡gÈV-5ãÊш8çó8DëÓv`Ý6olmاg$d/ÀþBê`ÄùX”Â2F3Œsâ7õ’è÷[£F©6E»ªs¾¤ÇL–’àB΀ÄXIPC8N좂×V 4ÂÝH5„ªw‘H—‘ß·la„×=`„)½$ÙCå„- f–bw,o cÝÓ¹Ø!Í“¨ÿ.Òéh[Xg7†?ê²Wd)X„×÷Ûö<°B”ÿÎòÊõÛÎl›ÃºÆ@ØÐJ0έQž…¨A1ضo§ÈÕ)Ö¶ŽéVÛ¡óSøJ?Qß¼ UÓ棇/sæpõ/Aùùå&[ UJ¡Sx›öY¦­k«6Ø“Ìú%ÃÓÁ¼ NâÅÀ¤ û‚ ¡ŽRÊ9:Ó0|lƒÆ ¿v´H¡ç¾cu)7ÚX¡¢[C%iøõ‡j,÷ZŽ8uÏë-;JÁ¢¡¡L5û=Ä'Îâ°íRæFM³pù55‘˜õM«ypŒ³eÚů¤Á Bªù²5}i²‰‹˜dåasÑs¼À¶D;ox£–š]ä¯CCUkãJV;CÎá½ZÕ0‰8ŽÖÛ^ºž¨9“Í R‰Ýqí|ý­¾ÄØŒ”ÙWAÌ2;¯çkS@oÇ-b )o²ù(V±{aÜïÔucÖÅ,“ ÷Bö±ÌIrê4¥’®¡£:˜u–m4N>:ú>#ÅB™´Ð&]r´ùÝ«Ý!2b•:øÍÕ ®îgΉ8ª¯DÚvÜ?„Q;ÒþãtÛƒšø`ªìѤÿQ‹—¹Z ˜šs¤«ìr@&"²XÛëAJÆ =Ó=¿““â0wèÐœ ¡ëó|€  ©°t—%ðI¶=2Ë¡wâ<"Ö >uÏH£–…¹D䛇æhïb HŠJ9¡ã¹H PA›R€"K.zÁ_/yBÚ•KµÙ5ë8Ö7Ðb“¨š$•u==Ö‘ÄjýúaZ6ÌÿÜœ˜9-X-Gú½IÿÀÏ­R-¸6…@$«å ¢`AÈ1ÏNåÏ ÁêÅõ˜Ã³sõ³~6›AaÔ9lfÊ.Ú ݳܱôƒxЩºË$¤Æ\’6ßJ1NöÓèÔþJ8ÉI+{'â-Äô“¹(é¬+Ê$”cšË[¤¨ ÃÌéïÛƸ×ï™>aÆòTIÑ Öäôwòö™ìñ¼òá5Ùr½4Mú»`è ôÓÎnš—ß4è}9èL!Ü3;÷.‰ŠØîˆF*Xáúö-£4>\I1ïI®éh8¦ÎBî(à#[¢uã 'ý±™:» ÀE@ç=„\‡ `Ù0^I XÁcãdÚt àéðñkGr(xÞ}Çj 4Ö-Ⱥ±tÍ]Gj,쀖ÄÈ÷ì~)õ"gàž£¢- M­´ R ˜Åžmß4b׳HìÃSêo>T¢š‡à<cD3"›R{œ7Ëf“;FÌK€!êVÆUï:Ps|””B³»ujJÚ.4›f%.6Y Ú6s×&~H¨©€’ê³¹M#Q‘i´D#çµÙNÀj¬5æ•‚ü&Z ®‚êé˜A”0íÊ2 *í(¸«À e³‡ÏEl®è‰<륂MBÈuÛÍï € ýß8 ¦¬å Ïà‘©Vó‰ÍN†8‡/ÀFzÒÈSÿ\³Z•P².„)¬'n b. È(Z{OE{ÿ†ýZg§t¨OÚC§,RW/ZIŹSÚöËØÎ㘢„#9M±íÏH|JX1›墅•À¿–ÌÆÇAT¬(òù<¢ÐT-J1jøÖn'²\à„œy•Å& «{‡ôðÙðX@aC-g>…5›Ʋ(‡›ƒ8´“óûè‚‹ÖG«èr}$ÖNudM§ô:>”¼C9zšÃ”×Ò~×ÑäÄ 9×4€nžÊ1Ä’‹Í.  VÎZå( D:@‘-«1ókˆd5WÎ,Ëu>ÏÎQ<ÏúµœÌ5ûÜY´šÙái·Õ‰z'~¼ù½"IÏ\åoëÿé,DÓÃ$I7ÒÃ{ÐðÑb7ê`¼ H@Š­'‘gȶ¼lM¯õºnRï•÷"ù„o ,-5rˆu* ñûH½@E#¯çÂc½~‡ÇVú̶'¤<ÍE/àÔmýú]Õz(Å>Ý­ó2}2OkÛ”pºyÚ’PЄulëæ³fSBIá´I öך– qÉX'RÈžOa„)Ô15× aÃ[;gõˆ˜¯>b ›ûûq&°¿LŒ¨ÀúPá§ç[´÷èrÐÀÞpýáó‹'Ê49\p÷e T·é&L»¶¯-YßTYé\öMYb.;cC5!â3²Ø²õ{ÓÉ„7hŠ¦@³FÃÿ™_í…µÛ|À,+! >lGÛ¹¥&‘˜ÆP±c#[Θt©o@H5›=|ÀÚ‹IUÌÒ F|•B*V;G» ;hÔ©œï[÷™¿S‘ftPØõ›˜örœºGHh4773U.Øœ@ƒ#E$éò~o@ û£³MÑ$Uý³«¶c‰}Gz/ôÙïáo|Š™YÁH,è8YM‡šá½Tl.V-&Ä€C*žœ–C5¥BÁÝCI™z˜piS¹÷Åš³y˜tÔl¸Èl¶$-íG¦®$Z3o¶ä'´×®$ ®Ø¨- Q?yGN5¹®à:¿±]âÀüD}9X"oA²j<¥Y/[ȃkî29I½nJ˜Ã¥²D´sÜØÐEWÍ©Â2¹˜)๲›\d¼Ä>ƒ¶¯ëóGþ„ùÒrÊ.¶Ìø=„-í8`’Rt´Çv‹˜mid,J™Haé­Dâìó6Y}hFÊ^—Rãœ#õ54âZú:íÖŒ”bFpyË vôþY-«÷÷bàØl;ߌ£É‰–ÀÁü‰£b®—ýºí…æðÛÅ‘¢šý¼™ëU62ÖÊØ:rB€•õçÀq€ÎK}N‹e ÷Ú¹uT[aÿO3â᱄›¸“á{J’î:Ø0Â}„(3vÊ;š I_eõ« âf["büUË%ËÈ›±Õþ„;šf)áÝì7 Ñ-aïÝúÝÌuò®É–•ÜXF´Ü_r\øcÌíÜéˆFš ¦®Þ<ùûhbÙ,õÃȯLºÕÖ•wm È£~NÞùn÷ïÆÃœnÒ=kø69&ûghª>Çš5C4>6@×\wŒÍGÃ1ʾ!xâ(%×P_Mð`!åRQê×¾j ˆá+B–„à(§z0¼Fµìµ¡à] ˜ð>ÏhÏ‘ãuZ3ZbÝë ñ˜3xh<¼ >O-Ö@Œ F.˜ NžnpTÌ­k*46äýºñ¸×¬±plËd‰“ ªP>T×Xbk)hav®¯¦¢_6B÷#æO…`Ys,XØ"Htû[®(äûC˜à¶ßèõOí¡›Öɱn£G!I¡ \ƒ„¶­@[!¾$žñøÐЫNk;ÌN¥Rpk(®j6Ä÷@ ìð`Ì›)§PM\UXÚ©éˆÜÓ´NõÐHÔ9®;Ušãî`Ûñ’¹G³VKoNŠ*@sЈLÍ6xCÒ[;^â˜ÍQ”iŽ½¦Î9$AØâ’0ÕyÔÉC_"ƒ¦2$Ì,Ào¤Ö:)P[ðÐáCÔ&N“R? FÓñÎ5Ã2Þ$vK†éh¶Ô¬ª÷3t[T×ô><€üP/ÖØÌÇs±Lq)ž*ÐH|$,,l·ß¢Ó¶X ÃL)Çteêbõ•Š(%ap&hw/JR÷&Ú=NÇTI/¥Z(V‰ª=Ì Ä:³bþsÿ‡ `’tÜ[$–ÁGÛˆý\$Ž7Mc¦ºm}]¨»DͱZQži£uúÈÛÐ6=ÃU`é”·ioÙpˆ $¡#0eº…›ž8Å‚eCfƒC7·ä9ºåÑwu‡µ#vcH,hÇp*²Ï‰HXІI¢6>ó~N{_ÑräGó³§TÆt6yM—ÅZεz÷1¡3 йåM×ò^î… IÇšK! –ÄElP”Ðè¢fÉÚåV,ŠŽ˜9½~¢”dP`\oOkˆaZÅNâ¬Ïœ]§ŽÁ8Ã3'‘gOß+xÕýS 0M Š_ÖZbׇë­OÇ»:mŇg¤NИ/1‘»iDÇŒð#ºýÙë“ð%$Ö>]ßLxþgm^Ûâ8XTÑÂðºH06<$oru›ƒ$âOÈDq²«„øÐñ$ Þ$㤀4ìCÒïztä8²KYìŸuý׺TJäÚj7%H!9Äs´X½&Ï_®”i`°B{öN³¤hµ#… ÈñÏÿáSh`΋ÖuE›‰6¡ðڈˡ<4#ý‚ %µ›i9&ÑoÚ¬M9ÑIŽ{V­ù[˜CmÈOÖZ¯’ÕŠ±y})h.Þ©ÞCÃßvÓn„¿õXø›MÐÌ{Û°¦ÚÁRsd·ZÛ†.mÛ¼-Îëq"ѸmpYÜh»ˆN‘2§6·JÁŠJ6du!#™´O™úªšõq`7ñNo-]°£VÆŒ²Ýn§6‹BÁG\² õ“ĵÁ2qÔ1ÒÝ5ÌàØóš¨Q«Q‰“V©eõXD¡W’bÀ´½™sHWÇû$±~4öù’$%N·7?æ¿JÜ&uÑkEò^"«1‰A ß7%ö¸#¨U/ H¶ŽdýD¤¾Z­!yC4z’?~U_)É;ÒùòXGyn´ó1·ÆT£Þ#ù øìIøÆ~¢a±Ã:Â=šûŒÉàü|142¡Æ]Ô¬JÑö#åŒØjY†E{Ž{†~n¼Æ’„ƒL˜ÿþ½Xôþ{î½Ùé` ßR¢ë y¾ßFaë š“ô;N×€†,hϼ½ßêtÀ“¶K€|Bé6SÒe6×C|D¾™[ a @‚²) ;u7— ©ˆèVO¯rþÓH˜‡e Bü¹åßœ¿À`Ùð¯/¬Å–éñÀ}ÖMÖòw$"ܽo†N–V 4²ÇÂs½ÞI¶l·{‡íÊÖ“²ÏÑí¹º¥ß6¡Élf•õ‰T¾Ö®÷Í–ì/Xï°îL™5®dM°QÇÄHÌþ£³ ©iD.WÖûsn±‘kþÙ/°öâ¬M¤Ö¤ÄFÆÒhwm»¯‡]`%k ®óÃäšÍž¸m9¬ñÈűm]%õT 5‰¶5PÒhUò^®1š ð7O–RÏ¿ÿxƒ…é;ÁÊZRÅL®Ì9ÌYÑÌH»Á_s`™ùq£=Ù²&ÝhWZQMeú‡K™õ圳Ö&³—m“uЄÜËoÒ˜Œ8µ.ë"¯ÌI–TbIÖ\Cy–ØÙQÂðŠßˆl@œ)ÒüĉÌç‘ u 3€ìþ¨ Yl“Ù ”Åî&IÕÀ,* B†KÎI–ÛHãOÕijÓ˜Êc!²³}P§jPSÑ ¡èØÑyþÍfh%›•Ø vRÜ èèLt¯IËà "¹4ÊE/¹]ª%'•‘õâÝ#@) 6šVøDMPWž 8ð» ÓD6Á š^>)½6Eeth9z8"YŽ8—K”ñÝ@(»cÓµ”4nbPêZ¨%´Ô ¾iÔLº±!»›EdC§êbQ·^ãLÞm;ÆuF·À½Ý¶>I×¾è&™Ê–Índ!£›Ê«ÎûÊßPB6ˆ(Ë 9QIšSK] £QiÒ?Õ „ß³uPpW—p°­Îè>bV;5çÉìR€[h+6mB©Ø·?¢Œ3z"Úʈ¿6oêºñÎIÞ@ŽM‡lVß6å³€$±(Û(o2¦íµmM š¯Ô¼7 ×®Kmë˨(yã k —·¡ 94{-?ùฑ oÞ4Âõ>2Ïql–Lfvç€nÖ(˜RiÒD%.gÖx0}èÂ%Î~^wÑ”3eÓú¡L˜j?^R!ªõÅ{“ýB^Pùĺ1AiçæâÊSþxÔ} UÔýN|{B©˜¯v ZP-î‹8`ž¢|„=ù½eÑß{Îwøæä w²t:J¼FðµfzÌ÷jO7ÂþÕð¨R€´¶óøl-JåÞm\?Ìëv_Q²ÚþÉ+ëFº½Ë•Àe^ù~Úžl²×gï€S¥Hº¨ëæJÄIý¬?gjŸ €ƒúáéó(OQ*tö Öu§™7ÿbYo&³£ÃºùYë “ÚØ ki+ÖLžãªÑ9nA »Zy”hPªÖÜV ü øájÙG½caö|Ãi<ôñŽ-ÚˆhVöÁyïºîPÃ:jWæ0Óºñ¦ªh;ì³×m+ð±ÛÖ”SæTÐtðxËB{2>X p‘ª·#ÙenóÚ ôo´nÍß=ôà̶‰`%Up°i1º“(œgA_N$ zÀQtHqü‹Í¢iù'ës¡ê&0”9¨%~³ gç­$ázíÀë%o7^µ‰üÀ WËià”G ¦89ËB“íCzÔ0žœ¬Ñ9•FBkÕaC=hT_X$ñ‚ Ž J‘6 ˜r…†륢šBÅι>#Ɖg%w!yË^‰‰ÈYÕk­¾ìróH˜[Hc‹l"âžÔšn5Wðéµ jývÈÕq…Yg9·H›‘÷ÄTýž»~ß\ ðíWüµÇóŸ©TŠ]ž•ˆÀþ1 3$±¥,JéªÅ%~“ŽéJÝÀ›~ÂÙ·Ô™à&SDiÀá¤Ê”7•òÀIÔå u1™¶ÛåÆeBWÀ¢Ò©€çt¤’-é{Ѩ&m˜²ôì”XGtuF(õœH¯X`’°¿›ñYÍívNÐää8mØtºÑnFkÌ÷W_òJÞÜB¾Qüî$¬c£ÙÉ@€ØÜ ~sŸÏ¢mý‘4dz–8DuÙW\ÓÐèt9&jËšèDži©&{C¸ŒUdE‰8¸G¼s€únHˆi Kè˜_ؼ 6ÌîÒ²Ï~ÛÈ2êÄ®õëÂåÄ?IêõÉw«’Lìûb𑹷h LA•n¯l7›Â;¨´c¤úìÁ$úc´)I’œz2£Öþ.–ËT¬–9‡V³Þ}Ö>EºúÚ£Ø÷ ê€vß¡…¾ƒŽtc¤>_’ÒúðÈQ$ã¯ÍI?÷;QßK˜Ùb\#àK¯Èr'\)v‡d5‚§¡ì¾¦Ç”ò„EøÓìÝ„ºYZ©Oû4yÇû¹ox¾Ÿ÷y:€­Rl“£M»û$ù`PÛG3-jÀ·Îgû<±ÄÁ œæ ûðW³° |xÓ5ær¹uÄ‚ŸpÍÀ|-|4Hœ€°‚ÎEF,˜=•ƒS5kª;Œol “æúña¬]‡Bà|î£9Gç[¼^•üR‚{Ì›uû˜áOñ<&Êä0H$‰Ãq,ßK…=„LëuZnŠ„î k†e/ˆÖM'šA—_Z±$ÌE„²µÄÙQEj1nLÕšBáœÈ°ùáÅAC€…¼\ ´„¢´’ÿÌ»LlñíÖó(Ãï$Ú–„}OjÖ ¸f#ºÄ#šI„ ÙÚ‘¡6Ÿ…b‘ÛÛð…šé7{ 7‡åšd7ŸåŒ”~óY7.Y¨ j žâ»¤n\?eÐ+Ú¬,EÁ"0-‘8¨'D°!8ÉmºÍá'(ôù÷NÕ|Ì›Pñ/§­[±z'\éMìµ(ß a£­&ÛyAÞ žÅ6²v²a{9ß¹(YZ÷À3lÞºƒ×Ô;Ï }ø£F•?ên{æ™gÒõ×_ï$sš]ë×èV®—rvb· uS_ŽnèXØ|9ü~lT¿¼Lèš Gç[7ßÎäª-‘Z- p8¡ ÙÕ4"œÝˆh?ão Zâr±zÍÉÙÆ ÃìîÞêïâXP—Rš>Hk5»± ˜ý8&¡lc¹î+ï àîöÞ©‘ëŽ9xDi°-¿ÓÛEâÊ`ÜŒŽðxª-×(N’ ‰`gt¯8£ ™š©ÑácK©c'Êð±mœßÕᣠ\Çè`ÌÑ-g[l1¥S,ú!ðœµÙ²þ ü}7ê ö…Í×!åRíGÝÙ0Ô'JY A70ÒmÌÓ†äiòÊ„„9½´Ü¤~´)Ùº³ÏÒ­}yçW¢S9FØwµ9^lÈ0~ Ó°<.›³6ü‰iÃQ/í~Êí Ö{¦Ä†@o¶¨¥û–®èú’=!öÂyWñE›±Že"÷‰PÁï¼+Ýç0N_·çðmœ(ùDÛæ~³KmN°;ɼ¥´`cßTƒ6O–3¹C:d;BðŽTc' Áz3_žà$ñéäAp)2 ¤dÓ:HM/´hÎì%£FÅ8TŽ8ú(ÏËDÚphºáLëR&†ktd0шB|ð^­‚Hðñ fklØKˆ`ï¾°$Ñ¥pm5.¶¿ù! Ñb'iÏ^¢?%Ɔ‰t2,ûΣPœEÝ™2»z£Ó4V£.¨‹Ž³Mu U”•„Åe‘K DˆYUÕÆÏ׊oÐŽšj“Ÿ$.,'6cÑrd6›€1›9€ú¦\Š)/ö žaÖj`'•ýí‰JBÌ$š$ßÞ»b³²²ôû YBÁ@VË‘·¸…mt&Q±ØiV8[sZÑX鲂,`ZÍB¦¦*x+ö̵0Æ6ªQS@vËFˆÓÅ ’30ÛöMÏÕéèñ­†¢ÈçìÈuDǼQ馟 LO–ù‘$åLÝnIîk Éù~TÒ¢Ií ¨tp…‰;çlLkΉkó4žAi&/ØäìC¨z»m™Gº©f±õ*Iâï£Âr§É°`­ƒK@NY’:[ÝèØ(ýäÊŸÑØØ8õ¢/}þrzñ /¦{ß÷zå%¯uÇ€„$QU42–OB‘hG°®w—óéK_þ =ç9Ï¡·¼å-îZv`·`Ï¥¾BìO•I’¥÷ÂZçBK“õã()餂èk¬iº¶/³ŸH:”·ŽW µËï/"á܇&¦Yêÿ%óë%½ jl–ôAÍû¡„ÊÓ8Ý'¼™ñ®—’M.•$kƒ(­åRÊœ k³Vwuf“Öê é*íM:¾`68LÞ,ó60:LÓÇæ¨^kÈ>:\v!uÝܱÖP ´6ìï1Óß:Ô¯#<¶f´ >N†ã:8Uï»ÞÕܯÂZ3D×1MÖµ¼ãƒáŠ)‚ƒq ˜#qZI˜GŸèÞ«Ôkï­¦¯òŽ÷n´c‚5—smÁ4([_¶mÝ€ÌJ@ãtÎ^¤{xçï9-F·Õ–=OCíÇ]÷(YÚ­t˜ó°?T¸U²÷ÍÊ÷´ÊEq@‚æÑ%Ü9Ö½ Ä [ÿü8…æ~Æ𛑽1ÚÍÃ`Ù&´ëˆÑDŒ ¬’À®ï懧›l¢Õ‘#dQ¢\…ÝÆàdºÎÚvh;Bššo2O ¾}“¹Î-_”_Obn5nͤS“ð~&"DèߨZ­ò/qÇ@ƒÄ²¤WKbÛuÝmXm›Ü¯à)]”!YâÚªá³n3óâš›sKS0fŤB€ ›Ú€1gþ)Øl(-©pŽ{Ù‰Bbö‚ –iia‰-Ö“²Ø\‡(7h ¥H E²æŸHÝ=`ÊÐGª  LqÉjƒÖŒUx๽’<#ƒß( uî5ŠlÀvp$™6€ ÚÁjÂRQÚjP0™‰®–ØD£¢ C%¯2‰MHéëí&¹ñÝçÏ©¥¬!„m÷ª”¶f“]öÒÐôZø˜Á+xÀáÀ7J>0ÉÙt†…[7;ë,—ÐRé Ã`€ùŸž^b§w%ÌÉš aíÉž®!h!Ì+4¢Yà‚º+Að0n‹ËšŽ0ç¯Áõ¦Ó°†íeMBòjôÅKÿÂõbÝÚAZ;1Ð1ÒÒ`;I9ªrsE0@ÈmÒ¡fDAbBÉú™¨ÔØßÍ¿ØÉ"¾:â6ÃÞm†¯ÈPµ ºÄ÷‹Em¸LN#ç¨Ãº¯Ûç9^ëʈkt¬ª$7TSã°¼'æ/â5>Î¥%¡Ý±ì¢„Ú¯¤8ôƒ4ÒÞK#'!c? ú°R­szÁg*·°Á@*Uë {2‹#o²þ!É­XŒsÍ·˜ï,ݲ!¬%ükÂæHš!½›N·M­«4v‚´Yó1ht¢0ò®½Y»/³î ª“q̨¶)í»á– ÛeºÀëTgÛXë'~ :ž¤0PP··l¼u"‘õÓh;ÀÖ l«ÝcÏÛû¬Mn!òmÇÝþûûWÑÖmÛù÷3žödúà?ÀõÞòìsèÛW|‡ff¦iǶÍ|~zÖ3`ÈÞ½»Ýoö²Ñ±Z9Ž•x7¹ñô…/|‰¶mßA{öì¢Ûßæ–Ö½íœÑϺÉ$¯‰SÇ—éȱ¤pò Üd·(Wbr…œ8'pÁüã\P™²lúUŽ­s¹ø×,æ˜\±Ÿ\ƒ¨MQ©Ä +­z¸6„ЈԹ®‰ñ*mX7Dθ6âªìÉ€‹`ÌpÔ·„R’¹Ô|p¿ýší`iЮ‚i3Š4Œ¤%Y")KY3 Jo­3ËŸ$é *IRcž×íBz͈,— )`/ÀCÀ)¯7å²aR—èàáù“böúYGVb,³Çz‹^÷Äã¸ÆÖ'·F÷C¶NŽ¨Ÿ‘Ü ãûÈÌÉ{Oçí+8ÂoÚ0Ì¿|Õ!·äi%ôšn'Œ€þmþ®½~ŠŽÏ¤£¢u«3ïw·vä=c/:ѱªÀ#;¶Oš5¦N‡ÏñÚ¨|R(ÈI±]:7#±¨[~ ï^’+Ìï¹£ÙžàûÙÜbx6´cÞ §Aà ÏÜ9&fÓ¤kXzhâTA\Y†ÚºƒGBž’Ñt„À…yb6faÚoøl€BÀ—OÍÇ£Î°Ê…Ø jà×qЀ™uÌ„‰ Q?Bð¢C¶®­R9òÁJ8‰á¡ôùN®S·(•-½ˆ6T+6$§Ý€E"Ð`)V%Gòƒ_L«p2>ì!Ñ£È; Ú‡”è0‰D‘b ˆ°–Œ56KÇŒD^:ˆM™™#srfÎæÛ(‰4æ*Ñ#«f^‘6( Ê@Ù6'áÍå]‡Zûi<ÌhtÓ‹íKªppÌHòÔÔöÈC>²€ûŒ$cüFëp &wvsFƒ±ÿð–iÒü Ø{#óp’+{¿¥å6'ã+¨h8’ v€øSÚ¬š¢Š5±’÷pÄ›5±R´bšeÏ I¦,èµpä-> l¢Äý³o‹l6·‚Ö!ïž)íFfQÔ†õzË9w#LøV—.S³-ÍŽ®ª×8œõ¾â\,!¦áŒÞ²QÞd½IznÌý@££ãFò.~æ¿ðy¬iA[ƉþŽ"aÏÅ,UÍ^YƒQ-†:¯«¦Ï<ÏÚ»fªÀÏO³.j~‰¸gÀ‰Ù̪â\>Â롘\ÕyK²NÓ¸¶\-Sy¬òýAªW3Ç­ÉÑÕ6m\7œbm;"¡ç4‘!ñf7’TN+7¼’°V;Ÿ<„NêÖÎw$3ôCâ¹L™k3õt€ò$ð±s$4å1ó¨fÊR.R¿J/±¸v>Ó‰Q?Ó¼ïÝöƒ•Ö¸nm]c„v0OÆù¡ÛtèØêÌ[WK »^»$£$ ”O…}údû'ìÇù<ïó ­œM)¯ï»š¦ 9¯¦IN=áo­³›6¤Û}VÝž¡_rÀ#3O>ãÀ¡Y£hÚuO‚%9AàC~Iâ?kªêö¿HÒ g’á(CÁ9«¬*C;` › øõtïÁÚ¶iˆt^³5¿ÕÒ€ÀǨÐLãÄàY‘š.jK*‹Dö\ÿ‹‘jÁ‰«‘½Ñ©ØOÄ6|¸,‘f—FK]ôãib¨`€AD»ÔèŒ ›hš /r»f8Y툸``_ݱ¾JKI‘'¤f Zs+”Û¾®"æVMɨΠĺ6À }ãrœ°~íHâLˆYT®ZŽV[iÆ`Õ|€ÐÙ¡©‚ú ª¬9—‚ xÇ«ƒ ´)xA«Ù «Ps¡r1gšˆïE±¥ :jx°àÂcóA"1„‹Ä¦†—ªY›íH w#7œ ­T3“Cý]çõ n¯.òèh8@s+uîôBÔˆÂí§Ñh;Ûi,âäY`•$QGã$±alMºrpSñœpÌr9â›rb&VèS8§3z·fè“åš&6KK úQý¢žj¹èÁ”}ÇꜭO«½úE‹˜ÊUŠ<#cP Ý°j̉:•Òh –$qšÚ•£NÓ-8tÂQÄÒí¶¨É¨Å©ŒèÖÉ9{;lZ=ÈQ—1ž&ê”Ô²ÉX¡sìù¼ˆ³©¥Ïì›ijL’°öŽ§#;ÈÈ)TȘQ•O¿&©oÛò’7ŸÀlL˜÷Ó³Ë<´µj΀þÔ,æìoEÍ©˜s¶Skžj&ÒÌïrµ Ïxú“飾Œ9;vì ½{vûÍ5û 8PRññqúþ÷¿Ïå¿ùÍoÒ.<î~÷»óoÐÛßöô®·¿žò´çÐEO}NnnÞ´–ç|^—H4>šŒ0 A£\‰vNŽqð ë?Î=Ö8`” ö]Êf½”qDW'tÞ¬ ªm±†Y´T '­B9„ÒuNè6Ün8OðŽútÝÚêíÍÝPñýš¤qp"ë êÓ›>Ú•g‚+Rd÷'…© g²ny- éZ +V&'oîÛ¹`qyÜ#õò\Ï ©»ùÁÇ‚28^ÓPZ39`˜¯yš›_™I? ÉoŠÎØ2ì$±úŽví_8á¨!õE:#IV>þ!zKŒÏ~ö“•´ø^-'çÒÇ0–ÛíîûùJÚ¨Ù{ýÚAïzàà\náï•´Ý@Èé ¶f(å$´÷`øšë¦8‚ž×è¬#7Ù,Ë T´íj± &Váµi™¯ðFòÔ‰1 ¨!ÌYjäš±ÆV (1­5ZÞÉ1šÇDz•3ügÒ‘@|ßPÅî]VˆqBü"±9¿>9rL/49Á`HÇáóÔh ‰wV—ð¼u6­Üœ)4'ƒAÐ&#†¦k.KrCsnHS^DïAטs¨W²¥W‚„ÊøcÞån³9QF“e*ÍXJµ­Ÿ‘‡ŸøXûJ+ÛÚ°5%NÛ&uÁK)ÛŽÑ°‘F#´®8i-‘Ͷ޶á}[|Ä.¿Ð ‡¨µ¶ô¸%êå8󦳱‘*Û)ï?0/ù(Ê’/¿RN/ö*ÁJ(¢4æõ/&UóF[‰ã5°gž0Ú ˜³”‹qSGä÷:ÙyѶàpÝà€˜4ˆapÈ ›oXipZ'hXVµƒÍÙln‘’M)fAb[Ø ÀM/JKÂ𾑫S´1-©«]°©ÙVÜÖ›ýkPòÚ…U¥ŽÂ0Q•’H2Ô¶@CûäDî•%Õ¨¨ó¹ó¸Ì±˜Þì‹×åŸñÑt`{¶ÑÜ7çLŒÚ†o¸æªd /¤ÜÍ]ƈ:!ç?/Ú06VeSœcÇS¥â`ý%ÄŽ•XÇŒÀô9šŠß‹« Á/d6?3e½PRä´/šKEJÚä†(œ]‘Õ`QV)@%Êr¬n̓Pæÿsm³&XO}ê“èC—]Æê»v /|þrzÌ£Î6¸xžýG\·¿ÍÍéšk®£ûÞÿúà‡?ÆÇ@îu¯{ÑcûXzï{ßËÇææfév·¹1k@îyÏûЛßön>ûÜû^ ÜCgvÕZ–GL¬»õf;Œ°i+Àˆõÿ`MaSœ×›M¿®éÇqéã'ŒÙ‘¡Šlò‘†eÖT¬‰Xó·oe3Fro(ñïÁ¾FÕvx¦(¡$Ô’á]µÚ)©§cÒ(3Š¡“»Úo‚ÔIá±ôuXƒ4ÀAX¼Ó×0IÝÚ`x:gs;ÖYQ(8槖sýÎN”VÃÌöK+i@º•9cëpÙK:îšÝ³ôûD+†•ÌÜú©£×ï°ÝÑJÀ£×=óŽ¯öÚ•( <´Íö¹H—‹‡ðí–Øi¦ƒÝÔ GÏq’àH¥á\³-ú‹¬–CL¦E8³Zƒ*á¼ÑÇÌÄ. LÇ<0×lZ7 Ö46C©ì[ê—&÷Çš,!w·F2sßç÷°ÇŒÆc"òã_e`ú‚ï{Ðh@S¢„Ä‚×^¦qŽìZ²ë”8Áïj€gÓ€IØaÖ€‚gN.h6»™¨ÁýZ°ª¼ŠKZXpêI}û2楻!”A§Úolœ"³óu#lÑÞE±õ^7iÐbµd7x @…˜ïLŽ—Í_Å&è2/ñÀ¢Ù˜‹Îq\ž­í|]t@úMÊ÷'´)7Ù>€æÈ”÷ Ld•Þ”¬£=ƒ„Ø26¬1{;gCèf ªêJ˜OT\N¹ç›l5Š³å-„Žs]`Á(òƒ}R[n¹ä‹«]Ô8j…\«][v"IܪiÇS“%%tB‹g¨IQ€Q²‹©äe^¨®røk5ÍX6—CGŽ‰æSÔã20ycÃáœg4oÁ?cû83ƒ Gûz/šÍ&Ï—:#žcÿ£F9·€ÊIf\3‚5€<ÐH´¼;¥L!€€e$£Ð'$²5Y¨YBä¬TðOÁßÎjµPø³íóv´,Zi$­`}Œl.$rI™ Ö'¤E)&óQz ;Ÿ«FŽêl~—çɺ³8ï³+¯™g¸½Ö‘ë¥ëvϘgž¡­Û®ó—›¿©#{aá±Ú"·N‚\þ+ P³+6ï„V°•X–‹X±y’¤¬„çÕüª¹Œl˜uøTl~&ñÿ@¹Å%1—Å=‡Œ¶ïZô#Ž·mŽž©Æ’H J X°vÀÑvÃúa^›œè'ÉD²ÂAŸª‰ˆ*bæn7ú†uÂO’@€£ŒD0.p¦\%éä¢É%>NÒ×å2_ ¥EYyŽæôPIfdŸ#UOdƒ³T*¼^C+ý®ã¹ãëd€Cx]?uôkã"í8>Û0{è€;vÌfqÿ]§^ >¨_MÂJÀ$[_8ö‰Àé6f?{–ð\^ÝÙçì5Nòú$ëã!¿qÙ¦õ”í= £\´ŽÖ¤ËE^K¬& Øà1ÐXºn³e{Õ´\w©PÙ‚mçÜ1k ù>"«Eµ‚ˆ4ß&Çt]1Ôt‰Ø,e6WyrŠ3¬T¸"¦¢á jüš'fQਞ8Is3¸)K¢Óûsι´Ã€Ñ±1ÛŽˆýÜZí¤ÃdZZøkí›ß¦óî|ºÕ¹çÒ—¿x9ÇV‡ª:$õG ݸ[6l•¢hŠÙÇ©!Îì¹`D}¤,Y¶A88Øu+LD8„\d“¦ZÞ"ãùùk7*Öÿcp@æh3­KøðëwO»»¼N˜?ÜsÑj;P'þpZcD¼*ÒÒÍps{S0—éLŽŠºñ7ü¸O­iÁ—Ó±R4{AÓ …FáØ•û†{’I±»I’Æ/鯎"'ƒð7‹3)[Tâó`}éæÛ×K*ÞyÿþÍ»Q7fsµuå1ÕÓ³5ÞŸ±gbç}õ4Rv;Ñ:òê ?»}WZ©¯òöåðÚ°Ž~ßa7­Ex,¬ôꯕîÛ­,ÖΊúr9)Óhùu­ãþ¤ ¨ú}¶Û>úUî5¿ct¼?GVØ„d—XË4I &iå0º1,k²ÏDnýp RÞSVð©°ÈÁX‡opdÍÆ°oÕkmJðFê à5Fͺ9³ÐàD…¸!ø€ ãâ—œ7ØéJ¦a›6ŽÐ¯¯;F%Ó'Uk‰þm»!Ð^ÜhcÅ%ÔÆ´Ñðàl+påvÝhBj4cx”ë«Î·dÍX‰÷¨c†_Aä¬ë*.ÄýšÑ»D¥2-coj‹‰#ZW<6µÄæÚA¬æI—!É°À¤¨jE7í‚næ±w„±~1bë‰M¬›†˜8$Q:ŸA°<¸Ûm¿è“Xr ÌXX.£TJXŠF™1նξœÄ©&æ9¼)ÛA‰J+ìÈž8ÐÕYÍ1Íu:tT_¼€˜X p$«Bæ~‰6”2z›-'/4 âW×ÏðK‡âÚ‰ªuD#ÂÄ[7)&'5ŽãÈH-LJ·Uðè6»àsò½2‘©éšuP\ß`AÏF° ëÍJB”DsR´Z ­OÔF­êµ¨ØI¬,ZŽŠ ë+6ìX<ÄÙ]ÌÀú%ÜÓÛ¹ è`¦“QgŸ.f[««[ë/rò8ÓîJÁ'Ì.j‰˜lÁ)¼m£…ùDòAí§¥îÓbÉq„¨VïXü‹„þÀÑežä,9Á»­KòEŒ‚%Ç>ž½Y°*†}à'ZÊu7¸Å¢Õ˜ÚãŽ1ÌT#Òçô|I²÷㶈΅9*¤fåOâÍËäxd}ÖëbçdÓ_o·fŸÀ1Jû…¨ó_Öü.±÷iÙHešƒ$|Ž<ÿbúȇ?H;wn§þïÕVGN R©`;˜n9Û—;ßånôÈG=–æfghïž]©²ÃU áüÖD¨šÌë¶$Ó¢Œ´QfµlÁ=Œø®EVóÙJ•W0Âát1ßÍÆq”49¸Å2ûŒÈÚÆÛbAþd˜ã rð§Ú€jDT»"¦ ^èÀ¯4n B!—ûPciYæ»õùK´Ã:ÄX–âÊÍš6<Äã ±\ãäƒn¼„RÇ¥ÒFalE'ÔE!gbRµÑz4*x$ìóF³9#ú_#dd£m”­ï@‡:Äá~K6"V^¨\y?Çœ¹GE‚J§Ä´8ÀJæZ!) ¨ZÇZFÚÁy0'b®ÅM‹âg¡NàÅØG‰ì+’–íÛ,ƒšmsHºñ„&mèSD|ÃíˆDjþãs‡„ ûR`Q墻YM .Pÿ¬–Ø’yi2Ùp´¶©Ùv'íΰ° Ì[HÀÓ‘´ˆ’‘¯` ´í ¨z_ò £ÈÿÖ©]LÝ«ÐÙ¨€1•çð’3õ Ië#Ò6iS–1•< ‰ÕžÄ©Lêòêý‚›Š(fßË5×=õÉtùå—Ó‚Ùâ¨3acÉj:žóÜÒ³/ö¹D¦§§ £pAª,r°p'd`ˆ8â¯_ 8Ûœ€ ¦j†Û†M‡À ‰F£áÕmˆk^Çا Ú;1ã“¢ÐÕDËåþá°»%ÖTÇÅ6ûû`,ê+xÀÉä« üBBJ’,oOjRã$Ï”¾~¼ŽVht¤ÊÏ‹Äz‹aiß©B'’AñXsÖ*‘ %H8.ªß”jUÚä2¯kîîËv§©—Ö_°Nëßûá•´m›lôÏ~æEôñ}ÐiKØQÝFÎÂßÔqï„þ·¾íÛ»›~uí>óœb²…MåE{1Ýÿþп\öQW¶\–h$÷¸ÇÝéË_þ ß³{ÝöV7s}×l‹)*Àˆ®QbzhÁˆ¯€TAHÛÄȆÜ.ÉE}XòvP§:™«pe`z%WÞ-Ö?6U°¦z0ÍÃZæÿ€@Õ.«I®Ö!ï'ñJ…”†Í†Ì FM€h]âçO’aiF®2X n4(Y`㯔Pc­õœ #ÌAœ©¦ÕVf„‡¦jv>¸ö$ÀoƒVÛ_ý”øEÎŒï0ºÓÉÖ»Ê3ê4ú1½Â\CDõ›14Ï\ ÚŽþçæz7Ðÿô±^FïÇkYS¢¼y#ð‚£¹FCÄZ2½ˆLé±u`'[®ÅŠŸ×C6êcóm63«¼ðKÿ©|Úh@KhKp ¹îÌ=×-ÈHÕÛŠa?Zj oS¤U ä®p¦]PD N¾J2-) au ûŠºj&IS`ú¡¦l—¬ö†4éf ()¼C§Ú5KFfã2›¥u6†^Ì„£ÅæSe„X“RÔßìXYÕ’,ØP_'̤xc @ÜŸãá×á%"ŒîÒb“5’ Æ2Ünæ eþ(¹,?`r'&ðWåãH”¸hê›3°½*q%Ú÷QdUg‘“$'áKÓáÅ©>ÖA†ºÖ¯`¦áðшµ>îê$qL L3Ô Ìú±­“Rû& B{V%0hÖ™¾ì²Ù‹j­.Ž°ªÑYiPÆGA‡ú¯ ÏTÃÑ£{HnŒÄ>Þùjؾ Mµ”i[ÍF…š<„Qóž‚ŠÕ)½!  Àœh:ßkpë(qme ¥úr¯BAü>¢XÆFÁÚK*3Yi=®,jÂM’Ò!Q)¥ecS°bÔ ´³L P[·?¾70££Þùtýúa:thÎ…ßuš ÈÊ°&”Ò>2@QÍE⣨ od%Fd}¼ÂÈKœ#$'@4-Œú‡õHAŸRÓŽÉ cWÊ1»f‰GÁèÊ+ÂâøÌLªìÈ€h0æçüq8¸ßäÌshÍšqf>>ò¡K%4¹­[|@<Ð`³DäK²Ñd0ª Û9+øg“ÌZË™/–lÞhfVK,¦U ÔODæd…ûÁ 2e 2¤LÏ-/7YÞÝš‰Š¼ÏvÛŽ$°yJö}ë‚Hà'¤k—%ïÌÖAä úgyq)uŸÌâš"õ £@sÙJ2¿Cšåö,ÎÌ‘Õ‚>@؇>ÔÙ<;ÿ[à£Û:„ ãhÿb-YñÚnf¨yþ ÝÎé±ukir\ÖŒe3öŽO/w0ëyõ†³SEÙ÷“'˜Ë–ëÖŸÃFû=až BÀi›4PËMLLЋ_übÖzÜ@ÿÑÃþüQü÷η¼š>ô÷ÐâÂh0 ¼×@Q06dËšŠ©–Ä´hx´Á’Ý¡ÍXÛ0V ÝGëtèxÜ…'0š£ Fvß‘m_+Ï™„€Éú\°l5炘0—®ŽiÏ‘:-'ðe Á/ê²92ø€äº”¶Wä26( > b¼c¬Y†á†Ò2Pœë"%Qd¾Ä< ± ¤¶éˆzÓçÜ@ý¥b6l.9GZµ]Nl»Q?Pƒ™Hvvý ‘6•¬i ˜dÑ($iÎÅ}ó‹ Äd°H¡*ƒ5%uÝxÅ\kz¦f$FËpH$ö#Ѐ™/—=£.{#9Äßظ0êÐRÌpƒë¡Iì‹/vŒ¡Í•àZ)¨³ÒÞ`3°uÓ0mX;@‡§–ù>ÇúÖ$"ÙDàœÎfd`2æç;£'iÝ`⪒ ܘ$±õðÀo<ÿÍn2Éš«]»g8a\–Êå‚KXXÔÌœ$^ƒz½“ªÐoƒM¿ QÊÑ“C•6Z¹ÖêÁ†Ö_(¦M â &.`² EQM:;w§ô¦¥š½„ü“gâ( ¥“5Íñ3:ŸÇQ˜t”ÇCF›¢Ú­˜ç±Í-áëö×ë †E‘g%Š•´µR)…ä:lĵZÃ1u)æ"¸Ÿ®j&Èà!ðÿÁÁ¦=®L«Óœ9pè|CÐÇÜÖMñõããtïû>ÀE¼]ø¤§òuÐL]~ùghvvV´%æØù矟ê»?4ÚŒ~ä2úïÿú6Ýù<9wñó_H›·î óλkªìóÿö…ôºW¿’ïßÍ™ÕÇÌâS‹ÿúî÷øü[Þòš5R.ÉÔ+먬{²4X3’pp¬QѲõ±™ƒhlÉEÅ‚†o~QÞµ˜]â`BÊD Ÿ`R…u ¦‚ ÐbzÅs&\¥‚Óœ`ýƒY*æð# ‰Üú¤€ 6’ŒF¨ÐuÍE° Ài8œÛ¥Æ•µƒÔØ„‚v~ˆ”ÇÛ%Ù†N÷Ð:¡•s-D‰ÔäR×o;þ#ÿ ³fs‡¹Dú~ý­K§C3²’YÌGc+úF«¾‡Ôg̺1 ‚öf6ŽFtdºÆÙÏÉ®³p‡óy1.Q ¼ V½Á‰·­+›ºœ`t®5 a—9@‚ìêÂ5$´Ñ€“ë›uÊì‹V¤hÊ`ß(¶iÆì;»-³“{YÂ9ØψöMÕ)Z3>˜š*=Ãœ(§Í¢°ýÂ~Yo9ç†÷ 2`Ûìmž%u<€@Ih Ý´æ°F‚rµ%çä-9‡S<=ÀG¡¥¯GN§™±‹¾¬|xØ*ÀP6ë5jE%—$¤¢õ?á!æm@êW¶Ò=–gÖŒå¥ÕÍ‚08:è˜cJR{šDH°Q°÷›6í´vÒ%³!ã»í* ­®RÒó 0 Îì(¢ŽTª±¬2–IØ°´Ô–¤»¸/gç–™¡@ö¼œ­fÒ!…ŸŽ˜™‹RÉn¨‰O„V 7*¡ozãIn$U{öÏJ6w›ã£bCs‹mèPÔƒúúI¥ŽèjªÅÛªŒÐ—š¨’]ŽDÕ§ÖDŸW›XU*ú¬§§Ây"8#´5‹’䓉 oÜ9ð›jÂŒ[!V¿„ÈEÖŠã¼ +=T³Ô²>M 92<€hµ<Ø8Y¦Å%±Ì9ŸHÉq#ø'LN ð˜›]â$v›7ðsÌ™ß#à ø‘cKÎÌÇi4l?°ý<Þ­ó%¡Àé¾K?Ùw Z&yö¶¨¤Ñ°4¿ˆæQP²cç&úÞ~EÝ获;Ûë]ÌŒ#”îÿüèj¼¶cÆh9þøÏ3Œ{™^ò²Kèÿè¾|‡ï}÷Ûé>ÜÜòìsùòƒÜ÷>÷f¿”{Üýôöw½Ç1ÿyÅ·èi]H×]w=¯ÛÖ½‡H©(€¤û…¢ÙòqðÛö¹ŠEõñ﬩`Äúvå™^¡ Âær>™vâ4ÏXÏt-ç À5ož…2ƒHlhþ:Z…n䶸Çk>Üz¨à#\ì² =éxå:Ö³ä#¸å\רJ-"¯I±Çt;JÕ`ÏçÃËôR&hE$A\8^C³ ùÎ×;·sM{÷ÍzSÁ.kÊÉ‘Õ^‹q´n*„¦½o9LHÚŸ¹|ƒnz£I::µDu7¥Ê«ohPÌy CíÒ±‹!stºnÃýŸ<åi7º™#÷êÏ~ÏÃÇãõ¯= "n HéEÏ} }úã`¦ÆpÕG;…“:2¥#º•.qX9–“2U©iö/,˜6š‘#fýÙÁátý>Š9 ó©ë*âðn ìôR[ü@†‹-±²°<,Êã:X6Ýx“&":ü80*EI>Y,A[¿û0¦Ô×DÄûÛxB°F­`£)O"v ý, ­†ªîgêÇP|š\BÂHµŽk(rRü–æ—H<¸ÐI«Ο""—Œ/Ž| uí¥Ðá\MÌ”Qƒ™!´dø PÑ0‹‰‡0ªòs-@MFÕHp Ú:55Ï@ntl€ËŸZ0ýnúÃFE[6åC“qDÎwƒÙ.WIº˜fFNKe?Õ,Ý­<ì(î^ hƒ6fd¸Ê¾)0h´«±ñÎÏШ7(;)ì$䳪›öNNˆßEaÀ\?`´‹3bjeÊmÚ¼•Òñ×lé;`»ÓÌ8%Ɖ$ÝÒÛ5m96GLäÝŠ–;¶&aB,¡)ø۱Ⱦw™+æ²€´e—/¤àú‡Ê.y_œƒˆ&ä»KbvÚ´~קû§ÖZ´Û)HæéP …úŠø½BγpÁGFÒŠ2(ig^‹[ƒ +µOÇÜ)@–©Ôsv%]@ˆ3Ë t2|` ¼·c³MÖçôíœàï»öL³ÿ`–NVûÑa^é7H“û† qûmÞû!ÆËj2ž÷8£']M­¯qÜ0FìÛ:±¾Êšxò|)³}Ö­'Ô‹|8òìõ/yÉKøïºòèíoüzÇ/áp¸ÐF–Sj†g®úµ ìî#Ël&U²¿<^7{n‹vl¨P"ÖZÌ â¬Y¾›Àü»/ó\Ûº¦’š×XâùíÌÎ U·Vòù3wNrQ0×ôšLPaÍæ[Ÿ$záÀ„6'~Š©lvã/82“kŒ=·֎ZÑP«+¹¤Ôáìk!™Ô.°åµSUŠÁ¿Uúl”‡<ü ô§ù –6>ÿ¹O£}»¯¥…Zd5Û)çáp!C2TcòÈÃЩ!#œ…ŸyÝ ¾Aóƒc%W‹¹’_׸.„HRKµ¦Mh(vÑ`p ¡)³{a¶.· EQ¦ 6'Ì€"Jüû ûà8€È‘E'¹T*[»p|*cŠ~sŒ|ÆÒZ¨‹wíÚE?þñ™QHI€E ‘¬vë+‘Ô#~?QcIÌy´OJÓ'1K_»EèÊRhFÅ #tB·×s´+Œ¦08Í î¼MF¥Ç¢É“©bà’Õr)À¨#‰ZTX¥‰Vlœä›Ó,rmP³#7“rI›Â NØpå¡p¸m#±DÛ€}—è§ÃGæÃc0ÑÈX\¬¹äšÜœ½æ¦L ‘àÀÃÇ*0…çäRqÜëÉ)œ)Æ5‰ªéð–a´¼¡€”Ø%7tѸr& ôDËh[sÈXCýð\|¥˜‚š±±Tkˆ¶,f]5-šÉ[qŸö=|6mã¹w½aB¡ƒ-Xó+u½Ó¶5Ûä"2@/JBüöÝ302gѶ§‘ï S:›_Yß NâZ–ã…`-€yá²5‘d…—ûHãñ¤Á‡:o¯mL2k…Žâú°öÌ;~ ˜”t ɾÓp€w ê˜|(Jƒì•ÁFÜA‘jêäÖÀÃì Ù{žUùFpLî—VJºIò{ÕÓ „ÇóüúÑŠœ,Dl¾k˜™Ÿ?ù Ùçèö;¤^ ¤×;‚¯ÇÞðºn ^ôšW<Ÿ>ð¾·1X€Æ£`yXÿê‰á»Œ¶#JÚnžo²³: É<)„Q[&ýz½âàL“µ£¥vj_TmǺÑ";¸ëlÓìêà¡a¾…èWJÑn³9Pˆ´‘m 'êÓÈ2K1˜ Ä3&àà” €ÐNI}|HÏ@²e¥=+!#¬’Ê0²‰¬õo†.bÔÉÏ;PbOÀIó+߸ÊÿŸþ7=õ‡Q–Ôi¹Öh±yþã mIjò¢ 5ÛM²‘²3`^U¤ñá 6BPë>?6wh­Ê™7Á$Ìlö>ÚP's‘(4RLd¸™j]9Œ-žæQG-Y³´Ø1©.«üR««”êéO:=ãÏpæ"»wï¦;Þ= ^˜aHVf®%Ün‘3¤kšLëê5÷hàýZíˆæë^⼕ña@”´½X(0àÈæ~h[3-ÎÓJR`£[û ÖÉŒvÁ‚UrRØgVåн-1Ĭ?ΞƒMcrYÕ9¹ÆFõ Ýå„“vùL°>A³€ù©þdíÂäšanë‘C³ÖüÕFGK¼OÀˆˆ"ŽòìÒ’ñP²€q ÑÆ#Gæœ;êS­ˆjulpbP«u+sžØú¶Ev|‹VDüG›¦Z%ÑkÿÒhX¶ST#î4m¯ÊMN•t]/f»á ǘ΋ô8KµÆKÍ)JYc jGÂ;Ú2N gëA4™©ÙÕIýû¡“Õ†€ÊÅÈiÔú!}ö~ÁJ¿`¤—–£WyjŒùùš[†ÅõkzÕVc6!ÞøCºn ~èñqúÎ}“¦$JH—­ýS Š)ó*h<°.m/¹:°þ_{°fæNÑFÌ’²Xfë1kú×(äʯ9¸Ìn-ÈýÂXƱëÕXƒ²vTî#%ì` @"qàCB‚bÓi¦zl§ØXXÃn„͹(RFQë©^«S¢¢O•ˆ$Q¥³7m¥'>ùÙ®¬ÆEÖýê—WÑÿüà¿é›ßø’?Áau$õ2†‡GmG„­m‡$ò ¼p,+L‰/Û°’yÍ` x½ÖrÙ0YÊk€]%†¹A%½u30ös©” TJÖÜH)rÜObÁA›q´yó6zê3_Bßúö·èÿú–è!!bÉ©¿"ûŒ#ôì羌«ÚlûiÓæm®ýöï¡Ë?ó1úÜg?–Úc9êJœ8`©ç ½Ü°Ö0–“0 ©³]í¢5kÊ”¥ì¢977ãó¸5)I-ј´V6­²~!›ÅY™ËÄF‚™–AŽ¤Õ\_fªÓÍ!cË'=T ‡2ü,u_E¾CE 09ŠV˜ØB qýl’cÁ†FÔê¦ÉPmcQÃóZ_+f¤Ô'&ä‰ìû s‘¨Ó5žL 2¿ ^÷1Ž‰|˜[¾wâíÓ㌖@›Is»™¶÷`E²!ÑD.â–cÚR Øw0 Ùs\Ÿ›ËÐÀNL™1ºLËK  “Ëuz`¢Œ"·à¹Ô©ßÇáž :\t,YÍZ ¶=öÙœhîØ:†+³«¾%x7ËM9Êy…ŒFha¾Æk!€BµTæ1©‰,±/סŸåµàš$Ñ:xÀ£AA8BY!Ÿ¼Ï²ôƒÍ¶„æNæ€ šñ)fs,ô0õrÚ¦$ÅØa­ˆõ²¾kìçÕ\ ‘ÑâjÔ+5ÓZVSJ6¹-t¼k/Hñ¾Iî•'Iÿ#¢°¸µ¹ÀˆÉo>ÛïI0µÝkF";NÂV9à$ÇÁ5º&å ¨¸68n½ŒØvÛ§ƒN|€­œ¹ÚƒBéžiRnŸXÊš#­¤Ué§hÿìbÂV 8õ“yí …3á³gÛjòLµ²Ï!Îo ¨_zå?¾ƒvÿóÌ~fT‰áQ¢–[k× žcuöñP(€Æcj®E“°`ÿÚ¶¶B»Ö8š–fPÇY¢&íŸ6 ¥ pâ5Hf mH•ÍôÅ”³«O–ŒÖ±ÅÑ+6¨TtÞí¶ñhçˆí¶³)çÄjvÁÕäe†¤ÑŽ¬xÁ±œ[¶ÚMë§ëRÁfNX‹ÈïrÜÛK,–â™ÆÝâgÓ{ß÷AÚ¶}»{@d ¾êª+é·<Ç…±<°/=ë食ÿì§ü°` ÿæâ—Ó£{¡a„géï_ú,úæ׿p©dQ6þžKPl<äá—”öiYF“ó{,µØ¼ŠJÉU¥Ÿð-²YÓÁ|ÄQ§qè‚?y8½ôïßÈßowî&þ\°’E˜1á"€ØŒ¿ó½çO%ô €À™gÝ2uì¹Ïþ+úÕ/® œÝ4Ýóéâ—iÇ‚aîvï›ëéÂ̸.&äaþzý?½ÏArÖYg­¸!ªiU¥b#iÙîïæÿ‘r+Øöói&çÔ^æ,ëé¨Wœ”Í:Û×»˜ãq?DA„+h7l˜…ãØšd5ZÖÏ$4 F “ ð‹úCçòôˆótÍÿѲ¹>šÍî>±eÀ$x‰ PYÀ`CðRâýˆˆR¼V¶Æ4ûO)ÿ Ü¿l#á;|›Rf$øÛ ­¢:Må( í…_HÍHVD#鯇‰Ÿ‘üŽˆ×G ó¼d¿šþt ª=Ó¥ærâ¥ê\x ¦@(Žu鈬F!í“}aΉÝr£ªõ DAfЯ W/ ?D…ãqÙ5˜×ëÖ ³yüf%»§5a6˜+ÄBuLG0Ç(bmŽÄn_~ b 穱ÃCCQ«éjQ±°nÁ"–êÞªjb-€1B“©·[_ýo÷Öñ=¥µð‘„`Dë°}è_é(qï9Kh¹$3 ÂQÖ›=Néß`GŸ®™ TÌß‘™¦a†Oo¾žÕЩИ(­V«ÑèEȲÆhb^ cS‹t:©›%D?¦jy¦Y+õùûÞ÷>zìcK7Ð ´úú—?GϺèQì|~A¥x”™!·ðê“b§ çÐ9Þ0¥øf›}¤ZFГ«`-šošõ«A›'JÚW ¡Ã¯5šh÷o²e < ‘ñà[‚誛 ¸‰††“²£bÏR¹ºÙLâ̈†[_s›ØKœÅñ»Êù5+Š˜©kÚHX UŠ²Öí,Ö;“7A;P†³;?«ÔÝ´Ò[Ýè·mÛNÿûã«ÝuÿÍEô±\F•¡Qúħ>OgÛh1{ ƒ{Û?8ÛÖ-e«ƒ#̤-,ÌúdoæU²ù$x/°  \ò6Ï.JJÈe‚/£§UŠ—eÄqžû¶&Ñ—Nð¢À [üà€„ºä$‹¹É\ÿ®÷‚n{»ó¸ŽÛž³1µYFä™S8[NŒOÐ×®ø™kß»ßñzz÷;_ÏZ”|ãû({Ì_܇ö­ˆt}³$½íûî=5½Ä‹|È´³Dt@i5…Áù‡>ìôÖ·½‹ËÀ$4ZÕ€bJOð㨭© ¯l°œH˜·‚at E s9²$·á“ö²±Ï6ŠŸÕP³¶L­zÝ–3#_\¦ó._—D„*D6‹zÑúDéMøæ5$`6[âÔnm–IJÆšc13®™»cÿ.½“¬ýÇ2D àZAò:€{dÛd“Z]ÇFÙíwHxG0OK2ÿcë–QvîFøé 6÷‘f]‡¸rY“Hù´ëW¬Çmô¥ˆœ¶5 ±xioÊfkmß'¬ÕMÈEV£â(J·–5Ã$æná-0Á´‡}¬ I¬ÙrÏ¥ÚªÁ!8ó—€@ˆÔ°î ˜`¡Ü†"¨9zdNLýÚâ;§Úµ¢Õ´©&‚A¹5Õâ¨fE íQÐŽñÉjÉåç5›²¹aî"ÌùÆ5Ð 4‰èdM±@ÕkÔ0 :&xt=ž†é3©õ>çxºÚXpÁ(hS˜úÊÜÚˆú°Ïšn®èïñ›¦Õš é<Øle|+CÊ3»ê|äùUd¯Eè^$.…i௮=F¿ ê¨u(zNëéfº…ä‚_ýêWé·E‚ñ¯ÿú¯ôo|ƒ~ô£qä­ÿýßÿ¥è÷ƒ.|ôôýï]Á9?àÛ"A¸^ì%Ù«#þ‡gê´Ùh+B^lÎhi7M”(”½!`Åæ5•Tݳ‹MPZl ±~Ì›u¡Ä¾cËœë®jx¾âh•\ÌxZÓGR)Zð¡rÄ+™¬phS/•äkÚÄYÑÊ6€)?¿,'ʦõ”m„ÝDú¦R·„rö –2Ï-PQ›¡×½æú×K?ÄÇ¡%¹åÙçÐOz¥l̃Ãt‡;Ý…Ã_^~ùå<‘XSB¢¢–a2ÇèÌ›Ÿë.†´~Ý$}ñ Ÿã6 $/žåv·» ­[3a™_vdt”öïÛK¿üùO]sGFF趷?}QöïÛC?üÞŠ#¦¹p¨Zt›îæ-Ûé&gÞÂlÒ#FC°ËLìÓÁÃSÜ&0˜OxücIÁh3´†É™›Ÿ1š Y+Y úzæøT¦·„{D´œ'?áÏè3_ü‡Åß‹_þºè‡r}0 ÑMæ[pÛ;óFú«_\M¿üåU©‘ì ±üϸñmhÆ-tÓ›îäøÓW­ÔÿþèÇ `ªÅvõî’=UÎË!ããkÈË?¾÷ý9ßñã3ì¸ð’%,„w»ÛÝØïâ_ûMNŽ3ݺu;‡3½üòÏJ¾p O³@Fül ÌjBBí»vÛç—¡v“ mσAŠ cGÕ•öúBl³©ÇÁDl}k­¦óÿ` —P‡9š‚ DƒRßq˜ûÅKV½C±hIØÎ?ñ››šJÛOÓÓ‰èJà[„TF¥Bèå¹»ýf¹ßýº@ž©ã%GÖŸ$]±Ø>áñDé Ýߥí´.zD´*ÂtºÛEêC’6Ñ*Äi„R¥ßä“ê}Eƒ;0¨Ø_X|1'¢‡_æè3›\7=½L33ˤÚ5 ¡DU+ðZ¢¦´¸-k8l0 ¹›(vS-Ž˜%Ï(f_m˜°?ˆÕŒhÑŠ´\.!Öz˜s#,T)Òpµè€{]AD+J(mz‚²­ôfð‘t“ß#ê°Pœ›©!E)ЂŒ`&E€NÝÄÞßi?lÛæ̺ÛìS9O­ÄT·3aØñNñ[7òXù寥2YÌû½L¶”œçµ5«ý8-KÑÌóª¢BñkžyX¯ßYMGx>üÞ ¤ü6#^}úÓŸ¦?øÁtýþÒ“Ÿñ|úþ£¯à„¶Gç´v¤è„AcF+p»•Fä‚NA ¾Æh@jf¯(ú5oÄ€XõÀÉÉõø„©\hN¶¬)9îÑÁ"cQÿŠ×l^;@ûŽÖXVS0ÀZD aÅŒmL)ÉP»ñ&V-ùÍZHÞÚ4ΡõÀæV-§%¾Ð|°‚$yBwÁ1Æ™8$ðB]Õ´spÍJiQ˜öp “·¼õt—»ø„^=åIôÉ^ÆÁÛ·Ðëßü^ºó]îÖñ²R4¶öÍnv3f|ÿèïOï~÷»{ÆÜþÊ—>OOú«G13ýø¿z ]ôŒç1“¯ò²=“ˆmôÒW½™nwûó:êz×Û_GïzÛ?ÒÝîqzÙ+.Iûì—~ÀŸï|ëkY»ÊԺ߉ÝìM_ÎÎÍЇ>ðnzÒEÏås·½Ýé6p'úŸ|‡oܲ•^úŠâã!Á¿æ/}ÍÏÏòyKzÝÞC›6míh;’¢]|ñÅÔX³cÞû€&73LŠfM††è’K^KO{úÓ;®{å+_ɘ8çŸ7zá _ÈàCéå/û;ú«'>…Á‡ÞÝïxG£¡˜vÇ4Ü(‡øn‚db„Œêukæ%ά²™—-÷NÀ¸X´Ò/cm[Æ­e5õF>á¹D-Z’BÔ¹É*swZÚÍ‹J¤ñy:š“5“Èc:з-ë¿®[Ö¾7““ÿWï©`%ÜðÝ­líIpÿ«GzJäÝysVLB ¢ÉMý³û:Zˈ¯+qaÏ#'«±@ªEN‚ÎA<š-3dËpŸÐZŠ!].—ht´B%#Q:vtÞÕÝlûw %~!d5_6£ûR‹—­öàGïÁI½ 2$/‘„ä†v 1æá 2:\MnÐÇÞôʯÚÍ iIJÄ+;`¢o»`’óÏï4u JRwH(qc'‘h͆æ>a_'ö#p>OÁ“à{Ètb6RÄ™Åß “«1·Êš§ªùeÎ £ŽïïÿûÙñýSŸú=þñçr¿Oôò—¿œŸE ÏôÒ—¾”?Cú÷ÿwî,áù³eévw¼+Ýîw¡ï÷ š0šD¼š*ØýI 01 dÝh‰…¹ïU³¶/~åør›Ž«ÐàåÐtƒ×0hMxß#ñO ÌI7h„+sYÖ粚ì#Ö¯{%Ê0 ¤¨!fÅ92a¤ŠUÃAV²ˆ‰2PÛæìœÆϵ#™Hœ}ÄÉËaë‰$š ór‰¨|–šâès/>b4fä2ó¶‰#2Êžw×óÝqHáñ³ŸÒ6ÄîݳËñd°"Î0È òÑOÿ‡cT?ó™ÏЫ^õ*zÝë^Ç -@h0¯øCã~ô£®ž‡>ø¾ÜÎO|ú‹üeÀCJøx^öÒÓÅÏû[>‡ãŸûÜgé _øŽ×¿ùýtÿ?º--.ÌÒsžÿ÷|¼ëm¯£þÛ»èÌ›Cïù×OÑ“Ÿz1ýà»ÿÉš›C÷¥€Ï/Œ–æS_þâçXZÚÔî,i c÷;J¬éB"ïïWÿ4u`âûæ^[LûÞeýGà¬þ²?‹Íµžó¼WÐÝ zíëG¶äa<0|°×#îk´%w¢—¼\B"ê|=D²„±1>Z¶ÍJ8 ç…8Ø¢Y£&Ã;Pð¾Ã»yï{ßKçž{.½èE/2Ï;G—þË»¸Žµk&Ru?óYÏ£Ï~ö³ü5ê>/¸àºì² 5Ú[â´ËKâ “uJ7=qœÏˆŠY¢˜Øqh^˜¸ää.ÑЦ‚Wlñs€†uÖ‘Ý&íì0 H¨¾ædÀG¯ë¹ÏØ1fÁ€-- ] Ïñzö‡2£!n ¨óÍ€À"øÆS’ªS™…4뤬¦Ü3q¿)¼Æ¾#§a!J y¾Äå*rÚ“8r‘»l8·¸3³­ ‹:Z§yX¾ G3u>þ¯žJçœs.íÝ»Ûh‚_%ëbìû yXff%GGËÑ úÈ# õK‹ŸB“°EØ])+Z3~+¢ïÁT†q1iÉü*DÎñ\FÎiQûC¡B+«ép¯ÀúL%‰³`áV_WÔ18ˆr^¤^ N (CÓY%¼¯ÁѪÍ/PÓ"¼ ×ˆ¤îŸ°QúÆö™ô&x´£³M–žj: :‘kô:ÃÖCGæÙÿªÞL›Ê®´vd}(²Çó~Ÿ¬@¤Û=²TµA¡T)&Ö!?éY_ø>òž1¥ñË©Ÿ˜§ü_Ò©¤ë¯¿žþôOÿ”‡ø ÇŸ2ì8¦ 8þ°ü>Ú›m3~Ã|,ä©èU˜ÎãØÿzàŸ>‚¾ûŸß`ž;1‚¿#ÓMš.º%ql ¢yÃ<Œ”½D§˜´Ùù¼5V¢ñ!‰t…s¤’ÐõèŒ UðÇQÇÞ£ËTŒÚF(+|ž`†ÈðÆ šGDÌu‘ É¡ÅøˆÑ˜è-æUÒ J10G Ùl y4 A 0e`|†«’ M¸Ì[ŠåÎrQþ†ŒTld¸LkÆK4a×ÄX™ÿ°ém]7@›ÖVióº*m\7Hk&%ÓøX%Õ™çœ}zücÿŒ^ñ²—ðð>öÃü]ôćÐÖõ”ÔÓë^ùlf¤•FG*´ní =è‚{¥¤äŸûÔ¿PkázúÚ—?áŽ=ó¯ŸA?ÿñ×iÇæAzå+^êŽÿÜ0ïWþø»ôƒïÿ7oú 0¹ë×NÒ5¿ºÚ|ßîÀ3˜èýè'lþ£?¼÷Cèú½ t?ºŸ«÷××\ÇfW!s Ó­Ï~êÃô—¼0õìÏ~ÚcèÂÇþ ]÷ë«h 3 1ƒRûÅåVGò*/y òóŸý$uþ,ö IX+¢Îë?øÞÑÍ3~èïqå ¡·8Í4<ø~ùg>Jìue8’¢~U‹©ûÁTcz¶FG XÇ|ɬŽ~xQzÛ[ßJ¿þåUôÏï}‡;ö‚ü›»}íkß ‡?üÏSõD^xá…t‡;Ü!µÜüf7¦µUs2ð8šìä{tj™³kÏ.Ô]”& €r°ÀÜ ×ôTª) ·øVDF%Ù cÇaÓ(y\Ø:’Èg¨cÌL²5fŒOš:F‡J昄,3(þVX`ڴР©Ù:›©ó'¹áø¿låWÒn4NOG§‹ÁѲºÍ;3²ª™¬qP¦Ò2¸öο6Yë²mðLc>#J´µI§™‘7- êvͲíeÿ–d_®‹ó²Ò.pˆï6û„±“õÝh·Cçûð¹ºóyw¥g?÷ô‹köÓ?¼úuôˆG=†.~þ é¹Ïû;û\‰ë6w«ËÓü/ÂßG®o¡ýàœ ÅÈG Ó+·,Ù,éUk¢‹på0«å9{Ö™7¦-×ð„9„\FÐú•MÇc¬'¤kPÛ¯Eö¥Š/ŒF,K@ Þ’U2¤B[¤ÆBB”ûÃ#Õ÷ïÑCRR èâô,‡—LrªtW$þ¯éÈÜ×ý–ökIT²SÀ=@Ï}Á߸²`žo¼uˆ†œÔtó[ÞŠMBzú3ŸOÓ†‰½ôÒK)®^Èš|ôS4fj6/„nèÁŠHöóòy„¶ÓÙ59±±DCS0hYZÇ™YXozÓ[pÈãË?ýQzàŸü¹}ÿÍ}”dÚ2b kl_~#û»Òµ»¦Ù û߽Л]Ü• 5* •é—?÷þ'ˆxv—óïÃý4™qtœ™a°Ó2›Š…qdoÙ?žK÷€dn†t·RŽS™¿9ŸACCš"ä¯Ve ­ŠŸ ua@ªe«Ñ(ˆ½~¶ï\®ɪ@áú³*¹"¦—<㌨ØìCic·úa >O'K«eœV’j†ÄænÍ–hK­„¢|§ÍÐœÁɤ}Ül7÷—›VÆ­ÔÝûTHOý3)m7 ùùw Ì:õ6y¯%§ òlrš:11A;·ï 13–áÛ¶Í|רYzòEÏ w¿ãm433ÍaÌ­b¥£aFÛõ³¶k1 ¡‡Íœ3Ït»ßï >óhÖÜûÊŸ^I?6 ÎO~ô߬†VZŸ‘Ô¯¡‘Éžã}A5Rj&F™îËð){Ú¨Ò’V+(£ÈûèÃM¯{Ó»éË_ø,=÷™O¢éãÓ6—‹”(ŒÎ¦cÌé:Hí™ñ(œe=ˆ,݉så B±#šäkŽÚ¿S¯BÊ2ÈXË+Ça¶±”£^]Ì9Ö ,¬¤åÈ»¾—W/ r²@ëG¹hµ—";ælÏa[óÖ´ÛÆy í?8çr-e¯ ?C ÝêÖwH™qŸ,TüË¿ü‹û éþ³žõ,þŽýÌ:’6¿ñqÌ:Êü>SžùL®  ¹™Røœè‹^æö¿ðqÖ-Î¥ïÿ÷·ù7ÄœQ(Àª<²1và· S¬ªQ2 Ù¤ðAY„ç½ñ¦Ù?ÌÿëÇË<÷wY¦›A½šs —hÁ“kö/ÒM¶ ‰_‰Òºn˜¨Ð!#x¾þ€9·uØ­›E|áDĉ4 Ît]È'…‚DdÂÖ¤‘™Ø¼€­˜m¹£Äï ‘ wÚn¶½p(ôÔ¶ `ä̺,L5lÒ]‚ñ¡KßEßøÚéÌ›M|Ì“8×Å_<úIô€?y8=÷i4ÿéê õÁ;¤Q£•˜š9f$ä鉾ϖ۷oË=‚²ÊÌ úòpxFÝhÒY7?›þõCŸe•þMϼ…;ÞªÏÓ–õUúú|žîùÇ÷çc$¾ç=ïa3£g?ó)ôÅË?ˆNŸP[…43ßboøÆDJD¿µs’ع]å8™>…#;É]~C<ø/èx?Ö6¤ËNóÂúÒý5½ôÅÏr[{œ‘ÁDdíšA6ëå„Ž6ƒñ„ùØÜæÖA£ES‚p»×í>œº6© Y*š¿RÇqHd§¦—Ýýˆ¼s.¢¯!Œqpmh¹Þ”ä€Í¶7‹Á˜7ã}¡! scb¤lH”!ñûh¶Ä鼟|'ˆPÁÀ¾SÁÆ®aTCZ 46+Ñ©ݨ¨Èc²åKz™-‰ô+pÐçµ^óH©V¢SÆâÜé.w£{ß÷#(ÚÁ÷ðùò?KŸþÔG¨b¤CM3ˆjó‹äÇCdßcBÏ|®h”oqö¹täèkƒ$ä°TŒ""Š2æW$Ú£`L$A) !=ÄþKPd¨Z`¡ú ŽÛX#—kMú] ìÞÀ>6ü~!êèåÍç¼2ÝŽ…€§—&¤›ùRX¾W;zµ§áÑg–`B!N‘×&³ª“¢\ ÁÐ8¢ú˜2Ê0u|)ÕÖl¿åiF”þèïG§’²Z<-Çã÷8@V"˜e¡,€  }7¿ 0üª}Ñû¢ü_þå_ò=Ã6…·@¨ת™XÞu«%hA²¦X½Hýfàôyo}ë[ó_èWó¶¼~…6f¥úóülàsªÀÐ=ïõ@@@C†‡ñÉOÓ}WÌŠ`âô7Ïû{ú£{ž'ºÁ¤žž«Óþ#5šýöØoCýîx×{Ó¾áut£ßÜ•ýÔÇ?È ÖG>|)Ý>84ÂòYظì_ÞÉÏ9’’NFÌ9¶“–‘^Éç¡©¹ì_ßÉ}ð’<.þ»WуòwÚô‰ÿ;˜¿ãͯá>J›0áÚy0Õ³är t-6·b:)Q¾K67oÎh€Œ¶aó–ô1H]æfŽ›¿i6Ç¡í?»ê'üÎà£ò ?Ü%9üå/~JÃ’š„Ão®³ƒ,$u¯p®‰K&, 5%Ù…yrbœF‡Ë49ž6˃ÙÈœYðaÎÒjunPÐÔá^и”‚ÔÓl¦Ò;ù†Í㑤‡h7$4²d!¥¸œ×Ɔ#mõ 6ò6œ “e[·07ÉtÙÓ-Ô:ë;YgsôG½ñ›ÓŠtÛü1iÌl؈4‡ s¤¢Õ$ùûp-(IYtãÌv)¸ çDäfß™=“‘ZG)FS™Q=ÓT²UGЀl§ß&AÂàZ´lí¾tèsJõ @Û]ο=ï/b­Ç© ;Þé®ü÷Œ¿ù[zË.¡ âü[lÚm/”êèØ =ó¹/¢g]üÂŽã÷¾ßfí1=áq¡]×^Cúdü`‰<ßλƒЛþñU¢í ÄjûCÍHxzpyhKÊvýˆÕ+Cî:slÉ,a ;4±¦aãEøwhNFv{rÍkf¯Ýuœ~:WÌüƒ $˜SÇQ‹eÿKüV½æ˜ÈÓhö*RHºÝk5‘~ˆßÛ2²Ô7rS¶~S™_~Äz–m!Ë:#°;xxÞæ’r¶N³ Æ>4½C ¦7 Æ“G`–Cm  áž÷¼'›/…„{¨)ê„i“j!hÀ >ë·:³÷Á€@ØöÕ®E»ô¾½íCBà„ëqh Îã·%õ±Q £à ÷×óÙkñ.🧂6lÞÁV%IÇB>˜ß›kÒäHQŽ™Åpód…öOÕÙüJ…)›Ì±_X2|gƒ#daQÃ2¸e]•Íé±åN ‹¥»ÛÖÒµûèÐTÍ€–«ˆèŒÍCô‹]stðØ2翃Ƥ8<(ÞV¬±`GóØJŽÚÖ‰Yö†@Ñò¡%,¤‘ L«)9 ¬D Y1&ëH+Œ°„ü²áA›ªÖ–(.¥ KjIOdØNÃd ×î¾þ:6ÙQs¨›Ýâlî$PȈÄLP1=ŒîsŸûЗ¾ô%føÿúo^@b@€’+®ø6=óYÏ¡#F„ö¼åí隣É-¬À¹ü?þÇÕ‰wÉ%¯¢þäW4`:=D¯{÷즿xØ\r¹r1 6º„µ /~ÁÓèß½‚žò×Ïçp¼JOyúóXªÇ`%C£®/½#û«äIò%ºŽéŠ:ÀÆ÷¾ómv&éÿòUŠ% ¥,ü|ô…€x8uŠ?ó,@wËÐASè Då)ù÷ GklÂf§¦6üCåôñC‡öÙdwé²Ð,åHú΂”°º-VGÌz’—G”Šw°fF´œï¦Ùa© ¥~øŽ6Ê|ð7,tøóœJj¶~³f Ý€ÆÃGXK2ÕËšðE*Õ Oé!Bz@tab3cQSªøBr¿(˜_QjxGtÕÊ üö.¦I¿)5Zȃš­$`Ö$Q§$žÔd—út^ÎÓ®·½ã=t¿<ˆNa}~ÍÞa€È è‘v?³fïâã¡Ö6¡ÞóèYðñŠ?¾ü…ÏÐç¿ööë@ zã?ÓþèŽZ!9 yí”|ü#—²¦?¡l@•„²‰*ÓçÈ z²`ɃlòÇæ[! L§Ï/K¼¹¥–õÿ2kP­™J8ù›&]‡FFÊFj?Ð@@ ˺Vå_ŸÇÔgµýšEiYhõVOgö•´+§šò´/Ybþżû__7•ºn%mÇÈP™Ö­¢™ÙeÖØ+j3 0À`fC hÔ$©ßÔkÀóüÍßxÓse¤•iFÝ¡ÀFÚR`- ÚöÌg>“rÕ4(¡<Ž´4„m‡‰UhJÕ‹P÷R> ßácÓëzuÚ×k yÑç>ãŒ3øSýJB UÑãJ8®àÏ­fo hqpôÚ£}ߧ:×ÊÙçœC`wâvä„ÕðÛ@T+ñ×–•Ö5£æ82™oÔˆVØß ØØc„øp (I˜NÉh”ûÖŒ\rA¡Z6mÉþ£Ë¶}0öÈ©v£ÍÃô‹ÝstàÈ¢¹ÿ(qø)h2Ô¶Z÷eü,þQQ~à‹ø½û/ÑÞË´Ç|^¿Ñü-ѯ÷-ÒsìQ¯›®Ñ œsgàLk¤K✈ °b#£`}AVDv†að!QV”dB·©ÓjB²ôÂñ ûÿ!„ð}ýk_e6£ÐKþîbzÀýïC÷¾÷½ øÁ“]Ì`úóÖ·¾•ÿàð|˛ߜÞÿž·""ƒ1ýI0±on€Pqp£éŸí:¸L¿Ü³H?ß½H×¹Û{÷¿}š¾ðõí4Ýó.çÒ›Þ·{»;ÜU$…íNÕ7¿ Äjªì»Àc“¢L$¬Vèèi¾ÿI qfæçæoßžëYáÓ0·Hâ6æ:0 0Ÿ{П>Ü_oÀÇÃÿôžtáãÌa†…™ë39n8Wà üøLç¡ÕR‚9Ép5âˆë2Ñ®~ðƒÿ5Ú‘š3« ¦;0à µ)ÑÐÐpLÏ«&÷\gqñegñIë(>dÄQ Æ,ÀëŒQUb,Ï‹örHÝ”iÐj6@¯Â7í,ˆÉ#›5Æ>ïÇé¢ß¥üSÇ—9tkVÚ²Ú%õ` ÀˆÓ†8`ÐJ¯A/NÜ4 î!Gô¸¶GÍ…ôº(šƒ¶ïØI¿M:㌎Q }è°„"²!´#ЦÍ-%Ì/Õ6+Ù´u}ãŠï6ð4üÄÌúxn®Éh7Âã<ô/í~cÍÿ»ß"`âÃpÇaZu§lxuÓ wºóÝX‚öC* ‡‰\›/„Âh]Š%ý¾3+3ÿ‡~†Ékd%Ñ,ö<$ùÅFÌš‘š¬)ÇŽÎQ³VgÈ© å½M-Ñu»ÓZ˜PH’•ü‡ t–™î¦áèg]Ô2ì7‘©/kæÛK rª(ûœÝ´Ý~÷zö;¾H?ûÅá=T(z*)Oc`Yé}73fŸ!…Ìw¨”ÙÏJõ¤¨ISH œP&{¯°þ•õdëÁSô„}¢f_ªÉQR­Lö8(ìäU ¸”ÂûdŸóT„4ƒ;_·Ñc$6@a݃uKT¿5,äŽ99%Âá6£™™¯[á´€uã®SdGËîÕpÍX7Q5@¤ÈæVKf¿‰løGh>n´eˆAΑ©EŠ!=^à(" ÎHÈÉô€‘ðŽ ­Y¿•nqËsܹo}ë[+¾„fÅä†Ä‰ëpŸå¦D)hf`Žþ"‘œþòqáë4L/ha~†Î¾ÙN„ó±) dù¹Ï}.uhYÆwûöíô =ˆ¾üå/sô˜;Ÿw>ÝáNç³Öãü?¼5Hóo_øŠTèÚÊÀˆQµè'?»6Uçpð‡÷º?½òµo'µ—öÌQç"É!b­9ÛSÿúZ鯟ü(.wðïÿ ;~{Sæy/üŽµiËVÖмé—¦0‚OÈ 3÷ÂH‹5‰Ö,É…¿ÇúÉ’ä‡þ<’*¡oÛ[³ïÑv³h(ÁtîŸüwÙ1Çw8û‡Én@ˆÌ35]g<59ÂXDø8„Š›4““D€ÅÂb“Ë xn²&"OC㞷džÜIø^ò‹‚yîÙùß »ðß$å333qV–± Êñì‰þ˜‘$§®$Ô”Pº¦´QŽ%øpþmÒ•W^)a¦mƒ½@©³_%2WBÍtùçÿcUÚ›+®ø=㢠éÖçœEw¿ëè¯÷ô‰]Ö÷õ!úÄ X¸ËfÎŽ›°Øó5Ÿ]}õOÜŠsõOœ*{¯û^àD‚2žyq ýøpàCæ‚J„ˆ¢ô›Î´(É|ÂßÀ:³‘cƒI,ö[ŒÝ…š„Шˆ9'šGtßð¦²R:9æyÄœ5C1Nˬ$È2ÖÝÌ¡BŸ%øÿ©)’ÖßΘíåÌ9O%é³dAX7S±¼çî5Ãòˆb™-s:¡Áw3[ é}?LýÎ`_îFy&EJx¶`Iï'Ìo–¹µ9ýS¨ñÀõy9@”àRøN²} à"ëøŽ Jya•v”Nuî¸$œ÷cnÉ&–™q7iÄñùV n‰hãd™×(˜:‹€46à¡d4%'®ÇÀ³l]?È–-GŽ×ÅÜb3¶ 3O}Ýy—˜@dl¤Bë!ÂVqßaï(%ŒÌèRQ|1°¨Âdƒã_“Í Ë…å£Þ’H"yç+h. Ù¨2±ó 8–pXéSb…ü9Ëk±9‡L±¶™MçÉO~jª#ï|—ó¹ìMovýùÃéŽÃÁü¹s­-2£ð‡ýÙƒéÚ«¿K즩?sÇïsÿ øO š€Ï|âƒìƒ¡Z_ý⧼ù¡¾§g’äឯ}åßÒ׿òyºögß1×½š.2Œ>å:ºo}Öz:~àjþ“®5“ãà<š_ÌŸ>ØK ?ù±°–c—™À¸‡šh=ïE¢)3ŽÄèßJIÌåÎ8c=ö 龘xÁ‹^MgÝâºý|8¼úï_@û`a-ÞþÆKèîõÚlMÙýø‹øOéß?qƒŠ¯~ùr:ëæøÜæMo½Ô0Ë3)²{þÑýèë_ýýðûÿE·½íÜqøŸÜööwæã;¶` mDÊF…wõ•ß£}ìƒô°‡Éû|éß¿–Þ÷ž·ÒK^ñZwýÅ?—ûiýº º÷½î™zN€Ðre„9–2½»à‚±æêàþÝlë‹JÇLš6Û¢Ìh†ðzŸÑiNfs ýŽpÕM£Ý{`}[0‰¡‘Åÿ÷)»wë[@¬=Pá"FbÇmªx IäÔ\2¬ñÊ)FyìeP¾ã·€’+0ñŸ»ü3ì?v×óOE–®¸â›Ü—Øà°’-<6Óÿøÿè[Ò &ááþ0úÎ~‹7‘Ø®ù{®ÿ}ók_ 7¿áÕôÁ}Ž¶l]Ùæbþä—èÁ¼:rˆ%ܽ ·lK× lÄ« A âÞµùƒæ£Cûáñ†P”¯AÇ‚¿L5#B¤@ë„[èrá@ ’…¾n“n"ÈÖê’i7̈[Ë çk |âD”“¾¹@&¯+­UXá8}|F4ÊÝ€…f?_I£ÑËq\#Ò`î¹Yó¤²×v;¦ßÕ™?¯®¼vfïÓí|¯ã½ÚžWG7aU/­SMªIè¦ñÀy‡©ÑÉx”^„(a™•Êƒ²~1X“VòWÉžë6·¹ÓLày»…;Îœð>Ù{jY€$hV´~=®æiÙk´ýzN5>§‹˜ï@#³G ”%5„îÐÄj‚AÖ2ðÒ †AVs] LJK´ï¨u>çsìÛ7Ñþ#K4ccÖõÞxÛí9´À–'¡Oð¤QT2€%†ÅatHƒÁüanÉÚ¼#iKâ~‡ wƒoÉ›þdÁæZfá…‰$3hÈÓV%-åøŽNâ¨ó—ÁS,aeÍõ7?s'=ù¢§¥:ðÏ “úºz=ɼ88RÃ_≾€êsûiíX‘ÞþŽw¥®¹÷}@{ø£Ø‰ù £ `ñ€ õ—ñ|n¢Y)sýƒï\ÑE çÞøŽË趆Gùw¼éó÷jnSHß7×>á¤}F7oÀÃpWú´:|ïÒëßô.úÇ7¾“AÎ/®¾’^kÀÁ—?ûašŽiÃx‘ÿ÷OÕñî·¾šÖÄü> Ý@¿î=0E @ ãÑO¸ˆ?qÚñg¸ }Úh<lÊ&0;;MiîóïOK2qÍÛ 8yÍ+^ÀHñmÿt ]ú¾·»ó÷4ژ͛¶ÑkL›QViÓÆ-t÷{Þ—.xðÃSõ½ì•otÚš1£Ø¾y„í1Æžòä'9-ÐŒ–èÝïÿ÷ÉÕ¦Oñ°ûÓ~ëK´v¢ÂæR¯ú‡×¤ê}â…íÐýD„ ÙÎ;è.w¼-çŸ)Б4ëì£Ôn48n=Lª áè|äщªþ«Å„KfžTZ<þÑäù¿ >ò€F/†!,×lJ(ã¤: ¤»-JfÃWíFD¹D·j3uÞ•Ãðö¢§<éIt¿ûÞˬ¯UºÿýîM—}àR:UsÒÏY-¢$¼,ô”¾‚þñÿqUfÏ}îséëßø&-Ö%‡ ´ØK ÐxÊ_=‚£öC!o5šÕ’Ù‚w#ôUnݾ3u\BåÊsdïÇš}æ¬öã#—ê 'ï[”‘tG",S͇7Á¢ÀI´ÏËMh8$ŸŠnÜÐxÀÌŠÁHEÀJc/…PZ Ø^cÏØ€9\ÝWÍÉj ÷œšOƒ—~Ùɉ*m\?ì~¯Z³Ô!ϻڟ“%fjtC’˜õ®%ê\zQV³‘­s¥ú²šž•LÓÂzò€\ :¹8ÀäÂY¼[Ô*ø`œlâAäéE¿­P·YS,@•¥•ú¿›ÆÏÚŸ8§ë®:®g£ƒR‹˜Ô›©ÈVO5ë³… ‰ DSX[ »k¾ÂQ]„426Rî꧊õØab´ÌÇaM¤Ë+LÜ·m$Øó#€’ŽX7¹sLò€pè]بF&q¾Þ& ‡.’ÌäQäEGjbU)‘³—Uç‘ñ!‘ab-Öd…c;\p ÒLÎ-R“' !±õôªŸýø¿è6gNºHœ¨½s3:l¢3¢ûÝý\)àíø„G=N˜t…Ëþå| š‚Gæ]ÁɃòHz»9ÿÆ·_æ´OxÔ¹v¨²PîyF³ ‘¯pý÷¿#!ÎÞn@þÖ®ßBÃÐ;²|·y™b3|ÑÅO¡š¿›ÝBں߃Cwj!3ÿ!Éß½Ï?Ûµ &¶}Ÿ5U¡æ,}ƨ}ÔÄ”ßᤑ»®ßÅ9OÀ,H3o^ vÏp }ásžB¯~ùóÄqÇŸ7íæ >ò2¿K ¹ä¦Œ©ý¯š"˜q ›I €5?7Ç×|Úµýƒ]`¬i íÂx1€³yƒœ‘…Iou«sY¥~ìð^î«v"Yw!9ÛàmÜ°Ç¥n8kÔõ}€3)c¦‰î"ƒ”Ë߯-Ù üÍE†L§„*K…8–,Ó=®íFjfhñØÿÔM‚ÚOé;@hg͹’šÞV¨aKS/(Ñq¿.÷ï*ÉÌü^)T-òsLÏwëÔ·¿õMþ»ä^É‘¿{á‹N؉uÃ,Ó¬ÚèRóØÏ“®>ö±å¿~éßþíßœ94,ÈuÐÄæÕà kÎUWþ˜ýâžùœ¿ë«^h+þò‰O¥7¾îU©ã²t‡‰ÝHó,í°Ö*m5k”j?|PÖœˆìÚDäÒ¯·“.£Ç«ÝpšÿéÐ!Q#|ðBÌ4Uo¨ñqôÙür‚¢vKL±ªeYÓ`ŽPWMÄ´B;NèÛ<ý‹ÂÁà tøèRß峋nÌyÞ1<—øuJÿA@¹¸­¸öõò¡ªÐÂbN†z @²€j% F^¹ì}VÒ¢èw쿧’I‡Tf>é Mþ Èš^Á4ét1ç’N¤`Š“)§:Ë;|E´Nj¢¥}ªáŽq<ìçÓa~‚|ÖŒ´‰áiÒæÃÔX‚Ô¬_fNÎÿ „ \/2¢Ã-š S|_;V¢fíرiÈš~FlÖ^7{ÎÁ#‹´Í혆éÌÙ üh‚ꊔ±0€I„)?T÷ME/$“h†7ü@4ÃŒ<狱m¨\iÕуcù Ku¬ç}âö8ö‰·B†!ÑBQ09íï}6z %éKi¡¨üÛ¶ö]`MYønr–Ÿ»fÃ6¶e}þ+_7›IË={vS\vL?h®1`Ž¥Ÿ½ë_éNw»?=àb¾uåϯ£½Ç8P8oþp:œ½özn{¹RÚiÁ,×ØÆVÿßÿý‘\Ki"6u-›ªÀC©íâæ{RBᢘ°s9þü=-û“ÉT–PTpÌ^õcRI×ć—Õçðí‘ëgÌ$›™>.ïÌ–èˆÚb÷—Àt¦-É(ùÝ“¿?l1(¼ i-ÐÏ®ü©Ý5´õz[6ï€Ù­:¿Âæ ±¯Ï¼ó_ýú:Öà…¾el `¸ÞŠr7Ž¼¥ƒ‚¢þi¥åf̦†­$¢ßwê&õ\©ì‰˜ T£%RpwG»åñ¬á Qž„ß“.m]‰VÒ$ì¶Z¹lm»v]Ï—}àßè|Dõèǘ¿þÁßþ]ô”'qÌH“ÇREëôÜʱéyñ‹_L«¡7¿ùÍÎ`=i&IjÞá ßÿž·Òã/|Zפ‰YzÂ…Ï ÷½ëmеÔ2úJ{ƒµÏ‘=½ J’Ñ~|â#—ñzÞ‚BÍnÙjb,{ÿc½âˆózŽü¸t°K†û†ì“ìçýÏh7—Øá¿íÌdá °}³i4HÐðsb3†ak:†àd€}EäØé¦pMÍÎã,à ×wù„¼ãQ %h‡¾\›ŠçšÞå1äYÂ1½@ÄJÔëºn€#Oci¸b¤Ã›&Y2¼{ït×úòö•ìZÆõT:¢kÄ&ý 5 hS±êd500± )kî•­¿ŸgÍ^s2)kŠ•%MHØí|Öd,ÔzÀ +ÔªŒ¨‡š{)ÁñD.з¼8ËšÒ‘jÁé ãã豜h„Éa³¦œªÓæ5bF…q¹yùA–ͺ4Då23§F¸R¤™Rƒ®Û7O7Ù>"ëµCkÇŒv¤½ÄQÝ&ƽÉÕZ£m…9ס£œЃðÓñ1¤é5#qý—ÚÏëä€Y%ۼͫ†q„#o™ÀaeËš­/1ó-ž˜†*‘ E¨,ñ €–ä•dÚ‰˜s †4 ‘Œæ9œn“‘XoÐ>Ãøï=Ú kÕéÚƒ5Ú}¤Îçϵ Àhўà ÚsDÊ}å«ßtòÐ?w÷ûQ»0B‰ù{Ü_yó¥÷¼ó­†>žŠ°õæ·½Û˜[²z>&HÒÂ@üä§>-êõÌш5>°¤™6Â%´>ÇŠ|Ê´ hûᙚ6¨pÊœ[LhïÀÑã‹mÚs¬I×näÙ4À¦Iû§štðxÓ\ÓäºfìFÖ–(7mí¼ ïR$ý L¯¤ýµ*Y”÷ïsÂx HþºDË’+Ï€‹ ’%Ù"gµ`òd@ÿµä *µ]’\n\[¥ 3€ñ<Ј=^§éÙ:;“«¦Žæã#F•?&äXø1>°è‡ó¸)˜û*ýU£?×(˜~Žù³tn*«‘ÌC{ ºŠ=<@»mrðÿXfYá–FðŸæ”ß+Z‘Ð5%,—yæ aÙ€Ëk¬Í|”Fúþhš¹(гö¦~Øš•Чg‚M,œ§}`âÉÒÙ·8‹žòä'²‰ÆLp-¾_ù“ŸÐÛßöVzÀýîM÷7šhùÂv†æB%›»&d"¡ùX c'ÊБ’ëÆÒ5jµ|X“¨D2÷K0Åz“Ÿž„¼®½»wu\£¦T£íÓÕ?ý Ÿƒ)ÖC.D>ñÑprY<ÿŸ=üÑô¡O~‘¾ù½«é›ß½Š>øñ/Ðãžø4Ú¼y+iïif´¢ö±ÔyHÿßðÚ è¼Ñ<ç¹Ï¥×½îu"Áüº´/Š(ÐEPÀ+ÌY3¥_ò’—Ðjè3ŸùŒû‰ý¸f½µë¿ÛôŽ¦/¿ó_ß4Ìÿ£©_zÂ…O§÷½û­œÿˆ[)ÿî‹M«J´uëN{³DœÎBY\÷Ì‹_Ä¿‘“铽̬÷ôÎ÷}ˆîxçóù¸ú¬m½ó>öø'>•ùûí÷.>®‰ÛÍ&5k窙3kÐr´‹bT¥,æSÐþc=à8)˜O”8áÜ fíÀÜ„pûð"”šd”Ì¡lI4$ÃFb Éeë…ÎNz¬•ys±—yhaBÐî#G]yfEsË ïYXî1Ý ¼èVvµÚŒnׯ¤¹Éë‡ìçJÄÚ¢˜&âšYÃÇ èx„bËáöX§ =ˆø³`îÇVÓÆeÍ_ýÏÓS2þ¯'C¡Ð o–Ïš!usÌõrüVÆ\™m­W#]i"¿G•H'*¡ý+…«Y!ECÖ+KèŸðÂæj$®Œ -Ù]ø5ñ  Ú®Z0›ü颯}ùrÞ m±vR³)ð†ðñ( ŠÊP¡TجN5³öTËr>[ƒF°‹ÜÝ‹1Z0k’ "§Gs´ÌZ ›OŒ ÐÞC\¡w1²‡Ë´iÝí98Oû,Ж fÆ Õ1Gâ@>‰¢0|<¡Ú‰3krr5+A÷›Ž]D‚cjºÃÙ¥[’ ŸÍ¶8´C¸Þ´ ê¤á¢Ç EŽþƒ½}±30äFð‡{#\i¸c®bâ#ö:œ÷lGiˆß¼åòw¸ VLHˆçfèê«~B_úÂå<бa#?ãg>~)]ùƒoÐyw¹;÷{¸ æGðùàÔöæІ±˜Ò"¼X;"ýä ¿ÀŒ“ù^-FÔ)Ÿõ Ï“¯|ˆy‚BªLb ˜|ÎÐM⇣ZNJQg?)·“nlæ|ðHº¸V%©6꥓b†eÇK eþÌntLy@lsXãMZ˜>€ uSfÒ7«»Z{%ÆvµReÄÐ6óJ-0Á'^×é"ô!|«ØÔ!ê.m<ÔM2ÚÍä Û;èW’™¹;kCp]1œ¹ãVÆiþB#.[6ÒÆ¥¥•ƒ W8aزÑÆ8˜NÞ¹’ÿÆn˜Hi²óص3X?S|RhnÚ)‘NT£¢uÕ+Ax^$ü¼›YóVkÖ¡±êÁx# ª,ÈÉ(H³7 5 oêÿÐh@[ñþ÷¼Å=³C6ö±Þôº ÿýk]ùÇ_ø úÊ?ã|<@0µúÊ/§mæúç€QpßÞ=ô¢—¿ÚÐ#ÿüþ´Ï¼—o~÷jöåã%Ÿüû›9n y8lÂç£ÄÔìg$fÉ¡ á‡h=$™ŽT@“Q.Jt+´dÝjDèGÉš_Í›s`X%J±c;ö1¬×ç²²IÖJó'{^£[å  çkVà§õ­™äýå°a(²L-¯Ç–ë"¼ÁžÝNòA7AF7ðÀ$³¢¯Ác °ˆÊÌòžM @°b#}.·b°²¯ëÕÚ6ù“¤ z­îÊŒš5ã¢X,Ø$ 1…~—îÛ–GBô:S æê·¯øþª#<õ¢,s«IÁ(ã>aò?h”¹Çñ¬ù€@Cž´¾&*ɇ™Sm fI`úÃ{iŽnæ÷ sr n$øëE¸&¼îÐPöi/S,ôÚ«@A?ðÁ¨+¯-èÃ0é SÀÓúÂc§ƒ lAÒiŒ;ðÉX‡ åØ­q0Å‚5Ñæ5{EBŒÆcïÑmÛ0 )2Ìß&sþúƒË¼Js`ÊHŽ]¥‡hë¦QÉefά_3Àé ~½{–ny“ ž_  kéør 8‰n±s4)Ùì®2Yå;7C7Æ@­ïålò 6Ù`$¾‹6048†ïÅ8òšJ³ø‹ ¯q4u³²ÉáqÕ<£¥î“¸£Ìg¶Â^`„RǼC¾gBR’¡€¤Nf­Êkq< ÛjǸÏ-@’xÒ DÒmÁ˜‚ÚîðTÝÙ+g7üÍ1K'ÆÜæ_q5R•Ík~ùÄëÀ«´ ! Â{IÊŸqÆyÍçrFY‘G>YÍÚ‹vg mCÕ7&[ý Y †~ìI,ÛMZ6̦®u­ªN”>ùÑÐËž‘%j™Ék hddž\T^o üŸñùt y…ÉÖ&3ÇtAÄÚut¦N›ÖZL绑ëÃ|Þh먛?X¯¾fÊ aŽë”„¯ù/®=Îs):÷F£‰Û8â´#c(Q)£|ç캄š ‘@@±YLçfk|•šExûÕˆ5"u—( ð•Hà Ý’N‰­RŒb!rŒßµFšñd©Ç`ûØf.^®%,ñ-Åb÷Ž!îc‘ “,¯ƒïº¸g.èU!y Ü@€¸jþ£³ y,}^K;ˈDR›‘Þ ä’Èo¢Ý¾OPì“x”¤ÊvT`¥Cˆí ’Ì&m Ù:z¼Ö‘0O…×ïá¹ìù¥SQljRÕ¨5µ&÷ÎïBbó¼w Ôo?­V‚›_F Ê H{ü¹ð÷Ší¡ô˜EŸ€83P{þó_ø ·»u­çþ÷½ûx„À€­Aªqz.| ’µlt¬Ê‹~ͼw8àæ=Gª¢(…~zÕÏWm ¾·»Ýíhb¸˜²iwÚ,]ë´'‚Eí]ÿòQº÷ý. ÕЭÎÜä£X¥–H‡#ôÁdëægŸÃÇ÷ïÙÍ®¾÷+¸ Îó;Wñ÷O~ì2zþ³/¢;žw>}à#>Qìw XyäCïÇíøxÑË}¾¡O˜º.~擘¬µr0#e7Êœ¤. rfz9˜Q ”€6…Pû+¾Ãi‚3öCYnò9ŸÕz„Çû+y¦OÙµx¤Š}TúuAX…®à&«‘É+Ç¡þÓ¦¸%‘œD- 5’œ†Ù/êy6Z¦VTÿV0‚ ìÒ r{k«-CÁÇÀ'°Íñkx 1[\j¸$l½„4ú|ˆþ¸´,Ñå`¥ñÕ¯~•NHdCĪ9cœ;QK¨È# 9 Â=P.ï^YÆ\G·kN­ô ! é§¯4O HÚ»ïvÏSA~à½éÇ?øOˆÝP†2€Ãç–<‡†dª6R­.ëÈÕ14X¤±Á’«9D°m\7dD<þ~ý k88Ù4É|›[¨Ó/®›¦m›†SåçÍþuäØ"Ym®óÌJ2 Ÿ‡‰ÔhI6â!#ME\sÌ—%ŽJÔb;VHm|(<‰ÂRƒÈ3 [Xl%«Û$‡æ!$‘¶gPCðÁ uKT¥å¢Íª^°*mv†OÜŽ0\^y‘ÌÒJk8š’X©»°Ä~×0‰^ú¬Ï)êå¶  G|1g#6?›_nR«‡@š%^œ´*võ/.{ÍKb‚ò]|.sŸ,")–-Ç -dsÃ3•Š’Эƒ¡ ¢:'oAµðDZ$Q¯ŠÂB 9çÄبÔBâb‘–—ê†ÙjÐØØ€AëEǦ뜇«H’ÜÍ)Q]-PèÆìö£m9™úû%Ì‹ÓiVµilÛ"Ëð†cþ© ƶ¯dS)Xl„‹J ZS¾4”e’;;E7q LüÇÍŠ:¥°™ßîgâXäz8Û#ŽUñòÒðíçÅÝŒ¸)€$ðOÚ´¶JkF[´ÿè’·ùÎã+m¤ye²Ô |ôsýJ^ÄqõFkU×7VYþTP^?J¤¥8u®[ßàüwNp>—ë÷ä0å+úiÓ†aÉÀ½®gp„¸DLb²mæÌ/%݆ýJ¤¬âöíÛ{–S't˜|!4áÌ̲Ѥ4ý “77ÇGF+°çñ{h¨Dss5ûL¶Mä¥Æ©©úÜsÏ¡ÕÒ¯~þS#ùŠí³JPÈ8–8˜ã–Û³G\ÈôUÐ-oy+ú]J.W{WþuLmä%v)ór=äaâcŸüøiÿ¾½ìØ;’ Õk@GÒE…€:š‰¯7EN ¥>ý~¥~:I"iO%ìßÙ=VŸ€`…Ñ#/x‚Ï\)¥Ê“¯jä¶ÇˆºRhúšÝñ|ˆLˆbáy}®¶šØ%öý»wÜ›ò×ÿt bíò@9Ÿ’t­6Úb'Ñ‘›Ú@·Ä…¢Ør9¼r’|d€‘8"#[aCÒnpùv»ûÚ•Õòt#œƒ¯Ð•WJ]Û‹òÊ .¹ä•§-7Äï"õŠ–u­ž^ñŠWˆRÀÌŸÃFx»eMÙiöF%ûùˆM Š• dÖ“ñA¿¶›csF“7fö]6LTiß‘%6ªjY̶‡m“Ñ€ür×4ÝâÆ“°Êßn„”sˆ~u`Žn²cÜ ÆGFÿè\K´ Ù¬µq(0hìòæ´fàØ‘<‘‚BÂ,7lR&{ÄJ`ˆÃõÆv“D=@>£Þ—m'¹V¸DŠ¤>&N+’]³Â)˪ÐDžŸ(S*¬æᆛ)?‘nTà춱Ý4ÁT¬›ê›}K¯­‡eZ b¢Äú¥D”vF‹‚µXÙ"û¥°OBÓ¤ #Ügâu=šx©’‚A„Ìuæl‘öe°†YøÛWšúíðO“¤ÞfjÌ>B ñ&Ñ" ¯ò@Ññ5Z˜^$ÀY 7“ Çí@0›Cýšõ{üd5!eÁÇ©¬ûTQ¸ù*!“òÔñ%:>³ìÊ„nÖzýœÑ–„™ç»i:òú`Ì0âCP›sãæûÑ©¥žïu›Ç¨Ã}+"'½,óŸ$LšÔI))r ¼˜ÿÆzH±:wfæ8—†ß ´¸ßá#ó¾rꆀ¤ÿ°¤¶ÍÔœA1]›²š#5ùð…E²Z:|`·½ÜÎe/uÄ !󘸵$:·ºùÙçúµ#l:âÈkEt]ÓÏ¿~¶×~¼õM¯qQ…ºSçØ»îú]–=¨¨ rZ#’¤—â¼eÙ×_FØnÆñ ŽËVca„UpL'ïSƒg‡à c·Í~%Òã‰ù>oM²eK$’›C¤µþ•Äª a087SäçØ’‘¸¬VÒþ¶ëW–ŽF½ú/êøêU`ðÝŸ©‡¦´[øýU›ÒN§w§j¡Í Ä´ÚÍþ·‰óšÙ „ùåÎä„yë—PÛçûæ¬;YÁS øæ¬UÝ„]i‚„Ëû³Æ¾ê´n…»?ýÉ÷éK_üÝç¾ ÿë°¿‰`ötÆg¤ü'n þ~+_ýÚ7ÜoXöžiІñ’ãÆ<1’bÀ•b‰& ^¾d…^,ë0ÌÕñ¹&MŽŠ)xØuã:xxÑŒa—×oá `"|äØm\7Ìe1μÑMM×hf®NcU{ÜŒ{Ö´—Ó&:ƒFUÒ& á¸PS»gY  %¨–ÂÉ,¯*E Ñ+@†spXÕ„¥>P}—5Ö¸•¤å.nIÀˆ§ãmhlDKßMÕfH$ŽJb37B›¼3&„n÷ÁØáàùÐñxFNÂaM Fò‚°Ä«é_“À^´cS ™ø8µ!);ã¶õÄ38ryäú7ìëΛP¦\z1´=šº>+ÍIT •¤|Ê0+‰‹ó^gÈÔ%ö@£ç Z¯ÕŒô¸híbªÂD?+©9–aöjÛähEÀÑÉígC9àªÑ8ýNã«¥¬P©‚{³Ýû#«9td‘ú¡¼÷7¿PçûXK¦“¯^×%v½ÂÄæc€òÇqP4 øq+€eû ›"Bꪠa~~™ß/’4Q8ÝRÌ­à°  Œ›„exÀnc¡ÇWKÎŒJÁ¯,…̹„¿]-!¤n 4XI™®£Q@À(X)ÍǶmÐ~<’~ê2ÚÝ´ º>uÎ#ÒÁ<Û§0}·°$6ø/%Îr^ bIµá{ 4@A·„˾/j\óßâbMù]1ÓÝùç*¢ÎÜBf¯™°jÚ6c;þuA³Ý¶’}Ù£[m‰M¤-Q´™¶l¦ƒFrFÀÒçÎgÐWGá|?õ…„îFŸ±Ù“HIÄ ÓÏÊr²`!<®”mckJÒñÉZ)Ç‚ýŒ£Àq]LÆ V"\ˆ³¥^©aì[ÍÄ9­?ñ¿¢+®øî)MLø»HpøÎKRxøX©ó?(œÇf, ­‡˜æCp ¾ºKI¼à¤ž”ckAa|‰ýA–j1çb!yôèp ¤ÙïÃN¥ëéú}s4)k7Ö6¥Ì7¤‚>¾wP6o6EéÁžÞ¯@Ðl™‡N`–Wô6µºèÃÉ¡ˆfây% J½Jq[üdl›qºý]6 ¥^íjý;V ¤ÂòØD§ÍÂÓÍ:¤žn.:¾‡(”¦)D õ-ÉFÄbÞ'³¶ÍÍ£'>ñ¯è+_ùú¿Nýä¹V¦‡<ä! Bò|²ö«Ó6V¸@ÞźááËžSƒŸõ¡ém][!Õþ®5š“=‡—éŒ-Ã.ïòBí5ZÙù‡&«Àغa˜Ý:lNå(ÃC%6÷Ü¿šª;&x-‚©ç k; Î'Ð,LÏ7ØOAçì_vI¿ ùWÇðJA®KíàLá$ôÌ'ÒkI$A_⼎†ã­Ä„cÁÚlõÇàðÞ †ÙjƒÌqÐnhk,àw"ÑH¢LKýwü!õ|B¡¦#!Ê[d 9ñ/±¾%8³µ¤9 Îr]%Vr¹ú¢€ÔUE)!ÔíE š$r‡HÐ8o)v}ÁÒ” °¤Q…HMìä·3Éb¸gŸÕuuØ«£4ëÓÙ-”bbr wiÛìšÎ6‘²ðf1–ƒyl¤J£CMðÀZKÜ&µ’F¤RhMŠ7Á)Å-—`°Û5'C½êh¯”O¥ö¥ßzò´?ãcZXl8§ÉP›–½îDÚÜ­|»‡óºæh­ù‘rÞ$+̧.[žÿWÃ#ÿ;åÅ&ÍëíD¸{÷n·VàJ8žsιôÀ d@8†‡’M8EïÚ½‹Ãe^ù“Ó·¿õ-Έ>ezõ)ÃY¬ZKßÁw|t|lÅvæ‘×€8.;5‡ƒmÍ @lí; ¡{6wejÓôæ¹ò¡ç5„,æúPÕ~|˜CñbÑ«®úÉ8¯ú‚ ‘á\ {K›nžqP/f L;k'—š"´(JÖ`¬=Ýÿ,9íša0L¤Ç5I²Eô†æP`vìÆ7ï%ðqH¬S´0âЦ [àÅõQ,£–¦šãÇù\¹$m‚jv¥ç3±õ¡JƒqJý¼‰,˜ñc@‚Mdù©/œÇYð¶&}Nfü«V ›T%ûÙ}1Câ;©Mˆ3ŒYøìÐÁ~…$  ¿jœ£,±áv­ ŸmÝÏE›áîÑe?"Ê_÷ð®¾÷Ýÿ¤¿}ÁÅtÉ«_G7Ð Ô‹‹‚”pL¥ÇzDÇZ´ã)ÖŒ9† # ì¡Ó{Ìš]EV¿~¼L‡Ž-Óæõƒn^n˜¤_†àä^à928hø÷¹:D~#nÏX¿nØð°Ó´ÿà<íØ6FE,0Èrˆ…¥ C15Û”ÍÎ6‡¨Ý¤µÃP¿ˆ–£“¹H‚uÃ3¹do,~&fgõ³d|m¶=:Âä†4¾Z-ð<¹výzÍë_ÔÑÁÈ@~饗¦Žá†8Z‹aH›"•íp\{8?=¥ý¸„þ{ïwYUÝ ¯sî½O¯S™PAiÆ(F¥Ø5 ÆšDAŨQ,t *j"-FÔPcÒÔˆKÔXi"R¦>½Þr¾ý_eï}ν÷)#æ}ß› ÏÜ{OÙgŸ]Ö^ÿU³šTÀ6êðŸÎû ñþÈð-o?# ÅÉ¿.»ì2Ÿxq±Â’lGèÅ«Ê`‚¢ ç÷(iÐ Â-×ù•Dš“ ™°ˆU0óm„:ýgÊгð*åä§Ö7Ø‘*â?®~?Äõv&’7 ëÚf€õ–ëP•lê[“yó!T5é„1³ŽûK¥üšI}ÎÝŒß=63ÆgEûŠÓž%æìŠÓ¥&¿Õ~Ün–NÓþ´ý,i¥ÂÌŒµ7uöc5Ó4ÝY¨ Nê ÑDáúšú«˜pÈ@FÜK¡c ÑÊVô@Ëüõ/ºð|æ%N9õ úßò¿¥U9ûï§ Îÿdî˜Í'NžŠq"¬† Â\)’D„ãpCèS-àä)êrß“L”H¿12>O+œw#á†5½Ž^¸=wEÅï?°u'•Ý3×­>­ìh߆µý„fÄñ啃1ñi ~vˆ¾NaÚ;#ÇtshŽÁE;f\ü2êÌŒÏÌ“ª6I †„³+itGHòáðÞÝ×ÉQ]ðr`þÔI<òÈ&ÛGlè@Zþì°'Ðë^"¯Ò_þôtÍ—¯ =%‡ðJô¬gEë÷ QjÁ‘Nî¸íæf GTì8çIM|MàŠç±«‹{81”•“N:‰Î8㌦k|Z9è€MRRr™¨CiNÀRL×ÓØ~{‹"Ö Ìè³m†”ùÍ„Üìª=@¡b;;FX·æ£1 ¿Â¹œIV«)`-Ö ¹Á)9ž™ÈȆš1Áù®˜ º…Л²céèt£uÒ>*ôZ¤%l4´‰Öbõ?’õM&ZvfEÕnT´kw³D†šê]î;ÛÿûûœÆ «Ìf[­Jl’ÅS*ËZÓƒ,‚öŽDž– ",Ë‘GE':1ø†[|å±ÇñŸ‘°–Ä—Lÿ±†e—J´hÛ•‰–fTñÊæ%¹S QNë°ÔMMâ;¸0÷Œ*×\w‚ˆ Ž¶¿è%Ë× ò;¿£ À$ÖÆYÒg?}uõ Ð;NæíÌ3Ïä?+çŸ>GŒÙÝ‚üDœ£hF¤ò*Þ€i®¶ŸýÔ|ÇÀ›v£™,§Iðà« 5Í‘w1s€ 1!Ò1HÅD¨\±$a!`´èö^ÖI½.LvC%÷ ïÄ'e±5Ú®iJ¢j ãðó¥R¡î"Òh#ÂùDLÈ’ÕdúŽËÕÂÆ×-$X*š-µÎ¥\ÇŒm9ÍWœÿð¹bÿª .úúßò¿Å „E§¼ûn¸T|4°®‰˜V`­uuˆù(Søu;¡, î³6˜bp@ãÑÕ©y´\Y=P¦‡vÍÓúÕ]êCé´ Ãôû‡fœ ·ÂB¬ñ¡þ™œ§£3´zy@œ°ÄÉÊ7í9Hwܽ‹†z8ŸžÓïꞧûž d¿=Xü _η!Îð9©JK '‰:´ ‡“#¤—8€‡û,î¸wMB²ANJØ)jlhEê®Æí;grÏÇwxfþÆÜ@o{óßÑèöQϼÿÇneP‚,·Ï9üq¹=ò'·<Èá×¾|%qòüqÐs @˜eÔ4£;¦­L¾€ÌÐÙªZg ~õ«£O}êÓþ÷©o£{î´×^és_ø&o˜(÷òç1²Žôfêr`DÎÁÌÍ6!jŸÌO†ã”SžÐã=!Ì"v±D+¦=;ò£üˆ¨K"ªç“Öç‹-%¢–F|± ´šxV›‘&0LómL(Y£6 !”3v°B ¿®rƒM° aÑ«k~ì2˜âÝa¢¡eûŸ¯Ûj-ž³²Ð»·Ú ªçR¤¶$ÏHHHl‹qžP‹>1݇jCbƒ£û—é˜c–—pï‘(Øl.¼àü&°Ñj•A“òõoÞ@Ë-ûîѯ{)ë? ¦-ßÿÙm´§Ò奖ó?q®Óbœ+5'&(Iý“ls2ÁŇ>rýÕ‹ÿ†=ëˆCÙl Âcä,Ü.´ £“uf!¬)ò@š Sü-¦ùØ])|‚¦ 0WÈÐG EêÂæ^×üY+›©I–® û—˜‰Á‚Á a¢jÏÁ<÷NЭ{ ÇÄtHˆO£–ÃÇŸkÿ†¥”…ÀM|nwAÐBõ¡´¢i­À…ýF×! xÙê#Cƒ¬X ŽŠˆX©};`þÍQIÇËòvIÂ6Uüü—¯wëk#ýoù» ÐÉßþõKè–[n-‰iÅ·[&4yˆB zCùß7¿ö^ÓéëÂZ†)VȈž0ŸÞ~ÍŠN/Ô™ÏJ´¢¯âièÁí÷ŒÒcö]A=X0ºtïpŒFØ9äÀµj…$„çæÛ¶RA™á¬Ø‰¸d‘d9Ñü®Ñ]Ü“ÌÀ—aÊ5p¾nq÷3ý_4+üP•¬‹¹Œ&Ðë’ps-£ó9Æ¿”J^Jc‚µöÔ#ùøŸ<áÉLл;„M>ìÏŽðà ~ÿ KߊŒêׯ¿–¦«’Ý’ž´³Ÿž{Ì1|6×؈îsƒŽ¼ÇôâÔBûx0›öàº_ýìF¶ÏìPv¼çYgõè培®ùÊLÀ íÀïSÞóai§# ?ÿéÒÆLâÏö”Ãù@ÔÏ~r#FU“q$§?ÐiQX íýÚÕ׸± ¿<ú##côõë®eÓ­Õ+‡é…/x!‡õ›p×~÷[×±©Q·j´$nþ&÷Ì#øü·ÿãZv}Ö_ÃãdÇPúÝñçÃ÷ _¿ó×åæˆ|Èç“žr¤«w/wÝ8ÛƒjGïsx(“ÕÏcˆþøÉéî5ë}Ü!ì4 ÇT®ÏõMÁôööÑŸý^=¸Ù»ÊÆÃp‰–E‚Á¼éîÿ€È #î7;}"|sÊáÛ¹b,•Ùfù| "˺µ½´eë”·ON"æqͪÚ¶cÚßÓN2oÖí®k¥iU’>>Rà£X¾JXñ¼yIæÿº˜D÷…£N@2¸{Ú…?´œûáóx½žsöûs ;‡Ò39¶Ü„¹ÒJj@Iøðœ±ÎŸ4ýÃǤ íHƒ~’ˆ=ZëÇzGAä+Ðóý•0л¦Ft¦Vø[NYîü‹µ€ÐœWk¢‰«”u¿cÀNÌ©'“=™†'Qána˜í!‰Xp¿«¯F¹#z¾®IijÄû³?""+As\’d´èß’ ñ‡‰×u€ÏŠjR`KåÃ1S€þCç›.)PÉ”Bvp‹¢fQ(Í7„ý%4©"¯ç×æ²ì‹šØ¥š@v›îM8OŒ¼4ʉfÁ"’$8°›)tèÛ8¢Z¸¯àJä%ÖÁ\­×4ÒÑwþŽŽzÚ“éøן@§ž~&ýoù³|ò“Ÿ¤s?ô~æ×@O å€¶Ã’Öbî̪ïZM…,Ilö%NsQçäƒ(œJÂÝÞB Xç€cD.;ðìøÕUži—+†:y¡"æõýt×=#tЫ`OhÛÞ{Ñøä6zà¡qÚgãÇšEÔEÀÃÔœ¨i!1ž¯‹ô¯Û- tÜ2=#ˆÊâ1E]`òCZw[ü õõ”|¦DøjŒM¡>R³/Ét^ Éwéûß¾Þ¾¾ê¦É]cüû‰Žy-–'?ýh6U€é×âÍ~ô£9iPÊÉß÷Ó‰'ÔtïÙgŸÍ¢F—¼t0õþÒSž–’mýÝ_ÿ%mqŸx·g:æ=C_ûÒ•IXbD’¹÷q ÌE—|žžTxl”hLÍ0Ž÷êW9¦ã£)ÆÊ^ûžM'œxRÎÔëŽ[o¦¯:MÏIo;Õ½÷P®­/~îS@¼ð¥¯¤ÓÞûáÜùË8zÑË^ÙtÏW¿x%½úøšëzÎS$£°–(ºÀ½Ç†‚Äó‚ˆ.üĹÝ'½ítzÑËÃ3Îyï»°y>ƒ «÷YOyÕkO¤7¿ý´ÜsQ Qúê—Äüužèê|õñ'R~\ÅÑîs³llî ™$ãd˜g=¬ò025›±oRœG¡¸a-$E‹ËîJì‹÷uu•ÛdàÞ½ûlÕë²1Ö ¡+Q>ÚøÚ…€B;“¬…@J±ž…Ì :¶Ü'.L(ßO>d63Z‰×ˆàÀW^N‡q$ýŸ(§&Âø†PFy¡oðîß^5š¢œ™Ùf`BI(ÖR,ÿ™IàäB=Iê5OIÖÞùŸ8‡þõ3±0ÌÀ Æ8||ƒF¦‹vX¨-$ðEi1þÐ6ìU«$Œj¦}hþ33Q~DB¼öötpð‡†O© ªn4Ø«KÖÿ©øq¬£³Ø1³ª+(©±T´!fY-úËlÏp'yæ[~³§‡ä´H#ðXÉ÷0”ñ%žo-N×›,ä[Ã|6(ÜJM··:+ ÌÀž¿2 óÓ“|  aŸMÃ8á_…E$‰üTŠ4²Ð(S·{Á2¤/Yú:´Ïªí¹¢D«Jš Pmtµc¨ãòŒ??Z’ Îdô'O­A;úOsRýq ?ê(aþëÇ7ÒèÈ.‡öªôž÷ŸëÁ˜üÃ;Œn¾ùfþ ßw½ý-´a8¥µ®=}Ô&ºäÒ/0øxÈ1¶/}ÞSéÜ÷½›¯³ýïßø±ø˜¸þ;¬"n»õ&î·‰Y‘ÂÝýÀ.NG¿ÇÊ^ºìò«hbŽè_?ÿM>^÷º×q[ð.0øô§?MóÒº¶”¨T£ÉˆáGyó›ßLßsàŒµZNzÛiôo壭Ðbj1Ɔ"./zÙ±¬Ù(Þæ¾U]/zùq^â¹a¯MtÙ¿ÁÇqݳŸz ”“ˆxõñ'ñµœ$6'¾ýtÉêÝÓÕu’;~Ú{?Â×¢Ï_ýòç‰F˧D%„\ò>L^ä–Ô³‘>wÕõn²¨IìªÓ$8]ÚšÔÓÔíæôÊþ”öZ¹Xæ€ ½ ˆqý`wÚÄÏí.s²t¸pv|´k›1ûØø¶là­ÚÖ ,¦ ÉÙGà">ת‹iFŠíÏ-õÞÅŠhsÅSêô”[/(|u×\ŸŒݶN¨ÇÍêúk¯ákøƒÐ?ø>'(|$ @ȉ'½E6:Â"M&zçDÿv| ü¡&ƒ‹\ÝíW5÷[sê’z½ÎxþSpFL°€-õoɈbÿ9KÔÈš0¹Õª£!U÷é¾;-LÝó Æ&^ð“êíípš¼.'ÉìæèqkW÷Òª•Ý4<ÔÅÑîüÎÐ&UXA[§]›†&&ç9Á’ŽŽÍq‚Ðíîo«blÝ1Å¿ñ‡s»FgiÄýOÎѸ»‰I‘ßÇþf\̸zñÇNþóu>V÷´*QF*žaà5:+e~§ŽŽ2›¼ñïŽèÏ•¢cò½TRÓ[ KÆ´7ÈoV'1Gi0)qÔ+„'F['Ñ~ü¹~Ÿuý0çúaŽƒtìØ5Í‚œíîoËÖIÚ²mÒýžâ?ôÇØøœ«cžæGXmüqļ­Õ”.k5­6ß½ñõÇÓA}4;ªß¿I@ÿ·üß_ ”Fn•+WÒ³Ÿý,šqZ…ýÚ°¦‡úºeŽN9¡ÅN§•€ûðQ†°cf.càlîJ:ȨÇΉjÎêQõÀ·ïŽÒ™8žßñÏÞÚÁÛ¸¶‡6o™’{¡më×ôÒÎQ„æ÷ÇQoÏ t÷=»x^Û4.OÌ"Ëwíãä¤PÛÀ¤(Ñ àØ‚°§P¯ÎÌjltS±fDQ(H8„ŸCUsŽøá¸/Ub<¨{¨fÆ'£.Ž¥f“-æQ0¿9àqâÄý¸?9œîÝþOlÃû”§ À8ï¼óøûÓŸ~â÷¼ýÕ øØܦbÿ§IãnåŸÿéÖt\÷ïWúd]ï<åtºáÚ+YÂÂ?œê¥ú?û¯Ðí®hË_9mÚíʱ¯9‘Î>ë]´ÿãò!ïÙžgî€2»;EÝ "ó§ @D,”Û~s3}纫X³tÍW®d ÊÏýýùS¯c€Á8ÿÓŸ÷õÁäöÛnâöÝðãÛüñsÞ÷.Ö¾ m?ý̓þøº {Ó|Ãib®¾–îeW~ÑŸ{ù‹žK¿½ýZ±bˆ~þ›üñË>{¡Ó`œÃŒÁ ?ºÕk“ú=5„æÀŅÿø!NöÝ®÷ïpœû¼ìsÑ›_ÿ·ôï_ÿ±ë7yçÿþ¯éÔ“ßD?½EÌ(6Àt@Y9íobÄ?×}b~½ð¥¯ðš˜\]ý•«xîÜqÛ-\?@Èþ=ØÙäç•23lG›x…‡$êæ~o—¼̲`R ¤-`|.TÒü±L¸â{‹ +/j(Š î)Þc×Ç¿[i;Šm(ž[Èìj±zŠmXª–¦hc^¼¦¦á5Ëi’úûûMò,•°S8h"V!dîulÜ|ËÍxÜÌŒ±¿–blF÷ÞDG:í L(þ3©S¹ÒiJÇ8çH4±[I˜—Yâ¹”“iâ5-ì4íç@Hž·;O†@Â$éñ|M<÷%Îå,5ÉÏÄL9'©uàc¼îsýŸ*ËÓ¦Iæ5';Ñ~OdÎtìÜ^Sp—©9“ö‰ï'Ê2„th‚aR-0¾‚–|$ '½ãzjÂûÙüª,Z§ÎJ¤øŠ>ë „„_ ûä¤ùh?¬¶¦SÅ‚v ;¡öb¶»·Uÿ¶šÃź¢¹ hˆvܹ­Ð¾”öÝ{˜îúýNÿœVÚ¸]’Æ@4Zþœ]K‘Ö½ T‘:¨ÐöL<ÞýΓùïCqšÙ£˜¾ °hÍÆÿŸ'2üÿSf‚hóQ»úê«ù|u! X3ÔéÈ{ƒA4üz!€‰”%-6áçŽÑ&pGâýk¢F«È`¾p‚Ó”#WÙ1˜²OÏJÂŒ-ˆVô•ÀašÖ:ÁºEëÛgÏAºóîô„ƒ÷`w ´hýÚ~6%ܺuœ6¬âv”·ŽÕ%,WÔXBž²F×è•8À $xѺeŃzr>§” R†M›dD^~fÂIZÑjʇCð‘D"fIÓ]ªÎÙ)º:%ñß7¿ùu@Ž8BÏC=”?–÷Úk¯õ߇´=àZ˜`¡üèÆ9Lïñ¯ jJHë‡zäùwÝ~³?&÷™Ïy>]ý¥+Ð8ÖG„Ä߇ÍøM7@ôW/=–NxËÉmÔ@lú»S&ä%ej0ñïÿî8ÍÔä«´Pî¼-´à~`¬' $Ç{ïˇæ›nÐý;jTVæÇ—Dƹßi™ÒúdîTmn‚m§'Ç ­"911Vˆj#ÇÁì @ùím·41º`Ṙķbܽ÷8½äèÃY ôÝ®ó ÂÊÏúC~&žßžï*{ÑKø î¿… ŸÈ™…É"m9@HIM²6Jù|a³]7LJºEæ&Ì—øåàþPõº%À†;Wmf*K5õXìºV¢¨…(^[¼f¡Ís!F>þݪ]Ky¯Ý5­ZJ¿´ûÝ0AÀ ¢])%´d œÂ/ºèB§ñ¸·ùy@î°Áf'Ѻâ¾ËÙ„âÄßJç~d÷büƒÁ8Áit?ä€PbraãLþ5HRPÙ{ÆVì×y-•Tí.ÞÂ>‰€oÍi™„¨µdn¦%݃³äb%$v•Ägì'2b£/ú’¾?ª#2#î1¿ÁK/½´í³–;ñÁÁBjâ\AHgGb¶ÒÞÌ(‘2Š£²7T†#I“<] "Ü}9­ÐðŠ^›qŪ†ºX4pXyõñ,©Ö ‰’ñÝòI•Ô—e±7Ì´-fNÔеÕP Ï>hYkgvNÞ¹sjA!ÈBà"¦-­„+K-¬¹NÒ¶/>búz" ™­-mÄôÉê¡ W°åÍ?ä^ï?¢Låïîþímtùg/öæs¡oš¸¾½cÓ²¦Ô¤ƒd6¥YÜ."j²ëi®¾™ E×yRU(P¸YvùŠæuI¢ë¥ ›Îb8ji&íE@—'YÞ52koq¯²y àÈèÌ‚{ >*P"eAIÇÇ9ªb]œ»Ù—Y €€Úª–46×Iô‘‘)M¶FäËꋵvEW´d4 Mál>ÉöBÖÅÂãjýá>沂*yJ.áìÙbIM±'dÛhUBŽ«FtÉ·O;í˼w áz×®ì¢{ï¥Gí»Ò?síš~ºã®mLƒÖíÑ/y@,BQBrM¢>!B*ƒ;ÉFW­ŠÍ4ü©002CŽ •9OHÃ_ÛÕ×KU§j¤LTœ“³ê>™¨·»Ìödh:úÿñ]ú‡·K¼wlϾDŸù6 Fó‡8úè£éÎ[oaÉ=˜Ò»ó#f ÷i·?ÿƒ¸¬Y·íýèƒsÇnºý^`ƒ&'WHí°!ÅeŸ Ã47=Þ”9^w`PÌÄ©q|ôc¡_üêf—‰ù„¶M ³jþ8üV6¬ªP9Í×Sb€˜ê.j ~ÓqþV8.Œø†›rÇß}Ö‡ùÒõBtô¿Ø#gT%óñßÞñþÃ'E÷Á´crj‚^rÌ‘tØ“gÍ Ž\Xy’;~éç¯c-ŒN”->À*sÉPϽZª¡§=8ÑâigB1nQx¬×°MnÆùp¾{;ÅÄ%|r8K2.z¦Î–&1Ì¢a«©I7ûª&Âã|­ÑÌ,Ç¥óÿnŠÀ¤BŠw»ºÐ+ý)Í„\*0ë@˜XÔÉX¾@µ˜D±U»*­€Të¾ ‰ ‹k‰ï‹>qíý÷Ýã™<;?#Úã;™¹ðÂOÒ7~£UíNÒ@h_.¼àÇLŽFïD´ÛH j·©ÛQ,¡]<×­˜ó4¼Pt§Ež(õ¤6/ƒº™‰¤ÎëëöÎɦÀKÛ°7mÚD—\r GÅ*8wž|òÉþ7®ùÌg>Óõg?ûÙ¼ÿ´ÿ‹•vLk£F8鯣ßQÒßÇtªîï5¦4(~eìÅïÃL°ªIÃ1F5'0©1½±0D9ALÐlÓ°™ZÁ ´øFKJ*¬´¨MfîZ*çösì´} +<(ô·Õäœ>ÿF=Êeš ÎüŸ&Ì}ˆ»¶­\ˆv,(ǘ~¢o8ÒžDœp²”¤Hò4WSøTÑfªaOm,Sê¿ž.qY?ƒlŽìÌ´S‰äÆæt.eÍû=!YßIR¿,ЂV8Ç7ÕP‡|Kõ½Jê3„.JS <©ÖßÐöÖj²~M@䘖²öz–­v*âÅ€¤§ÃŒi™W$ûk¦Ý>:6ëû*¼³XC@ëÀ ɺû»izj–µ‡ÓÕŒùWh ¹¹•ùùÀ” ¥|[ÍÂÇ—h½r伎”ùµ’j„ñää€)ÕÌœ¬Ù%— ,•†ºøŸq•v§Uñ##b3ô­£ó´nU™8je…vŒÎ¹cÝ$ôÉ»iËŽiÚ¸¾ŸiÊîüN§¹›rÂã.¦åR+F@d¬áánÆKqwˆö’ð^dA-1O÷jµÊI6eHôû»D]œê„ Ý©õ(O7íTV‘×Hógd ¬ Ïï¿—¾¶ù>OÔ¡ ñÏtmÀ"…öæçjríÐm·þZkÒ¼qdÚÄኳ¦ý0)€’¦¢ë ‹7Ð0Ù}¸¹Ä8×$ÕÆ3Ém–ž±–Ÿ¢>Ó/h%V¿¬Ul¶Õºä…´¾Ï“¥G©Zx„ï°5e5}l7îΰ]xÌŸµØóMò…áªÕŽb³TÒêÞb±zjÚ¿¥æ>öRIý7Æ1æÐ [<Üóól²õ·ý²Ý ™ Ðrì±Ç± ¸T›ýÁà#÷rYðóLSöÀ0ÄѪ–[˜6•"gv"õ%üLJ Fþ±Öc©ãðñóŸÿÜï'Ø[µÞÌpßò–·°P @àãÛßþ¶¿´pÌÀö!€|àMëcwIñZ¬whV眰¬&Ze[“ù{‰”gò¿o(C£_»vŠ&fX³³èGI„ház±‹9V‰Í- Ñ­Õ>rž1±xlM}ækµò¿°BÞ¿‡™Ï’˜†a?Iõ\ªç0•˜Á*Ñ{R >×8äøD®_j«ø‰[(\ïòKØ uÌ/Yþ3²÷i–ddÆa/©dd2ªlΞ‰æ}„H\¤Œ{ØK„eѾK”„ú ¹]: ¸¿¡ûŒ—/Ûùè‡Bl},³NÈ‹Rj¡ å|¬]ÈTanU3ÐÕ2yßÐ~Ê]oìCµÇVw°æLŽcŽõöu:!ñŒOžÉ™<)ÉM¦„„-§f22°"&’;–ëd¾–¬ùîÒ†Ô €$îP0üxGh¨èÜ/«Ù#4d•’˜aüÀÿÂM -Ýœê¬X”+{\($¨AD'.A èx&×=ÝNH­×ÐtLMÍÑ´c„‡ûÊ´n¸Ã¿ËÃ;Ç«´jPDe˜‡ºþÜ1V¥ÕÃÝ øxÁLúRÌ'·lŸrôJ|® 'ÙcU?ë·wï€w•‡]ü¢°/î³'Lp$'œAø-KLè^ÜIP‹ ²TCê¬SÑŸÛ>^gôiŽi9 +î&h=úÜËBýŽ›¬æˆ̬Ž;NÌ–`Z”ßßú#ZÕŸÒ¯þC" ÏâˆTÂÌ´Ç^Œéz? ¹ùDÓ®]îfÕ}Q£±jÅ$.sõ ¤”ÕqúÝooÉ‚ùÖÿô‡ÑÁ¼`h í‰Ugï =¸«Î“à'.0—ÚËi4 iŽ‹$—iM.ÛMÀj]2î"°@\fkd »+f åïêíâqmñ&&çŒwDwÞq‹^ RÊ„Æí±È5ÑAÄñâ“%°Z_o‡ôõõi‰ÍÁ¾ó­ëèôwœ@~Û)“=>S‘å7³¯öRÞ„òÁà¨#Þˆ+€4+ÉäFÉ~œµÞÊìÙÊM§”–†nìï]‰‰£2O”Kú•$ÞC}kækJ°4—Mµ!f“ÚJ“Qù¦æ_¸¦Å$Ïv ˜ ŠpÌ\¨®¸¾V×Å¿9!j’q¾ â¹ÖZHœffáz*yf’¸_K%ÙD[®:òП±æ3£Võ’D=ùÃþ€®¼â²ÝŠhsôó_Àši]háî:¥ÚLæïiÞI™DÌýT·¿ƒ/‘ß»‘qbb<ëÄÚË}P—ôÕüÙÓ;@+‡7оîÓJ«\í˜~ £½O|âéË_þrîì/ Ð|Xø€fdûöí¹khŠÏ“sy@à0_],4GÍDj&Q­HYöc‹LZ~î†8fê$ƒ»HA‰D;\ÏDº[›U¦7!¯é()Äû+ ;Z¨ ÍÄ|DìwÆ––Äwa³9ððß4!DªŒa) Ì«Í“<3½O“‚–ÀÀWè[¼r’¤Êȵˆ4†6Â5궈‡(G½•KOc®Ýdó È×$ø–ÃÅö. ¨UWQ½m£±Ç¿Q4Æ¡Eùí/ntŽÎgø´ŒÚ«”šè)U0øÈJ6‡$¹f l¶GªÍ ¨îè™XuÕò p fÌíJšt蟾'»Ö÷N 0ãÆò¡GC›IÀ­h¦RŸ *. 7³ZM4–;ú™q¶Ú‹|·>Œ¨¶ÇÀÿƒ1ïA‡Rêù `à(VµŒÄš(¡n0Kf!-÷‰zÇZEV¨ÃL¸jõ†Ÿ;°Jèïïd_n±iÐää¼[[Uš› Ánà 2À‘­¤>ÞáÈÞŠT¸j¨ƒ6o›qýÒá#Ú®êæD„g¶–nõûÁ‡ÇiÓÆaß'{ï9H¿½‹ˆ b¼l[èC}’gjÆ©´ uÉÊ©¤lOZn»9éè¼Cuår='Q›59£Èˆ Ï©æ1ØWáBðžÇó­TÔ!øGß½Îç-æWxëºW{)`N-ºÔ|ûûÌÜ£ÿû—ÁwäÈT«¨Z‡_ÉæÂƽfÕõ÷Ȭ\È·ÝB“nã¼æ+WщÿpšgŒÿꥯ¤ŸþøFºòÊËy"qòÂLÈÄi’}lÜ°a/}Ï”à~¹çÞw÷­’ñ¶‰@PË1AÏÔ©V TS6¤0½½åܹ~'±ž(7sVFVº:eñäi9ø¦ÄåÏ~.Ýþ›_S 5„‘QÀÓD[”ã×sÇíùúxÜ¡~Œz¡-·ßz³÷AøãFã >|%_É cß ”Á®Ÿ”I|d[ÀXÏ7J4—•iªšp0H?á°¾Ë5zd¢Ê/Ò7ÐÝô¢@T«†»Øn˜í#s¼øŽwí`‰ö[[¦M«K´Úi8nþÅ›î¿úËWøïã£cô“ý wN‚·Üq3`@uW%„ô…¹Ð^{íÍßãMј~ëie×Gj²@cLZœá÷k\gB#nûÇó>˜{þ9ÿgúàyÿLG>ëzÎóžO§Ÿq:Ýqçôô£ŽÌ%ôÛwŸMôØ}WÓš¡ G°° ÊCm#*f~3[ðÙ5Qçœymv·Æ‹.µ“‚hr‡¶q×öqÇÌæÖ9k/Ü9€„÷÷'¸¿7Ñc{;ÏŸøÖSé„8EúZaû& Í˜0¤âlŸræf€(Bû{ÊÌÀcå`­¨pÈQ˜†¸s;ŠkÁÄu°(e3±Rd¾Ó”Ý £'¸çÎßí {îiy>>fL-g.W_Ø4Xܪ*h•¯÷ô?r@)Z_D~íÙþÒÄë'ñûænj*v­}g³·D4Aìc$üþ …¿k"˜Ê’øšåEYµÁ¦/3nð#S3 wc<á¡“³bB4«0f2”Ø»’gB;‰ÐkÍÏLùÙlJ%Ï„“;øܵ+:i…›Ïˆ„*$lîó½à“áT^¤ÕY;$¾ÓVwz¶‰Y~¼Åß*唫Vöð>†~„–'ÆF§©æˆe¦ŠtjûxM ùƒ)Ö®ñ }&XŸmì)4£«†:é÷÷*"üËžë‡èÁ­ÓÌã“î0Ó.£¡Pqv”TNjòvíËÔ ?.xñžLnq¹‡ôõˆ4 t(T;ãÓ¦¦“ÖÏ21›Ñ‰/Œ|=ÄVŽÔU†Éë‘PŽ ÌnâäƒßýÏÐŽq÷Ü9‘Î|å«×øм(\pO<,&˜vÝxãîït„&Cä¬/á Îÿaå#gŸâÕO>ûTúìU×{ ì>÷ý‰&fB›7ßOW\~9O`„AûÐG?IC«÷Ê…ú…ÖÆ47VÆv=@_¼ò_è¥},oô¨Œ;4Ï|öÑò¾Nxæ»Oä1ééàü'qyêQÏ£ÿ>ÿ|zғ󑣎~Î3è¶_~»)jê½æ«ÿæ´5cî]Ï{á‹_AýÈ}ÂG+ëÖíIûlÜ“µ5qyÖŸáoÖN×›è_µð÷î³ÎÍ]{îûOa€±¿%ë#´áOŸü4ºã77»¶ féœ÷½›NµŒñP|õ›?ÎÕð?Þ"íEŽÉs"¦\l³A€±iYȆh°ðֈͥí~¦gá»ÉxØfB òYbr—øJ‚#XgdYó³|Û@0JeÅ7YPß³qhš?®^œ"ºúh~ršs à¢ëuUœÆ¤žÄ!†Ôº¿šHX‘<%vÔ“æ¶÷çˆK+­Fñ\|¿=c!0ÒNÕÝêw«v.T8r’!îtШ»ï)Ô/DnYEúè/PÚ—ùïüD»€Œ© èŒµ4ê•{GË-&7ó)lâ“ŽÖ`}“z.VŒq5ÁAœh0Ç8~ƒXï4º»SÆ™¨ÉUM´5ÇÐ~äãóz @@À4ûØÇ<09묳hÓ¦MtüñÇ7=cï6áH/¼ð|úÖ|ö?à@ÖhŒŒŒÐ>ûì“»Æúà¤èó—VÀ»Õü[®V®x/q\wZ‘´!L˜€RÄedR–0Jl<‘Óx!1Ú'æCì'8/>uÃ+»8Üf_—“¤ÎRâhJYÎÆõövq£Žé©©#;ÜCÛ Rõ 0©¯0ȉ×,à˜DÞ1"ªb×6%8[ËïJZöÇY@¡‘jõ Te³ ZÖ’žå4mÌ0›µfzúÙ×G1—Ók;ßÛ‘4"ÕŽk݈,ø,ìp’u©Öp r•Â^6ê@nȊΓ³!Ș+Ô :W qˆ!íXéÐu%­q‚“~gŸHl»»´ÃÈÃ~L…žþ!:âéÏæÃÈýñ…¯\ãÔV@(oŽú¡l|à=&ðhn·4ø„ ôuÓ¡Oxí¿ÿþô¢¿Œ7.˜R½û­¯¡ÿà;dŽ”»vl£o\ÿïôø'>Ö¬]KO;êÙÞ´ë Ÿ¿‚^󪿦;G=›ý†n ­[6Óãh“4gr"ÝyûohÞµõ{ßþ_“ø><÷˜—ðol€¯í«é—7ÝNÛFkô˜Ç=>ú±OæêzÌþÐ5_º„>wÙçiÕª5þ8êº÷ž»è·wÜJÏxö_ús]]ô››A]ô¡\˜«kýž{Ñ×¾x%}ðÜOä@Âc<„î¼ã7ÜÞgýÅÑþêºùWÿM÷¸çìD]÷:à±ç2¡}üܳè²K.àþÿØÿÊõYp  ¢bó¹›~ù3r$8ŒíÈQßÉ'þýþîßòä‡ ¡7íûêêêòסïN8þoÝÆ8!S'U'æ¯þâGâsÊ®r¢I3©©d X˜ä@BRV'9u@%¦æVæ(Ç„zé±ñ÷Q‹ºâM-ñÍäH4pJu¢ 8~OÄ82CZR͈û«Y€ˆÄ2'"áÖ'ñ&_’,§ýn}8íHâ¤Ñós5•Æäû'&Þñ±ø³Õ÷¢éW«ºZiRâ:ŠŒðbŒÙR¥ò¶¹­îÅÑ.„h,Ö#Œ…hZJiÒ‹êÜIt"ie8Æ=ÔqÈ!‡z!ÉrÊW¾ò%Öž˜Ôu…“ZARù·¯:ž×Ûr r=ôÀfiW)Îï‘xÍZð QMcÂÿîåójZn9û}ïbMh½&‘®  Ù+ß@oþ‡wä®3_ŒÙYÅÐtƒö?ç9Ïñ×À9 âg?ûYî^hI,€ Ê5×\ÃÚ L±;wÑNCmõ¾á o µŽî[ùÖ·¾ÅçÿÐÒj,åºV×·%xH!9íJÓ8£¹Ñ› Tˆ„¹js©œ&^òÏ®î‰H²³˜8›D–zµÎôÆ4lzÂZ‰æLL¶ì½„b¿õs©Ö$š0,¹½C„½yÍô\ÕdÈ0)•>ÂL¥Id–Š¯Š™ƒ¡ýx~‡û I:¤Ý]Ú6Ѭ”8"BZìÐ=z¾# u”Ó¦¿²jcÄiô$þƒÄx5r!ÔÄѹ,mávØg%U‰¿0)?$ê¢(é÷Ôk^ìZ­I¬];È¿¡A,)­'OOÉ÷5@DUý/Ðsj¦k‰ëäy%ßp|?k_›æ"Œm˜V˜IõºŒ3žÇ‘:…<2JçNÚ‹?Òh«:Ê ïQ½Ð†Á)~’*,amLCLæ4Š\ˆš•x€ ˆÐÖ•} û:ã]GÇç ¿RCʤ›Õ±o†õ;ƒÎ™g‰;Å >(Ðþøò>›Š37ü¯Ú èÚ­y6ãê’$¡È.Ž(_pöîtÇvŒÌð; 1&Öˆñ1I<IècR°_6“I5¥Ï §t[Ÿ˜Ðá™™ö#Bz?à´ЊÚü‚rá®ûFùXYs !‰9’s¢ ÔäýãM}™÷,ŠO@›ˆêÔÊD¨$j–þ>1ùÀÄ™D¸M¼üYÒÆl­ øÀ"D> ˜äüÕl†yñAÆ&%UÇ-â^äÞÀ ÃìdÎ\±ž¶ïÉ©Þã ò®íˆ /•É×c6wúDRÚŸsX$NõKó­à½ÑùPAãùX¨a|k³ã6χùú§l¹>Üàò3u À€‡¸Í©bñyCÃv÷ЦýtêÊšcêïóê}ÔÓïÔ‡CnT*bãkÒMßÁ”ä‘~<ƒ+×3ÿÝÝ÷ðx€ÚFß~š"I˜m<¹ßâ«‚ù÷‡YDB™—v €É±÷•ÐÂA®M}¢¨î… 4ý\×­·ÜÄ  óe¨©Ý0¤hì¶ñ_ÁÈÏYAǧê9æ1.C½ipò·S¹NE8hIÞ…[AhÌÅ^#I|¸=ë/_ŠÌC’·•·Íß4Q4 ÖÏ°êõîºm[GX"ÕÓÛIƒ}Äp»C„­F–5­olJf£[œ;^û`Ÿ0B_ðCÛ‡µYo-d]1³´4·Æb¡gØ}ññâ÷â}íΣ`½ 8¢ Ÿ40SE- Ìy`¦ƒÏ!'ÇÜ»ùæ›èœ} ˜Qy ¤}™D+¶Å2Á~Ï{ÞCoù‡wÑrË_>÷Ï9"J_Wâ5¹ùÇ¡¿üØeÕuÊÉo¢¯~ù*5σmR\ÅQ±L+B§Aì«ñ™Ë¾JË)w:É‹_ph=¶ÌÑê=öb‡ñ¢ÖâÑ~4çëˆ „HwÝuWÎ74×Æ{4%ˆreà%¹\ƒ•VךóûRæk\š—K­k¹Ïsh&6a^Z1§h „aÄß$Æ¢-àˆ—Iæ²Ø…ЄªFäa¤ú hxUá!Ì5ÐDR©¿0£"Ü}3?4’Tdnß¾cª%i·þí5ÍGôÖ'¶ešïJðåPß8ßÒˆ$agóÁ<ýº5ú Ð6 ináxþw8hCk=»?d…ï<~ Œ;œš™ònêÜn×FäÈ„Íñ£e8Z5®ø¹œ"¡˜ËŽ÷˜žžWm©Eæç’Œy@;ˆ'Ú8™' G£+Tq ÷ØÈ´DìÔ—ŒX P¢éf¿3Ýlv‰ æMpÄŽËžëè‡BŽ´ŠŽù_ÙKs³óÔ¨Iè1Xàhq,·Ž(¢ûÆë4ÌÏ›Ÿ“,„HYÝœÿ¦•?>xM€ €€†ZAÀå@gn¾}Pó'áPÙ>{@&ZTØôNä]e6aãÖ&b3°ÕÃ]~ŒMU¹ÿáÊÞqÄiA¶îš¡ƒXë×:‚KÝtëÃ|Œs¦H€ìõà?Dëˆ a(+âÌ Ô‰ûf’™™®z&?`¦äŽ!wšZF{q±‚4}nf–ƒ71‡$+3uFÔPk9Ê5²cš¶íºgÁßù cÓî:­R¢Âà“|499.Qª°ø #“B¥Fiïև’(KºcrûR•rp4‹g¹ä·u¦èª†sÛ²k;Ýö»ÿäÅ€þ‚m|5ØV0î1ÕG6F€h¡¦fk,‘bßwyß®ß30Z·¢ÚÑÀ·*'¬ÇÐVñ£Àá:ï½wß-àÊÖQB¹ö@KÁ¦_ž€'aƒZt„F‰t„è7|/H` ão<`FâMh©j“xÁYãÙô´h³j0ñF8eß”ø3 ùD}Ÿ&ö È’|„ˆa‹Ι‹mä²,0w™ßòæ9žwÕî4¢Æ¦T©„Iƽ³3sü»ÓmtÌ(¨¯˜d‰s"vy{Y©Ìg4pæ0ç°h5™¨¢{:‰¥<(‚&$0_$ë×Ø ¥¨Rn5Ž­©"ÀˆïïY ÌëkÕÎâs:Ñ+>×ùñÆL6’&ÇZÏŸ(Ý•~̼Ö×;IíülÍ›(ÉþßÂ'¯5¯fÓžKõ_Ìs¢LÎÎú:b!_ ûQ…M’°Hbí{#·EåÎ$Ü@ù’EmõAQ¢=*FFÎÏÀ…M‹ ÌE´1îœð¢ú™ÑàP·“~wÑý÷ï`^1IɃ Ï Sèw3û‚YpMÓÀúcsÈ{Ð[Æi˃ã!ïŒÎÏbD«bGX³øJ˜çckDÞÂÙFÃ’c:aßö)vU@ $NqÕ?>6­^ëÌkØžâk’1ïËóãY¡3Á§Ø8'nþCl ³Fø9Õ4úêêè(S‡Ûw;* ¼¤›³ã³¢åXý±°ÙU k¦½Ê4¹¨˜j£ï:Y;)ùG iDz¼;Ú ÜÌ\ÆË´CNPwßÃS¼nº8ùbÂkjÇè,=¼u‚“¢t90³ÿ~+œ¦y‚Ö¯s:Ç3C<5/ˆrvNBÆ L;ôt—5;ÑÈx5B•#¤”t`û:Åá' ½æÆhÌuàÄ´8+Ù4"‹¸Âtd×À‡wÌ´¬h›m_OÊZ“hè˜FËWÞ „ïÊ‘juþœž«³Æƒ¥ÛI>,7êëí‡&S“B:Úš D‹™„@"‰#;ôÍ5´AÑíêËjâÜ “mÍŠ2^ÉlÊsÔ%3¸êÛՀ̸CŸpøã ö‰dÎE}«+œ2׉nF1ÅÔ0É6‡;­7x1ZÅ@‹" •$B–o/@°Pá÷51à(Õù¢•Æ¢•YBnÑëq˜KÍU“Üñv6—(ã³0ɪÓÚAËü™/X”ظþ®¬ð¢—MuCqäˆ+D?ŒAŽ‘¥,O¼•HÂvˆÿiØ»¸g­X9À·T4ÁŽ7Ô®™l«Ò9ÃfV%5ølHæèL£†á:ÔÁqòëj+ªHf JºQ†¨\Ögb@4Ø#só`dF™ŒVÌR+s+P¼·ÛÀ=ÖöÑ=÷6Ýo×´º7Çäi‡.¤‰ÛÚ®´q9õ´3œFd”.ºà|ò*.ÏtDë/Úè±YaÓéï Ý)È%‚y óÖL «1›nÿÍM´Ü²ç^s’a~b.¤º n ¾[Ë÷ùþ÷¾Çª|ÐH+1˜°R6Ä¥Us ×ÿÅÆl¹`¨]i×Ƹ´›³­Êz7÷'œÀoB#Ì-ôÌÅŽ³?GC̳XΙÑϠʇР€a@Yv4¦!LK½H ̤L§ZN ”¸?0™Ù '>±$6uÒ[$-ÍKnc͉1—)éo~nÐdÄ xˆ [ „‹òàÂí¿N‹œ9¢Z?X³Ñ‰ª·ü0~( Û¨/Y–£Ø¢-Š úâߤy;ÂIt2+˜,zn–ã§c^'ƒM5ÆœIþ¹ÅkB1Ò”PÒÌÂe!ŠûÓ‘i›*ê ^RÆ[\ÇlOÏÐ÷Ç,¿ß Át°Ä½Æü7(gº—Xc h òf"œi–_ÓfÓCÕnÞã¼k¼¦¼±³=3ãjJ„ƒò R@°ðu­Ön¼÷[ÿÄ}ê}ViãÀ@—{—¹ ôvõõôt1Ã^¯Õ¼ ¨Á>q5ö!™‚EF ¥v4 Ø6IÒLœ|1 æRRǺš%´ç1ñÆÝÃN)°s|Žµ &¸ÜsMÝÿÐ=zÓÌwá~é7wî`gøJ‡ðòÃýœ/äÁ-TÞ>Þ ›~ð÷v{${d­&€dx°Sâš×˜pŽï±MǤ+»a;™äb5·Â¬pèkr¦Î¦1ŸÏnrî½æ Ó< Ç`ïY`c@†ûJœò™ö4É-Ë$z.Žf ƒ FLìñ®˜LˆÔ‹r“IÒ1h ðÎÃ&H­VŽDaö2‘Mj´(B€L© ºr„”³CͪüÄÈSoøĉ¤UGé<$B‰$Ž„Ù´%h'ÞÙm9Ad¹Ln"ÏMΨd(ãI„o3, “:K%‰æÉ)OöJÚâ]óäÌK”"ï³°â߈¡Ì×á…ä#kHÅZ1‘í¤â­Y„´,íÎÅ¿¡iyx´A{ ÉÆSfHʪA²˜Û2^:×Áï#§þ× ôñgÉ¢Ï,-ý#k9<Ô¤d–g$Õy!v«i4ÑåÝ{ûº£{µ‰,bI"kés…Ø7¼Ù…øŒ¸2’5d]¸i)‰X£á }Ýø“÷Á:CP N:Úh/™]Ê¢PÆà£ÕuÅùS,îR Ì­–ÊÈ„\yÅå4æ¤ó™2¡]:ð1çä¾LLÎÑ>û@Ë-È÷191*Z"…—¨:ðÛýññiŽ‹<>YóçàÄÒU_Ø¥ÉÌGtŸ^ ;?5í¥/h:àbBóàY«["X›âI‚ê“Ðm[8†2 vóø”H‚ˆ<ÀX£Ê5«zéÀ ýt×Ý#îâ ÷wðû!sª»®Þ@ ¢¨3¨Ú Ô sJ*ï…÷@ðAØ°ºTH¶„¾®º÷un¼V¬è“LÂYÆ›;÷?’:QÆ Ú˜ÁÈÌ‹Ç"’àÄ…'¹;W)eþºâÜ–WQ3EpüFŸÌ×D:k7Š ¤x¬ÝâiTÚ™3ï+Ö[4­AÞ˜á^„ïKrûB9Ž³¨›ïöŸòÖiôn'–·mjzŽffæÝú*;æHì&õE¢§ÍýôõÅýbÒ1Öã4IÎ:0ìœv½H”Êž™0†gÝ# `c¬˜š‘ˆr² ‰íAzÕ HL;%Ìa«¾_L¼(‹]'‚”ěε«³8'«¿h³PAhÜ£~>]uÕåøÈ<£Ó´Aðð%tàË7aúñod¡Œ>Xx¾yí²ü@û¸ƒÉç0ˆˆ1DÊC 8Î2?Ÿ0ößÿ@ZN¨@&ò¸´‹VU¼..írž .<¦XЪÀG1ªÕÚÕ½üW È5rùå—箵`-V–:—â²ØµØ_Š¥ÝzX*øˆç›ºÖ 8 ö~Ÿ–(‹Ö <@˜R–\‰Ð |’DÚ5•r>jU½n¡Z™·è|p*m ªê☦Å6FRHŒì0²vÍ ¢äÿ~6F“(ïÿ‘(­µs¤“Õ“ð²$ỸcÜŸ™¶)ôu¯“ÏÎÈÙ<0úŠfÜŽ]tù³ãóÂaî¥ã”åDFQhÖ‚—í5ø¼†jrÌ ¦¡{›O‰|JÇ*$_Œ³v[ŠÙ”åLKx›‚µ…íÊø–¸¬ ° ¦FÁŒJ¬¨“?øOø¢X?ëGaSo4|X™§)û¼ÚJ3:^æg}àì3œ°-¡~àýÞ὘„Ôžðáß™­…ÊÀV¸mtÓþo~ã:Ç´ï`ÐaÚœbS¾1ÕÏΊtX¦Žüõºî{ÞϬh°¾GÖ/³ÕF`‘õ£š¾=´sŽƒ3°UR&V à3!·0ý}½Ú²}šúF±¬¦jÈCS懶ŒÓúu¢Ù‡0w¯õƒâÂL—«¤»¢èOÚÑYáÅß“NEŠÎ‘î/kXÛÄóÎñä°ÉZwÄ çÖ]sÞ×ÁtêùLÉ–W@Éø¤D @ÌgH"!ÿêóÕ¨ƒdd!Àª&Ò1™'¥ìðæa>²\á_¨31îb`€£ùÕ“– ¤Èµúm÷Æ308†>¬Ö—^¯HšÚ9Ygä?¬É'ã¾òL$Es# £Áñí5ú_-BóŸ#Wù’T®¨mÀ§Ù›d#! ÑŒ´‡+ÀàyZÅÖNÛ`‚ͼ´Ik+IÜî4AÂJœWD€†˜jÙÜ… _{8žoI“Æå½O×V½^f­³óùqÃ'ìFáL7¯ŽtÐÈoyx¢eøÎVsÇ@E£¡ô!k¯+ÖÕªï}üãOË)öÚÛ©Ó;¹‹³ÎŽìšŽ˜9ÛTB{^ñÊc¸,·|ïÛ×yÓÁ¼9¤|üû¯X‘ÐãO£ŸÿôGDsI('%E±$™˜Oqàc¹&d§[ìÿM›6µ¼v!F½]`h@cÊ‹óddt–çb»k­p@Š¾.Ÿm:_"E!I±®¸V– &ŠLA+©l\Úi a@C„}!U­·ß‚3•isWÑÜ Ø¥.Q*DÃ^–k8›r°Qf%L2ÄgÁ¢"Á[)…ü3qw™ ›D»›`’c %Ñw®Iê F¦±Œ@0dä×£„–O“<ðJ)ʺîÊÌ”˜Å±$YÕ1C;3çÍ "[?ÝÅ^“É¢_`ÕPu´æì¡»*¡\¥¹MÈñl£Süû‰úxz܇: þ}ë×òY˜WrºwïO~’.)ªp `…~EàžW8ÌÐÐ0Ýß½|ÍW\¦ .ÿ~9®Ð«+kû¥îÌY£LÕãÛ|”-?/tpYt¡õŠû~ì+cgï›x}"’çí·ý†ß3Ó÷‚p—}~çêìÃa`ÉÖ©÷QÒ„ÆIJ %<ýÙWî­o;‹}ýº«%¯4‡eq°ç(_õ†7ŸF.6a²‰9¢g>ëyôŸ¼˜iÕ¯nºƒî¸ëÁ\?”Ôß"š™f2z}¯¨” ˆ!2Ös,µü,­¬³Ã÷ÍÛfé1{÷y›8¶9:¹Þ j¬¬YÑÍ~)H:({qƒöXÓK¿¿oÄiF:øè`9éú=Øß…5PŘ° ñ¥a ¤
 ðèãÈW-XÔx€ŽjVr‹=áè1cãy{Õâ‹¢lÜ0à¤ÁU–€yu›4B`nXYÏ%@øˆ;„;ØuîÖì| )B£·‹z{Å„ L=À ÀÁP¿$:êÐgLˆ$åhÙ„ÅÌõÃ×À£ÖðÚ>7'æ](}=´9 ΊÁN±yœ ‹¨Z¥¿ b§yŠ“6U=³Žn^9Pæ+ˆ&Ñ»¨©ïMË€i`4¡þ&–y¾§«A+zKŒ² B¨¨þF‚»®þ^Ú¹mܽ«LÈŽ’DÌ ä4£µã‚>G×Í×áG#&UÖ¾x¬[i7ZmŠñõíê(–øx=2éBqS™Æg“œ¶m1­‰}Â9‹wed’Ñÿ˜Ï‹Ïó²£Îš‚’_',¨tªšä ¦B‰˜ÍÁîÓTÿ.™9¯7÷—^3J|ÃLH š;O;ó*ï"Ì}_À¡;QxŽši1ØäãU®¯V©i)){iLCAŒ­XÞ~DÃë)óZ‡Z—Ãk*@\创ªSÆ*v–@e–ãÝŠ¦Çz!&¶i8 ÀE2Ž/½€)^µ²—ÇÕIGœY8bÚ*ÊõzîÙ¡¯Ò5@üI484Hw½ñºëî{¨Zk~T½üÁB×ã2×]{ }èÜò#>û¹%I¨ª¡ž3‡‹;®°¿x&^C÷RÄžd´ žiTµŒÃrËå ÒÄG¡’ÐÐ’Ï ÏÇ{>ûÙÏ —¼ì•tÛ­·Ð ÿq=õ¾s9éô‹_øJ§¼ûd~î-7ߢæÒò>0K¯hÑ¿J,—ù—¦è|2¢W]~åéÏz.½úÕ¯¦baÀäÛ‘é:>.¥ö<ã…9)w—†…‹ëD]Äär¾E`{Çü³m‚ y?ö\-ÍKå„A’ŸB@|-èDv¹þA£+O¿ùQÚ´—ƒÀC”Á´ZaŽÑËœ4ÜE êï¨Ø\ñ·áP§9AQʹABàdPÑJò3|è# !\gY$¥AÉü\¯ÉÄm­C8âlµ+íL,° =Ô?SÐÝÕAë×TÔ>ºÏ=¢·¯‹l°ï‰› <œ6ÆžÁ~I–Hx;˜Yî¹G öw¢/Ø" ‹ª½i„,ƒ³õœ˜³ÁEÛŽ¹‹/ƨ¶¢Wq]ø„Ý;ó V>i&Â0µX”S"¯ÅòÏLèT>6n\zÝV>ùñÅ{½µ_ÿ±Íéß¿t½ùm§ÑRË“žü4ºøÂRì„šE §1<òØfùõ×´œ‚œ­|7Ú•¥0öŲÔúÛÿB×´jG; »» x¡"‚µzÎ?> hy³ qûR\Kñ» ið~ ó,fú³°3sô¨Ä³>zTþÅk–Õ¾Þæ:Öu0W-+;«ƒF"¯EÔ.Ï„Ö%dý|ÍÈò&; ù¨^>”+ÚV {C&”$zYТ@X$aöÂÞ’$1໡ÐÊÌgªnUÒ(įµÏ€ûW˜ÆR¯‰y+›ñ–Ý××É!lƒ†ŸÛW<~×:úó¦7ÝD‡y½ó”3è?¿÷=Õ}óÍ¿f:vó¯~Ì‘FzüÓèÏžz8û«]ýuŽÎÝ›cô®úü—`¢ÃŸzû›!ÀÆ©§ÉÂk‡©éžŽÉÇZ»ìòKÙÏó¨§?þäOïÚp5í»ï>t衇¸úÇØ$õðäÃ8’5ê €Æu×]# Ä=öéGÅ×lÞ|ýøÇ?¤6ßÏ$þò˜çó<¹õÖ›é9Ï=ÚßL_úâ•ÜFð@[·íbaÈM¿þ5½ç½ï¥;îü]ü©Kè%/}ç»ßåþ|úQOççã]®tZ\'Ðóüp}d>_f¶ Ìç<ï…,Ô¸ôÒKiܲ]#Áôsåê®/^@oÙÌsþÉO9œ>{ÉÅœdù9Ï9†ýã~ý«_»}áj‰Håø(ø©åÚÓJ»^\‹¶WÔ4/‰¬?#`ôáÓ"ÑèR28*Ï©³V‡*ºÖÌ7ÇÂé·ZÿÅ}vÇèà&ýª¡IlT2²%ˉóðá¦8ZÔœ¨±ðυ֠цÀƒïɈ%b‡ww–r‹ÝK‡)0TNÞâ:Ò”™j 2œpÅQÅáÒ²ëø íÐQÊ;Æuf$ÎI#N:“²ºCUݪq™3%õƒe×÷å4Ç`’§` ÂÃg&òkAœæÁžȸóÀ%Ñdz·㇪Ðn±¦#©IR룈YldÒV„hCÞ*JU,t¬°ˆÏ·«)Ú‘vç–»éc!c@B¶e´Fë†$±[ŽÙ‹6ˆvÇ0Ÿ™Ý·Pԙ̴²7)ô‡ßÕã]Ì°ükðÅÌô¬›ïnMé¢÷µ‚€ŽXq•˜)˜d¶S«ø;žá(–R§G3ã¼]£VË&°÷JÕ„‹m†ë =-¥Wƒ(ÔjÚ5Qe­l"ôGsiE,‹÷-•ékZâ‚ v©~,¬ýpthÒ ÌÔ ¬‚lHO=íôÝÖ~|íKW‘7‚(Jõ'üø.úäGèÅ/;vÉZ'ö4þûïŸÿă ûÇèhÖ áú ÝõO¥¥ô ú¨ˆ\ h(ŽwœdwÊrèÃB@d©»v¡{Í(cc³¹z¶<<Édd#^j‰ïo·Ö 9îÑd}Þ߈Š> z$ªÆö d[üÑ”6\XFKša¤OpMI”<Ì×Y®N@hî @ò¼ç†a¦9[U°bš£†íÃ\­‰œþ fR,>–ä®ØF7‚E†ì½Á¸(óŸ©… ¥NP‰AIB{í9L<8â#¡% e­Æ²ÙÆÚ'ç~äctøŸ=ÉŸúø7¼™Î|ï¹tÑ…çÓÑǼ€N=ýLzÊ“ŸÄ÷ }HŒºÑÝ‹ÜF÷«¹Ö—>ýè‡7ò÷ë¿~kS.ºà“ôéK>CÏxÆÓéÝïz½÷=g1“?8 &™gœy¯ëŸÿâWtÑ?š…-ÿõ“²IØžŽ&½çŒwÓ¥ŸûgzëÛO¡·|*}à}§r[PŽyÎNkó&zëÛNqÌüÝ|ËM|?þز¾úÕ¯ùþžœuæ…$”ãcj¢ àtÊigЛÞx<ûáóè¯<Ž^þңݻ¿>ý™+袋Χ½]½ˆvx¹|ÍÑ•Ï~ö³|ï~ûíÇyšöæþ¸—ó˜GÑ»Þ-B+/ÿ ]yÕ—è)È= ¹âà×ñóŸÿÂ=ïLN¬ °sé_`­ÉÅ^@ŸpÏxÓ‰o¦SÞu²7â™Ñ‚ϱù_“²½Ìõ²mvG¨ÖÕÿ· ÔÕùÀ`yï’h‚&»Ñ ¶Ïä¼znípxÿ’2yÀÑœ}7ÊäŽÃìê-“ô˜ýVúÖõÓ½›Ç0éâö¦Ù ©9$‘«‡*âFÂ$êè*ãºk²F÷o›£wγ;mv±jiÔ5jûÎ>Z!(6-¬Ð~{õÒƵ]ül¨ÒÒ ·ôŽ\ÛGæè¾-³ôÐŽ9ÉjYÍ LLU›À‡ @ÔÞëziÝšVûôöT46·¶G%$øC f¨Ù·ïš¡ßÞ;NmŸaæ¼»C2¿¢¾2û¸÷t`cÅÊZ·nÖ»Žä,¥T G"qÌ•j@sòжiºãîºýîQÚ9Šˆ âgÃÒœ š¦zôÆ>Ú´Þµ“XªLbD}\£î}ÈÕwï$mu*0Ž]ÞW¢}×uÑÆÕNã!NLá^™d‰J`F&ëôÀöyÚ¼užc{®tÀ§¯Äc€Ž=V€ÈØŒ#Ü£uºo‡{Ÿ‘†ûåœïZ-ŠV%N<¹¤-ž3íê_ìY­N+¦t¡û­Ä~D6 /0ý–õEüz´¿èP¦b’%" 2 XÑWBö¶Ä3‘¤iîªÄoüaƒ‚¹ÓäÄ ƒŸ%ñNFQ““¡í‰‚ñLìVý3bifÞ+ËÔNX+0:Á‰Æœ&¤Üá€yE3¨êîÊÏE.d ì7\ûÃ^;ÜI›ö覵+:Yº¶plEgâ¿v×/vÌ÷váÙK5c?(19Ÿ3ÅÔMƒ]õ9ç~Ô3hwÊq/žïãÇ—$9ZˆÏÓßy"-§œp’$D”9 “@Æ„Bþ$§œqörªfß0$­`~ZùtlÚ´É/Ž $¤­J.·ÕX/W0± Z½iz‹¿—Bóâ °ù¡qšjcB¶Ô‚ZK©dÜîªÈ¾ƒQæMÌß"j±¶)b¨S‰ˆSfPAêó!~˜™úp@ ë‹A÷KPÞ9Ž(9Ïû=ò[Át¤¦!â!]†==˜Hd±?÷iª‰ì#û!|"J|®*< GçsížP³mü† 5¬ æë™fV—`I²&ƒd™p‘Ÿ«+eë 9Wô‹ÅÂ`¯kOYÏ—}ÖtаŠš¤q¸m2ó0(]$ÿ•8ÏÌK»ækr }vûÛBæ,ŒRóüÈü`¿¡õ@Hp€‰¢(~0Ÿyõß¿‰¿Ÿê˜âO_üI6':éÍo‘HcîÞÁÁàÓUÕ`¿ýÝ=ôƒï^qìqœûèë×]KŸþÔ…¬±Cÿ˜GíãÀ…ŒÉõW¿cl}ð·ô•/^Å¿¿øù+éíoy#?ù]§9úƒÍNãqñEÐׯ¿–ÁÉ+^õzzï{ßÏ× ¸u~Ì_þ]uååüûñ?TÒ#/©àäÇÜŸvúY¬ùø'þ‘öX·‘ÁÇt#ßÍ @R¹ÒKgžõAÑì¼ûœPå'î¾mæ­®ìØþýäÇò^¼ŸÿOf°A<_kô†7Ïß÷»ßÓ«^õw¬%ÙcÝ^ D`ºvF¾òØWÑGÅàšŸ‹/¾€µR(]b6ÏåKksæOì¿ÜURa©›ßn@ˆ7âþƦê<¾˜Ûà§YÄD{3þ²ÌoÚWD#i€ssÏCÔY¬ÿí£Á½k{Å@=¼cÚïCp4ïýð¶)JuÏïêv¼êªÚ²m‚çdyŸuÝy)¬JBSñ¯gµÊ¢_MWUÝ# lw_o™=ܲŽ €¤XŒ)€YÑÇP`Q¦Ñâ3)i€¹CÇÁHÜNf`Ùf|lÎ'f‰ 5:`•c\@€8Q¢Uè¥Ö ·à¦jl¯<çÞ Ä Ýr€XÙ9)?û¡¥éâì« ­‚éÙ+ÌÎTi×ø<í™õ&[xW«.MâØéˆaOO¹í†bGñîð9A0c‚1AV9ð†>Œ“ŒµªÀå§5!á@·Qðé°'D•›„eœÅüZv·Ä ‘ÍvNÔ©•f". iHÚÝcÏZÊF×cÅ¢zi2R*jSâúÑ?ŽÔi¥¤ƒ=!„r{Aþ“DBÌGu «Õ…TmçR(åZ4ر$Rç˧½¯jé\+W ²—%:´’ð""ÉΉÎÂw9ÜF‹`RoV·ÈmbO->7©2¼|ÊbøÔ~ QtRà&!45ºH#8µ[cÜœi¢·±ÐaºÞ^ãñ ]µ0ó×J+»Ö¤XÎ?ÿ|û´›L pM;ÇhHБi±º*|âzèû㆓eÖ$ ¡yñ‹ŸÐ—þ ûê×/åôD§Ñx×)pçé9-ˆEg10rÒ[ßMÏþó£i©¦ Òìâ¢=õ_eО׼æ5œÀì˜cļ ÏðA¹`' ï„y äøšé{&QU]?5ª!X(6ÇyžWu®–Ÿ_'ÌõàÕBà–%Ešx3EÑRÖÕ³êøí óö(ÈÛ7¹c†Ár§†ã^ç´ wÝ3B+Vt3 Á¼]½ªŸ¶ºëh©ÌæCÚJ!"€tcÔIÎ;ˉñ ¢F%É5ðisL7¤ ÖéF,9ºkÔŠŠ̸À– ¨ˆv8 ?$ó@kV&üF[&9ëz Æ+†;•A âI†¶•»>÷â`bÕQ–LèÔÉ™†Ï’mÏíw‹áÄV¯èòæU~³‰&}C£(@Ê4î¤èƒX  Gr¼# ²¯ß°ýöŽ[:xsS }ôÄ4" ¹-è°þœ•ÉOD7@xä—¼è…ôú7ŠÄóôw¾‘ÚlÌJ~³cþŒH[vt,´©â8ÀÇB×ÕKÙ Û1£ñùVm‰ïí*7øÅmŸœŸ&>ߪ^~ŸIÉP:Ô›¥‡nÊEê'£¾& $à‘ùb‡ðÌ€KDâ*Kå4ßwö¾Ñ»û›=Ý  ÕcÏ3»„ðlyQ$¹óášЈ™Bš¥â¨ªíD_”$|‡8¥kÄø-R2‰÷Ëà¬8npBÇßÊjÆk`$É 12ZÌ «UYˆÑ\è~lÐl|ìck{ØôÅß± Å dxxØIæ6þÁæBøCg'Š lœ½æ ÌSùÈ9g°ÇþKtg°âúä²K?å¤}÷) Ú×?ÀàãÕ¯y-µ@»ñŽw¼#Ç”óúþ3E{ñvc.âç÷XʼXÎü±O0ÈóósMïÓêúå‚Ý)Ë9ÆtHµ€a‹÷CÃAi;G¦ÉòUáñšÛ£;*ï­%­+k¢WÖaíYþ3«J”nÀ| ¢“C•;#ãîz­áͶð—ÕªTm¸=Re®„.²|V‰±2Ó&=ih–iÌIXÕ¬aÀ:Ì…_/L û®x:™7ûå¾L“0a†ÎÓöØi8}Gs´6&üJ‹Ã¨…¡18t|Ì@—YM•<Ž_›Ÿ¢“ßúúôç>OGyKòYó°ð– íâsî1¿»óV>ÍÈS?’~ò£ðÓ,L- ˜Rðpæ‹tëíwÓÊ5ø;üuÁpÚC{f‚UŒ·ñ;Ð>ÌÏNøwª«#:Êö»XºŸŸGQøMË€±fâ¬3ÞE¯~õ«è-oy û]Øm ËOp੬ÎìFgXàÏk¾ ì<™pÀbƸku “›øñNÛ´O ´!oûÛýy˜rI߉ÿ¤½ ôx.—Ä'Ƙœç­ÖÁ† tÐên·þͧJ®'¿^,[{‡‚oÎ垊€µ¦;€ŒÙf§Ýxì>C6´ve7Ýûà=fŸaÿ¼½7 ÐïîÙE?v­¿nÿýV²Cz9fJþÙ?9›©¢¦Š Ó}åP'£3] ?0½¶1i êÈÞ @q5rÀ'ܲsŽ“•ÅõÀ?6fxI$"ŒTàC‰§…NŽAM´ËØÁb C ´‰ªtþj×yœ}½·B¡¥QN=†ÐŒÓnÎÍÎób›™#vȶ‚>€¶Rÿ•«VÒëÞt2ó¿ñ¡)?}ñyô/î­eM‡S1ŒÍ­ ¢$9† ÚN,H”Ó´Äm™Ó¦cª)éQíÈC±ìÓÿúyß®~ôŸé5¯8†Çx£“AÍû‡–ånªÅë—s;…V Iñ{ p¤â])AºV^”Y±ã#Sâ¼…Yve|ÄFB88n¹×—(YÄ¿m†±ýeÚÂü¬°ß„ÓÌT2ßVƒÍqÔ”<@±ff­µúâÿåÝÉÌϲè]ñ½QÆ ¤Ž¼hkXb€Ñz–âÁ„±C™†òõm£„kî±²‹“!™–46‘k7n é1´ ‡: a«LÝÅ‚ëérÎûO¡K?{‘jœ"( ƒÁG$øa­[j>m)ÿw/¦Kþõß—Bþî ü÷¾N·ßv ;à±Ñ“ÿìðe%8øxö³Ÿ½$äÛ8óÌ3s` ý S+€º¢V¡U_µ,‹•Ý™/µzëmÅ:‹ŒAQ€²Ô6.V£§ÂàH¶rãÝ‚ïb8fœ²`Mõ‹ˆê7aO›¯‰ Ǽ–(Ð í UŽDÌb¤þÌuH4=ì»`x ½˜Ö€6%Õr0ƒäèfG‡„¯­×ÝwžcÁ¦]Üæš‚)Òä‡b*- —æoÊ슒Ø"NïæÒðá‚g –űâ÷¨‹¯Ú[«çÀ·ïø·2–¨“ºõoh¤pl7Ö}Ce÷öÈ%6Çæ[è&¯þÚÕôW/¹†}=@ƒïùÝ]žv¯{S¹£:ºúø~ø>pÒiÜÆ·Ñ…œO'žôfúèÇ/¦‹.ü$çãyå±Çññãßp"=öq±I;´¿úõ¯èÀƒ%!)|ú 6ƒCÿ þ ôthÿÇèÞqcþMô™=œ º¬cÞñ§ÿõ#þD„+hbPh˜Eæ;ú˜ç³³¼­É»;S¿§c Utg>i%xÖž.1…fí`½=ÿÓ®Ÿ/>ILÈ댅 $Á-A@É&‰nÝue’3ë y?Ö¯‘0¼X_«o>âý+Å7Â( ¶ï˜âÈ|x—ÎÎ ç¸)ƒwèØ62+1¬•ÓáuäN¢#”t:¢Rfæ—ͪF‚: ¡_½BL Ì©Š(¨élÅ€ixØ©_€ˆ[E¯Â (údœ[ètt |.V;$ L“ „û!½Ø¶s–´ÁÜÛ¢‡Ó²4ãRKˆ†„†eͪ5a:E©Ÿ¨:0¸Ömˆ§ó€ :ÔÚ;0[ÓSãtÛ-?£ïÿç7œ–ãA~vÿP..>ú á‰wŒÎ±¶Â& @G_O‰íJ-ìnP…Ø" Ê£ši¸þ ݬž³ñ*2½ýƒ¬ÑBÔ­™ùÖQ;–Z@ûú:šÂ,ó“³ö>KýÝŽ@Û±"³¹Æ¢á·R­ÁFX€$hËÝüÇgdá¯(…„D^#ÛÐÙ!½BóÂi[r‚m$—‚i¤gHBI)wxÏ4’|Ëm™g.ìZ3…*¾iLì¤ êHžˆÉ¥I¼c˜åß3“vÛq˜8B:d@$ ¤Ey©DƒÍøÁ„vs7V*ìõY×äˆIxû‰¬qÚÉá„Æ–0†ÅJö>í´`­@ërËñÇϦ=KÍŠþH8œŸvòégÈÍ¡Çâ±MÔîÁu90U…¹1 çÄä8½îï_Bïûà?Ò3žù\ZjyÖŸÿ%ÿíNÁ†‹~i'$ˆK+m6oôy1qàqœŸ ¯UÂ5K:»3Št+þ¾ÐÜ+>·]=t1†µR6Ÿ-;ªÏUf6¡áÊB»‘ógv®è©ÕH}ÐŽpN…*"UÖ5«sIp´¢åZƒ ù$ì©1pç)WD¸¡Ú‘ùy,½M%©"r äƒ4 $–c”ZÆ\­·Ü›oV‰Í½•ŽR)êq:Ç6.ѸDRӌіç¦ÏíhLwZ Ìøýfa÷PKºVb3°…÷ð»îÞÉŸü#šÊ%ŸýWú¡ÓÿÚ×Ò/@0`öŠ¿y ]ùù¯Ðw¾ÿSfŒá(}ùå—Zã¹»ÞùN‘Ü„À‘!}ôÃïó'̺~ô“ÿf3­SÞýšš§o\­[«oukóUü,8°Ã/ÚW½éÄ“øØõ×]CþÐÙ >Nxãë蜟G_ÿæ·øܹçœM_ùÒUôö·ýƒ?0ó¿¿çþŽ\ïyÏ{Y“SŸsÎý‡ÉÓ5_û}þÊOÓ ^ðzÚÓŽpÇ^Eï<ùD:ó=¢÷¾ï~Þ9î¹÷oÞΉJÏ;ïcôÝÿüÓ(̹ÑñdÀ”êÚë¾EW\~›O¡~ì5( ~#\1Ê‘NÃtþ'ÿ‘ÞõÎw8òCG‹Þïxdzè»ßý.Óµg=ë™ô›[n¦‹/<Ÿý@î¾ûnÅB嵯?‘¾ýÿT@bæÍƆùÀ~ÇĉÁ„®‘Z}q ¨9”wXà"(!æ¼c?5ÓFÓ„ÄOÆ'4%YIòœR ,þЃN1ð»ûÇ9,¯iUö\7@÷?8Æá ˜­\ÑKÉš•ýY¯»°Û!Äó7V ?€‰*B‚ºÿº»aJ䘂¬Î ’wcBá{QR³‹X"jt Ûé˜ííì<: ¸°8!à€„²…Æê¼a§má_Nõë¥39‰J°„ î‰ëÅÀ :æ>¦õèD´¯NZ9,ÎóD­jÂ16P·mÝ1-Ùß]‡=ñPúìe_àpsþ:·Ð&Ýߺõ{æŽ}â£gÑu×|‘¥’W|ñz´fþȹ¤÷½ÿlIuïÞNù½êüã¥A8$ªÎº€Ž 5CƒÛJ„Û툒EL*ÊɧC¯~í üýì³Ïæ¿G¢@}À£WÒÍ·mÏ…\NYŒù(‚˜…@Éî–ðˆþê`¦¸f0dŽk»ï,í*¥~öy¿ãÇ9‹y3ŠIš~'MS¸¨å eú[•Úˆ|ë29žQ~j5r Ä’XVøúê|5êÇpwªÎç^ð÷€È3cY|+g&¢Úà(mÅ"¹}j,¥ªâÅ/¤{¤ ´ Ò/'4ïr 6ÉÏüË…ôo—^Ì´¥YK–øDT”†€‰çíËOh ¹ÿ_yÜñôÆß¹ì‚ËiÿùŸ<ßѽ÷ûö.eÍÛ÷/ù˹ìåØÀ_ë˜(˜h¡À|×ÄÓ'>ñ‰MÏCV4Ÿ0úó?ÿó&šô™Ï|¦IË…°Áxv|ÝRhÒ#|—[Re2-†/ш´¤Ô,• £Ñ‚Ô=Ƙ,˜þa_my B˜ó”Òh¿-(ù’øöIþŽ†·¯gvŸWöDHhk5K:,Rá’%yn]>0ØM»vNiØâÌçUh]„ùÂ%©:‹%õLÅí¶=»‘ù(]’^“½‡äÈœ7‹Í§'>~Ýù»ŽG™£Ý-ý}´jõ:zpó}~ø÷Ùg3ÔcmüÖP`†Á®‘Q‘ëÐçÐXàÃ÷zF†ß‚†‡Ý¼@ˆõ„ÍFFFèÔÓÏ 3Î8‹M’.»ìRæ¡Êù̦ ÀÂöŽOŒqûRÇiIö=ìG+W®p|ëh³5LB~¿á}ËM‘=6ìÉ‘¼êu²qýx_GŸ8R¡ã ëêé W¾òX6‘‚Ö<Æô×Û÷ ×®ŽrIMs³­©ß,y žyŸŠÄSh@…Ù÷Üs/­Û°‘ûµ:?•K„:ìæn¿ã…wìšä>È='Ç|ëž©`kÃ惎²‚ŽÔ@o¦yA²¦ÀN6GEó‘2঺Ž®Øk]óºHÄ@È$Âvñ”â?“­Ç¬ö÷%OyâÞYœìojzž~÷û]ܨŽAŸqÏxD’1›˜£ Í@j Pú Éq*høŒú"ìØ…´Õ%=Р sɽ"²&rd(J»“ˆýçÔÄ {ÔouuïóLpLÜ+œ$Er7 ¬pÒÙË CSó“„b›S)Mpä ‰ RJ%9º ª£g€îÛü°¿çïy]wõÜÄÙ‹.þôW<£pÔS¥±‘]€\KOyªH!>ñ±shµ{?DÒH(h-bÉ'øsZœ]cULLâáþkbÓIQ)´ˆ„Íü†ƒ²æŠÑ¸"YDÝ,ÜËŸ‹žµeLËaŒI\ˆ´÷eJZ°G³¹££# Ü•rÚt „Ð,V«˜†o¹à60·$Áš…Ò§.>ŸæÇ @Ãj"ÒY±;@ˆ" >Î’ÜÌ‹ÇÔÌÜ0V _o:ádzæ³ÿò"Øد¼ârï‰Mw¾žä%—í8BbµM`Š}3hZbš‡zsŽ„RoåMÓL­ÄÜD~•¶U=H)öoâÁ¦á«„”# ~Ò¤À#Fs^×^Ma EŒsöüºæl0íJL£;8Zé‘D}¢H±œ‘|×[W˸ÍRs•žûb6’@>1WýÛ—èð#ä!'œðz >èAØTNÓü8'¹Hï Vëua¢‘ï¢Z•Ä—!ô3…zË #¾R¹0\#A2:å”Ó92!4o{ÛÛ ýÔ¼ŽÓ40ê˜ ü Ž E€°ÐÜGu…5J­)ä<ÊÝàèÐCÞŒšºùH%È+ ´£–Q ‚ße ó%F˜{s5‹ø–-ÈŸ5Íøeøú¸5+»iÅ@—¿ÂûÎîÎEd4ãžÍHÊÛÇ‘îPÜúÚÕ²)b£…c&ÔªpÆ4µ" 6m³™Æ&Škáà‰ã@ù¶±Ú8YÁ5¸×`ƒ7'Ï…L©:¶bLÚ}·ëÿØîV¥Õ3°%WHIÍswæ&¯ üŠLg°KE"±žä7[îKÕh•ïD±•[Póë*0ð}Oiæ„añĂá•]Q‰$KÕùæxÚP¤dsutÁi7KåÔGi Æ…~§V½KaJnMaã3rª™”#îXüÁnXKþ½ÿˆsëê¢ /d߬7HͱFvÇÿuA"u…58é¤l{ J˜Ež?E µ>¤_3ÝL%™))ÝÅõÁž×§Š$ãhZgœúZþG9—Ç _ô7l*±ÜШ.×]{-]yåeÌXpK¨í‘¸6¿¹Ù¸,ÆÀCR ¦€A±Ñoô[±>ûlçüo æþ¶.*¬Áµø;ùä“sÇ¢O‹¬¸`¯©³™ìò€´…§åÏq ®©vÀ¯s]ÔB ç̓ŒwVÚS¤?ÑGÜ(ù•\”<Èž+æ¶vT$ä§0eUô '#ñ9“úpæ]Æ fàlvj ÿ›|Qf¦( fÔg}šïLÌB9Ú–‹âûý[eU¨„<õ:Gͪ©Y˜ÍU0µZ>å€ÝËc‘¦Þ±ŸC«c|IýOÄÉ8Óš,ƒíi®2@TÓÄ®œWIÝé€F¾Ï]Ÿ¥ Ïÿÿ’«…£KqÓ Âï>Ú¹kJrpUMÑ8§J4ù Ò̼×öŽäTŸev̯¤ÞLˆëÕüUøïë×_G÷ÞD3Sì,f|a Ï¡Tƒd’Ê‚¨¶ƒ·ÉLÂãÖºjž3Gp¼o¥ÖðþKVõ/oz0¼•kà\8q`H=–@¼WÚüNÃ>Š{0§±þŠ.­„Ë­Ž5Ô¤ê6»»R6µœw{2êd@”IÒ̇·OÑ{ô3D'oÜ0Hwܵƒ»ÿé÷?;tmKž1Ú12Kã½ &^ÄYÊ cpãß^ Ýæ€4+†»ÅÔuÖV§Ih4ÚÐ’&+Ã9ÂùzIMèfþÍ GgÙ|ν$Àĸÿ*žä 2·Þ±;y@V­è¦žÞÎmÚÓÚ°òfgáL>ÇYÛáÄÝÈ1²$ÝÀ@;‡µüÉ/ðß?ðž·Óu×}™ÏMvÓm·ßîÏ}ì#bmÇ—¾ú NNƒò/}”>uáG駜M{\…ùÍo\Gó7/§k®ýf.šË5ÿ~õî¹ùýƒô‰‹¯ '>ùð¦þ4')”Ã;ŒÎ;ï¼\=üàÙôœÍÇÎ8ãŒÜ¹×½îu|,–$"Œè_üÅ_p½XpØô?ýéO7IÁ0½ìe/cæ`!b)f Åë—Ë0>ÒL&È@gFg-‘e² ÉÙЀÓDgµy‰—oyF@6v¯:Q w©Í9µ.šQ%I )EB-U ůYæ‰]®Ï2meK=mã%2j‘D[åìô'@´³ÑC¢ûrà+°vë 1Ñhµï‚¶€žOá±æa‚SÄX‹›»Æm6 gÓˆÌÿkEP Ôoڴɯ›xýˆÇÂw0ÐEæwýp™UæAÐC>² b ÒCf|Ú—¿ŒrZ,ÒÌ3V¶Yfúñ CþŒsÀ´qã&dlÜ[0uP`×6#)hÆ-·ÜäAG«ÒPé[»Òjã+®iëOëKô›Ñª…ÿvÚmì&½Y*¸øc€`¯íðQ¬„ÇÀºƒ´ &Ô«Ø×E”[½VìxüÌÎÈ-ù¬é‚Ñk@O!l„#yIͼR5Im„0S¾ÎF#<(U&ï ~!u¯Aàg *̼Å’²p´ÑðÌ”IuMúŽO<ŠI^æâ5µz¦~nAƒ"ÍÍ‘Å„rV ˆXT¬$ ™¬Kj–dU™ŸKY ¡Î$“”)Ž Ñ„¶§)¦7ÒÊÜ'š÷Áñzv ¸s³Õbí<Ô¤p¿ñQDoh!f™îhÿÂAyÇÎ)>6ÞsMÓ`yerm¥æw0ðX­Õu¼ócb}*€¤”‹HÖ<ñk8g~—DÁQ4ß%K¹eÇØb^®ì ±éV¹sÂ[Ħ…K%ž·$ÏèìHÕC´9bŠG¾’1Ap< ¼z»ç´3ÄzEPŽ`§ÚôC‡ ë×ö‘…ˆìºŽé¼„ÏæØØí½qˆÊµùæDEèÊÕÃ],Ièì(ëâ ÄÄ%TÌZ÷ ·je7@D­àP% dï=éÁ‡'9D¹çú~FÐÁ·Ã†@¾st¨ñ9N¼-¨³q >(hÓº=úd12ÑIi½ÓÎtºp€Ál¡=3¤ª'{&ÆèȤcNæÙ!;ž”¨rõ°“¤v: J‡&I M+ÖƒOÒíwíä0}‡¨’D[·ºÇÇÖö}ìž÷½ÿüñŒçr|k”žÞÎöŽ¤7ò'‡r‚²ènÂ%W^ë5òÁœË€˜ü¾³•ÞŸÓv t•TѨOE)àG?úQºÖI,Qmê`œ>ø`Þرáñ‹_ô÷˜€Yºä’KX"ù­o}‹Ö®]» Ð&óR¤‚v}«z*4`ñŸéq}A{a)%§ƒŸ®0×iõ@‰µgQëä™ÑϘת#\¢ùIèÙ™ä(éCÙ°³¸¢¸¾,ž¶ygñ\òCÞísÍË÷‹nlA;ARQ–Qì!Uk¢Ò8kgüD7±€x¤q Å»«£tT'þÇÒCˆkœË›|ŠÂÊ=Ž̳‰"Ö~ˆ€ [„˜gVµœ‹•?„i4 áR“ËŠ¾4>xHÓà7›ç…ð™©ùi‹gn´9ó&Çõwr `Çö U¿óÝﹿÿ¤ ™&?‰íÛ”©>Ãd&N¢‰‰ÑBZQ+1Í°O8–Çôm9ãÓNûÓ ‹¶¸TSª"m+Þ³Øï?¤ˆ¶£9t·=ƒCÆboK“PByáEæÆ­™ê5½FmŽIRàl…‚P® "‡‰6„`šº:Êy. 3VîJS1#r•ËÁ'CL© á­1½N•ñó¦7$y8lx¼–¤®÷)ãZ*5¯¨¦VL]H9ææ5&fNeþL|Oæ\ÌرCùnZT1ó§M‰Ó˜ãrtež¹öGÃ;ä6$9J9Æ^ÇuÐñXÌFqŠéj=Ò‚Øž Îú"ýG¿XŽ‰Rö*ë¬|àgEÇ-s*|éWéßy0ð ›Ô}ðŸ\ÓIŽCA–™ÚÙXÙXÔµnÌÅTCÒâúÀ\k;Ó<"Á½žÖÍc0òœR¦Ñ,p#ŽTU£y `Ù¬¢9Ž_®œ@¾S´\UÕŽäÆLÛ#ý“äü_°¦jš,R²¤§>ô3‘Í=Òw’¼/bº˜×ÀØsâR)§ÞqÝ"´ñz›7ÍÐ'E* œ„¯0øx(º:+܆A§ÙµkšAkZ€ØœºÔQaßcpL’aëdÛöÚ Ó*E¥Ð tò426›sœ±AByxÛ$­]ÕKkCìÖTj§›&Á§zCÂALh„â…: 䨎'#H]î^ãP¼Äè?㺑qß½‡˜`MrÞŽ mÄ„X¹¢‹Cü²Ã}nÄÉ/¹ùüûAìu“§>ùOrç~w×mÒ¦h±·íš£+>ÿM:üßgÞwïµtí—.¡<ÿ‘–CÁ{ZÎìê‚ .`‰#lÄM›qÒI'9•×üZ ˜(Hp-©}h,î¼óN_€ L0¶nÝêCëqã7ÒGáÁ˜*<ÅŽA¹`ŸïnA=íy¶š¯ *@«H]Åö,TêYBK-†`eë˜!ý)'wj.Ê 4²CɲTz–±z=ƒ-s9ÇôQÒà5šx&3"âön ì•î„H¼1`ˆ‚ Óp„}'H×üq²è,Qd¬„"iœA;g,IÄ †—wÆ/Ø_»?¨ˆaRŒ!êŸå~½±¦£®>§éÄ„€±Ã³ÍŸ,\„¦ø«²ƒÌ8«4é4 Ù"ã»FôQcf ;˜Ù¡¤©7ê͇ûÞÑÝ¥ùSÜ?r™v·„ m°6hv>ØHçÍ1çh‰ mNf*ÙÎ Ôé2¿Æ‹Ô_*øõ’iºhGKÚѪVe1l|ßbÏ]êý‹ÑÁ¥')‰ÍŒ<0´Ž)å:ËL{LsbÂ…ä§5XIš»¾p~ñý8ìv-DÎÍ·^‡œOµ1^c—ŽÆ2“ˆY¡‰Ä}†ûF0nbò£f¨¦)( ¸K“²‚¶L:+“d¸Ü4ðnDC)+PúÄÂÒÏN³’¥¢Iˆ5Q'XGÀÀô«¬Às%Ö'°¸ mFÈ[¸00¸’¤‰üLÙR``c„úaö@ÐPÑkÖçâÇ!M<‘'K%Ô]ã:—êáȦ™U1¹B;ajf!®½½É––z=eMÏÜ|»Lôù²eÛ$Ó†Á>1›FôÙm÷8ÌÐÍn¸s•Ó$”{z*bšS¯ë~#’„]ÐvŒL{ô&¶wRy'ìæI©Õèx<챦Ö:¤S)‡AÉ¢FCÊS­­®‘ÅL¡xy˜@A…æ&l5ÜÉXHâU*å6ïDH^8œ*Ó‰ Ûß‹ òNãšù|­0ˆ”ÓN#ƒZŠÎén€áL •!L¶ …©ˆ"~õ–‡пÍtÝ5_ |ÿ´}œù«Úa°VThïu=^-é‹ŠQ>+I|ÿïÅõÐYlËãP‘ˆ±Ý®Ä›tñøB  qòš2v¢…ùÌ¿ÞñŽwäÂQ¶«»Ý½"øH—Ýyææá}ŒÑrÊï7;‰vʹ! Є¡醞áñ*©äÒnR3.*´(HrŒš@…}æyÂÌK¤ò¯Ì¥Xˆ MÌúx–Âøq Çwvujä9!ò T¦÷Bà FÇ;;ÌBTòý¬ý¬Óαšû^aBÏwg¸v0ßòð3AðÙ2æØÚ6<ÐÅ÷ÀD’#ô9 ÉO_OH<* …!rÐ0þ˜aK˜àß mS!ÍôlmAÓ 00­Bw.Tl¾±6u¨Í ò‘­PØÄ*fÈkA’D£]‰†‚ÈIµF¿IÊì>ìSg#1@Aä¥Õ‰ü“ILËÀÆ•3S€6D~Ö~JÂüj1-¡¼Æ¦n§`þZ,DSZýnw_ñ\Q«Òê»û¬¥Ð¶…´=æk„D±fƒSKC½. û/úS(ÎÑð8ý"ü‹#ÏÙ]Ñs)­bkgiN™Â@#ô[×¥$§p¿Í’p³&ˆØ²Hh±B8ÒZáE‰mø-ê ‡÷0°(KT¹´TvkÞõ£ ÐŽ˜&Ôú´rŸ†˜­H¶v{W“œshU„­SS®Ë Rm3öÆl‹„>òh.¥”‚ùzD¿}?«fËBøZíâžhˆY¥¶ï4(ŒZ¼Øxg»à­ )`xE¢oZ'Ñ‚Ø´åÙW’‡v'BËDA"tqWZxà²÷q 3(TZDü”¿dºHHÑ% 8¢(–Ó0ß½Y©8¢c¬;3 í;/€³øÞî× çÕ^”B$µhÍ¢Í`ÀñAým¿Ý¦ÜpZ‚AÇ·NjNÄÏìk0sÍÎR‰n% 5_À»÷t‰‹‚€¦ú²BÐg z JìHRcÒw‚ºÀ5G¨u{4{ÕìµÐq¹×ñH‡>vÖÐÑ~û®6£G7–ظÔ ‹¾Ð8”Ò¼$d^ÕDP ƒ1î$'ãêx…ˆV0e2‡0ÛäLeIËCŽY€#hq⢀)€V“ uCk°ÎÕ¹>#>R–³3F]£Ž€x4¢ÎÂåC}%e$ûùjö?éÕÈ R™$LˆŒv:ð…& ôÈ`XC˜„l\ß1/R.ùçóèúk¿Ä“t×È!átòÒ¤PBÒ¢øôÜ\ƒ~»yZU¾¡ ¡… ÚúÆ×½Œþù’/Óºu{rò3„û4@0òÎw¾³©_ãÒNz¸P±ko¹åŽ®…Xüˆ˜eÏGt,<ß´/ iSZµawÀÇ ,T'Tï–f¹š1ÇŠHjV! /Ssð`ÍG9ôŸšh•TØû²A³«ß賤ó¢ME_6H!cÓý”:”™ŒyŠD6³$"x~§#†eÍ 3K !Lv–Sýv«i˜ü²FÕÈ´]œì´-æ¸ÝX Bä¥^|_1ÔÁëÒ]Ð ˜fIô;q.LUµ?žªÛP Õ5ûîÁn¿¡EMæO02½töö:‰ÍÊnßflè³êèŠ9Ñh„Ðã0;€…F]£îÄ=ÊiG‚„ ETïnèjó!¾:%!”. ƒ"ÀS#¦%6ÞRWŠ*Ì,Ücx¡†Fo¶cÂÑ{RÚ$Òùà¯N³ÈÇ æ]aîè¼,€4‘ï&ÝNâyGTw€÷IÉçr°> lÍð,DZ™nÅ´9®!a‰[ˆ!kU–C£Lãaþ¾×t>&†.<¯˜.þ7 ‘’[¶Nø±µ‚ý.X§\ý5ÊÞ# kþ}V/ _W,Øúο|áSo‡¤@Ä̲ŒðXEû¢¤ ¼â:G÷q"ôT£[? NÈMs”M~$/‰hGÊ<…—`´„ႹKó²J‰½–L5gmwŸ5–Z×ãd„ÊTGó+?ߨYêÞ¢X¢>*IL•À·™‡Ö7i›Î-0îñ9ÐС¡^ÇMªÿAþÊb áö,L0aÀ: fSˆ’bþތɿ°¨`'¥…ì«¡ªéé.± fÃNòb¨Ë£ýÀ0É3@@îhÒÛ Ç;Ô'‡MmÛ´)8¾ áÒœI” Ù¢8 J—Ì0ûnàXÐYq­’Ø0oq˜ZÅfh˜,»¶ÒI4{c{v $¦7%¢Ñ˜Øi¨M37ƒÉ´(æÞ*G\Š*Ô¸,¶©nÚ´‰#]™&φI’¯¡À4ëùÏ>]qÅÔΔ¡Ý¦ßn£_ˆÁhw¬UYHʸ\ÃþÕÝÌF1±gˆ$(1f²!Ž–|•H)Rø€:ÄABä>ç I’h3ŽÜ˘I0’ä8ˆ`fe°>kfæ¢5y÷rŸÙÕê!mk)U9Pw§š”e&¹K$B^&ëÌJ…‰a™ûôlÆ :Ë>Ô¦NtɼŸ™™gsä*Âfo5i1´(£c3ÜhDñëAþŸB„ßrEí¼µÓ°þ3µGÀ ^n¢/ÍY<‹i^̼ëûS3kÕ¼I gÆ'Iড়„b?ÕLr¼Y—$BZ F†YØÜ>2Ÿ„K~Öy^@:ŒæsUÉ!àeÖч½´Ü#£3Ù£,ÇÜF¢w}%½Pç§g9=³™±ôØ"Ã+k]LÏæk‰gŠÛÏÇ¥iŠßº·@‰ÇRž¿»%Ò}±Y¥ ŒÏrOÑÔ±÷R&.)Ôiïæ·ä¤@‡õBÅþ¢"Z¤¤È[’¯ÈÏ“³›ëÉru4?É*Óùe Í,òÿˆFµ£¢‘£w¤ˆ‘­…˜'r¤+ͨ ÏÑ éáò‰àY3šW¤ƒÍ¯J´ X(ØùjÝ›^YS+%Ÿ…]ÓÓà8íÔÚa,28lŠ£íZŽC:›*E}¹”"@%Ì /BÇó×Ya³5÷þfú£wæÇK`;Z“R÷æ³÷Þ7ê¯jDnmþ—TÈؽðÝ€H)«&^QP±TšÄÌ}I5è7€Ø] iZ,ye6kÉ-…‰[HïDeâs*šy¾­há¡Y¹~­ê4h n»Jê`žÄÕ‰Æ,skµкÕX`ÕhÁ ùå9¢Z—T| Ëê8oïËchÁ::%DuUTIœ½¢ait°ªuq`7ßhƒ¾y*º¶\I›üE¸•X3‚çÀ\Ùh:‡äu÷ axÕ)%,:%Â+ßußí·wEü­îº{— ·L›%På°IòIð…"ýð¨93¦˜Áwl&p¯Õ-ctL®Ä6/S¡ukËž Ú'Vƒ¦§%Œæveö‹Lm& ìì'—Îb4+­“ëÖiŽŒ…É”èð`St¢Ûè÷YÓ•KŒØâhÕ¢‡·Oë ¤¼PV9©ìJ>J¥7¸C0ÍÚ1*aA­ Æ>ÚÇ·G” Äð Oz k?PÝÊ¢Q…ö%‹‚ »n)Åê@t­8¦fkœ½Y²åÀCOê€R—ÎJDø‚4Ѭeg«“3Az[3ÜÅjÀ©‡ú|âA#ÔB„÷X¿'ýõß¾67hü#.ýo~s Ý~Ë ððÑc8ˆÖGêôdJ:×8B'Z ˹?ü0Ë_þå1ôÿøIºã®Û©ÿÇ·øãÐ>˜ êƒü@àËñ Ú<y@ DXyá _Èu"ÒU|í¦M’ÌÀ42¸¦ÈØ-Ï añ }!æd·Ê"Àí‘–xYÑWRb$Ì=ÀEœÃÆÏMŠÈš·i!4 Qh&•ˆ­Œe8U9¡LI’ç/¼¼*É('¥ŠFl>°³#ï ‚.a ¿æ:”‘‡c7 ˜ÔÅ0`Ýš†J½¯Ç|Z¤M}ýnçØ< ö–›€|‡F“A"B¼#’™– ÏXK¡>Û¦æU’å6ÕfúqU&•I…rë>s3á(«V¢TN}z½“Ç`¡ÓÃeáx#0uÇìÄù˜p‡Œ¹åýb ß6ÁJÈK u5qÊÂ1þdÛàOØï™ó~)šQ6“$DJ›ä@«S Øn:)2ß\WbÆIó•‰OØ CÂQcš_ ÊŠ=¯cT\DZ ó/6çn%ðXÄKì<¿œÂLh9ynËÚkIé'ž°0ptÁÐâDML~'RQ*aCêÇ–È£ë|Ä7øjbú½_«n18ão*0™Iá[&ƒƶ!)¿Á"¼zðIý{Û+TÊ"í ÙÊ%Ã|G·Ðš1·¦çææi8ƒ¶¯‡¥Æƒý]>AÛùÆÇ@Š¼s]Íwv·€Íq‚iÿ<üMÌåùµ¥ì³ÈÄ¢´ æQ¬ŸÞ5 ©LÜ’¦yŒë¡AÙ mqüœøàH¬œóº7ñ’Ô ¥Rêeá5çØÜ3Ò´@ú-†ÀG9Æyddš5©†ö…Ø°6í¾új’h‰`•áI¦Žâæo#}aBn!>ÚU¡ÌT¸Ñ¨pº3ùZH ËàwVøDý˜)—ÒèÙ$É8Î$êoøhS»ÒŠ¶šOVIµ/ }IJԇÆÿh7Ü3fæÊ«ìói,BäÙé´P–œñ½‰6²ÞÈZ¿Ç vIx6“Úè(Ì͹ºvLÒ÷‡&³óA{ÒíÞgÝšÚ°aØÝßÍ„(UÃ=‰ÿ,<ücºzVÓGλ ÷|0áI;ÔßAÿý“T ˜(#™ÐÏûƒ+ `ÒÆm°<³³³œ“LÿË_þr šŽŸÿü—tâ‰'ÑþûïÏÇ…Êr~X8Àù/}éKì—ßñsÑV<÷†nÈÝ÷ä'?™~ûÛßòsj¬î¹?ç$„HnàÀ„k¬Í¦ Áù"ñY 8ˆÁé#UZI2*K±½]J=Ë)–·¤»"ý$6ö"m‘Ü awæ¹dsQ¿L*ÊW©¤4QOÍÐ÷“¥í7þÄYy/e·cfÀ˜é€äù_QgGŒH¬CJ±ÀŒ€ Bp`ƒÕÙ¡Y[…©TJr ôð²@ÄØ?¤”h½¡_@G 5]@OÖàš³:åm¶špŽµ/åª&Bk“¾b1âö(ŽBD™‚+îpv¿ºÚy×™ùc <øÏ$¤&ÑdiiƒóÕ«âðjÿÁdÀ4²pêçö9àa~ å<¼Y„ßì ˆHøN¼ÛÖ³4:Q¥VdXÌd€—à Œ’ßughZ_y‘SÓš¿äeœ9ý.G[ˆÂEAÊ|ì­.‹|XdväyI  æ}þ:ùM{þó_@ósSnØ•»¶½­‹Ã˜ënUºÕ¡]a&f@ûŸ×jt>S¡AI}ëÐD&¦Ù¢7sþ ß"¦ÇêÍ¢gS«æëxÄK+£ˆ.7Ý&ó4k®&ðˆ E×È^×—F µéÒ,î4 `D·¸X£j†H&’™æ€Ïh’¶²Jr!lÀxmß9Í ò±mºšõ°°¢»Ì`=ËÄ4´À¾Z f&yïÔüS¨;0À¡_­˜IÖàܼäAA cUÕXÂ<ü±ºEéÒP©˜GÐä„uVLS£~)ªyŸ¦4w6²t–Ã<Ä%®÷ðvë%>Ö |,eÿoÅ/OJÒÇ(±bfû˜–jÃGŠ³ûP,¼/úÒ2Éã¾5«{yÌE˜DÌ´cŸé¬hŸ–S\€3é„Õ>Ï „˜׬¯¦&ýì÷–¤ &ô3ANz˜DæqÑBH¨€÷N‹fi™ìCÐîñø»?XþTÔwƒ)àOÛ7‡yÔ°ûÕ4PµyI²¸v­ŒXÅŒZD¸g"8še ‹$¬hÔNøV¯^ÕÇZ 4‘qÜ2NÉÊ¡®7uVÂSbgñÜïÕHY1Ã!-#ÚéÔôˆ>…È})ÎésMÉß‚:2áð½kWõDÈ4O‰ bݺ}šï9&ÙÄTU£qÁ„[ãê0êè(åê1bÄ‹I4ç$P9MÖýfö@ºŠ:úäDÉ&š10` j{`ë‰x0°‘ì±²‹†:¨ø&(¨jÇȬJm7M˜_aÆ›Îã÷ðð0kWðû-oy û] ¤ ü­˜H™6÷#+y<Š& \ƒÍÏŽ ÷™k+€ Àž…¿Å´Åw^*Qz$Ê#Y×£0Å‚&¤³·›MqìZIFúÌÏqÉdOJy‡v Ó›×4ÔÏ«>t#4†5.YÖìd˾œP±é6Áy[—Ì÷t°jxr’¦40ìú @Ñ 6ŸÈIf3bÿlÝÑfâkvçg0À\®UF_f2ÜŽµÙ­~"ROd@Tx8®'ê·"áá÷Ò­‡X¿ä8‰âª_¤dá#k8ZT­Z£<5Á·‚JÖ|dš/ 톘éIm z#‰Ùêln…¿xÓZhý³cb%UÇIÓL„óÍ¿©À8úÁ}½üÊÏÓÑG‹¦õ„7½ž®ºòrߊ@m |™H8Ì:-H³ctâûîºë./XY½zu“¶÷ƒ®}ìcãOÐßã?ž.½ôÒ–´{¡‚}¶^`@Xê™FmJú³LÌAè*B¾Ìþ×ÈúP®m~•‚æ>FÜÇvk›âß××áOPîkDÄ!?lG•÷Xí$¢Û·OæÖ¿–F$0‰×ZQ#•x $ÏÙã_Ã’K¨ÛºægÊÑŽ:5¿N"¾¥,éµlØ*±¶§ ¬«¹ŒlLMb_©¤>¤oÜæï1¯@h1íE«}ÔÐ-:—99Ј{ÝT橘עð»ÈF@½•†¿~¦š0A}Ý ýú–-üÜa'œš‘¬Ö­€†ýn×îåîÿÅ:Iß±C“I¦: ¯jÁ¬?¤‚ŸGNxõ—€Ñdq’Dõ·ÁÚ4FÝgJgÿBCìyúHYæ“`.fv†b‘·Êåؼɯ(ØDB Ϫ)­rˆè|?¢Î.mk.˜Œ8‰ò™Ë5¿¿´*–°³öuÔ‡ä3å@-‹«ªÖ¯í÷o·sdJâ `!tD ƒ´Ú1å½ò6OÜ-nü¶3œÝ îs áüÐ Ø ·r6Ç€Á”kõÊn/Í´aV€’ e§ô2×?âÀL u­^ÕÍ­8:V¢ægSæ^n–(+© _Ø÷Ç&Wð k{8¤ª™Z54›ªÀÂÌIeg9lÚèd-·ù öX%ÀÃLØbéˆÒîXòØÈGri>P°Æ"ÎÙ1{6ÂîZ1Ó'$Äu@¬žV›v«cÅ ‡kØ|?£ÔV×¢~<³XßR6æ¥näK K!fE·q\j»SÚÕ s,&ð4“»s'Ô´lj¥¦9" oˆŃ×nŽ#N¹ˆE6FÌ´ÆL“ds´ÍD6ɘ¿7>¨ª;+¡=XW´@;aÎæ5Ž2‚ðº%Öjt¨¤ÎJû‘e´Ýr$@muqTÙ"¥’ ß$Ú¨»Nêñ"ñûˆ”ÐrþLM‹ÄâÿÃgË;‹,t‹H»FÇœ,ªÆ IS¥3¤±ì“ð@Ï=“ïCû!{Cä÷d›>Û»¾nÔsŒ]bRoJ¼Ùd6iq]¥j(3µÌò X"7$:m¸ÝúGÓf•±­iŽ}´7ÚdÿæÇÒá‡A7îÍôàë×_Ëßï¿ÿ>ú·»‚o:øàCü3pθÞ#?’Ž>æùtñEçÓ}÷ÞGI¯=ß*–ðñF^í,¾C‘j´ð½èW€V¼‚üÅôu©%¦ÖýÞYm¿c,`¼[^"ºŒ™?“­M?z4M#p(O ó«yÄÓiÁ#êG¾[3òLìÉçÇiz>K>x€&P1—ñ\0 ‚?cÚ=ývmÝÇ>S¯6<øÀ³â¨W9ÿ‹$j~¢á|-‚ÖœDÐj6}HßT’'2PR—F]—õÒ)t¤Z•Lêü×;ñ|±º-T0·5³óR·Í{ðöh«Dô ¡À+^Ã$B/<–“~Fýæ~Ϧ5üúÊ $ î•È"ˆOÐ ìKW8 ÇšçšÉ \·ÀcGH:8Ðß!v“|nªÉÎX퀴&µôR9ü-œÊÅ´„håP§ÆÎhœHuÅá~„ä]맅±´dÒA´o«kÒÆ÷vc°œFfªÎ®ÃÝí ÔpìüJ&åÑÎb'Ôš@ˆBÖº„H >kðYšuNG§$qÄÝîxLF1Ä‹“(¿Qµ’ ´úO3B9öØcÙç¹7pþôÓO÷÷@;²T E Œì<þÑa¿MÃôëßÌ5™´,‹1ðñûëXL:²Ð±Ý*íÚÖî÷ÿDÙ5ÉñPi¸/bº31gôyAHLwbM;šú¬éÄ×10á¯ñ¦ÂTJ>“¬äÍ6ð‰ë„Ù•Øó¼á§Â¨sò"ÝØ ù€Ãcó¼!gY>@{ ³¬‹þÞ Áë¬q4kÏîïðëçû˼ö·ÌÓPŸ9™ƾW4"¨¿»CÔåÆ[É‹Ó)ŽX;Ð2•!¢‡0ô•hMø¤˜j÷q €º˜Cà3~‰Å¼ùõE¡­íæ§;UöÎ6º¹°æ#ÍiºÒ’h>˜F×$ÂL½Bt«Ì¬Ñ]cóÜ' •l†ÒæœÓ”¼úœ7©„\{ý7| ÜrËͬ½ð¢Oñï¯_ Wò÷OýóEô®wŸ¦ äJÏT¿â•Ç¹¿ciÌiNÏ9çlîÌoðq{ÄŽ¿¡ N¼æÛÑÌ¢ Ç~Ã<ôüóÏçâ0mEw®¾új—\rIS¿ÅŸ Û¸-³¿%‰1kæßÉÛ¸Ëaýȼï$o›ÊÍœöeH8RÏ)7a‘ƒäÕ€‘«äY`Få GaÂ3=SHCÚÐ$‰8M«'É©$ ^‰ŸÓњ͂G”öæYY‹ýƒŠ}aýV ÓÖÆÜñe­ª<«Ó` f Ê„8à3:;;˜÷€:„¼þU“bŽ½¾ J(hY£1/fNåT7²p†äO°aÆL§&<œÖV–"¿‘T}:,˜†2¹uMrz^SÉöRœÑ—%+UCÓÈT3¡ª0ìÔjóôÀƒ£åÉÆÙ"NùñZrÿU|¤Q›m„clg’¶-Íiâ×Ïü¼3½Xú‘ró5ø` ™‹2¦Ëœ“÷ìPíCÞÏÐ"9”f 2ë¹|n(l&7#L;›L™V$Ë÷q·@H•hQÞá©MX0B(å:r딨qòˆhfX{¥ý]F’Cäl¯Õ½æ¢߉ã5ÝÇ`ÂiNó©Ò}en+ü»ÏLÀ—£R'öZ{:ÈþžÓód_•Šy$Þ×ñ•~&ô÷veXhæq~TíÈC»àɾ}çŒcîgs Y¡ië3Ó´s2㶻l8„¯^ÙCiQðˆ 5ƒƒúƒ3ì”>ÜÉ„æVÉjg0• ù@ÂDAçouàvœèDÁBösÔ;âêÀàq‚ÄÕ’S¤\J)&©<18ê MOI¾±©š7¹Âó÷XÝÍ@*_¤†Éx´ø,[Ø„@Æ'Éý¶cñolŒðÝ@ªV¦P\ >*ÝN­ Fg¾žÐl-¡V€vÒþ…˜þÅêY¨þÅž÷Hh«£U_ÿßRVô¥´¢?çÈÄ›U)³!qiîIX³‡ Ži0åG¸’óW¤h%b{d˜^Ãï!Jg%¯.FÁµ(Q¥B圣Ã)K €ÆvGV6;‘c›š‘¬´–7m½9îÌ)ÓÜ¡‰Â²$fZ’\­BÌåÞŒ~§%yR&.0t!,><Ç“F«ÈÇEÜ n6ù[9×G9N4hNî%•v1Åw’¶ ÍÎÌù|’ÓCÂêŽNV—)g¡õfÇÍÙÖ$p]ü/|ÍUW]A'žðþ~Ê)§Ó»O°ñøCŒz@{C;f``~pãOX#rî9¤s?ôM–cxóü/œ;c)äB‚•VïØêšâ9«¹•>ó™Ïðq3ÁZJ)i¤#Ž`LHa2°»ÁäÒÂf]ÜŒ ]´¾/žcÊ’em{azãŸÓ.´ìô:y_DHýbI õEQlš•DϦí)¼B<ü÷ŒŠ%fh­ßò¿I#úüF–_æ$!FŽ¬]ÙE”„ètÁœ0îØî@Ã@ã@w@“º‘]Ý´¤™D¦bé3G+Ê<³%4±”3»Â=¦©Vm} 9jQ)ñÖœ•b-Aè&êˆnÎèõe&>-–åýZ­;ŸëþÛä´ŒïyÏ{èŸ>ùIºù¦_ÓÐðuäQ úÁŸì³iÖ>~íê¯åëøà›³Å÷ik—õášU+è˜ç¿€+ºêŠËsÃ,áŽÉçnŠKIs\x­JB”“XÌÍÕ[Ž£õM‰ý€Êš‹ÊŸU^RÞ ’ˆØ^,_¥ g˜ z­BúÇ›%W\ª/«•Š‚&ñ’½3ñsMöI&¬óÉ[.ßÔ¡@Þø…õ{ôst<¨ ³¨UC]~!›…4yà‘2PèÖ„QNò6çɹ.êLjÔç\ük#s9uHº8Á¡ëdHðǦVÀ¬fàÑÌ4zS°Ê %Óçw1ð(§iŽkƒàü“ê_ÜÌZ™7‚¥0èvLžô¤'yð8üí¯ýë\«>º*âÐ\)9BåT¬.iª·ø\^(@â—¿£Òn"fţ͹VZ‰G,VÇÿÀÃÊ®I¶8‚‰fº!ªñØß#ƒD^£¼ð¼Ä5uMT—ä¹Ù¼õ‡J9L b…§çu¸âãÃCãu€Í–Í t¼ú{$Lâü6°¿Ü夈H(jÄê[h5Y @ðë*ûÖ¡¹0gŸwu×ø¾˜méE>´`>9åÚÁB§0èè([ò1§V š“ÇŒøƒ’†rDÌv,ŒÉ9Yï©æ`€ú=¡x3LšK»P4¡/Òéò8ok-æV] ,TÁ0R#kô1Çråð#Ž SN;ÓÕs]ݵÜÅЦœp›é`'dA×_w ]阈~\þæÇåÞí²Ë.c?´VëIZ­€ñ„ˆ~Þ€FXÄôùéO:׈#ûÙ»Äý†È‚–üõ‚æ~áóWH^‹Š˜ MbgcÝSzšóGdÇEäÖ•Jq†æÐŽœFÄŸ ×+‘É(>Lbû”àû8ü4[Lk+­ÁQÎŒÈKÐÃzˆŽQáñ+GŒTüžÔjψAKt)2‚øþ@7؉›Ínn?Ÿg>æŸýŽ2Ÿ)QZ‡[™‰Ï„…ðÌ"ø!bV¥#eó0kýœ÷,Q“XXÔ4Áò¼æ)±½¼˜mIFvæ2òIâ`³oIÜX²]“PðI³"~A£úTfÍkÙ¿¯h)²àØÞ0³8û ,EàØê»}þÕ_ý•ŸûqÁšP?ö¸WñÖë'ùìg?Ë×?ó™Ï¤M›6ño”ýöÛ¯°vemáëšHøŸÚ:@ýX¿¨DZžÍ?uàœœãßp"uÖY, 1¿3ߟ©€€J¹L/ûëWò˜ã>´}öÏy>? àá ÿvEà‹µ0ëîvcª!’ççêÁgIÛÊ&ZóU6‡îRðZŠˆ²™»}=e~<èœÓ¾ÕuìZìÁ¢-Ÿ%tý`Ïf­]œÐbs$¡ìÍȾ—H§â e¹A$·¿'”z%:ØrŠEÏØAAød#ê³Ô‡º.·¿Bû"“(€b‡pr½Ý P f’…Y€4E wçè;d‘'l/”aAq¨B¡í`‘R¤ñPâ&¦`Ó¹öá²áŠc.Žt1í €„ÿ’°™Y»¸OdVFòAä@ô*\ƒ¼%`tÐü5îÙq8]û`à±m:§ñh§íhµ¨í÷î\—vÏÃï¾ÇL–uÓqǦ«N«TM”Æ¿WõKŸ‚1›šM–ôü?¶æb¹÷-¥[Õ³»íhWßr ü©‘¨°Z¥X"/ùŒÉ»yŸ-f¶CæÁœ•ãMº¡fVøœŸ’úܽ=}]£m¶÷t1‚Q…j%—GÕ’JîiœKÃØY{i >ZøŒôu—IƒùÓì{R®8Ƴ“ÆG¦¢Œ¶¡Ý¬qíèð¡€sï&D„}Nmwq×7gÜK3Ô°Ç K’BFÕÅÃ줨1z{:¼–É4S%>JÁßGÍmN’Õß~“Tëú¼k|žs´[¿­ÀHK€B9ã¯Å±üãlÆ„‚ þ˜£ŸK›ï¿Ÿ~øá¾~]qåèè£ñ÷>ÿùÏ£}÷ÙÇIF/jzÖÅ]@?ï½´bå:úÒ—¯£Žaè8øC0Ü7½ñxºøS—xð†á%/y‰7KE›p쵯}-î@ä>óù@°œE¥Rñïs+€ 0/0i×£>€alêr¸NbÀtê©ï¦¾8ŽŒ‡¦.‘‡h‰&ZM£©•J­£l5ÔT9¶©¶oÆüäö\[SêÞ•ú5&n.¨@<é õçªlѶP³Î¤Ü5‘–$+™¬ÙwÅ$Àùªc͘\@G¡^}?0OÕzž)”ªD«&ÈgyNâ{CI çmPzËŽëUñ©sN.Í[ÖÌa͹|V%Ñ&½g¦ŽÀ`DÕô*‰hÈ|M´¼–‡b)šÌ˜tpÝ ‡¸N¨°ïèƒ €Yª]Žèb^C‹ íØw¿û]ï?¦?÷¯yÍkø;ÖÀ¾îsŸãµ‚ß¿øÅ/èñ<8ÀÍ/ùKþÄ}o}ë[yý½ýío§ú§âu‹óxþûßÿ~>u÷¬g=‹ë(¹ûî»ùù0´çýèG±)ù¼$‰ HéœsÏcsP¼ÃŸø§îúû˜N|âŸàzðüɉq „Æ–”†C›QßG¦á^?KåÔk¶qVË ¥Äç|Á¼[JHe ]®¤m¯aGúyKHÞ£Rʯ v\¯K¨ÞF& ×GQ¿ €6Ӫ䬄›îÖ`V‡ziÃúA*{ Ꞔ{ÉèݬÊÁâ5'r }Dºá[ãõ•C]!þ¿ô¬U+‘ FçZ.,˜pqvu÷¼·©:0°ïÞ¦ñÈd3Ïä¥pÍÖ¢‘©ÕCD*ƒÁIÖ…vý=ôè5}Á¦/ZŒ <&9RB—­Äú†Ç«ºØkèUΘüÐÖ)v’]¨ÓÛkŨ¥‘ñ=ñ5 ýnu¼ê¤á%IaŠÏÕ›ŸmZšVõ`ƒf‘}g-ߡȬ/¤¶mÕKÕŽ´»',ðö 6k"­Í.âk{‡¥–ݹAö\/‘"FwNP9©{b›±…ˆfB†¼ QflÈ¢^*…M;‘Ü…e¦µ0Û¶•S‘´óц8Ç&V£ƒ2Yb¢‰J!„p’@¬ÛÞî’7€ƒ9¤óø>Ð+’:H± CÍ‹Úâ0^ö ™ÄéïÈ„<]¢Î…ŽÁÕˆLÁ^Û]_¬cÒkŒ§ÁÒïîH}Ÿ RGÍ3räCF£%ØX*bÇ;?;/!nU£d†ÏC$MUè×0^æ˜çïMÈ'™£ã}xtÌ0ló«Ì,¡àRÌã5Sœ¿¹5AIÛzZÑH& € Ü|ËíNÊx…Ó€œM7þð‡þÍ}Å_ÓWE $CŽ¢Kéž{ïqLþ7øп]uGDz6}ç{×q·Ürø¦×9 É‘tÝ׿ŀ`äœ~€A |8, +3K}Ç;ÞÁ @˜üm۶̓{/\ å¥/})_›`±y›ÿ%xʇ¶ç*@ÐÖ¿}űtÊ)§1 í³E6ÒÍ×2Û¬ˆxfÖxhˆPoÎ +0%>ó¿@Ʀ޹åOE`Ø,ò !‹å€;>’œœ-ÇÖ'z¾PŽ’{%ìµ0G׌Óò¬ðPa¸âù§õÓ{xÌDãpƒ2õ7 °9+´VB£fM{ƒ­j3ÿû»–Í¿.É/cH™ÙÔÉ `ÚçR©ÌZ^‡éÜ”ãÆ'ÄÒç6„ì×hã|5€“Çs þhÝL7–Èw+£Ç̨†¶¬ßEÞ©®´§mšêÑX%!*„.©S:¿+èv)ô«IYxßÈ$ÀECÛé9.8ŽõÍt /~ñ‹˜X>°¤ X-Fž³À{8`Æ ƒzðœøÀsQÇW¾òÖ¦Ø@(‚‚5Š:¾÷½ïùz±F±ž7o¾Ÿ®¸ü2#©u|œ×0Þé_ÿõstôóþ‚þãבC ôã@Ó“c´bÅ0{ìqüy×·ºó×2-z܇ðLùÉÈÝøgO9œ3Û_}õ×hç®Ñ`×0!fmO%i_ hlÏìHÅT Ѩæ"ÍJ\‚fºA30›ž— !e5“µY ð€üzȃ•i°Ñð©Y`­áÃ%Ihë9ïßļ„!–D³Ì¦[’ï¯ÞÄGq8jõJWëY AvMŒRŸ£l?aÚ‰m;ÛçíÀ‚Y©ŽäXtH2ÍÌ“,î~0õЀ<pŸšníiàCˆlJÚ4Âkñ”{ÞƒOù<VÀ|  `oo'í¹—jMTbH:(@–ÐxìØ%‘†úÝÀ€iòs„ÄèÑûô4Ù¡£@]~ïƒÞÔª]iÅض[ˆíî‰Ùñv÷Ø÷Và>µF‰‰Í\-É9q¶zf̬ l•D@sÕfô˜©YLµWñ$] Œ´ëÏ¥…å~oWkë#Zò„ç„T£•ýbæ$KËmÃì8˜)h]¢cù~†#Øìuu‹fÄŸš‰žER2É>6L€òž¾ªÎU©§¿›×"Ì$BHXFˆ:…ЮÝYª]åüÇ ¹üÿÚ{Ә˒ó<¬Î¹Ë·/½/3=÷URûGDJÔ¶ÉH€ €GПDŒe`…¤erb‚t”(ŽCŠL ;-D6D‡‰IˆEcË-‹”¹xDÎLOwO¯ß¾Þí¸žw©zϹuÎ=ß×=­ápjæë{ïYªêÔ©zë}Þõ؃¥¥yÎdŽúÏúã~Ý!˜"S©}BdhIࣅ$„]qh<:8¦¿uÿ̈¢…y‹5n£e99¶äÿ°Qï2½é÷œør%úq™'åMÔ¦R¶í‚¥YÊÌ;'¼U¯áõ äέ >±ØÃÊIÙ¯²N%ɪ¥ÈïAï@£\ÉËÇØ$ÊăJ38a-|e4˜†}¶:p®EÄ6­ÿT© P”¡·&Nð Áùtxæ\YÂ튙1±“Ò‹ õ~èC?´dÚåÊÌ ùŒüýhN¡€Œ‰õ‰ÃwôQsA£¡Ï€ú€è³+ø#õå/Yr9Ä=€”;îgþÂφcÐü8ó6Á0-¯¬º6è8I§-Í3ÿ²fkÚˆó(,_õï?Þ]ÚÕ0ò¥½ªˆ÷âq»<0õÁ(K˜weYädâ™å.­õpºþ‹ƒ£cHŸÂÈ*¤ÙðQ0Ñ’)ÓkºÀ[uáb·jö® t², ÈÜp#¦i[us`¦Ûpº%zæ¢C6™av4ê¬[Z[rsó}wÿþ>ó)+\ÌcÀ๻šŸ£ß•È{¢,køH€ÈP²RïŠgº ßÛév¿Cÿ‚§ùËÑÑhÞp˜¶õ'ú1ªßŸ(›¸„‚æAôBçÖüŸü$='4/¿ð ¿àþ£?ûç(üø_þ+•„и<ØØt_ÿú×è˜a^÷`¦CÚ‡ .ðŽ1/ª4zB¾•d‰À*ifÊïJÃ5³iß(€Nz/YfüYb݈–è‡ÐUöQÒýÏÄѾò¥Í ¦êŠž¥ÀZW^W"º­x>Cç$‚¦xY&—aCp9»0“ d:5×AØYÍpÎ3‹Ÿ?vš7h4†Œ$­ó %e& ¾"¨Á.¬(DªÁõÂÁ’#ML8祿ù®{&!€K¸ÓÛ:.¤6D,/…AvvA䤾֧—Û¹3¾l×®¤“?1ØŽ@{ƒIZ§1оÌ*³$ü©kë4¶Ýs`ëGA4² `b8Ýß”d¿úY÷=UW]_êž±z߬ëëJÝ;ilÚ¶a¯9  8ɵZ6*Qiîm i¡¯.™P»!¯R­"æ ‘k°¶ö½v£b˜`¶SQäOê_d}õ@ŸBéJ ,œÆsu¹ú°(u›þ84Êm`#Žs6¥\ŽÎì PW/,ßBžMh#â[ »ë¯…ïÕÝ­9ß[m·Eã`>ÓffÃè*ƒczÀé` ŸcµqÇš,‹¡J Ë…aýÔÑŽiÂXãfzM¬'Üf˜!­¡Á膚36µÒä‚gWæÈdc2Ç! ã…&”JÀo^ }Vuôcm©Ò“ÔÚlbÖª×AcMÈ;Þñú mˆ2òýÏÆýʯü} Ï[¾×•^îŒaV’’ã^ ;¦0óByþùÿ‹˜ð ã#ù:þ¹Ï}ÆýôOÿy÷?ðýîÿñ‹ÎÃWãÅo}¤tÄ´™Gb~%×GæJmÆãY l|áù/s£Õ¡ÝíR5ZÃ(„îd“¨Ìø†ðEdÙV]ÆÌÅ)Ç g°ñ‰,˜È¥LÐzÅX|G2ánPç†rLmLÄž=³­“Â>b4Ú~–‚šSKÅ ²X?‚{Ua÷bSaéWº†úŠæCëJÍk¼û+çú"”ñôusÄü†ÿCN3FA/&’õRê1iZaïÄL#4St ÒÒ"J_/0’x'Gž;"æ“5$(}±ƒç°¯Q¢Œ¨G`aŽù2’d…ãI´³ßþÖ½à÷ÑïvBÄ,Ò–ô:aÔÕlo,ŽÄvn¡œ?¿ìž¸¼J*«ê8'ÑäÚëu\J ¡_[xáBÐv9“»hhÁˆL„oÆ'fM&ÂÆ—ûÊõ—Ý÷¿ÿ^ñÃîWþ÷_sêßû ÷ÃÿÎ ç×e Z‘öh\Þu$YÉí<ÑlõÜ'fÉÞ•å_ýúÈøÅ_üïÜ_üKççò}àý,Ä s9ÿî^yåe¢sиüú¯ÿ:?ñïþi·°¸L¾o¿ñÿ·N@z7Ï>yνôÊ&6UJ ãUÓÀ /;%sLÚ׺Ðàshܱ‰œeù•ø‘ º£PT¾ƒ¾ÌÐDv£ÐÄ£IéÝÖ U}Œà ™[^è‘`R}Ri®HÔ®‘@£"æ©>¯åýºÔùá$Ù8˜˜HQÌà>$Š]ASaœib“CÌ_r`¯¨çÊ…ERy*ð(TB"„!•ÂljcgXêžuÀ Éq\Qõ9ñk÷ÐkjŽÜƒ­A.x‰0Á ¶“b(fÔ¾ký®—† ¤ï8áÄÖÄðŸäx•ù¶ŒÄ,`Ñ$õO1;Gz¼lTïw5Ïœj»Êð§Š-©>Wç^ Tï«1UbY-)‚šê[õØ,€‚råÒ2…™ƒæî›/>p§ ©~½¶1ð„iŽ¢@…~!‘Jê æ¤Õ'r Ø##{­_!!`.QZZoQb1ŒC»1G>,fƒò|@³±¤`Ý‘})ÖðÖ."WEÍ ¥>…¥¾pf®lªåÁÊ®hIV¬6&Z‹s}2ׂTp}©+!ž KpŸËiÙÚKô«Œ#ZÅ|ŠT%öd’ ‰m;‰.fÈdl{•¨Å L"ç%´%¥ù>)ò‚|þfðA6HÅL¢]M$Æú˜ƒæ‹LXíUÓO5¥™:‘±V¨z‰m“ФˆÌ†^SúÍóùÈ0¶Ú¯¦ý &Û½^7´¹²ÈŒ*ñžþ!Hh€¢@F2ňÞm&ý@¢R˜Ÿ`~€Þƒž‚&"RG¾âˆw`ÚŒÀ¤fß³õ A‚Î (ƒ;GV=–x'!êúD¿È¯Egô<„Lñ|?Ž ù$øÏ힉)å¼"“ä¸Ùñ²çSïczcª¥¥ £˜qŒîÁñ8ðcGœZë„Oè|@~õþŸ€°–åmïú€ûçÿâ÷Ȭ«·°êvÆîü¥ktL²öŽ"ÀÈ90æEÄÛŽ"@‹£wuoÅøþÒ/ýîÇü'<=ù }ØøÜðMßÐ=ø™ÀOÑó@¿ùÍå^|ñ; 4áò²(`Òún2WÇpNHȹ<<ÈtISÈêÊëv°oäj °Ž]­Ó:XSÈØïD÷ô((˨‰Ÿ‡CÉs’âo4¼1öÓ¹®lz‡¾gAFVÒ² 6ãüT˜ÿö„q…@îxθ¹âÁÉ€’$6²eÄðwoãؽtcßKõº´Ùâ!nßMƒ¨*ßöÔiSzyH©‡óx¸_Ú’|ŽÌ2lJýõž·ŸsW<ƒ×ïw‰ˆiìnlæÈÒyëµw¡ƒ7#ø€ÆZ—õõ瀞#‰XFÈ\Bñ ý¯}ãž»ugïÔ1µSŒuõ|tœ¦T5z¬©)pR4w[w•˜§ú^U`QGÔªÏÑæYªÇm±×ä5"Rà£-P˜uÝ™5߸h¤ßuý;i;7†ñ/X•¬ o잸 ˜èÊuG‡–¦Éžjb Ií1È8Tit ÌSp€ïç:2rr»}ÿˆãëõȹs~ž;ìK¤¸".…ÃÄægw­Ky8€$Dž nTz§›j#:Ì(a¾‰MnïlÔaØ ýŸêî §„_NìT31Éx(½ŸDl²®L쨳ÒZù G´D^ ÿu$Ë9ÑÖ|pt#6»‚ö @ËÍ»‡Sà£n]µ;Õõ_=žª#Õ–2â?ÿó?î‡ã'˜-/½ô²D «f×.ÿ\õL?ªþ¡ú0eR×òc?öãd·ý`ã€|ØKDW½ôC¼½³#ÚGáz9TïÜW^øRèBý¢|ñùç¥ÑiFöâ0ëB†ýà¹h¹Yf†¿hú÷Óýól’åŸ}mu42Ø·°«YLGcê+ê‡DÏ'ÝûK¹²ßVáRàZýÃ=Ç£hÂUÝ—ê„I1EC7•÷e¼K˜mÃÔÊ>tW»ý½x?¸seiŽˆxZ{ÏÏ]€0cà¥R¹Ö ‘½À½ø€®ÂÌ>oܨÀ‚¤H@€‚!,:»”¹Kk™;·ä8m€h¤q?BoðbHQ=ñ¬#Éñ`Bf`ž®ùú5!øsvÐľæýÉÊcVÝŸmD¹º±¶‘éR÷ApÓI5›S¯‘¬ mEÆå™gž¡OÄ°š €‚ºRågª´ï§~꧂ Öç—…Î;bbÿLtcRP£ß¹±G‹£íA5ZÙÃßýÜ:©l…ˆßüö™@C€ð’XLZ~®]]q|ïEbêô~lØû^ÛÀqëæ.05;¸€A½W¯®ùÍ‚ó¨ æ*˜,_ýú=wÝßßx´a~S×¥ˆdU’Ò$©¨2×Uðc¡öºê÷T]Õ¾Ô1.uŒ¾íCê¾YÒZ”eÏž_ÍiÛrR Y7ž')÷xí™'˜‹‡‡ÓA Ú0ukëƽ#¶«$f!—ã3·ØÿãÈ·=ïØ‘i‡œ½€ÙÕ²ß|àV(Ýpœ  ¡¬9–8/T0A@ÒÀFÁ>Fð퀶q@¾%’AÝ7zÎ_Íþ NÖ}áXÚ AÀsœrõçÏúÍqͯ]0â›D8ÿEa ®Cž˜hXb¸áéÚhìJ×F&Tæ¡2\ŽM´8POVs Jr¾°ôUðÁ}åØ·`q±_zÇ 5úÉB¿AÁFù„q…ŸÛk÷‚ïUh¨+½Î/ÍœW³è”m³zNÆÏþìÏRøZݯÌÀˆ:F­®Ò˜!ç‡2ýÐ^¼|ý¦ûÂóÿÝ÷ËÊ`É ÿkßðço¹ç¿øÿºú^_‚§Dãòå/ýc qŠD¥÷£¨èÞµ²²V2£zòÚSnksË·ù™p ÙÜѧ}øGÂ1Í{ò9ÝõnøÃÜ¿¯~Ý÷ñëî¯òÓ2³ðW[ÊäÃD&60ëõ¿çzÑ®ù^Ü!RÓdiš1ÛUª‰Ö„ÅÈü;™W¹älA}ð«‚Y%$ kK½àSTêS@ÚqE%IF^þ‰`¢l²Å€=+W`¥‹%3@¢ H2Öhê¢+íâib•ßоâ9ŸòûþÂ|t–ÖOh;à“†OhÁ´Ã˜L½-dƽ}DBÕ ¹oHò¹€÷™H²6˜C!A3ø"¼hïŒx>Q,Ö(xÏ‚;ëLaÔ¯u€· ÙÜ>"!챘ʂwZ]bÐ †îü û L½›‚ýB8`OA4<‘&‡Ò_ô½+É1OL'è34Ö˜3Jü€ÆBóüûÆýÖoýµ0€Ðº 04¨>-]Ào0êú[ËU€(€h‚Q7è "\á´¬zѶõ šøeà~œÇu I¨azµohGÃýâ~;Fš“D?QêDÁýÿðÿ ˆ_ˆt÷¥þ)ÿÄÇ~ŽxÏÿí§?I@ JARÿÞp„€cv‡}`èÏóÔæÁìÂJ¬qìÕ˜ÏpØÞ÷órçÀk]÷Ç$„ßØ:¦è‡ hŠðæïÒRæá,vý‚¼úq%Oîíw8¿ÍÌ_L†¸)ñ¦ïLÖðöàx\ JĶ]"¼&£ˆäó|i±[ ÅKíÎÍÍ•V0ÂÒbó“ÉCgT9äàhL‹¹:0y¬6ĦPËT^ÇG‰Í¾¯ëÆkû´P0xˆ˜“IšE‰}—ˆÐ8”*Åâ¾ï¥ìd¤5‡¹˜˜üäÕÕ ·‚pãµ]ú|ØRÇŸôÚ¶õ¤®«j)f]ƒÒ0Uæ&få4ç›ÚhÃ(aþ]=×wš|ïþöÐêýMm´aîšúü0÷¦.HLŸ¾¼@-®Ä‘4yºnׯ‡••¹?ÍLªdDiÛ&H´àÂlcƒ›ïÅh, .Ø°ì­¯Žc3_Šº•s„Úèw‡î|Èv®-³}26H€Eh?ºÆü#æç`[Œ s¾µñtÈÒÒBÔÿ u$<¸MŸÆ(öE†ˆ¤ñ0bz¯ LQÈ¿)m}¯*bfsÉÏRPÌø Ojw2a'üûd.:I fÍ{ žµ.’ai´Šz?&„¼ðù€ùƒ2ZÀ4 Á6|„¬µ‘²PÞûžw¹›7¯»~ô/¸âPF>õ©OºÏ}à#sûø'B~ ”¿Ù#²Ö/ö ý£ð¿ðMú ‰äÞû.îÿðXAùåÏ~Æ}üã?ç”9ÿÂÿEºÑ0ñÁ¼›æÁ'?õiߧŸ ç M—öïÇþôŸ$¿”k´|îóÿs©8­~ô§ÿSÊURGç‚)Çü ¤é‡-Ì€9w\oõH<ÌÇ—zæI¥>Çãð¼ Ë0¯êH¸t¬uÒ†T¸C Y/øn¸ M9¤ó+€Ö^Xï’À0íþ`œ“ih#ù}À”fœÎ%R·¯¢ht,Í—³V5½‰»lšGuù ÙËY[w8î„ð½¸J F¸ÍþÐ-þRû?Îà|uO×P¾©zRMž˜j ÇT£ŠßçÎq÷îÞ,e Ï©ÍgˆFl<Ø¿Á"L\Ë÷t)gGDZédò€L$L/€&´_M¤žÌë$'IŠDSøæ¹d¸OìÛ2ßë;‚F¡äóbîçë€fm õÍÚ‹ìy5+ÌŒ0††%ã~bžSÆᢠØÜ£ª“ï<ôjl!BZäpPE–P[`cyõâ"Û` ±Ònx€p×Á}qBÂ3k}êÐÿGÏ\[ Vö±÷ö† /|u‰cö#”îÁ!÷þögÏê'>9Å‹þÎ+[ÔïYå4`A#´Ý\‡6Ý“’ü·m3¥Ñ¨ž³õ¥˜ðY`¥©©öÛ«ö¡®MõhŠï‰ ˆBÂçî<PŽˆT8âRyRcÖ´Ù¦Ì"¦§9ߦ ,ðç®.”À=è=Ù6Gþƒ$^«+ó¥È>ÐxP†V#=ƒöbËKÞZ›Ûá } Pí%ñþÁ+`Ú8g ñï¦hS =ƒÉÑDÂþbƒp¡l¨‹ÒzF?¡ÕÙ?d L¬º©‰0@„lO'lZ¢Ì UåòÂY‡ïÔ˜ì:sXža8£8Âeɼ HøX<“PD—)Ý*ŽæšÙvÁH5òL´V Ew7ŽK¡®ÓÌQz®Ì mËIêÁFŽk±™ccÖ¸Øø5³qS]ºñÑÑÍôŒ.‚;²ƒøýÂ¥J_ùh?ðýú+/óq¹›µ"™„Êu­ALªÐ&€ ÀL¾ ý@®‘í­ÍÒõ0[_C³íÒVi>hÿÔwƒ4lºFëß2j4—+L¿s.$‘cs«©Ç1êü2îì AÆÂ=ò{‚¡Ž‹³®Žõ7‰}À1u€×úCw~ÉÂX”=¶a‘Ê …é]e|2N¦ÁGª<ŒP°nÒ¾gÕ v q 1aÅ ƒAt,`Ñwã`ê Ì%‡r„N…Cp?ÒÄÉX4¢¥Ð>]>Ó':¬]ÍÜÞ›m?'[Ž}ÔÄv£ç_U˜Èês‘Ÿ¯ß:`q–ÚÃÕ)Ϭ0ííu&¢'¿¯NòÆ\¸×•7Ú |5€õ×ô%2Ï(ÐÊ1ZU|šK ©ˆIíÅYëS ºÖ˜2æºf®<—á; `¯Õ=ÝÆ;‡vÍ •Äç? €Nž>›Ÿ s‡"G ÇB!eDZB®—#XF-ž¡+f¡ì3dz/ëVi°æ}Q#ºíÝñðdÐõyû]1ÍXxÚëD³Ñlyq¾¸tnŽ€ CíÁ ÜšCø8·@ ’ùmFÒäªÅ™zÐ2…h»s€ üL`爗ƒüp&‚ èÊ¥%RMU àú]’&@µzé**ø‰+«äl[GI¸½Ûwöj“x¦Ì"t§•4¶mê@±Œvp41÷mû`Ë,Ñ`R÷WïK1bç¼ÖNÍÊ÷6¦C&ÃîÜå³`®ùþû;PC® ¨Í·ºûN[NÊh|š½®#@Ú æQÇeä×û’„%w¡ÕQh̦PÎû£Rã¾0¸Ê$£5ø$瀃óËfm{Qö“s0cŸæ6M¨-¤p.Îj7µ_„ã–œ© R-Ø<™3óÜZÆB(œw€0€¢™uÃÐu¢ï½Á`RKÓ ˆÈ¼‰=R³W"ƒñ̬èU ò„uQæ2ÖcÊw% ˆ ÑMh ÈW%Öׇû,ÓñÌJãq<‡¨Ym êÙ!Lø(È‚Œ×X´5Ù{Ÿ[/ò LÚÚ—6HzØçÁƒyÆÎ^ÌSpåÂIOZ•™€†în“$ÕMB¢}oóÀ™Ö¥ëNß(®¹ûàÀݾ˹<`£€BQ³|?À„\¾ˆÔî«b’™Y˜ùûv) á£M%ÅÌϺ¾- ÐcUÂY×fŠp4Ú:æ»z=öÃI‘µº¿Mi%mïµ÷Ûs8‡»uÉ¥+à@M€Ç~oû<¯P±õásbLu`^ñÄŧÔGA@ܤU:»Òµ•ùR½üºƒtß„ƒács¬2ˆ!â×ùÊR¨&™ ”í<‹kQ§ÜfWÑL6å¢XHÍ¿<ß)åö@_{ýK÷v8ã7àÈôÀJO-xp \ÆBT)òP0'ñ£K-±O ´ ›u阋ÇKL±ãq^Zž7#í$¿‡¨f>FœL 6ÁP³ßóô°šP€k0ŒB¦hVyXPñ(úÐt˜5•ìgfâ 02v3,¸Â E/! ‡¦ÛVXË™ecèB¹MÏóÜͤ1 À]z(ï\T€öÓv'€20ü#Ëb8]þáŸôc<áös㳨mÂOQõqv»^Ê»Ô÷Lî¸ã¥Î*1æ$ud‡•ß $ØŽ¡_2Öb*m\8Ÿå‘‰Ô@qÊpVpz'ç ø°ï"297-½W¶‘×Ã;§ãpUž«H©Òw_áûEöü㨡éec2SBAXpÌP‡Ò=v$KÚ–2S&é~GB÷FS-ºVÔŒ£sªh&ôžD5ìŠs±}÷¶Wò¡©éŽJÀ«cRÇsر<éþ­ x'm(-(Èð úWÞ‘Z¤€FèGÁ‰öTŽ9†~J˜7ÊI V-}1aŠó>J]qeVC÷«L¢&´ô·(wr8*JIÍšö”YB¸6{²­¯métØ)~"ÊPcÝçcŽ¤•õæé™°VÀ“ zqD.žNÀÈ°”¿,$=ìFó¢/c–¶Çàºg×ùA 3«e¿<.¶·pÁŒK£®MfìK©5V·'“ï¹E2+{Í —5èIïaö-xö&€Q·wÏ¢‰0ËšOh4ðIš†ãq "@&«š];Ê+ƒ÷€åˆ×¥á—ɯ,,;ŽÎÆ LY : `’… š€pÖóê95Œ¾Ž®Ô¯c?¿GÁ !§k­o¨&ÉäÌÜåër Ò€ b0»C2c™Üœ¢6àF@üÐzPAW¦)X8×ÉÁ|úÁÖWç("ψՌܕóK”« Zà ò²ºÑ62,C݉†m;˜©Ë#–æ0ÈðóxæTm,œæÞG}-JÇžïd²"üÉ5gW:ÄØὧˆsÝïó+™³ °¹=Øwµ}H-õ Aý‚Hm&mÀ>)š‡—¦ÃwÛÏõÁšÅøÏmûØTꀆž³Çô÷•ó ”$Tr’’Ñ*:–ccúyOôµloìˆóœ£°~ó `¨ Š…MȽ_ˆ`Lèxoíðu¯÷¦$TðÏ:mHÐJh¥Žb¹Ã, f•ðÿPBi 2¬ëÂ-{-9<îQ8]e]¬Î0uåz|n¾ïŽeº%ÏQgécaÞ 'nìQ_‚ô †f6†Ìˆý!ÂrŠÖ#5?N[NJ‹¶¤Úë÷™v“ƒíCÚÄà`i±¨¼‡LÀoÐeF¶D ãJ š„fæñ®$‹™Ú¹ê~W¡BÝý<7(ž¿™4£³úw­丣#L8:Üœ`®0 c¢ŽqrAX^aHÉtÍ}rb<6 ÄÖ%`…r…˜±àü!Ù BW;²ð)Þ P-«¼»2gS” >fíQ¥{; ?-Í®˜·Â<+H>~ßYXèJvq ÷{Lf-ш|꺔ɞü#š”®fXGT*ÉÔÎ}ç$tƒáDþƵûý®þÌÔ梕ä>TH+ÝÃ@GÀ°€Õš¤öݺq|î©uwîÌ"½zŒÅW¿q7ÌÉT9Íþßt¬®¤ž¡m=D~˜˜È³{‰&òk"2ȱՕµ|o2^4$Ì’$¹è›ú6Ž'1'º¯ /­ GºC;‘ö‚.ÍÊ´žV2oÄŸEÖëHB[°—²gï|j­@ä ë¸k bŸY›#¦v˼«8“¹>~{Û¾0·ïHØÌrA=¨¤IAìÔ1ᜠ÷7Köш΅…A¡î<ŸG•ÔÀÏÃÜ “ ¦`ÕÌÕ²Ô1èMR{þÜ«Ä6ö‰¢ téဥMuTAÄg5£vœˆ·6&IF>>f¹Y„£,ÕmBmÊi¬¾f³Ïbë¨.ÜÔõO^\ô_3“s|xð…ýºÇS",¿FÏŸ]¤kïr¢t{Ý   dg׃•¾a³¼Æck@„Ž5Âp@Ò㫹ëÊy¯Ñ$;è"²p„¼»É‰CFwYóÊdB5Ž8ç%ˆ¶`ø?<3‡àd§F– ‰c]™—‰m8Þ–½Ä~íÌŠÛ¸·ãŽÊ×Uî£ñvå÷ÁL0?{v%ܨš¶†-ølxRs{wDDµ´™#d¼JG$´ ê²Ò¦HW#Ÿ%øêÉuÐxpr¹1å ™“í&'<:šf`)šQ¿#ÉâÊ “œ‘G‰Ž4V¿iV`Ò§á®äÅK`zwvWÿ#§¥ê»ó¾w]$Ư:óä¶Ûß4ŽmÛý¿î4ñ§¬u…QÎu¦„¼ÖØ$ÊBón«] ×nJÇ‘ïÇZ„õøx<“¤ˆ—]"†"Ñ=X“ÇǾ©èXœª©W¯“…ýÀ‘ý7GSfMë#[X˜/êTRÐrœõŒ?ÎÃ|¦O0—ªú£¡î¡Ÿxzã`Ê6Œ6ëuNÀCs&)‰¼´Ƚ‡$MÕbHÉ =—‚0—«KsÎÚƒãscûȽzs‡ðã*úàe‘mã‰pœwI,þ·Êi Ƹ׉Žé:g²†;Ãp—™+-E¥ú:gª¥2ÃÌ31]b]:m;m™ÁPEÛ±æXZÀôaáš1ç ¡?³2 ’èn7›ê™JªÈ•‘5ä ^5/?€Ož—“ÐQ;£¢ >xàÓšhin2!uå±›~'q Âx…TÎa|¥0^ç¼æþÞθv¿J•¶×6íY©½ä$|€ˆj š|˜IÞéÁ¢ãGCJu­3²lzÕé°„…ÀvN·…YÊXÍ™¯Ù´.ÎÜј‡ë‡lM{YjO×|2êgBÉ%BVjˆu…°ÔþÇ…óËîòåU:D¹_ûÆâU ÉWAi›=6µÿ·¹ö$ïqÖÜÉD0A€‚^kùýuÃZÎâŽìhûÌḳàðλAó Ñõ?!K¡¦çÀ¹¾×gžŸæÜñpŠ.âZh9z]œeB“†G‚«mt$š»6Ã;•D BÇAcb“«s«}“ôF¦tÁ~Ðä€ñ¿{ï`ÊF/ Q³ 1Y"õ£súôJ 0 §m¯ŽÜ-% ÌÈ¿‹h¦[‹sS{Ú}éúö#3·z”¥:iŸ½¶ê^zuÇ=ªRÇôŸDóÐÄX§žïdmÙ« ûœ öþvÌVÝÀؾÌ:߆觞Ş«)ÑžRÇS}9‰Ôå4…JÅGÄÖµò¶kËc^Ö ¢R­zÉÿ\X¿eø…†¹|´&¢o¿¼é®]]ŽŽá‡íŦxvM}?¸b¡ØÙ‘ÙU·â »%É‘Ð*ÏÊ\æËî!o gW»!Ò•®8#u…/ 6L<€o#‘à¹pa`Ì¡p•ÜVe'K|¦«ÌbT EÏ@,.ÍMT{wl œßv¾# ³{oãÐ?ÿðDÎŒá)NÉà¼Y m‚Sþ!Ž¿g1ÊN!Ü}äa‹:µ¨sp˜ŠrAóÀ`WÇ?«$¦“r?W'’„aÃ>…vJ¢‰ÂÀ£yâã*#Ï¿‡ æX!_H7:„+HÃZ"ˆ†ÅÑúFÎÕ‚<´F‚M9ââ˜jºM§ñ€©×+CÊmã"x¢pá"ù-­MçJãŽúÓávH£I#=½taÙ=qu…Æñÿú^kóÀ¶LìÔ˜K¤Ë›1r-pd<ʹ4ÇRoÌc1¿Rÿ*ξ Ò\‰¶•Bö²Á¸by¢Z uPî™wL€`Ì6úª×FƲãÐ$x«Ò,•èçh>‘¨AáëÁÃô—çÊ\áÂûæÆQ¾r"~]E×YaÖŸc>Ó Ôj³Ç¬€©:«B ˆ<‚|]S¹äëä!–+ŒàŠA¬vÔÇ<3:L`¬ÐÌôüé9Ç>;…/}bRÄ­PèßA9‡HŠ÷Ãg¿3Ý—®w Šñ:ƒ ›׎&L?È·DÙìóߧ-CÉIÒ´”’‹àƒÈ‹`NawldC;FgP Þ½ŸÎ‚~ñÜ¢[_áïÕ™p$‰wȧÃ33»ûeÍ’"—Çúú‚!82ýSmy)ìK×wÞж%jp˜?8˜­-y” k]}m˜ý6@aÀHµŸj;f]ßÔ·T?ªmÕõ3ÕŸjiË(Vûžºï¤ï{؃ ésO®”¢KÁüŒ_G*C¹t¿~‘µW(ÃWoí¸«"²êˆ6wàA L!mˆ@odCïæFÝœ±äô>ExM¢]žž7_˜uîñ抌Д7(>³Û™]Ɇÿ*èIÜfmêtÜ€,ÞÈsëŒd{q‰Á‡sQ‚”I´«‘Øåîî¹Û^3¥˜·ÀÅìÒ¤Ýëu³`[­×äf]Ñý®NêÕM‘6Ñ —5äœæ0f% ìCì‹™)ºžóh6l7¶Â6+ï»í*õÌQ2ÌRǘLÐÔÀ zÙëLKšUëAÒèŽu6—~žÎ³m =E¼É²ðü8æ¡4(\™j’º2‹+#…Ü–©#PÓÉœ]uc¯"ÌK4KH+JÇàO6)šÍKêö€?öO„7rçîž»~s»=¬MI݆šäR:&`ï–"s’,÷RÈ^ã˜NùCúÝáJŸì˜¶rþ”:êáìç.H/«e$ÎÀ=‰lÇÍ…hFý®Ê'˜‹ž€€˜“p½YiÿGþˆnLç¨î~9 hIPó<Ô ÆFµ:¥@E™A<<.›o4 ¦ÆÊ_óþwžãþø:®ßÚ%?¬Y´µ-Ýo:Ù¯Í+—Ý=ÏݸµíÚ8¦¯zíª–ˆ(ÂÐÂ\O×À±ùÕþá øo’„½¯ÙÕy¼×¼° Ú™À/ $¹]j¯câ0!mE™IM$â…r•ùÖ´—ÚqÖsöXŠÇh7Z Qpe¢0í6M}¦ðCû4©dÁÚ ýàeVnŽYk¾AT0‰¡{sÉÕÁVeÞk}8dÁ~ul54=kTœèHØcßk)WŒ$&Ü)êÖEW|l²R»¥¡‚hÐ2 @`& '¤‹6‡“ê6wa&5"‰)~ßKó‘ЬZ`ƒþÔ¶E/*Äe{gàî<8"Ÿt˜Í8"øÑ{ú‰U·º:'}ñ¬úAn€­#·¹ýÆ3¹J•“0ª§­7%¹©[Üm y]{uÌU]ÛöþºûR„&õ\uuÙvëî«»§Ú[†™l&l}eâÉÇ9¦|;ð“ï+=GÄ+®Â?õÄŠ\ãhyßðóö#I6ÒËç9/ª˜ˆbsûÈ]8+•Ñ‚ŸÚ€YU)c²cê>%.ôÚÉ`îJr þŽ,ÇO?s¾#ÔîàhPj¿p©ñdc=˜T—ÈÙ–]âX´·ÍÈi}¦ŸV4–±M.€Çi=ƒ­z}TI^÷f‡¼Å#Ì_Ÿ~<®RG«z’ý9h¬œ¾7k’åø›rfºÆ6pF…+wU1}^¿×1UñgîFFª²ÌTQ¦IA”säS„M’J~5D¶4:V§S6­ÀÕœ Ž¥ÞU©Ï™¢ôŒý8 mTsí’FÒ‚)Hdv˜Õ,ÞÊØ )IÔâà„šYíŽU#÷&ÒÖlúV·‡Æ " åÛ<.Ýã§÷=×NRsñßöš-¿û{7N‡‚ÚxÆtN»¢ÿˆš2ržç$…؈ùÓÇ.Ðc€ïûÀUz¯¼²ꧤs~ÌW;îÆÝÃÚ1.h¾1Ðd)yVÊç`¯Ç3Ž$ë·&:ŽöÚ¶¥nN½6‚ÅTý¯}>IÁûž“ˆYUÆï}VFô……ÍÂîv˜EA>>@PÈ ”çåPËEÁÚ±è a½U8WðuHÎrT·E™­)-ÊY³ÛÉÊ{x ˆù~ñ«Í£H°¹>ØÒç%ÏÔ€UÁ£SçÁɼ»t–7lÛÕ;ô çý5t03{Æ$ ¶‘Ï<¹Rb„´ìyÉ+¤,Û»Çî\^/Бj£ ¸¨.ÞYĽM»³úÓ¦¿(mûÚÔÇ:"SwÝIP ,µ)©þ¶½Ÿ6¿Æžò@ü¥ë[î$¥:®W/.Æäž«CáŸqõÒrà@„^~uÛ]½¼"èL6¶ÝŽü0DzLèÀí{ûdvÕ3IÑ6œÌ¡%Y[*+Pš‚óˆ¸7GÔ;îÑ•`òk@rºééË@bŸC(B}«4œ›¾?1(‘»+¢}®³Ì0‹K‰V×–(˹m@™ÜÁ`è^»³G¹=Þ›Ù›±41øT³,Úpˆdünƒ “øvƤo¬&.‚9/=pQ+b€B¸ÖÌ¡ºÏ"B_DvÃêÚ¡>î[„ØDp†³Ô§ŒXH÷9'ˆ!5…T ~5Y!ÎCC¡N©–19&Ÿ²ãºš­õ{ŸD†räáA|Ä0¤N¢#¥H\Ab¶ÊþG¾$…×Ä:~6äìM¡Â£¹VHÓ~©ß‘æ¡Pß,^j¾'`d ¦IQ»¦mÛu ¢Ž˜Evß~½‹¾Ÿ!ÛIßeÓsVë´u¿ë¹ur^”›É” <Åå‹Ë²Þ3b<^zeÓ=smÕ$u´Î·üß•‹ ¥DcX¯¾¶ïÖW»C7Bþfk‡M§–ó˜7Æp ÈAâ´4/É‹Ì©1Å×DFòø}õM37Ü`9¥ ‰Ÿ*5·R'N$èÑòåùèõÕ‘?†KÞß;v¯ÞÚ£°ƒ§§o•Ó;ÖÊ„£¨ÌÈħp½C öSΧÂþ<^‚@Ó®DDrÈøùrä™^bGE-@ANÖEq Ä;}°Ï>z™äã¤Ìs%˜ª.ãN}"ógR¸R4,Kçg 2ß(ï957U[¡W&¿ ççÙ—'W•®,`Ô1Læ,°Ðc'#Œþ Hc{øF·†£‘Oû®)§ú©vUfFÁ4a(@µ+áy# 1LÁá”AW@wðÎ{šdÕ1Î{Ÿ]+¬T‡ìÄ7Éßqá\ZóððäÅ…’m*ª‚³ÒÍ»‡!ªU*“:i=..y­ÊB " `ã|ãµ=·ºÒ'§ÃÝÁ‰ÁÇwc9 “ý¨ÛÕÒV•Zìm®×c©¶ÚH­NBX²ÚŽYõýQ€ØÓhFf]É@ˆu|{åæ®{òê*+¹‘Xàb˶_ƒHðùÄÅÅ[^ œ|EeÇõŒ˜¼Sý'ò oÏþÁ8Ò‘‚ëDd8K+˜©3O} Öë°·¥})Æ©Í~ÔtÿÔǵOÐüFç¥~à»È_à0ú‚€·êKHßžìRT#ÕŽTülT˜Œë9çH^òñCÑÈZ$÷6QôÙE0¡ñùwý’?¤y Ú$V§JÔ^¦QX·mòdÔÈk…ùS¨Îä…ý^˜Û{h’5'̲8FªÌäy3“Qà_£|MÏÑòæ³Æ>ùVñ±ñ$FÕ‚ï:ªåQ´YÚ‡Óܯýl{o“¥Zï¬R×îãÒxœ¦€ ´‘¿^€¾ ×®¬h#ÄØ|ûú¶{ö©µÅDÉD·wŽÜµ«+AŒrä%n7ï칋gæÉfÕÙsþ¹e áv‘€êÒ=Ãñæ‡hX XH.8g5žA‘扨ÆãBˆµ“Œ¼¸V¿´‹p Kk‹nwkŸì[cáÝA¥´(yEbLÿKÌz„Ø]Z¾2º¹€ŽÝ¾»çîܼZ“ÌÙ3K¹ßìÀ}7–”–´t¤ÕëH’(!&3 )à”ë&"-´ÕC2QnÅU$‚%’| 7…Ž·k£)èP ‚~Ž§â•™â{r1¹¨>?>'"ùì†Ä‚ePDæX0Ü4hIYà<›]ÅâˆYY¿†9õ—ìn¨Ií&EðU° mLYÖlqÿŽÊù ^ï2K ÕöÜë]R‚±êþ ÞŠ;÷;!ùã ’;$I6ÞÅœ1ïK²¸£†LØyEº²¬kbÎí×\§p d‰Ëôûþžçø¶]yV—dIòU~›z\Ä>Ü¿($HVeS B© N2&¤Õ)øªV‡5=å([Á?$Á Êa{Sã ú2ß÷ÓöYð'™=7¯? @€k L£I§šWBÃvp8&aDS‰´Ëmuöî§W l\»£©H.Ȳ¼Øc͇˜– "àhòi¨ènyÄJAØ`º… `c“³_¾°@ÚX¸˜[Á±í^874¼>Šò°ÄäÂÄ6•×CržºþQ1ÈEb£¯+)ÍÅ,‚Vm§M½')³î=Í8=ûÔ:igç‹9M{O^Y¦5©t›´h7Ï£TçÁæ¡_{î9Nlœx ¾óʶ[_í»3«=g2˜Üß<&bta½k$Ññ&"ˆ¤æg¡ÏfW©m zLS!EÂ9»è¥ñk ní슻}ãe6/Uà,ùWÐóÚÀ|ÉÙ|¾úê„Ù<ôïàúˆ|7¬ÿÇQ8€´UƒöQQêJÓú¯[ïMàD¯‹ßãF‡÷d`p´Ä{UgÙRdµÂ•Á@Á3WÍ ôàt¢G•á}©—ÌÔ/`xb¤µ*)U€R5Sûy\ÓQÓ† 0 €¯2Ž¤‰³9k,]àrD#ÀƒŽL.ÈôÎßÚB!‘{b†ãÌíx倩í÷2úœ¼Çlê|ŸF¼zÔeÁ LŸ¹¶NÌ,6n¾¶Æ„z[aîO³ÿ<îÒ$@Äû‚ô(zs´ÎëCñUH¡ð§=Ö¢t„Â×—ò, Æt´TçEáÊ™·ãð½Q›åg*½nÈØÀKŽL”¥ºgâþg­ž³nýgL"H •îgyæì”UKVêS¹”›ZÊá|d¥g*@b¿'*DpNs뜦hþn7wU„nüÞÆa,Ró´'YÙól‚ÑýåÎÐ<-z½æ6ád¢œµÝP["£¬gz?—Î-[{ÓRYÕ|€˜ Æ=àÊ/%„ÃiXòÇÆöÐÝÛ:„¥>¶Ž¨1„æeÛ´8)awþêk¬õ‚#:ì°wwøx«¤Ë,†õ4 t±Çª%%ñ±çš˜Ž“^—º§î÷ã.Ø4O¾±M±ïáÏ!¾H!oÜÚuo{æL)bLlnßßsÏ<±Zbb !½}÷€ìs/zaD)<¨cIé«·¼ä%§É„® Gt0!Øðàÿѵg£¢#ŒFuCó`ŠF£q¢þW<ÊÝ! …˜ì÷ÜÒÊ‚ëV¢î¡?þÙ¯ßÚáÍ£aN~/–&æ¿í˜T™¿&¦°ŽéhÒŽØsÖ,«ƒø“ÂpúQtq±ïßýìeÚY×$'uÓ“²2.ÎU´'äÒÿ"–ÌÈ(„rþÜ’»ÿ`?Ô51¶Þìç¹&}f’Lû?²¹Î§iï`Ä~µæX½²Oè| Ø}\îãwùÙ‡“Ì 3b`ƒ#ºŒ­æá®p̓¡:³¶7™j»}ßû.æ=ü½?¸M‘€êö˜ÓhA§@³nM¤®ý^òsx¾ß)åáp½!Kë É H4›uáÄŒ†³kã=U€ý®Z5ûêÓjLt ‹÷ ß<)Ú™V·ÑˆÎ:öf(ðáu›•H’á’Zz›€ýq\ˆN°1Ó©ŒµdüÞ<@;crÇ€¦§€H®×!?8tgVz^¢Ù/…ÖCÖ¹¿9 p;I0¡‘ß‘·cy©µ†n!q2“ Ù? LDº~$`êµpr ðã*ú¬jS{4xôRœ×» ÿ„ FiiGêúY`eV9-a8 °x«ÔlRï}Çy²UæÉD빧×K<Ì&_»³ë…+*.à;ž6àü@É !ÚÙ‡sH!w—:.‘wI$¾l>„䂬ÝpdOܱï]®/K¬Ì\`Ž¯ËŒmfvY‚ ­Ç¼×xÌ/ÍÑfªÈmº/_ßn õýfœ‡§aÂl!GÓNÖhb¨õ4µS-)FõúvL ç°ÐhYYž¹R2<_.]\vgÏ,¸o½xŸíØØL÷ƒþuMÀ£´;[}BáVíIS)ŠB2»Àȇ{Ì‚ãH3“àÌZêã‚5‰¡¦<6ÊhAƒÜ®Çû"Y' æÚ\W$®RŽÆ=J Øí–A1šc>®m©u›R'׺ðÝç8<¬ôí_Þv»žŸ¨“ Ÿ´<êõŸšÇ¢ òñ +ÀH&4ñ˜ü\(¯Ê¼ 3”6µW$€÷…뇒=õ>,0âœ4lëOL.À®Ñ®ëSÇœP¸ÞIQ A­õ>êýÿ$s©©¬ø=m÷°}€GUH›¡fYºþåVFÛZ˜8Xt(Í@GÈ?B%†õ†9Öæp\Ìk€Ê#ä„Þ@ó¥É7‘è°})k+}r.áÁ&|éì<™Ièjux<؃¡}™ 4—/,ÒÃÁ¾ìœ3X¡o#ò—oìR$,šüþ„øÅ„…¶doŸ5'%<»¬/e”Ÿàîöw'3²¾˜¹­ƒö}Ÿ%}™UÚ09£½x«´/„¼ïçJNé÷½ÔgïØ=óäZéZ˜U¾êµHl¨vÄjG éèK7vÜÊb—L²ŒLVÀ€£ðÙøCS¤©2ªòe 8äã™4F!r³4ç*x'íÆRiöæœâ×wÜ¢§IÁäŠoBd˜|~û¥M’øE«@ujm¹Ï^ì¾ñsk½’4ƒ¤W¾‡ƒINÍ7·K‹›<4­æø:§X3€1™™Ž&r_ÑèÓ“ZÿìlÎçº8§¬Ù,ô†`¨,P²yCD;¨ßϳɤx¬Q¶4ñ³*\LÈMþ7öëÁ» NêFË„waÊPüÚ¬U¨Ûöúj‚'ó•;EcÉ‚æwªýçWö94IlAă“ÆêCsˆ^“ ŒC—EL}%–ü¼Èsä5{ž‰“bL%ê>Êøš…v˜xL åj qˆ°`Ò±ÃùñÃÙ$ùÒ—WŒêý©{ÚHlý§<ºÌz¦jSc˜"ˆÕsmçãKá­òèËù³ 䀊Ÿ·^Û£,ä8NÚËŒ5fÜôn$˜TV[Aðîy 0²¤ÏõÊázP(8÷ BvCh 3­LÌK`¢Zä~çÊH}<ø/ ™°•Y‚¿k= ô¾f0¹:–™Ì³ë nÙÓÄë7¶]Sy !Ë8¹Ý½4åýHÑÑ:‘¢U³¤ÀuLš=–jN»$áÍD‚Wvš²$¯(H —*ÍmD©c²˜ë³,š2Ô©J%Â,õœ–"+8ѼqF D a! ³±æ…ÈABó+IF9aˆ$‡+eÉ+'\ËèSK–é–øꙄgé­nF¼qù‘2dûÍu®G@Ä™žb“„¹Ð‰¼W—È$ß|ñ¾{#ÐâEÏ8lï½þÀ¼íº}ß»/ºŸ/¾´1D¤£jI1*©sut¾Ncû„“Ä¥ÉEf&ð6’CŬYe¯(¦!Fê®.”oX9™3 ½|kVkfNrZ+ScæÔ¶žµ"qÍÄþª}7',ßO~X˜v}ý‹½²4|o˜³–FútèÆ"Ì@ò(°„éµú‚ð˜s°™‡mË,Й:ÞÄgÔ•¶kâü¬J8ºø¨÷NŸ§‰×hÚÿ›ø=¯9@ÈÄfU÷Ìâ€#¤Zs+ÛFWü=æ92–ÞŽ‚¨v„òFõüWj êxüVß5? Z'Q±2— a8\]oöw²/Ê Çu®€%S&[ûY 5¯N”¬Ú#JŽ“±;ÑêໂØ* ÈÅ·ƒ€¿éú SêÉŒy¯ÎåSÚÒ‚çBUÃ¥>&XïdÂÚÍÂqMrªÁ3Pϑɤž]8»\¬z‚9×Í]™°úÿ6w½Ê4ëx)t—$–wï”&<&Þ•KKdžW"ƇñqXOõí@g/_¢O8©[‡ÏÔfcÏÕ1ÞŒü&)©ªê6²TýMí6T{MH¿Í÷Ô¹TÕ~êùÔ³Ø{늞Çžïîp˜iÁ,ÀR­£M9 8y«<ºBšB˜"ð+¯n“Oײ1«Âkȸî 6› gçÉ5†3e Ò/€‹åE$/ëDÂVÄvl‰þø³¨˜z™ cÉ"!_œs?Àž¿Ûíò:0·£?ßúö"¨ÜÝG?ïv>Ÿö~©ÊoÙ3ÔÄÑ2Üy6½Šmööœ+…ñ–2)!”²‰>i^&ÎÙ°¼¥„Š®9\oj N#‚mäc¿¡­œ%À}ý^.IDUpÈïk2f³ÍžúÑ™Ággvð"Ÿ~Wxç&üíO)úÝB^NV’’ÜÙPìtØ}ÃD’ω±¿Åä¼vyÉo<`¥WHGý¸p¬øPDfWØáÀ£êÄ^èÓoÏWïA¡¤<ægIêJ“d¡ŽÑ? €ª[ÀMçÚêµ³êL• Ýð oe~ⶭäk6èhC ê®9ÍfðVyøbͱ”¦€X}ó¸³ks¤åtzV.€69~`¹¾b@Š‹4cwäö½´Ä ’²ù~&¹„*¥æuW7üÖhFÑÓg"íêöºZ7júHDïÜß'?—ñxÚ®õaæÛi®¾^¡œOZšh7ŠÒé*mÅqr ”ÏYtbÖ1{|=§˜ûu)f|M“2ËŸ1o‘ÂÄIî$s"öSvѯ„¨¦cVšZ–Ês¨ƒ®†¿eD þK¤!2¹Òd€rŽ“ ',ËKÝò€‚5=«-)˜.ä¨jas‘ø‚Äþ=ŒßG†K¯ ÝÎê}Õk«××1¼ÕrvµçÖ—Aï °Þ¼wœ ^&îÙ'Wh^ÝÝ8ôôòxªÝÔsÌHW¯¬¹sgÜ‹ß¾_b(›x‹&¦¾˜kkJhH4/½ë¡õÿ˜4ò$š?D¥ëšY[™÷B¢`q¦õ"„’nû>ÞÌ¥I˜Òtïk¾oCÌGA„DSB‘Ê„ ïYdÑÜ“1ãqxO# ¯Ìthú1XI%^qîß‚æ 8yí^IEND®B`‚classes/sa-includes/images/bfcm-2024.jpg000064400000056776147600337620013710 0ustar00ÿØÿàJFIF``ÿþ;CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 80 ÿÛC   %# , #&')*)-0-(0%()(ÿÛC   (((((((((((((((((((((((((((((((((((((((((((((((((((ÿÂÈ "ÿÄÿÄÿÚ ŠÙ®—›Jyl÷¥s–9´¦š¾z3 À‚´€(V• (€( –è+Oe=[¹¼{—Šùºy­»‡Š.>F_†Æ³ë=gšôÓ<ôP/  »Ï"îĈ’¢*”àT¨E[üÂ(¿`REpŒ¥š³N˜ã‘d’éHóˆjC–DÛ½ l¶$q#ðGÒ[¤V’ 3WYQdážÞ·íà{x (õä{óä+@=Ž‰œîµª‹ÅJÉÆ—õÄ{s]#B’ûà´]*È!­¶È‹¦ÊÅ ¨Ck²ÂÏ1/X¾ió¤Z"ߺæ˜ùx×fUÒ,¹h’cú¼]ótʱ…´1vþÌLEK¦»Q»Òͬ{dlõÖòÌL•ãJ½»#ûãck›ËZ—ˆ¡Z@€P V€(_(T¡T‡Ta®[ÍÄ<« #Ï[XÙë* ÞôéÅ]¨qXÇÒ<4‡î¶ý¸å8ý„|щôwÏ幦Uóšl·ä:=¦¬Pn |9ï9ú/ù®cëæÔhrý?hˆœ*k 쇞ö^|o Ý“ˆ€/—&ý3prDþÁu±ÉlrDÿdrêtÍÈÝpq(GÔ“†€ ô­;¦£Ý²5žF›}¡¡ÕÏ"ælk7zŸ[ãgŸ°Ktô“˜„ßž ÙÙ®sÑáf›ô¯Î?Gz'9ÐLZ;îO½ǶñÁõ&êüÌŠtN#tß2Ø1Îg“…h:o2”ïæéÿ/$û‡÷ŠÎ ]·Â~ƒ‚Ý'Œ‘ÍÇU”@7g:Õv¸ÑÎ@_ÝF)R;•à˜–dúSS½ÒÊ ~Ž„#?i˜Gwx3<Â>pÃ÷àý+@)5›Ì?g¬-B—D@´7_D|ÝÓŠãXgXàIòâu£ÞhÎ$ ú‡šôŽnrŽ­Êú)…&ãòÒcÈú;ÕùD°ïÍ,°ù‡¾q© Ù܆})Éercæ<œméÙx®n„ê9qÝtNŸóo“é×ÌcéÇÌ#é«Ÿ0Ü>š|Áèúuó-£é÷Ì>ãÑ/Gš€¡‘@Óù„ˆêz¾}àè–u"W‹¨°h:œK`Kq!X'LñÕy'&Ü›üHW³{й^ÌŒé€ÚËô=ðù¯¦Fçè\¼œèóóO[}©Ü¹ÇKäæ “UCc“ÆI"ëü€Ä:>è¤ïçÿ©8™ú7‘õÃfizÁÉá¿EqrgÔ#[c澵ȺiŸ²4úMö˜€7Ûˆ@ÞæÅDÖÔRѼʌЗåÁD:&¾b6‰n§PP/€Õ:—£•Ó©Dåd›"›iM]½Ó„û> q£©üûo –÷˜v§ÑÎ;Žu.o“Éy˜˜ÆpÄ¢.#}¼ù†^vø·5ˆ |4}Csç!Ú8ÔsF:>\È—Dü€R´%·Hjw¨#tšP†&™§>n÷„!-Ó° ¥h_TŽDížç¸tÝß:Ê%úƒµq Œp@­ÞÃa˜D „&•!YÒ¬IfCŒGÒ͹Ï)Ð1HJsè‚&0àÏÇ‘Y0µ=;†X˜ìlŸú9öÃ{lŽYÜíˆzqžs„ÓÑ tÌCŸ.[ËÍÓŸu •¼´ñ®9ÚžÀ f¼P¸¶.<vk@¥@ T ª• ”7Ù‘Q"µ¢û1a0ÒêD¯:$õ‹¶T|Kôú'Œ*ĉ>”oò¢Ãq³Š ݆„J­F„’Ö€n3ãS‡¢8À  V€Ì‡†uyôÀÀÊÕi[Ï~5©vÔ=V¶ÅÕ¡uhª£Êí õæ@+AéAWš•R…kJ”  €@(€ÙÕoqZsi]?Œjõ]íãQä¼{òB”%vØzðBí »h=ø$  ·ØœšùÑš×é¥7׎]ÿÄ1 025@"3`!$%14#PpÿÚá/‹LÚxyx‘3ç?ᵈŸŸ9§ow"³>ÿvŸ;R½Óá{wr±ç$¼R-i´ðòð);"gÎÄ;§·–íòçú×Ãú{9jÍ|"ÞUð½¦ÖàåàRE"Ó6Ÿñ[Zm4òîŸûûÀ/)™´ÿ4E°s¿Ýò³ Mk½Ë\°Ý.Yn·öÊ_ÞV©öžô=Î¥mq¶{ú‡äÚÁ¹®Ð‡çUûwŠå™|„7»)‡Û (×±`æ`=å8Á$ÙüFµ’¬”d1DZSÚ^Hײ‘œîus<¥à£Ö¶g¹É¬·ü°Å9êS–5b-i´ý£ Ðܽ-Kk¬hHÓí²qûªÁ’³Viò6fŸ#¤?DeõþHïܪSŠC3U|-ûºÞëº}{ÅîeÇ- Ät›÷vôØiû¨v'°w‡1ýËq_™"“ÚEç@ë[CúG-Øæ]SÿÏ™!î{Ibû?ãEfyÙ<ìžvO;'“ø£Ê«"y™ÒíòS/Ü#À²Ñ–21bÇÑR9²$GŒjÚãÆ‹‘¡z ~PÒ „Y˜àý5(q[Þç””š³ÿÞ.ÿ¤ÌÚYµì^óD`  å¯a9>G“C£¾U –«wIY–K ÅqECVUJÍY(àðí¨ñ´«Yž$JЩƒ[ˆ…6…*Äû¸ ÊÑy .kV€ÁÎ÷y£jÝÿâWËñÎøç|s¾9ßïÄ¡) Ö‚«‹Mª?tH^uÝó Élç›_0ÔòºÃ#Ð<¦.Óþ©ôÓÜúeî}2÷>™{¨D˜â=Áô©fÒìÖ\ª—‹.F~—nJXwÍÏ6tóKø³sаzUx«*.Ýy‹‰òKý'ϤùôŸ5zØ%Ì\+¾=n•WæwM٤٥Çܲåh¡éf­_¤ËϤËϤËϤËϤËϤËϤËϤËϤËϤËϤËϤËÆzeÑVô°ïø+¡jÕcY’RÿڪÆl“S3? ¡éÌMfè45¬ƒUWòŽ;‰öu_ï=;•ïÍJÅ+á Ÿ]Õ®›]Xõò´š7Qu]"61Ô¦Vf“vyÏÁ”œ¾êáá1„(Z¼ Y°YVz:<²¹ÝîŽuTÇÂñËX}!Ò¶’b`!ïßê‡ý¢_pc-g­ÇŸöæù+Tf¶…s€#Ы Ì8§ÙÔ¹uqoÀÚï˜:¡õºŒòÓ¦ÃV[ P¶Ž OJm‰êÏN(jl- ;Òã¥#ç÷¦'× ˜¨a“| V¶~ Ìè1³•“FVÐÆ‚n›â° ÷%ns©Û`:Ÿ ï>EÞ—-útP}—%ö;ÊÕ:GçZŠ ý=£\÷)8ë1—O—ÙêýÅÑ4‰/4[#­ôód[OcH®¯IÇ–7UOü/Ù‰²½RÐÚP)d)L¬Í7,óŸwJR-³àúF³:N´½F3tˆØoGA;¿¬?ñŽf”äDòêäùÏ3äŒßÁÚ@ÜûÞ º—Öù`²«<bKõSq}6vÿãÃjæbÚ)ƒ©6–]s`hQü>g{ºBk_\£¿R; %ú™·|„'`ø<Ì*¯c´esó^`3Õ;V­õ~ì¸óÒæÞKŽê—§´)Å~c~ÓÕß´xWôõ·èâởG##.ºo &”üšßÏ«9›s§s w¹ÕÅ‚kt¼ybn¨W‘úPݯâ:|zO?×kªœ’Údä©rÀý¸ÍBz^$rš¸ñ鰜υò©’õ7ÐB»ªCS¢Z1é ¥ŸíÍ\Ô(­UãŒQUoi½ÿk~É Ë0®^µ¶‘t‹ülXóÖñÒÏ€\XŠ3ûOW~Ñá_ÓÖßÚçHgöת´=Ë`‰'Gtef·êü=ý®i1*$RX¤éØòÅñꌊŠ8°nÁí!ÅÈPó}~°Tç'PG£Ó_vP{jõ _p{€sÜžàõVï÷ç¸=À9îÏp{€s܌ꤵw6o£ñœ5ÎI–,ñüŽn=®’¹”[øyìB®×ª—æŸQ×Ïßl¬Å£­xß´õwíÿZu·ö«åÝ~¥òS˜»DÎ>¤“¯ø±6>2˜ûaѼǜm©ì´ê;¨«]PRß5êtÞßQ‘A×æ;eMmV4yè—ˆu a³­è_îòŸ/.DM¦ÕšÏŒRÓ^Lyr´½¾Ù/Åš/•ÀfôvX\rÍ5*]UÔ].Zmcu,Zùª‹ÖiÝ*帲¢On4i8㫺7èeLµÇB¡F¹Æ¥•«¿8ýïA—\"ߘ•ŸkéV8òÖM¾+ÿ—­?ñã~ÓÕß´x û]mý®”TF0ú™Ç¢]0}*i?±¬<Öš/®ÏßÒˆ¬ä|w†=¦º¼ë?ÜÒÞ¨v±>5ntGéå¿T³ð¸:Õ£ÝÚ.k}*ygQî¢3+ýÙ稸Wâ½±`®>Ц´Ò«©ÜÝôoY,Jëy²4çˆH½³URõº‹Ùr‰ òÁWÔÖí÷ÿ‡NÙ…SL‹ê5¤SiýK>YÛ'PÚ[vil½’¢= š²¸ú’{Û(Ü,zïÌ2-?M3k^ë¨jQ'¡í‘ÉÔ&uŸ×õìN¡©Eø:pÐŽu>I®În;Mž±Žµ4s§ È×Oß |ç|¼FZ7:ÐÑ'éüýús˜½,gÀî†ÞšÉ¶Ñ*f~þ‹Sƒ­GÃàóHµwZéíO`d©Gᥠð6ÅÚg KãŽmlôÕù}8™ Mõ ¢}ïÀ¹®¹ò´ƒ¢ ½aç†Ö›Û§u¾<£½INLÅc©µá¹æ~ÒþÇOfk}ñè¹ÓÚbÍ$ÿ¬ÿô™­Ý.—YŸCU[º°rbçc6øãÔN\·44t2ÚB €ØÓüÕ´ÒËu#¡©z¡»CL™¢x$û)M:¥¨ƒõ3·ƒ‡'ç n©_1Ôoš·µ¯o´ZKŸT=äö«ŽÇçD5qkªm?^ÏT1–PŽõ݈A`ÈÞ‹C7B÷®FtM–:C¢mü ÆaN˜{t‡[Ô¨‹EìŠi`˜e £´Ñ±Þæé&U—ü´¬ÞÚ ý­-u¤Ë\KÐ}ÂüÌ+p£ó Ð0ÓáÖ°@qúDñ·2᧪Yÿ¿Ì I±‹ß³ÜÓ‡f´tô Ú3ïØô=éý–±´Y5JÙŠ3þ©O–%ï9I\6Rmë zÅç©~É9d—qgß%žÈa,È~ë ¢-æ…uœ ˆÍpÿ¯Köt¡óÞ®z–Œ±/YÍM1=2³\ÚEœá‘=dÀ²ß~¯íÉËyE]Ôº`Z²§Ä•DVµë˜1 $@¶²C¹µcŒiú*$ª €Á¦bäbË ÝL5ζjË‘|ÕÇ$þçò{c±ÎØçls¶9ÛíågèÙ[iƒ¬M¾¾‹ÐاZ—´ëÌ3M% á¹éÙt4¬ÍgAsŒMÅ3¨è}µ¶;néT' ¢Cï.¥Þ-}Küƒ¬(aÑñÊ êûŠÎðNµnfÈ"›5Ѫ1¾˜ý莜¡šN{kWH"Pº`b™Í^2iaâ„RIö´çµ§ ZSÓÎéçtóºyÝ<îžLùÿŒ€=üˆòŽÿtGœÞ;mɼÍ8H¬Oø ÝâÁû¼+311áI¬G;'³ƒ·e¹ZùוžÙ´ùÈûfyå>_áÀ„Ï”Ýþ¬ÚB(M¦|/ÛÝç>˜Ÿ Glòoý½b¾iŠÿ†€^˜¬ÒOÒo"9ÿÄ1P€ÿÚ?X6ê]óûº—}ÉwêÛ襟¢N3žxl,ç—(ùÿÄ"PA1 !€ÿÚ?D¼$(Ÿlb®:òBˆIc1ؼT ëÅ +—Q¸ôÍuÇ\Ðl„©ÉÉ ·è‚m BbäëÉ´fÊ%>ÌgÇæ5 o)ã æÿÄO !1A"2Qaq#0B‘’Á 34@Rr¡±Ñ$`bs‚áðC£²ñ%PSct“pƒ¢³ÂâòÿÚ?®Ú¹äÌÛù;jçõ8ÜÛ’õ­s·rpåÐZ­Ë­jmZÕÏ&fßÉÛW?ª9xr y-»“w;_!ßËsÉ™¹;jçõZæ¹Û«O1™¹;jçç٣˘Ëk•…)†ÎW0L«}×ê¦wDFWU[fãX¸Hf¶5à"a`Ù-•WßmxwÓágÙ5Õ—Dí§êÑPÉ!<æPlU1φº®b¹RöõVfDÚ rµ”Y´ê¬^Ó!Ê€‹ ¨0qäP %×{]•#”3aÃ’ >#Îʤ±@I,/Ǿ‹çÃ2ƒ”åT6û»)ñ1¤jï6Ê,{iXG!s4föôš±Z=ŽM6cè‡Ù ¢Zñ¯Ñ•´Ï†‘/”åD>îÃ^1*—Ÿ-®^Õ´ ‡U¾^z ¤Û˃Ù_ñ{« ±dÆAOR^L)húJ_ð¨ÝÂæÚ°¸P8Gg\Â4/—®‹†Ã"nr ÷R&$A,o¯5QÞ+E‰‹É©a}s~@ÐÄæƒ-í—f·ïÝÙ^••yú74Záò¬`—!Ë"ȦµÀ=ýÔì­UÞYPP¼Ø+åÔÆ;dÎmnÿž]Èî®­÷«Ÿ…t[Šè}õf?7_ß•˪ &ÕsZÚiÝRªi eví[ÛßXÞ鿨£·M‚ÔÓÉ›+çèð½ÿ:†xóeL.Ë~UA¤_¾ŸÅºyV죮°þ0WgŸÑ+¾Ý”çôyÜÛéSânZW;?«}ä÷ë÷òá; ÿ*Ôþ-l¹¹Ù²Û·ýµ$8¦PòGäµ6mßE# sK¯ ÿ:Ÿ‹]žd`ë–[h>Ú‹`m.Hòëû¯4«$`ú2·ªƒÄ-‹2€xuüh˜dD‹7¦ê5ûhŒD±;í.VS¥÷}•…·ü!øš–ÂÅ"S•´7×í¨ð×Efg±½·i÷rMe\Ñ6¬l*ÒKx™¸±m~ʆ-ž Ži }/ÛXù˜¦ÿÓÿê¶^S>Ë%¬-|ù¯X_ùxóþµŽýÈÿÜJN¿Â¤8wT]3f`fúÄøÌÐ5Ôe êMó¯·ýÍÌ:eÐÖ͵í¥úTqkoÐ&kwõTrG‹fif‹²ÞÝ[ë$ å$XäæZ×6¸ë¨’Õo‡Ú­ðûU¾jŒ3eÎ5Ó“ÈGÌúgA^S€ö-êðË›«gˆ‘ûy(3š¸–&£LŽ ²›i£ƒ/4\–ÝH'xÉ}ÁOšò+ÌÝ· òÓÊÇöl+ô|CƒûzÖLBۨǑåÛìò¶[d¿¾¾[þó¯–ÿ…üëå¿á:lGŒí2ÛL–÷òm¥}œ<:Úšl4†E]Y[}¹igÙgÔ.[éR$O´E6 k_áˆðñ—~¡W–X“³}|©=šùR{5ò¤ökåIì×Ê“Ù¯•'³_*Of¾TžÍ|©=šùR{5ò¤ökåIìÕâ1ÍØ u*Ãx>d0Ã5Ž»Åx¸¶Û²q¦Ge6#álðéí{Qx« I¬þ*öûýTA"¼aáe‡éñ†…„?HùågàÉõE&ù<{ÿhõPT(Ü)ŠaÜx­I½%>ºÄ· SÄò“3Œœ©²YA«ÍÍkgõT“¿èy”„nÞǨRÅ …EÜ*óH‘Ž¶6¬Ñ:ºõ©½43 ©ûªHdé!µ7l§ð›Åo.¼WñäŒÆróuL’°ê°¥ <’sŸò­„FÒ˧rü4Š1wsaB(÷úMô"A/>!†`‹ÕJóáe‰Œ¢,­ÛðRF¤ÌÙl´&ŒæB¹…G:©PüÁiã[b#úëÌá±NuøÖ ž'1Ÿ*šuÖ0Ë>X!†•·š›‡Å™U‘kTrøC 2tV°‘aä2<ÄwQæ;ôÁÃùV$ã$1,)Ë­b ‰¢.Q¦ûÿ¥2,«-ù׋ƸÌpéuµÛqèz5àÜQËÜpxî6¨cljˆ]…áîÖ£‚HË) aê㺎='‹9×G¿ÝRxA×ÈG¢׆ 3ûR{‡šÅ¿~?—#Ë#^çNÁPªžd¬—¯‘Xzq‚~úNÖ5/zþ?Äü"<˜Ð5®-ÛG à¥Õôæ­€þuyˆ lòµ<ïÇpê;ú žTÆ`¤ ‰UÉfèºõVÉ“a‹‹°ßbwŠ9ñ ‰Šds΂¢õãÑÊí,£%ºª%ƒØxŸ$`øð§Àâ%Ûù=ª96½¬kÁ¿õiï©0òYîÐ~ÉâµàìM‰tgi-­áR`†%¥2D^'·9Há^ l’­æ쾟bçf&#&X‡`ãË:.åëó_öŒPìÒÝ!ù׃aIÕ×4ÌfÛëÂX æ‰ffI/¡×ùV="Ä ÉRXŽVÎ-pòÆ,ÊÕà§øRë}úXkRM„ðá-uR Ö#&>(er/¶±•Ù4y×uúÿ VÃbVq%Ξ:Î/‡”ezÛh§‹ïÉq]`D<Ü,-‰ÓˆÖ–E‘Z<ÉÎN¸€ÂH²…b¦õ$ÐøO×E* xDÏ${y$¾[ÚýŸÙØ™„†êÆ—‡œNï ga¸kü« –3QvͧIJ0e-¡?æ¯ãÉ#ÃÙØs‰ì«ˆÕþ«QI‘‡90Ÿ»üc”V½½Ü‰bîæ»#ÓTž𓜌IßköÓK඗vWÌg™›Èív–ô­k_󯑋ü«@ME3£,1¶lÇ&QýÚ÷ûëÛ›üƶåÌXt«å1ߺ‹²ŒzI¯Àñ™“‹wkT~€óœŒþáQ®0FÎÞ“¦kÒbð`Øêîñ𡙺ٻ¹v¸ll°5­kf_Usçw™¥Y^B:VáX\AoˆÍͶüÂÔbˆL!þä~¬˜y_bÃ.Bôò¼¯4ïÒ‘ëKØÊ$ﵜå;Õ‡¢kÊë, —CM<³<ó°ËøÊÆFùsq§C[ÔP&ä¿$“IÑAzgmìn|Ö×d²ék5>˜x›¥—¤ÁÇ0¾kšVEè¨áó|'ïÀÉ0çz.7Šxeå¬'îÅå…ïow!ÆÈ5<Øÿ:ñxÏ’‡kU£9ï­S±Òú>kÞ¾þIfT.P^šI Ýɬ/w¿àfl·òŠ8vò$Q‹»› Ótk§í5A<í©™YÛXf†'G4^¡ŠM˜¿oÃ\>2æ!Ñ~+Wþ*øèýªøèýªøèýªøèýªÏ´‡=­{‹×ÇGíWÇGíWÇGíWÇGíWÇGíWÇGíWÇGíQ2b#¿R›šÈ€¦w/_šÃO†ghf[óª,ik‡·6Û¯Rc¦g ›,j8ÿZüð„Û ?³[L-ïl‡Í"œ®l†ö®vQÝjË‚¼1uúF†ÞC4G¤açÍÐÿ^ºÂ~ìWñŽUî¬/{{¨fÔq­Ž ²²åSŸ£÷rÙvm}ÔÐáb1æб:ÛÍÊ6\äzV£M”Ûò“{ÕŽê–%èt—º£ƒÅÕ‚ _5¨¬ìd>–lÕŸÆfÏלÓmµ–3bzêH›s©^C&4–¶âmIª)è¯]|[ú«e$r¼w¶³Î…Qw(†M´–æ¬ÀƒÛð39GMkš¤÷ƒ¯škùHe¯ô&±Þ @.‘ ½ÿÕ«Áž ‹EÚ8ëÓýhø4áÅóínªð†-cÚ´/•ÑÝùÖ*yáTš C]x>HuÃåáÃAj†"mÂÞ£ÀÁ„]Ž—í¬NÉFVƒ>^­høGÅ!Û“wmaæm ,@¬f)°±gÃ1 ¥x.vŒ&ßãñÒõ°s\(Ó!m}Uáf„$±FC/«áy F˜*¢î¬$ˆ£Ašä粶 pK…Å XúªdÃ0h¯u±¿˜#6½Í|¢/¾¤È%8ŽH~ ¬?×÷V÷b¿Œr§ua{ÛÝSÏ:æ`®ÊÅG&FÑi¾êaYH'Cõ«aÉ(ã{ê;(Câi%×5ïouK(\¹Ø¶^¯1‰ñ˜ƒåËm{ëä«ë<˜B¿ñT}ü‘~ëÞiÇ-™A¶ÏùÒKãLÍ–Ù-ïäÆ¿ÖðÑ¡’k-ÝzðV?(Yd‘¥Š8‘ÁLÚ÷ŸÊ±³0¸½‡}KC-qðñõVd k­ê%¼3åEé2ÙnÚ÷î¬RA.W:FäÚâû¯_¥Ù³ZF3j‹m-®¿}HBÅ#eÌ€ËÝ¿^ºµ¢ßå|¯Å‹z=|zèì”+.ÏP×Íu×ï¨JÌU†p2ý-=uªÁµ×$bnkîµÍûè³k*† æ ƒ£®¼zë,³¼7”j”Ò0f9™^åZýþê’Ñ­˜¬dM{õ_Z^‰RÊ„‡'(Ì÷?p¢(ö¡tC/1µëÍßÆŸ&[Yz&ã¢8ù©&Ñ\X­íM˘±7[õ׎§1Ųö¢ãÄÚÛKÔ¬ÞYe7un5âð@˜xNð¼hÂȳ@}­Œ8 [æ¸Þe&ß ³¦é/Sâ%A#J¹m{e£ÙïlÙïPMâãÉG³¶}õ‹Ãì¯ã {æÝX8ãM›a·=÷Óm0´Ì¹KšÅa¶y¶þ•÷S¢HŸ¤†¡8l4xcÌ¥wÑÚà!iˆÊ\ù˜ nng¯âðèd ÒUÞ)U¢xâ¿9˜Z€…a õsýzê oNaû*Hof:©í¢²aäï qKµ‰£‚üâÚ\vraáÔ?oúW„~¨ÿåXÿª¾úŽY¢ '›üU€ñ|0ƒ,¢ö¶ºŠσY˜¥óT²"äVbBõy‰á?Þ-ÇÙþ¼ŽØhÚXXÜeÞ)1´1¤z…;Éä`?»PŸ×®°î ÷Šhofé)í¬ž,äõÞºÊæò¹»TÓAoÉàϪ¿å¯þö?–/Y.™®M¸šÇÏ—.{T°xª®qkæóm”Û0±ó;ó/{|ËwÍ®7ÐI•Þ>—o)–v°à8šyäÞÜ:¨¬Ÿ'“¥ÙÛJñ°d:‚9KÊyÞŠqjy¥<÷7§Î¹¡“F¥ODD’ï=T0\íµï»N•ê ¢Žúéeƒ6Puþe%ˆÙÐÜPhͤ$â9HRÝêí4YØêMæ¿‹¾ÿÙ=t2Är\› ñ|1¼ ©o¤y á8 ¨ë ³Œ¦ ‰¤–uP™yÝæ¦i•Û8e£þå3Ä°“Òï¬Zã!Eh—2ȼ+ÀÐDT;Fz[º"±q«G|7Jçwª¶‘Xþ“õ…—4Ì¡T\{}UÖ ´dgµÀת”ÎœÓé.¢Ž!ÌKa˜©mGŸ ¤†ˆ¬¯’aûCZòqD»ë>"BíÛËú<¥GW çà zÅZ1] \ÑyÏóñ9GA«6ÊNÖ_ʬ¬‘}AEœ–c¼ž_Ñå*¿Gx®„ùOçYg”äú#Aó 6mÐHDŸS¥îja,’ŒLˆfæ¯7vkS1¬kbÀ%5…8råL’tƾavr¸aƒf<ÛnÍIaýó‘)pøy¤ÒZ2œÖÞNµ=ÝÊx’ß™c¹+‘‹Fù]n5±¬N~|SxèZúÑŒOúB€yÅr“Ô5½âiD%_0°û>beh–P$è·}4Ã6éeã^i †Ì‹ÿ¯ âqDRêº÷þu‚_¿ÅŒ®™­­x*9Û<«:‚~Ã^e6`ŠAþSgbÌ%=¢ŸûNI;핼ðUÞt­”öÍlÚ|(Ä–òˆ$ê5Íl“_/ÙR>d-¡:žï?‡•ŠÚaqjw΃-¹¤ê{¨bdȪÝ-Î?g$±˜-Ys£ö¡Óàb&R¹aµûiS:¥ý&Ü>a*ÄùVEÊÝ¢¶k/7.^ˆ½º¯A¶¦àßwe¿ E™T耠[ÕB üÁp4wþ5i_0¾mÜ +cŸ›l½{u_}lËóräÜ7u^£bÚÆ^ËS+¸³t² [÷Ú–92®íýt¢f n9Eý1ɲ}éÈ»»®wPY%vQ¸½ªO3«Í§ÙPÁ‚αDsfc©4ÞQùÝ-wÖLí“èßJÙ™\§Ñͧž¿ÅÀ¦fû*,Kk,R~㨥Á™ep9÷ÑI†ldr´Î]NͺšÕawɳ11êjÃHù–=ƒM-·›‹1aäŠX¡gP^àöÖ þ–:ðWtŸæ¬c弨c ¯Y©0»e™Œ¹íÎî¨Ò\#ìwF°^êÆœXyL¹ › `¤WtÂâ3s\êázhÎl2GwLÙ‹wTÒG„›ñ Üö¸qùÒì0îÈm—´¸o³Ìx/÷møÖ*i”“¦ ëkëPÂ6Á„a›u²[‡mJ áW2>Û6nÃX¢|ùÎä[~·¯<˜m¢B±\äjk /‰9®SäøiX©&Ĭrì’<ÙoÚMG‰Š?%²4%ó}¢¼+õñ¬P ›â­$yòGÒÞ³X96;%y2I|Ü7ƒX´ÁÇ$RaÐÈšùÀ¨› …Ú‡U¾ IÑn¢(aßónÏ>ÚÞ¡X´ lñ½„{L¼Îºnn]z=_ï©öÓÉkIÔ*xq§l®¼ÝÊi1»3e*rߪ¡@™vm!ßôšôë.>ãDeÍcuãHÑB«‡Xö[ouí5ˆ ‚1í£*XÉsP¹vq,~ªÃÁ‹ÃI!†ö*öÞk'E›%®×Ë”Ó<ø+â˜[:Éa~»Røîk2.PêùoßSá²üc½÷Z°Ï‘!/qš×½B!‡ôxÐÆQÛ6`wëKâ¸f‡®òf½K‡Ãaš=­³^LÀ[«ÌaâÅ`ÚC°"[V*0æ8æ*G>öµ&.$ Ue:ƒ¥ªØ|ÁïrÛBha±8q.KìŸ5Š_ñ¬`ÙeÛˆÇKvZÁG“ä÷Öý-oX¾K†™óìËj§°Öl<;ú9³V"9 3G0ŒÙwT3a°L\ù[Þ¶8Ì0ž Å“”­ûjh› ¯ƒ‘³lsžiì5& 6Î4þï=þúÅ™¶Ñ4{÷^¥„ÙÉ*dfÚ=U›Y19mµ¿m¨4¸]¬ŠÙ•Ä…mRLÖ ì[O›vVö­íVRIý`¹èÕ‡&Tõü+U¹ðœÓÕ\Í»—*nëä°­G#f<93p佯ÈM÷r\UÍs͹/m?Só?«“Z²ôy,+¶¬xrs7U…[X[’Üz¹ù ðýNÌûú¹.wWìòXVœŸÿÄ,!1AQaq ‘¡Ñðñ0±Á@`áPpÿÚ?!©Û})[¼-ÔÛï<Ì’¿ñÚSçÀ'­4ÊZÜz)‰cZeSN ’Q3Ò’2iÏc j! :Ôï- f·ál<†Ü }à§d•ÿ‘3YO'•ž®–NfWg„ºÈIÂÓ]ÛqD·ál7ÐÛ„ºÁJVWþ®Ü;ÔrážÏ‹ŸÀY©-Y_ÓP–Ž ¹gíc>‡ ›u‚”¬¯û‰R[µÊ&yÆ rSŠ*$È -µãz·(àEÂt8Az˜k'4_€$ã,Æi{³llkz“CÇUAÊp¸Mš43=a!Í©Œ4®*M¥(d¡%™Ž’(¶ †©nwLÄJõ¤Hm!1†s‚ÁÈ¥…¢#ÅârTdl…™]ÓN!¦Â( ›½ †"2H='½)É´›Ne<‘Iˆ]7Eª+ŬB}ªú9¶¶mØ­º„TÍ‘4Ä-·§ÐéÒåÄ°Èœ+(1È.Vu%À"›–¸^•­²Ö­Ä<ù¹Šð•*BQÞ.-U? K"Üozf³sÉ»µfwhÁ/åxQu½JÂw¥Ìo.õ:q$ÇLR%žE¤£Z²z‰5ó…éo\h ’SðdP­Œe¡©y´äÚ£ŒZk ÙšëÏ¥ñc¡3ªbºœ}‚?j2è$suP‚ä¾þµ N%Øÿ8 ä×&¹5É®M9ü.a„PrõFOÉD‚¼N5——F¥Ýc9`\½e…ÍåƒÒ—Ž4C²V[3A?`¾ÊÓN )Ç9^:*Jâ@D®sšè.4þÔ}gÙ¹ù¤w±ÂÀDˆr€^j‡º0)X… ڗˆ»_åJlxêÆhãrA¹\°;ÑI$lW<ŽÕšÎ9e $Ô¤¦šÈìœÑ]TZˆ)|ê Ó¢mCaƒ/ÕaÖ ͆>c…ÎH¤ …!@ $$ÞÝZ&‡œbS=€°æïe)Un³cÄI\Æ•,\Æñ-O±}N3MW &’ý%,Êôq! „Ы¢=2MÛŸ§•L4îë<,^‘›°ÇX­}paw%&œ¿©ÑV +Uñ{Rµ8‰dRhP£‰Y´gZ,3(rµ#ÄHà2s;SAc0‚Ä‘ÿæšÿðG'Ô{WÛ½«íÞÕöïjV r_…Ýt?µ×µtC›ÛKù™-¥€Zô߃UÇÝ@´& y1HÜ™ ä2T ^b•– [~'a žóD:n>³K[\ |¢²JßtÞ3Ý›Íü3©@k¥ŒË„®;'¡±G’à,Ü:ðaÈyHæ’ º¬xÞ&ìuÚ%tK+ì~õö?zû½}Þ¾Çï_c÷¯±û×Øýëì~õö?zû½}Þœ>ÑïL8àžÀ„…!çC$íÂ%HMÄdO•„¡ wëLb‰ ˆ-ró1'ìŸJrÈ„HJÄ\ÑÎ-šÀ¿peƒŸæä˜zø~Gj# ŸÖ†Š@ <øg“rŠ )ÐhÓ\ZO%gôT€€°J#ʲ”àÕÇò˜°²ü˜íSÐN6ì†{Çe£Ÿnô…´àcÖŽ°i™ZË«Ñ9Ö{ŠwçS½Ï¡ü¥[WÛWÛR¡µà®Ke”š(ÈWF«K"G²žïz3€cçùçプ6€ÑÎ;îpžÀ‘¹\{LA•‘Ôð‚`NL/ò®n`Ô£üJd/ÏÚ…&†WóÂøG/º´3­<¹¥Ã·Íiö^:¢ý¯:Çb ÃE×fÐ÷š•+ ÏLÓ&áœDú½h­ÕÜ—/liZRyÇíC <œ­³Goȯ§­9ì]fEZѤ¦cÊŽ÷J2¾©ëV-ê–ž±K]»»'ÕëXxB[õ¦‡,Ȥåî„÷8½«%›';Q¸ìgì˜íR@æxù|FYDôù?ö¾ý¥ÏöX¼Ú0fÝ^ÑF‚Á8•!3¯ðÒ§øÉ7FÍ¡KÕÀŸµ0Jò<”ˆƒV©Ìg-Jئ¨?ŒõŠ€½1ß—âÒz/±ÁGHŽšANjÒ`{OÚ‚$ ˜nýj!ܽª”©Ûh5$•&å½Ú3èrìTž»ø~±Þ31œæDËkÕõ0P`•hœâJš;Tê¼ Þ…xCcw=j9ky”AÏ^h»O‹‰°6ÜÍ!ø/rŒŽõ”HÍFú@iŸJ[‡W¡tÂð> â&C“jh“ ¾Fž´l.‰Æ{¦£iÆÕ¿·ÎöSΖ$QîcuoAšë‰Û3Ú&£(ÄÄòi³X¶,ÊÏV.¥Ï1ÊÃ:æž"6cRïs#°6»ù5Çms‚†Tx-—^¡ÇcDN[QÞã!;0ËåAU#³„¤–0®½[Sqˆ`®ÆëAÜê©ÖE2=ü|Ìý~Ú0jèñ úÖbe8|žÕ“çž>œãT€©ØCc9ov­XVÄ2 ;Uë ³TÌ?‡äÞ6x&jÙ±EÑbEÀÞü¬Êõ½DT[))PG¢s:ÊÍS> «ï2ßøgʧýžj¿úyV Vèõb(Ê ~¢Þ!œõ‡÷4"ÉÃ!(‹ÎëCP2éXÃB¢åÍ ‹ŒPˆr2UѪˆ!äŠ ` €˜pL¥oZzÒ¡ÂTš–öÛ•à9ÅAI±w¤JoÍ]_> ´'©ÐïOı¹¾ÄfÍ>º°¼Â—ÐU‚šHg¸ÐÔÇ–{ÿž)Ìõð8‚MÃíÊ \ñl;%|žÕ›çž>œ¯†ÛƒQ¶C¿Çk Qå:”Ì~VSMè˜`½)CÅò[pC}¯Üò),´ÍV¢œïšðH±ZZ8@xjÀÃ{µw¡^•¥Fx2mI>Bÿ§Ç¤†Îå7Ò>Y¯©×Ôëêuõ:¼¸lfÓ_S¯©×Ôëêuõ:ú}NšåŠ,†”n÷öx_ é*EFCŸ£CNá˜àÏ—e„€‹‚ýý ´| ï|zÖ›ðåô×ü‘(ÛXšg¬N‚jéªgŠ.Üw¥.BFŠtLwÔ§ÉíY¾yâ¥nøm©[¡i ­„¦jF;D¾Oòƒuq4üz’IÇÉ¥*“@€*ÈëBZ'Ý{cµY—ÙFQ°r ½T ›`Ã".ÝeÞÊHa«0:¶¦ðr›óNµ÷z³q‚áõM Êù9½|c9Å(‰nQ…&Í!#È!< YÈ ø&ÖôjžfäqD‰3Ž #ÏñXÕ‘tn~ QàY}Þ`ÁVî(óiüEãj+ήð…öØ¡sŽ«“é*E¤²=h¢{% PXE¬öß¾j:¦ cUã,Îj qkM¯ÖõvƒpÉ¥ô¦‘•²¶ß¢w§d)D6ì¡è¢ s»”Å`þ‡ÞUõdì…©m¶Û²‚% ’by~ÇÖ†Õô´@¬ÓÃäv¯]ý«äö¬ß<ñôŸÕ|6Ô; …$³xåûTürd1xåGkË3 2T¼†ÕjÕ·ÍHËj!R`fç]—u7c¥|KûÁ|…ì>Kªjê,I5Ð…Òl³–Ü=w×´Eë®e*/E7Q¼vŠ3“›r…sމ״‚#–/\©DÞúV¿‡)m€ŽQDòl,"} ÷=c€²$ DÆÐeÞXœ´%À@RäI±‚“òÄ;?øŠEÐÐb§k›ÃkØ ‚ S­úa·N M¢K‹Ë5¡Ü72í¨<2%„¶¹Êˆ¨é¡qøˆGœèò^\¹¡Ï%)ú‡mVÐ80rw‹­&Ô‡õQ 8¬âV]ˆ±íTá%3ÁÒ”¸st<〃ڟËî \Œr©ð1 ˜•¨ÎìrOÆ#­’1è~ ßèÑø5üCOjDnE"d‰ÿ" ¸”Ú?YÄœQج¶Ö\‹—ž‚Š ÉHœJ:°dù­MºCc`äQΈeÂy¾t2 {í8-Jbþðt©»±™€5· “"¿¿†(°”A}»íω4/ˆÇîšóTe]jó0ø9ÐN¹\"UÁCæˆ^—#ƒpÁË H퉬;,,&˜,X£È6dMthÑæÓ”jÿ¥ÁÁüO«À. ²…• eå½CP%%‹§J(|ÔŒ¶z¢œ`aAÑÔ¬VÀÍ0Å%£@$¢ØrÖ4ð%ͨõÈQ=ÿ;CYD#E!šþáP”· ýÒýçÑÐÓ‹õ¦]×f¢n{”¯á6ô¬Ååÿ Ó(—šõÀ“×óf”ˆJ%x·¿úZ2»¤¢¾43ßü‡Ï˜Ëá’”8c,K¤_µÀÄ!ºR¼€ ¶j: `Ynt¨È6JE$ƒ Õ¦c•ËX€ÁËé:ÐìÃ"‘„©ÿ~Á€éPÙ@Ts íx¦ëP*–Õ9ßçñ%ÅL‚¬÷Qµ& ÉbP=hxê§Âl(AXÀEûß½_73Ϧ´h•µN‚#žõi‚.¥Þ'ásó’à7Z9~!r#õâ¿®ZŠ³Üpot3Ji.E‘ѯ?΀9H ^®\cYìåNì2.¦ÎæW‘ ^ ¨Þ\O€Ù„%,¢Õ; ıԡ‘OÎÍ ³È¢P‚2îªÂ”Ãú‚)[‚ˆÊ&lUŠñ@ ˜eDa X\Û—‘J¸g;sÒÙÊiQ4»æ¼pLX© 1AfVz«ëhóB»ÆëZHÜÔ÷ÿq7=-b‰ÑY>k‚×Ës²é JñLÀ¼Î­Ú¼ï[wϽÈ&\‡¥Ô½˜)žÈmë‰Éí[§L”ýíB§½Y«š¥~Ô£"U8Å,ãEÍ’%«j{v'í‹bõñÜø8Š’ù8Ðë^Í6M^¼•ƒX«%¿ ؽ*€zx±NX›¦µn1ñfo¥NØÜËÌ-øuµ–EƒIêFwfÂaäSÏÚ@F„ÚyVöË÷qQÿ °Y¼ïöJß`2æ¾ôƒ=4ö ŠJ¸TX‘6·lRY¢líQÅ<èZTºÖÀZW,Rѵ½D1j€œ0ªòhÕÇ’V\à›P=l„Å.ìœè„lS°˜Æ[ÅBÊ2»<Ÿë:ÕÖ®µu«­Pæßé(› Y!5¥[j#bõe1 ö¤#p²Ÿà¥ŠX4˜`&ã½-á0)ÄIŠb2Ùfn½’0¼•>VÞ’/]ü&4<ê–áÂb·©Sª•—Âb+:¦tûÂ6¡-Æ[t(9ü„Øïø+ZNYÀQVy¾—š™¢ ’y4 €à¦j­Ÿ¢hewEÞæ°ïÏUK+1!­<±ÀŸºZ+À RœÅ_zÙÇ -ŸJc¿ê­JJµø*B´å®jbJÉ2®ËÞÇ~x¢)|xn={ÓnA @†´ô )a¥¬”V¢ ͶŽZû¾À¦·Ö[0€Lª5ù…xjׯà‹”KRÓÔà€Ž«x – ÒCà3QQQQQQQQQQOüZÆ“z +êá9·p2´` 8à(]·ëŽCªœÐÇÍ›ðAÈR¾F‚$hà2 |SSÂjxOÿ€žÚp*Zuxý¸9ZÝO-$˜QN+x릈–™.žœÇó –)UDœŠB™àÄ9“m8 ²Ææ±NMœ¬ b 8Aßü¨.Z»ðÿÚ ŠN’ 0À,óÀóÎO<³Ï(<ñÏ<à<8Ž~ÎûO,$Í0QÏ<ÂO<£Ï<àóÏóÈ5ø‚? yïüóÏ<óÏ<ƒÏ<ò<óÏ<óÈsÏ<óÏ<ÇýßÿÄ!P1€ÿÚ?¯DE €ˆ¥D\¨‚ºz6Bý ¢n?=¿D\=ˇÔO[P+SÿÄ"!1Pa 0AQ€‘¡ÿÚ?»n¸Âú¡zŸ9óã÷¢¾/‹úFífƒ›å@¼oýÕfÆ¿š:¬LL|TÙPIÞ??«8˜˜ë@Û³9yq*Üͳ7/íÔ¶"Ì¢=•SGPÈ0SIUÓ«¶ [q"ªÙÿÄ*!1AQa q‘0¡Áð@±ÑáPñÿÚ?Íî+¯ÿ2vŸk±áÉi﯄\Ñí‹IR¯”ð×\ùg5µN9pJ8Å;WŒÆJ¹Ã‰éPL¨+!áŒ+Û€€„QùPô’å§kþdýÁØÃ=Zî{øIëÿ£{crT«üqÿÁãÏ×øAfÙçÁ@©C€¬¸¨Õ#Dž C²gQÓÀÂÙpÛT!ïÑã:EAÀvÃ=R_î{øzˆÿæ~é;DòõúŸQða2Ǿ@õzý9GCíÿrG«Õÿr_÷$9F?¬®ïºþrˆõ#ûrG»þd Äúýe¾ÏûŽUÏÐH#ÉŒÐõ.rå›ΧÀRHKåvÈvíðþæþc¤ýQüçC`p-®³^1©~&V1<äJ§n±¢  ÍC딳1„lž<#fhŒ˜™ÛXÊ´>h Ƙp¯u`%ES Ð%Ê7Ýt¤7h8¥4gs2TÈ2I$àO,x ß8”ùÃá¬ø (Šð.…ÈÖc¬®O_±†ÀhýŒ„ÅèP Aa‹1B`&8Ë®Þ)|ÌÌ™±ÄIUÞOÒi7Ð`AêËöÌ’´ 11  ÃcЉ €5ƒäÃÅò‚Ät¼&³F0ªÕ£nA†©÷Jâbf’ RJ·×:å«°AìØ&KúÌú Ö.ŸéR“i „R6]U’=s’gH÷ ž1"âJ°’m;\⌠·d¥½8dzdBU6±àa{g9]L*EzÙ G)ôãùò@}Ÿ»þgÿ »ÓZäõÀt0òÎ̶{KŸ¿ýñS©y+øÜx¯G<0!(„c„0Ø\—oѱDZÂdd¢‚½½ñÎ’rÐ(RA&Œ®™B7A'#nÜU;§îÖmžNPÑ­ä#4æuDï¾óôÕ%¤Fñšój‚;¾« ñd$‘hY¤ð‹Þ ñx¨x°Œ¥œvÂGßÄzZ@$bÍ’”„tì¨õ\šèÈ’ #”æè[Åœ lÁD‚0ÐD†*,µíŒó’û:ÊIÛ¶ âkzÓ“§FA$Fb.²aVÖP "P™ÆÃÛ€ÀK ¦š¬ï%ݸÄQAJºÇojVÐ0ü¯‡ µŒ"%Í|¦9]]îåýÜb*Ôà¢W!c2eªP-F;áO«d,©tË´ý]¿KL±§É·Îvß&vß&vß&lõó :¦Å/½¾ùê–RY{‰w—1t[Ûï¯|kð+i `à÷1ñ-LB y§¶<¬Ë"Ø´‡±Ö,)™–á ÄÐá@ "9W¨™4ý Ì¡¢2Hu€[Á¦Ù!õ› "*Š°Ò"­B“ì~ûú|x†dô‹!'v9yè&5`„äÚ€Z¼"ŠA#šÂ#$«È5oŽ­W/dàz!µC?w˜p(Jä ÁÂá ™ÀØ¢ÁhƒÆiÅ£MýšyÈ@V6,{">ø/^œQÛãá#{ns[r6㡶#ys«_ ¨ë1¼ÉH}­ŽUçè¿Ë¥O1êÐî2#º¯UÚ¶»Äçšz © >ˆ˜A&kàOöir£&‡²Cïàl£$ÊÁŸüÆóÖŒý2§WYg¬¸²Ü”KBxŸ“$¥Z—W^’ã³a íNž¨×—¯‚jëOk¼Dì–ºuÃbÀØk¤©ë’~*æfž°vò¼)$̼þÜÄû<'9E¨`VO)hH¨M=Cê­>]Ÿ_$sÓL¨ŒoY¤dù@‡u Š›¢ˆUP˜„<7‘Šè¦¥CÚ©0/élDJØE¤—,ϨŒ”‚Ñ›LάJC ²H\c)¤ƒ’-3…ù3D a’Ýd@rœ+#¯8áX®ÇF"=ؤF„—ÇÄï¼âZ;$þ âs‰ ±Hi¸³Jec!]”6yRîILqlZíV¦/—D¥#‰˜y!¬3ÏR(R¬‘'$ôRF7ÃÍÌ°FÅï9íC''Ÿÿ¯ð<U€OŽå‡ð„ìŽù.c ØöÉ“l˜°KÄbb9S¦ƒ°Ê‘ɱtlzÄ“"˜ÕÔÀDüar±˜9 “p±1&€ÉVJ$dŽZ2_=M¸½Ù2à%q¿Ê<‡Ìà-nèýüaÝ–|ÚÞ\È¢Š§Tõ9| ô3ú¸~áðügí˜ß-³£$Yˆ2 ûD¥A …@&«¼Ôdü1 (›rQÝ—œ‚æDÉH½­î¯>qð‡^èü¼[„ÓÊ*Ý’$Üzàf®Ší&ï¦1ûE=m€£†N˜G“m‡bqòx †G Ç½(®(¥ŽWè$‘}0”ÒJé¬Ýú¢ÕÈÆå‚mHÛÁ‰†2%hEWq‹…ŽC>¢ö1ûÕZÉû’úx ë Ð5}&ϯ‘–€n¶tFCb-eB£ #+ñW¡!PÄ€ãÖðeV€®­å„"wE(¤) 7©Ž”ÊhŠo˜°‚3$žl„]â2”P*J·B6rÖù;EtÓHO8(fõò„•–ÃZÆ"\™ ÜHÔ?–Â'›Ú2j¯ÎÀéž bctc2Ĩg!»i *Õ n1IÈ8uˆMLæc ê8T&IKháð2„¼4­d™“#¸HBX.‚˳Š¾Sß‹86|âòxSÁ`‘óË$},ð»v}$L¡ž1È°•O„'ÛYÃNÝø~קÉ'ìº`e÷=¼=!zR»^kÒr3†’OÏÀzdE¯'›@$rŒ:‚€ *$†¯’H~‡\ýáGz}ðî9)™XÇø¥%ö½]ó…Ñ6ûÉç(üŒv©¶Ï`^”dÑÖ×ÝöÁòØz ¼A×Ç®[l¡WÅ=N4jJ!ýTXÚO"dASž>îN3ŽFnbÍYhÍ%º9½¾Æ$$FDëá3”P›)-¼ºñ¤"ÀŠ±= Æc ¡f 'LãYBH’&ý×;ÀV!Ö%ix2NVÔ5sA϶Eà@·–ˆYyî¶z.шÈl*a_î þ¢³˜¨+n®Ø‹ZØ.Òcw23*JXïà!ÒE¾'º€îç}Ò‚*ü¯“g×Í;l« BŒ0Äšiq ‰I ‚jP‰Æ£Ùs`\ˆ s R„$®Ô”˜øÒüy ŠQ»hy–Õ>°áŸ:-«¢"zõÏÚôçèºx¿eÓÆ…eDnÒ~º=¬Kk`jñþ—݉µ5Í…€¹M„p§¶IŸ?R"Æàsá/aÆ@’Z~ùßOœÿ>($:ÈùVÀT\ IÕVâWo`µè9[9Ò·ÞסØÉ= >$á,„A묙2óšh:ùê;q/Hv!îœA  ;iÇ>jdé-œîb9:í‚„ •Â†ƒV8ð!>ÓˆÁÂcy¬ÜD€{`'¤õÄ–¤>z–ÝÏÐÿ~5 QÖ«ƒ&˜Êv—j­ö<}ê4’j^'D “Rv§·Âʺñ=Œ)êÌŒŒŒA5­ÑÐÈÄ"D‘ô¼ÞëH=Q‘‘‚$)"II>Û#(é a$û'“ŒvùfXvE—`žÜH»Ñ±ÝÆðH0Ã{.s ¶6É Fs„LÕ³ Û–Ü <¿f«²ÉK[Ñ4\yPì0¢&všp\}§ q(˜ë^]Y*L¬Öå€~ÒÆ8ì€R<4†c®%M#]$Ay‰ëÑ]Á¤®±°€P’9‘¸ÚŒŒú?ÆJ|t¹À&ÌYGm+/]r‹0,;B³Ù q‘óöÖÖ í ­('’"^ž.p´€fJnjþ„§‹ªÏп8¦À"{>°éð‘û^Ÿ ß¡èð Q~íÞêP¢y—6¸d “Hâ‹3Ⱥ'¦VyƒÂ=[ƃDù³ê`Ì&'pz} †•rh’;ÆBî{¡àb‹Ö1ø]!0˜ž™òÊ‘ygÕôð~Û«d9bØÅ €È­€x3<ÉÑƼlÔ€Sªdë@É ¼Šñ“²XóÉ6H — ÆÑàlWˆHå/B¹9­PP…e ´]°”À$ÃIˆ°‘kü—î ÑK!PO9¾Ú;OpªF %±AÂ$<`®ŒlbÉ£V²þÛ`8Ñ…V·VÙ$ö#Ž§«t2N ÖF=?VÆ*ÂÉJ8sìab+Xn¨ QLF¦ˆlNµI ¨ŒÊ–X0a@"Lñä\vÍùjA “$´#XAf¸d0ƒÈ¬ht„AX„Í\³¢€ÉéÉ1ˆ7.Ò%4‘QD$u,l,,õÞI¤:çHShOKš”„Dx¦\<$]‰«–G¶R9B‘J=×$Ý׳WâoÈ c½ëÛ÷‡â2᪽S%Ž§ `¬—¶$`C:]¾xpÖœœº™·ÏhX‰ Ê)¤M”aÍã ¹H‘Ú”§®9‡ÈB:=¾xܺíâyfÀóÜ|¨x «Y4€Z´4Ìà2E¢éG {Á€@‚hÕZGÏ G5üÆ@>©ûà,CXù—fDzá¨BžD‰ï“,@à•”©:à 0 çÙó‘ÿÊ_ퟲ递s¡Ñ)gXöW2huj[ëƒYj q©>øb„àAPÅ@#IWe§yï ¨R‰in´ Ôsšž±y§d]Å…oÂAΦ¡öLL‘K€LqrôL…ÓÌÉÙìÎ#ÔK½ z¦!&7¤B¹=W\„x`»¨ß1íÁŠâÚ´»ýó^'j§]1>:¯¸N¿M3ÀÀ3ýÁ+§…ùp!(KÑO íäŸÉ6+¨œ‰2è‘‚Š Dø‚°cL;þcQDfG®N¤j !§´x€s@J4|¯Ûlå £#²›yÉZÀ"CBí¤-:Á…‹b’ä|H¸#{P8:èzÀŽÊƒN» ±ŽQÜŒÆLAMøIMv@[»GJ|]3O9s,AÖ,h Õ*Z§’|ª»…y8ND‘9¯czªÚÝhödñt \j9G§4Êʧª® h%ב ¡5 -‘õ“ÁÇYxjðdÎŽï¼ßàWœ8„(!ªNX= ƒdƒDÔ·teS¡È,"8CÞŠ,Á×BDžþn¿Ã–Â8ðÙõó€âu2ÄR@yëƒ&œc]„FÅuŠÏc„ä¡uÑBPœ';iÃ$a•ŠnGX‰©¬rDm„n-3g9*KÜZ&Ý^–ï:@k"dìwHL1¬“]Ý 0ϲþß\o!°Lˆ–#Ó yTŸT\@ÈhoIÈã·Ä Ff‡`<\:ÌgõjžûÃã2zÛ&îsæá»x\ àØrHú¨õ#l›½Ú­¯¯‹cF-À½Hryýãûb1,Æ7I÷ò˜”¾,vrü¦®}Ùu´Ñ½)Éjñ8 $‚¤kq‡É2&näà ¬"ÏC&‹‚J, œ0 ’IXŒ,Ä‘;b´s(…%$DaG¤¸`×$%38<%f• ¢îQ&9}« ˜ A jדŒQ_÷á³ëô¡·£#©`'$lÊ5)S“iìÀ^è=òràQHp• Ë„ eT§``ì.àéHr­‚ æ'*€,î9#–Ô²¯“— ¬á%! ªIaúÉTÒÚ >ø Oá)ƒ”y“Nâµj¦™1%‚.€âE[VâÄ2¸9chO®¨ÛÅ(} •–à„…ÙaÈãÐo½ÕW¯ç(ϱ=†OI†¶>FP½‡B$æS móù@¡ìä œs·×‡„˜n™I^¤;9ÊK²ðD#}J#!Œ¡¨†‹%&Æ\^.Ȁѭ»\*cÕ[ªHij°r!…+ÑÁ±GäÊRE±ÅBP€5…°ðTý˜…¨¨(ØåJ“ =g'êû²Ê&+p©8;¨ÐÀÝ€Pd¹ ¢¤!è´¾woÒ L­™´O·ØÈ:Q`(×C>í>ª=² C*9+È”k!ÛA%¢I*ñÃÔKÀ ^¥ÎEêÁC(š8àÍ ÓsR·Òœ<}šÍd÷O®ÎØ>¡‚úE”;¡"ËÙXž?¥§YsˆÚpÈVb¦8’&2?«qC*˜u˜HÔ7Ÿ¦éŸÔôd®@ç@à lckÔT¤iw^ù.Ÿ ¦¦:°¹°wÀ´nM£¥4˜Š@ßW+8©$6&Ébê°âË+à§úÜ1.`ŒÈ58}4-šA¸É‘\krØ”+Và5NÌõ!7ËÒâÒ´„é nž‰ÍÉ(”23:¬¡F04…Ùüf0IL€t06x-´’ªÄ3§?K×…ö¨&Ú†œŠÊ¤³dÄ;ì!¼Ô…¼!$EÎÇys¦9à{KNE£’¤ëù4•4  ¤y÷& :2A#«=ùi…5S×a5Â@‰TeºÜš¿<ýw?9úýw>^¹òÅEP;âhïõÏñŸ+@ƒzƒ—?Œº¹¤ >k&µd,ŒR/³œ•v$…‰VŽgá„!ʵ¨º¼O÷I,±jCè7r¨d¢ˆ ©µŽ™¥Ö¦FˆÖM”\:CÛJ®`IJkQ…JeÂ$Cp0¥å¤ßDap·(R€šH¹ë&He¶(‘<Ž†0ÂNJÁ•ž‚%nfòBè‘A!R‹W_@Â¥Ô*}.!$Æš™,¤ôŒ×C¦€HqÇ\œ’2ˆd EžÑ ·˜°Ð¦ÔdÁ‡z©ÓìG|²ÞÉkœbˆ ’Õ•ÖJÍ›Q2ôÅ$?ÔDÚ5žÕ¬TË`Ì8„ät ËvAwÒ ð§C\Å,YZ™›ºµˆA"ÏN0U’ò\Zp©ë‚üäÍCë(÷Ld‚RH€Ð’9¾Ñ‹…E«DJGc|àk¡ƒµý~¾y-»OØ~3÷ÆCPlc[ÆfÏŒïÜ>3¼|gxøÎññƒB£Péã¢>M |ãü Î<üdÿ¯œ´ÆïžÃý„(YÆEèçýï†Ï¯’" tN:ͧàùJ’¯À@+zbª -q)|8ó[Ö²¿ë=ß!×ó€õq‘òd:ÿX ùq×ï|‡_èÁŸ¯Çþ7_§­ºùÂb@¢*Õã(kÉØvðF.€2߆’Ÿ&Þ’²oã“I#LR˜ éŒ%š{ôx,ðÒ1‰¼¼® ÊJ|¢€(ó"k%Ö=+Â]gÖñI¼Ò™.ß«µpSMd½=+Í?ùü}?Z‡7Ýÿ0¢ †•hÅÈ=ðúûvð~X¦¥oø±ÌÒÍmq¸Ëüb9O81K ÄJnU>bælcX¼`×A“Á8q·ïÀ‚º<˜óÔÿÇëüIúÓä*Ðp³}Ï K\o3«¯»à.sµt:¹åí/þplugin_file = ( ! empty( $args['file'] ) ) ? $args['file'] : ''; $this->prefix = ( ! empty( $args['prefix'] ) ) ? $args['prefix'] : ''; $this->option_name = ( ! empty( $args['option_name'] ) ) ? $args['option_name'] : ''; $this->campaign = ( ! empty( $args['campaign'] ) ) ? $args['campaign'] : ''; $this->start = ( ! empty( $args['start'] ) ) ? $args['start'] : ''; $this->end = ( ! empty( $args['end'] ) ) ? $args['end'] : ''; $this->is_plugin_page = ( ! empty( $args['is_plugin_page'] ) ) ? $args['is_plugin_page'] : false; add_action( 'admin_footer', array( $this, 'admin_styles_and_scripts' ) ); add_action( 'admin_notices', array( $this, 'in_app_offer' ) ); add_action( 'wp_ajax_' . $this->prefix . '_dismiss_action', array( $this, 'dismiss_action' ) ); } /** * Get single instance of this class * * @param array $args Configuration. * @return Singleton object of this class */ public static function get_instance( $args ) { // Check if instance is already exists. if ( is_null( self::$instance ) ) { self::$instance = new self( $args ); } return self::$instance; } /** * Whether to show or not * * @return boolean */ public function is_show() { $timezone_format = _x( 'Y-m-d H:i:s', 'timezone date format', 'smart-manager-for-wp-e-commerce' ); $current_date = strtotime( date_i18n( $timezone_format, false, true ) ); $start = strtotime( $this->start ); $end = strtotime( $this->end ); if ( ( $current_date >= $start ) && ( $current_date <= $end ) ) { $option_value = get_option( $this->option_name, 'yes' ); $get_post_type = isset( $_GET['post_type'] ) ? sanitize_text_field( wp_unslash( $_GET['post_type'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification if ( ( 'product' === $get_post_type || $this->is_plugin_page ) && 'yes' === $option_value ) { return true; } } return false; } /** * Admin styles & scripts */ public function admin_styles_and_scripts() { if ( $this->is_show() ) { if ( ! wp_script_is( 'jquery' ) ) { wp_enqueue_script( 'jquery' ); } ?> is_show() ) { ?>
            show_offer_content(); ?>
            prefix . '-dismiss-action', 'security' ); update_option( $this->option_name, 'no', 'no' ); wp_send_json( array( 'success' => 'yes' ) ); } } classes/class-smart-manager-product.php000064400000340347147600337620014254 0ustar00dashboard_key = $dashboard_key; $this->post_type = array('product', 'product_variation'); $this->req_params = (!empty($_REQUEST)) ? $_REQUEST : array(); add_filter('sm_dashboard_model',array(&$this,'products_dashboard_model'),10,2); add_filter('sm_data_model',array(&$this,'products_data_model'),10,2); add_filter('sm_required_cols',array(&$this,'sm_beta_required_cols'),10,1); add_filter('sm_inline_update_pre',array(&$this,'products_inline_update_pre'),10,1); add_action('sm_inline_update_post',array(&$this,'products_inline_update'),10,2); // add_filter('posts_orderby',array(&$this,'sm_product_query_order_by'),10,2); add_filter( 'split_the_query', function() { return false; } ); //Filter to restrict splitting on WP_Query specially for `parent_sort_id` needed for proper display of variations add_filter( 'sm_posts_fields', array( &$this,'sm_product_query_post_fields' ), 100, 2 ); add_filter( 'sm_posts_where', array( &$this,'sm_product_query_post_where_cond' ), 100, 1 ); add_filter( 'sm_posts_orderby', array( &$this,'sm_product_query_order_by' ), 100, 2 ); add_filter( 'sm_terms_sort_join_condition' ,array( &$this, 'sm_product_terms_sort_join_condition' ), 100, 2 ); //filters for handling search add_filter('sm_search_postmeta_cond',array(&$this,'sm_search_postmeta_cond'),10,2); add_filter('sm_search_terms_cond',array(&$this,'sm_search_terms_cond'),10,2); //filter for modifying each of the search cond add_filter('sm_search_format_query_postmeta_col_value',array(&$this,'sm_search_format_query_postmeta_col_value'),10,2); add_filter('sm_search_format_query_terms_col_name',array(&$this,'sm_search_format_query_terms_col_name'),10,2); add_filter('sm_search_query_formatted',array(&$this,'sm_search_query_formatted'),10,2); add_filter('sm_search_query_terms_select',array(&$this,'sm_search_query_terms_select'),10,2); add_filter('sm_search_query_terms_from',array(&$this,'sm_search_query_terms_from'),10,2); add_filter('sm_search_query_terms_where',array(&$this,'sm_search_query_terms_where'),10,2); add_filter('sm_search_query_posts_where',array(&$this,'sm_search_query_posts_where'),10,2); add_action('sm_search_terms_condition_complete',array(&$this,'search_terms_condition_complete'),10,2); add_action('sm_search_terms_conditions_array_complete',array(&$this,'search_terms_conditions_array_complete'),10,1); add_filter('sm_search_query_postmeta_where',array(&$this,'sm_search_query_postmeta_where'),10,2); add_action( 'sm_search_postmeta_condition_complete', array( &$this,'search_postmeta_condition_complete' ), 10, 3 ); add_filter('sm_batch_update_copy_from_ids_select',array(&$this,'sm_batch_update_copy_from_ids_select'),10,2); // add_action('admin_footer',array(&$this,'attribute_handling')); add_action( 'sm_found_posts', array( &$this,'product_found_posts' ), 99, 1 ); add_filter( 'sm_generate_column_state', array( &$this, 'product_generate_column_state' ), 10, 2 ); add_filter( 'sm_map_column_state_to_store_model', array( &$this, 'product_map_column_state_to_store_model' ), 10, 2 ); add_filter( 'sm_filter_updated_edited_data', array( &$this, 'filter_updated_edited_data' ) ); add_filter( 'sm_col_model_for_export', array( &$this, 'col_model_for_export' ), 12, 2 ); add_filter( 'sm_search_posts_cond', array( &$this, 'sm_search_posts_cond' ), 10, 2 ); add_filter( 'sm_simple_search_ignored_posts_columns', array( &$this, 'sm_simple_search_ignored_posts_columns' ), 10, 2 ); add_filter( 'sm_can_optimize_dashboard_speed', function() { return true; } ); add_filter( 'sm_posts_groupby', array( &$this, 'query_group_by' ), 100, 1 ); add_filter( 'sm_posts_join_paged', array( &$this, 'query_join' ), 100, 2 ); } //Function for map the column state to include 'treegrid' for 'show_variations' public function product_map_column_state_to_store_model( $store_model, $column_model_transient ) { if( isset( $column_model_transient['treegrid'] ) ) { $store_model['treegrid'] = $column_model_transient['treegrid']; } return $store_model; } //Function for modifying the column state to include 'treegrid' for 'show_variations' public function product_generate_column_state( $column_model_transient, $store_model ) { if( isset( $store_model['treegrid'] ) ) { $column_model_transient['treegrid'] = $store_model['treegrid']; } return $column_model_transient; } /** * Handles the product found posts query. * * @param string $query The query string to find product posts. Default is an empty string. * @return void */ public function product_found_posts( $query = '' ) { if ( empty( $query ) ) { return; } global $wpdb; $query = str_replace(" ('product', 'product_variation')", "('product')", $query ); $from_strpos = strpos( $query, 'FROM' ); $from_pos = ( !empty( $from_strpos ) ) ? $from_strpos : 0; if( $from_pos > 0 ) { $query = substr( $query, $from_pos ); $groupby_strpos = strpos( $query, 'GROUP' ); $limit_pos = ( !empty( $groupby_strpos ) ) ? $groupby_strpos : 0; $query = substr( $query, 0, $limit_pos ); if( !empty( $query ) ) { $this->product_total_count = $wpdb->get_var( 'SELECT COUNT( DISTINCT( '.$wpdb->prefix.'posts.id ) ) '. $query ); } } } //Function for overriding the select clause for fetching the ids for batch update 'copy from' functionality public function sm_batch_update_copy_from_ids_select( $select, $args ) { $select = " SELECT ID AS id, ( CASE WHEN (post_excerpt != '' AND post_type = 'product_variation') THEN CONCAT(post_title, ' - ( ', post_excerpt, ' ) ') ELSE post_title END ) as title "; return $select; } public function sm_beta_required_cols( $cols ) { $required_cols = array('posts_post_title', 'posts_post_parent', 'postmeta_meta_key__product_attributes_meta_value__product_attributes'); return array_merge($cols, $required_cols); } //function to modify the terms search column name while forming the formatted search query public function sm_search_format_query_terms_col_name($search_col='', $search_params=array()) { if( !empty($search_col) && substr($search_col, 0, 10) == 'attribute_' ) { $search_col = substr($search_col, 10); } return $search_col; } //function to handle child ids for terms search public function search_terms_condition_complete($result_terms_search = array(), $search_params = array()) { global $wpdb; if( empty($search_params) ) { return; } //Code to handle child ids in case of category search if (!empty($result_terms_search) && !empty($search_params) && substr($search_params['cond_terms_col_name'], 0, 10) != 'attribute_' ) { $flag = ( !empty($search_params['terms_search_result_flag']) ) ? $search_params['terms_search_result_flag'] : ', 0'; //query when attr cond has been applied if ( $this->terms_att_search_flag == 1 ){ $query = "REPLACE INTO {$wpdb->base_prefix}sm_advanced_search_temp ( SELECT {$wpdb->prefix}posts.id ". $flag ." ,1 FROM {$wpdb->prefix}posts JOIN {$wpdb->base_prefix}sm_advanced_search_temp AS temp1 ON (temp1.product_id = {$wpdb->prefix}posts.id) JOIN {$wpdb->base_prefix}sm_advanced_search_temp AS temp2 ON (temp2.product_id = {$wpdb->prefix}posts.post_parent) WHERE temp2.cat_flag = 1 )"; } else { //query when no attr cond has been applied $query = "REPLACE INTO {$wpdb->base_prefix}sm_advanced_search_temp ( SELECT {$wpdb->prefix}posts.id ". $flag ." ,1 FROM {$wpdb->prefix}posts JOIN {$wpdb->base_prefix}sm_advanced_search_temp ON ({$wpdb->base_prefix}sm_advanced_search_temp.product_id = {$wpdb->prefix}posts.post_parent) WHERE {$wpdb->base_prefix}sm_advanced_search_temp.cat_flag = 1 AND {$wpdb->base_prefix}sm_advanced_search_temp.flag > 0 )"; } $result = $wpdb->query ( $query ); } if( !empty($search_params) && trim($search_params['cond_terms_col_name']) == 'product_visibility' && trim($search_params['cond_terms_operator']) == 'LIKE' && trim($search_params['cond_terms_col_value']) == 'visible' ) { $this->product_visibility_visible_flag = 1; } } //function to handle visibility search public function search_terms_conditions_array_complete($search_params = array()) { if( empty($search_params) ) { return; } global $wpdb; if( !empty($this->product_visibility_visible_flag) && ( !empty( Smart_Manager::$sm_is_woo30 ) && Smart_Manager::$sm_is_woo30 == 'true' ) ) { $query_advanced_search_taxonomy_id = "SELECT {$wpdb->prefix}term_taxonomy.term_taxonomy_id FROM {$wpdb->prefix}term_taxonomy JOIN {$wpdb->prefix}terms ON ( {$wpdb->prefix}terms.term_id = {$wpdb->prefix}term_taxonomy.term_id) WHERE {$wpdb->prefix}term_taxonomy.taxonomy LIKE 'product_visibility' AND {$wpdb->prefix}terms.slug IN ('exclude-from-search', 'exclude-from-catalog')"; $result_advanced_search_taxonomy_id = $wpdb->get_col ( $query_advanced_search_taxonomy_id ); if( count($result_advanced_search_taxonomy_id) > 0 ) { $result_taxonomy_ids = implode(",",$result_advanced_search_taxonomy_id); $query_terms_visibility = " DELETE FROM {$wpdb->base_prefix}sm_advanced_search_temp WHERE product_id IN (SELECT DISTINCT {$wpdb->prefix}posts.id FROM {$wpdb->prefix}posts JOIN {$wpdb->prefix}term_relationships ON ({$wpdb->prefix}term_relationships.object_id = {$wpdb->prefix}posts.id) WHERE {$wpdb->prefix}term_relationships.term_taxonomy_id IN (". $result_taxonomy_ids ."))"; $result_terms_visibility = $wpdb->query( $query_terms_visibility ); } } } //function to handle custom postmeta conditions for advanced search public function sm_search_postmeta_cond($postmeta_cond = '', $search_params = array()) { if ( !empty($search_params) && !empty($search_params['search_col']) && $search_params['search_col'] == '_product_attributes' ) { if ($search_params['search_operator'] == 'is') { $postmeta_cond = " ( ". $search_params['search_string']['table_name'].".meta_key LIKE '". $search_params['search_col'] . "' AND ". $search_params['search_string']['table_name'] .".meta_value LIKE %s" . " )"; } else if ($search_params['search_operator'] == 'is not') { $postmeta_cond = " ( ". $search_params['search_string']['table_name'].".meta_key LIKE '". $search_params['search_col'] . "' AND ". $search_params['search_string']['table_name'] .".meta_value NOT LIKE %s" . " )"; } } return $postmeta_cond; } //function to handle custom terms conditions for advanced search public function sm_search_terms_cond($terms_cond = '', $search_params = array()) { global $wpdb; if( !empty($search_params) ) { $search_params['search_col'] = $this->sm_search_format_query_terms_col_name($search_params['search_col']); if ($search_params['search_operator'] == 'is') { if( $search_params['search_string']['value'] == "''" ) { //for handling empty search strings $empty_cond = ''; //variable for handling conditions for empty string // if( substr($search_params['search_col'],0,3) == 'pa_' ) { //for attributes column TODO in products // $empty_cond = " AND ". $wpdb->prefix ."term_taxonomy.taxonomy LIKE '%pa_%' "; // } $terms_cond = " ( ". $wpdb->prefix ."term_taxonomy.taxonomy NOT LIKE '". $search_params['search_col'] . "' AND ". $wpdb->prefix ."term_taxonomy.taxonomy NOT LIKE 'product_type' ". $empty_cond ." )"; } else { if( ( 'product_visibility' === $search_params['search_col'] ) && ( ( !empty( Smart_Manager::$sm_is_woo30 ) && Smart_Manager::$sm_is_woo30 == 'true' ) ) ) { //TODO in products if( $search_params['search_value'] == 'visible' ) { $terms_cond = " ( ( ". $wpdb->prefix ."term_taxonomy.taxonomy LIKE '". $search_params['search_col'] . "' AND ". $wpdb->prefix ."terms.slug != 'exclude-from-search' AND ". $wpdb->prefix ."terms.slug != 'exclude-from-catalog' ) OR ( ". $wpdb->prefix ."term_taxonomy.taxonomy NOT LIKE '". $search_params['search_col'] . "' ) )"; } else if( $search_params['search_value'] == 'hidden' ) { $terms_cond = " ( ". $wpdb->prefix ."term_taxonomy.taxonomy LIKE '". $search_params['search_col'] . "' AND ". $wpdb->prefix ."terms.slug = 'exclude-from-search' ) && ( ". $wpdb->prefix ."term_taxonomy.taxonomy LIKE '". $search_params['search_col'] . "' AND ". $wpdb->prefix ."terms.slug = 'exclude-from-catalog' ) "; } else if( $search_params['search_value'] == 'catalog' ) { //TODO: Needs Improvement $terms_cond = " ( ". $wpdb->prefix ."term_taxonomy.taxonomy LIKE '". $search_params['search_col'] . "' AND ". $wpdb->prefix ."terms.slug = 'exclude-from-search' ) && ( ". $wpdb->prefix ."term_taxonomy.taxonomy LIKE '". $search_params['search_col'] . "' AND ". $wpdb->prefix ."terms.slug != 'exclude-from-catalog' ) "; } else if( $search_params['search_value'] == 'search' ) { //TODO: Needs Improvement $terms_cond = " ( ". $wpdb->prefix ."term_taxonomy.taxonomy LIKE '". $search_params['search_col'] . "' AND ". $wpdb->prefix ."terms.slug = 'exclude-from-catalog' ) && ( ". $wpdb->prefix ."term_taxonomy.taxonomy LIKE '". $search_params['search_col'] . "' AND ". $wpdb->prefix ."terms.slug != 'exclude-from-search' ) "; } } else if( ( 'product_visibility_featured' === $search_params['search_col'] ) && ( !empty( Smart_Manager::$sm_is_woo30 ) && Smart_Manager::$sm_is_woo30 == 'true' ) ) { $operator = ( 'yes' === $search_params['search_value'] ) ? '=' : '!='; $terms_cond = " ( ". $wpdb->prefix ."term_taxonomy.taxonomy $operator 'product_visibility' AND ". $wpdb->prefix ."terms.slug $operator 'featured' ) "; } } } else if ($search_params['search_operator'] == 'is not') { if( $search_params['search_string']['value'] != "''" ) { $attr_cond = ''; if( substr($search_params['search_col'],0,3) == 'pa_' ) { //for attributes column $attr_cond = " AND ". $wpdb->prefix ."term_taxonomy.taxonomy LIKE '%pa_%' "; } if( $search_params['search_col'] == 'product_visibility' && ( !empty( Smart_Manager::$sm_is_woo30 ) && Smart_Manager::$sm_is_woo30 == 'true' ) ) { if( $search_params['search_value'] == 'visible' ) { $terms_cond = " ( ". $wpdb->prefix ."term_taxonomy.taxonomy LIKE '". $search_params['search_col'] . "' AND ". $wpdb->prefix ."terms.slug = 'exclude-from-search' OR ". $wpdb->prefix ."terms.slug = 'exclude-from-catalog' )"; } else if( $search_params['search_value'] == 'hidden' ) { $terms_cond = " ( ( ". $wpdb->prefix ."term_taxonomy.taxonomy LIKE '". $search_params['search_col'] . "' AND ". $wpdb->prefix ."terms.slug != 'exclude-from-search' AND ". $wpdb->prefix ."terms.slug != 'exclude-from-catalog' ) OR ( ". $wpdb->prefix ."term_taxonomy.taxonomy NOT LIKE '". $search_params['search_col'] . "' ) ) "; } else if( $search_params['search_value'] == 'catalog' ) { //TODO: Needs Improvement $terms_cond = " ( ( ". $wpdb->prefix ."term_taxonomy.taxonomy LIKE '". $search_params['search_col'] . "' AND ". $wpdb->prefix ."terms.slug != 'exclude-from-search' ) OR ( ". $wpdb->prefix ."term_taxonomy.taxonomy NOT LIKE '". $search_params['search_col'] . "' ) )"; } else if( $search_params['search_value'] == 'search' ) { //TODO: Needs Improvement $terms_cond = " ( ( ". $wpdb->prefix ."term_taxonomy.taxonomy LIKE '". $search_params['search_col'] . "' AND ". $wpdb->prefix ."terms.slug != 'exclude-from-catalog' ) OR ( ". $wpdb->prefix ."term_taxonomy.taxonomy NOT LIKE '". $search_params['search_col'] . "' ) )"; } } else if( $search_params['search_col'] == 'product_visibility_featured' && ( !empty( Smart_Manager::$sm_is_woo30 ) && Smart_Manager::$sm_is_woo30 == 'true' ) ) { $operator = ( 'yes' === $search_params['search_value'] ) ? '!=' : '='; $terms_cond = " ( ". $wpdb->prefix ."term_taxonomy.taxonomy $operator 'product_visibility' AND ". $wpdb->prefix ."terms.slug $operator 'featured' ) "; } else { $terms_cond = " ( ". $wpdb->prefix ."term_taxonomy.taxonomy NOT LIKE '". $search_params['search_col'] . "' ". $attr_cond ." AND ". $wpdb->prefix ."terms.slug NOT LIKE %s" . " )"; } } } } return $terms_cond; } //function to modify the advanced search query formatted array public function sm_search_query_formatted($advanced_search_query = array(), $search_params = array()) { if( !empty($search_params) ) { if ($search_params['search_operator'] == 'is') { if( $search_params['search_string']['value'] != "''" ) { if( $search_params['search_col'] == 'product_visibility' && ( !empty( Smart_Manager::$sm_is_woo30 ) && Smart_Manager::$sm_is_woo30 == 'true' ) ) { if( $search_params['search_value'] != 'visible' ) { $advanced_search_query['cond_terms_col_name'] .= $search_params['search_col'] ." AND "; //added only for this specific search condition } } } } } return $advanced_search_query; } //function to handle terms custom select clause public function sm_search_query_terms_select($sm_search_query_terms_select = '', $search_params = array()) { if ( !empty($search_params['cond_terms_col_name']) && substr($search_params['cond_terms_col_name'], 0, 10) == 'attribute_' ) { $sm_search_query_terms_select .= " ,0"; $this->terms_att_search_flag = 1; //Flag to handle the child ids for cat advanced search } else if ( !empty($search_params['cond_terms_col_name']) && substr($search_params['cond_terms_col_name'], 0, 10) != 'attribute_' ) { $sm_search_query_terms_select .= " ,1 "; } return $sm_search_query_terms_select; } //function to handle terms custom from clause public function sm_search_query_terms_from($sm_search_query_terms_from = '', $search_params = array()) { global $wpdb; if ( !empty($search_params['cond_terms_col_name']) && substr($search_params['cond_terms_col_name'], 0, 10) == 'attribute_' ) { $sm_search_query_terms_from = " FROM {$wpdb->prefix}posts LEFT JOIN {$wpdb->prefix}term_relationships ON ({$wpdb->prefix}term_relationships.object_id = {$wpdb->prefix}posts.id) JOIN {$wpdb->prefix}postmeta ON ( {$wpdb->prefix}postmeta.post_id = {$wpdb->prefix}posts.id AND {$wpdb->prefix}posts.post_type IN ('". implode( "','", $search_params['post_type'] ) ."') )"; $this->terms_att_search_flag = 1; //Flag to handle the child ids for cat advanced search } else if ( !empty($search_params['cond_terms_col_name']) && substr($search_params['cond_terms_col_name'], 0, 10) != 'attribute_' ) { $sm_search_query_terms_from = "FROM {$wpdb->prefix}posts JOIN {$wpdb->prefix}term_relationships ON ({$wpdb->prefix}term_relationships.object_id = {$wpdb->prefix}posts.id AND {$wpdb->prefix}posts.post_type IN ('". implode( "','", $search_params['post_type'] ) ."') )"; } return $sm_search_query_terms_from; } //function to handle terms custom where clause public function sm_search_query_terms_where($sm_search_query_terms_where = '', $search_params = array()) { global $wpdb, $wp_version; $col_name = ( ! empty( $search_params['cond_terms_col_name'] ) ) ? $search_params['cond_terms_col_name'] : ''; $col_op = ( ! empty( $search_params['cond_terms_operator'] ) ) ? $search_params['cond_terms_operator'] : ''; $col_value = ( ! empty( $search_params['cond_terms_col_value'] ) ) ? $search_params['cond_terms_col_value'] : ''; //code to exlcude featured products when filter products that are not featured. if ( ( ! empty( $col_value ) ) && ( "product_visibility_featured" === $col_name ) && ( ( ( "LIKE" === $col_op ) && ( "no" === $col_value ) ) || ( ( "NOT LIKE" === $col_op ) && ( "yes" === $col_value ) ) ) ) { $featured_term = get_term_by( 'slug', "featured", "product_visibility" ); if ( ! is_wp_error( $featured_term ) && ! empty( $featured_term->term_taxonomy_id ) ) { $sm_search_query_terms_where .= " AND {$wpdb->prefix}posts.ID NOT IN ( SELECT object_id FROM {$wpdb->prefix}term_relationships WHERE term_taxonomy_id IN (". $featured_term->term_taxonomy_id .") )"; } } // Handle product visibility conditions for 'search' and 'catalog' values. if ( ( ! empty( $col_value ) ) && ( "product_visibility" === $col_name ) && ( "NOT LIKE" === $col_op ) ) { $visibility_tts = array( 'search' => 'exclude-from-search', 'catalog' => 'exclude-from-catalog', ); if ( array_key_exists( $col_value, $visibility_tts ) ) { $term_info = get_term_by( 'slug', $visibility_tts[ $col_value ], 'product_visibility' ); if ( ! is_wp_error( $term_info ) && ! empty( $term_info->term_taxonomy_id ) ) { $sm_search_query_terms_where .= " AND {$wpdb->prefix}posts.ID NOT IN ( SELECT object_id FROM {$wpdb->prefix}term_relationships WHERE term_taxonomy_id IN (". $term_info->term_taxonomy_id .") )"; } } } if ( !empty($col_name) && substr($col_name, 0, 10) == 'attribute_' ) { $tt_ids_to_exclude = array(); if( !empty($search_params['result_taxonomy_ids']) ) { $taxonomy_cond = " ({$wpdb->prefix}term_relationships.term_taxonomy_id IN (". $search_params['result_taxonomy_ids'] .")) "; } if( !empty($col_op) && 'NOT LIKE' === $col_op ) { $taxonomy = $this->sm_search_format_query_terms_col_name($col_name); if( "''" === $col_value || empty( $col_value ) ){ if (version_compare ( $wp_version, '4.5', '>=' )) { $tt_ids_to_exclude = get_terms( array( 'taxonomy' => $taxonomy, 'fields' => 'tt_ids', )); } else { $tt_ids_to_exclude = get_terms( $taxonomy, array( 'fields' => 'tt_ids', )); } } else { $term_meta = get_term_by( 'slug', $col_value, $taxonomy ); if ( ! is_wp_error( $term_meta ) && ! empty( $term_meta->term_taxonomy_id ) ) { $tt_ids_to_exclude[] = $term_meta->term_taxonomy_id; } } } $taxonomy_cond = (!empty($taxonomy_cond)) ? ' ( '. $taxonomy_cond : ''; $sm_search_query_terms_where = " WHERE ". $taxonomy_cond; if( $col_value != "''" && !empty( $col_value ) ) { $sm_search_query_terms_where .= " OR ({$wpdb->prefix}postmeta.meta_key ". ($col_value == "''" || empty( $col_value ) ? 'LIKE' : $col_op) ." '".trim($col_name) . "' AND {$wpdb->prefix}postmeta.meta_value ". $col_op ." '". trim($col_value)."') "; } $sm_search_query_terms_where .= " ) "; if( !empty($tt_ids_to_exclude) ) { $sm_search_query_terms_where .= " AND {$wpdb->prefix}posts.ID NOT IN ( SELECT object_id FROM {$wpdb->prefix}term_relationships WHERE term_taxonomy_id IN (". implode(",", $tt_ids_to_exclude) .") )"; } $this->terms_att_search_flag = 1; //Flag to handle the child ids for cat advanced search } else if( 'product_visibility' == $col_name && 'NOT LIKE' == $col_op && 'hidden' == $col_value ) { //Code to exclude 'hidden' products $taxonomy_ids = $wpdb->get_col ( $wpdb->prepare( "SELECT tt.term_taxonomy_id FROM {$wpdb->prefix}term_taxonomy as tt JOIN {$wpdb->prefix}terms as t ON ( t.term_id = tt.term_id AND tt.taxonomy = %s) WHERE t.slug IN (%s, %s)", 'product_visibility', 'exclude-from-search', 'exclude-from-catalog' ) ); if( ! empty( $taxonomy_ids ) && 2 == count( $taxonomy_ids ) ){ $sm_search_query_terms_where .= " AND {$wpdb->prefix}posts.ID NOT IN ( SELECT tr1.object_id FROM {$wpdb->prefix}term_relationships as tr1 JOIN {$wpdb->prefix}term_relationships as tr2 ON(tr1.object_id = tr2.object_id AND tr1.term_taxonomy_id = ". $taxonomy_ids[0] ." AND tr2.term_taxonomy_id = ". $taxonomy_ids[1] .") )"; } } // else if ( !empty($col_name) && substr($col_name, 0, 10) != 'attribute_' ) { // $sm_search_query_terms_where = (!empty($taxonomy_cond)) ? ' WHERE '. $taxonomy_cond : ''; // } return $sm_search_query_terms_where; } //function to handle postmeta custom where clause public function sm_search_query_postmeta_where($sm_search_query_postmeta_where = '', $search_params = array()) { global $wpdb; if(!empty( $search_params ) && !empty( $search_params['cond_postmeta_col_name'] ) ) { // if( $search_params['cond_postmeta_col_name'] == '_regular_price' || $search_params['cond_postmeta_col_name'] == '_sale_price' ) { // $sm_search_query_postmeta_where .= " AND {$wpdb->prefix}postmeta.post_id NOT IN (SELECT post_parent // FROM {$wpdb->prefix}posts // WHERE post_type IN ('product', 'product_variation') // AND post_parent > 0) "; // } if( $search_params['cond_postmeta_col_name'] == '_product_attributes' ) { $index = strpos($sm_search_query_postmeta_where, 'WHERE'); if( $index !== false ){ $sm_search_query_postmeta_where = substr($sm_search_query_postmeta_where, ($index + 5) ); } $sm_search_query_postmeta_where = " WHERE ( (". $sm_search_query_postmeta_where .") OR ({$wpdb->prefix}postmeta.meta_key LIKE 'attribute%' AND {$wpdb->prefix}postmeta.meta_value ". $search_params['cond_postmeta_operator'] ." '%". $search_params['cond_postmeta_col_value'] ."%') ) "; } } return $sm_search_query_postmeta_where; } //function to handle postmeta condition complete public function search_postmeta_condition_complete( $result_terms_search = array(), $search_params = array(), $query_params = array() ) { global $wpdb; if( ! empty( $search_params ) && ! empty( $query_params ) && ! empty( $search_params['cond_postmeta_col_name'] ) ) { // code to insert parent ids in case of search for regular_price or sale_price if( $search_params['cond_postmeta_col_name'] == '_regular_price' || $search_params['cond_postmeta_col_name'] == '_sale_price' ) { $query_params['select'] = str_replace( 'postmeta.post_id', 'posts.post_parent', $query_params['select'] ); $from_join_str = 'sm_advanced_search_temp.product_id = '.$wpdb->prefix.'postmeta.post_id'; if( strpos( $query_params['from'], $from_join_str ) !== false ) { $query_params['from'] = str_replace( $from_join_str, 'sm_advanced_search_temp.product_id = '.$wpdb->prefix.'posts.post_parent', $query_params['from'] ); } $search_val = ( ! empty( $search_params['cond_postmeta_col_value'] ) ) ? $search_params['cond_postmeta_col_value'] : ''; $query_postmeta_search = $wpdb->prepare( "REPLACE INTO {$wpdb->base_prefix}sm_advanced_search_temp (". $query_params['select'] ." ". $query_params['from'] ." ".$query_params['where'].")", $search_val ); $result_postmeta_search = $wpdb->query ( $query_postmeta_search ); } } } //function to handle posts custom where clause public function sm_search_query_posts_where($posts_advanced_search_where = '', $search_params = array()) { global $wpdb; if ( ! empty( $search_params['cond'] ) && FALSE !== strpos( $search_params['cond'],'post_status' ) && ! $this->is_variations_enabled_advanced_search_condition ) { $posts_advanced_search_where .= " AND ".$wpdb->prefix."posts.post_parent = 0 "; } return $posts_advanced_search_where; } /** * Query post fields for 'Products' dashboard. * * @param string $fields The fields to be queried. Default is an empty string. * @param array $sort_params The parameters for sorting the query. Default is an empty array. * @return string The modified fields for the query. */ public function sm_product_query_post_fields ( $fields = '', $sort_params = array() ) { global $wpdb; $fields .= ',if('.$wpdb->prefix.'posts.post_parent = 0,'.$wpdb->prefix.'posts.id,'.$wpdb->prefix.'posts.post_parent - 1 + ('.$wpdb->prefix.'posts.id)/pow(10,char_length(cast('.$wpdb->prefix.'posts.id as char)))) as parent_sort_id'; // Code for handling taxonomy sort if ( !empty( $sort_params ) && empty( $sort_params['default'] ) && ( ( !empty( $sort_params['column_nm'] ) && ( ( $sort_params['column_nm'] != 'ID' ) || ( $sort_params['column_nm'] == 'ID' && $sort_params['sortOrder'] == 'ASC' ) ) ) || empty( $sort_params['coumn_nm'] ) ) ) { if( empty( $sort_params['column_nm'] ) && ! empty( $sort_params['column'] ) ) { $col_exploded = explode( "/", $sort_params['column'] ); $sort_params['table'] = $col_exploded[0]; if ( sizeof($col_exploded) == 2) { $sort_params['column_nm'] = $col_exploded[1]; } $sort_params['sortOrder'] = strtoupper( $sort_params['sortOrder'] ); } if ( !empty( $sort_params['table'] ) && $sort_params['table'] == 'terms' && $sort_params['column_nm'] == 'product_type' ) { $fields .= " ,IFNULL(taxonomy_sort.term_name, 'Variation') as sort_term_name "; } } return $fields; } /** * Adds custom conditions to the WHERE clause of the product query. * * @param string $where The existing WHERE clause of the product query. * @return string The modified WHERE clause with custom conditions. */ public function sm_product_query_post_where_cond ( $where = '' ) { global $wpdb; $where_params = $this->get_where_clause_for_search( array( 'where' => $where, 'optimize_dashboard_speed' => true, ) ); $where = ( ! empty( $where_params['where'] ) ) ? $where_params['where'] : $where; //Code to get the ids of all the products whose post_status is thrash $query_trash = "SELECT ID FROM {$wpdb->prefix}posts WHERE post_status = 'trash' AND post_type IN ('product')"; $results_trash = $wpdb->get_col( $query_trash ); $rows_trash = $wpdb->num_rows; // Code to get all the variable parent ids whose type is set to 'simple' //Code to get the taxonomy id for 'simple' product_type $query_taxonomy_ids = "SELECT taxonomy.term_taxonomy_id as term_taxonomy_id FROM {$wpdb->prefix}terms as terms JOIN {$wpdb->prefix}term_taxonomy as taxonomy ON (taxonomy.term_id = terms.term_id) WHERE taxonomy.taxonomy = 'product_type' AND terms.slug IN ('variable', 'variable-subscription')"; $variable_taxonomy_ids = $wpdb->get_col( $query_taxonomy_ids ); if ( !empty($variable_taxonomy_ids) ) { $query_post_parent_not_variable = "SELECT distinct products.post_parent FROM {$wpdb->prefix}posts as products WHERE NOT EXISTS (SELECT * FROM {$wpdb->prefix}term_relationships WHERE object_id = products.post_parent AND term_taxonomy_id IN (". implode(",",$variable_taxonomy_ids) .")) AND products.post_parent > 0 AND products.post_type = 'product_variation'"; $results_post_parent_not_variable = $wpdb->get_col( $query_post_parent_not_variable ); $rows_post_parent_not_variable = $wpdb->num_rows; for ($i=sizeof($results_trash),$j=0;$j 0 || $rows_post_parent_not_variable > 0) { $where .= " AND {$wpdb->prefix}posts.post_parent NOT IN (" .implode(",",$results_trash). ")"; } return array( 'sql' => $where, 'value' => ( ! empty( $where_params['where_cond'] ) && ( is_array( $where_params['where_cond'] ) ) && ( ! empty( $where_params['search_text'] ) ) ) ? array_fill( 0, sizeof( $where_params['where_cond'] ) + 1, '%' . $wpdb->esc_like( $where_params['search_text'] ) . '%' ) : '' ); } /** * Joins conditions for sorting product terms. * * @param string $join_condition The existing join condition. * @param array $sort_params Parameters for sorting. * @return string The modified join condition. */ public function sm_product_terms_sort_join_condition ( $join_condition = '', $sort_params = array() ) { global $wpdb; if( !empty( $sort_params['column'] ) ) { $col_exploded = explode( "/", $sort_params['column'] ); $sort_params['column_nm'] = ( ! empty( $col_exploded[1] ) ) ? $col_exploded[1] : ''; } if( ! empty( $sort_params['column_nm'] ) && 'product_visibility_featured' === $sort_params['column_nm'] ) { return " AND ( ". $wpdb->prefix ."term_taxonomy.taxonomy LIKE 'product_visibility' AND ". $wpdb->prefix ."terms.slug = 'featured' ) "; } return $join_condition; } /** * Orders the product query results based on specified criteria. * * @param string $order_by The column by which to order the results. * @param array $params Additional parameters for the query. * @return string $order_by The modified order by clause. */ public function sm_product_query_order_by ( $order_by = '', $params = array() ) { global $wpdb; $sort_params = $params['sort_params']; $order_by = $this->get_order_by_clause_for_sort( array( 'order_by' => $order_by, 'sort_params' => $sort_params ) ); if ( ! empty( $sort_params ) && empty( $sort_params['default'] ) && ( ( ! empty( $sort_params['column_nm'] ) && ( ( $sort_params['column_nm'] != 'ID' ) || ( $sort_params['column_nm'] == 'ID' && $sort_params['sortOrder'] == 'ASC' ) ) ) || empty( $sort_params['coumn_nm'] ) ) ) { if( empty( $sort_params['column_nm'] ) && ! empty( $sort_params['column'] ) ) { $col_exploded = explode( "/", $sort_params['column'] ); $sort_params['table'] = $col_exploded[0]; if ( sizeof($col_exploded) == 2) { $sort_params['column_nm'] = $col_exploded[1]; } $sort_params['sortOrder'] = strtoupper( $sort_params['sortOrder'] ); } $sort_order = ( !empty( $sort_params['sortOrder'] ) ) ? $sort_params['sortOrder'] : 'ASC'; if ( ( ! empty( $sort_params['table'] ) ) && 'posts' === $sort_params['table'] && ! empty( $sort_params['column_nm'] ) ) { $order_by = $sort_params['column_nm'] .' '. $sort_order; } else if ( ! empty( $sort_params['table'] ) && 'terms' === $sort_params['table'] && true === $this->terms_sort_join && ! empty( $sort_params['column_nm'] ) ) { $order_by = ( ( $sort_params['column_nm'] == 'product_type' ) ? ' sort_term_name ' : ' taxonomy_sort.term_name ' ) .''. $sort_order ; } $this->prod_sort = true; } else { $order_by = 'parent_sort_id DESC'; $this->prod_sort = false; } return $order_by; } public function products_dashboard_model ($dashboard_model, $dashboard_model_saved) { global $wpdb, $current_user; $visible_columns = array('ID', '_thumbnail_id', 'post_title', '_sku', '_regular_price', '_sale_price', '_stock','post_status', 'post_content','product_cat','product_attributes', '_length', '_width', '_height', '_visibility', '_tax_status', 'product_type', 'edit_link', 'view_link'); $custom_numeric_columns = array('_regular_price', '_sale_price', '_price'); $integer_columns = array('_stock'); $numeric_columns = array('_length', '_width', '_height'); $date_columns = array('_sale_price_dates_from', '_sale_price_dates_to'); if( empty( $dashboard_model['columns'] ) ){ $dashboard_model['columns'] = array(); } $column_model = &$dashboard_model['columns']; $column_model_transient = get_user_meta(get_current_user_id(), 'sa_sm_'.$this->dashboard_key, true); $dashboard_model['treegrid'] = 'true'; //for setting the treegrid if( isset( $column_model_transient[ 'treegrid' ] ) ) { $dashboard_model['treegrid'] = $column_model_transient[ 'treegrid' ]; } $dashboard_model['tables']['posts']['where']['post_type'] = ( $dashboard_model[ 'treegrid' ] == 'true' || true === $dashboard_model[ 'treegrid' ] ) ? array('product', 'product_variation') : array('product'); $product_visibility_index = sm_multidimesional_array_search('terms/product_visibility', 'src', $column_model); $product_shop_url_index = sm_multidimesional_array_search('custom/product_shop_url', 'src', $column_model); if( !empty($product_visibility_index) ) { $visibility_index = sm_multidimesional_array_search ('postmeta/meta_key=_visibility/meta_value=_visibility', 'src', $column_model); if( !empty($visibility_index) && isset($column_model[$visibility_index]) ) { unset($column_model[$visibility_index]); $column_model = array_values($column_model); } $featured_index = sm_multidimesional_array_search ('postmeta/meta_key=_featured/meta_value=_featured', 'src', $column_model); if( !empty($featured_index) && isset($column_model[$featured_index]) ) { unset($column_model[$featured_index]); $column_model = array_values($column_model); } } $attr_col_index = sm_multidimesional_array_search ('custom/product_attributes', 'src', $column_model); $attributes_val = array(); $attributes_label = array(); $attributes_search_val = array(); $attribute_meta_cols = array(); // Load from cache if (empty($attr_col_index) || ( !empty($attr_col_index) && empty($column_model [$attr_col_index]['values']) ) ) { //Query to get the attribute name $query_attribute_label = "SELECT attribute_name, attribute_label, attribute_type FROM {$wpdb->prefix}woocommerce_attribute_taxonomies"; $results_attribute_label = $wpdb->get_results( $query_attribute_label, 'ARRAY_A' ); $attribute_label_count = $wpdb->num_rows; if($attribute_label_count > 0) { foreach ($results_attribute_label as $results_attribute_label1) { $attributes_label['pa_' . $results_attribute_label1['attribute_name']]['lbl'] = $results_attribute_label1['attribute_label']; $attributes_label['pa_' . $results_attribute_label1['attribute_name']]['type'] = $results_attribute_label1['attribute_type']; } } } else { $column_model [$attr_col_index]['batch_editable']= true; } //Get Product Visibility options $product_visibility_options = array(); if( function_exists('wc_get_product_visibility_options') ){ $product_visibility_options = wc_get_product_visibility_options(); } else { //default values for product_visibility $product_visibility_options = array('visible' => __('Shop and search results', 'smart-manager-for-wp-e-commerce'), 'catalog' => __('Shop only', 'smart-manager-for-wp-e-commerce'), 'search' => __('Search results only', 'smart-manager-for-wp-e-commerce'), 'hidden' => __('Hidden', 'smart-manager-for-wp-e-commerce')); } foreach ($column_model as $key => &$column) { if (empty($column['src'])) continue; $src_exploded = explode("/",$column['src']); if (empty($src_exploded)) { $src = $column['src']; } if ( sizeof($src_exploded) > 2) { $col_table = $src_exploded[0]; $cond = explode("=",$src_exploded[1]); if (sizeof($cond) == 2) { $src = $cond[1]; } } else { $src = $src_exploded[1]; $col_table = $src_exploded[0]; } if( empty($dashboard_model_saved) ) { //Code for unsetting the position for hidden columns if (!empty($column['position'])) { unset($column['position']); } $position = array_search($src, $visible_columns); if ($position !== false) { $column['position'] = $position + 1; $column['hidden'] = false; } else { $column['hidden'] = true; } } if (!empty($src)) { // if (substr($src,0,13)=='attribute_pa_' || (substr($src,0,3)=='pa_' && $col_table == 'terms') ) { if ( (substr($src,0,3)=='pa_' && $col_table == 'terms') ) { $attr_name = substr($src,3); // $attr_name_src = 'attribute_pa_'.$attr_name; $attr_name_src = 'pa_'.$attr_name; if( substr($src,0,3)=='pa_' && $col_table == 'terms' && !empty( $attributes_val[$attr_name_src] ) ) { $attributes_val [$attr_name_src]['val'] = $column['values']; } else { $attributes_val [$src] = array(); $attributes_val [$src]['lbl'] = (!empty($attributes_label[$src]['lbl'])) ? $attributes_label[$src]['lbl'] : $src; $attributes_val [$src]['val'] = ( !empty( $column['values'] ) ) ? $column['values'] : array(); $attributes_val [$src]['type'] = (!empty($attributes_label[$src]['type'])) ? $attributes_label[$src]['type'] : $src; unset($column_model[$key]); $column_model = array_values($column_model); } //code for search columns $attributes_search_val[$attr_name_src] = ! empty( $column['search_values'] ) ? $column['search_values'] : array(); $column['type'] = 'sm.multilist'; } else if( (false !== strpos($src, 'attribute_pa') && $col_table == 'postmeta') ) { $attribute_meta_cols[substr($src,10)] = $key; } else if( empty($dashboard_model_saved) ) { if ($src == 'product_cat') { $column['type'] = 'sm.multilist'; $column['editable'] = false; $column['name'] = $column['key'] = _x( 'Category', 'Product category', 'smart-manager-for-wp-e-commerce' ); } else if( $src == 'product_type' ) { $column['type'] = 'dropdown'; } else if ( in_array($src, $numeric_columns) ) { $column['type'] = 'numeric'; $column['editor'] = 'customNumericEditor'; } else if ( in_array($src, $integer_columns) ) { $column['type'] = 'numeric'; $column['editor'] = 'customNumericEditor'; $column['decimalPlaces'] = ( has_filter( 'woocommerce_stock_amount', 'floatval' ) && '_stock' === $src ) ? 13 : 0; //Compat for Decimal Product Quantity Plugins } else if ( in_array($src, $custom_numeric_columns) ) { $column['type'] = 'text'; $column['editor'] = $column['type']; $column['validator'] = 'customNumericTextEditor'; } else if ( in_array($src, $date_columns) ) { $column['type'] = 'sm.date'; $column['editor'] = $column['type']; $column['date_type'] = 'timestamp'; $column['is_utc'] = true; $column['is_display_date_in_site_timezone'] = true; } else if ($src == '_visibility') { $column['type'] = 'dropdown'; //get the custom product_visibility using woo function $column ['values'] = $product_visibility_options; $column ['search_values'] = array(); if( !empty( $column ['values'] ) ) { foreach( $column ['values'] as $key => $value ) { $column['search_values'][] = array( 'key' => $key, 'value' => $value ); } } } else if ($src == '_tax_status') { $column['type'] = 'dropdown'; $column ['values'] = array('taxable' => __('Taxable', 'smart-manager-for-wp-e-commerce'), 'shipping' => __('Shipping only', 'smart-manager-for-wp-e-commerce'), 'none' => __('None', 'smart-manager-for-wp-e-commerce')); $column ['search_values'] = array(); $column['search_values'][0] = array('key' => 'taxable', 'value' => __('Taxable','smart-manager-for-wp-e-commerce')); $column['search_values'][1] = array('key' => 'shipping', 'value' => __('Shipping only','smart-manager-for-wp-e-commerce')); $column['search_values'][2] = array('key' => 'none', 'value' => __('None','smart-manager-for-wp-e-commerce')); } else if ($src == '_stock_status') { $column['type'] = 'dropdown'; //get the custom _stock_status using woo function if( function_exists('wc_get_product_stock_status_options') ){ $column ['values'] = wc_get_product_stock_status_options(); } else { //default values for _stock_status $column ['values'] = array('instock' => __('In stock', 'smart-manager-for-wp-e-commerce'), 'outofstock' => __('Out of stock', 'smart-manager-for-wp-e-commerce'), 'onbackorder' => __('On backorder', 'smart-manager-for-wp-e-commerce')); } $column ['search_values'] = array(); if( !empty( $column ['values'] ) ) { foreach( $column ['values'] as $key => $value ) { $column['search_values'][] = array( 'key' => $key, 'value' => $value ); } } $color_codes = array( 'green' => array( 'instock' ), 'red' => array( 'outofstock' ), 'blue' => array( 'onbackorder' ) ); $column['colorCodes'] = apply_filters( 'sm_'.$this->dashboard_key.''.$src.'_color_codes', $color_codes ); } else if ($src == '_tax_class') { $column['type'] = 'dropdown'; //get the custom tax status using woo function if( function_exists('wc_get_product_tax_class_options') ){ $column ['values'] = wc_get_product_tax_class_options(); } else { //default values for tax_status $column ['values'] = array('' => __('Standard', 'smart-manager-for-wp-e-commerce'), 'reduced-rate' => __('Reduced Rate', 'smart-manager-for-wp-e-commerce'), 'zero-rate' => __('Zero Rate', 'smart-manager-for-wp-e-commerce')); } $column ['search_values'] = array(); if( !empty( $column ['values'] ) ) { foreach( $column ['values'] as $key => $value ) { $column['search_values'][] = array( 'key' => $key, 'value' => $value ); } } } else if ($src == '_backorders') { $column['type'] = 'dropdown'; //get the custom _backorders using woo function if( function_exists('wc_get_product_backorder_options') ){ $column ['values'] = wc_get_product_backorder_options(); } else { //default values for _backorders $column ['values'] = array('no' => __('Do Not Allow', 'smart-manager-for-wp-e-commerce'), 'notify' => __('Allow, but notify customer', 'smart-manager-for-wp-e-commerce'), 'yes' => __('Allow', 'smart-manager-for-wp-e-commerce')); } $column ['search_values'] = array(); if( !empty( $column ['values'] ) ) { foreach( $column ['values'] as $key => $value ) { $column['search_values'][] = array( 'key' => $key, 'value' => $value ); } } $color_codes = array( 'green' => array( 'yes', 'notify' ), 'red' => array( 'no' ), 'blue' => array() ); $column['colorCodes'] = apply_filters( 'sm_'.$this->dashboard_key.''.$src.'_color_codes', $color_codes ); } else if ($src == 'product_shipping_class') { $column['type'] = 'dropdown'; if( empty($column ['values']) ) { $column ['values'] = array(); } if( empty($column ['search_values']) ) { $column ['search_values'] = array(); } $column ['values'] = array_replace( array('' => __('No shipping class', 'smart-manager-for-wp-e-commerce') ), $column ['values'] ); $no_shipping_class = array('key' => '', 'value' => __('No shipping class','smart-manager-for-wp-e-commerce')); if( false === array_search( $no_shipping_class, $column['search_values'] ) ){ $column['search_values'][] = $no_shipping_class; } } else if ($src == '_sku') { $column ['name'] = $column ['key'] = __('SKU', 'smart-manager-for-wp-e-commerce'); $column ['type'] = $column ['editor'] = 'text'; } else if ($src == 'post_title') { $column ['name'] = $column ['key'] = __('Name', 'smart-manager-for-wp-e-commerce'); } else if ($src == 'post_name') { $column ['name'] = $column ['key'] = __('Slug', 'smart-manager-for-wp-e-commerce'); } else if ($src == 'post_content') { $column ['name'] = $column ['key'] = __('Description', 'smart-manager-for-wp-e-commerce'); } else if ($src == 'post_excerpt') { $column ['name'] = $column ['key'] = __('Additional Description', 'smart-manager-for-wp-e-commerce'); } else if ( substr($src, 0, 12) != 'attribute_pa' && substr($src, 0, 10) == 'attribute_' ) { $column ['searchable']= false; $column ['batch_editable']= false; } else if ($src == '_default_attributes') { $column ['searchable']= true; $column ['batch_editable']= true; } else if ($src == '_product_attributes') { $column ['searchable']= false; $column ['batch_editable']= false; $column ['hidden']= true; $column ['allow_showhide']= false; $column ['exportable']= false; } else if ($src == '_product_url') { $column ['name'] = $column ['key'] = __('External Url', 'smart-manager-for-wp-e-commerce'); } else if ( '_product_image_gallery' === $src ) { $column ['width']= 25; $column ['align']= 'center'; $column ['type']= 'sm.multipleImage'; $column ['searchable']= true; $column ['search_type']= 'text'; $column ['editable']= false; $column ['editor']= false; $column ['batch_editable']= true; $column ['sortable']= false; $column ['resizable']= true; } if( $column['type'] == 'dropdown' ) { $column ['strict'] = true; $column ['allowInvalid'] = false; $column ['selectOptions'] = $column['values']; $column ['editor'] = 'select'; $column ['renderer'] = 'selectValueRenderer'; } // Code for handling color codes for 'stock' field if ($src == '_stock') { $wc_low_stock_threshold = absint( get_option( 'woocommerce_notify_low_stock_amount', 2 ) ); $color_codes = array( 'green' => array( 'min' => ( $wc_low_stock_threshold + 1 ) ), 'red' => array( 'max' => 0 ), 'yellow' => array( 'min' => 1, 'max' => $wc_low_stock_threshold ) ); $column['colorCodes'] = apply_filters( 'sm_'.$this->dashboard_key.''.$src.'_color_codes', $color_codes ); } } } } if (empty($attr_col_index)) { $index = sizeof($column_model); //Code for including custom columns for product dashboard $column_model [$index] = array(); $column_model [$index]['src'] = 'custom/product_attributes'; $column_model [$index]['data'] = sanitize_title(str_replace('/', '_', $column_model [$index]['src'])); // generate slug using the wordpress function if not given $column_model [$index]['name'] = __(ucwords(str_replace('_', ' ', 'attributes')), 'smart-manager-for-wp-e-commerce'); $column_model [$index]['key'] = $column_model [$index]['name']; // $column_model [$index]['type'] = 'serialized'; $column_model [$index]['type'] = 'sm.longstring'; // $column_model [$index]['hidden'] = true; $column_model [$index]['editable'] = false; $column_model [$index]['searchable']= false; $column_model [$index]['batch_editable']= true; $column_model [$index]['width'] = 100; $column_model [$index]['save_state'] = true; $column_model [$index]['wordWrap'] = false; //For disabling word-wrap if( empty($dashboard_model_saved) ) { $position = array_search('product_attributes', $visible_columns); if ($position !== false ) { $column_model [$index]['position'] = $position + 1; $column_model [$index]['hidden'] = false; } else { $column_model [$index]['hidden'] = true; } } $column_model [$index]['allow_showhide'] = true; $column_model [$index]['exportable'] = true; //Code for assigning attr. values $column_model [$index]['values'] = $attributes_val; } else if ( !empty($attr_col_index) && empty($column_model [$attr_col_index]['values']) ) { $column_model [$attr_col_index]['values'] = $attributes_val; //Code for assigning attr. values } //code for creating search columns for attributes if(!empty($attributes_search_val)) { foreach ($attributes_search_val as $key => $value) { ++$index; //Code for including custom columns for product dashboard $column_model [$index] = array(); $column_model [$index]['src'] = 'terms/attribute_'.$key; $column_model [$index]['data'] = sanitize_title(str_replace('/', '_', $column_model [$index]['src'])); // generate slug using the wordpress function if not given $column_model [$index]['name'] = __('Attributes', 'smart-manager-for-wp-e-commerce') .': '. substr($key,3); $column_model [$index]['key'] = $column_model [$index]['name']; $column_model [$index]['type'] = 'dropdown'; $column_model [$index]['hidden'] = true; $column_model [$index]['editable'] = false; $column_model [$index]['batch_editable'] = false; $column_model [$index]['sortable'] = false; $column_model [$index]['resizable'] = false; $column_model [$index]['allow_showhide'] = false; $column_model [$index]['exportable'] = false; $column_model [$index]['searchable'] = true; $column_model [$index]['wordWrap'] = false; //For disabling word-wrap $column_model [$index]['table_name'] = $wpdb->prefix.'terms'; $column_model [$index]['col_name'] = 'attribute_'.$key; $column_model [$index]['width'] = 0; $column_model [$index]['save_state'] = true; //Code for assigning attr. values $column_model [$index]['values'] = array(); $column_model [$index]['search_values'] = $value; } ++$index; //Code for including custom attribute column for product dashboard $column_model [$index] = array(); $column_model [$index]['src'] = 'postmeta/meta_key=_product_attributes/meta_value=_product_attributes'; $column_model [$index]['data'] = sanitize_title(str_replace('/', '_', $column_model [$index]['src'])); // generate slug using the wordpress function if not given $column_model [$index]['name'] = __('Attributes: custom', 'smart-manager-for-wp-e-commerce'); $column_model [$index]['key'] = $column_model [$index]['name']; $column_model [$index]['type'] = 'text'; $column_model [$index]['hidden'] = true; $column_model [$index]['editable'] = false; $column_model [$index]['batch_editable'] = false; $column_model [$index]['sortable'] = false; $column_model [$index]['resizable'] = false; $column_model [$index]['allow_showhide'] = false; $column_model [$index]['exportable'] = false; $column_model [$index]['searchable'] = true; $column_model [$index]['wordWrap'] = false; //For disabling word-wrap $column_model [$index]['table_name'] = $wpdb->prefix.'postmeta'; $column_model [$index]['col_name'] = '_product_attributes'; $column_model [$index]['width'] = 0; $column_model [$index]['save_state'] = true; //Code for assigning attr. values $column_model [$index]['values'] = array(); $column_model [$index]['search_values'] = array(); } if( !empty($product_visibility_index) && empty($dashboard_model_saved) ) { $product_visibility_index = sm_multidimesional_array_search('terms/product_visibility', 'src', $column_model); if( isset( $column_model[$product_visibility_index] ) ) { unset( $column_model[$product_visibility_index] ); $column_model = array_values($column_model); //added for recalculating the indexes of the array $product_visibility_index = sm_multidimesional_array_search ('terms/product_visibility', 'src', $column_model); } $index = sizeof($column_model); if( empty( $product_visibility_index ) ) { //Code for including custom columns for product dashboard $column_model [$index] = array(); $column_model [$index]['src'] = 'terms/product_visibility'; $column_model [$index]['data'] = sanitize_title(str_replace('/', '_', $column_model [$index]['src'])); // generate slug using the wordpress function if not given $column_model [$index]['name'] = __('Catalog Visibility', 'smart-manager-for-wp-e-commerce'); $column_model [$index]['key'] = $column_model [$index]['name']; $column_model [$index]['type'] = 'dropdown'; $column_model [$index]['hidden'] = true; $column_model [$index]['editable'] = true; $column_model [$index]['batch_editable'] = true; $column_model [$index]['sortable'] = true; $column_model [$index]['resizable'] = true; $column_model [$index]['allow_showhide'] = true; $column_model [$index]['exportable'] = true; $column_model [$index]['searchable'] = true; $column_model [$index]['wordWrap'] = false; //For disabling word-wrap $column_model [$index]['table_name'] = $wpdb->prefix.'terms'; $column_model [$index]['col_name'] = 'product_visibility'; $column_model [$index]['width'] = 100; $column_model [$index]['save_state'] = true; //Code for assigning attr. values $column_model [$index]['values'] = $product_visibility_options; $column_model [$index]['search_values'] = array(); if( !empty( $column_model [$index]['values'] ) ) { foreach( $column_model [$index]['values'] as $key => $value ) { $column_model [$index]['search_values'][] = array( 'key' => $key, 'value' => $value ); } } $column_model [$index] ['strict'] = true; $column_model [$index] ['allowInvalid'] = false; $column_model [$index] ['selectOptions'] = $column_model [$index]['values']; $column_model [$index] ['editor'] = 'select'; $column_model [$index] ['renderer'] = 'selectValueRenderer'; } $featured_index = sm_multidimesional_array_search ('terms/product_visibility_featured', 'src', $column_model); if( empty($featured_index) ) { ++$index; $column_model [$index] = array(); $column_model [$index]['src'] = 'terms/product_visibility_featured'; $column_model [$index]['data'] = sanitize_title(str_replace('/', '_', $column_model [$index]['src'])); // generate slug using the wordpress function if not given $column_model [$index]['name'] = __('Featured', 'smart-manager-for-wp-e-commerce'); $column_model [$index]['key'] = $column_model [$index]['name']; $column_model [$index]['type'] = 'checkbox'; $column_model [$index]['checkedTemplate'] = 'yes'; $column_model [$index]['uncheckedTemplate'] = 'no'; $column_model [$index]['hidden'] = true; $column_model [$index]['editable'] = true; $column_model [$index]['wordWrap'] = false; //For disabling word-wrap $column_model [$index]['width'] = 100; $column_model [$index]['save_state'] = true; $column_model [$index]['batch_editable'] = true; $column_model [$index]['sortable'] = true; $column_model [$index]['resizable'] = true; $column_model [$index]['allow_showhide'] = true; $column_model [$index]['exportable'] = true; $column_model [$index]['searchable'] = true; $column_model [$index]['table_name'] = $wpdb->prefix.'terms'; $column_model [$index]['col_name'] = 'product_visibility_featured'; //Code for assigning attr. values $column_model [$index]['values'] = array(); $column_model [$index]['search_values'] = array(); } } if( ! empty( $attribute_meta_cols ) ){ foreach( $attribute_meta_cols as $src => $index ) { if( ! empty( $column_model[$index] ) && ! empty( $attributes_search_val[$src] ) ){ $column_model[$index]['values'] = array(); $column_model[$index]['search_values'] = $attributes_search_val[$src]; foreach( $column_model[$index]['search_values'] as $obj ) { $column_model[$index]['values'][$obj['key']] = $obj['value']; } $column_model[$index]['type'] = 'dropdown'; $column_model[$index]['strict'] = true; $column_model[$index]['allowInvalid'] = false; $column_model[$index]['selectOptions'] = $column_model[$index]['values']; $column_model[$index]['editor'] = 'select'; $column_model[$index]['renderer'] = 'selectValueRenderer'; } } } // if( empty($product_shop_url_index) && empty($dashboard_model_saved) ) { // for product shop url // $index = sizeof($column_model); // //Code for including custom columns for product dashboard // $column_model [$index] = array(); // $column_model [$index]['src'] = 'custom/product_shop_url'; // $column_model [$index]['data'] = sanitize_title(str_replace('/', '_', $column_model [$index]['src'])); // generate slug using the wordpress function if not given // $column_model [$index]['name'] = __(ucwords(str_replace('_', ' ', 'shop_url')), 'smart-manager-for-wp-e-commerce'); // $column_model [$index]['key'] = $column_model [$index]['name']; // $column_model [$index]['hidden'] = true; // $column_model [$index]['editable'] = false; // $column_model [$index]['batch_editable'] = false; // $column_model [$index]['sortable'] = false; // $column_model [$index]['resizable'] = false; // $column_model [$index]['allow_showhide'] = true; // $column_model [$index]['exportable'] = true; // $column_model [$index]['searchable'] = false; // $column_model [$index]['wordWrap'] = false; //For disabling word-wrap // $column_model [$index]['table_name'] = 'custom'; // $column_model [$index]['col_name'] = 'product_shop_url'; // $column_model [$index]['width'] = 100; // $column_model [$index]['save_state'] = true; // //Code for assigning attr. values // $column_model [$index]['values'] = array(); // $column_model [$index]['search_values'] = array(); // } $index = sizeof( $column_model ); //Code for including 'Variations Enabled' column for advanced search for filtering 'Post Status' column for variations. $column_model[ $index ] = array(); $args = array( 'table_nm' => 'posts', 'col' => 'variations_enabled', 'name' => _x('Variations Enabled', 'variations enabled column for advanced search', 'smart-manager-for-wp-e-commerce'), 'key' => _x('Variations Enabled', 'variations enabled column for advanced search', 'smart-manager-for-wp-e-commerce'), 'hidden' => true, 'allow_showhide' => false, 'batch_editable' => false, 'editable' => false, 'exportable' => false, 'resizable' => false, 'save_state' => false, 'sortable' => false, 'type' => 'dropdown', 'values' => array( 'yes' => 'Yes', 'no' => 'No' ), 'searchable' => true, // Enabled advanced search for 'enabled' & 'disabled' product variations for 'Post Status' column. ); $args['search_values'] = array(); if ( ! empty( $args['values'] ) && is_array( $args['values'] ) ) { foreach ( $args['values'] as $key => $value ) { $args['search_values'][] = array( 'key' => $key, 'value' => $value ); } } $column_model[ $index ] = $this->get_default_column_model( $args ); if (!empty($dashboard_model_saved)) { $col_model_diff = sm_array_recursive_diff($dashboard_model_saved,$dashboard_model); } //clearing the transients before return if (!empty($col_model_diff)) { delete_transient( 'sa_sm_'.$this->dashboard_key ); } return $dashboard_model; } public function products_data_model ($data_model, $data_col_params) { global $wpdb, $current_user; $data_model ['display_total_count'] = ( !empty( $this->product_total_count ) ) ? $this->product_total_count : $data_model ['total_count']; //Code for loading the data for the attributes column if(empty($data_model) || empty($data_model['items'])) { return $data_model; } $current_store_model = get_transient( 'sa_sm_'.$this->dashboard_key ); if( ! empty( $current_store_model ) && !is_array( $current_store_model ) ) { $current_store_model = json_decode( $current_store_model, true ); } $col_model = (!empty($current_store_model['columns'])) ? $current_store_model['columns'] : array(); if (!empty($col_model)) { //Code to get attr values by slug name $attr_val_by_slug = array(); $attr_taxonomy_nm = get_object_taxonomies($this->post_type); if ( !empty($attr_taxonomy_nm) ) { foreach ( $attr_taxonomy_nm as $key => $attr_taxonomy ) { if ( substr($attr_taxonomy,0,13) != 'attribute_pa_' ) { unset( $attr_taxonomy_nm[$key] ); } } $attr_terms = array(); if( !empty($attr_taxonomy_nm) ) { $attr_terms = get_terms($attr_taxonomy_nm, array('hide_empty'=> 0,'orderby'=> 'id')); } if ( !empty($attr_terms) ){ foreach ( $attr_terms as $attr_term ) { if (empty($attr_val_by_slug[$attr_term->taxonomy])) { $attr_val_by_slug[$attr_term->taxonomy] = array(); } $attr_val_by_slug[$attr_term->taxonomy][$attr_term->slug] = $attr_term->name; } } } $taxonomy_nm = array(); $term_taxonomy_ids = array(); $post_ids = array(); $parent_ids = array(); $product_attributes_postmeta = array(); $post_parent_hidden = 0; foreach ($col_model as $column) { if (empty($column['src'])) continue; $src_exploded = explode("/",$column['src']); if (!empty($src_exploded) && $src_exploded[1] == 'product_attributes') { $attr_values = $column['values']; if (!empty($attr_values)) { foreach ($attr_values as $key => $attr_value) { $taxonomy_nm[] = $key; $term_taxonomy_ids = $term_taxonomy_ids + $attr_value; } } } if( !empty($src_exploded) && $src_exploded[1] == 'post_parent' && !empty( $column['hidden'] ) ) { $post_parent_hidden = 1; } } // Code for fetching the parent ids incase the post_parent is hidden if( $post_parent_hidden == 1 ) { $ids = array(); $post_parents = array(); foreach( $data_model['items'] as $key => $data ) { if (empty($data['posts_id'])) continue; $ids[] = $data['posts_id']; } if( !empty($ids) ) { $results = $wpdb->get_results($wpdb->prepare("SELECT ID, post_parent FROM {$wpdb->prefix}posts WHERE 1=%d AND post_type IN ('product', 'product_variation') AND id IN (". implode(",",$ids) .")", 1), 'ARRAY_A'); if( !empty( $results ) > 0 ) { foreach( $results as $result ) { $post_parents[ $result['ID'] ] = $result['post_parent']; } } } } $product_visibility_index = sm_multidimesional_array_search('terms/product_visibility', 'src', $col_model); $product_featured_index = sm_multidimesional_array_search('terms/product_visibility_featured', 'src', $col_model); $product_shop_url_index = sm_multidimesional_array_search('custom/product_shop_url', 'src', $col_model); $variation_ids = array(); $key_post_ids = array(); $parent_product_count = 0; foreach ($data_model['items'] as $key => $data) { if (empty($data['posts_id'])) continue; $post_ids[] = $data['posts_id']; if( isset( $data['posts_post_parent'] ) && 0 === intval( $data['posts_post_parent'] ) ) { $parent_product_count++; } if ( empty( $data['posts_post_parent'] ) ) { continue; } $variation_ids[] = $data['posts_id']; $key_post_ids[$data['posts_id']] = $key; } $data_model ['loaded_total_count'] = $parent_product_count; if( !empty( $variation_ids ) ) { //Code for fetching variation attributes for variation title $variation_attribute_results = $wpdb->get_results( $wpdb->prepare("SELECT post_id, meta_key, meta_value FROM {$wpdb->prefix}postmeta WHERE post_id IN (". implode(",", $variation_ids) .") AND meta_key LIKE 'attribute_%' AND 1=%d GROUP BY post_id, meta_key", 1), 'ARRAY_A' ); if( !empty( $variation_attribute_results ) ) { foreach( $variation_attribute_results as $result ) { $key = ( isset( $key_post_ids[$result['post_id']] ) ) ? $key_post_ids[$result['post_id']] : ''; if( empty( $key ) && $key != 0 ) { continue; } $meta_key = 'postmeta_meta_key_'.$result['meta_key'].'_meta_value_'.$result['meta_key']; $data_model['items'][$key][$meta_key] = $result['meta_value']; } } } foreach ($data_model['items'] as $key => $data) { if (empty($data['posts_id'])) continue; $post_ids[] = $data['posts_id']; $data_model['items'][$key]['loaded'] = true; $data_model['items'][$key]['expanded'] = true; if( empty($data['posts_post_parent']) && !empty($post_parents[$data['posts_id']]) ) { $data['posts_post_parent'] = $post_parents[$data['posts_id']]; } if( ! empty( $data_model['items'][$key]['postmeta_meta_key__regular_price_meta_value__regular_price'] ) ) { $decimal_separator = ( ! empty( $this->req_params['cmd'] ) && 'get_export_csv' == $this->req_params['cmd'] ) ? apply_filters( 'sm_decimal_separator_for_export', wc_get_price_decimal_separator(), array( 'col' => 'postmeta_meta_key__regular_price', 'data' => $data_model['items'][$key] ) ) : wc_get_price_decimal_separator(); $data_model['items'][$key]['postmeta_meta_key__regular_price_meta_value__regular_price'] = number_format( (float)$data['postmeta_meta_key__regular_price_meta_value__regular_price'], wc_get_price_decimals(), $decimal_separator, '' ); } if( ! empty( $data_model['items'][$key]['postmeta_meta_key__sale_price_meta_value__sale_price'] ) ) { $decimal_separator = ( ! empty( $this->req_params['cmd'] ) && 'get_export_csv' == $this->req_params['cmd'] ) ? apply_filters( 'sm_decimal_separator_for_export', wc_get_price_decimal_separator(), array( 'col' => 'postmeta_meta_key__sale_price', 'data' => $data_model['items'][$key] ) ) : wc_get_price_decimal_separator(); $data_model['items'][$key]['postmeta_meta_key__sale_price_meta_value__sale_price'] = number_format( (float)$data['postmeta_meta_key__sale_price_meta_value__sale_price'], wc_get_price_decimals(), $decimal_separator, '' ); } if ( !empty($data['posts_post_parent']) ) { $parent_key = sm_multidimesional_array_search($data['posts_post_parent'], 'posts_id', $data_model['items']); $parent_title = ''; // Code for the variation title on sorting // if ( $this->prod_sort === true ) { $parent_title = (!empty($data_model['items'][$parent_key]['posts_post_title'])) ? $data_model['items'][$parent_key]['posts_post_title'] : get_the_title($data['posts_post_parent']); $parent_title .= ( !empty($parent_title) ) ? ' - ' : ''; // } $data_model['items'][$key]['parent'] = $data['posts_post_parent']; $data_model['items'][$key]['isLeaf'] = true; $data_model['items'][$key]['level'] = 1; $data_model['items'][$key]['terms_product_type'] = 'Variation'; if( !empty( $data_model['items'][$key]['custom_edit_link'] ) ) { $data_model['items'][$key]['custom_edit_link'] = ''; } //Code for modifying the variation name $variation_title = ''; foreach ($data as $key1 => $value) { $start_pos = strrpos($key1, '_meta_value_attribute_'); if ( $start_pos !== false ){ $attr_nm = substr($key1, $start_pos+22); $data_model['items'][$key][$key1] = (empty($data_model['items'][$key][$key1])) ? 'any' : $data_model['items'][$key][$key1]; if ( !empty($attr_values[$attr_nm]) ) { $attr_lbl = (!empty($attr_values[$attr_nm]['lbl'])) ? $attr_values[$attr_nm]['lbl'] : $attr_nm; $attr_val = ( !empty($attr_val_by_slug[$attr_nm][$data_model['items'][$key][$key1]]) ) ? $attr_val_by_slug[$attr_nm][$data_model['items'][$key][$key1]] : $data_model['items'][$key][$key1]; $variation_title .= $attr_lbl . ': ' . $attr_val; } else { $variation_title .= $attr_nm . ': ' . $data_model['items'][$key][$key1]; } $variation_title .= ' | '; } } $variation_title = ( ! empty( $data['posts_post_title'] ) && empty( $variation_title ) ) ? $data['posts_post_title'] : ( $parent_title .''. substr( $variation_title, 0, strlen( $variation_title ) - 2 ) ); if( ! empty( $variation_title ) ){ $data_model['items'][$key]['posts_post_title'] = ( ( ! empty( $this->req_params['cmd'] ) && 'get_export_csv' == $this->req_params['cmd'] ) || true === $this->prod_sort ) ? $variation_title : '
            '.'
            '.$variation_title.'
            '; } } else if ( !empty($data['terms_product_type']) ) { if ( $data['terms_product_type'] == 'simple' ) { $data_model['items'][$key]['icon_show'] = false; } $data_model['items'][$key]['parent'] = 'null'; $data_model['items'][$key]['isLeaf'] = false; $data_model['items'][$key]['level'] = 0; } if ( $this->prod_sort === true ) { $data_model['items'][$key]['icon_show'] = false; $data_model['items'][$key]['parent'] = 'null'; $data_model['items'][$key]['isLeaf'] = false; $data_model['items'][$key]['level'] = 0; } if ( empty($data['posts_post_parent']) ) { $parent_ids[] = $data['posts_id']; } // if ( ! empty( $data['postmeta_meta_key__thumbnail_id_meta_value__thumbnail_id'] ) ) { // $thumbnail_id = $data['postmeta_meta_key__thumbnail_id_meta_value__thumbnail_id']; // $attachment = wp_get_attachment_image_src($thumbnail_id, 'full'); // if ( is_array( $attachment ) && ! empty( $attachment[0] ) ) { // $thumbnail = $attachment[0]; // } else { // $thumbnail = ''; // } // $data_model['items'][$key]['postmeta_meta_key__thumbnail_id_meta_value__thumbnail_id'] = $thumbnail; // } else { // $data_model['items'][$key]['postmeta_meta_key__thumbnail_id_meta_value__thumbnail_id'] = ''; // // $data_model['items'][$key]['postmeta_meta_key__thumbnail_id_meta_value__thumbnail_id'] = '
             
            '; // } if( !empty($product_shop_url_index) ) { //for product url $data_model['items'][$key]['custom_product_shop_url'] = get_permalink($data['posts_id']); } if ( empty( $data['postmeta_meta_key__product_addons_exclude_global_meta_value__product_addons_exclude_global'] ) ) { $data_model['items'][$key]['postmeta_meta_key__product_addons_exclude_global_meta_value__product_addons_exclude_global'] = 0; } if ( empty( $data['postmeta_meta_key__wc_mmax_prd_opt_enable_meta_value__wc_mmax_prd_opt_enable'] ) ) { $data_model['items'][$key]['postmeta_meta_key__wc_mmax_prd_opt_enable_meta_value__wc_mmax_prd_opt_enable'] = 0; } if (empty($data['postmeta_meta_key__product_attributes_meta_value__product_attributes'])) continue; $product_attributes_postmeta[$data['posts_id']] = json_decode( $data['postmeta_meta_key__product_attributes_meta_value__product_attributes'], true ); } $data_model['items'] = array_values($data_model['items']); if( !empty($parent_ids) && ( $product_visibility_index != '' || $product_featured_index != '' ) ) { $terms_objects = wp_get_object_terms( $parent_ids, 'product_visibility', 'orderby=none&fields=all_with_object_id' ); $product_visibility = array(); if (!empty($terms_objects)) { foreach ($terms_objects as $terms_object) { $post_id = $terms_object->object_id; $slug = $terms_object->slug; if (!isset($product_visibility[$post_id])){ $product_visibility[$post_id] = array(); } if (!isset($product_visibility[$post_id][$slug])){ $product_visibility[$post_id][$slug] = ''; } } } foreach ($data_model['items'] as $key => $data) { if ( empty($data['posts_id']) || !empty($data['posts_post_parent']) ) continue; $visibility = 'visible'; $featured = 'no'; if( isset($product_visibility[$data['posts_id']]['exclude-from-search']) && isset($product_visibility[$data['posts_id']]['exclude-from-catalog']) ) { $visibility = 'hidden'; } else if( isset($product_visibility[$data['posts_id']]['exclude-from-search']) ) { $visibility = 'catalog'; } else if( isset($product_visibility[$data['posts_id']]['exclude-from-catalog']) ) { $visibility = 'search'; } if( isset($product_visibility[$data['posts_id']]['featured']) ) { $featured = 'yes'; } $data_model['items'][$key]['terms_product_visibility'] = $visibility; $data_model['items'][$key]['terms_product_visibility_featured'] = $featured; } } $terms_objects = wp_get_object_terms( $post_ids, $taxonomy_nm, 'orderby=none&fields=all_with_object_id' ); $attributes_val = array(); $temp_attribute_nm = ""; if (!empty($terms_objects)) { foreach ($terms_objects as $terms_object) { $post_id = $terms_object->object_id; $taxonomy = $terms_object->taxonomy; $term_id = $terms_object->term_id; if (!isset($attributes_val[$post_id])){ $attributes_val[$post_id] = array(); } if (!isset($attributes_val[$post_id][$taxonomy])){ $attributes_val[$post_id][$taxonomy] = array(); } $attributes_val[$post_id][$taxonomy][$term_id] = $terms_object->name; } } //Query to get the attribute name $query_attribute_label = "SELECT attribute_name, attribute_label FROM {$wpdb->prefix}woocommerce_attribute_taxonomies"; $results_attribute_label = $wpdb->get_results( $query_attribute_label, 'ARRAY_A' ); $attribute_label_count = $wpdb->num_rows; $attributes_label = array(); if($attribute_label_count > 0) { foreach ($results_attribute_label as $results_attribute_label1) { $attributes_label['pa_' . $results_attribute_label1['attribute_name']] = array(); $attributes_label['pa_' . $results_attribute_label1['attribute_name']] = $results_attribute_label1['attribute_label']; } } // $query_attributes = $wpdb->prepare("SELECT post_id as id, // meta_value as product_attributes // FROM {$wpdb->prefix}postmeta // WHERE meta_key = '%s' // AND meta_value <> '%s' // AND post_id IN (".implode(',', array_filter($post_ids,'is_int')).") // GROUP BY id",'_product_attributes','a:0:{}'); // $product_attributes = $wpdb->get_results($query_attributes, 'ARRAY_A'); // $product_attributes_count = $wpdb->num_rows; if (!empty($product_attributes_postmeta)) { foreach ($product_attributes_postmeta as $post_id => $prod_attr) { if (empty($prod_attr)) continue; // $prod_attr = json_decode($product_attribute,true); $update_index = sm_multidimesional_array_search ($post_id, 'posts_id', $data_model['items']); $attributes_list = ""; //cond added for handling blank data if (is_array($prod_attr) && !empty($prod_attr)) { $attributes_list = ""; foreach ($prod_attr as &$prod_attr1) { if ( empty( $prod_attr1 ) || ! is_array( $prod_attr1 ) ) { continue; } if( !empty($attributes_list) ) { $attributes_list .= ",
            "; } if ( isset( $prod_attr1['is_taxonomy'] ) && $prod_attr1['is_taxonomy'] == 0 ) { $attributes_list .= ( ( ! empty( $prod_attr1['name'] ) ? $prod_attr1['name'] : '-' ) . ": [" . ( ! empty( $prod_attr1['value'] ) ? trim( $prod_attr1['value'] ) : '-' ) ) ."]"; } else { $attributes_val_current = ( ! empty( $attributes_val[$post_id] ) && ! empty( $attributes_val[$post_id][$prod_attr1['name']] ) ) ? $attributes_val[$post_id][ $prod_attr1['name'] ] : array(); if ( ! empty( $attributes_label[$prod_attr1['name']] ) && ! empty( $attributes_val_current ) && is_array( $attributes_val_current ) ) { $attributes_list .= $attributes_label[$prod_attr1['name']] . ": [" . implode(" | ",$attributes_val_current) . "]"; } $prod_attr1['value'] = $attributes_val_current; } } $data_model['items'][$update_index]['custom_product_attributes'] = $attributes_list; $data_model['items'][$update_index]['postmeta_meta_key__product_attributes_meta_value__product_attributes'] = json_encode($prod_attr); } } } } return $data_model; } //function for modifying edited data before updating public function products_inline_update_pre( $edited_data = array() ) { if ( empty( $edited_data ) ) return $edited_data; global $wpdb; $prod_title_ids = array(); $prev_val = ''; // For getting current task_id if ( true === array_key_exists( 'task_id', $edited_data ) ) { $this->task_id = intval( $edited_data['task_id'] ); unset( $edited_data['task_id'] ); } foreach ( $edited_data as $key => $edited_row ) { if ( empty( $key ) ) { continue; } // Code to handle setting of 'regular_price' & 'sale_price' in proper way if( ! empty( $edited_row['postmeta/meta_key=_regular_price/meta_value=_regular_price'] ) || ! empty( $edited_row['postmeta/meta_key=_sale_price/meta_value=_sale_price'] ) ) { if( !empty( $edited_row['postmeta/meta_key=_regular_price/meta_value=_regular_price'] ) ) { $edited_data[$key]['postmeta/meta_key=_regular_price/meta_value=_regular_price'] = str_replace( wc_get_price_decimal_separator(), '.', $edited_data[$key]['postmeta/meta_key=_regular_price/meta_value=_regular_price']); } if( !empty( $edited_row['postmeta/meta_key=_sale_price/meta_value=_sale_price'] ) ) { $edited_data[$key]['postmeta/meta_key=_sale_price/meta_value=_sale_price'] = str_replace( wc_get_price_decimal_separator(), '.', $edited_data[$key]['postmeta/meta_key=_sale_price/meta_value=_sale_price']); } $regular_price = ( isset( $edited_data[$key]['postmeta/meta_key=_regular_price/meta_value=_regular_price'] ) ) ? $edited_data[$key]['postmeta/meta_key=_regular_price/meta_value=_regular_price'] : get_post_meta( $key, '_regular_price', true ); $sale_price = ( isset( $edited_data[$key]['postmeta/meta_key=_sale_price/meta_value=_sale_price'] ) ) ? $edited_data[$key]['postmeta/meta_key=_sale_price/meta_value=_sale_price'] : get_post_meta( $key, '_sale_price', true ); if ( $sale_price >= $regular_price ) { // For fetching previous value if ( is_callable( array( 'Smart_Manager_Task', 'get_previous_data' ) ) ) { $prev_val = Smart_Manager_Task::get_previous_data( $key, 'postmeta', '_sale_price' ); } if ( isset( $edited_data[$key]['postmeta/meta_key=_sale_price/meta_value=_sale_price'] ) ) { unset( $edited_data[$key]['postmeta/meta_key=_sale_price/meta_value=_sale_price'] ); } $sale_price_update = update_post_meta( $key, '_sale_price', '' ); if ( ( defined('SMPRO') && ( ! empty( SMPRO ) ) ) && ! is_wp_error( $sale_price_update ) && ( ! empty( $this->task_id ) ) && ( ! empty( property_exists( 'Smart_Manager_Base', 'update_task_details_params' ) ) ) && ( ! empty( $key ) ) ) { Smart_Manager_Base::$update_task_details_params[] = array( 'task_id' => $this->task_id, 'action' => 'set_to', 'status' => 'completed', 'record_id' => $key, 'field' => 'postmeta/meta_key=_sale_price/meta_value=_sale_price', 'prev_val' => $prev_val, 'updated_val' => '' ); } } } elseif ( ( ! empty( $edited_data[$key]['postmeta/meta_key=_sale_price_dates_from/meta_value=_sale_price_dates_from'] ) ) && ( ! empty( $edited_row['postmeta/meta_key=_sale_price_dates_from/meta_value=_sale_price_dates_from'] ) ) ) { $edited_data[$key]['postmeta/meta_key=_sale_price_dates_from/meta_value=_sale_price_dates_from'] .= ' 00:00:00'; } elseif ( ( ! empty( $edited_data[$key]['postmeta/meta_key=_sale_price_dates_to/meta_value=_sale_price_dates_to'] ) ) && ( ! empty( $edited_row['postmeta/meta_key=_sale_price_dates_to/meta_value=_sale_price_dates_to'] ) ) ) { $edited_data[$key]['postmeta/meta_key=_sale_price_dates_to/meta_value=_sale_price_dates_to'] .= ' 23:59:59'; } if( false !== strpos($key, 'sm_temp_') ) { continue; } if( !empty( $edited_row['posts/post_title'] ) && ( !empty( Smart_Manager::$sm_is_woo30 ) && Smart_Manager::$sm_is_woo30 == 'true' ) ) { // if( strpos($key, 'sm_temp_') === false ) { $prod_title_ids[] = $key; // } } if ( isset( $edited_row['postmeta/meta_key=_stock/meta_value=_stock'] ) ) { //For handling product inventory updates // For fetching previous value. if( ! empty( $key ) && is_callable( array( 'Smart_Manager_Task', 'get_previous_data' ) ) ) { $prev_val = Smart_Manager_Task::get_previous_data( $key, 'postmeta', '_stock' ); } $stock_status_update = sm_update_stock_status( $key, '_stock', $edited_row['postmeta/meta_key=_stock/meta_value=_stock'] ); // Code for updating stock and it's status. if ( ( ! empty( $stock_status_update ) ) && ( ! empty( $this->task_id ) ) && ( ! empty( property_exists( 'Smart_Manager_Base', 'update_task_details_params' ) ) ) && ( ! empty( $key ) ) ) { Smart_Manager_Base::$update_task_details_params[] = array( 'task_id' => $this->task_id, 'action' => 'set_to', 'status' => 'completed', 'record_id' => $key, 'field' => 'postmeta/meta_key=_stock/meta_value=_stock', 'prev_val' => $prev_val, 'updated_val' => $edited_row['postmeta/meta_key=_stock/meta_value=_stock'] ); } } if ( ! isset( $edited_row['postmeta/meta_key=_product_attributes/meta_value=_product_attributes'] ) ) { continue; } $saved_product_attributes = get_post_meta( $key, '_product_attributes', true ); $product_attributes = array(); if( ! empty( $edited_row['postmeta/meta_key=_product_attributes/meta_value=_product_attributes'] ) ){ $product_attributes = json_decode($edited_row['postmeta/meta_key=_product_attributes/meta_value=_product_attributes'],true); } if ( is_callable( array( 'Smart_Manager_Task', 'get_previous_data' ) ) && ( ! empty( $saved_product_attributes ) ) && ( is_array( $saved_product_attributes ) ) ) { $term_ids = $prev_vals = array(); if( ( ! empty( $product_attributes ) ) && ( is_array( $product_attributes ) ) ) { foreach ( $product_attributes as $attr => $attr_value ) { if ( ! empty( $attr_value['value'] ) && ( is_array( $attr_value['value'] ) ) ) { foreach ( $attr_value['value'] as $term_id => $term_value ) { $term_ids[ $attr ][] = $term_id; } } } } foreach ( $saved_product_attributes as $taxonomy_nm => $value ) { $attr_previous_vals = Smart_Manager_Base::$previous_vals[] = Smart_Manager_Task::get_previous_data( $key, 'terms', $taxonomy_nm ); if ( ( is_wp_error( $attr_previous_vals ) ) || empty( $attr_previous_vals ) || ( ! is_array( $attr_previous_vals ) ) ) continue; foreach ( $attr_previous_vals as $prev_val ) { $attr_previous_vals['term_id'][ $prev_val ] = 'custom/product_attributes_add'; } if ( empty( $attr_previous_vals['term_id'] ) ) continue; switch ( ( ! empty( $term_ids[ $taxonomy_nm ] ) ) && is_array( $attr_previous_vals['term_id'] ) && ( ! empty( $term_ids ) ) ) { case ( count( $term_ids[ $taxonomy_nm ] ) > count( $attr_previous_vals['term_id'] ) ) : $prev_vals = array_diff( $term_ids[ $taxonomy_nm ], array_keys( $attr_previous_vals['term_id'] ) ); if ( ( ! empty( $prev_vals ) ) && is_array( $prev_vals ) ) { foreach ( $prev_vals as $prev_val ) { $attr_previous_vals['term_id'][ $prev_val ] = 'custom/product_attributes_remove'; } } break; case ( count( $term_ids[ $taxonomy_nm ] ) < count( $attr_previous_vals['term_id'] ) ): $prev_vals = array_diff( array_keys( $attr_previous_vals['term_id'] ), $term_ids[ $taxonomy_nm ] ); if ( ( ! empty( $prev_vals ) ) && is_array( $prev_vals ) ) { foreach ( $prev_vals as $prev_val ) { $attr_previous_vals['term_id'][ $prev_val ] = 'custom/product_attributes_add'; } } break; } foreach ( $attr_previous_vals['term_id'] as $term_id => $field_name ) { if ( ( defined('SMPRO') && ( ! empty( SMPRO ) ) ) && ( ! empty( $this->task_id ) ) && ( ! empty( $taxonomy_nm ) ) && ( ! empty( $key ) ) && ( ! empty( $field_name ) ) && ( ! empty( property_exists( 'Smart_Manager_Base', 'update_task_details_params' ) ) ) ) { Smart_Manager_Base::$update_task_details_params[] = array( 'task_id' => $this->task_id, 'action' => $taxonomy_nm, 'status' => 'completed', 'record_id' => $key, 'field' => $field_name, 'prev_val' => $term_id, 'updated_val' => maybe_serialize( $term_ids ) ); } } } } if( ! empty( $saved_product_attributes ) ) { $removed_attributes = array_diff( array_keys( $saved_product_attributes ), array_keys( $product_attributes ) ); if( ! empty( $removed_attributes ) ){ array_walk( $removed_attributes, function( $taxonomy ) use( $key ) { wp_set_object_terms( $key, array(), $taxonomy ); } ); } } if (empty($product_attributes)) { continue; } foreach ($product_attributes as $attr => $attr_value) { if ($attr_value['is_taxonomy'] == 0) continue; $product_attributes[$attr]['value'] = ''; } $product_attributes = sm_multidimensional_array_sort($product_attributes, 'position', SORT_ASC); $edited_data[$key]['postmeta/meta_key=_product_attributes/meta_value=_product_attributes'] = json_encode($product_attributes); } if( !empty( $prod_title_ids ) && ( !empty( Smart_Manager::$sm_is_woo30 ) && Smart_Manager::$sm_is_woo30 == 'true' ) ) { $results = sm_get_current_variation_title( $prod_title_ids ); if( count( $results ) > 0 ) { foreach( $results as $result ) { $this->product_old_title[ $result['id'] ] = $result['post_title']; } } } return $edited_data; } //function for updating product visibility public function set_product_visibility( $id, $visibility ) { if( empty( $id ) || empty( $visibility ) ) { return; } $visibility = strtoupper($visibility); $result = array(); if( $visibility == strtoupper('visible') ) { $result = wp_remove_object_terms( $id, array('exclude-from-search', 'exclude-from-catalog'), 'product_visibility' ); } else { $terms = ''; if( $visibility == strtoupper('catalog') ) { $terms = 'exclude-from-search'; } else if( $visibility == strtoupper('search') ) { $terms = 'exclude-from-catalog'; } else if( $visibility == strtoupper('hidden') ) { $terms = array('exclude-from-search', 'exclude-from-catalog'); } if( !empty($terms) ) { wp_remove_object_terms( $id, array('exclude-from-search', 'exclude-from-catalog'), 'product_visibility' ); $result = wp_set_object_terms( $id, $terms, 'product_visibility', true ); } } return ( ( ! empty( $result ) ) && ( ! is_wp_error( $result ) ) ) ? true : false; } //function for inline update of custom fields public function products_inline_update($edited_data, $params) { global $current_user, $wpdb; if(empty($edited_data)) return; $attr_values = array(); // $current_store_model = get_transient( 'sa_sm_'.$this->dashboard_key ); // if( ! empty( $current_store_model ) && !is_array( $current_store_model ) ) { // $current_store_model = json_decode( $current_store_model, true ); // } $col_model = (!empty($params['col_model'])) ? $params['col_model'] : array(); //fetching col_model from $params as transient gets deleted in case of insert meta $product_visibility_index = sm_multidimesional_array_search('terms_product_visibility', 'data', $col_model); $product_featured_index = sm_multidimesional_array_search('terms_product_visibility_featured', 'data', $col_model); if (!empty($col_model)) { foreach ($col_model as $column) { if (empty($column['src'])) continue; $src_exploded = explode("/",$column['src']); if (!empty($src_exploded) && $src_exploded[1] == 'product_attributes') { $col_values = $column['values']; if (!empty($col_values)) { foreach ($col_values as $key => $col_value) { if ( empty( $key ) || empty( $col_value ) || ( false === is_array( $col_value ) ) || ( false === array_key_exists( 'val', $col_value ) ) || ( false === array_key_exists( 'type', $col_value ) ) || empty( $col_value['type'] ) ) continue; $attribute_name = ( false !== strpos( $key, 'pa_' ) ) ? substr( $key, 3 ) : ''; if ( ! empty( $attribute_name ) ) { $attr_values[ $attribute_name ] = array( 'taxonomy_nm' => $key, 'val' => $col_value['val'], 'type' => $col_value['type'] ); } } } } } } // if( empty($attr_values) && empty($product_visibility_index) && empty($product_featured_index) ) { // return; // } $price_update_ids = array(); $post_title_update_ids = array(); $new_title_update_case = array(); $sm_update_lookup_table_ids = array(); $sm_update_attribute_lookup_table_ids = array(); foreach( $edited_data as $pid => $edited_row ) { if( !empty( $edited_row['posts/post_title'] ) && ( !empty( Smart_Manager::$sm_is_woo30 ) && Smart_Manager::$sm_is_woo30 == 'true' ) ) { if( !empty( $this->product_old_title[ $pid ] ) && $this->product_old_title[ $pid ] != $edited_row['posts/post_title'] ) { $post_title_update_ids[] = $pid; $new_title_update_case[] = 'WHEN post_parent='. $pid .' THEN REPLACE(post_title, \''. $this->product_old_title[ $pid ] .'\', \''. $edited_row['posts/post_title'] .'\')'; } } $id = (!empty($edited_row['posts/ID'])) ? $edited_row['posts/ID'] : $pid; if (empty($id)) continue; //Code to update the '_price' for the products if ( isset($edited_row['postmeta/meta_key=_regular_price/meta_value=_regular_price']) || isset($edited_row['postmeta/meta_key=_sale_price/meta_value=_sale_price']) || isset($edited_row['postmeta/meta_key=_sale_price_dates_from/meta_value=_sale_price_dates_from']) || isset($edited_row['postmeta/meta_key=_sale_price_dates_to/meta_value=_sale_price_dates_to']) ) { $price_update_ids[] = $id; } $sm_update_lookup_table_meta_keys = array( 'postmeta/meta_key=_sku/meta_value=_sku', 'postmeta/meta_key=_regular_price/meta_value=_regular_price', 'postmeta/meta_key=_price/meta_value=_price', 'postmeta/meta_key=_sale_price/meta_value=_sale_price', 'postmeta/meta_key=_virtual/meta_value=_virtual', 'postmeta/meta_key=_downloadable/meta_value=_downloadable', 'postmeta/meta_key=_stock/meta_value=_stock', 'postmeta/meta_key=_manage_stock/meta_value=_manage_stock', 'postmeta/meta_key=_stock_status/meta_value=_stock_status', 'postmeta/meta_key=_wc_rating_count/meta_value=_wc_rating_count', 'postmeta/meta_key=_wc_average_rating/meta_value=_wc_average_rating', 'postmeta/meta_key=total_sales/meta_value=total_sales'); // WC 3.6+ compat if ( ! empty( Smart_Manager::$sm_is_woo36 ) && Smart_Manager::$sm_is_woo36 == 'true' && ! empty( $sm_update_lookup_table_meta_keys ) && ( ! empty( $edited_row ) ) ) { if ( ! empty( array_intersect( array_keys( $edited_row ), $sm_update_lookup_table_meta_keys ) ) ) { $sm_update_lookup_table_ids[] = $id; } } if( isset( $edited_row['postmeta/meta_key=_product_attributes/meta_value=_product_attributes'] ) ) { $sm_update_attribute_lookup_table_ids[] = $id; } // Code for 'WooCommerce Product Stock Alert' plugin compat -- triggering `save_post` action if( empty( $params['posts_fields'] ) && ( isset( $edited_row['postmeta/meta_key=_stock/meta_value=_stock'] ) || isset( $edited_row['postmeta/meta_key=_manage_stock/meta_value=_manage_stock'] ) ) ){ sm_update_post( $id ); } if ( !empty($product_visibility_index) || !empty($product_featured_index) ) { //set the visibility taxonomy $visibility = ( ! empty($edited_row['terms/product_visibility'] ) ) ? $edited_row['terms/product_visibility'] : ''; // For fetching previous value if ( is_callable( array( 'Smart_Manager_Task', 'get_previous_data' ) ) ) { $prev_val = Smart_Manager_Task::get_previous_data( $id, 'terms', 'product_visibility' ); $prev_val = ( ! empty( $prev_val ) && ( ! empty( $params ) ) ) ? sa_sm_format_prev_val( array( 'prev_val' => $prev_val, 'update_column' => 'product_visibility', 'col_data_type' => $params, 'updated_val' => $visibility ) ) : $prev_val; } if ( ! empty( $visibility ) ) { $product_visibility_update = $this->set_product_visibility( $id, $visibility ); if ( ( defined('SMPRO') && ( ! empty( SMPRO ) ) ) && ( ! empty( $this->task_id ) ) && ( ! empty( $id ) ) && ( ! empty( $product_visibility_update ) ) && ( ! empty( property_exists( 'Smart_Manager_Base', 'update_task_details_params' ) ) ) ) { Smart_Manager_Base::$update_task_details_params[] = array( 'task_id' => $this->task_id, 'action' => 'set_to', 'status' => 'completed', 'record_id' => $id, 'field' => 'terms/product_visibility', 'prev_val' => $prev_val, 'updated_val' => $visibility ); } } //set the featured taxonomy $featured = (!empty($edited_row['terms/product_visibility_featured'])) ? $edited_row['terms/product_visibility_featured'] : ''; if( !empty($featured) ) { $result = ( $featured == "Yes" || $featured == "yes" ) ? wp_set_object_terms($id, 'featured', 'product_visibility', true) : wp_remove_object_terms( $id, 'featured', 'product_visibility' ); if ( ! empty( $result ) ) { if ( ( defined('SMPRO') && ( ! empty( SMPRO ) ) ) && ! empty( $this->task_id ) && ! empty( $id ) && ! empty( property_exists( 'Smart_Manager_Base', 'update_task_details_params' ) ) && ! empty( $featured ) ) { Smart_Manager_Base::$update_task_details_params[] = array( 'task_id' => $this->task_id, 'action' => 'set_to', 'status' => 'completed', 'record_id' => $id, 'field' => 'terms/product_visibility_featured', 'prev_val' => ( "Yes" === $featured || "yes" === $featured ) ? 'no' : 'yes', 'updated_val' => $featured ); } } } } if ( isset( $edited_row['postmeta/meta_key=_backorders/meta_value=_backorders'] ) ) { // For fetching previous value. if ( ! empty( $pid ) && is_callable( array( 'Smart_Manager_Task', 'get_previous_data' ) ) ) { $prev_val = Smart_Manager_Task::get_previous_data( $pid, 'postmeta', '_backorders' ); } $stock_status_update = sm_update_stock_status( $pid, '_backorders', $edited_row['postmeta/meta_key=_backorders/meta_value=_backorders'] ); // Code for updating stock and it's status. if ( ( ! empty( $stock_status_update ) ) && ( ! empty( $this->task_id ) ) && ( ! empty( property_exists( 'Smart_Manager_Base', 'update_task_details_params' ) ) ) && ( ! empty( $pid ) ) ) { Smart_Manager_Base::$update_task_details_params[] = array( 'task_id' => $this->task_id, 'action' => 'set_to', 'status' => 'completed', 'record_id' => $pid, 'field' => 'postmeta/meta_key=_backorders/meta_value=_backorders', 'prev_val' => $prev_val, 'updated_val' => $edited_row['postmeta/meta_key=_backorders/meta_value=_backorders'] ); } } $attr_edited = (!empty($edited_row['custom/product_attributes'])) ? $edited_row['custom/product_attributes'] : ''; $attr_edited = array_filter(explode(',
            ',$attr_edited)); if (empty($attr_edited)) continue; foreach ($attr_edited as $attr) { $attr_data = explode(': ',$attr); if (empty($attr_data)) continue; $taxonomy_nm = $attr_data[0]; $attr_editd_val = (substr($attr_data[1], 0, 1) == '[') ? substr($attr_data[1], 1) : $attr_data[1]; $attr_editd_val = (substr($attr_editd_val, -1) == ']') ? substr($attr_editd_val, 0, -1) : $attr_editd_val; if (!empty($attr_values[$taxonomy_nm])) { //Code for type=select attributes $attr_val = $attr_values[$taxonomy_nm]['val']; $attr_type = $attr_values[$taxonomy_nm]['type']; $taxonomy_nm = $attr_values[$taxonomy_nm]['taxonomy_nm']; $attr_editd_val = array_filter(explode(" | ",$attr_editd_val)); // if (empty($attr_editd_val)) continue; $term_ids = array(); foreach ($attr_editd_val as $attr_editd) { $term_id = array_search($attr_editd, $attr_val); if ($term_id === false && $attr_type == 'text') { $new_term = wp_insert_term($attr_editd, $taxonomy_nm); if ( !is_wp_error( $new_term ) ) { $term_id = (!empty($new_term['term_id'])) ? $new_term['term_id'] : ''; } } $term_ids [] = $term_id; } if( ! empty( $id ) && is_callable( array( 'Smart_Manager_Task', 'get_previous_data' ) ) ) { $prev_val = Smart_Manager_Task::get_previous_data( $id, 'terms', $taxonomy_nm ); } wp_set_object_terms( $id, $term_ids, $taxonomy_nm ); } } } if( ! empty ( $sm_update_attribute_lookup_table_ids ) ) { sm_update_product_attribute_lookup_table( $sm_update_attribute_lookup_table_ids ); } if( !empty( $price_update_ids ) ) { sm_update_price_meta($price_update_ids); //Code For updating the parent price of the product sm_variable_parent_sync_price($price_update_ids); } // Update the post title for variations if parent is updated if( !empty( $new_title_update_case ) && !empty( $post_title_update_ids ) ) { sm_sync_variation_title( $new_title_update_case, $post_title_update_ids ); } /** * To update wc_product_meta_lookup for WC 3.6+ * Since SM 4.2.3 */ if ( !empty( $sm_update_lookup_table_ids ) ) { sm_update_product_lookup_table( $sm_update_lookup_table_ids ); } // Delete the product transients if( function_exists('wc_delete_product_transients') ) { $pids = array_keys( $edited_data ); if( !empty( $pids ) ) { foreach( $pids as $id ) { wc_delete_product_transients( $id ); } } } } public function inline_update_product_featured_image() { if ( ! empty( $_POST['update_field'] ) && 'postmeta_meta_key__thumbnail_id_meta_value__thumbnail_id' === $_POST['update_field'] ) { $product_id = ( ! empty( $_POST['product_id'] ) && is_numeric( $_POST['product_id'] ) ) ? $_POST['product_id'] : 0; $attachment_id = ( ! empty( $_POST['selected_attachment_id'] ) && is_numeric( $_POST['selected_attachment_id'] ) ) ? $_POST['selected_attachment_id'] : 0; if ( ! empty( $product_id ) && ! empty( $attachment_id ) ) { update_post_meta( $product_id, '_thumbnail_id', $attachment_id ); if( isset( $this->req_params['pro'] ) && empty( $this->req_params['pro'] ) ) { $sm_inline_update_count = get_option( 'sm_inline_update_count', 0 ); $sm_inline_update_count += 1; update_option( 'sm_inline_update_count', $sm_inline_update_count, 'no' ); $resp = array( 'sm_inline_update_count' => $sm_inline_update_count, 'msg' => esc_html__( 'Featured Image updated successfully', 'smart-manager-for-wp-e-commerce' ) ); $msg = json_encode($resp); } else { $msg = esc_html__( 'Featured Image updated successfully', 'smart-manager-for-wp-e-commerce' ); } echo $msg; } else { echo esc_html( 'failed' ); } } exit; } //Function to modify the postmeta search column value for postmeta cols public function sm_search_format_query_postmeta_col_value( $search_value='', $search_params=array() ) { $search_col = ( !empty( $search_params['search_col'] ) ) ? $search_params['search_col'] : ''; if( empty( $search_col ) || ! is_numeric( $search_value ) || ( ! empty( $search_col ) && ! in_array( $search_col, array( '_sale_price_dates_from', '_sale_price_dates_to' ) ) ) ){ return $search_value; } return $search_value + ( ( '_sale_price_dates_to' === $search_col ) ? (DAY_IN_SECONDS - 1) : 0 ); } /** * Function to filter updated edited data in case of editing stock value using inline edit. * @param array $updated_edited_data array of updated edited data. * @return array $updated_edited_data filtered updated edited data array. */ public function filter_updated_edited_data( $updated_edited_data = array() ) { if ( ( ! is_array( $updated_edited_data ) ) || ( defined('SMPRO') && ( ! empty( SMPRO ) ) ) ) { return $updated_edited_data; } foreach ( $updated_edited_data as $key => $values ) { foreach ( $values as $col => $value ) { if ( 'postmeta/meta_key=_stock/meta_value=_stock' !== $col ) { unset( $updated_edited_data[ $key ][ $col ] ); } } } if ( empty( $updated_edited_data ) ) { return $updated_edited_data; } $this->req_params['title'] = _x( 'Edited Stock', 'Title for task', 'smart-manager-for-wp-e-commerce' ); return $updated_edited_data; } /** * Function to filter the column model for export CSV. * @param array $col_model column model data. * @param array $params request params array. * @return array $col_model array of updated column model data. */ public function col_model_for_export( $col_model = array(), $params = array() ) { if ( empty( $col_model ) || ! is_array( $col_model ) || empty( $params ) || ! is_array( $params ) || ( ! empty( $params['storewide_option'] ) && 'entire_store' === $params['storewide_option'] ) || ( ! empty( $params['columnsToBeExported'] ) && 'visible' === $params['columnsToBeExported'] ) ) { return $col_model; } $stock_cols = array( 'ID', '_sku', 'post_title', '_manage_stock', '_stock_status', '_backorders', '_stock', 'product_type', 'post_parent' ); foreach ( $col_model as $key => &$column ) { if ( empty( $column['src'] ) ) continue; $src_exploded = explode( "/", $column['src'] ); if ( empty( $src_exploded ) ) { $src = $column['src']; } $src = $src_exploded[1]; $col_table = $src_exploded[0]; if ( sizeof( $src_exploded ) > 2 ) { $col_table = $src_exploded[0]; $cond = explode( "=", $src_exploded[1] ); if ( 2 === sizeof( $cond ) ) { $src = $cond[1]; } } if ( empty( $src ) ) { continue; } if ( false === in_array( $src, $stock_cols ) ) { unset( $col_model[ $key ] ); continue; } $column['hidden'] = false; } return $col_model; } /** * Function to handle custom posts conditions for advanced search. * @param string $posts_cond posts search condition. * @param array $search_params search params. * @return string $posts_cond updated posts condition. */ public function sm_search_posts_cond( $posts_cond = '', $search_params = array() ) { if ( empty( $search_params ) || empty( $search_params['search_operator'] ) || false === strpos( $posts_cond, 'variations_enabled' ) ) { return $posts_cond; } global $wpdb; $post_status = 'publish'; switch ( $search_params['search_operator'] ) { case 'is': $post_status = strpos( $posts_cond, 'yes' ) ? 'publish' : 'private'; break; case 'is not': $post_status = strpos( $posts_cond, 'yes' ) ? 'private' : 'publish'; break; } $posts_cond = $wpdb->prefix."posts.post_status = '{$post_status}' AND ".$wpdb->prefix."posts.post_parent > 0"; $this->is_variations_enabled_advanced_search_condition = true; return $posts_cond; } /** * Function to ignore columns for simple search. * @param array $ignored_cols array of ignored columns. * @param array $col_model column model array. * @return array $ignored_cols updated array of ignored columns. */ public function sm_simple_search_ignored_posts_columns( $ignored_cols = array(), $col_model = array() ) { if ( empty( $col_model ) || ! is_array( $col_model ) || ! is_array( $ignored_cols ) ) { return $ignored_cols; } foreach ( $col_model as $col ) { if ( empty( $col['src'] ) || empty( $col['col_name'] ) || ( ! empty( $col['col_name'] ) && 'variations_enabled' !== $col['col_name'] ) ) { continue; } $src_exploded = explode( "/", $col['src'] ); if ( empty( $src_exploded ) || ! is_array( $src_exploded ) || empty( $src_exploded[0] ) || 'posts' !== $src_exploded[0] ) { return $ignored_cols; } return array_merge( $ignored_cols, array( $col['col_name'] ) ); } } /** * Modifies the GROUP BY clause of a query. * * @param string $group_by The existing GROUP BY clause. * @return string The modified GROUP BY clause. */ public function query_group_by ( $group_by = '' ) { return $this->get_group_by_clause_for_search( array( 'group_by' => $group_by ) ); } /** * Adds custom JOIN clauses to the SQL query for products. * * @param string $join The existing JOIN clause. * @param array|string $sort_params The sorting parameters, if any. * @return string The modified JOIN clause. */ public function query_join ( $join = '', $sort_params = '' ) { return $this->get_join_clause_for_search( array( 'join' => $join, 'sort_params' => $sort_params ) ); } } //End of Class } classes/class-smart-manager-task.php000064400000046735147600337620013542 0ustar00 'id' ), ( ! empty( $advanced_search_table_types['flat'] ) ? $advanced_search_table_types['flat'] : array() ) ); return $advanced_search_table_types; } ); // should be kept before calling the parent class constructor. parent::__construct( $dashboard_key ); $this->dashboard_key = $dashboard_key; if ( file_exists(SM_PLUGIN_DIR_PATH . '/pro/classes/class-smart-manager-pro-base.php') ) { include_once SM_PLUGIN_DIR_PATH . '/pro/classes/class-smart-manager-pro-base.php'; $this->pro_base = new Smart_Manager_Pro_Base( $dashboard_key ); $this->advance_search_operators = ( ! empty( $this->pro_base->advance_search_operators ) ) ? $this->pro_base->advance_search_operators : $this->advance_search_operators; } $this->store_col_model_transient_option_nm = 'sa_sm_' . $this->dashboard_key . '_tasks'; add_filter( 'sm_default_dashboard_model', array( &$this, 'generate_dashboard_model' ) ); add_filter( 'sm_data_model', array( &$this, 'generate_data_model' ), 10, 2 ); add_filter( 'sm_beta_load_default_store_model', function() { return false; } ); add_filter( 'sm_beta_load_default_data_model', function() { return false; } ); } /** * Generate dashboard model * * @param array $dashboard_model array contains the dashboard_model data. * @return array $dashboard_model returns dashboard_model data */ public function generate_dashboard_model( $dashboard_model = array() ) { global $wpdb; $col_model = array(); $results = $wpdb->get_results( "SHOW COLUMNS FROM {$wpdb->prefix}sm_tasks", 'ARRAY_A' ); $num_rows = $wpdb->num_rows; $enum_fields = array( 'status', 'type' ); $display_names = array( 'id' => __( 'ID', 'smart-manager-for-wp-e-commerce' ) ); if ( $num_rows > 0 ) { foreach ( $results as $result ) { $field_nm = ( ! empty( $result['Field'] ) ) ? $result['Field'] : ''; $args = array( 'table_nm' => 'sm_tasks', 'col' => $field_nm, 'db_type' => ( ! empty( $result['Type'] ) ) ? $result['Type'] : '', 'editable' => false, 'editor' => false, ); if ( 'post_type' === $field_nm ) { $args['type'] = 'dropdown'; $args['search_values'][] = array( 'key' => $this->dashboard_key, 'value' => __( ucwords( str_replace( '_', ' ', $this->dashboard_key ) ), 'smart-manager-for-wp-e-commerce' ) ); } elseif ( in_array( $field_nm, $enum_fields, true ) ) { $args['type'] = 'dropdown'; $args['width'] = 100; if ( ! empty( $this->get_col_values( $field_nm ) ) && is_array( $this->get_col_values( $field_nm ) ) ) { foreach ( $this->get_col_values( $field_nm ) as $key => $value ) { $args['search_values'][] = array( 'key' => $key, 'value' => $value, ); } } } elseif ( 'actions' === $field_nm ) { $args['editor'] = 'sm.serialized'; } elseif ( 'record_count' === $field_nm ) { $args['width'] = 100; } if( ! empty( $display_names[$field_nm] ) ){ $args['name'] = $display_names[$field_nm]; } $col_model [] = $this->get_default_column_model( $args ); } } return array( 'display_name' => __( ucwords( str_replace( '_', ' ', $this->dashboard_key . '_tasks' ) ), 'smart-manager-for-wp-e-commerce' ), 'columns' => $col_model, 'per_page_limit' => '', // blank, 0, -1 all values refer to infinite scroll. 'treegrid' => false, // flag for setting the treegrid. ); } /** * Generate data model * * @param array $data_model array containing the data model. * @param array $data_col_params array containing column params. * @return array $data_model returns data_model array */ public function generate_data_model( $data_model = array(), $data_col_params = array() ) { global $wpdb; $current_user_id = get_current_user_id(); $items = array(); $index = 0; $post_type = array( $this->dashboard_key ); $current_user_role = ( is_callable( array( 'Smart_Manager', 'get_current_user_role' ) ) ) ? Smart_Manager::get_current_user_role() : ''; $where = apply_filters( 'sm_where_tasks_cond', ' AND '. $wpdb->prefix . 'sm_tasks.post_type = %s' . ( (!empty( $current_user_role ) && 'administrator' === $current_user_role) ? '' : ' AND author = %d') ); $order_by = apply_filters( 'sm_orderby_tasks_cond', $wpdb->prefix . 'sm_tasks.id DESC ' ); $group_by = apply_filters( 'sm_groupby_tasks_cond', ' ' . $wpdb->prefix . 'sm_tasks.id ' ); $join = apply_filters( 'sm_join_tasks_cond', '' ); $select = apply_filters( 'sm_select_tasks_query', "SELECT {$wpdb->prefix}sm_tasks.*" ); $from = apply_filters( 'sm_from_tasks_query', " FROM {$wpdb->prefix}sm_tasks" ); $start = ( ! empty( $this->req_params['start'] ) ) ? intval( $this->req_params['start'] ) : 0; $limit = ( ! empty( $this->req_params['sm_limit'] ) ) ? intval( $this->req_params['sm_limit'] ) : 50; $current_page = ( ! empty( $this->req_params['sm_page'] ) ) ? $this->req_params['sm_page'] : '1'; $start_offset = ( ( $current_page > 1 ) && ( ! empty( $limit ) ) ) ? intval( ( ( $current_page - 1 ) * $limit ) ) : $start; $current_store_model = self::get_store_model_transient(); if ( ! empty( $current_store_model ) && ! is_array( $current_store_model ) ) { $current_store_model = json_decode( $current_store_model, true ); } $col_model = ( ! empty( $current_store_model['columns'] ) ) ? $current_store_model['columns'] : array(); if ( empty( $col_model ) || ! is_array( $col_model ) ) { return; } $search_cols_type = array(); // array for col & its type for advanced search. // Code to handle simple search functionality. $simple_search_where_cond = array(); $search_text = ''; if ( ! empty( $this->req_params['search_text'] ) || ( ! empty( $this->req_params['advanced_search_query'] ) && '[]' !== $this->req_params['advanced_search_query'] ) ) { if ( ! empty( $this->req_params['search_text'] ) ) { $search_text = $wpdb->_real_escape( $this->req_params['search_text'] ); } // Code for getting tasks table condition. foreach ( $col_model as $col ) { switch ( true ) { case ( ! empty( $this->req_params['search_text'] ) ): if ( empty( $col['src'] ) ) { break; } $src_exploded = explode( '/', $col['src'] ); if ( ! empty( $src_exploded[0] ) && ( 'sm_tasks' === $src_exploded[0] ) ) { $simple_search_where_cond[] = "( {$wpdb->prefix}sm_tasks." . $src_exploded[1] . " LIKE %s )"; } break; default: if ( ! empty( $col['table_name'] ) && ! empty( $col['col_name'] ) ) { $search_cols_type[ $col['table_name'] . '.' . $col['col_name'] ] = $col['type']; } } } if ( ! empty( $this->req_params['search_text'] ) ) { $where .= ( ! empty( $simple_search_where_cond ) ) ? ' AND (' . implode( ' OR ', $simple_search_where_cond ) . ' )' : ''; } } // Code fo handling advanced search functionality. $sm_advanced_search_results_persistent = 0; // flag to handle persistent search results. if ( ! empty( $this->req_params['advanced_search_query'] ) && ( '[]' !== $this->req_params['advanced_search_query'] ) ) { $this->req_params['advanced_search_query'] = json_decode( stripslashes( $this->req_params['advanced_search_query'] ), true ); if ( ! empty( $this->req_params['advanced_search_query'] ) ) { $this->advance_search_operators = ( ! empty( $data_col_params['advance_search_operators'] ) ) ? $data_col_params['advance_search_operators'] : $this->advance_search_operators; if ( ! empty( $this->req_params['table_model']['posts']['where']['post_type'] ) ) { $post_type = ( is_array( $this->req_params['table_model']['posts']['where']['post_type'] ) ) ? $this->req_params['table_model']['posts']['where']['post_type'] : array( $this->req_params['table_model']['posts']['where']['post_type'] ); } $this->process_search_cond( array( 'post_type' => $post_type, 'search_query' => ( ! empty( $this->req_params['advanced_search_query'] ) ) ? $this->req_params['advanced_search_query'] : array(), 'SM_IS_WOO30' => ( ! empty( $this->req_params['SM_IS_WOO30'] ) ) ? $this->req_params['SM_IS_WOO30'] : '', 'search_cols_type' => $search_cols_type, 'data_col_params' => $data_col_params, ) ); } $join .= " JOIN {$wpdb->base_prefix}sm_advanced_search_temp ON ({$wpdb->base_prefix}sm_advanced_search_temp.product_id = {$wpdb->prefix}sm_tasks.id)"; $where .= " AND {$wpdb->base_prefix}sm_advanced_search_temp.flag > 0"; } // Code for sorting task records. if ( ! empty( $this->req_params['sort_params'] ) && ! empty( $data_col_params['data_cols'] ) ) { $sort_params = $this->build_query_sort_params( array( 'sort_params' => $this->req_params['sort_params'], 'data_cols' => $data_col_params['data_cols'] ) ); if( ! empty( $sort_params ) && ! empty( $sort_params['table'] ) && ! empty( $sort_params['column_nm'] && ! empty( $sort_params['sortOrder'] ) ) ) { $order_by = $wpdb->prefix . $sort_params['table'] . '.' . $sort_params['column_nm'] . ' ' . $sort_params['sortOrder'] . ' '; } } $query_limit_str = ( ! empty( $this->req_params['cmd'] ) && ( 'get_export_csv' === $this->req_params['cmd'] ) ) ? '' : 'LIMIT ' . $start_offset . ', ' . $limit; $user_id_constraint = ( ! empty( $current_user_role ) && 'administrator' === $current_user_role ) ? '' : $current_user_id; $args = ( ( ! empty( $this->req_params['search_text'] ) ) ? array_merge( array( 1, $this->dashboard_key, $user_id_constraint ), array_fill( 0, sizeof( $simple_search_where_cond ), '%' . $wpdb->esc_like( $search_text ) . '%' ) ) : array( 1, $this->dashboard_key, $user_id_constraint ) ); $ids = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT {$wpdb->prefix}sm_tasks.id" . $from . $join . " WHERE 1 = %d" . $where, $args ) ); $total_count = $wpdb->num_rows; // Code for saving the task ids. if ( ( defined( 'SMPRO' ) && true === SMPRO ) && ( ! empty( $this->req_params['search_text'] ) ) || ( ! empty( $this->req_params['advanced_search_query'] ) && '[]' === $this->req_params['advanced_search_query'] ) && ( ! empty( $ids ) ) ) { set_transient( 'sa_sm_search_post_ids', implode( ',', $ids ), WEEK_IN_SECONDS ); } $task_results = $wpdb->get_results( $wpdb->prepare( $select . $from . $join . " WHERE 1=%d " . $where . " GROUP BY" . $group_by . " ORDER BY " . $order_by . $query_limit_str, $args ), ARRAY_A ); $total_pages = 1; if ( ( ! empty( $total_count ) ) && ( $total_count > $limit ) && ( 'get_export_csv' !== $this->req_params['cmd'] ) ) { $total_pages = ceil( $total_count / $limit ); } if ( ! empty( $task_results ) ) { foreach ( $task_results as $tasks ) { foreach ( $tasks as $key => $value ) { if ( is_array( $data_col_params['data_cols'] ) && ! empty( $data_col_params['data_cols'] ) ) { if ( false === array_search( $key, $data_col_params['data_cols'] ) ) { continue; // cond for checking col in col model. } } $key_mod = ( ( ( ! empty( $this->key_mod_fields ) ) && is_array( $this->key_mod_fields ) && in_array( $key, $this->key_mod_fields ) ) ? 'sm_task_details_' : 'sm_tasks_' ) . strtolower( str_replace( ' ', '_', $key ) ); $items[ $index ][ $key_mod ] = $value; if ( 'author' === $key ) { $user_info = get_user_by( 'id', intval( $value ) ); $items[ $index ][ $key_mod ] = ( $user_info instanceof WP_User ) ? ( ( ! empty( $user_info->display_name ) ? $user_info->display_name : '' ) . ( ! empty( $user_info->user_email ) ? ' (' . $user_info->user_email . ')' : '' ) ) : ''; } } $index++; } } $data_model ['items'] = ( ! empty( $items ) ) ? $items : array(); $data_model ['start'] = $start + $limit; $data_model ['page'] = $current_page; $data_model ['total_pages'] = ( ! empty( $total_pages ) ) ? $total_pages : 0; $data_model ['total_count'] = ( ! empty( $total_count ) ) ? $total_count : 0; return $data_model; } /** * Task updation * * @param array $params contains status, completed date, title, date, post type, author, type, status, actions, record_count. * @return int inserted task id in case of insertion or number of affected rows in case of updation */ public static function task_update( $params = array() ) { global $wpdb; if ( empty( $params ) && ( ! is_array( $params ) ) ) { if ( is_callable( array( 'Smart_Manager', 'log' ) ) ) { Smart_Manager::log( 'error', _x( 'No params found for updating task ', 'task update params', 'smart-manager-for-wp-e-commerce' ) ); } return; } if ( ( ! empty( $params['task_id'] ) ) && ( ( ! empty( $params['status'] ) ) || ( ! empty( $params['completed_date'] ) ) ) ) { $set_query = ''; switch ( $params ) { case ( ! empty( $params['status'] ) && ( ! isset( $params['completed_date'] ) ) ): $set_query = "status = '{$params['status']}'"; break; case ( ! isset( $params['status'] ) && ( ! empty( $params['completed_date'] ) ) ): $set_query = "completed_date = '{$params['completed_date']}'"; break; default: $set_query = "status = '{$params['status']}', completed_date = '{$params['completed_date']}'"; } if ( empty( $set_query ) ) { return; } return $wpdb->query( "UPDATE {$wpdb->prefix}sm_tasks SET " . $set_query . " WHERE id = " . $params['task_id'] . "" ); } elseif ( ! empty( $params['title'] ) && ! empty( $params['post_type'] ) && ! empty( $params['type'] ) && ! empty( $params['actions'] ) && ! empty( $params['record_count'] ) ) { $wpdb->query( $wpdb->prepare( "INSERT INTO {$wpdb->prefix}sm_tasks( title, date, completed_date, post_type, author, type, status, actions, record_count) VALUES( %s, %s, %s, %s, %d, %s, %s, %s, %d )", $params['title'], ( ! empty( $params['created_date'] ) ) ? $params['created_date'] : '0000-00-00 00:00:00', '0000-00-00 00:00:00', $params['post_type'], get_current_user_id(), $params['type'], ( ! empty( $params['status'] ) ) ? $params['status'] : 'in-progress', json_encode( $params['actions'] ), $params['record_count'] ) ); } return ( ! is_wp_error( $wpdb->insert_id ) ) ? $wpdb->insert_id : 0; } /** * Insert task details into sm_task_details table * * @param array $params contains task_id, action, status, record_id, field, prev_val, updated_val. * @return void */ public static function task_details_update() { global $wpdb; $params = ( ! empty( property_exists( 'Smart_Manager_Base', 'update_task_details_params' ) ) ) ? Smart_Manager_Base::$update_task_details_params : array(); if ( empty( $params ) && ( ! is_array( $params ) ) ) { return; } $task_id = array(); $task_details_id = array(); foreach ( $params as $param ) { if ( empty( $param['task_id'] ) || empty( $param['action'] ) || empty( $param['status'] ) || empty( $param['record_id'] ) || empty( $param['field'] ) ) { continue; } $task_id = array( $param['task_id'] ); $wpdb->query( $wpdb->prepare( "INSERT INTO {$wpdb->prefix}sm_task_details( task_id, action, status, record_id, field, prev_val, updated_val ) VALUES( %d, %s, %s, %d, %s, %s, %s )", $param['task_id'], $param['action'], $param['status'], $param['record_id'], $param['field'], ( isset( $param['prev_val'] ) ) ? $param['prev_val'] : '', ( isset( $param['updated_val'] ) ) ? maybe_serialize( $param['updated_val'] ) : '' ) ); $task_details_id[] = ( ! is_wp_error( $wpdb->insert_id ) ) ? $wpdb->insert_id : array(); } if ( ( ! empty( $task_details_id ) ) && ( count( $params ) === count( $task_details_id ) ) ) { self::task_update( array( 'task_id' => implode( '', $task_id ), 'status' => 'completed', 'completed_date' => date( 'Y-m-d H:i:s' ) ) ); } } /** * Get previous data * * @param int $post_id for getting previous data by passing post id. * @param string $table for getting previous data by passing table name. * @param string $column for getting previous data by passing column name. * @return result of function call */ public static function get_previous_data( $post_id = 0, $table = '', $column = '' ) { if ( empty( $post_id ) || empty( $table ) || empty( $column ) ) { return; } switch ( $table ) { case 'posts': return get_post_field( $column, $post_id ); case 'postmeta': return get_post_meta( $post_id, $column, true ); case 'terms': return wp_get_object_terms( $post_id, $column, 'orderby=none&fields=ids' ); } } /** * Get store column model transient * * @return result of function call */ public function get_store_model_transient() { if ( empty( $this->store_col_model_transient_option_nm ) ) { return; } return get_transient( $this->store_col_model_transient_option_nm ); } /** * Get column values for particular column * * @param string $field_nm field name - column/field name * @return array array of column values for particular column */ public function get_col_values( $field_nm = '' ) { if ( empty( $field_nm ) ) { return; } switch( $field_nm ) { case 'status': return array( 'in-progress' => __( 'In Progress', 'smart-manager-for-wp-e-commerce' ), 'completed' => __( 'Completed', 'smart-manager-for-wp-e-commerce' ), 'scheduled' => __( 'Scheduled', 'smart-manager-for-wp-e-commerce' ), ); case 'type': return array( 'inline' => __( 'Inline', 'smart-manager-for-wp-e-commerce' ), 'bulk_edit' => __( 'Bulk Edit', 'smart-manager-for-wp-e-commerce' ), ); } } } } classes/class-smart-manager-settings.php000064400000011601147600337620014420 0ustar00 array( 'toggle' => array( 'wp_force_collapse_admin_menu' => 'yes', 'use_number_field_for_numeric_cols' => 'yes', 'use_date_picker_for_date_or_datetime_cols' => 'yes', 'view_trash_records' => 'no', 'show_manage_with_smart_manager_button' => 'yes', 'show_smart_manager_menu_in_admin_bar' => 'yes' ), 'numeric' => array( 'per_page_record_limit' => 50 ), 'text' => array( 'grid_row_height' => '50px' ) ) ) ); } /** * Function to merge settings * * @param array $defaults Default settings array * @param array $all_settings Settings array * @param string $setting_nm Setting name * @return array/string Merged settings array or specific setting value */ public static function merge( $defaults = array(), $all_settings = array(), $setting_nm = '' ){ if( empty( $defaults ) ){ return ( empty( $setting_nm ) ) ? array() : ''; } foreach( $defaults as $group => $settings ){ if( empty( $settings ) ){ continue; } foreach( $settings as $type => $values ){ if( empty( $values ) || ! is_array( $values ) ){ continue; } foreach( $values as $setting => $value ){ $value = ( ! empty( $all_settings ) && ! empty( $all_settings[$group] ) && ! empty( $all_settings[$group][$type] ) && isset( $all_settings[$group][$type][$setting] ) ) ? $all_settings[$group][$type][$setting] : $value; $defaults[$group][$type][$setting] = apply_filters( 'sm_setting_value', $value, array( 'group' => $group, 'type' => $type, 'setting' => $setting ) ); } if( ! empty( $setting_nm ) && isset( $defaults[$group][$type][$setting_nm] ) ){ return $defaults[$group][$type][$setting_nm]; } } } return ( empty( $setting_nm ) ) ? $defaults : ''; } /** * Function to get saved settings * * @param string $setting_nm Setting name * @return array/string Settings array or specific setting value */ public static function get( $setting_nm = '' ){ self::$saved_settings = ( empty( self::$saved_settings ) ) ? get_option( self::$db_option_key, array() ) : self::$saved_settings; return self::merge( self::get_defaults(), self::$saved_settings, $setting_nm ); } /** * Function to update settings * * @param array $settings Settings array * @return boolean Flag to determine whether the update was successful or not */ public static function update( $settings = array() ){ if( empty( $settings ) ){ return false; } $default_settings = self::get_defaults(); if( empty( $default_settings ) || ( ! empty( $default_settings ) && empty( $default_settings['general'] ) ) || empty( $settings['general'] ) ){ return false; } return update_option( self::$db_option_key, self::merge( $default_settings, $settings ), 'no' ); } } } classes/class-smart-manager-shop-order.php000064400000314310147600337620014645 0ustar00 array( 'wc-completed', 'wc-processing' ), 'red' => array( 'wc-cancelled', 'wc-failed', 'wc-refunded' ), 'orange' => array( 'wc-on-hold', 'wc-pending' ) ); public static $kpi_query_results = array(), $address_types = array( 'billing', 'shipping' ), $hpos_tables_column_property_mapping = array(); function __construct($dashboard_key) { // Hooks for WC v7.9 (HPOS) compat if ( ! empty( Smart_Manager::$sm_is_woo79 ) ) { add_filter( 'sm_search_table_types', array( 'Smart_Manager_Shop_Order', 'sm_order_search_table_types' ), 12, 1 ); // should be kept before calling the parent class constructor } parent::__construct($dashboard_key); $this->dashboard_key = $dashboard_key; $this->post_type = $dashboard_key; $this->req_params = ( ! empty( $_REQUEST ) ) ? $_REQUEST : array(); add_filter( 'sm_data_model', array( &$this, 'orders_data_model' ), 10, 2 ); // hooks for delete functionality add_filter( 'sm_default_process_delete_records', function() { return false; } ); add_filter( 'sm_default_process_delete_records_result', array( 'Smart_Manager_Shop_Order', 'order_trash' ), 12, 2 ); // Hooks for WC v7.9 (HPOS) compat if ( ! empty( Smart_Manager::$sm_is_woo79 ) ) { add_filter( 'sm_beta_load_default_store_model', function() { return false; } ); add_filter( 'sm_default_dashboard_model', array( &$this, 'default_dashboard_model' ), 10, 1 ); add_filter( 'sm_get_custom_cols', array( 'Smart_Manager_Shop_Order', 'get_address_cols' ), 10, 2 ); add_filter( 'sm_ignored_cols', array( 'Smart_Manager_Shop_Order', 'get_flat_table_ignored_cols' ) ); add_filter( 'sm_flat_table_col_titles', array( 'Smart_Manager_Shop_Order', 'get_flat_table_col_titles' ) ); add_filter( 'sm_beta_load_default_data_model', function() { return false; } ); // Filters for modifying advanced search query clauses add_filter( 'woocommerce_orders_table_query_clauses', array( &$this, 'modify_orders_table_query_clauses' ), 99, 3 ); add_filter( 'sm_search_query_formatted', array( 'Smart_Manager_Shop_Order', 'sm_order_addresses_search_query_formatted' ), 12, 2 ); add_filter( 'sm_search_wc_orders_meta_cond', array( &$this,'search_wc_orders_meta_cond' ), 10, 2 ); // Filters for 'inline_update' functionality add_filter( 'sm_default_inline_update', function() { return false; } ); } else { add_filter( 'sm_dashboard_model', array( &$this,'orders_dashboard_model' ), 10, 2 ); add_filter( 'posts_where', array( &$this,'sm_query_orders_where_cond' ),100,2); add_filter( 'posts_join_paged', array( &$this,'sm_order_query_join' ), 100, 2 ); add_filter( 'posts_orderby', array( &$this,'sm_query_order_by' ), 100, 2 ); add_filter( 'found_posts', array( 'Smart_Manager_Shop_Order' ,'kpi_data_query' ), 100, 2 ); add_filter( 'sm_inline_update_pre', array( &$this, 'pre_inline_update' ), 10, 1 ); add_filter( 'sm_batch_update_copy_from_ids_select',array( &$this,'sm_batch_update_copy_from_ids_select' ), 10, 2 ); } add_action( 'sm_inline_update_post', array( &$this, 'orders_inline_update' ), 10, 2 ); } //Function for overriding the select clause for fetching the ids for batch update 'copy from' functionality public function sm_batch_update_copy_from_ids_select( $select, $args ) { $select = " SELECT ID AS id, CONCAT('Order #', ID) AS title "; return $select; } /** * Function to generate the column model for orders custom columns * * @param array $column_model column model array * @param string $dashboard dashboard name. * @return array $column_model updated column model array. */ public static function generate_orders_custom_column_model( $column_model = array(), $dashboard = '' ) { global $wpdb; $custom_columns = array( 'shipping_method', 'shipping_method_title', 'coupons_used', 'line_items', 'details', 'order_sub_total', 'edit_link' ); $order_notes_cols = ( 'shop_order' === $dashboard ) ? array( 'note_for_customer' ) : array(); $custom_columns = array_merge( $custom_columns, $order_notes_cols ); $order_items_table_searchable_cols = array( 'shipping_method', 'shipping_method_title', 'coupons_used' ); $index = sizeof($column_model); foreach( $custom_columns as $col ) { $src = ( in_array( $col, $order_items_table_searchable_cols ) ? 'woocommerce_order_items/' : 'custom/' ). $col; $col_index = sm_multidimesional_array_search ($src, 'src', $column_model); if( empty( $col_index ) ) { $column_model [$index] = array(); $column_model [$index]['src'] = $src; $column_model [$index]['data'] = sanitize_title(str_replace('/', '_', $column_model [$index]['src'])); // generate slug using the wordpress function if not given $column_model [$index]['name'] = __(ucwords(str_replace('_', ' ', $col)), 'smart-manager-for-wp-e-commerce'); if ( ! empty( $col ) && 'edit_link' === $col ) { $column_model [$index]['name'] = _x('Edit', 'order edit link', 'smart-manager-for-wp-e-commerce'); $column_model [$index]['renderer'] = 'html'; } $column_model [$index]['key'] = $column_model [$index]['name']; $column_model [$index]['type'] = 'text'; $column_model [$index]['hidden'] = false; $column_model [$index]['editable'] = false; $column_model [$index]['editor'] = false; $column_model [$index]['batch_editable'] = false; $column_model [$index]['sortable'] = true; $column_model [$index]['resizable'] = true; $column_model [$index]['allow_showhide'] = true; $column_model [$index]['exportable'] = true; $column_model [$index]['searchable'] = in_array( $col, $order_items_table_searchable_cols ) ? true : false; $column_model [$index]['save_state'] = true; $column_model [$index]['values'] = array(); $column_model [$index]['search_values'] = array(); if( in_array( $col, $order_items_table_searchable_cols ) ) { $column_model [$index]['table_name'] = $wpdb->prefix.'woocommerce_order_items'; $column_model [$index]['col_name'] = $col; } if ( ! empty( $col ) && 'shipping_method' === $col ) { $column_model [$index]['editable'] = true; $column_model [$index]['batch_editable'] = true; $column_model [$index]['type'] = 'dropdown'; $column_model [$index] ['editor'] = 'select'; $column_model [$index] ['renderer'] = 'selectValueRenderer'; $available_shipping_methods = array(); $shipping_method_values = array(); if ( ( file_exists( WP_PLUGIN_DIR . '/woocommerce/woocommerce.php' ) ) && ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) && is_callable( array( WC()->shipping, 'get_shipping_methods' ) ) ) { $available_shipping_methods = WC()->shipping->get_shipping_methods(); if ( ! empty( $available_shipping_methods ) && is_array( $available_shipping_methods ) ) { foreach( $available_shipping_methods as $shipping_method ) { if ( ! is_callable( array( $shipping_method, 'get_method_title' ) ) ) { continue; } $column_model [$index]['values'][$shipping_method->id] = esc_html( $shipping_method->get_method_title() ); } } if ( ! empty( $column_model [$index]['values'] ) && is_array( $column_model [$index]['values'] ) ) { foreach( $column_model [$index]['values'] as $key => $value ) { $column_model[$index]['search_values'][] = array( 'key' => $key, 'value' => $value ); } } } $column_model [$index] ['selectOptions'] = $column_model [$index]['values']; $column_model [$index]['searchable'] = ( defined('SMPRO') && true === SMPRO ) ? true : false; } else if ( ! empty( $col ) && 'note_for_customer' === $col ) { $column_model [$index]['editable'] = false; $column_model [$index]['type'] = 'dropdown'; $column_model [$index]['batch_editable'] = true; $column_model [$index]['searchable'] = false; } else if ( ! empty( $col ) && 'shipping_method_title' === $col ) { $column_model [$index]['editable'] = true; $column_model [$index]['batch_editable'] = true; $column_model [$index]['editor'] = 'text'; $column_model [$index]['searchable'] = false; } $index++; } } return $column_model; } public function orders_dashboard_model( $dashboard_model = array(), $dashboard_model_saved = array() ) { global $wpdb, $current_user; $dashboard_model['tables']['posts']['where']['post_type'] = 'shop_order'; $visible_columns = array('ID', 'post_date', '_billing_first_name', '_billing_last_name', '_billing_email', 'post_status', '_order_total', 'details', '_payment_method_title', 'shipping_method', 'coupons_used', 'line_items'); $numeric_columns = array('_billing_phone', '_cart_discount', '_cart_discount_tax', '_customer_user'); $string_columns = array('_billing_postcode', '_shipping_postcode'); $post_status_col_index = sm_multidimesional_array_search('posts_post_status', 'data', $dashboard_model['columns']); if( isset( $dashboard_model['columns'][$post_status_col_index] ) && is_callable( array( 'Smart_Manager_Shop_Order', 'generate_status_col_model' ) ) ) { $dashboard_model['columns'][$post_status_col_index] = self::generate_status_col_model( $dashboard_model['columns'][$post_status_col_index], array( 'curr_obj' => $this, 'status_func' => 'wc_get_order_statuses', 'default_status' => 'wc-pending', 'color_codes' => $this->status_color_codes ) ); } if( is_callable( array( 'Smart_Manager_Shop_Order', 'generate_orders_custom_column_model' ) ) ) { $dashboard_model['columns'] = self::generate_orders_custom_column_model( $dashboard_model['columns'], $this->dashboard_key ); } $column_model = &$dashboard_model['columns']; //Code for unsetting the position for hidden columns foreach( $column_model as &$column ) { if (empty($column['src'])) continue; $src_exploded = explode("/",$column['src']); if (empty($src_exploded)) { $src = $column['src']; } if ( sizeof($src_exploded) > 2) { $col_table = $src_exploded[0]; $cond = explode("=",$src_exploded[1]); if (sizeof($cond) == 2) { $src = $cond[1]; } } else { $src = $src_exploded[1]; $col_table = $src_exploded[0]; } if( empty($dashboard_model_saved) ) { if (!empty($column['position'])) { unset($column['position']); } $position = array_search($src, $visible_columns); if ($position !== false) { $column['position'] = $position + 1; $column['hidden'] = false; } else { $column['hidden'] = true; } } if ($src == 'post_date') { $column ['name'] = $column ['key'] = __('Date', 'smart-manager-for-wp-e-commerce'); } else if ($src == 'post_status') { $column ['name'] = $column ['key'] = __('Status', 'smart-manager-for-wp-e-commerce'); } else if ($src == 'post_excerpt') { $column ['name'] = $column ['key'] = __('Customer provided note', 'smart-manager-for-wp-e-commerce'); } else if( !empty( $numeric_columns ) && in_array( $src, $numeric_columns ) ) { $column ['type'] = 'numeric'; $column['editor'] = ( '_billing_phone' === $src ) ? 'numeric' : 'customNumericEditor'; } else if( !empty( $string_columns ) && in_array( $src, $string_columns ) ) { $column ['type'] = $column ['editor'] = 'text'; } } if (!empty($dashboard_model_saved)) { $col_model_diff = sm_array_recursive_diff($dashboard_model_saved,$dashboard_model); } //clearing the transients before return if (!empty($col_model_diff)) { delete_transient( 'sa_sm_'.$this->dashboard_key ); } return $dashboard_model; } public static function process_custom_search( $where, $params ) { global $wpdb; //Code for handling simple search if( empty( $params['search_text'] ) || strpos( $where, 'posts.ID IN' ) === true ) { return $where; } $search_text = $wpdb->_real_escape( $params['search_text'] ); $dashboard = ( !empty( $params['active_module'] ) ) ? $params['active_module'] : 'shop_order'; //Query to get the post_id of the products whose sku code matches with the one type in the search text box of the Orders Module $order_ids = self::get_filtered_order_ids( $search_text, $dashboard ); if ( ! empty( $order_ids ) ) { $where = " AND {$wpdb->prefix}posts.ID IN(". implode( ',', $order_ids ) .") AND {$wpdb->prefix}posts.post_type = '". $dashboard ."' "; } return $where; } public function sm_query_orders_where_cond ($where, $wp_query_obj) { global $wpdb; if ( empty( Smart_Manager::$sm_is_woo79 ) && ! empty( $this->req_params['search_text'] ) ) { $search_text = $this->req_params['search_text']; $where .= ( false === strpos( $where, "oi.order_item_name LIKE '%" . $wpdb->esc_like( $search_text ) . "%'" ) ) ? " OR ( oi.order_item_name LIKE '%" . $wpdb->esc_like( $search_text ) . "%' )" : ''; $where .= ( false === strpos( $where, "oim.meta_value LIKE '%" . $wpdb->esc_like( $search_text ) . "%'" ) ) ? " OR ( oim.meta_value LIKE '%" . $wpdb->esc_like( $search_text ) . "%') " : ''; $where .= ( false === strpos( $where, "cm.comment_content LIKE '%" . $wpdb->esc_like( $search_text ) . "%'" ) ) ? " OR ( cm.comment_content LIKE '%" . $wpdb->esc_like( $search_text ) . "%') " : ''; return $where; } if( is_callable( array( 'Smart_Manager_Shop_Order', 'process_custom_search' ) ) ) { $where = self::process_custom_search( $where, $this->req_params ); } return $where; } public static function generate_orders_custom_column_data( $data_model, $params ) { global $wpdb, $current_user; $order_ids = $order_coupons = array(); $order_id_cond = ''; $dashboard = ( !empty( $params['active_module'] ) ) ? $params['active_module'] : 'shop_order'; if( !empty( $data_model['items'] ) ) { foreach( $data_model['items'] as $data ) { $order_ids[] = ( ! empty( Smart_Manager::$sm_is_woo79 ) && ( ! empty( $data['wc_orders_id'] ) ) ) ? $data['wc_orders_id'] : ( ( ! empty( $data['posts_id'] ) ) ? $data['posts_id'] : 0 ); } } if( !empty( $order_ids ) ) { if( count( $order_ids ) > 100 ) { $order_ids_imploded = implode(",",$order_ids); update_option( 'sa_sm_export_'.$dashboard.'_ids', $order_ids_imploded, 'no' ); $order_id_cond = "SELECT option_value FROM {$wpdb->prefix}options WHERE option_name = 'sa_sm_export_".$dashboard."_ids'"; $csv_export = true; } else { $order_id_cond = implode(",",$order_ids); $csv_export = false; } } if( !empty( $order_id_cond ) ) { $results_order_coupons = $wpdb->get_results( $wpdb->prepare( "SELECT order_id, GROUP_CONCAT(order_item_name ORDER BY order_item_id SEPARATOR ', ' ) AS coupon_used FROM {$wpdb->prefix}woocommerce_order_items WHERE order_item_type = %s ".( ( !empty( $csv_export ) ) ? " AND FIND_IN_SET ( order_id, ( ".$order_id_cond." ) ) " : " AND order_id IN ( ".$order_id_cond." ) " )." GROUP BY order_id", 'coupon'), 'ARRAY_A' ); if( !empty( $results_order_coupons ) ) { foreach( $results_order_coupons as $result ) { $order_coupons[$result['order_id']] = $result['coupon_used']; } } $variation_ids = $wpdb->get_col( $wpdb->prepare( "SELECT order_itemmeta.meta_value FROM {$wpdb->prefix}woocommerce_order_items AS order_items LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS order_itemmeta ON (order_items.order_item_id = order_itemmeta.order_item_id) WHERE order_itemmeta.meta_key = %s AND order_itemmeta.meta_value > %d ".( ( !empty( $csv_export ) ) ? " AND FIND_IN_SET ( order_items.order_id, ( ".$order_id_cond." ) ) " : " AND order_items.order_id IN ( ".$order_id_cond." ) " ), '_variation_id', 0 ) ); if ( count( $variation_ids ) > 0 ) { if( count( $variation_ids ) > 100 ) { $variation_ids_imploded = implode(",",$variation_ids); update_option( 'sa_sm_export_'.$dashboard.'_variation_ids', $variation_ids_imploded, 'no' ); $variation_id_cond = " AND FIND_IN_SET ( postmeta.post_id, ( SELECT option_value FROM {$wpdb->prefix}options WHERE option_name = 'sa_sm_export_".$dashboard."_variation_ids' ) ) "; } else { $variation_id_cond = " AND postmeta.post_id IN (". implode(",",$variation_ids) .") "; } $results_variation_att = $wpdb->get_results( $wpdb->prepare( "SELECT postmeta.post_id AS post_id, GROUP_CONCAT(postmeta.meta_value ORDER BY postmeta.meta_id SEPARATOR ',' ) AS meta_value FROM {$wpdb->prefix}postmeta AS postmeta WHERE postmeta.meta_key LIKE %s ". $variation_id_cond ." GROUP BY postmeta.post_id", 'attribute_%' ), 'ARRAY_A') ; } } //Code to get the variation Attributes $attributes_terms = $wpdb->get_results( $wpdb->prepare( "SELECT terms.slug as slug, terms.name as term_name FROM {$wpdb->prefix}terms AS terms JOIN {$wpdb->prefix}postmeta AS postmeta ON ( postmeta.meta_value = terms.slug AND postmeta.meta_key LIKE %s ) GROUP BY terms.slug", 'attribute_%' ), 'ARRAY_A' ); $attributes = array(); foreach ( $attributes_terms as $attributes_term ) { $attributes[$attributes_term['slug']] = $attributes_term['term_name']; } $variation_att_all = array(); if ( !empty($results_variation_att) && is_array( $results_variation_att ) && count( $results_variation_att ) > 0 ) { for ($i=0;$iget_results( $wpdb->prepare( "SELECT order_items.order_item_id, order_items.order_id , order_items.order_item_name AS order_prod, order_items.order_item_type, order_itemmeta.meta_key, order_itemmeta.meta_value FROM {$wpdb->prefix}woocommerce_order_items AS order_items LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS order_itemmeta ON (order_items.order_item_id = order_itemmeta.order_item_id AND order_items.order_item_type IN ('line_item', 'shipping') ) ". $order_id_join ." WHERE 1 = %d AND order_items.order_item_type IN ('line_item', 'shipping') ". $order_id_cond ." GROUP BY order_items.order_item_id, order_itemmeta.meta_key", 1 ), 'ARRAY_A' ); if ( ! empty( $results ) && is_array( $results ) ) { foreach( $results as $result ) { $item_id = $result['order_item_id']; if ( empty( $item_id ) ) { continue; } if ( ! isset( $processed_results[ $item_id ] ) ) { $processed_results[ $item_id ] = array( 'order_id' => $result['order_id'], 'order_prod' => $result['order_prod'], 'order_item_type' => $result['order_item_type'], 'meta_key' => array(), 'meta_value' => array() ); } $processed_results[ $item_id ]['meta_key'][] = $result['meta_key']; $processed_results[ $item_id ]['meta_value'][] = $result['meta_value']; } } // Convert $processed_results array to concatenated strings. if ( ( ! empty( $processed_results ) ) && is_array( $processed_results ) ) { foreach ( $processed_results as &$item ) { $item['meta_key'] = implode( '###', $item['meta_key'] ); $item['meta_value'] = implode( '###', $item['meta_value'] ); } foreach ( $processed_results as $result ) { if ( ! isset( $order_items[ $result['order_id'] ] ) ) { $order_items[ $result['order_id'] ] = array(); } if ( 'shipping' === $result['order_item_type'] ) { $order_meta_key = explode( '###', $result['meta_key'] ); $order_meta_values = explode( '###', $result['meta_value'] ); if ( ! empty( $order_meta_key ) && is_array( $order_meta_key ) && 'method_id' === $order_meta_key[0] && ! empty( $order_meta_values ) && is_array( $order_meta_values ) ) { $order_shipping_method [$result['order_id']] = $order_meta_values[0]; } $order_shipping_method_title[$result['order_id']] = $result['order_prod']; } else { $order_items [$result['order_id']] [] = $result; } } } if( !empty( $data_model['items'] ) ) { foreach( $data_model['items'] as $key => $order_data ) { $order_id = ( ! empty( Smart_Manager::$sm_is_woo79 ) && ( ! empty( $order_data['wc_orders_id'] ) ) ) ? $order_data['wc_orders_id'] : ( ( ! empty( $order_data['posts_id'] ) ) ? $order_data['posts_id'] : 0 ); if( !empty( $order_items[$order_id] ) ) { foreach( $order_items[$order_id] as $order_item ) { $order_meta_values = explode('###', $order_item ['meta_value'] ); $order_meta_key = explode('###', $order_item ['meta_key'] ); if (count($order_meta_values) != count($order_meta_key)) { continue; } $order_meta_key_values = array_combine($order_meta_key, $order_meta_values); $data_model['items'][$key]['custom_details'] = intval ( (!empty($data_model['items'][$key]['custom_details'])) ? $data_model['items'][$key]['custom_details'] : 0 ); $data_model['items'][$key]['custom_details'] += intval( ( !empty( $order_meta_key_values['_qty'] ) ) ? $order_meta_key_values['_qty'] : 0 ); $product_id = ( $order_meta_key_values['_variation_id'] > 0 ) ? $order_meta_key_values['_variation_id'] : $order_meta_key_values['_product_id']; $sm_sku = get_post_meta( $product_id, '_sku', true ); if ( ! empty( $sm_sku ) ) { $sku_detail = '[SKU: ' . $sm_sku . ']'; } else { $sku_detail = ''; } $variation_att = ( isset( $variation_att_all [$order_meta_key_values['_variation_id']] ) && !empty( $variation_att_all [$order_meta_key_values['_variation_id']] ) ) ? $variation_att_all [$order_meta_key_values['_variation_id']] : ''; $product_full_name = ( !empty( $variation_att ) ) ? $order_item['order_prod'] . ' (' . $variation_att . ')' : $order_item['order_prod']; $data_model['items'][$key]['custom_line_items'] = (!empty($data_model['items'][$key]['custom_line_items'])) ? $data_model['items'][$key]['custom_line_items'] : ''; $data_model['items'][$key]['custom_line_items'] .= $product_full_name.' '.$sku_detail.'['.__('Qty','smart-manager-for-wp-e-commerce').': '.$order_meta_key_values['_qty'].']['.__('Price','smart-manager-for-wp-e-commerce').': '.($order_meta_key_values['_line_total']/$order_meta_key_values['_qty']).']'; if( !empty( $order_meta_key_values['_wc_cog_item_total_cost'] ) ) { $data_model['items'][$key]['custom_line_items'] .= '['.__('Cost of Good','smart-manager-for-wp-e-commerce').': '.wc_format_decimal($order_meta_key_values['_wc_cog_item_total_cost']).']'; } $data_model['items'][$key]['custom_line_items'] .= ', '; $data_model['items'][$key]['custom_order_sub_total'] = floatval ( (!empty($data_model['items'][$key]['custom_order_sub_total'])) ? $data_model['items'][$key]['custom_order_sub_total'] : 0 ); $data_model['items'][$key]['custom_order_sub_total'] += floatval( ( !empty( $order_meta_key_values['_line_subtotal'] ) ) ? $order_meta_key_values['_line_subtotal'] : 0 ); } if( !empty( $data_model['items'][$key]['custom_line_items'] ) ) { $data_model['items'][$key]['custom_line_items'] = substr( $data_model['items'][$key]['custom_line_items'], 0, -2 ); //To remove extra comma ', ' from returned } $data_model['items'][$key]['custom_details'] = !empty( $data_model['items'][$key]['custom_details'] ) ? ( ( $data_model['items'][$key]['custom_details'] == 1) ? $data_model['items'][$key]['custom_details'] . ' item' : $data_model['items'][$key]['custom_details'] . ' items' ) : ''; if ( ! empty( Smart_Manager::$sm_is_woo79 ) ) { $link = admin_url( 'admin.php?page=wc-orders' . ( ( 'shop_subscription' === $dashboard ) ? '--' . $dashboard : '' ) . '&action=edit&id=' . $order_id ); $data_model['items'][$key]['custom_edit_link'] = ( ! empty( $params['cmd'] ) && 'get_export_csv' !== $params['cmd'] && 'get_print_invoice' !== $params['cmd'] ) ? '' : $link; } $order_obj = ( ( ! empty( $order_id ) ) && class_exists( 'WC_Order' ) ) ? new WC_Order( $order_id ) : null; $order_notes = ( $order_obj instanceof WC_Order && is_callable( array( $order_obj, 'get_customer_order_notes' ) ) ) ? $order_obj->get_customer_order_notes() : array(); $notes_to_customer = array(); if ( ! empty( $order_notes ) && is_array( $order_notes ) ) { foreach ( $order_notes as $order_note ) { $notes_to_customer[] = sprintf( /* translators: %1$s: order note %2$s: author name %2$s: order note added date */ _x( 'Note: %1$s (Added by %2$s on %3$s)', 'order note', 'smart-manager-for-wp-e-commerce' ), $order_note->comment_content, $order_note->comment_author, get_comment_date( 'F j, Y \a\t g:i a', $order_note->comment_ID ) ); } } $data_model['items'][$key]['custom_note_for_customer'] = ( ! empty( $notes_to_customer ) && is_array( $notes_to_customer ) ) ? implode( ', ', $notes_to_customer ) : ''; } $data_model['items'][$key]['woocommerce_order_items_coupons_used'] = ( !empty( $order_coupons[$order_id] ) ) ? $order_coupons[$order_id] : ""; $data_model['items'][$key]['woocommerce_order_items_shipping_method'] = ( !empty( $order_shipping_method[$order_id] ) ) ? $order_shipping_method[$order_id] : ""; $data_model['items'][$key]['woocommerce_order_items_shipping_method_title'] = ( !empty( $order_shipping_method_title[$order_id] ) ) ? $order_shipping_method_title[$order_id] : ""; } } return $data_model; } //Function to query for the dashboard KPI data public static function kpi_data_query( $found_rows, $wp_query_obj ) { $query = ( !empty( $wp_query_obj->request ) ) ? $wp_query_obj->request : ''; if( !empty( $query ) ) { global $wpdb; $status_counts = array(); $from_strpos = strpos( $query, 'FROM' ); $from_pos = ( !empty( $from_strpos ) ) ? $from_strpos : 0; if( $from_pos > 0 ) { $query = substr( $query, $from_pos ); $groupby_strpos = strpos( $query, 'GROUP' ); $group_pos = ( !empty( $groupby_strpos ) ) ? $groupby_strpos : 0; $query = substr( $query, 0, $group_pos ); if( !empty( $query ) ) { self::$kpi_query_results = $wpdb->get_results( 'SELECT '.$wpdb->prefix.'posts.post_status, COUNT( DISTINCT( '.$wpdb->prefix.'posts.id ) ) AS count '. $query .' GROUP BY '.$wpdb->prefix.'posts.post_status', 'ARRAY_A' ); } } } return $found_rows; } //Function for getting the KPI data public static function generate_orders_kpi_data( $params, $statuses = array() ) { global $wpdb; $kpi_data = array(); $dashboard = ( !empty( $params['active_module'] ) ) ? $params['active_module'] : 'shop_order'; $status_counts = ( !empty( self::$kpi_query_results ) ) ? self::$kpi_query_results : array(); if( count($status_counts) > 0 ) { $dashboard_model = get_transient('sa_sm_'.$dashboard); if( ! empty( $dashboard_model ) ) { $dashboard_model = json_decode( $dashboard_model, true ); } if( !empty( $dashboard_model['columns'] ) ) { foreach( $dashboard_model['columns'] as $colObj ) { if ( ! isset( $colObj['data'] ) ) continue; if( !empty( $colObj['data'] ) && !empty( $colObj['colorCodes'] ) && ( ( 'posts_post_status' === $colObj['data'] ) || ( 'wc_orders_status' === $colObj['data'] ) ) ) { foreach( $colObj['colorCodes'] as $key => $obj ) { foreach( $obj as $col ) { $color_codes[ $col ] = $key; } } } } } foreach( $status_counts as $value ) { if ( empty( $statuses ) ) continue; switch ( true ) { case ( array_key_exists( 'post_status', $value ) ): $key = ( ! empty( $statuses[$value['post_status']] ) ) ? $statuses[$value['post_status']] : ucwords($value['post_status']); $kpi_data[ $key ] = array( 'count' => $value['count'], 'color' => ( ( !empty( $color_codes[$value['post_status']] ) ) ? $color_codes[$value['post_status']] : '' ) ); break; case ( array_key_exists( 'status', $value ) ): $key = ( ! empty( $statuses[$value['status']] ) ) ? $statuses[$value['status']] : ucwords($value['status']); $kpi_data[ $key ] = array( 'count' => $value['count'], 'color' => ( ( !empty( $color_codes[$value['status']] ) ) ? $color_codes[$value['status']] : '' ) ); break; } } } return $kpi_data; } /** * Function hooked to filter for modifying data model. * * @param array $data_model default generated data model. * @param array $data_col_params function arguments. * @return array $data_model updated data model. */ public function orders_data_model( $data_model = array(), $data_col_params = array() ) { return ( is_callable( array( 'Smart_Manager_Shop_Order', 'generate_data_model' ) ) ) ? Smart_Manager_Shop_Order::generate_data_model( $data_model, array( 'col_params' => $data_col_params, 'curr_obj' => $this, 'status_func' => 'wc_get_order_statuses' ) ) : $data_model; } /** * Function for generating data model. * * @param array $data_model default generated data model. * @param array $args function arguments. * @return array $data_model updated data model. */ public static function generate_data_model( $data_model = array(), $args = array() ) { if( empty( $args ) || ! is_array( $args ) ) { return $data_model; } $data_col_params = ( ! empty( $args['col_params'] ) ) ? $args['col_params'] : array(); $curr_obj = ( ! empty( $args['curr_obj'] ) ) ? $args['curr_obj'] : null; if( empty( $data_col_params ) || ! is_array( $data_col_params ) || empty( $curr_obj ) || ( ! empty( $curr_obj ) && empty( $curr_obj->dashboard_key ) ) ){ return $data_model; } global $wpdb; if ( ! empty( Smart_Manager::$sm_is_woo79 ) ) { $orders_queries = array(); $custom_columns_tables = array( 'woocommerce_order_itemmeta', 'woocommerce_order_items' ); $col_model = ( ! empty( $data_col_params['col_model'] ) ) ? $data_col_params['col_model'] : array(); if( empty( $col_model ) ){ return $data_model; } $visible_cols = ( ! empty( $data_col_params['visible_cols'] ) ) ? $data_col_params['visible_cols'] : array(); if( empty( $visible_cols ) ){ return $data_model; } $query_args = array( 'type' => $curr_obj->dashboard_key, 'orderby' => 'id', 'order' => 'DESC', 'offset' => ( ! empty( $data_col_params['offset'] ) ) ? intval( $data_col_params['offset'] ) : 0, 'paginate' => true, 'limit' => ( ! empty( $data_col_params['limit'] ) ) ? intval( $data_col_params['limit'] ) : 50 ); // =============================================================== // Code to handle display of 'trash' records // =============================================================== if( ! empty( $args['status_func'] ) && function_exists( $args['status_func'] ) ){ $query_args['status'] = array_keys( call_user_func( $args['status_func'] ) ); if( ! empty( $query_args['status'] ) && is_array( $query_args['status'] ) && is_callable( array( $curr_obj, 'is_show_trash_records' ) ) && ! empty( $curr_obj->is_show_trash_records() ) ) { $query_args['status'] = array_merge( $query_args['status'], array( 'trash' ) ); } } // =============================================================== // Code for Advanced Search functionality // =============================================================== //Code to clear the advanced search temp table if( empty( $curr_obj->req_params['advanced_search_query'] ) ) { $wpdb->query( "DELETE FROM {$wpdb->base_prefix}sm_advanced_search_temp" ); delete_option( 'sm_advanced_search_query' ); } // Code for handling advanced search functionality. if ( ! empty( $curr_obj->req_params['advanced_search_query'] ) && $curr_obj->req_params['advanced_search_query'] != '[]' ) { $curr_obj->req_params['advanced_search_query'] = ( ! is_array( $curr_obj->req_params['advanced_search_query'] ) ) ? json_decode( stripslashes( $curr_obj->req_params['advanced_search_query'] ), true ) : $curr_obj->req_params['advanced_search_query']; if( ! empty( $curr_obj->req_params['advanced_search_query'] ) ) { $curr_obj->process_search_cond( array( 'post_type' => ( ! empty( $curr_obj->post_type ) && 'shop_subscription' === $curr_obj->post_type ) ? '' : $curr_obj->post_type, 'search_query' => (!empty($curr_obj->req_params['advanced_search_query'])) ? $curr_obj->req_params['advanced_search_query'] : array(), 'SM_IS_WOO30' => (!empty($curr_obj->req_params['SM_IS_WOO30'])) ? $curr_obj->req_params['SM_IS_WOO30'] : '', 'search_cols_type' => $data_col_params['search_cols_type'], 'data_col_params' => $data_col_params, 'pkey' => 'order_id', 'join_table' => 'wc_orders', 'type' => 'type' ) ); } } // =============================================================== // =============================================================== // Code for Simple Search functionality // =============================================================== if( ! empty( $curr_obj->req_params['search_text'] ) ) { $col_name = ''; $date_types = array( 'datetime', 'date', 'time' ); $search_text = $wpdb->_real_escape( $curr_obj->req_params['search_text'] ); if ( empty( $search_text ) ){ return $data_model; } $search_order_ids = array(); if ( is_callable( array( 'Smart_Manager_Shop_Order', 'get_filtered_order_ids' ) ) ) { $search_order_ids = self::get_filtered_order_ids( $search_text, $curr_obj->dashboard_key ); } if ( ! empty( $search_order_ids ) ) { $orders_queries['field_query'][] = array( 'field' => $wpdb->prefix . 'wc_orders.id', 'value' => implode( ',', $search_order_ids ), 'compare' => 'IN' ); } $excluded_custom_tables = array_map( function( $custom_columns_table ) use ( $wpdb ) { return $wpdb->prefix . $custom_columns_table; }, $custom_columns_tables ); foreach ( $col_model as $col ) { if ( empty( $col['table_name'] ) || empty( $col['col_name'] ) || empty( $col['type'] ) ){ continue; } // NOTE: For now have excluded the custom tables and 'wc_order_operational_data' table from simple search field queries if ( ( $wpdb->prefix . 'wc_orders_meta' === $col['table_name'] ) || ( 'shipping_email' === $col['col_name'] ) || ( ( ! empty( $excluded_custom_tables ) ) && in_array( $col['table_name'], $excluded_custom_tables ) ) || ( $wpdb->prefix . 'wc_order_operational_data' === $col['table_name'] ) ){ continue; } if ( $wpdb->prefix . 'wc_order_addresses' === $col['table_name'] ) { $col_name = explode('_', $col['col_name']); $col_name = substr( $col['col_name'], 0, strlen( $col_name[0] ) ); $orders_queries['field_query'][] = array( 'relation' => 'OR', 'field' => $col_name . '_address' . '.' . $col['col_name'], 'value' => $search_text, 'compare' => 'LIKE' ); } elseif ( in_array( $col['type'], $date_types ) ) { $orders_queries['date_query'][] = array( 'relation' => 'OR', 'column' => $col['col_name'], 'date' => $search_text, 'inclusive' => true ); } else { $orders_queries['field_query'][] = array( 'relation' => 'OR', 'field' => $col['table_name'] . '.' . $col['col_name'], 'value' => $search_text, 'compare' => 'LIKE' ); } } // Code for woocommerce_order_items table simple search. $woi_order_ids = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT( oi.order_id ) FROM {$wpdb->prefix}woocommerce_order_items AS oi JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS oim ON ( oim.order_item_id = oi.order_item_id AND oi.order_item_type = %s ) WHERE ( oi.order_item_name LIKE %s OR (oim.meta_value LIKE %s ) )", 'shipping', '%' . $wpdb->esc_like( $curr_obj->req_params['search_text'] ). '%', '%' . $wpdb->esc_like( $curr_obj->req_params['search_text'] ) . '%' ) ); // Code for comments table simple search. $comments_order_ids = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT( cm.comment_post_ID ) FROM {$wpdb->prefix}comments AS cm JOIN {$wpdb->prefix}commentmeta AS cmm ON (cmm.comment_id = cm.comment_ID) WHERE ( cm.comment_content LIKE %s AND cm.comment_type = %s )", '%' . $wpdb->esc_like( $curr_obj->req_params['search_text'] ) . '%', 'order_note' ) ); $search_order_ids = array_merge( $woi_order_ids, $comments_order_ids ); if ( ! empty( $comments_order_ids ) && is_array( $comments_order_ids ) ) { $orders_queries['field_query'][] = array( 'field' => $wpdb->prefix . 'wc_orders.id', 'value' => implode( ',', $comments_order_ids ), 'compare' => 'IN', ); } if ( empty( $orders_queries ) ) { return $data_model; } } // =============================================================== if( ! empty( $orders_queries['field_query'] ) ){ $orders_queries['field_query']['relation'] = 'OR'; $query_args['field_query'] = $orders_queries['field_query']; } $orders = wc_get_orders( $query_args ); if ( empty( $orders ) || is_wp_error( $orders ) ) { return $data_model; } if( ! isset( $orders->orders ) || ( isset( $orders->orders ) && ! is_array( $orders->orders ) ) ){ return $data_model; } $non_getter_cols = $address_types = $columns = $order_ids = $items = array(); foreach( $orders->orders as $order ) { if( ! $order instanceof WC_Order ){ continue; } $order_id = $order->get_id(); if( empty( $order_id ) || is_wp_error( $order_id ) ){ continue; } if( ! empty( $args['curr_obj_getter_func'] ) && ! empty( $args['curr_obj_class_nm'] ) && function_exists( $args['curr_obj_getter_func'] ) && class_exists( $args['curr_obj_class_nm'] ) ) { $order = call_user_func( $args['curr_obj_getter_func'], $order_id ); if( ! $order instanceof $args['curr_obj_class_nm'] ){ continue; } } $order_ids[] = $order_id; $items[ $order_id ] = array( 'wc_orders_id' => $order_id ); foreach ( $visible_cols as $col ) { if ( empty( $col['src'] ) || ( empty( $col['col_name'] ) ) || ( empty( $col['data'] ) ) ) { continue; } $col_property = ( is_callable( array( 'Smart_Manager_Shop_Order', 'get_property_name_for_col' ) ) ) ? Smart_Manager_Shop_Order::get_property_name_for_col( $col['col_name'], $col['table_name'] ) : $col['col_name']; $getter_func1 = 'get_'.$col_property; $getter_func2 = 'get'.$col_property; if ( is_callable( array( $order, $getter_func1 ) ) || is_callable( array( $order, $getter_func2 ) ) ) { $items[$order_id][$col['data']] = $order->{ ( is_callable( array( $order, $getter_func1 ) ) ? $getter_func1 : $getter_func2 ) }(); if( ! empty( $col['type'] ) && 'sm.datetime' === $col['type'] && function_exists( 'wc_format_datetime' ) && ! empty( $items[$order_id][$col['data']] ) && $items[$order_id][$col['data']] instanceof WC_DateTime && is_callable( array( $items[$order_id][$col['data']], 'date' ) ) ){ $items[$order_id][$col['data']] = $items[$order_id][$col['data']]->date( 'Y-m-d H:i:s' ); } else if( ( 'get_status' === $getter_func1 || 'get_status' === $getter_func2 ) && ! in_array( $items[$order_id][$col['data']], array( 'trash' ) ) ) { $items[$order_id][$col['data']] = 'wc-'. $items[$order_id][$col['data']]; } continue; } $col_exploded = ( ! empty( $col['src'] ) ) ? explode( "/", $col['src'] ) : array(); if ( empty( $col_exploded ) || ! is_array( $col_exploded ) || ( is_array( $col_exploded ) && ( empty( $col_exploded[0] ) || empty( $col_exploded[1] ) ) ) ){ continue; } // Code for fetching meta cols $table_nm = trim( $col_exploded[0] ); $col_src = trim( $col_exploded[1] ); if( ! empty( $table_nm ) && 'wc_orders_meta' === $table_nm && ! empty( $col_src ) ){ $src = explode( "=", $col_src ); if( ! is_array( $src ) || ( is_array( $src ) && ( empty( $src[0] ) || empty( $src[1] ) || 'meta_key' !== trim( $src[0] ) ) ) ){ continue; } // Condition for handling fetching data for `date` cols which are not accessible using `get_meta` like in case of WC_Subscription if( ! empty( $col['type'] ) && ( 'sm.datetime' === $col['type'] || 'sm.date' === $col['type'] ) && ! empty( $args['meta_date_getter_func'] ) && is_callable( array( $order, $args['meta_date_getter_func'] ) ) ) { $src[1] = ( '_' === substr( $src[1], 0, 1) ) ? substr( $src[1], 1 ) : $src[1]; $meta_data = $order->{$args['meta_date_getter_func']}( $src[1] ); } else { $meta_data = $order->get_meta( trim( $src[1] ) ); } $items[$order_id][$col['data']] = $meta_data; continue; } // Code for creating array for non-getting function cols if ( ! empty( $custom_columns_tables ) && ( is_array( $custom_columns_tables ) ) && ( ! empty( $table_nm ) ) && in_array( $table_nm, $custom_columns_tables ) ) { continue; } if( ! isset( $non_getter_cols[ $table_nm ] ) ){ $non_getter_cols[ $table_nm ] = array(); } if( in_array( $col['col_name'], $non_getter_cols[ $table_nm ] ) ){ continue; } $non_getter_cols[ $table_nm ][] = $col['col_name']; } } $queries = array(); if ( ! empty( $non_getter_cols ) && ! empty( $order_ids ) && is_array( $order_ids ) && count( $order_ids ) > 0 && ! empty( Smart_Manager::$sm_is_wc_hpos_tables_exists ) ) { foreach ( $non_getter_cols as $table_nm => $values ) { if ( empty( $table_nm ) || empty( $values ) ) { continue; } switch( $table_nm ) { case 'wc_orders': $queries['orders'] = "SELECT " . implode( ",", array_unique( array_merge( array( 'id' ), $values ) ) ) . " FROM {$wpdb->prefix}" . $table_nm . " WHERE id IN (" . implode( ",", $order_ids ) . ") GROUP BY id"; break; case 'wc_order_operational_data': $queries['wc_order_operational_data'] = "SELECT " . implode( ",", array_unique( array_merge( array( 'order_id' ), $values ) ) ) . " FROM {$wpdb->prefix}" . $table_nm . " WHERE order_id IN (" . implode( ",", $order_ids ) . ") GROUP BY order_id"; break; case 'wc_orders_meta': $queries['meta'] = "SELECT order_id, meta_key AS meta_key, meta_value AS meta_value FROM {$wpdb->prefix}" . $table_nm . " WHERE order_id IN (" . implode( ",", $order_ids ) . ") AND meta_key IN ('" . implode( "','", $values ) . "') GROUP BY order_id"; break; case 'wc_order_addresses': foreach( $values as $val ) { $src = explode( '_', $val ); if ( empty( $src ) || ! is_array( $src ) || ( is_array( $src ) && ( empty( $src[0] ) || empty( $src[1] ) || ( ! empty( $src[0] ) && ! in_array( $src[0], self::$address_types ) ) ) ) ) { continue; } if( ! in_array( trim( $src[0] ), $address_types ) ){ $address_types[] = trim( $src[0] ); } $col = trim( substr( $val, strlen( $src[0] ) + 1 ) ); if( ! empty( $col ) && ! in_array( $col, $columns ) ){ $columns[] = $col; } } if( empty( $columns ) || empty( $address_types ) ) { break; } $queries['address'] = "SELECT order_id, address_type, " . implode( ",", $columns )." FROM {$wpdb->prefix}" . $table_nm . " WHERE order_id IN (" . implode( ",", $order_ids ) . ") AND address_type IN ('" . implode( "','", $address_types ) . "') GROUP BY address_type, order_id"; break; } } if ( array_key_exists( 'orders', $queries ) && ( ! empty( $queries['orders'] ) ) ) { $results = $wpdb->get_results( $queries['orders'] ,'ARRAY_A' ); if ( is_array( $results ) && ( ! empty( $results ) ) ) { foreach( $results as $result ) { if ( empty( $result ) || ! is_array( $result ) ) { continue; } $id = ( ! empty( $result['id'] ) ) ? $result['id'] : 0; if( empty( $id ) || ( ! empty( $id ) && ! isset( $items[$id] ) ) ){ continue; } unset( $result['id'] ); $items[$id] = array_merge( array_combine( array_map( function( $k ) { return 'wc_orders_' . $k; }, array_keys( $result ) ), $result ), $items[$id] ); } } } if ( array_key_exists( 'wc_order_operational_data', $queries ) && ( ! empty( $queries['wc_order_operational_data'] ) ) ) { $results = $wpdb->get_results( $queries['wc_order_operational_data'] ,'ARRAY_A' ); if ( is_array( $results ) && ( ! empty( $results ) ) ) { foreach( $results as $result ) { if ( empty( $result ) || ! is_array( $result ) ) { continue; } $id = ( ! empty( $result['order_id'] ) ) ? $result['order_id'] : 0; if( empty( $id ) || ( ! empty( $id ) && ! isset( $items[$id] ) ) ){ continue; } unset( $result['order_id'] ); $items[$id] = array_merge( array_combine( array_map( function( $k ) { return 'wc_order_operational_data_' . $k; }, array_keys( $result ) ), $result ), $items[$id] ); } } } if ( array_key_exists( 'meta', $queries ) && ( ! empty( $queries['meta'] ) ) ) { $results = $wpdb->get_results( $queries['meta'] ,'ARRAY_A' ); if( is_array( $results ) && ( ! empty( $results ) ) ) { foreach( $results as $result ) { if ( empty( $result ) || ! is_array( $result ) ) { continue; } $id = ( ! empty( $result['order_id'] ) ) ? $result['order_id'] : 0; if( empty( $id ) || ( ! empty( $id ) && ! isset( $items[$id] ) ) || empty( $result['meta_key'] ) ){ continue; } unset( $result['order_id'] ); $items[$id]['wc_orders_meta_meta_key_' . $result['meta_key'] . '_meta_value_' . $result['meta_key']] = ( ! empty( $result['meta_value'] ) ) ? $result['meta_value'] : ''; } } } if ( array_key_exists( 'address', $queries ) && ( ! empty( $queries['address'] ) ) && ( ! empty( $address_types ) ) ) { $results = $wpdb->get_results( $queries['address'] ,'ARRAY_A' ); if( is_array( $results ) && ( ! empty( $results ) ) ) { foreach( $results as $result ) { if ( empty( $result ) || ! is_array( $result ) ) { continue; } $id = ( ! empty( $result['order_id'] ) ) ? $result['order_id'] : 0; $address_type = ( ! empty( $result['address_type'] ) ) ? $result['address_type'] : ''; if( empty( $id ) || ( ! empty( $id ) && ! isset( $items[$id] ) ) || empty( $address_type ) ){ continue; } unset( $result['order_id'] ); unset( $result['address_type'] ); $items[$id] = array_merge( array_combine( array_map( function( $k ) use( $address_type ) { return 'wc_order_addresses_' . $address_type . '_' . $k; }, array_keys( $result ) ), $result ), $items[$id] ); } } } } $data = array( 'items' => ( ! empty( $items ) ) ? array_values( $items ) : array(), 'start' => $data_col_params['offset'] + $data_col_params['limit'], 'page' => $data_col_params['current_page'], 'total_pages' => ( isset( $orders->max_num_pages ) ) ? intval( $orders->max_num_pages ) : 0, 'total_count' => ( isset( $orders->total ) ) ? intval( $orders->total ) : 0 ); $data_model = ( ! empty( $data_model ) && is_array( $data_model ) ) ? array_merge( $data_model, $data ) : $data; } // =============================================================== // Common code // =============================================================== // Code for generating custom column data if ( is_callable( array( 'Smart_Manager_Shop_Order', 'generate_orders_custom_column_data' ) ) ) { $data_model = self::generate_orders_custom_column_data( $data_model, $curr_obj->req_params ); } // Code to generate order KPI data if( !empty( $curr_obj->req_params['sm_page'] ) && $curr_obj->req_params['sm_page'] == 1 ) { if( is_callable( array( 'Smart_Manager_Shop_Order', 'generate_orders_kpi_data' ) ) ) { $order_statuses = ( function_exists( $args['status_func'] ) ) ? call_user_func( $args['status_func'] ) : array(); $data_model['kpi_data'] = self::generate_orders_kpi_data( $curr_obj->req_params, $order_statuses ); } } return $data_model; } //function for additional things pre inline update public function pre_inline_update( $edited_data = array() ) { if ( empty( $edited_data ) ) { return $edited_data; } $prev_val = ''; // For getting current task_id if ( true === array_key_exists( 'task_id', $edited_data ) ) { $this->task_id = intval( $edited_data['task_id'] ); unset( $edited_data['task_id'] ); } foreach( $edited_data as $id => $edited_row ) { if( empty( $id ) ) { continue; } // For fetching previous value if ( is_callable( array( 'Smart_Manager_Task', 'get_previous_data' ) ) ) { $prev_val = Smart_Manager_Task::get_previous_data( $id, 'posts', 'post_status' ); } if( ! empty( $edited_row['posts/post_status'] ) && class_exists( 'WC_Order' ) ) { $order = new WC_Order( $id ); $order->update_status( $edited_row['posts/post_status'], '', true ); unset( $edited_data[$id]['posts/post_status'] ); } if ( ( defined( 'SMPRO' ) && empty( SMPRO ) ) || empty( $this->task_id ) || empty( $edited_row['posts/post_status'] ) || empty( property_exists( 'Smart_Manager_Base', 'update_task_details_params' ) ) ) { continue; } Smart_Manager_Base::$update_task_details_params[] = array( 'task_id' => $this->task_id, 'action' => 'set_to', 'status' => 'completed', 'record_id' => $id, 'field' => 'posts/post_status', 'prev_val' => $prev_val, 'updated_val' => $edited_row['posts/post_status'] ); } return $edited_data; } /** * Function for generating default dashboard model. * @param array $dashboard_model default generated dashboard model. * @return array Updated default dashboard model */ public function default_dashboard_model( $dashboard_model = array() ) { return self::generate_hpos_dashboard_model( $this, array( 'dashboard_model' => $dashboard_model, 'status_col_args' => array( 'status_func' => 'wc_get_order_statuses', 'default_status' => 'wc-pending', 'color_codes' => $this->status_color_codes ), 'visible_columns' => array( 'wc_orders_id', 'wc_orders_date_created_gmt', 'wc_order_addresses_billing_first_name', 'wc_order_addresses_billing_last_name', 'wc_orders_billing_email', 'wc_orders_status', 'wc_orders_total_amount', 'details', 'wc_orders_payment_method_title', 'shipping_method', 'coupons_used', 'line_items' ) ) ); } /** * Mapping billing and shipping address columns. * @param array $args args to get column model. * @param string $field_nm field name. * @return array Updated args values based on address type */ public static function get_address_cols( $args = array(), $field_nm = '' ) { global $wpdb; if ( ( isset( $args['table_nm'] ) && ( 'wc_order_addresses' !== $args['table_nm'] ) ) || empty( $field_nm ) || ( ! isset( $args['col'] ) ) ) { return $args; } $col_titles = ( is_callable( array( 'Smart_Manager_Shop_Order', 'get_flat_table_col_titles' ) ) ) ? Smart_Manager_Shop_Order::get_flat_table_col_titles() : array(); $updated_args = array_map( function( $address_type ) use ( $args, $field_nm, $col_titles ) { $args['col'] = $address_type . '_' . $field_nm; $args['name'] = ( ! empty( $col_titles[ $args['table_nm'] ] ) && is_array( $col_titles[ $args['table_nm'] ] ) && ! empty( $col_titles[ $args['table_nm'] ][$args['col']] ) ) ? $col_titles[ $args['table_nm'] ][$args['col']] : ''; return $args; }, self::$address_types ); return $updated_args; } /** * Function hooked to filter for processing inline update. * * @param array $edited_data array of edited rows. * @param array $params function arguments. * @return void. */ public function orders_inline_update( $edited_data = array(), $params = array() ) { if ( empty( $edited_data ) || ! is_array( $edited_data ) ) { return; } self::process_shipping_details_update( array( 'edited_data' => $edited_data, 'dashboard' => $this->dashboard_key ) ); if ( ! empty( Smart_Manager::$sm_is_woo79 ) ) { ( is_callable( array( 'Smart_Manager_Shop_Order', 'process_inline_update' ) ) ) ? Smart_Manager_Shop_Order::process_inline_update( $edited_data, array_merge( array( 'curr_obj' => $this ), $params ) ) : ''; } } /** * Function for process inline update. * * @param array $edited_data array of edited rows. * @param array $params function arguments. * @return void. */ public static function process_inline_update( $edited_data = array(), $params = array() ) { if ( empty( $edited_data ) || ! is_array( $edited_data ) ) { return $edited_data; } $curr_obj = ( ! empty( $params ) && ! empty( $params['curr_obj'] ) ) ? $params['curr_obj'] : null; if( empty( $curr_obj ) ){ return $edited_data; } foreach( $edited_data as $id => $edited_row ) { $id = intval( $id ); if ( empty( $id ) || empty( $edited_row ) ) { continue; } $order = wc_get_order( $id ); if( empty( $order ) || ! $order instanceof WC_Order ){ continue; } foreach( $edited_row as $key => $value ) { $src = explode( "/", $key ); if( empty( $src ) || ! is_array( $src ) ){ continue; } $update_table = trim( $src[0] ); $update_column = trim( $src[1] ); if( empty( $update_column ) || empty( $update_table ) ){ continue; } if( 'wc_orders_meta' === $update_table && sizeof( $src ) > 2 ) { $meta_src = explode( "=", $src[2] ); if( empty( $meta_src ) || ! is_array( $meta_src ) ){ continue; } $update_column = ( ! empty( $meta_src[1] ) ) ? trim( $meta_src[1] ) : $update_column; } $type = 'text'; if( 'wc_orders_meta' !== $update_table && ! empty( $params['data_cols_numeric'] ) && is_array( $params['data_cols_numeric'] ) && in_array( $update_column, $params['data_cols_numeric'] ) ){ $type = 'numeric'; } else if( 'wc_orders_meta' === $update_table && ! empty( $params['data_date_cols'] ) && is_array( $params['data_date_cols'] ) && in_array( $update_column, $params['data_date_cols'] ) ) { //condition for handling of meta date columns $type = 'sm.date'; } if ( is_callable( array( 'Smart_Manager_Shop_Order', 'update_order_data') ) ) { self::update_order_data( array( 'id' => $id, 'table_nm' => $update_table, 'col_nm' => $update_column, 'value' => $value, 'type' => $type, 'order_obj' => $order, 'numeric_cols_decimal_places' => ( ! empty( $params['numeric_cols_decimal_places'] ) ) ? $params['numeric_cols_decimal_places'] : array(), 'meta_date_getter_func' => ( ! empty( $params['meta_date_getter_func'] ) ) ? $params['meta_date_getter_func'] : '', 'meta_date_setter_func' => ( ! empty( $params['meta_date_setter_func'] ) ) ? $params['meta_date_setter_func'] : '', 'task_id' => ( ! empty( $params['task_id'] ) ) ? $params['task_id'] : $curr_obj->task_id, 'process' => 'inline_edit' ) ); } } } } /** * Function to get prev_val * * @param string $prev_val received prev_val. * @param array $args array has id, table name, column name. * @return string $prev_val updated prev_val */ public static function get_previous_value( $prev_val = '', $args = array() ) { if( empty( $args ) || ( ! is_array( $args ) ) || empty( $args['id'] ) || empty( $args['table_nm'] ) || empty( $args['col_nm'] ) ){ return $prev_val; } global $wpdb; $col_property = ( is_callable( array( 'Smart_Manager_Shop_Order', 'get_property_name_for_col' ) ) ) ? Smart_Manager_Shop_Order::get_property_name_for_col( $args['col_nm'], $args['table_nm'] ) : $args['col_nm']; $getter_func1 = 'get_' . $col_property; $getter_func2 = 'get' . $col_property; if( empty( $args['order_obj'] ) ){ if( ! empty( $args['curr_obj_getter_func'] ) && ! empty( $args['curr_obj_class_nm'] ) && function_exists( $args['curr_obj_getter_func'] ) && class_exists( $args['curr_obj_class_nm'] ) ) { $args['order_obj'] = call_user_func( $args['curr_obj_getter_func'], $args['id'] ); if( ! $args['order_obj'] instanceof $args['curr_obj_class_nm'] ){ return $prev_val; } } else { $args['order_obj'] = wc_get_order( $args['id'] ); } } switch ( $args['table_nm'] ) { case ( ( ! empty( $getter_func1 ) && is_callable( array( $args['order_obj'], $getter_func1 ) ) ) || ( ! empty( $getter_func2 ) && is_callable( array( $args['order_obj'], $getter_func2 ) ) ) ): $val = ( is_callable( array( $args['order_obj'], $getter_func1 ) ) ) ? $args['order_obj']->{$getter_func1}() : $args['order_obj']->{$getter_func2}(); if( ! empty( $val ) && function_exists( 'wc_format_datetime' ) && $val instanceof WC_DateTime && is_callable( array( $val, 'date' ) ) ) { $val = $val->date( 'Y-m-d H:i:s' ); } return ( ! empty( $val ) ) ? $val : $prev_val; case 'wc_orders_meta': // Condition for handling fetching data for `date` cols which are not accessible using `get_meta` like in case of WC_Subscription if( ! empty( $args['type'] ) && ( 'sm.datetime' === $args['type'] || 'sm.date' === $args['type'] ) && ! empty( $args['meta_date_getter_func'] ) && is_callable( array( $args['order_obj'], $args['meta_date_getter_func'] ) ) ) { $col_nm = ( '_' === substr( $args['col_nm'], 0, 1) ) ? substr( $args['col_nm'], 1 ) : $args['col_nm']; return $args['order_obj']->{$args['meta_date_getter_func']}( $col_nm ); } else { return $args['order_obj']->get_meta( $args['col_nm'] ); } case 'wc_orders': if( empty( Smart_Manager::$sm_is_wc_hpos_tables_exists ) ) { return $prev_val; } $prev_val = $wpdb->get_var( "SELECT " . $args['col_nm'] . " FROM {$wpdb->prefix}". $args['table_nm'] . " WHERE id = " . $args['id'] ); return is_null( $prev_val ) ? '' : $prev_val; case 'wc_order_operational_data': if( empty( Smart_Manager::$sm_is_wc_hpos_tables_exists ) ) { return $prev_val; } $prev_val = $wpdb->get_var( "SELECT " . $args['col_nm'] . " FROM {$wpdb->prefix}". $args['table_nm'] . " WHERE order_id = " . $args['id'] ); return is_null( $prev_val ) ? '' : $prev_val; case 'wc_order_addresses': if( empty( Smart_Manager::$sm_is_wc_hpos_tables_exists ) ) { return $prev_val; } $src = explode( '_', $args['col_nm'] ); if ( ( ( ! is_array( $src ) ) || empty( $src ) ) || ( is_array( $src ) && ( empty( $src[0] ) || empty( $src[1] ) || ! in_array( $src[0], self::$address_types ) ) ) ){ return; } $col = trim( substr( $args['col_nm'], strlen( $src[0] ) + 1 ) ); $prev_val = $wpdb->get_var( "SELECT " . $col . " FROM {$wpdb->prefix}". $args['table_nm'] . " WHERE order_id = " . $args['id'] ." AND address_type = '". $src[0] ."'" ); return is_null( $prev_val ) ? '' : $prev_val; case 'woocommerce_order_items': $args['value'] = $args['id']; $args['dashboard_key'] = ( is_callable( array( $args['order_obj'], 'get_type' ) ) ) ? $args['order_obj']->get_type() : ''; $args = array_merge( $args, array( 'selected_column_name' => $args['col_nm'] ) ); return ( is_callable( array( 'Smart_Manager_Pro_Shop_Order', 'get_previous_shipping_details' ) ) ) ? Smart_Manager_Pro_Shop_Order::get_previous_shipping_details( $args ) : $prev_val; } return $prev_val; } /** * Function to update order data in wc_orders, wc_orders_meta and wc_order_addresses tables * * @param array $args array has id, table name, column name, order object to update the tables. * @return boolean returns true if updated successfully else returns false */ public static function update_order_data( $args = array() ) { if ( empty( $args ) || empty( $args['id'] ) || empty( $args['table_nm'] ) || empty( $args['col_nm'] ) || empty( $args['order_obj'] ) ) { return false; } global $wpdb; $col_property = ( is_callable( array( 'Smart_Manager_Shop_Order', 'get_property_name_for_col' ) ) ) ? Smart_Manager_Shop_Order::get_property_name_for_col( $args['col_nm'], $args['table_nm'] ) : $args['col_nm']; $setter_func1 = 'set_' . $col_property; $setter_func2 = 'set' . $col_property; $args['type'] = ( ! empty( $args['date_type'] ) ) ? $args['date_type'] : $args['type']; //Added fr BE. Need to change it to `data_type` if( ! empty( $args['process'] ) && 'inline_edit' === $args['process'] ){ $prev_val = self::get_previous_value( '', $args ); } switch( $args['table_nm'] ) { case ( ( ! empty( $setter_func1 ) && is_callable( array( $args['order_obj'], $setter_func1 ) ) ) || ( ! empty( $setter_func2 ) && is_callable( array( $args['order_obj'], $setter_func2 ) ) ) ): $result = ( is_callable( array( $args['order_obj'], $setter_func1 ) ) ) ? $args['order_obj']->{$setter_func1}( $args['value'] ) : $args['order_obj']->{$setter_func2}( $args['value'] ); $args['order_obj']->save(); break; case 'wc_orders_meta': // Condition for handling fetching data for `date` cols which are not accessible using `get_meta` like in case of WC_Subscription // Calling `update_meta_data` in case of WC_Subscription was causing duplicate entry in meta table if( ! empty( $args['type'] ) && ( 'sm.datetime' === $args['type'] || 'sm.date' === $args['type'] ) && ! empty( $args['meta_date_setter_func'] ) && is_callable( array( $args['order_obj'], $args['meta_date_setter_func'] ) ) ) { $col_nm = ( '_' === substr( $args['col_nm'], 0, 1) ) ? substr( $args['col_nm'], 1 ) : $args['col_nm']; $args['order_obj']->{$args['meta_date_setter_func']}( array( $col_nm => $args['value'] ) ); } else { $args['order_obj']->update_meta_data( $args['col_nm'], $args['value'] ); } $args['order_obj']->save(); break; case 'wc_orders': if( empty( Smart_Manager::$sm_is_wc_hpos_tables_exists ) ){ break; } $val = "'".$args['value']."'"; if( ! empty( $args['type'] ) && 'numeric' === $args['type'] ){ $val = ( ! empty( $args['numeric_cols_decimal_places'] ) && ! empty( $args['numeric_cols_decimal_places'][$args['col_nm']] ) ) ? floatval( $args['value'], $args['numeric_cols_decimal_places'][$args['col_nm']] ) : intval( $args['value'] ); } $wpdb->query( "UPDATE {$wpdb->prefix}". $args['table_nm'] . " SET " . $args['col_nm'] . " = ". $val ." WHERE id = " . $args['id'] ); break; case 'wc_order_operational_data': if( empty( Smart_Manager::$sm_is_wc_hpos_tables_exists ) ){ break; } $val = "'".$args['value']."'"; if( ! empty( $args['type'] ) && 'numeric' === $args['type'] ){ $val = ( ! empty( $args['numeric_cols_decimal_places'] ) && ! empty( $args['numeric_cols_decimal_places'][$args['col_nm']] ) ) ? floatval( $args['value'], $args['numeric_cols_decimal_places'][$args['col_nm']] ) : intval( $args['value'] ); } $wpdb->query( "UPDATE {$wpdb->prefix}". $args['table_nm'] . " SET " . $args['col_nm'] . " = ". $val ." WHERE order_id = " . $args['id'] ); break; case 'wc_order_addresses': if( empty( Smart_Manager::$sm_is_wc_hpos_tables_exists ) ){ break; } $src = explode( '_', $args['col_nm'] ); if ( ( ( ! is_array( $src ) ) || empty( $src ) ) || ( is_array( $src ) && ( empty( $src[0] ) || empty( $src[1] ) || ! in_array( $src[0], self::$address_types ) ) ) ){ return; } $col = trim( substr( $args['col_nm'], strlen( $src[0] ) + 1 ) ); $id = $wpdb->get_var( "SELECT id FROM {$wpdb->prefix}". $args['table_nm'] . " WHERE order_id = " . $args['id'] ." AND address_type = '". $src[0] ."'" ); if( ! empty( $id ) ){ $query = "UPDATE {$wpdb->prefix}". $args['table_nm'] . " SET " . $col ." = '". $args['value'] ."' WHERE order_id = " . $args['id'] ." AND address_type = '". $src[0] ."'"; } else{ $query = "INSERT INTO {$wpdb->prefix}". $args['table_nm'] . "(order_id, address_type, ". $col .") VALUES(". $args['id'] .",'". $src[0] ."','". $args['value'] ."')"; } $wpdb->query( $query ); break; } if ( ( defined( 'SMPRO' ) && empty( SMPRO ) ) || empty( $args['task_id'] ) || empty( property_exists( 'Smart_Manager_Base', 'update_task_details_params' ) ) || empty( $args['process'] ) || ( ! empty( $args['process'] ) && 'inline_edit' !== $args['process'] ) ) { return; } Smart_Manager_Base::$update_task_details_params[] = array( 'task_id' => $args['task_id'], 'action' => 'set_to', 'status' => 'completed', 'record_id' => $args['id'], 'field' => $args['table_nm'] . '/' . $args['col_nm'], 'prev_val' => $prev_val, 'updated_val' => $args['value'] ); } /** * Function for modifying table types for advanced search. * * @param array $table_types array of table types. * @return array $table_types updated array of table types. */ public static function sm_order_search_table_types( $table_types = array() ){ if ( empty( Smart_Manager::$sm_is_woo79 ) || empty( Smart_Manager::$sm_is_wc_hpos_tables_exists ) ) { return $table_types; } $table_types['flat'] = array_merge( array( 'wc_orders' => 'id', 'wc_order_addresses' => 'order_id', 'wc_order_operational_data' => 'order_id' ), ( ! empty( $table_types['flat'] ) ? $table_types['flat'] : array() ) ); $table_types['meta']['wc_orders_meta'] = 'order_id'; return $table_types; } /** * Function for getting order ids for simple search * * @param string $search_text search text. * @param string $dashboard dashboard name. * @return array filtered order ids. */ public static function get_filtered_order_ids( $search_text = '', $dashboard = '' ) { global $wpdb; $userOrderIds = $skuOrderIds = $itemNameskuOrderIds = $billing_email_order_ids = array(); $pIds = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT(post_id) FROM {$wpdb->prefix}postmeta WHERE meta_key = %s AND meta_value LIKE %s", '_sku', '%' . $wpdb->esc_like($search_text) . '%') ); if( count( $pIds ) > 0 ) { $skuOrderIds = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT(order_id) FROM {$wpdb->prefix}woocommerce_order_items AS woocommerce_order_items LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS woocommerce_order_itemmeta USING ( order_item_id ) WHERE woocommerce_order_itemmeta.meta_key IN ( %s, %s ) AND woocommerce_order_itemmeta.meta_value IN ( ". implode( ',', $pIds ) ." )", '_product_id', '_variation_id') ); } //Query to perform simple search in either of item names i.e. product_name, shipping_title, coupon_code $itemNameskuOrderIds = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT(order_id) FROM {$wpdb->prefix}woocommerce_order_items WHERE order_item_name LIKE %s", '%' . $wpdb->esc_like($search_text) . '%') ); //Query for getting the orders based on the email entered in the Search Box - using 'billing_email' $billing_email_order_ids = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT(p.ID) FROM {$wpdb->prefix}posts AS p JOIN {$wpdb->prefix}postmeta AS pm ON( pm.post_id = p.ID AND p.post_type = %s AND pm.meta_key = %s ) WHERE pm.meta_value LIKE %s", $dashboard, '_billing_email', '%' . $wpdb->esc_like($search_text) . '%' ) ); //Query for getting the user_id based on the email entered in the Search Box $userIds = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT(id) FROM {$wpdb->users} WHERE user_email LIKE %s", '%' . $wpdb->esc_like($search_text) . '%' ) ); if( count( $userIds ) > 0 ) { $userOrderIds = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT(p.ID) FROM {$wpdb->prefix}posts AS p JOIN {$wpdb->prefix}postmeta AS pm ON( pm.post_id = p.ID AND p.post_type = %s AND pm.meta_key = %s ) WHERE pm.meta_value IN( ". implode( ',', $userIds ) ." )", $dashboard, '_customer_user' ) ); } if( !empty( $skuOrderIds ) || !empty( $itemNameskuOrderIds ) || !empty( $userOrderIds ) || ! empty( $billing_email_order_ids ) ) { return array_unique( array_merge( $skuOrderIds, $itemNameskuOrderIds, $userOrderIds, $billing_email_order_ids ) ); } } /** * Function to modify the advanced search query formatted array * * @param array $advanced_search_query advanced search query. * @param array $search_params search params. * @return array $advanced_search_query formatted advanced search query. */ public static function sm_order_addresses_search_query_formatted( $advanced_search_query = array(), $search_params = array() ) { global $wpdb; if ( ! empty( $search_params ) ) { $col_name = explode( '_', $search_params['search_string']['col_name'] ); $adress_type = $col_name[0]; unset($col_name[0]); $search_params['search_col'] = implode( '_', $col_name ); if( ( $wpdb->prefix . 'wc_order_addresses' ) === $search_params['search_string']['table_name'] ) { $advanced_search_query['cond_wc_order_addresses'] = $search_params['search_string']['table_name'] . '.' . $search_params['search_col'] . " LIKE %s AND address_type LIKE '" . $adress_type . "'"; } } return $advanced_search_query; } /** * Function hooked to filter for modifying query clauses. * * @param array $clauses query clauses. * @param object $args OrdersTableQuery object. * @param array $args Query args. * * @return array $clauses array of modified query clauses. */ public function modify_orders_table_query_clauses( $clauses = array(), $query_obj = null, $args = array() ){ return ( is_callable( array( 'Smart_Manager_Shop_Order', 'modify_table_query_clauses' ) ) ) ? Smart_Manager_Shop_Order::modify_table_query_clauses( $clauses, array( 'curr_obj' => $this, 'query_obj' => $query_obj, 'query_args' => $args ) ) : $clauses; } /** * Function for modifying the table query clauses * * @param array $clauses query clauses. * @param array $args function arguments. * * @return array $clauses array of modified query clauses. */ public static function modify_table_query_clauses( $clauses = array(), $args = array() ){ if( empty( $args ) ){ return $clauses; } $curr_obj = ( ! empty( $args['curr_obj'] ) ) ? $args['curr_obj'] : null; if( empty( $clauses ) || empty( Smart_Manager::$sm_is_wc_hpos_tables_exists ) || empty( $curr_obj ) || ( ! empty( $curr_obj ) && empty( $curr_obj->req_params ) ) ) { return $clauses; } global $wpdb; if( ! empty( $curr_obj->req_params['advanced_search_query'] ) && '[]' !== $curr_obj->req_params['advanced_search_query'] && ( empty( $clauses['join'] ) || strpos( $clauses['join'],'sm_advanced_search_temp') === false ) ) { $clauses['join'] .= " JOIN {$wpdb->base_prefix}sm_advanced_search_temp ON ({$wpdb->base_prefix}sm_advanced_search_temp.product_id = {$wpdb->prefix}wc_orders.id)"; } if( ! empty( $curr_obj->req_params['search_text'] ) && false !== stripos( $clauses['join'], 'inner join' ) ) { $clauses['join'] = str_ireplace( 'inner join', 'LEFT JOIN', $clauses['join'] ); } // code for fetching the Order status KPI results self::$kpi_query_results = $wpdb->get_results( "SELECT {$wpdb->prefix}wc_orders.status, COUNT( DISTINCT( {$wpdb->prefix}wc_orders.id ) ) AS count FROM {$wpdb->prefix}wc_orders " . $clauses['join'] ." ". ( ( ! empty( $clauses['where'] ) ) ? ' WHERE ' : '' ) . $clauses['where'] ." GROUP BY {$wpdb->prefix}wc_orders.status", 'ARRAY_A' ); //Code for saving the post_ids in case of simple search if( ( defined('SMPRO') && true === SMPRO ) && ! empty( $curr_obj->req_params['search_text'] ) || ( ! empty( $curr_obj->req_params['advanced_search_query'] ) && $curr_obj->req_params['advanced_search_query'] != '[]' ) ) { $order_ids = $wpdb->get_col( "SELECT DISTINCT {$wpdb->prefix}wc_orders.id FROM {$wpdb->prefix}wc_orders " . $clauses['join'] ." ". ( ( ! empty( $clauses['where'] ) ) ? ' WHERE ' : '' ) . $clauses['where'] ); $order_ids = ( ! empty( $order_ids ) && is_array( $order_ids ) ) ? implode( ",", $order_ids ) : ''; set_transient( 'sa_sm_search_post_ids', $order_ids , WEEK_IN_SECONDS ); } if ( ( ! empty( $curr_obj->req_params[ 'selected_ids' ] ) && '[]' !== $curr_obj->req_params[ 'selected_ids' ] ) && empty( $curr_obj->req_params['storewide_option'] ) && ( ! empty( $curr_obj->req_params[ 'cmd' ] ) && ( 'get_export_csv' === $curr_obj->req_params[ 'cmd' ] ) ) ) { $selected_ids = json_decode( stripslashes( $curr_obj->req_params[ 'selected_ids' ] ) ); $clauses['where'] .= ( ! empty( $selected_ids ) ) ? " AND {$wpdb->prefix}wc_orders.id IN (" . implode( ",", $selected_ids ) . ")" : ''; } if( empty( $curr_obj->req_params['sort_params'] ) || ( ! empty( $curr_obj->req_params['sort_params'] ) && ( empty( $curr_obj->req_params['sort_params']['column'] ) || empty( $curr_obj->req_params['sort_params']['sortOrder'] ) ) ) ){ return $clauses; } // Code to get all valid data cols $store_model_transient = ( ! empty( $curr_obj->store_col_model_transient_option_nm ) ) ? get_transient( $curr_obj->store_col_model_transient_option_nm ) : ''; if( ! empty( $store_model_transient ) && !is_array( $store_model_transient ) ) { $store_model_transient = json_decode( $store_model_transient, true ); } $col_model = ( ! empty( $store_model_transient['columns'] ) ) ? $store_model_transient['columns'] : array(); if( empty( $col_model ) ){ return $clauses; } $data_cols = $numeric_meta_cols = array(); foreach ($col_model as $col) { if( ! empty( $col['hidden'] ) && ! empty( $col['data'] ) ) { continue; } $type = ( ! empty( $col['type'] ) ) ? $col['type'] : ''; $validator = ( !empty( $col['validator'] ) ) ? $col['validator'] : ''; $col_exploded = ( !empty( $col['src'] ) ) ? explode( "/", $col['src'] ) : array(); if( empty( $col_exploded ) ) { continue; } if ( sizeof($col_exploded) > 2) { $col_meta = explode("=",$col_exploded[1]); $col_nm = $col_meta[1]; } else { $col_nm = $col_exploded[1]; } $data_cols[] = $col_nm; if( ! empty( $col_meta[0] ) && 'wc_orders_meta' === $col_meta[0] && ( 'number' === $type || 'numeric' === $type || 'customNumericTextEditor' === $validator ) ) { $numeric_meta_cols[] = $col_nm; } } $sort_params = $curr_obj->build_query_sort_params( array( 'sort_params' => $curr_obj->req_params['sort_params'], 'numeric_meta_cols' => $numeric_meta_cols, 'data_cols' => $data_cols ) ); if( empty( $sort_params ) || ( ! empty( $sort_params ) && ( empty( $sort_params['table'] ) || empty( $sort_params['column_nm'] ) || empty( $sort_params['sortOrder'] ) ) ) ) { return $clauses; } $sort_params['column_nm'] = ( 'meta_value_num' === $sort_params['column_nm'] ) ? 'meta_value+0' : $sort_params['column_nm']; $order_ids = array(); if( in_array( $sort_params['table'], $curr_obj->flat_tables ) ){ if( 'wc_orders' === $sort_params['table'] ){ $clauses['orderby'] = $wpdb->prefix . $sort_params['table'] . '.' . $sort_params['column_nm'] . ' ' . $sort_params['sortOrder']; return $clauses; } else if( 'wc_order_operational_data' === $sort_params['table'] ){ $order_ids = $wpdb->get_col( "SELECT DISTINCT order_id FROM ". $wpdb->prefix.$sort_params['table'] ." ORDER BY ". $sort_params['column_nm'] ." ". $sort_params['sortOrder'] ); } else { $addresses_src = explode( '_', $sort_params['column_nm'] ); if( empty( $addresses_src ) || ( ! empty( $addresses_src ) && is_array( $addresses_src ) && ( empty( $addresses_src[0] ) || empty( $addresses_src[1] || ! in_array( $addresses_src[0], self::$address_types ) ) ) ) ){ return $clauses; } $col = trim( substr( $sort_params['column_nm'], strlen( $addresses_src[0] ) + 1 ) ); $order_ids = $wpdb->get_col( "SELECT DISTINCT order_id FROM ". $wpdb->prefix.$sort_params['table'] ." WHERE address_type = '". $addresses_src[0] ."' ORDER BY ". $col ." ". $sort_params['sortOrder'] ); } } else if( 'wc_orders_meta' === $sort_params['table'] && ! empty( $sort_params['sort_by_meta_key'] ) ){ $order_ids = $wpdb->get_col( "SELECT DISTINCT order_id FROM ". $wpdb->prefix.$sort_params['table'] ." WHERE meta_key = '". $sort_params['sort_by_meta_key'] ."' ORDER BY ". $sort_params['column_nm'] ." ". $sort_params['sortOrder'] ); } if( empty( $order_ids ) ){ return $clauses; } $option_name = 'sm_data_model_sorted_ids'; update_option( $option_name, implode( ',', $order_ids ), 'no' ); $clauses['orderby'] = " FIND_IN_SET( " . $wpdb->prefix . "wc_orders.id, ( SELECT option_value FROM " . $wpdb->prefix . "options WHERE option_name = '" . $option_name . "' ) ) "; return $clauses; } /** * Function for handling delete functionality. * * @param boolean $result result of the delete process. * @param int $id order_id of the record to be deleted. * @param array $params array of additional params for delete functionality. * @return boolean $result result of the delete process. */ public static function process_delete( $result = false, $order_id = 0, $params = array() ) { $order_id = intval( $order_id ); if ( empty( $order_id ) ) { return $result; } $force_delete = ( ! empty( $params['delete_permanently'] ) ) ? true : false; if( empty( Smart_Manager::$sm_is_woo79 ) ){ $result = ( ( $force_delete ) ? wp_delete_post( $order_id, $force_delete ) : wp_trash_post( $order_id ) ); return ( ! empty( $result ) ) ? true : false; } //Code for WC-HPOS handling $order = wc_get_order( $order_id ); if( $order && $order instanceof WC_Order ) { return $order->delete( $force_delete ); } } /** * Function for order trash. * * @param int $count count of deleted order ids. * @param array $args array of additional params for trash functionality. * @return int $count count of deleted order ids. */ public static function order_trash( $count = 0, $args = array() ) { $ids = ( ! empty( $args['ids'] ) ) ? $args['ids'] : array(); if( empty( $ids ) ){ return $count; } $count = 0; foreach( $ids as $id ){ $result = self::process_delete( false, intval( $id ) ); if( ! empty( $result ) ){ $count++; } } return $count; } /** * Function for creating col_model for 'statuses' column. * * @param array $col 'statuses' default col_model. * @param array $args function arguments. * @return array $col 'statuses' updated col_model. */ public static function generate_status_col_model( $col = array(), $args = array() ){ if( empty( $args ) || empty( $args['curr_obj'] ) || empty( $args['status_func'] ) || ( ! empty( $args['status_func'] ) && ! function_exists( $args['status_func'] ) ) ) { return $col; } $statuses = call_user_func( $args['status_func'] ); if( empty( $statuses ) || ! is_array( $statuses ) ){ return $col; } $color_codes = ( ! empty( $args['color_codes'] ) ) ? $args['color_codes'] : array(); // Code to handle display of 'trash' value for 'status' -- not to be saved in transient if( ! empty( $args['curr_obj']->is_show_trash_records() ) ) { $statuses['trash'] = __( 'Trash', 'smart-manager-for-wp-e-commerce' ); if( ! isset( $color_codes['red'] ) ){ $color_codes['red'] = array(); } $color_codes['red'][] = 'trash'; } $keys = ( ! empty( $statuses ) ) ? array_keys( $statuses ) : array(); $col['type'] = 'dropdown'; $col['editor'] = 'select'; $col['strict'] = true; $col['allowInvalid'] = false; $col['values'] = $statuses; $col['selectOptions'] = $col['values']; $col['defaultValue'] = ( !empty( $keys[0] ) ) ? $keys[0] : $args['default_status']; $col['save_state'] = true; $col['renderer'] = 'selectValueRenderer'; $col['colorCodes'] = apply_filters( 'sm_' . $args['curr_obj']->dashboard_key . '_status_color_codes', $color_codes ); $col['search_values'] = array(); foreach( $statuses as $key => $value ) { $col['search_values'][] = array('key' => $key, 'value' => $value); } return $col; } /** * Static function for creating HPOS dashboard model. * * @param array $curr_obj current class object. * @param array $args array of required arguments. * @return array updated dashboard model. */ public static function generate_hpos_dashboard_model( $curr_obj = null, $args = array() ) { if( empty( $curr_obj ) ){ return ( ! empty( $args['dashboard_model'] ) ) ? $args['dashboard_model'] : array(); } $col_model = array(); foreach( $curr_obj->flat_tables as $table_nm ) { if( ! is_callable( array( $curr_obj, 'get_flat_table_columns' ) ) ){ continue; } $params = array( 'table_nm' => $table_nm, 'dashboard_model' => $args['dashboard_model'] ); if( ! empty( $args['visible_columns'] ) ) { $params['visible_columns'] = $args['visible_columns']; } $col_model = array_merge( $col_model, $curr_obj->get_flat_table_columns( $params ) ); } $meta_table_columns = array(); if( is_callable( array( $curr_obj, 'get_meta_table_columns' ) ) ){ $params = array( 'meta_table_nm' => 'wc_orders_meta', 'table_nm' => 'wc_orders', 'child_id' => 'order_id', 'parent_id' => 'id', 'post_type' => 'type' ); if( ! empty( $args['visible_columns'] ) ) { $params['visible_columns'] = $args['visible_columns']; } $meta_table_columns = $curr_obj->get_meta_table_columns( $params ); } $col_model = ( ! empty( $meta_table_columns ) ) ? array_merge( $col_model, $meta_table_columns) : $col_model; $status_col_index = sm_multidimesional_array_search( 'wc_orders_status', 'data', $col_model ); if( isset( $col_model[$status_col_index] ) && ! empty( $args['status_col_args'] ) && is_callable( array( 'Smart_Manager_Shop_Order', 'generate_status_col_model' ) ) ){ $col_model[$status_col_index] = self::generate_status_col_model( $col_model[$status_col_index], array_merge( array( 'curr_obj' => $curr_obj ), $args['status_col_args'] ) ); } if( is_callable( array( 'Smart_Manager_Shop_Order', 'generate_orders_custom_column_model' ) ) ) { $col_model = self::generate_orders_custom_column_model( $col_model, $curr_obj->dashboard_key ); } return array('tables' => array( 'wc_orders' => array( 'pkey' => 'ID', 'join_on' => '', 'where' => array( 'type' => $curr_obj->dashboard_key, 'status' => 'any' ) ), 'wc_order_addresses' => array( 'pkey' => 'order_id', 'join_on' => 'wc_order_addresses.order_id = wc_orders.ID', 'where' => array() ), 'wc_order_operational_data' => array( 'pkey' => 'order_id', 'join_on' => 'wc_order_operational_data.order_id = wc_orders.ID', 'where' => array() ), 'wc_orders_meta' => array( 'pkey' => 'order_id', 'join_on' => 'wc_orders_meta.order_id = wc_orders.ID', // format current_table.pkey = joinning table.pkey 'where' => array(), ) ), 'display_name' => __( ucwords( str_replace( '_', ' ', $curr_obj->dashboard_key ) ), 'smart-manager-for-wp-e-commerce' ), 'columns' => $col_model, 'per_page_limit' => '', // blank, 0, -1 all values refer to infinite scroll. 'treegrid' => false, // flag for setting the treegrid. ); } /** * Static function for handling HPOS db migration for column model. * * @param array $col_model current saved column model. * @return array $col_model updated column model. */ public static function migrate_col_model( $col_model = array() ) { if( empty( $col_model ) || empty( $col_model['columns'] ) ) { return array(); } $tables = array( 'wc_orders' => 'Automattic\WooCommerce\Database\Migrations\CustomOrderTable\PostToOrderTableMigrator', 'wc_order_addresses/billing' => 'Automattic\WooCommerce\Database\Migrations\CustomOrderTable\PostToOrderAddressTableMigrator', 'wc_order_addresses/shipping' => 'Automattic\WooCommerce\Database\Migrations\CustomOrderTable\PostToOrderAddressTableMigrator', 'wc_order_operational_data' => 'Automattic\WooCommerce\Database\Migrations\CustomOrderTable\PostToOrderOpTableMigrator' ); $col_mapping = array( 'posts_id' => 'wc_orders_id', 'posts_post_status' => 'wc_orders_status', 'posts_post_date_gmt' => 'wc_orders_date_created_gmt', 'posts_post_modified_gmt' => 'wc_orders_date_updated_gmt', 'posts_post_parent' => 'wc_orders_parent_order_id', 'posts_post_type' => 'wc_orders_type', 'posts_post_excerpt' => 'wc_orders_customer_note' ); foreach( $tables as $table => $class ){ if( ! class_exists( $class ) ){ continue; } $key = ''; $table = explode( "/", $table ); if( is_array( $table ) && ! empty( $table ) && ! empty( trim( $table[0] ) ) ) { $key = ( ! empty( $table[1] ) ) ? trim( $table[1] ) : ''; $table = trim( $table[0] ); } $obj = new $class($key); if( empty( $obj ) ){ continue; } if( is_callable( array( $obj, 'get_meta_column_config' ) ) ){ $cols = $obj->get_meta_column_config(); if( empty( $cols ) ) { continue; } foreach( $cols as $col => $meta ){ if( ! is_array( $meta ) || ( is_array( $meta ) && empty( $meta['destination'] ) ) ) { continue; } $old_key = "postmeta_meta_key_{$col}_meta_value_{$col}"; $new_key = $table .'_'. ( ( ! empty( $key ) ) ? $key . '_' : '' ) . $meta['destination']; if( ! empty( $col_mapping[$old_key] ) || in_array( $new_key, $col_mapping ) ) { continue; } $col_mapping[$old_key] = $new_key; } } } // Code to update the column model $wc_class = 'Automattic\WooCommerce\Internal\DataStores\Orders\CustomOrdersTableController'; if( ! class_exists( $wc_class ) || ( class_exists( $wc_class ) && empty( $wc_class::CUSTOM_ORDERS_TABLE_USAGE_ENABLED_OPTION ) ) ){ return $col_model; } $is_hpos_enabled = ( 'yes' === get_option( $wc_class::CUSTOM_ORDERS_TABLE_USAGE_ENABLED_OPTION, 'no' ) ) ? true : false; $updated_cols = array(); foreach( $col_model['columns'] as $col => $meta ){ $key = ( empty( $is_hpos_enabled ) ) ? array_search( $col, $col_mapping ) : ( ( ! empty( $col_mapping[ $col ] ) ) ? $col_mapping[ $col ] : '' ); if( empty( $key ) || empty( $meta ) || ( ! empty( $key ) && ! empty( $updated_cols[$key] ) ) ) { continue; } if( ! empty( $key ) ){ $updated_cols[$key] = $meta; continue; } // Handling for meta columns if( 'postmeta' === substr( $col, 0, 8 ) || 'wc_orders_meta' === substr( $col, 0, 14 ) ){ if( $is_hpos_enabled ){ $updated_cols[str_replace( 'postmeta', 'wc_orders_meta', $col )] = $meta; continue; } else { $updated_cols[str_replace( 'wc_orders_meta', 'postmeta', $col )] = $meta; continue; } } // Handling for custom columns if( 'custom' === substr( $col, 0, 6 ) ){ $updated_cols[$col] = $meta; continue; } } $col_model['columns'] = ( ! empty( $updated_cols ) ) ? $updated_cols : $col_model['columns']; $col = ( ! empty( $col_model['sort_params'] ) && ! empty( $col_model['sort_params']['column'] ) ) ? $col_model['sort_params']['column'] : ''; if( empty( $col ) ) { return $col_model; } $col = str_replace( array( '/', '=' ), '_', $col ); $key = ( empty( $is_hpos_enabled ) ) ? array_search( $col, $col_mapping ) : ( ( ! empty( $col_mapping[ $col ] ) ) ? $col_mapping[ $col ] : '' ); // Handling for meta columns if( empty( $key ) && ( 'postmeta' === substr( $col, 0, 8 ) || 'wc_orders_meta' === substr( $col, 0, 14 ) ) ) { $key = ( $is_hpos_enabled ) ? str_replace( 'postmeta', 'wc_orders_meta', $col ) : str_replace( 'wc_orders_meta', 'postmeta', $col ); } $col_model['sort_params']['column'] = ( ! empty( $key ) ) ? $key : $col_model['sort_params']['column']; return $col_model; } /** * Static function for defining columns to be ignored for flat tables. * * @param array $cols current ignored cols array. * @return array $cols updated ignored cols array. */ public static function get_flat_table_ignored_cols( $cols = array() ) { return array( 'wc_order_addresses' => array( 'id', 'order_id', 'address_type' ), 'wc_order_operational_data' => array( 'id', 'order_id' ) ); } /** * Static function for defining column titles for flat tables. * * @param array $cols current column titles array. * @return array $cols updated column titles array. */ public static function get_flat_table_col_titles( $cols = array() ) { return array( 'wc_order_addresses' => array( 'billing_email' => __( 'Address Billing Email', 'smart-manager-for-wp-e-commerce' ) ) ); } /** * Static function for getting property name for column. * * @param string $col_nm column name. * @param string $table_nm table name. * @return string $col_nm property name for column. */ public static function get_property_name_for_col( $col_nm = '', $table_nm = '' ) { global $wpdb; if( empty( Smart_Manager::$sm_is_woo79 ) || empty( Smart_Manager::$sm_is_wc_hpos_tables_exists ) || ! function_exists( 'wc_get_container' ) || ! class_exists( 'Automattic\WooCommerce\Internal\DataStores\Orders\OrdersTableDataStore' ) || empty( $col_nm ) || empty( $table_nm ) ){ return $col_nm; } if( empty( Smart_Manager_Shop_Order::$hpos_tables_column_property_mapping ) ){ Smart_Manager_Shop_Order::$hpos_tables_column_property_mapping = wc_get_container()->get( 'Automattic\WooCommerce\Internal\DataStores\Orders\OrdersTableDataStore' )->get_all_order_column_mappings(); } $key = ''; $table_nm = ( false === strpos( $table_nm, $wpdb->prefix ) ) ? $wpdb->prefix . $table_nm : $table_nm; switch( $table_nm ){ case "{$wpdb->prefix}wc_orders": $key = 'orders'; break; case "{$wpdb->prefix}wc_order_operational_data": $key = 'operational_data'; break; case "{$wpdb->prefix}wc_order_addresses": $src = explode( '_', $col_nm ); if ( ( ( ! is_array( $src ) ) || empty( $src ) ) || ( is_array( $src ) && ( empty( $src[0] ) || empty( $src[1] ) || ! in_array( $src[0], self::$address_types ) ) ) ){ return $col_nm; } $key = ( 'billing' === $src[0] ) ? 'billing_address' : 'shipping_address'; $col_nm = trim( substr( $col_nm, strlen( $src[0] ) + 1 ) ); break; } if( empty( $key ) || empty( $col_nm ) || ( ! empty( $key ) && empty( Smart_Manager_Shop_Order::$hpos_tables_column_property_mapping[$key] ) ) ){ return $col_nm; } if( empty( Smart_Manager_Shop_Order::$hpos_tables_column_property_mapping[$key][$col_nm] ) || ! is_array( Smart_Manager_Shop_Order::$hpos_tables_column_property_mapping[$key][$col_nm] ) ) { return $col_nm; } return ( ! empty( Smart_Manager_Shop_Order::$hpos_tables_column_property_mapping[$key][$col_nm]['name'] ) ) ? Smart_Manager_Shop_Order::$hpos_tables_column_property_mapping[$key][$col_nm]['name'] : $col_nm; } /** * Search meta data from wc_orders_meta table. * * @param string $meta_cond meta conditions. * @param array $search_params search params array. * @return string $meta_cond Updated meta conditions */ public static function search_wc_orders_meta_cond( $meta_cond = '', $search_params = array() ) { if ( ( ! in_array( $search_params['search_col'], array( '_schedule_next_payment', '_schedule_trial_end', '_schedule_start', '_schedule_end', '_schedule_cancelled', '_schedule_payment_retry' ) ) ) || ( ( ! empty( $search_params['rule_val'] ) && in_array( $search_params['search_operator'], array ( '=', '>', '>=' ) ) ) && ( '0' !== $search_params['rule_val'] && '' !== $search_params['rule_val'] && 0 !== $search_params['rule_val'] ) ) || empty( $search_params['search_col'] ) ) { return $meta_cond; } return ( '0' === $search_params['rule_val'] || '' === $search_params['rule_val'] || 0 === $search_params['rule_val'] ) ? "( ". $meta_cond ." OR ( ". $search_params['table_nm'] .".meta_key = '". $search_params['search_col'] . "' AND ". $search_params['table_nm'] .".meta_value ". $search_params['search_operator']." 0"." ) )" : "( ". $meta_cond ." OR ( ". $search_params['table_nm'] .".meta_key = '". $search_params['search_col'] . "' AND ". $search_params['table_nm'] .".meta_value = 0"." ) OR ( ". $search_params['table_nm'] .".meta_key = '". $search_params['search_col'] . "' AND ". $search_params['table_nm'] .".meta_value ". $search_params['search_operator']." '".$search_params['rule_val']."' ) )"; } /** * Update shipping details. * @param array $args subscription/ order ID, shipping total amount or shipping method, column name, dashbaord name. * * @return boolean true if success else false */ public static function update_shipping_details( $args = array() ) { if ( empty( $args['id'] ) || empty( $args['update_column'] ) || empty( $args['dashboard'] ) ) { return false; } $subs_or_order_obj = null; if ( 'shop_subscription' === $args['dashboard'] && function_exists( 'wcs_get_subscription' ) ) { $subscription = wcs_get_subscription( $args['id'] ); if ( ! $subscription || ! is_a( $subscription, 'WC_Subscription' ) ) { return false; } $subs_or_order_obj = $subscription; } else { $order = wc_get_order( $args['id'] ); if ( ! $order || ! is_a( $order, 'WC_Order' ) || ! is_callable( array( $order, 'get_status' ) ) ) { return false; } $status = $order->get_status(); if ( empty( $status ) || ! in_array( $status, array( 'pending', 'on-hold' ) ) ) { return false; } $subs_or_order_obj = $order; } $line_items = ( is_callable( array( $subs_or_order_obj, 'get_items' ) ) ) ? $subs_or_order_obj->get_items( 'shipping' ) : array(); if ( empty( $line_items ) || ! is_array( $line_items ) ) { return false; } foreach( $line_items as $item_id => $item ) { switch ( $args['update_column'] ) { case 'shipping_method': if ( ! is_callable( array( $item, 'set_method_id' ) ) ) { break; } $item->set_method_id( $args['value'] ); break; case 'shipping_method_title': if ( ! is_callable( array( $item, 'set_method_title' ) ) ) { break; } $item->set_method_title( $args['value'] ); break; case in_array( $args['update_column'], array( '_order_shipping', 'shipping_total_amount' ) ): if ( ! is_callable( array( $item, 'set_total' ) ) ) { break; } $item->set_total( $args['value'] ); break; } } if ( ! is_callable( array( $subs_or_order_obj, 'calculate_totals' ) ) ) { return false; } $subs_or_order_obj->calculate_totals(); } /** * Function to process shipping details update. * * @param array $args array of shipping details. * @return void. */ public static function process_shipping_details_update( $args = array() ) { if ( empty( $args['edited_data'] ) || ! is_array( $args['edited_data'] ) ) { return; } foreach( $args['edited_data'] as $id => $edited_row ) { $id = intval( $id ); if ( empty( $id ) || empty( $edited_row ) ) { continue; } foreach( $edited_row as $key => $value ) { $src = explode( "/", $key ); if( empty( $src ) || ! is_array( $src ) ){ continue; } $update_table = trim( $src[0] ); $update_column = trim( $src[1] ); if( empty( $update_column ) || empty( $update_table ) ){ continue; } if( 'postmeta' === $update_table && sizeof( $src ) > 2 ) { $meta_src = explode( "=", $src[2] ); if( empty( $meta_src ) || ! is_array( $meta_src ) ){ continue; } $update_column = ( ! empty( $meta_src[1] ) ) ? trim( $meta_src[1] ) : $update_column; } if ( ! in_array( $update_column, array( '_order_shipping', 'shipping_total_amount', 'shipping_method', 'shipping_method_title' ) ) ) { continue; } Smart_Manager_Shop_Order::update_shipping_details( array( 'id' => $id, 'value' => $value, 'update_column' => $update_column, 'dashboard' => $args['dashboard'] ) ); } } } /** * Function to modify join clause. * * @param string $join join clause * @param object $wp_query_obj wp query object. * @return string $join updated join clause. */ public function sm_order_query_join( $join = '', $wp_query_obj = null ) { global $wpdb; if ( empty( $this->req_params['search_text'] ) || empty( $this->dashboard_key ) ) { return $join; } $join .= ( false === strpos( $join, "{$wpdb->prefix}comments") ) ? " LEFT JOIN {$wpdb->prefix}comments AS cm ON ({$wpdb->prefix}posts.id = cm.comment_post_ID AND {$wpdb->prefix}posts.post_type = '{$this->dashboard_key}')" : ''; $join .= ( ( false === strpos( $join, 'woocommerce_order_items' ) ) || ( false === strpos( $join, 'woocommerce_order_itemmeta' ) ) ) ? " LEFT JOIN {$wpdb->prefix}woocommerce_order_items AS oi ON ({$wpdb->prefix}posts.id = oi.order_id AND {$wpdb->prefix}posts.post_type = '{$this->dashboard_key}') LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta AS oim ON (oi.order_item_id = oim.order_item_id AND oi.order_item_type = 'shipping')" : ''; return $join; } } } classes/class-smart-manager-utils.php000064400000060027147600337620013726 0ustar00 0 ) { if ( ( !empty( Smart_Manager::$sm_is_woo21 ) && Smart_Manager::$sm_is_woo21 == 'true' ) || ( !empty( Smart_Manager::$sm_is_woo22 ) && Smart_Manager::$sm_is_woo22 == 'true' ) || ( !empty( Smart_Manager::$sm_is_woo30 ) && Smart_Manager::$sm_is_woo30 == 'true' ) ) { if( class_exists( 'WC_Product_Variable' ) && is_callable( array('WC_Product_Variable', 'sync') ) ) { WC_Product_Variable::sync( $parent_id ); delete_transient( 'wc_product_children_' . $parent_id ); //added in woo24 } } } } } /** * Function for updating stock status value * * @param int $id product id * @param string $update_column update column * @param mixed $update_value update value * @return boolean updated result */ function sm_update_stock_status( $id = 0, $update_column = '', $update_value = '' ) { if ( ( ( !empty( Smart_Manager::$sm_is_woo21 ) && Smart_Manager::$sm_is_woo21 == 'true' ) || ( !empty( Smart_Manager::$sm_is_woo22 ) && Smart_Manager::$sm_is_woo22 == 'true' ) || ( !empty( Smart_Manager::$sm_is_woo30 ) && Smart_Manager::$sm_is_woo30 == 'true' ) ) && !empty( $id ) ) { $parent_id = wp_get_post_parent_id( $id ); $woo_version = ( ( defined( 'WOOCOMMERCE_VERSION' ) ) ? WOOCOMMERCE_VERSION : $woocommerce->version ); $woo_prod_obj_stock_status = function_exists( 'wc_get_product' ) ? wc_get_product( absint( $id ) ) : null; if ( empty( $woo_prod_obj_stock_status ) || ! $woo_prod_obj_stock_status instanceof WC_Product ) { return false; } switch ( $update_column ) { case '_stock': if( !empty( Smart_Manager::$sm_is_woo30 ) && Smart_Manager::$sm_is_woo30 == 'true' && function_exists('wc_update_product_stock') ) { $prod = wc_get_product($id); $prod->set_stock_quantity( $update_value ); $result = wc_update_product_stock( $prod, $update_value ); return ( ( empty( $result ) && 0 == $result ) || ( ( ! empty( $result ) ) && ( ! is_wp_error( $result ) ) ) ) ? true : false; } elseif ( 'yes' === get_post_meta( $id, '_manage_stock', true ) ) { //check if manage stock is enabled or not if ( version_compare( $woo_version, '2.4', ">=" ) ) { if ( $parent_id > 0 ) { $stock_status_option = get_post_meta( $id, 'stock_status', true ); $stock_status = ( ! empty( $stock_status_option ) ) ? $stock_status_option : ''; if ( is_callable( array( $woo_prod_obj_stock_status, 'set_stock_status' ) ) ) { $woo_prod_obj_stock_status->set_stock_status( $stock_status ); } } elseif ( is_callable( array( $woo_prod_obj_stock_status, 'check_stock_status' ) ) ) { $woo_prod_obj_stock_status->check_stock_status(); } } elseif ( is_callable( array( $woo_prod_obj_stock_status, 'set_stock' ) ) ) { $result = $woo_prod_obj_stock_status->set_stock( $update_value ); return ( ( empty( $result ) && 0 == $result ) || ( ( ! empty( $result ) ) && ( ! is_wp_error( $result ) ) ) ) ? true : false; } } break; case '_backorders': $backorders = is_callable( array( $woo_prod_obj_stock_status, 'get_backorders' ) ) ? $woo_prod_obj_stock_status->get_backorders() : 'no'; if ( ! empty( $backorders ) && is_callable( array( $woo_prod_obj_stock_status, 'set_backorders' ) ) ) { $woo_prod_obj_stock_status->set_backorders( $backorders ); } $result = $woo_prod_obj_stock_status->save(); return ( ( empty( $result ) && 0 == $result ) || ( ( ! empty( $result ) ) && ( ! is_wp_error( $result ) ) ) ) ? true : false; } } } function sm_array_recursive_diff($array1, $array2) { $array_diff = array(); foreach ($array1 as $key => $value) { if (array_key_exists($key, $array2)) { if (is_array($value)) { $recursive_diff = sm_array_recursive_diff($value, $array2[$key]); if (count($recursive_diff)) { $array_diff[$key] = $recursive_diff; } } else { if ($value != $array2[$key]) { $array_diff[$key] = $value; } } } else { $array_diff[$key] = $value; } } return $array_diff; } function sm_multidimesional_array_search($id, $index, $array) { if( empty( $array ) ){ return null; } foreach ($array as $key => $val) { if (empty($val[$index])) continue; if ($val[$index] == $id) { return $key; } } return null; } //Function to sort multidimesnional array based on any given key function sm_multidimensional_array_sort($array, $on, $order=SORT_ASC){ $sorted_array = array(); $sortable_array = array(); if (count($array) > 0) { foreach ($array as $key => $value) { if (is_array($value)) { foreach ($value as $key2 => $value2) { if ($key2 == $on) { $sortable_array[$key] = $value2; } } } else { $sortable_array[$key] = $value; } } switch ($order) { case SORT_ASC: asort($sortable_array); break; case SORT_DESC: arsort($sortable_array); break; } foreach ($sortable_array as $key => $value) { $sorted_array[$key] = $array[$key]; } } return $sorted_array; } //Function to compare column position function sm_position_compare( $a, $b ){ if ( $a['position'] == $b['position'] ) return 0; if ( $a['position'] < $b['position'] ) { return -1; } return 1; } function sm_woo_get_price($regular_price, $sale_price, $sale_price_dates_from, $sale_price_dates_to) { // Get price if on sale if ($sale_price && empty( $sale_price_dates_to ) && empty( $sale_price_dates_from ) ) { $price = $sale_price; } else { $price = $regular_price; } $from_date = ( is_numeric( $sale_price_dates_from ) && ( int )$sale_price_dates_from == $sale_price_dates_from ) ? ( int )$sale_price_dates_from : strtotime( $sale_price_dates_from ); $to_date = ( is_numeric( $sale_price_dates_to ) && ( int )$sale_price_dates_to == $sale_price_dates_to ) ? ( int )$sale_price_dates_to : strtotime( $sale_price_dates_to ); if ( ! empty( $from_date ) && $from_date < strtotime('NOW') ) { $price = $sale_price; } if ( ! empty( $to_date ) && $to_date < strtotime('NOW') ) { $price = $regular_price; } return $price; } //function to fetch the variation current post title function sm_get_current_variation_title( $pids = array() ) { $results = array(); if( empty( $pids ) ) { return $results; } global $wpdb; $variable_taxonomy_ids = $wpdb->get_col( $wpdb->prepare( "SELECT taxonomy.term_taxonomy_id as term_taxonomy_id FROM {$wpdb->prefix}terms as terms JOIN {$wpdb->prefix}term_taxonomy as taxonomy ON (taxonomy.term_id = terms.term_id AND taxonomy.taxonomy = %s) WHERE terms.slug IN ('variable', 'variable-subscription')", 'product_type' ) ); //query to get the parent ids old title $results = $wpdb->get_results( $wpdb->prepare( "SELECT id, post_title FROM {$wpdb->posts} as p JOIN {$wpdb->prefix}term_relationships as tp ON(tp.object_id = p.id AND p.post_type = %s) WHERE p.id IN (". implode(",",$pids) .") AND tp.term_taxonomy_id IN (". implode(",",$variable_taxonomy_ids) .")", 'product' ), ARRAY_A ); return $results; } //function to sync the variations title when the parent product title is updated function sm_sync_variation_title( $new_title_update_case, $ids ) { if( !empty( $new_title_update_case ) && !empty( $ids ) ) { global $wpdb; $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->posts} SET post_title = (CASE ". implode(" ",$new_title_update_case) ." END) WHERE post_type = %s AND post_parent IN (". implode(",",$ids) .")", 'product_variation' ) ); } } function sm_update_price_meta( $ids ) { if( !empty($ids) ) { global $wpdb; $query = "SELECT post_id, GROUP_CONCAT( meta_key ORDER BY meta_id SEPARATOR '##' ) AS meta_keys, GROUP_CONCAT( meta_value ORDER BY meta_id SEPARATOR '##' ) AS meta_values FROM {$wpdb->prefix}postmeta WHERE meta_Key IN ( '_regular_price', '_sale_price', '_sale_price_dates_from', '_sale_price_dates_to' ) AND post_id IN (".implode(",", $ids).") GROUP BY post_id"; $results = $wpdb->get_results( $query, 'ARRAY_A' ); $update_cases = array(); $ids_to_be_updated = array(); foreach ( $results as $result ) { $meta_keys = explode( '##', $result['meta_keys'] ); $meta_values = explode( '##', $result['meta_values'] ); if ( count( $meta_keys ) == count( $meta_values ) ) { $keys_values = array_combine( $meta_keys, $meta_values ); $from_date = (isset($keys_values['_sale_price_dates_from'])) ? $keys_values['_sale_price_dates_from'] : ''; $to_date = (isset($keys_values['_sale_price_dates_to'])) ? $keys_values['_sale_price_dates_to'] : ''; $regular_price = isset( $keys_values['_regular_price'] ) ? trim( $keys_values['_regular_price'] ) : ''; $sale_price = isset( $keys_values['_sale_price'] ) ? trim( $keys_values['_sale_price'] ) : ''; $price = sm_woo_get_price( $regular_price, $sale_price, $from_date, $to_date); $price = trim($price); // For handling when both price and sales price are null $meta_value = (!empty($price)) ? $price : ''; update_post_meta($result['post_id'], '_price', $meta_value); } } } } //Function to detect whether a string is timestamp or not function isTimestamp( $string ) { try { new DateTime('@' . $string); } catch(Exception $e) { return false; } if( $string < strtotime('-30 years') || $string > strtotime('+30 years') ) { return false; } return true; } /** * This function will update the WC lookup table introduced in WC 3.6 for the edited product fields in SM * * Since SM 4.2.3 * For WC 3.6+ */ function sm_update_product_lookup_table( $product_ids ) { if ( empty( $product_ids ) ) { return; } global $wpdb; $query = "SELECT post_id, meta_key, meta_value FROM {$wpdb->prefix}postmeta WHERE meta_key IN ( '_sku', '_virtual', '_downloadable', '_regular_price', '_sale_price', '_price', '_manage_stock', '_stock', '_stock_status', '_wc_rating_count', '_wc_average_rating', 'total_sales' ". ( ( !empty( Smart_Manager::$sm_is_woo40 ) ) ? ", '_tax_status', '_tax_class'" : '' ) . ( ( !empty( Smart_Manager::$sm_is_woo92 ) ) ? ", '_global_unique_id'" : '' ) ." ) AND post_id IN (".implode(",", $product_ids).") GROUP BY post_id, meta_key"; $results = $wpdb->get_results( $query, 'ARRAY_A' ); $sm_cache_update = array(); $sm_update_wc_lookup_table = array(); $temp = array(); // Preparing data foreach ( $results as $result ) { $meta_key = ( !empty( $result['meta_key'] ) ) ? $result['meta_key'] : ''; if( empty( $meta_key ) ) { continue; } $meta_value = ( !empty( $result['meta_value'] ) ) ? $result['meta_value'] : ''; $product_id = absint( $result['post_id'] ); if( empty( $sm_cache_update[$product_id] ) ) { $sm_cache_update[$product_id] = array(); } $price_meta = (array) ( $meta_key == '_price' ? $meta_value : false ); $sm_cache_update[$product_id]['product_id'] = ( empty( $sm_cache_update[$product_id]['product_id'] ) ) ? $product_id : $sm_cache_update[$product_id]['product_id']; $sm_cache_update[$product_id]['sku'] = ( empty( $sm_cache_update[$product_id]['sku'] ) ) ? ( ( $meta_key == '_sku' ) ? $meta_value : '' ) : $sm_cache_update[$product_id]['sku']; $sm_cache_update[$product_id]['virtual'] = ( empty( $sm_cache_update[$product_id]['virtual'] ) ) ? ( ( $meta_key == '_virtual' && 'yes' === $meta_value ) ? 1 : 0 ) : $sm_cache_update[$product_id]['virtual']; $sm_cache_update[$product_id]['downloadable'] = ( empty( $sm_cache_update[$product_id]['downloadable'] ) ) ? ( ( $meta_key == '_downloadable' && 'yes' === $meta_value ) ? 1 : 0 ) : $sm_cache_update[$product_id]['downloadable']; $sm_cache_update[$product_id]['min_price'] = ( empty( $sm_cache_update[$product_id]['min_price'] ) ) ? ( reset( $price_meta ) ) : $sm_cache_update[$product_id]['min_price']; $sm_cache_update[$product_id]['max_price'] = ( empty( $sm_cache_update[$product_id]['max_price'] ) ) ? ( end( $price_meta ) ) : $sm_cache_update[$product_id]['max_price']; $sm_cache_update[$product_id]['onsale'] = ( empty( $sm_cache_update[$product_id]['onsale'] ) ) ? ( wc_format_decimal( ( $meta_key == '_sale_price' && !empty( $meta_value ) ) ? 1 : 0 ) ) : $sm_cache_update[$product_id]['onsale']; $sm_cache_update[$product_id]['stock_quantity'] = ( empty( $sm_cache_update[$product_id]['stock_quantity'] ) ) ? ( wc_stock_amount( ( $meta_key == '_stock' ) ? $meta_value : null ) ) : $sm_cache_update[$product_id]['stock_quantity']; $sm_cache_update[$product_id]['stock_status'] = ( empty( $sm_cache_update[$product_id]['stock_status'] ) ) ? ( ( $meta_key == '_stock_status' ) ? $meta_value : '' ) : $sm_cache_update[$product_id]['stock_status']; $sm_cache_update[$product_id]['rating_count'] = ( empty( $sm_cache_update[$product_id]['rating_count'] ) ) ? ( ( $meta_key == '_wc_rating_count' && is_array( maybe_unserialize( $meta_value ) ) ) ? array_sum( maybe_unserialize( $meta_value ) ) : 0 ) : $sm_cache_update[$product_id]['rating_count']; $sm_cache_update[$product_id]['average_rating'] = ( empty( $sm_cache_update[$product_id]['average_rating'] ) ) ? ( ( $meta_key == '_wc_average_rating' ) ? $meta_value : 0 ) : $sm_cache_update[$product_id]['average_rating']; $sm_cache_update[$product_id]['total_sales'] = ( empty( $sm_cache_update[$product_id]['total_sales'] ) ) ? ( ( $meta_key == 'total_sales' ) ? $meta_value : 0 ) : $sm_cache_update[$product_id]['total_sales']; $sm_cache_update[$product_id]['tax_status'] = ( empty( $sm_cache_update[$product_id]['tax_status'] ) ) ? ( ( $meta_key == '_tax_status' ) ? $meta_value : '' ) : $sm_cache_update[$product_id]['tax_status']; $sm_cache_update[$product_id]['tax_class'] = ( empty( $sm_cache_update[$product_id]['tax_class'] ) ) ? ( ( $meta_key == '_tax_class' ) ? $meta_value : '' ) : $sm_cache_update[$product_id]['tax_class']; if ( ! empty( Smart_Manager::$sm_is_woo92 ) ) { $sm_cache_update[ $product_id ][ 'global_unique_id' ] = ( empty( $sm_cache_update[ $product_id ][ 'global_unique_id' ] ) ) ? ( ( '_global_unique_id' === $meta_key ) ? $meta_value : '' ) : $sm_cache_update[ $product_id ][ 'global_unique_id' ]; } $temp = $sm_cache_update; $temp[$product_id]['sku'] = (string) $temp[$product_id]['sku']; $temp[$product_id]['stock_status'] = (string) $temp[$product_id]['stock_status']; $sm_update_wc_lookup_table[$product_id] = "('".implode( "','", $temp[$product_id] )."')"; } // Updating lookup table if ( ! empty( $sm_update_wc_lookup_table ) ) { $query = "REPLACE INTO {$wpdb->prefix}wc_product_meta_lookup VALUES "; $query .= implode( ",", $sm_update_wc_lookup_table ); $wpdb->query( $query ); } // wp_cache_set for lookup table if ( ! empty( $sm_cache_update ) ) { foreach ( $sm_cache_update as $update_data ) { wp_cache_set( 'lookup_table', $update_data, 'object_' . $update_data['product_id'] ); } } } //Function to update product attribute lookup table function sm_update_product_attribute_lookup_table( $product_ids = array() ) { if ( empty( $product_ids ) ) { return; } $insert_query_values = array(); foreach ( $product_ids as $product_id ) { $product = wc_get_product( $product_id ); if( empty( $product ) || ( ! empty( $product ) && ! $product instanceof WC_Product ) ) { continue; } $product_attributes = ( is_callable( array( $product, 'get_attributes' ) ) ) ? $product->get_attributes() : array(); if( empty( $product_attributes ) ) { continue; } $has_stock = ( ( is_callable( array( $product, 'get_stock_quantity' ) ) && ! empty( $product->get_stock_quantity() ) ) || ( is_callable( array( $product, 'is_in_stock' ) ) && ! empty( $product->is_in_stock() ) ) ) ? 1 : 0; foreach ( $product_attributes as $taxonomy_name => $attribute_data ) { if( empty( $attribute_data ) || ( ! empty( $attribute_data ) && is_callable( array( $attribute_data, 'get_id' ) ) && empty( $attribute_data->get_id() ) ) || empty( $taxonomy_name ) ) { continue; } $term_ids = ( is_callable( array( $attribute_data, 'get_options' ) ) ) ? $attribute_data->get_options() : array(); if( empty( $term_ids ) ){ continue; } $is_variation_attribute = ( is_callable( array( $attribute_data, 'get_variation' ) ) && ! empty( $attribute_data->get_variation() ) ) ? 1 : 0; foreach( $term_ids as $term_id ){ if( empty( $term_id ) ){ continue; } if( empty( $is_variation_attribute ) ) { $insert_query_values[] = " ( ". $product_id .", ". $product_id .", '".$taxonomy_name."', ".$term_id.", ".$is_variation_attribute.", ".$has_stock." ) "; } else { $variation_ids = ( is_callable( array( $product, 'get_children' ) ) ) ? $product->get_children() : array(); if( empty( $variation_ids ) ){ continue; } foreach( $variation_ids as $variation_id ){ $insert_query_values[] = " ( ". $variation_id .", ". $product_id .", '".$taxonomy_name."', ".$term_id.", ".$is_variation_attribute.", ".$has_stock." ) "; } } } } } $delete_attribute_data = sa_sm_delete_attribute_lookup_data( $product_ids ); if( ! empty( $insert_query_values ) ){ sa_sm_update_attribute_lookup_data( $insert_query_values ); } } //Function to delete the attribute lookup table data function sa_sm_delete_attribute_lookup_data( $product_ids = array() ) { if( empty( $product_ids ) ){ return; } global $wpdb; $wpdb->query( "DELETE FROM {$wpdb->prefix}wc_product_attributes_lookup WHERE product_id IN (".implode(',', $product_ids).") OR product_or_parent_id IN (".implode( ',', $product_ids ).")" ); } //Function for updating attribute lookup table function sa_sm_update_attribute_lookup_data( $insert_query_values = array() ) { if( empty( $insert_query_values ) ){ return; } global $wpdb; $wpdb->query( "INSERT INTO {$wpdb->prefix}wc_product_attributes_lookup( product_id, product_or_parent_id, taxonomy, term_id, is_variation_attribute, in_stock) VALUES". implode( ", ", $insert_query_values ) ."" ); } //Function to generate the column state using store model function sa_sm_generate_column_state( $store_model = array() ) { $column_model_transient = array( 'columns' => array(), 'sort_params' => array() ); if( !empty( $store_model['columns'] ) ) { foreach( $store_model['columns'] as $key => $col ) { if( empty( $col['hidden'] ) && ! empty( $col['save_state'] ) && ! empty( $col['data'] ) ) { $column_model_transient['columns'][ $col['data'] ] = array( 'width' => ( !empty( $col['width'] ) ? $col['width'] : '' ), 'position' => ( !empty( $col['position'] ) ? $col['position'] : '' ) ); } } } $column_model_transient['sort_params'] = ( !empty( $store_model['sort_params'] ) ) ? $store_model['sort_params'] : array(); if ( ! empty( $store_model['search_params'] ) ) { $column_model_transient['search_params'] = $store_model['search_params']; } if( isset( $store_model['treegrid'] ) ) { $column_model_transient['treegrid'] = $store_model['treegrid']; } $column_model_transient = apply_filters( 'sm_generate_column_state', $column_model_transient, $store_model ); return $column_model_transient; } //Function to update recent dashboards function sa_sm_update_recent_dashboards( $meta_key = 'post_types', $slug = '' ) { if( empty( $meta_key ) || empty( $slug ) ) { return; } $recent_dashboards = get_user_meta( get_current_user_id(), 'sa_sm_recent_'.$meta_key, true ); if( ! empty( $recent_dashboards ) ){ $index = array_search( $slug, $recent_dashboards ); if( false !== $index ) { array_splice( $recent_dashboards, $index, 1 ); } array_unshift( $recent_dashboards, $slug ); $recent_dashboards = array_slice( $recent_dashboards, 0, 3 ); } else { $recent_dashboards = array( $slug ); } if( is_array( $recent_dashboards ) ) { update_user_meta( get_current_user_id(), 'sa_sm_recent_'.$meta_key, $recent_dashboards ); } } /** * Custom function to update post - Compat for WooCommerce Product Stock Alert plugins * * @param int $id post id for which is to be updated. * @return result of function call */ function sm_update_post( $id = 0 ) { $id = intval( $id ); if( empty( $id ) ) { return; } $parent_id = wp_get_post_parent_id( $id ); return ( empty( $parent_id ) ) ? wp_update_post( array( 'ID' => $id ) ) : wp_update_post( array( 'ID' => $parent_id ) ); } /** * Function to edit previous value format for particular column for storing it in task details table * * @param array $args array has update_column, data_type & prev_val. * @return returns the formatted previous value */ function sa_sm_format_prev_val( $args = array() ) { if ( empty( $args ) || empty( $args['update_column'] ) || empty( $args['col_data_type'] ) ) { return $args['prev_val']; } switch ( $args['col_data_type'] ) { case ( ( ( ! empty( $args['col_data_type']['data_cols_serialized'] ) ) && ( in_array( $args['update_column'], $args['col_data_type']['data_cols_serialized'], true ) ) ) ): case ( ! empty( $args['col_data_type'] ) && ( 'sm.serialized' === $args['col_data_type'] ) ): return maybe_serialize( $args['prev_val'] ); case ( ( ! empty( $args['col_data_type']['data_cols_multiselect'] ) ) && ( in_array( $args['update_column'], $args['col_data_type']['data_cols_multiselect'], true ) ) && ( is_array( $args['prev_val'] ) ) ): case ( ( ! empty( $args['col_data_type']['data_cols_list'] ) ) && ( in_array( $args['update_column'], $args['col_data_type']['data_cols_list'], true ) ) && ( is_array( $args['prev_val'] ) ) ): case ( ( 'sm.multilist' === $args['col_data_type'] || 'dropdown' === $args['col_data_type'] ) ): return ( is_array( $args['prev_val'] ) ) ? implode( ',', $args['prev_val'] ) : $args['prev_val']; case ( ( ! empty( $args['col_data_type']['data_cols_checkbox'] ) && ( ! empty( $args['updated_val'] ) ) && in_array( $args['update_column'], $args['col_data_type']['data_cols_checkbox'], true ) ) || ( 'checkbox' === $args['col_data_type'] ) ): if ( in_array( $args['updated_val'], array( 'yes', 'no' ) ) ) { return ( 'yes' === $args['updated_val'] ) ? 'no' : 'yes'; } else if ( in_array( $args['updated_val'], array( 'true', 'false' ) ) ) { return ( 'true' === $args['updated_val'] ) ? 'false' : 'true'; } default: return $args['prev_val']; } } /** * Function to get site timestamp from date passed in UTC timezone * * @param array $date Date string in UTC timezone. * @return int $timestamp Timestamp in site timezone */ function sa_sm_get_site_timestamp_from_utc_date( $date = '' ) { if( empty( $date ) ){ return $date; } $offset = get_option( 'gmt_offset' ) * HOUR_IN_SECONDS; $date = ( ! is_numeric( $date ) ) ? strtotime( $date ) : $date; return $date + $offset; } /** * Function to get UTC timestamp from date passed in site timezone * * @param array $date Date string in site timezone. * @return int $timestamp Timestamp in UTC */ function sa_sm_get_utc_timestamp_from_site_date( $date = '' ) { if( empty( $date ) ){ return $date; } $offset = get_option( 'gmt_offset' ) * HOUR_IN_SECONDS; $date = ( ! is_numeric( $date ) ) ? strtotime( $date ) : $date; return $date - $offset; } /** * Format term ids to names. * * @param array $term_ids Term IDs to format. * @param string $taxonomy Taxonomy name. * @return string */ function sa_sm_format_term_ids( $term_ids = array(), $taxonomy = '' ) { $term_ids = wp_parse_id_list( $term_ids ); if ( ! count( $term_ids ) ) { return ''; } $formatted_terms = array(); if ( is_taxonomy_hierarchical( $taxonomy ) ) { foreach ( $term_ids as $term_id ) { $formatted_term = array(); $ancestor_ids = array_reverse( get_ancestors( $term_id, $taxonomy ) ); foreach ( $ancestor_ids as $ancestor_id ) { $term = get_term( $ancestor_id, $taxonomy ); if ( $term && ! is_wp_error( $term ) ) { $formatted_term[] = $term->name; } } $term = get_term( $term_id, $taxonomy ); if ( $term && ! is_wp_error( $term ) ) { $formatted_term[] = $term->name; } $formatted_terms[] = implode( ' > ', $formatted_term ); } } else { foreach ( $term_ids as $term_id ) { $term = get_term( $term_id, $taxonomy ); if ( $term && ! is_wp_error( $term ) ) { $formatted_terms[] = $term->name; } } } return implode( ',', $formatted_terms ); } classes/class-smart-manager-install.php000064400000037354147600337620014243 0ustar00 array( 'create_table_for_custom_views', 'create_dummy_views', 'update_500_model_transients' ), '5.0.1' => array( 'update_500_model_transients' ), '5.16.0' => array( 'update_516_alter_table' ), '8.0.0' => array( 'create_tables_for_tasks' ), '8.9.0' => array( 'update_890_port_settings' ), '8.18.0' => array( 'update_8180_create_tasks_tables_for_lite_version' ), '8.31.0' => array( 'update_8310_port_access_privilege_settings' ) ); /** * Hook in tabs. */ public static function init() { if( !defined('DOING_AJAX') || true !== DOING_AJAX ){ add_action( 'init', array( __CLASS__, 'maybe_update_db_version' ) ); } } /** * Install SM. */ public static function install() { if ( ! is_blog_installed() ) { return; } // Check if we are not already running this routine. if ( 'yes' === get_transient( 'sa_sm_installing' ) ) { return; } // If we made it till here nothing is running yet, lets set the transient now. set_transient( 'sa_sm_installing', 'yes', MINUTE_IN_SECONDS * 10 ); self::create_tables(); self::maybe_update_db_version(); delete_transient( 'sa_sm_installing' ); // Redirect to welcome screen if ( ! is_network_admin() && ! isset( $_GET['activate-multi'] ) ) { set_transient( '_sm_activation_redirect', 1, 30 ); } } /** * Actions on deactivate plugin. */ public static function deactivate() { global $wpdb; $table_name = $wpdb->prefix.'sm_advanced_search_temp'; if ( $table_name === $wpdb->get_var( "SHOW TABLES LIKE '$table_name'" ) ) { $wpdb->query( "DROP TABLE IF EXISTS $table_name" ); } $wpdb->query( "DELETE FROM {$wpdb->prefix}options WHERE option_name LIKE '_transient_sa_sm_%' OR option_name LIKE '_transient_timeout_sa_sm_%'"); //for deleting post type transients } /** * Get list of DB update callbacks. * * @return array */ public static function get_db_update_callbacks() { return self::$db_updates; } /** * Is a DB update needed? * * @return boolean */ public static function needs_db_update() { $current_db_version = get_option( 'sa_sm_db_version', null ); $updates = self::get_db_update_callbacks(); $update_versions = array_keys( $updates ); usort( $update_versions, 'version_compare' ); return ( ( ! is_null( $current_db_version ) && version_compare( $current_db_version, end( $update_versions ), '<' ) ) || is_null( $current_db_version ) ); } /** * See if we need to show or run database updates during install. * */ static function maybe_update_db_version() { if ( self::needs_db_update() ) { self::update(); } } /** * Update DB version to current. * * @param string|null $version New Smart Manager DB version or null. */ public static function update_db_version( $version = null ) { if( ! empty( $version ) ) { update_option( 'sa_sm_db_version', $version, 'no' ); } } /** * Process all DB updates. */ private static function update() { // Check if we are not already running this routine. if ( 'yes' === get_transient( 'sa_sm_updating' ) ) { return; } // If we made it till here nothing is running yet, lets set the transient now. set_transient( 'sa_sm_updating', 'yes', MINUTE_IN_SECONDS * 10 ); $current_db_version = get_option( 'sa_sm_db_version' ); foreach ( self::get_db_update_callbacks() as $version => $update_callbacks ) { if ( version_compare( $current_db_version, $version, '<' ) ) { foreach ( $update_callbacks as $update_callback ) { if ( is_callable( array( __CLASS__, $update_callback ) ) ) { call_user_func( array( __CLASS__, $update_callback ) ); } } self::update_db_version($version); } } delete_transient( 'sa_sm_updating' ); } public static function update_500_model_transients(){ global $wpdb; $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->prefix}options SET option_name = REPLACE(option_name, %s, %s) WHERE option_name LIKE %s", '_transient_sm_beta_', '_transient_sa_sm_', $wpdb->esc_like('_transient_sm_beta_') . '%' ) ); $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->prefix}options SET option_name = REPLACE(option_name, %s, %s) WHERE option_name LIKE %s", '_transient_timeout_sm_beta_', '_transient_timeout_sa_sm_', $wpdb->esc_like('_transient_timeout_sm_beta_') . '%' ) ); } public static function create_dummy_views() { global $wpdb; if( !( defined('SMPRO') && true === SMPRO ) ) { return; } $email = get_option( 'admin_email' ); if ( ! empty( $email ) ) { $user = get_user_by( 'email', $email ); if ( ! empty( $user ) ) { $userId = $user->ID; $data = array( array( 'title' => 'Product Stock', 'slug' => 'product-stock', 'params' => '{"columns":{"posts_id":{"width":100,"position":1},"postmeta_meta_key__thumbnail_id_meta_value__thumbnail_id":{"width":211.787109375,"position":2},"posts_post_title":{"width":200,"position":3},"postmeta_meta_key__sku_meta_value__sku":{"width":100,"position":4},"postmeta_meta_key__manage_stock_meta_value__manage_stock":{"width":191.77734375,"position":5},"postmeta_meta_key__stock_status_meta_value__stock_status":{"width":168.4130859375,"position":6},"postmeta_meta_key__stock_meta_value__stock":{"width":100,"position":7},"postmeta_meta_key__backorders_meta_value__backorders":{"width":151.728515625,"position":8}},"sort_params":{"orderby":"ID","order":"DESC","default":true},"treegrid":"true","search_params":{"isAdvanceSearch":"false","params":""}}' ), array( 'title' => 'Product Price List', 'slug' => 'product-price-list', 'params' => '{"columns":{"posts_id":{"width":100,"position":1},"postmeta_meta_key__thumbnail_id_meta_value__thumbnail_id":{"width":211.787109375,"position":2},"posts_post_title":{"width":200,"position":3},"postmeta_meta_key__sku_meta_value__sku":{"width":100,"position":4},"postmeta_meta_key__regular_price_meta_value__regular_price":{"width":181.7431640625,"position":5},"postmeta_meta_key__sale_price_meta_value__sale_price":{"width":136.728515625,"position":6},"postmeta_meta_key__sale_price_dates_from_meta_value__sale_price_dates_from":{"width":250,"position":7},"postmeta_meta_key__sale_price_dates_to_meta_value__sale_price_dates_to":{"width":250,"position":8}},"sort_params":{"orderby":"ID","order":"DESC","default":true},"treegrid":"true","search_params":{"isAdvanceSearch":"false","params":""}}' ) ); foreach( $data as $view ){ $wpdb->query( $wpdb->prepare( "INSERT INTO {$wpdb->prefix}sm_views(author, title, slug, params, is_public, post_type, created_date, modified_date) VALUES(%d, %s, %s, %s, %d, %s, %d, %d)", $userId, $view['title'], $view['slug'], $view['params'], 1, 'product', time(), time() ) ); } } } } public static function create_table_for_custom_views() { global $wpdb; if( !( defined('SMPRO') && true === SMPRO ) ) { return array(); } $collate = ''; if ( $wpdb->has_cap( 'collation' ) ) { $collate = $wpdb->get_charset_collate(); } $tables = "CREATE TABLE IF NOT EXISTS `{$wpdb->prefix}sm_views` ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, `author` bigint UNSIGNED NOT NULL, `title` varchar(255) NOT NULL, `slug` varchar(255) NOT NULL, `params` longtext NOT NULL, `is_public` bit(1) NOT NULL DEFAULT b'0', `post_type` varchar(20) NOT NULL, `created_date` int UNSIGNED NOT NULL, `modified_date` int UNSIGNED NOT NULL, PRIMARY KEY (`id`) ) $collate;"; require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); return dbDelta( $tables ); } public static function create_tables(){ global $wpdb; $collate = ''; if ( $wpdb->has_cap( 'collation' ) ) { $collate = $wpdb->get_charset_collate(); } $tables = "CREATE TABLE IF NOT EXISTS `{$wpdb->prefix}sm_advanced_search_temp` ( `product_id` bigint(20) unsigned NOT NULL UNIQUE default '0', `flag` bigint(20) unsigned NOT NULL default '0', `cat_flag` bigint(20) unsigned NOT NULL default '0', PRIMARY KEY (`product_id`) ) $collate;"; require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); dbDelta( $tables ); // Added code in v5.5.0 as in some cases the sm_views table was not created if ( is_callable( array( __CLASS__, 'create_table_for_custom_views' ) ) ) { call_user_func( array( __CLASS__, 'create_table_for_custom_views' ) ); } if ( is_callable( array( __CLASS__, 'create_tables_for_tasks' ) ) ) { call_user_func( array( __CLASS__, 'create_tables_for_tasks' ) ); } } public static function update_516_alter_table(){ global $wpdb; $table_name = $wpdb->prefix.'sm_advanced_search_temp'; if( $wpdb->get_var( "SHOW TABLES LIKE '$table_name'" ) ) { if ( ! $wpdb->get_var( "SHOW KEYS FROM $table_name WHERE Key_name = 'PRIMARY' AND Column_name = 'product_id'" ) ) { $wpdb->query( "ALTER TABLE $table_name ADD PRIMARY KEY(`product_id`), ADD UNIQUE KEY(`product_id`)" ); } } } public static function create_tables_for_tasks() { global $wpdb; $collate = ''; if ( $wpdb->has_cap( 'collation' ) ) { $collate = $wpdb->get_charset_collate(); } require_once( ABSPATH . 'wp-admin/includes/upgrade.php' ); $task_table = "CREATE TABLE IF NOT EXISTS `{$wpdb->prefix}sm_tasks` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id of the task', `title` text NOT NULL COMMENT 'field title', `date` datetime NOT NULL COMMENT 'task creation date', `completed_date` datetime NULL COMMENT 'task completion date', `post_type` text NOT NULL COMMENT 'field post type', `author` int NOT NULL DEFAULT '0' COMMENT 'id of the user who created the task', `type` enum('inline','bulk_edit') NOT NULL COMMENT 'edit functionality type', `status` enum('in-progress','completed','scheduled') NOT NULL COMMENT 'field updated status', `actions` longtext NOT NULL COMMENT 'serialized string of all actions executed in this task', `record_count` bigint NOT NULL COMMENT 'count of records updated in this task', PRIMARY KEY (`id`) ) $collate;"; dbDelta( $task_table ); $task_details_table = "CREATE TABLE IF NOT EXISTS `{$wpdb->prefix}sm_task_details` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'task detail id', `task_id` bigint NOT NULL COMMENT 'Foreign key (id) from sm_tasks table', `record_id` bigint NOT NULL COMMENT 'id of the record being updated', `status` enum('in-progress','completed','scheduled') NOT NULL COMMENT 'field updated status', `field` text NOT NULL COMMENT 'name of the field/column being updated', `action` varchar(255) NOT NULL COMMENT 'action executed on the field', `prev_val` longtext NOT NULL COMMENT 'field value before updates', `updated_val` longtext NOT NULL COMMENT 'field value after updates', PRIMARY KEY (`id`) ) $collate;"; dbDelta( $task_details_table ); } // Function to port settings public static function update_890_port_settings(){ if ( ! class_exists( 'Smart_Manager_Settings' ) ) { return; } if( empty( Smart_Manager_Settings::$db_option_key ) ){ return; } $settings = array( 'general' => array( 'toggle' => array( 'wp_force_collapse_admin_menu' => get_option( 'sm_wp_force_collapse_admin_menu', 'yes' ), 'use_number_field_for_numeric_cols' => get_option( 'sm_use_number_field_for_numeric_cols', 'yes' ), 'view_trash_records' => get_option( 'sm_view_trash_records', 'no' ), 'show_manage_with_smart_manager_button' => get_option( 'sm_show_manage_with_sm_button', 'yes' ), 'show_smart_manager_menu_in_admin_bar' => get_option( 'sm_show_smart_manager_menu_in_admin_bar', 'yes' ) ), 'numeric' => array( 'per_page_record_limit' => get_option( '_sm_beta_set_record_limit', 50 ) ), 'text' => array( 'grid_row_height' => get_option( 'sm_grid_row_height', '50px' ) ) ) ); if( defined('SMPRO') && true === SMPRO ) { $settings['general']['toggle']['show_tasks_title_modal'] = get_option( 'sm_show_tasks_title_modal', 'yes' ); $attachment_url = get_option( 'smart_manager_company_logo', '' ); $attachment_id = ( ! empty( $attachment_url ) ) ? attachment_url_to_postid( $attachment_url ) : 0; $settings['general']['image'] = array( 'company_logo_for_print_invoice' => $attachment_id ); } update_option( Smart_Manager_Settings::$db_option_key, $settings, 'no' ); } public static function update_8180_create_tasks_tables_for_lite_version() { self::create_tables_for_tasks(); } /** * Function to port access privilege settings * */ public static function update_8310_port_access_privilege_settings() { global $wpdb; $results = $wpdb->get_results( $wpdb->prepare( "SELECT LEFT(SUBSTR(option_name, %d), LOCATE(%s, SUBSTR(option_name, %d)) -1) as user_role, option_value as dashboards FROM {$wpdb->prefix}options WHERE option_name LIKE %s AND option_name LIKE %s", strlen( 'sm_beta_' ) + 1, '_accessible_dashboards', strlen( 'sm_beta_' ) + 1, $wpdb->esc_like( 'sm_beta_' ) . '%', '%' . $wpdb->esc_like( '_accessible_dashboards' ) ), 'ARRAY_A' ); if ( empty( $results ) || ! is_array( $results ) ) { return; } $post_type_dashboards = ( class_exists( 'Smart_Manager' ) && is_callable( array('Smart_Manager', 'get_dashboards') ) ) ? Smart_Manager::get_dashboards() : array(); $taxonomy_dashboards = ( class_exists( 'Smart_Manager' ) && is_callable( array('Smart_Manager', 'get_taxonomies') ) ) ? Smart_Manager::get_taxonomies() : array(); foreach ( $results as $result ) { $get_user_role_accessible_dashboards = array( 'valid' => array( 'post_types' => array(), 'taxonomies' => array(), 'sm_views' => array(), ), 'not_valid' => array( 'post_types' => array(), 'taxonomies' => array(), 'sm_views' => array(), ) ); $role = ( ! empty( $result['user_role'] ) ) ? $result['user_role'] : ''; if ( empty( $role ) ) { continue; } $dashboards = ( ! empty( $result['dashboards'] ) ) ? $result['dashboards'] : ''; if ( empty( $dashboards ) ) { continue; } $dashboards = explode( ",", $dashboards ); if ( empty( $dashboards ) ||! is_array( $dashboards ) ) { continue; } foreach ( $dashboards as $dashboard ) { switch ( $dashboard ) { case ( ! empty( $post_type_dashboards ) && is_array( $post_type_dashboards ) && array_key_exists( $dashboard, $post_type_dashboards ) ): $get_user_role_accessible_dashboards['valid']['post_types'][] = $dashboard; break; case ( ! empty( $taxonomy_dashboards ) && is_array( $taxonomy_dashboards ) && array_key_exists( $dashboard, $taxonomy_dashboards ) ): $get_user_role_accessible_dashboards['valid']['taxonomies'][] = $dashboard; break; default: $get_user_role_accessible_dashboards['valid']['sm_views'][] = $dashboard; break; } } if ( empty( $get_user_role_accessible_dashboards ) ) { continue; } $wpdb->query( "INSERT INTO {$wpdb->prefix}options ( option_name, option_value, autoload ) VALUES ( 'sa_sm_" . $role . "_dashboards', '" . maybe_serialize( $get_user_role_accessible_dashboards ) ."', 'no' )" ); delete_option( "sm_beta_" . $role . "_accessible_dashboards" ); } } } Smart_Manager_Install::init(); classes/class-storeapps-marketplace.php000064400000015211147600337620014333 0ustar00

            Best WooCommerce Plugins

            Get reliable WooCommerce extensions to sell more, manage your store, retain more customers and make better decisions.

            More than 250,000 people use our plugins. StoreApps’ WooCommerce solutions are easy to setup and deliver quick results.

            Smart Offers

            Grow your sales on autopilot. Create powerful WooCommerce upsells, downsells, cross-sells, BOGO, order bumps, one-time offers, backend offers, sales funnels and more. Measure offers, optimize and target them on your website to increase conversions & maximize profits.

            Learn more

            Offermative

            A plugin for dynamic discount pricing, related product recommendations, upsells and funnels for WooCommerce.

            Learn more

            Bulk Variations Manager

            Quickly create any combination of product variations from attributes and bulk update prices using differential pricing.

            Learn more

            View all 20+ plugins

            sm_redirect_url = admin_url( 'admin.php?page=smart-manager' ); self::$text_domain = (defined('SM_TEXT_DOMAIN')) ? SM_TEXT_DOMAIN : 'smart-manager-for-wp-e-commerce'; self::$prefix = (defined('SM_PREFIX')) ? SM_PREFIX : 'sa_smart_manager'; self::$sku = (defined('SM_SKU')) ? SM_SKU : 'sm'; self::$plugin_file = (defined('SM_PLUGIN_FILE')) ? SM_PLUGIN_FILE : ''; add_action( 'admin_head', array( $this, 'admin_head' ) ); add_action( 'admin_init', array( $this, 'smart_manager_welcome' ), 11 ); add_action( 'admin_footer', array( $this, 'smart_manager_support_ticket_content' ) ); $this->plugin_url = plugins_url( '', __FILE__ ); } /** * Handle welcome page */ public function show_welcome_page() { if( empty($_GET['landing-page']) ) { return; } switch ( $_GET['landing-page'] ) { case 'sm-about' : $this->about_screen(); break; case 'sm-faqs' : $this->faqs_screen(); break; } ?> get_latest_upgrade_class(); if ( ! method_exists( $latest_upgrade_class, 'support_ticket_content' ) ) return; $plugin_data = get_plugin_data( self::$plugin_file ); $license_key = get_site_option( self::$prefix.'_license_key' ); $latest_upgrade_class::support_ticket_content( self::$prefix, self::$sku, $plugin_data, $license_key, 'smart-manager-for-wp-e-commerce' ); } /** * Intro text/links shown on all about pages. */ private function intro() { $version = ''; if( is_callable( array( 'Smart_Manager', 'get_version' ) ) ) { $version = Smart_Manager::get_version(); } ?>


            intro();?>

            boost your productivity by 10x in managing your WooCommerce store by using a familiar, single page, spreadsheet like interface. ', 'smart-manager-for-wp-e-commerce' ); ?>

            ' . __( 'any custom post type in WordPress', 'smart-manager-for-wp-e-commerce' ) . '' ); ?>

            ' . __( 'see how', 'smart-manager-for-wp-e-commerce' ) . '', '' . __( 'Advanced Search', 'smart-manager-for-wp-e-commerce' ) . '' ); ?>

            ' . __( 'see how', 'smart-manager-for-wp-e-commerce' ) . '' ); ?>

            ' . __( 'See how', 'smart-manager-for-wp-e-commerce' ) . '' ); ?>

            ' . __( 'Biggest Time Saver', 'smart-manager-for-wp-e-commerce' ) . '' , '' . __( 'Pro', 'smart-manager-for-wp-e-commerce' ) . '' ); } ?>

            ' . __( 'See how', 'smart-manager-for-wp-e-commerce' ) . '' ); ?>

            ' . __( 'Pro', 'smart-manager-for-wp-e-commerce' ) . '' ); } ?>

            ' . __( 'using Simple Search†or Advanced Search', 'smart-manager-for-wp-e-commerce' ) . '' ); ?>

            intro(); ?>

            __( 'Smart Manager is empty?', 'smart-manager-for-wp-e-commerce' ), 'ans' => sprintf( /* translators: %s: Changelog doc link */ __( 'Make sure you are using %s of Smart Manager. If still the issue persist, temporarily de-activate all plugins except WooCommerce/WPeCommerce & Smart Manager. Re-check the issue, if the issue still persists, contact us. If the issue goes away, re-activate other plugins one-by-one & re-checking the fields, to find out which plugin is conflicting.', 'smart-manager-for-wp-e-commerce' ), '' . __( 'latest version', 'smart-manager-for-wp-e-commerce' ) . '' ) ), array( 'que' => __( 'Smart Manager search functionality not working', 'smart-manager-for-wp-e-commerce' ), 'ans' => __( 'Request you to kindly de-activate and activate the Smart Manager plugin once and then have a recheck with the search functionality.', 'smart-manager-for-wp-e-commerce' ) ), array( 'que' => __( 'Updating variation parent price/sales price not working?', 'smart-manager-for-wp-e-commerce' ), 'ans' => __( 'Smart Manager is based on WooCommerce and WPeCommerce and the same e-commerce plugins sets the price/sales price of the variation parents automatically based on the price/sales price of its variations.', 'smart-manager-for-wp-e-commerce' ) ), array( 'que' => __( 'How to manage any custom field of any custom plugin using Smart Manager?', 'smart-manager-for-wp-e-commerce' ), 'ans' => __( 'Smart Manager will allow you to manage custom field of any other plugin.', 'smart-manager-for-wp-e-commerce' ) ), array( 'que' => __( 'How to add columns to Smart Manager dashboard?', 'smart-manager-for-wp-e-commerce' ), 'ans' => sprintf( /* translators: %s: Show and Hide doc link */ __( 'To show / hide columns in the Smart Manager, %s.', 'smart-manager-for-wp-e-commerce' ), '' . __( 'click here', 'smart-manager-for-wp-e-commerce' ) . '') ), array( 'que' => __( 'Can I import using Smart Manager?', 'smart-manager-for-wp-e-commerce' ), 'ans' => __( 'You cannot import using Smart Manager. Use import functionality of WooCommerce.', 'smart-manager-for-wp-e-commerce' ) ), ); if ( SMPRO === true ) { $faqs[] = array( 'que' => __( 'I can\'t find a way to do X...', 'smart-manager-for-wp-e-commerce' ), 'ans' => sprintf( /* translators: %s: contact us link */ __( 'Smart Manager is actively developed. If you can\'t find your favorite feature (or have a suggestion) %s. We\'d love to hear from you.', 'smart-manager-for-wp-e-commerce' ), '' . __( 'contact us', 'smart-manager-for-wp-e-commerce' ) . '' ) ); } else { $faqs[] = array( 'que' => __( 'How do I upgrade a Lite version to a Pro version?', 'smart-manager-for-wp-e-commerce' ), 'ans' => sprintf( /* translators: %s: Lite version to a Pro version doc link */ __( 'Follow steps listed here: %s', 'smart-manager-for-wp-e-commerce' ), '' . __( 'latest version', 'smart-manager-for-wp-e-commerce' ) . '' ) ); } $faqs = array_chunk( $faqs, 2 ); foreach ( $faqs as $fqs ) { echo '
            '; foreach ( $fqs as $index => $faq ) { echo ''; echo '

            ' . $faq['que'] . '

            '; echo '

            ' . $faq['ans'] . '

            '; echo '
            '; } echo '
            '; } ?> plugin_path = untrailingslashit( plugin_dir_path( __FILE__ ) ); add_action('admin_init',array(&$this,'call_custom_actions'),11); add_action('admin_footer',array(&$this,'sm_footer')); //Filter for setting the wp_editor default tab add_filter( 'wp_default_editor', array(&$this,'sm_wp_default_editor'),10, 1 ); // Code for resetting the 'Shop_Order' and 'Shop_Subscription' col models on WC setting update add_action( 'woocommerce_update_options_advanced_custom_data_stores', array( &$this, 'migrate_wc_orders_subscriptions_col_model' ) ); add_action( 'woocommerce_update_options_advanced_features', array( &$this, 'migrate_wc_orders_subscriptions_col_model' ) ); } public function sm_wp_default_editor( $tab ) { if ( !empty($_GET['page']) && 'smart-manager' === $_GET['page'] ) { $tab = "html"; } return $tab; } public function sm_footer() { if( !empty($_GET['page']) && 'smart-manager' === $_GET['page'] && !( !empty( $_GET['sm_old'] ) && ( 'woo' === $_GET['sm_old'] || 'wpsc' === $_GET['sm_old'] ) ) ) { echo ''; } } //Function to call custom actions on admin_init public function call_custom_actions() { do_action('sm_admin_init'); add_action( 'edited_term',array( &$this,'terms_added' ), 10, 3 ); add_action( 'created_term',array( &$this,'terms_added' ), 10, 3 ); add_action( 'delete_term',array( &$this,'terms_deleted' ), 10, 5 ); add_action( 'woocommerce_attribute_added',array( &$this,'woocommerce_attributes_updated' ) ); add_action( 'woocommerce_attribute_updated',array( &$this,'woocommerce_attributes_updated' ) ); add_action( 'woocommerce_attribute_deleted',array( &$this,'woocommerce_attributes_updated' ) ); add_action( 'added_post_meta', array( &$this, 'added_post_meta' ), 10, 4 ); //for background updater if( defined('SMPRO') && SMPRO === true && file_exists(SM_PRO_URL . 'classes/class-smart-manager-pro-background-updater.php') ) { include_once SM_PRO_URL . 'classes/class-smart-manager-pro-background-updater.php'; $this->sm_beta_pro_background_updater = Smart_Manager_Pro_Background_Updater::instance(); } // Code for scheduling action for deleting older tasks after x no. of days if ( defined('SMPRO') && SMPRO === true && function_exists( 'as_has_scheduled_action' ) && ! as_has_scheduled_action( 'sm_schedule_tasks_cleanup' ) && file_exists( SM_PRO_URL . 'classes/class-smart-manager-pro-task.php' ) ) { include_once $this->plugin_path . '/class-smart-manager-base.php'; include_once SM_PRO_URL . 'classes/class-smart-manager-pro-base.php'; include_once SM_PRO_URL . 'classes/class-smart-manager-pro-task.php'; ( is_callable( array( 'Smart_Manager_Pro_Task', 'schedule_task_deletion' ) ) ) ? Smart_Manager_Pro_Task::schedule_task_deletion() : ''; } } public function woocommerce_attributes_updated() { $this->delete_transients( array( 'product' ) ); } public function terms_added( $term, $tt_id, $taxonomy ) { global $wp_taxonomies; $post_types = ( !empty( $wp_taxonomies[$taxonomy] ) ) ? $wp_taxonomies[$taxonomy]->object_type : array(); $this->delete_transients( $post_types ); } public function terms_deleted( $term, $tt_id, $taxonomy, $deleted_term, $object_ids ) { global $wp_taxonomies; $post_types = ( !empty( $wp_taxonomies[$taxonomy] ) ) ? $wp_taxonomies[$taxonomy]->object_type : array(); $this->delete_transients( $post_types ); } public function added_post_meta( $meta_id, $object_id, $meta_key, $_meta_value ) { $post_type = get_post_type( $object_id ); $post_types = ( !empty( $post_type ) ) ? array( $post_type ) : array(); $this->delete_transients( $post_types ); } public function delete_transients( $post_types = array() ) { if( !empty( $post_types ) ) { foreach( $post_types as $post_type ) { if( get_transient( 'sa_sm_'.$post_type ) ) { delete_transient( 'sa_sm_'.$post_type ); } } } } //Function to handle the wp-admin ajax request public function request_handler() { if (empty($_REQUEST) || empty($_REQUEST['active_module']) || empty($_REQUEST['cmd'])) return; check_ajax_referer('smart-manager-security','security'); if ( !is_user_logged_in() || !is_admin() ) { return; } $pro_flag_class_path = $pro_flag_class_nm = $sm_pro_class_nm = ''; if( defined('SMPRO') && SMPRO === true ) { $plugin_path = SM_PRO_URL .'classes'; $pro_flag_class_path = 'pro-'; $pro_flag_class_nm = 'Pro_'; } else { $plugin_path = $this->plugin_path; } //Including the common utility functions class include_once $plugin_path . '/class-smart-manager-'.$pro_flag_class_path.'utils.php'; $func_nm = $_REQUEST['cmd']; if( !empty( $_REQUEST['module'] ) && 'custom_views' === $_REQUEST['module'] ){ if( class_exists( 'Smart_Manager_Pro_Views' ) ){ $views_obj = Smart_Manager_Pro_Views::get_instance(); if( is_callable( array( $views_obj, $func_nm ) ) ) { $views_obj->$func_nm(); } } return; } // Code to handle saving of settings if( 'smart_manager_settings' === $_REQUEST['active_module'] && is_callable( 'Smart_Manager_Settings', 'update' ) ){ $settings = ( ! empty( $_REQUEST['settings'] ) ) ? json_decode( stripslashes( $_REQUEST['settings'] ), true ) : array(); $result = Smart_Manager_Settings::update( $settings ); wp_send_json( array( 'ACK'=> ( ( ! empty( $result ) ) ? 'Success' : 'Failure' ) ) ); } include_once $this->plugin_path . '/class-smart-manager-base.php'; $this->dashboard_key = $_REQUEST['active_module']; $is_taxonomy_dashboard = ( ! empty( $_REQUEST['is_taxonomy'] ) && ! empty( intval( $_REQUEST['is_taxonomy'] ) ) ) ? true : false; $llms_file = $plugin_path . '/'. 'class-smart-manager-'.$pro_flag_class_path.'llms-base.php'; $tasks_file = $plugin_path . '/' . 'class-smart-manager-' . $pro_flag_class_path . 'task.php'; if( defined('SMPRO') && SMPRO === true ) { $sm_pro_class_nm = 'class-smart-manager-'.$pro_flag_class_path.'base.php'; include_once $plugin_path . '/'. $sm_pro_class_nm; if( is_plugin_active( 'advanced-custom-fields/acf.php' ) || is_plugin_active( 'advanced-custom-fields-pro/acf.php' ) ){ $acf_file = $plugin_path . '/'. 'class-smart-manager-'.$pro_flag_class_path.'acf-base.php'; if( file_exists( $acf_file ) ){ include_once $acf_file; $acf_class = 'Smart_Manager_'.$pro_flag_class_nm.'ACF_Base'; $acf_class::instance($this->dashboard_key); } } // Code to include the base class for taxonomy dashboards if( ! empty( $is_taxonomy_dashboard ) ){ $sm_pro_class_nm = 'class-smart-manager-'.$pro_flag_class_path.'taxonomy-base.php'; include_once $plugin_path . '/'. $sm_pro_class_nm; } if( is_plugin_active( 'lifterlms/lifterlms.php' ) && file_exists( $llms_file ) ){ include_once $llms_file; } if ( isset( $_REQUEST['isTasks'] ) && file_exists( $tasks_file ) ) { include_once $tasks_file; } } if ( file_exists( $this->plugin_path . '/class-smart-manager-task.php' ) ) { include_once $this->plugin_path . '/' . 'class-smart-manager-task.php'; } if ( file_exists( SM_PLUGIN_DIR_PATH . '/classes/class-smart-manager-product-stock-log.php' ) ) { include_once( SM_PLUGIN_DIR_PATH . '/classes/class-smart-manager-product-stock-log.php' ); } //Code for initializing the specific dashboard class $file_nm = ( ( ! empty( $is_taxonomy_dashboard ) && ( 'access-privilege' !== $this->dashboard_key ) ) ? 'taxonomy-' : '' ) . str_replace('_', '-', $this->dashboard_key); $class_name = ''; $pro_flag_class_nm .= ( ( ! empty( $is_taxonomy_dashboard ) ) && ( 'access-privilege' !== $this->dashboard_key ) ) ? 'Taxonomy_' : ''; if (file_exists($plugin_path . '/class-smart-manager-'.$pro_flag_class_path.''.$file_nm.'.php')) { $key_array = explode( "_", str_replace( '-', '_', $this->dashboard_key ) ); $formatted_dashboard_key = array(); foreach( $key_array as $value ) { $formatted_dashboard_key[] = ucwords($value); } $class_name = 'Smart_Manager_'.$pro_flag_class_nm.''.implode("_",$formatted_dashboard_key); if( file_exists( $this->plugin_path . '/class-smart-manager-'.$file_nm.'.php' ) ) { include_once $this->plugin_path . '/class-smart-manager-'.$file_nm.'.php'; } if( defined('SMPRO') && SMPRO === true ) { $sm_pro_class_nm = 'class-smart-manager-'.$pro_flag_class_path.''.$file_nm.'.php'; include_once $plugin_path .'/'. $sm_pro_class_nm; } } else { $class_name = (!empty($pro_flag_class_nm)) ? 'Smart_Manager_'.$pro_flag_class_nm.'Base' : 'Smart_Manager_Base'; if( is_plugin_active( 'lifterlms/lifterlms.php' ) && class_exists( 'Smart_Manager_Pro_LLMS_Base' ) && in_array( $this->dashboard_key, Smart_Manager_Pro_LLMS_Base::$post_types ) ){ $class_name = 'Smart_Manager_Pro_LLMS_Base'; } } if( !empty( $_REQUEST['cmd'] ) && $_REQUEST['cmd'] == 'get_background_progress' ) { $class_name = 'class-smart-manager-pro-background-updater.php'; $sm_pro_class_nm = 'Smart_Manager_Pro_Background_Updater'; } elseif ( isset( $_REQUEST['isTasks'] ) && ( ( ! empty( $_REQUEST['cmd'] ) && ( 'save_state' === $_REQUEST['cmd'] ) ) ) || ( ! empty( $_REQUEST['isTasks'] ) ) ) { if ( ! empty( $is_taxonomy_dashboard ) && is_callable( $class_name, 'actions' ) ) { $class_name::actions(); } $class_name = 'Smart_Manager_Task'; } if ( ! empty( $_REQUEST['isTasks'] ) ) { $class_name = 'Smart_Manager_Pro_Task'; } elseif ( 'product_stock_log' === $this->dashboard_key ) { $class_name = 'Smart_Manager_Product_Stock_Log'; } $_REQUEST['class_nm'] = $class_name; $_REQUEST['class_path'] = $sm_pro_class_nm; if( !empty( $this->sm_beta_pro_background_updater ) && !empty( $_REQUEST['cmd'] ) && $_REQUEST['cmd'] == 'get_background_progress' ) { is_callable( array( $this->sm_beta_pro_background_updater, $func_nm ) ) ? $this->sm_beta_pro_background_updater->$func_nm() : Smart_Manager::log( 'error', _x( "Method $func_nm is not callable in class Smart_Manager_Pro_Background_Updater.", 'Smart Manager - Ajax request handler background progress', 'smart-manager-for-wp-e-commerce' ) ); } else if( class_exists( $class_name ) ) { $handler_obj = new $class_name($this->dashboard_key); ( is_callable( array( $handler_obj, $func_nm ) ) ) ? $handler_obj->$func_nm() : Smart_Manager::log( 'error', _x( "Method $func_nm is not callable in class $class_name.", 'Smart Manager - Ajax request handler', 'smart-manager-for-wp-e-commerce' ) ); } } /** * Function to re-generate the column model for 'Shop_Order' and 'Shop_Subscription' on WC settings update. */ public function migrate_wc_orders_subscriptions_col_model() { global $wpdb; $user_id = get_current_user_id(); if( empty( $user_id ) ){ return; } $order_column_model = get_user_meta( $user_id, 'sa_sm_shop_order', true ); $subscription_column_model = get_user_meta( $user_id, 'sa_sm_shop_subscription', true ); if( empty( $order_column_model ) && empty( $subscription_column_model ) ){ return; } if( ! class_exists( 'Smart_Manager_Shop_Order' ) && file_exists( $this->plugin_path . '/class-smart-manager-shop-order.php' ) ){ if( ! class_exists( 'Smart_Manager_Base' ) && file_exists( $this->plugin_path . '/class-smart-manager-base.php' ) ){ include_once $this->plugin_path . '/class-smart-manager-base.php'; } include_once $this->plugin_path . '/class-smart-manager-shop-order.php'; } if( ! is_callable( array( 'Smart_Manager_Shop_Order', 'migrate_col_model' ) ) ){ return; } if( ! empty( $order_column_model ) ) { delete_transient( 'sa_sm_shop_order' ); update_user_meta( $user_id, 'sa_sm_shop_order' , Smart_Manager_Shop_Order::migrate_col_model( $order_column_model ) ); } if( ! empty( $subscription_column_model ) ) { delete_transient( 'sa_sm_shop_subscription' ); update_user_meta( $user_id, 'sa_sm_shop_subscription' , Smart_Manager_Shop_Order::migrate_col_model( $subscription_column_model ) ); } // Code to update custom views if( ! ( defined('SMPRO') && true === SMPRO ) ) { return; } if ( $wpdb->prefix. 'sm_views' !== $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE %s", $wpdb->prefix. 'sm_views' ) ) ) { return; } $views = $wpdb->get_results( $wpdb->prepare( "SELECT id, params FROM {$wpdb->prefix}sm_views WHERE post_type=%s OR post_type=%s", 'shop_order', 'shop_subscription' ), 'ARRAY_A' ); if( empty( $views ) || ! is_array( $views ) ){ return; } $view_update_clauses = array(); foreach( $views as $view ){ if( empty( $view['id'] ) || empty( $view['params'] ) ){ continue; } $view['params'] = json_decode( $view['params'], true ); if( empty( $view['params'] ) || ! is_array( $view['params'] ) ){ continue; } $updated_col_model = Smart_Manager_Shop_Order::migrate_col_model( $view['params'] ); if( empty( $updated_col_model ) ){ continue; } $view_update_clauses[$view['id']] = "WHEN id={$view['id']} THEN '". wp_json_encode($updated_col_model) ."'"; } if( empty( $view_update_clauses ) ){ return; } $query = "UPDATE {$wpdb->prefix}sm_views SET params = CASE ". implode( ",", $view_update_clauses ) . " END WHERE id IN (". implode( ",", array_keys( $view_update_clauses ) ) .")"; $wpdb->query( "UPDATE {$wpdb->prefix}sm_views SET params = CASE ". implode( " ", $view_update_clauses ) . " END WHERE id IN (". implode( ",", array_keys( $view_update_clauses ) ) .")" ); } } } classes/class-smart-manager-shop-coupon.php000064400000013600147600337620015033 0ustar00dashboard_key = $dashboard_key; $this->post_type = $dashboard_key; $this->req_params = (!empty($_REQUEST)) ? $_REQUEST : array(); add_filter( 'sm_dashboard_model',array( &$this,'coupons_dashboard_model' ), 10, 2 ); add_filter( 'sm_data_model', array( &$this, 'coupons_data_model' ), 10, 2 ); } public function coupons_data_model ($data_model, $data_col_params) { if(empty($data_model) || empty($data_model['items'])) { return $data_model; } foreach( $data_model['items'] as $key => $item ) { if( isset( $item['postmeta_meta_key_coupon_amount_meta_value_coupon_amount'] ) && "" == $item['postmeta_meta_key_coupon_amount_meta_value_coupon_amount'] ) { $data_model['items'][$key]['postmeta_meta_key_coupon_amount_meta_value_coupon_amount'] = 0; } if( isset( $item['postmeta_meta_key_usage_count_meta_value_usage_count'] ) && "" == $item['postmeta_meta_key_usage_count_meta_value_usage_count'] ) { $data_model['items'][$key]['postmeta_meta_key_usage_count_meta_value_usage_count'] = 0; } } return $data_model; } public function coupons_dashboard_model ($dashboard_model, $dashboard_model_saved) { global $wpdb, $current_user; $visible_columns = array('ID', 'post_title', 'discount_type', 'coupon_amount', 'post_excerpt', 'product_ids', 'product_categories', 'customer_email', 'usage_count', 'usage_limit', 'expiry_date', 'free_shipping', 'individual_use', 'exclude_sale_items', 'usage_limit_per_user'); $numeric_columns = array('usage_limit', 'usage_limit_per_user', 'limit_usage_to_x_items', 'coupon_amount', 'usage_count', 'minimum_amount', 'maximum_amount'); $checkbox_yes_no_columns = array('individual_use', 'free_shipping', 'exclude_sale_items', 'sc_restrict_to_new_user', 'auto_generate_coupon', 'sc_disable_email_restriction', 'is_pick_price_of_product', 'wc_email_message'); $text_columns = array('product_ids'); $post_type_col_index = sm_multidimesional_array_search('postmeta_meta_key_discount_type_meta_value_discount_type', 'data', $dashboard_model['columns']); $coupon_statuses = ( function_exists('wc_get_coupon_types') ) ? wc_get_coupon_types() : array(); $dashboard_model['columns'][$post_type_col_index]['type'] = 'dropdown'; $dashboard_model['columns'][$post_type_col_index]['editor'] = 'select2'; $dashboard_model['columns'][$post_type_col_index]['editable'] = false; $dashboard_model['columns'][$post_type_col_index]['renderer'] = 'select2Renderer'; $dashboard_model['columns'][$post_type_col_index]['select2Options'] = array( 'data'=> array(), 'dropdownCssClass'=> 'smSelect2Drop', 'allowClear'=> true, 'width'=> 'resolve' ); $dashboard_model['columns'][$post_type_col_index]['save_state'] = true; $dashboard_model['columns'][$post_type_col_index]['search_values'] = array(); foreach ($coupon_statuses as $key => $value) { $dashboard_model['columns'][$post_type_col_index]['search_values'][] = array('key' => $key, 'value' => $value); $dashboard_model['columns'][$post_type_col_index]['select2Options']['data'][] = array('id' => $key, 'text' => $value); } $column_model = &$dashboard_model['columns']; foreach( $column_model as &$column ) { if (empty($column['src'])) continue; $src_exploded = explode("/",$column['src']); if (empty($src_exploded)) { $src = $column['src']; } if ( sizeof($src_exploded) > 2) { $col_table = $src_exploded[0]; $cond = explode("=",$src_exploded[1]); if (sizeof($cond) == 2) { $src = $cond[1]; } } else { $src = $src_exploded[1]; $col_table = $src_exploded[0]; } if( empty($dashboard_model_saved) ) { if (!empty($column['position'])) { unset($column['position']); } $position = array_search($src, $visible_columns); if ($position !== false) { $column['position'] = $position + 1; $column['hidden'] = false; } else { $column['hidden'] = true; } } if ($src == 'post_title') { $column ['name_display'] = $column ['key'] = __('Coupon Code', 'smart-manager-for-wp-e-commerce'); } else if( $src == 'post_excerpt' ) { $column ['name_display'] = $column ['key'] = __('Description', 'smart-manager-for-wp-e-commerce'); } else if( $src == 'customer_email' ) { $column ['name_display'] = $column ['key'] = __('Allowed Emails', 'smart-manager-for-wp-e-commerce'); } else if( $src == 'usage_limit' ) { $column ['name_display'] = $column ['key'] = __('Usage Limit Per Coupon', 'smart-manager-for-wp-e-commerce'); } else if( $src == 'free_shipping' ) { $column ['name_display'] = $column ['key'] = __('Allow Free Shipping', 'smart-manager-for-wp-e-commerce'); } if( !empty( $numeric_columns ) && in_array( $src, $numeric_columns ) ) { $column ['type'] = 'numeric'; $column ['editor'] = 'customNumericEditor'; } else if ( !empty( $checkbox_yes_no_columns ) && in_array( $src, $checkbox_yes_no_columns ) ) { $column ['type'] = 'checkbox'; $column ['checkedTemplate'] = 'yes'; $column ['uncheckedTemplate'] = 'no'; } else if( !empty( $text_columns ) && in_array( $src, $text_columns ) ) { $column ['type'] = $column ['editor'] = 'text'; } } if (!empty($dashboard_model_saved)) { $col_model_diff = sm_array_recursive_diff($dashboard_model_saved,$dashboard_model); } //clearing the transients before return if (!empty($col_model_diff)) { delete_transient( 'sa_sm_'.$this->dashboard_key ); } return $dashboard_model; } } } classes/class-smart-manager-base.php000064400000600607147600337620013504 0ustar00 '=', 'neq'=> '!=', 'lt'=> '<', 'gt'=> '>', 'lte'=> '<=', 'gte'=> '>=' ), $advanced_search_table_types = array( 'flat' => array( 'posts' => 'ID' ), 'meta' => array( 'postmeta' => 'post_id' ) ), $prev_post_values = array(), $prev_postmeta_values = array(), $field_names = array(), $store_col_model_transient_option_nm = '', $task_id = 0, $entire_task = false, $previous_cond_has_results = false, $disable_task_details_update = false, $plugin_path = ''; public static $update_task_details_params = array(), $previous_vals = array(); // include_once $this->plugin_path . '/class-smart-manager-utils.php'; function __construct($dashboard_key) { $this->dashboard_key = $dashboard_key; $this->post_type = $dashboard_key; $this->plugin_path = untrailingslashit( plugin_dir_path( __FILE__ ) ); $this->req_params = (!empty($_REQUEST)) ? $_REQUEST : array(); $this->dashboard_title = ( !empty( $this->req_params['active_module_title'] ) ) ? $this->req_params['active_module_title'] : 'Post'; $this->advanced_search_table_types = apply_filters( 'sm_search_table_types', $this->advanced_search_table_types ); //filter to add custom tables to table types $this->store_col_model_transient_option_nm = 'sa_sm_' . $this->dashboard_key; add_filter( 'posts_join_paged', array( &$this, 'sm_query_join' ), 99, 2 ); add_filter( 'posts_where', array( &$this, 'sm_query_post_where_cond' ), 99, 2 ); add_filter( 'posts_groupby', array( &$this, 'sm_query_group_by' ), 99, 2 ); add_filter( 'posts_orderby', array( &$this, 'sm_query_order_by' ), 99, 2 ); add_action( 'sm_search_posts_conditions_array_complete', array( &$this, 'get_matching_children_advanced_search' ) ); add_action( 'sm_search_posts_condition_start', array( &$this, 'modify_posts_advanced_search_condition' ), 10, 2 ); add_action( 'sm_search_query_postmeta_from', array( &$this, 'modify_postmeta_advanced_search_from' ), 10, 2 ); } /** * Adds custom JOIN clauses to the SQL query. * * @param string $join The existing JOIN clause. * @param WP_Query|null $wp_query_obj The WP_Query object, if available. * @return string The modified JOIN clause. */ public function sm_query_join ( $join = '', $wp_query_obj = null ) { return $this->get_join_clause_for_search( array( 'join' => $join, 'wp_query_obj' => $wp_query_obj ) ); } /** * Modifies the WHERE clause of the WP_Query object for search conditions. * * @param string $where The existing WHERE clause. * @param WP_Query|null $wp_query_obj The WP_Query object. * @return string The modified WHERE clause. */ public function sm_query_post_where_cond ( $where = '', $wp_query_obj = null ) { if ( empty( $where ) ) { return $where; } //Code for handling search. $where_params = $this->get_where_clause_for_search( array( 'where' => $where ) ); return ( ! empty( $where_params['where'] ) ) ? $where_params['where'] : $where; } /** * Adds custom GROUP BY clauses to the SQL query. * * @param string $group_by The existing GROUP BY clause. * @param WP_Query|null $wp_query_obj The WP_Query object, if available. * @return string The modified GROUP BY clause. */ public function sm_query_group_by ( $group_by = '', $wp_query_obj = null ) { return $this->get_group_by_clause_for_search( array( 'group_by' => $group_by ) ); } /** * Modifies the ORDER BY clause of a WP_Query object. * * @param string $order_by The ORDER BY clause to be used in the query. * @param WP_Query|null $wp_query_obj The WP_Query object to modify. Default is null. * @return string The modified ORDER BY clause. */ public function sm_query_order_by ( $order_by = '', $wp_query_obj = null ) { return $this->get_order_by_clause_for_sort( array( 'order_by' => $order_by, 'wp_query_obj' => $wp_query_obj ) ); } public function get_type_from_data_type( $data_type = '' ){ $type = 'text'; if( empty( $data_type ) ){ return $type; } $type_strpos = strrpos( $data_type,'(' ); if( $type_strpos !== false ) { $type = substr( $data_type, 0, $type_strpos ); } else { $types = explode( " ", $data_type ); // for handling types with attributes (biginit unsigned) $type = ( ! empty( $types ) ) ? $types[0] : $data_type; } switch( $type ){ case (substr($type,-3) == 'int'): $type = 'numeric'; break; case (substr($type,-4) == 'char' || substr($type,-4) == 'text'): $type = ( $type == 'longtext' ) ? 'sm.longstring' : 'text'; break; case ( substr($type,-4) == 'blob' ): $type = 'sm.longstring'; break; case ( $type == 'datetime' || $type == 'timestamp' ): $type = 'sm.datetime'; break; case ( $type == 'date' || $type == 'year' ): $type = 'sm.date'; break; case ( $type == 'decimal' || $type == 'float' || $type == 'double' || $type == 'real' ): $type = 'numeric'; break; case ( $type == 'boolean' ): $type = 'checkbox'; break; default: $type = 'text'; } return $type; } public function get_type_from_value( $value = '' ) { $type = 'text'; if( empty( $value ) ){ return $type; } $checkbox_values = array( 'yes', 'no', 'true', 'false' ); switch( $value ){ case ( ! empty( in_array( $value, $checkbox_values, true ) ) || ( is_numeric( $value ) && ( $value === '0' || $value === '1' ) ) ): $type = 'checkbox'; break; case ( is_numeric( $value ) ): if( function_exists('isTimestamp') ) { if( isTimestamp( $value ) ) { $type = 'sm.datetime'; break; } } if( $type != 'sm.datetime' ) { $type = 'numeric'; } break; case (is_serialized($value) === true): $type = 'sm.serialized'; break; case ( DateTime::createFromFormat('Y-m-d H:i:s', $value) !== false ): $type = 'sm.datetime'; break; case ( DateTime::createFromFormat('Y-m-d', $value) !== false ): $type = 'sm.date'; break; default: $type = 'text'; } return $type; } public function get_col_type( $data_type = '', $value = '' ){ return ( !empty( $data_type ) ) ? $this->get_type_from_data_type( $data_type ) : $this->get_type_from_value( $value ); } public function get_default_column_model( $args = array() ){ global $wpdb; $column = array(); if( empty( $args ) ){ return $column; } if( empty( $args['table_nm'] ) || empty( $args['col'] ) ){ return $column; } $col = $args['col']; unset( $args['col'] ); $table_nm = $args['table_nm']; unset( $args['table_nm'] ); $visible_cols = array(); if( ! empty( $args['visible_cols'] ) ){ $visible_cols = $args['visible_cols']; unset( $args['visible_cols'] ); } $is_meta = false; if( ! empty( $args['is_meta'] ) ){ $is_meta = true; unset( $args['is_meta'] ); } $src = $table_nm .'/'. ( ( !empty( $is_meta ) ) ? 'meta_key='.$col.'/meta_value='.$col : $col ); $name = ( ! empty( $args['name'] ) ) ? $args['name'] : __( ucwords( str_replace( '_', ' ', $col ) ), 'smart-manager-for-wp-e-commerce' ); if( isset( $args['name'] ) ) { unset( $args['name'] ); } // Code to get the col type $data_type = ''; if( ! empty( $args['db_type'] ) ){ $data_type = $args['db_type']; unset( $args['db_type'] ); } $col_value = ''; if( ! empty( $args['col_value'] ) ){ $col_value = $args['col_value']; unset( $args['col_value'] ); } $uneditable_types = array( 'sm.longstring' ); $type = $this->get_col_type( $data_type, $col_value ); if( ! empty( $args['values'] ) && empty( $args['search_values'] ) ) { $args['search_values'] = array(); foreach( $args['values'] as $key => $value ) { $args['search_values'][] = array( 'key' => $key, 'value' => $value ); } } $default_widths = apply_filters( 'sm_default_col_widths', array( 'sm.image' => 50, 'numeric' => 50, 'checkbox' => 30, 'sm.datetime' => 105, 'text' => 130, 'sm.longstring' => 150, 'sm.serialized' => 200 ) ); $column = array_merge( array( 'src' => $src, 'data' => sanitize_title( str_replace( array( '/', '=' ), '_', $src ) ), // generate slug using the wordpress function if not given 'name' => $name, 'key' => $name, 'type' => $type, 'editor' => ( 'numeric' === $type ) ? 'customNumericEditor' : $type, 'hidden' => false, 'editable' => ( empty( in_array( $type, $uneditable_types ) ) ) ? true : false, 'batch_editable' => true, 'sortable' => true, 'resizable' => true, 'allow_showhide' => true, 'exportable' => true, 'searchable' => true, 'frozen' => false, //For disabling frozen 'wordWrap' => false, //For disabling word-wrap 'save_state' => true, 'editor_schema' => false, 'align' => ( 'numeric' === $type ) ? 'right' : 'left', 'table_name' => $wpdb->prefix . $table_nm, 'col_name' => ( ! empty( $args['col_name'] ) ) ? $args['col_name'] : $col, 'width' => ( ! empty( $default_widths[$type] ) ) ? $default_widths[$type] : 200, 'values' => array(), 'search_values' => array(), 'category' => '', 'placeholder' => '' ), $args ); if ( strpos($col, '_phone') !== false || strpos($col, '_tel') !== false || strpos($col, 'phone_') !== false || strpos($col, 'tel_') !== false ) { $column['validator'] = 'customPhoneTextEditor'; } if( ( ! empty( $is_meta ) && ( '_thumbnail_id' === $col || 'thumbnail_id' === $col ) ) || 'sm.image' === $type ){ $column['name'] = $args['key'] = __('Featured Image', 'smart-manager-for-wp-e-commerce'); $column['type'] = 'sm.image'; $column['align']= 'center'; $column['search_type']= 'numeric'; $column['editable']= false; $column['sortable']= false; } if( 'checkbox' === $type ){ if( $col_value == 'yes' || $col_value == 'no' ){ $column['checkedTemplate'] = 'yes'; $column['uncheckedTemplate'] = 'no'; } else if( $col_value === '0' || $col_value === '1' ){ $column['checkedTemplate'] = 1; $column['uncheckedTemplate'] = 0; } } if( function_exists('isTimestamp') ) { if( isTimestamp( $col_value ) && 'sm.datetime' === $type ) { $column['date_type'] = 'timestamp'; } } if( ! empty( $visible_cols ) && is_array( $visible_cols ) ){ if( ! empty( $column['position'] ) ) { unset( $column['position'] ); } $position = array_search( $column['data'], $visible_cols ); if( false !== $position ) { $column['position'] = $position + 1; $column['hidden'] = false; } else { $column['hidden'] = true; } } return $column; } public function get_default_store_model() { global $wpdb; $col_model = array(); $ignored_col = array('post_type'); $default_col_positions = array( 'ID', 'post_title', 'post_content', 'post_status', 'post_date', 'post_name' ); $visible_cols = array( 'ID', 'post_title', 'post_date', 'post_name', 'post_status', 'post_content' ); $hidden_cols = array( '_edit_lock','_edit_last' ); $col_titles = array( 'post_date' => $this->dashboard_title . ' Created Date', 'post_date_gmt' => $this->dashboard_title . ' Created Date Gmt' ); $query_posts_col = "SHOW COLUMNS FROM {$wpdb->prefix}posts"; $results_posts_col = $wpdb->get_results($query_posts_col, 'ARRAY_A'); $posts_num_rows = $wpdb->num_rows; $last_position = 0; if ($posts_num_rows > 0) { foreach ($results_posts_col as $posts_col) { $field_nm = (!empty($posts_col['Field'])) ? $posts_col['Field'] : ''; if( in_array($field_nm, $ignored_col) ) { continue; } $args = array( 'table_nm' => 'posts', 'col' => $field_nm, 'name' => ( ! empty( in_array( $field_nm, $col_titles ) ) ) ? $col_titles[$field_nm] : '', 'hidden' => ( empty( in_array( $field_nm, $visible_cols ) ) ) ? true : false, 'db_type' => ( ! empty( $posts_col['Type'] ) ) ? $posts_col['Type'] : '' ); //Code for handling extra meta for the columns if ($field_nm == 'ID') { $args['editor'] = false; $args['batch_editable'] = false; }else if ($field_nm == 'post_status') { $args['type'] = 'dropdown'; $args['strict'] = true; $args['allowInvalid'] = false; if ( 'page' === $this->dashboard_key ) { $args['values'] = get_page_statuses(); } else { $statuses = get_post_stati( array(), 'object' ); $args['values'] = array(); // Code for creating unused_statuses array $unused_post_statuses = array( 'inherit', 'trash', 'auto-draft', 'in-progress', 'failed', 'request-pending', 'request-confirmed', 'request-failed', 'request-completed' ); if ( function_exists( 'wc_get_order_statuses' ) ) { $unused_post_statuses = array_merge( $unused_post_statuses, array_keys( wc_get_order_statuses() ) ); } if ( function_exists( 'wcs_get_subscription_statuses' ) ) { $unused_post_statuses = array_merge( $unused_post_statuses, array_keys( wcs_get_subscription_statuses() ) ); } $unused_post_statuses = apply_filters( 'sm_unused_post_statuses', $unused_post_statuses ); foreach( $statuses as $status ) { if ( in_array( $status->name, $unused_post_statuses ) ) { continue; } $args['values'][$status->name] = $status->label; } } $args['defaultValue'] = 'draft'; $args['editor'] = 'select'; $args['selectOptions'] = $args['values']; $args['renderer'] = 'selectValueRenderer'; }else if ( 'post_excerpt' === $field_nm ) { $args['type'] = 'sm.longstring'; } // Code for setting the default column positions $position = array_search( $field_nm, $default_col_positions ); if( false !== $position ){ $args['position'] = $position + 1; $last_position++; } $col_model[] = $this->get_default_column_model( $args ); } } //Code to get columns from postmeta table $post_type_cond = (is_array($this->post_type)) ? " AND {$wpdb->prefix}posts.post_type IN ('". implode("','", $this->post_type) ."')" : " AND {$wpdb->prefix}posts.post_type = '". $this->post_type ."'"; $query_postmeta_col = "SELECT DISTINCT {$wpdb->prefix}postmeta.meta_key, {$wpdb->prefix}postmeta.meta_value FROM {$wpdb->prefix}postmeta JOIN {$wpdb->prefix}posts ON ({$wpdb->prefix}posts.id = {$wpdb->prefix}postmeta.post_id) WHERE {$wpdb->prefix}postmeta.meta_key != '' AND {$wpdb->prefix}postmeta.meta_key NOT LIKE 'free-%' AND {$wpdb->prefix}postmeta.meta_key NOT LIKE '_oembed%' AND {$wpdb->prefix}postmeta.meta_key NOT REGEXP '^[a-f0-9]{32}$' $post_type_cond GROUP BY {$wpdb->prefix}postmeta.meta_key"; $results_postmeta_col = $wpdb->get_results ($query_postmeta_col , 'ARRAY_A'); $num_rows = $wpdb->num_rows; if ($num_rows > 0) { $meta_keys = array(); foreach ($results_postmeta_col as $key => $postmeta_col) { if ( empty( $postmeta_col['meta_value'] ) || $postmeta_col['meta_value'] == '1' || $postmeta_col['meta_value'] == '0.00' ) { $meta_keys [] = $postmeta_col['meta_key']; //TODO: if possible store in db instead of using an array } unset($results_postmeta_col[$key]); $results_postmeta_col[$postmeta_col['meta_key']] = $postmeta_col; } //not in 0 added for handling empty date columns if (!empty($meta_keys)) { $query_meta_value = "SELECT {$wpdb->prefix}postmeta.meta_key, {$wpdb->prefix}postmeta.meta_value FROM {$wpdb->prefix}postmeta JOIN {$wpdb->prefix}posts ON ({$wpdb->prefix}posts.id = {$wpdb->prefix}postmeta.post_id) WHERE {$wpdb->prefix}posts.post_type = '". $this->dashboard_key ."' AND {$wpdb->prefix}postmeta.meta_value NOT IN ('','0','0.00','1') AND {$wpdb->prefix}postmeta.meta_key IN ('".implode("','",$meta_keys)."') GROUP BY {$wpdb->prefix}postmeta.meta_key"; $results_meta_value = $wpdb->get_results ($query_meta_value , 'ARRAY_A'); $num_rows_meta_value = $wpdb->num_rows; if ($num_rows_meta_value > 0) { foreach ($results_meta_value as $result_meta_value) { if (isset($results_postmeta_col [$result_meta_value['meta_key']])) { $results_postmeta_col [$result_meta_value['meta_key']]['meta_value'] = $result_meta_value['meta_value']; } } } } //Filter to add custom postmeta columns for custom plugins $results_postmeta_col = apply_filters('sm_default_dashboard_model_postmeta_cols', $results_postmeta_col); $meta_count = 0; //Code for pkey column for postmeta $col_model[] = $this->get_default_column_model( array( 'table_nm' => 'postmeta', 'col' => 'post_id', 'type' => 'numeric', 'hidden' => true, 'allow_showhide' => false, 'editor' => false, ) ); foreach ($results_postmeta_col as $postmeta_col) { $meta_key = ( !empty( $postmeta_col['meta_key'] ) ) ? $postmeta_col['meta_key'] : ''; $meta_value = ( !empty( $postmeta_col['meta_value'] ) || $postmeta_col['meta_value'] == 0 ) ? $postmeta_col['meta_value'] : ''; $args = array( 'table_nm' => 'postmeta', 'col' => $meta_key, 'is_meta' => true, 'col_value' => $meta_value, 'name' => ( ! empty( in_array( $meta_key, $col_titles ) ) ) ? $col_titles[$meta_key] : '', 'hidden' => ( ! empty( in_array( $meta_key, $hidden_cols ) ) || $meta_count > 5 ) ? true : false ); // Handling for _thumnail_id => image column // if( '_thumbnail_id' === $meta_key ){ // $args['name'] = $args['key']= __('Featured Image', 'smart-manager-for-wp-e-commerce'); // $args['align']= 'center'; // $args['type']= 'sm.image'; // $args['searchable']= true; // $args['search_type']= 'numeric'; // $args['editable']= false; // $args['batch_editable']= true; // $args['sortable']= false; // $args['resizable']= true; // } if( empty( $args['hidden'] ) ){ $last_position++; } $col_model[] = $this->get_default_column_model( $args ); $meta_count++; } } //Code to get columns from terms //Code to get all relevant taxonomy for the post type $taxonomy_nm = get_object_taxonomies($this->post_type); if (!empty($taxonomy_nm)) { $terms_count = 0; //Code for pkey column for terms $col_model[] = $this->get_default_column_model( array( 'table_nm' => 'terms', 'col' => 'object_id', 'type' => 'numeric', 'hidden' => true, 'allow_showhide' => false, 'editor' => false, ) ); $taxonomy_terms = get_terms($taxonomy_nm, array('hide_empty'=> 0,'orderby'=> 'name')); if ( ! empty( $taxonomy_terms ) ) { $results = $this->get_parent_term_values( array( 'taxonomy_obj' => $taxonomy_terms, 'include_taxonomy' => 'all' // include all taxonomy. ) ); } //Code for defining the col model for the terms foreach ($taxonomy_nm as $taxonomy) { $args = array( 'table_nm' => 'terms', 'col' => $taxonomy, 'name' => ( ! empty( in_array( $field_nm, $col_titles ) ) ) ? $col_titles[$field_nm] : '', 'hidden' => ( $terms_count > 5 ) ? true : false ); if ( ! isset( $results['terms_val'] ) || ! isset( $results['terms_val_search'] ) ) { continue; } if ( ! empty( $results['terms_val'][$taxonomy] ) ) { $args['type'] = 'sm.multilist'; $args['strict'] = true; $args['allowInvalid'] = false; $args['editable'] = false; $args['values'] = $results['terms_val'][$taxonomy]; if( ! empty( $results['terms_val_search'][$taxonomy] ) ){ $args['search_values'] = array(); foreach( $results['terms_val_search'][$taxonomy] as $key => $value ) { $args['search_values'][] = array( 'key' => $key, 'value' => $value ); } } } if( empty( $args['hidden'] ) ){ $last_position++; } $col_model[] = $this->get_default_column_model( $args ); $terms_count++; } } $col_model[] = $this->get_default_column_model( array( 'table_nm' => 'custom', 'col' => 'edit_link', 'renderer' => 'html', 'name' => __('Edit', 'smart-manager-for-wp-e-commerce'), 'sortable' => false, 'editor' => false, 'searchable' => false, 'editable' => false, 'batch_editable' => false, 'position' => ++$last_position, 'width' => 30 ) ); if( !empty( $this->req_params['is_public'] ) ) { $col_model[] = $this->get_default_column_model( array( 'table_nm' => 'custom', 'col' => 'view_link', 'renderer' => 'html', 'name' => __('View', 'smart-manager-for-wp-e-commerce'), 'sortable' => false, 'editor' => false, 'searchable' => false, 'editable' => false, 'batch_editable' => false, 'position' => ++$last_position, 'width' => 30 ) ); } //defining the default col model $this->default_store_model = array( 'display_name' => __(ucwords(str_replace('_', ' ', $this->dashboard_key)), 'smart-manager-for-wp-e-commerce'), 'tables' => array( 'posts' => array( 'pkey' => 'ID', 'join_on' => '', 'where' => array( 'post_type' => $this->post_type, 'post_status' => 'any' // will get all post_status except 'trash' and 'auto-draft' // 'post_status' => array('publish', 'draft') // comma seperated for multiple values //For any other whereition specify, colname => colvalue ) ), 'postmeta' => array( 'pkey' => 'post_id', 'join_on' => 'postmeta.post_ID = posts.ID', // format current_table.pkey = joinning table.pkey 'where' => array( // provide a wp_query [meta_query] // 'relation' => 'AND', // AND or OR // array( // 'key' => '', // 'value' => '', // 'compare' => '', // ), // array( // 'key' => '', // 'value' => 0, // 'type' => '', // 'compare' => '', // ) ) ), 'term_relationships' => array( 'pkey' => 'object_id', 'join_on' => 'term_relationships.object_id = posts.ID', 'where' => array() ), 'term_taxonomy' => array( 'pkey' => 'term_taxonomy_id', 'join_on' => 'term_taxonomy.term_taxonomy_id = term_relationships.term_taxonomy_id', 'where' => array() ), 'terms' => array( 'pkey' => 'term_id', 'join_on' => 'terms.term_id = term_taxonomy.term_id', 'where' => array( // 'relation' => 'AND', // AND or OR // array( // 'taxonomy' => '', // 'field' => '', // 'terms' => '' // ), ) ) ), 'columns' => $col_model, 'sort_params' => array ( //WP_Query array structure 'orderby' => 'ID', //multiple list separated by space 'order' => 'DESC', 'default' => true ), // 'sort_params' => array( 'post_parent' => 'ASC', 'ID' => 'DESC' ), 'per_page_limit' => '', // blank, 0, -1 all values refer to infinite scroll 'treegrid' => false // flag for setting the treegrid ); } //Function to handle the user specific column model mapping to store model public function map_column_to_store_model( $store_model = array(), $column_model_transient = array() ) { if( !empty( $store_model['columns'] ) ) { $enabled_cols = $enabled_cols_position_blank = $disabled_cols = array(); $column_transient = ( ! empty( $column_model_transient['columns'] ) ) ? $column_model_transient['columns'] : array(); $column_transient_formatted = array(); if( ! empty( $column_transient ) ){ array_walk( $column_transient, function ( $col_obj, $col ) use( &$column_transient_formatted ) { $column_transient_formatted[ strtolower( $col ) ] = $col_obj; } ); } $saved_column_titles = ( defined('SMPRO') && true === SMPRO && ! empty( $this->store_col_model_transient_option_nm ) ) ? get_option( $this->store_col_model_transient_option_nm .'_columns', array() ) : array(); foreach( $store_model['columns'] as $key => $col ) { $col_data = ( ! empty( $col['data'] ) ) ? strtolower( $col['data'] ) : ''; //did if the columns are stored as uppercase // Code for handling column titles if( ( defined('SMPRO') && true === SMPRO ) && ! empty( $saved_column_titles ) && ! empty( $col_data ) && ! empty( $saved_column_titles[ $col_data ] ) ) { $store_model['columns'][$key]['name'] = $store_model['columns'][$key]['key'] = $store_model['columns'][$key]['name_display'] = $saved_column_titles[ $store_model['columns'][$key]['data'] ]; } $store_model['columns'][$key]['width'] = ( !empty( $store_model['columns'][$key]['width'] ) ) ? $store_model['columns'][$key]['width'] : ''; $store_model['columns'][$key]['position'] = ( !empty( $store_model['columns'][$key]['position'] ) ) ? $store_model['columns'][$key]['position'] : ''; if( !empty( $col_data ) && !empty( $column_transient_formatted[ $col_data ] ) ) { $store_model['columns'][$key]['hidden'] = false; $store_model['columns'][$key]['width'] = ( !empty( $column_transient_formatted[ $col_data ]['width'] ) ? $column_transient_formatted[ $col_data ]['width'] : $store_model['columns'][$key]['width'] ); $store_model['columns'][$key]['position'] = ( !empty( $column_transient_formatted[ $col_data ]['position'] ) ? $column_transient_formatted[ $col_data ]['position'] : $store_model['columns'][$key]['position'] ); if( !empty( $store_model['columns'][$key]['position'] ) ) { $enabled_cols[ (int)$store_model['columns'][$key]['position'] ] = $store_model['columns'][$key]; } else { $enabled_cols_position_blank[] = $store_model['columns'][$key]; } } else { $store_model['columns'][$key]['hidden'] = true; $disabled_cols[] = $store_model['columns'][$key]; } } usort($enabled_cols, function ($item1, $item2) { if ($item1['position'] == $item2['position']) return 0; return $item1['position'] < $item2['position'] ? -1 : 1; }); $store_model['columns'] = array_merge( $enabled_cols, $enabled_cols_position_blank, $disabled_cols ); } $store_model['sort_params'] = ( !empty( $store_model['sort_params'] ) ) ? $store_model['sort_params'] : array(); $store_model['sort_params'] = ( !empty( $column_model_transient['sort_params'] ) ? $column_model_transient['sort_params'] : $store_model['sort_params'] ); $store_model = apply_filters( 'sm_map_column_state_to_store_model', $store_model, $column_model_transient ); return $store_model; } //Function to get the dashboard model public function get_dashboard_model( $return_store_model = false ) { global $wpdb, $current_user; $col_model = array(); $old_col_model = array(); $search_params = array(); $column_model_transient = ( ! empty( $this->store_col_model_transient_option_nm ) ) ? get_user_meta( get_current_user_id(), $this->store_col_model_transient_option_nm, true ) : array(); // Code for handling views if( ( defined('SMPRO') && true === SMPRO ) && ! empty( $this->req_params['is_view'] ) && ! empty( $this->req_params['active_view'] ) ) { if( class_exists( 'Smart_Manager_Pro_Views' ) ) { $view_obj = Smart_Manager_Pro_Views::get_instance(); if( is_callable( array( $view_obj, 'get' ) ) ){ $view_slug = $this->req_params['active_view']; $view_data = $view_obj->get($view_slug); if( ! empty( $view_data ) ) { $this->dashboard_key = $view_data['post_type']; $column_model_transient = get_user_meta(get_current_user_id(), 'sa_sm_'.$view_slug, true); $column_model_transient = json_decode( $view_data['params'], true ); if( !empty( $column_model_transient['search_params'] ) ) { if( ! empty( $column_model_transient['search_params']['isAdvanceSearch'] ) ) { // For advanced search if( ! empty( $column_model_transient['search_params']['params'] ) && is_array( $column_model_transient['search_params']['params'] ) ) { // code for porting from old structure $search_query = $column_model_transient['search_params']['params']; if( empty( $search_query[0]['condition'] ) ){ $rule_groups = array(); $search_operators = array_flip( $this->advance_search_operators ); foreach( $search_query as $query ) { if( empty( $query ) || ! is_array( $query ) ) { continue; } $rules = array(); // iterate over each rule foreach( $query as $rule ) { $rules[] = array( 'type' => $rule['table_name'] .'.'. $rule['col_name'], 'operator' => strtolower( ( ! empty( $search_operators[ $rule['operator'] ] ) ) ? $search_operators[ $rule['operator'] ] : $rule['operator'] ), 'value' => $rule['value'] ); } $rule_groups[] = array( 'condition' => "AND", 'rules' => $rules ); } $column_model_transient['search_params']['params'] = array( array( 'condition' => 'OR', 'rules' => $rule_groups ) ); // code to upate the view new structure at db level $result = $wpdb->query( // phpcs:ignore $wpdb->prepare( // phpcs:ignore "UPDATE {$wpdb->prefix}sm_views SET params = %s WHERE slug = %s", json_encode( $column_model_transient ), $view_slug ) ); } } } $search_params = $column_model_transient['search_params']; } } } } } // Load from cache $store_model_transient = ( ! empty( $this->store_col_model_transient_option_nm ) ) ? get_transient( $this->store_col_model_transient_option_nm ) : ''; if( ! empty( $store_model_transient ) && ! is_array( $store_model_transient ) ) { $store_model_transient = json_decode( $store_model_transient, true ); } // Code to move the column transients at user meta level // since v5.0.0 if ( empty( $column_model_transient ) && ( empty( $this->req_params['isTasks'] ) ) ) { $key = 'sm_beta_' . $current_user->user_email . '_' . $this->dashboard_key; $column_model_transient = get_option( $key ); if ( ! empty( $column_model_transient ) && ( ! empty( $this->store_col_model_transient_option_nm ) )) { update_user_meta( get_current_user_id(), $this->store_col_model_transient_option_nm, $column_model_transient ); delete_option( $key ); } } if ( empty( $column_model_transient ) && ( empty( $this->req_params['isTasks'] ) ) ) { //for getting the old structure $column_model_transient = get_transient( 'sa_sm_' . $current_user->user_email . '_' . $this->dashboard_key ); if ( ! empty( $column_model_transient ) ) { delete_transient( 'sa_sm_' . $current_user->user_email . '_' . $this->dashboard_key ); } } if( !empty( $column_model_transient ) && !empty( $column_model_transient['tables'] ) ) { //for porting the old structure $saved_col_model = $column_model_transient; $column_model_transient = sa_sm_generate_column_state( $saved_col_model ); if( empty( $store_model_transient ) ) { $store_model_transient = $saved_col_model; } } //Check if upgrading from old mapping if( false !== $store_model_transient ) { if( empty( $store_model_transient['columns'][0]['data'] ) || false === get_option( '_sm_update_414' ) || false === get_option( '_sm_update_419'.'_'.$this->dashboard_key ) ) { if( ! empty( $store_model_transient['columns'] ) ) { foreach( $store_model_transient['columns'] as $col ) { if( empty( $col['src'] ) ){ continue; } $old_col_model[ $col['src'] ] = $col; } } delete_transient( 'sa_sm_'.$this->dashboard_key ); if( false === get_option( '_sm_update_414' ) ) { update_option( '_sm_update_414', 1, 'no' ); } if( false === get_option( '_sm_update_419'.'_'.$this->dashboard_key ) ) { update_option( '_sm_update_419'.'_'.$this->dashboard_key, 1, 'no' ); } } if( false === get_option( '_sm_update_411' ) ) { //Code for handling mapping changes in v4.1.1 foreach( $store_model_transient['columns'] as $key => $col ) { if( $this->dashboard_key == 'user' && !empty( $col['col_name'] ) && $col['col_name'] == 'wp_capabilities' ) { $store_model_transient['columns'][$key]['col_name'] = $wpdb->prefix.'capabilities'; } if( $this->dashboard_key == 'product' && !empty( $col['col_name'] ) && $col['col_name'] == 'post_name' ) { $store_model_transient['columns'][$key]['key'] = $store_model_transient['columns'][$key]['name_display'] = __('Slug', 'smart-manager-for-wp-e-commerce'); } if( !empty( $col['col_name'] ) && $col['col_name'] == 'post_excerpt' ) { $store_model_transient['columns'][$key]['type'] = $store_model_transient['columns'][$key]['editor'] = 'sm.longstring'; } } if( !empty( $store_model_transient['sort_params'] ) ) { if( $store_model_transient['sort_params']['orderby'] == 'ID' && $store_model_transient['sort_params']['order'] == 'DESC' ) { $store_model_transient['sort_params']['default'] = true; } } delete_transient( 'sa_sm_'.$this->dashboard_key ); update_option( '_sm_update_411', 1, 'no' ); } if( false === get_option( '_sm_update_415' ) ) { //Code for handling mapping changes in v4.1.1 $add_view_col = true; foreach( $store_model_transient['columns'] as $key => $col ) { if( $this->dashboard_key == 'product' && !empty( $col['col_name'] ) && $col['col_name'] == 'product_shop_url' ) { unset( $store_model_transient['columns'][$key] ); $store_model_transient['columns'] = array_values($store_model_transient['columns']); } if( !empty( $col['data'] ) && $col['data'] == 'custom_view_link' ) { $add_view_col = false; } } if( !empty( $add_view_col ) ) { $link_type = ( !empty( $this->req_params['is_public'] ) ) ? 'view' : 'edit'; $index = sizeof( $store_model_transient['columns'] ); $store_model_transient['columns'][$index] = array( 'src' => 'custom/link', 'data' => 'custom_'. $link_type .'_link', 'name' => ucwords($link_type), 'type' => 'text', 'renderer'=> 'html', 'frozen' => false, 'sortable' => false, 'exportable' => true, 'searchable' => false, 'editable' => false, 'batch_editable' => false, 'hidden' => true, 'allow_showhide' => true ); } delete_transient( 'sa_sm_'.$this->dashboard_key ); update_option( '_sm_update_415', 1, 'no' ); } if( false === get_option( '_sm_update_425' ) ) { //Code for handling mapping changes in v4.2.5 if( $this->dashboard_key == 'product' ) { foreach( $store_model_transient['columns'] as $key => $col ) { if( !empty( $col['data'] ) && $col['data'] == 'custom_product_attributes' ) { $store_model_transient['columns'][$key]['allow_showhide'] = true; $store_model_transient['columns'][$key]['exportable'] = true; } if( !empty( $col['data'] ) && $col['data'] == 'postmeta_meta_key__product_attributes_meta_value__product_attributes' ) { $store_model_transient['columns'][$key]['hidden']= true; $store_model_transient['columns'][$key]['allow_showhide']= false; $store_model_transient['columns'][$key]['exportable']= false; } } delete_transient( 'sa_sm_'.$this->dashboard_key ); update_option( '_sm_update_425', 1, 'no' ); } } if( false === get_option( '_sm_update_426' ) ) { //Code for handling mapping changes in v4.2.6 if( $this->dashboard_key == 'shop_subscription' ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); update_option( '_sm_update_426', 1, 'no' ); } } if( false === get_option( '_sm_update_427' ) ) { //Code for handling mapping changes in v4.2.7 if( $this->dashboard_key != 'user' ) { foreach( $store_model_transient['columns'] as $key => $col ) { if( !empty( $col['col_name'] ) && $col['col_name'] == 'post_status' && empty( $col['colorCodes'] ) ) { if( $this->dashboard_key == 'shop_order' ) { $color_codes = array( 'green' => array( 'wc-completed', 'wc-processing' ), 'red' => array( 'wc-cancelled', 'wc-failed', 'wc-refunded' ), 'orange' => array( 'wc-on-hold', 'wc-pending' ) ); } else if( $this->dashboard_key == 'shop_subscription' ) { $color_codes = array( 'green' => array( 'wc-active' ), 'red' => array( 'wc-expired', 'wc-cancelled' ), 'orange' => array( 'wc-on-hold', 'wc-pending' ), 'blue' => array( 'wc-switched', 'wc-pending-cancel' ) ); } else { $color_codes = array(); } $store_model_transient['columns'][$key]['colorCodes'] = $color_codes; delete_transient( 'sa_sm_'.$this->dashboard_key ); update_option( '_sm_update_427', 1, 'no' ); } if( $this->dashboard_key == 'product' && !empty( $col['col_name'] ) && ( in_array($col['col_name'], array( '_stock_status', '_backorders' )) ) && empty( $col['colorCodes'] ) ) { if( $col['col_name'] == '_stock_status' ) { $color_codes = array( 'green' => array( 'instock' ), 'red' => array( 'outofstock' ), 'blue' => array( 'onbackorder' ) ); } else { $color_codes = array( 'green' => array( 'yes', 'notify' ), 'red' => array( 'no' ), 'blue' => array() ); } $store_model_transient['columns'][$key]['colorCodes'] = $color_codes; delete_transient( 'sa_sm_'.$this->dashboard_key ); update_option( '_sm_update_427', 1, 'no' ); } } } } if( false === get_option( '_sm_update_4210'.'_'.$this->dashboard_key ) ) { //Code for handling mapping changes in v4.2.10 if( $this->dashboard_key == 'shop_order' ) { $custom_columns = array( 'shipping_method', 'coupons_used', 'line_items', 'details' ); foreach( $store_model_transient['columns'] as $key => $col ) { $data = ( !empty( $col['data'] ) ) ? substr( $col['data'], 7 ) : ''; if( !empty( $data ) && in_array( $data , $custom_columns ) ) { $store_model_transient['columns'][$key]['editor'] = false; } } delete_transient( 'sa_sm_'.$this->dashboard_key ); } else if( $this->dashboard_key == 'product' ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); } else if( $this->dashboard_key == 'wc_booking' ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); } else if( $this->dashboard_key == 'wc_membership_plan' ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); } else if( $this->dashboard_key == 'wc_user_membership' ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); } update_option( '_sm_update_4210'.'_'.$this->dashboard_key, 1, 'no' ); } // Have to delete transient of those dashboard which are having atleaset on zero_one checkbox model because checkedtemplate & uncheckedtemplate logic is swapped in version 4.2.11 if( false === get_option( '_sm_update_4211'.'_'.$this->dashboard_key ) ) { //Code for handling mapping changes in v4.2.11 $is_checkbox = false; if ( ! empty( $store_model_transient['columns'] ) ) { foreach( $store_model_transient['columns'] as $key => $col ) { if ( ! empty( $col['type'] ) && 'checkbox' === $col['type'] && isset( $col['checkedTemplate'] ) && absint( $col['checkedTemplate'] ) === 0 ) { $is_checkbox = true; break; } } } if ( true === $is_checkbox ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); } update_option( '_sm_update_4211'.'_'.$this->dashboard_key, 1, 'no' ); } if( false === get_option( '_sm_update_44'.'_'.$this->dashboard_key ) ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); update_option( '_sm_update_44'.'_'.$this->dashboard_key, 1, 'no' ); } if( false === get_option( '_sm_update_442_users' ) ) { delete_transient( 'sa_sm_users' ); update_option( '_sm_update_442_users', 1, 'no' ); } if( false === get_option( '_sm_update_443_product' ) ) { delete_transient( 'sa_sm_product' ); update_option( '_sm_update_443_product', 1, 'no' ); } if( false === get_option( '_sm_update_461'.'_'.$this->dashboard_key ) ) { //Code for handling date cols mapping changes in v4.6.1 $date_cols = array( 'posts_post_date', 'posts_post_date_gmt', 'posts_post_modified', 'posts_post_modified_gmt' ); foreach( $store_model_transient['columns'] as $key => $col ) { $data = ( !empty( $col['data'] ) ) ? $col['data'] : ''; if( !empty( $data ) && in_array( $data , $date_cols ) ) { $display_name = $this->dashboard_title . ' '. ( ( strpos( $data, 'modified' ) !== false ) ? 'Modified' : 'Created' ) . ' Date' . ( ( strpos( $data, 'gmt' ) !== false ) ? ' GMT' : '' ); $store_model_transient['columns'][$key]['searchable'] = true; $store_model_transient['columns'][$key]['name'] = $display_name; $store_model_transient['columns'][$key]['key'] = $store_model_transient['columns'][$key]['name']; } } delete_transient( 'sa_sm_'.$this->dashboard_key ); update_option( '_sm_update_461'.'_'.$this->dashboard_key, 1, 'no' ); } if( false === get_option( '_sm_update_520'.'_'.$this->dashboard_key ) ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); update_option( '_sm_update_520'.'_'.$this->dashboard_key, 1, 'no' ); } if( false === get_option( '_sm_update_530_shop_order' ) ) { delete_transient( 'sa_sm_shop_order' ); update_option( '_sm_update_530_shop_order', 1, 'no' ); } if( false === get_option( '_sm_update_5110_users' ) ) { delete_transient( 'sa_sm_users' ); update_option( '_sm_update_5110_users', 1, 'no' ); } if( false === get_option( '_sm_update_5120_users' ) ) { delete_transient( 'sa_sm_users' ); update_option( '_sm_update_5120_users', 1, 'no' ); } if( false === get_option( '_sm_update_5120_product' ) ) { delete_transient( 'sa_sm_product' ); update_option( '_sm_update_5120_product', 1, 'no' ); } if( false === get_option( '_sm_update_5140'.'_'.$this->dashboard_key ) ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); update_option( '_sm_update_5140'.'_'.$this->dashboard_key, 1, 'no' ); } if( false === get_option( '_sm_update_5160'.'_'.$this->dashboard_key ) ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); update_option( '_sm_update_5160'.'_'.$this->dashboard_key, 1, 'no' ); } if( false === get_option( '_sm_update_5180'.'_'.$this->dashboard_key ) ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); update_option( '_sm_update_5180'.'_'.$this->dashboard_key, 1, 'no' ); } if( false === get_option( '_sm_update_5190'.'_'.$this->dashboard_key ) ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); $store_model_transient = false; update_option( '_sm_update_5190'.'_'.$this->dashboard_key, 1, 'no' ); } if( false === get_option( '_sm_update_5191'.'_'.$this->dashboard_key ) ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); $store_model_transient = false; update_option( '_sm_update_5191'.'_'.$this->dashboard_key, 1, 'no' ); } if( false === get_option( '_sm_update_5250_product' ) ) { delete_transient( 'sa_sm_product' ); update_option( '_sm_update_5250_product', 1, 'no' ); } if( false === get_option( '_sm_update_5260_product' ) ) { delete_transient( 'sa_sm_product' ); update_option( '_sm_update_5260_product', 1, 'no' ); } if( false === get_option( '_sm_update_600_user' ) ) { delete_transient( 'sa_sm_user' ); $store_model_transient = false; update_option( '_sm_update_600_user', 1, 'no' ); } if( false === get_option( '_sm_update_620'.'_'.$this->dashboard_key ) ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); $store_model_transient = false; update_option( '_sm_update_620'.'_'.$this->dashboard_key, 1, 'no' ); } if( false === get_option( '_sm_update_630'.'_'.$this->dashboard_key ) ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); $store_model_transient = false; update_option( '_sm_update_630'.'_'.$this->dashboard_key, 1, 'no' ); } if( false === get_option( '_sm_update_670_shop_order' ) ) { delete_transient( 'sa_sm_shop_order' ); $store_model_transient = false; update_option( '_sm_update_670_shop_order', 1, 'no' ); } if( false === get_option( '_sm_update_700'.'_'.$this->dashboard_key ) ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); $store_model_transient = false; update_option( '_sm_update_700'.'_'.$this->dashboard_key, 1, 'no' ); } if( false === get_option( '_sm_update_701'.'_'.$this->dashboard_key ) ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); $store_model_transient = false; update_option( '_sm_update_701'.'_'.$this->dashboard_key, 1, 'no' ); } if ( false === get_option( '_sm_update_740_user' ) ) { delete_transient( 'sa_sm_user' ); $store_model_transient = false; update_option( '_sm_update_740_user', 1, 'no' ); } if( false === get_option( '_sm_update_820'.'_'.$this->dashboard_key ) ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); $store_model_transient = false; update_option( '_sm_update_820'.'_'.$this->dashboard_key, 1, 'no' ); } if( false === get_option( '_sm_update_870'.'_'.$this->dashboard_key ) ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); $store_model_transient = false; update_option( '_sm_update_870'.'_'.$this->dashboard_key, 1, 'no' ); } if( false === get_option( '_sm_update_880'.'_'.$this->dashboard_key ) ) { delete_transient( 'sa_sm_' . $current_user->user_email . '_' . $this->dashboard_key . '_tasks' ); $store_model_transient = false; update_option( '_sm_update_880'.'_'.$this->dashboard_key, 1, 'no' ); } if ( ! empty( Smart_Manager::$sm_is_woo79 ) && ! empty( Smart_Manager::$sm_is_wc_hpos_tables_exists ) && false === get_option( '_sm_update_813_hpos_migrate' ) && ! empty( $GLOBALS['smart_manager_controller'] ) && $GLOBALS['smart_manager_controller'] instanceof Smart_Manager_Controller && is_callable( array( $GLOBALS['smart_manager_controller'], 'migrate_wc_orders_subscriptions_col_model' ) ) ) { $GLOBALS['smart_manager_controller']->migrate_wc_orders_subscriptions_col_model(); update_option( '_sm_update_813_hpos_migrate', 1, 'no' ); } if ( false === get_option( '_sm_update_8150_user' ) ) { delete_transient( 'sa_sm_user' ); $store_model_transient = false; update_option( '_sm_update_8150_user', 1, 'no' ); } if ( in_array( $this->dashboard_key, array( 'user', 'product' ) ) && ( false === get_option( '_sm_update_8160_' . $this->dashboard_key ) ) ) { delete_transient( 'sa_sm_' . $this->dashboard_key ); $store_model_transient = false; update_option( '_sm_update_8160_' . $this->dashboard_key, 1, 'no' ); } if ( false === get_option( '_sm_update_8190_product_stock_log' ) ) { delete_transient( 'sa_sm_product_stock_log_tasks' ); delete_user_meta( get_current_user_id(), 'sa_sm_product_stock_log_tasks' ); $store_model_transient = false; update_option( '_sm_update_8190_product_stock_log', 1, 'no' ); } if ( false === get_option( '_sm_update_8240_shop_coupon' ) ) { delete_transient( 'sa_sm_shop_coupon' ); $store_model_transient = false; update_option( '_sm_update_8240_shop_coupon', 1, 'no' ); } if ( false === get_option( '_sm_update_8250_product' ) ) { delete_transient( 'sa_sm_product' ); $store_model_transient = false; update_option( '_sm_update_8250_product', 1, 'no' ); } if ( false === get_option( '_sm_update_8260_product' ) ) { delete_transient( 'sa_sm_product' ); $store_model_transient = false; update_option( '_sm_update_8260_product', 1, 'no' ); } if ( false === get_option( '_sm_update_8340_product' ) ) { delete_transient( 'sa_sm_product' ); $store_model_transient = false; update_option( '_sm_update_8340_product', 1, 'no' ); } if ( false === get_option( '_sm_update_8360_product' ) ) { delete_transient( 'sa_sm_product' ); $store_model_transient = false; update_option( '_sm_update_8360_product', 1, 'no' ); } if ( false === get_option( '_sm_update_8390_product_stock_log' ) ) { delete_transient( 'sa_sm_product_stock_log_tasks' ); $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->usermeta} WHERE meta_key = %s", 'sa_sm_product_stock_log_tasks' ) ); $store_model_transient = false; update_option( '_sm_update_8390_product_stock_log', 1, 'no' ); } if ( in_array( $this->dashboard_key, array( 'shop_order', 'shop_subscription' ) ) && ( false === get_option( '_sm_update_8400_' . $this->dashboard_key ) ) ) { delete_transient( 'sa_sm_' . $this->dashboard_key ); $store_model_transient = false; update_option( '_sm_update_8400_' . $this->dashboard_key, 1, 'no' ); } if ( in_array( $this->dashboard_key, array( 'shop_order', 'shop_subscription' ) ) && ( false === get_option( '_sm_update_8410_' . $this->dashboard_key ) ) ) { delete_transient( 'sa_sm_' . $this->dashboard_key ); $store_model_transient = false; update_option( '_sm_update_8410_' . $this->dashboard_key, 1, 'no' ); } if ( in_array( $this->dashboard_key, array( 'shop_order', 'shop_subscription' ) ) && ( false === get_option( '_sm_update_8430_' . $this->dashboard_key ) ) ) { delete_transient( 'sa_sm_' . $this->dashboard_key ); $store_model_transient = false; update_option( '_sm_update_8430_' . $this->dashboard_key, 1, 'no' ); } } $store_model = $store_model_transient; // Valid cache not found if ( false === $store_model ) { $load_default_store_model = apply_filters('sm_beta_load_default_store_model', true); if( ! empty( $load_default_store_model ) ){ $this->get_default_store_model(); } //Filter to modify the default dashboard model $this->default_store_model = apply_filters('sm_default_dashboard_model', $this->default_store_model); $store_model = ( !empty( $this->default_store_model ) ) ? $this->default_store_model : array(); if( ! empty( $store_model['columns'] ) ){ foreach ($store_model['columns'] as $key => $value) { $store_model['columns'][$key]['save_state'] = true; } } } //Filter to modify the dashboard model $store_model = apply_filters('sm_dashboard_model', $store_model, $store_model_transient); //Code for porting to new mapping if( !empty($old_col_model) ) { $new_col_model = $store_model['columns']; foreach( $new_col_model as $index => $new_col ) { if( !empty( $new_col['src'] ) && !empty( $old_col_model[$new_col['src']] ) ) { $new_col_model[$index]['width'] = 80; $new_col_model[$index]['width'] = ( !empty( $old_col_model[$new_col['src']]['width'] ) ) ? $old_col_model[$new_col['src']]['width'] : $new_col_model[$index]['width']; $new_col_model[$index]['hidden'] = ( !empty( $old_col_model[$new_col['src']]['hidden'] ) ) ? $old_col_model[$new_col['src']]['hidden'] : $new_col_model[$index]['hidden']; //Code for posting the column position if( !isset( $old_col_model[$new_col['src']]['position'] ) && isset( $new_col_model[$index]['position'] ) ) { //unset the position if not there unset( $new_col_model[$index]['position'] ); } else if( isset( $old_col_model[$new_col['src']]['position'] ) ) { $new_col_model[$index]['position'] = $old_col_model[$new_col['src']]['position']; } } } $store_model['columns'] = $new_col_model; } //code to show/hide columns as per stored transient only if atleast one column is enabled if( !empty( $column_model_transient ) && ! empty( $column_model_transient['columns'] ) ) { $store_model = $this->map_column_to_store_model( $store_model, $column_model_transient ); } else { //for setting the custom column dashboard transient for the user $column_model_transient = sa_sm_generate_column_state( $store_model ); } //Code for re-arranging the columns in the final column model based on the set position $final_column_model = (!empty($store_model['columns'])) ? $final_column_model = &$store_model['columns'] : ''; if (!empty($final_column_model)) { $priority_columns = array(); foreach ($final_column_model as $key => &$column_model) { //checking for multilist datatype if (!empty($column_model['type']) && $column_model['type'] == 'sm.multilist') { $col_exploded = (!empty($column_model['src'])) ? explode("/", $column_model['src']) : array(); if ( sizeof($col_exploded) > 2) { $col_meta = explode("=",$col_exploded[1]); $col_nm = $col_meta[1]; } else { $col_nm = $col_exploded[1]; } $column_model['values'] = (!empty($this->terms_val_parent[$col_nm])) ? $this->terms_val_parent[$col_nm] : $column_model['values']; } if( !isset( $column_model['position']) ) continue; $priority_columns[] = $column_model; unset( $final_column_model[$key] ); } if ( !empty($priority_columns) || !empty( $final_column_model ) ) { usort( $priority_columns, "sm_position_compare" ); //code for sorting as per the position $final_column_model = array_values($final_column_model); foreach ($final_column_model as $col_model) { $priority_columns[] = $col_model; } ksort($priority_columns); $store_model['columns'] = $priority_columns; } } // Valid cache not found if ( ( ! empty( $this->store_col_model_transient_option_nm ) ) && false === get_transient( $this->store_col_model_transient_option_nm ) ) { set_transient( $this->store_col_model_transient_option_nm, wp_json_encode( $store_model ), WEEK_IN_SECONDS ); } if ( ( ! empty( $this->store_col_model_transient_option_nm ) ) && empty( get_user_meta( get_current_user_id(), $this->store_col_model_transient_option_nm, true ) ) ) { update_user_meta( get_current_user_id(), $this->store_col_model_transient_option_nm, $column_model_transient ); } // Code to handle display of 'trash' value for 'post_status' -- not to be saved in transient if( ! empty( $this->is_show_trash_records() ) && 'user' !== $this->dashboard_key ) { foreach( $store_model['columns'] as $key => $col ) { if( ! empty( $col['col_name'] ) && 'post_status' === $col['col_name'] ){ $store_model['columns'][$key]['values']['trash'] = __( 'Trash', 'smart-manager-for-wp-e-commerce' ); $store_model['columns'][$key]['selectOptions']['trash'] = __( 'Trash', 'smart-manager-for-wp-e-commerce' ); $store_model['columns'][$key]['search_values'][] = array( 'key' => 'trash', 'value' => __( 'Trash', 'smart-manager-for-wp-e-commerce' ) ); // Code for handling color code for 'trash' if enabled if( ! empty( $store_model['columns'][$key]['colorCodes'] ) ){ if( ! is_array( $store_model['columns'][$key]['colorCodes']['red'] ) ){ $store_model['columns'][$key]['colorCodes']['red'] = array(); } $store_model['columns'][$key]['colorCodes']['red'][] = 'trash'; } break; } } } do_action('sm_dashboard_model_saved'); if( ! empty( $search_params ) ) { $store_model['search_params'] = $search_params; } if( !$return_store_model ) { wp_send_json( $store_model ); } else { return $store_model; } } public function process_search_cond($params = array()) { global $wpdb, $wp_version; if( empty($params) || empty($params['search_query']) ) { return; } $rule_groups = ( ! empty( $params['search_query'] ) ) ? $params['search_query'][0]['rules'] : array(); if( empty( $rule_groups ) ) { return; } $wpdb->query("DELETE FROM {$wpdb->base_prefix}sm_advanced_search_temp"); // query to reset advanced search temp table $advanced_search_query = array(); $i = 0; $search_cols_type = ( ! empty( $params['search_cols_type'] ) ) ? $params['search_cols_type'] : array(); $non_flat_table_types = ( ! empty( $this->advanced_search_table_types['meta'] ) ) ? array_merge( array( 'terms' ), array_keys( $this->advanced_search_table_types['meta'] ) ) : array( 'terms' ); foreach ( $rule_groups as $rule_group ) { if ( ! empty( $rule_group )) { $advanced_search_query[$i] = array(); if( ! empty( $this->advanced_search_table_types ) ){ if( ! empty( $this->advanced_search_table_types['flat'] ) ){ foreach( array_keys( $this->advanced_search_table_types['flat'] ) as $table ){ $advanced_search_query[$i]['cond_'. $table] = ''; } } if( ! empty( $non_flat_table_types ) ){ foreach( $non_flat_table_types as $table ){ $advanced_search_query[$i]['cond_'. $table] = ''; $advanced_search_query[$i]['cond_'. $table .'_col_name'] = ''; $advanced_search_query[$i]['cond_'. $table .'_col_value'] = ''; $advanced_search_query[$i]['cond_'. $table .'_operator'] = ''; } } } $rule_group = apply_filters('sm_before_search_string_process', $rule_group); $rules = ( ! empty( $rule_group['rules'] ) ) ? $rule_group['rules'] : array(); foreach( $rules as $rule ) { if( ! empty( $rule['type'] ) ) { $field = explode( '.', $rule['type'] ); $rule['table_name'] = ( ! empty( $field[0] ) ) ? $field[0] : ''; $rule['col_name'] = ( ! empty( $field[1] ) ) ? $field[1] : ''; } $search_col = (!empty($rule['col_name'])) ? $rule['col_name'] : ''; $selected_search_operator = (!empty($rule['operator'])) ? $rule['operator'] : ''; $search_operator = ( ! empty( $this->advance_search_operators[$selected_search_operator] ) ) ? $this->advance_search_operators[$selected_search_operator] : $selected_search_operator; $search_data_type = ( ! empty( $search_cols_type[$rule['type']] ) ) ? $search_cols_type[$rule['type']] : 'text'; $search_value = (isset($rule['value']) && $rule['value'] != "''") ? $rule['value'] : ( ( in_array( $search_data_type, array( "number", "numeric" ) ) ) ? "''" : ''); if( !empty( $params['data_col_params'] ) ) { $search_value = ( in_array( $search_col, $params['data_col_params']['data_cols_timestamp'] ) || in_array( $search_col, $params['data_col_params']['data_date_cols_timestamp'] ) || in_array( $search_col, $params['data_col_params']['data_time_cols_timestamp'] ) ) ? strtotime( $search_value ) : $search_value; // Added code to convert value to UTC for data which is displayed in site timezone $search_value = ( in_array( $search_col, $params['data_col_params']['data_cols_display_date_in_site_timezone'] ) ) ? sa_sm_get_utc_timestamp_from_site_date( $search_value ) : $search_value; } // Code to create advanced search condition $table_name = ( ! empty( $rule['table_name'] ) ) ? substr( $rule['table_name'], strlen( $wpdb->prefix ) ) : ''; if( empty( $table_name ) ){ continue; } if( 'terms' === $table_name && "''" === $search_value ){ // For handling taxonomy empty strings switch( $search_operator ){ case 'is': $search_operator = 'is not'; break; case 'is not': $search_operator = 'is'; break; } } $search_params = array('search_string' => $rule, 'search_col' => $search_col, 'search_operator' => $search_operator, 'search_data_type' => $search_data_type, 'search_value' => $search_value, 'selected_search_operator' => $selected_search_operator, 'SM_IS_WOO30' => (!empty($params['SM_IS_WOO30'])) ? $params['SM_IS_WOO30'] : '', 'post_type' => (!empty($params['post_type'])) ? $params['post_type'] : array()); if ( ! empty( $this->advanced_search_table_types['flat'] ) && in_array( $table_name, array_keys( $this->advanced_search_table_types['flat'] ) ) ) { $advanced_search_query[$i] = $this->create_flat_table_search_query( array( 'table_nm' => $table_name, 'search_query' => $advanced_search_query[$i], 'search_params' => $search_params, 'rule' => $rule ) ); } else if ( ! empty( $this->advanced_search_table_types['meta'] ) && in_array( $table_name, array_keys( $this->advanced_search_table_types['meta'] ) ) ) { $advanced_search_query[$i] = $this->create_meta_table_search_query( array( 'table_nm' => $table_name, 'search_query' => $advanced_search_query[$i], 'search_params' => array_merge( $search_params, array( 'is_meta_table' => true, 'pkey' => ( ! empty( $params['pkey'] ) ) ? $params['pkey'] : 'post_id', 'join_table' => ( ! empty( $params['join_table'] ) ) ? $params['join_table'] : 'posts', 'type' => ( ! empty( $params['type'] ) ) ? $params['type'] : 'post_type' ) ), 'rule' => $rule, ) ); } else if ( !in_array( $table_name, array_keys( $this->advanced_search_table_types['flat'] ) ) && 'terms' === $table_name ) { $advanced_search_query[$i] = $this->create_terms_table_search_query( array( 'search_query' => $advanced_search_query[$i], 'search_params' => $search_params, 'rule' => $rule ) ); } $advanced_search_query[$i] = apply_filters( 'sm_search_query_formatted', $advanced_search_query[$i], $search_params ); } if( ! empty( $advanced_search_query[$i] ) ){ foreach( $advanced_search_query[$i] as $key => $value ){ if ( ( is_array( $value ) ) || ( " && " !== substr( $value, -4 ) ) ) { continue; } $advanced_search_query[$i][$key] = ( ! empty( $value ) ) ? substr( $value, 0, -4 ) : ''; } } } $i++; } //Code for handling advanced search conditions if( ! empty( $advanced_search_query ) ) { $index_search_string = 1; // index to keep a track of flags in the advanced search temp $search_params = array(); foreach( $advanced_search_query as &$advanced_search_query_string ) { $this->previous_cond_has_results = true; foreach( $advanced_search_query_string as $key => $value ){ if( empty( $value ) ){ continue; } $key = substr( $key, strlen( 'cond_' ) ); $search_vals = ( ! empty( $advanced_search_query_string[ 'cond_'. $key . '_col_vals'] ) ) ? $advanced_search_query_string[ 'cond_'. $key . '_col_vals'] : array(); $selected_search_operators = ( ! empty( $advanced_search_query_string[ 'cond_'. $key . '_selected_search_operators'] ) ) ? $advanced_search_query_string[ 'cond_'. $key . '_selected_search_operators'] : array(); $search_params = array( 'search_vals' => $search_vals, 'selected_search_operators' => $selected_search_operators ); if ( ! empty( $this->advanced_search_table_types['flat'] ) && in_array( $key, array_keys( $this->advanced_search_table_types['flat'] ) ) ) { $this->process_flat_table_search_query( array_merge( $params, array( 'search_query' => $advanced_search_query_string, 'search_query_index' => $index_search_string, 'table_nm' => $key, 'key_col' => $this->advanced_search_table_types['flat'][$key] ), $search_params ) ); } else if ( ! empty( $this->advanced_search_table_types['meta'] ) && in_array( $key, array_keys( $this->advanced_search_table_types['meta'] ) ) ) { $this->process_meta_table_search_query( array_merge( $params, array( 'search_query' => $advanced_search_query_string, 'search_query_index' => $index_search_string, 'table_nm' => $key, 'meta_key_col' => $this->advanced_search_table_types['meta'][$key] ), $search_params ) ); } else if ( !in_array( $key, array_keys( $this->advanced_search_table_types['flat'] ) ) && 'terms' === $key ) { $this->process_terms_table_search_query( array_merge( $params, array( 'search_query' => $advanced_search_query_string, 'search_query_index' => $index_search_string ), $search_params ) ); } } $index_search_string++; } } do_action( 'sm_advanced_search_processing_complete' ); //action for doing any post processing work } /** * Function to get the data model for the dashboard. * @param array $col_model column model array. * @return array $data_model updated data model array. */ public function get_data_model( $col_model = array() ) { global $wpdb, $current_user; $data_model = array(); $is_view = ( ! empty ( $this->req_params['is_view'] ) ) ? $this->req_params['is_view'] : ''; $dashboard_type = ( ! empty( $this->req_params['is_taxonomy'] ) ) ? 'taxonomy' : 'post_type'; $dashboard_type = ( ! empty( $is_view ) ) ? 'view' : $dashboard_type; $dashboard_slug = ( ! empty ( $this->req_params['active_module'] ) ) ? $this->req_params['active_module'] : ''; $view_slug = ( ! empty ( $this->req_params['active_view'] ) ) ? $this->req_params['active_view'] : ''; $slug = ( ! empty( $is_view ) ) ? $view_slug : $dashboard_slug; if ( ! empty( $dashboard_type ) ) { // Code to update the recent accessed dashboards sa_sm_update_recent_dashboards( ( ( 'taxonomy' === $dashboard_type ) ? 'taxonomies' : $dashboard_type.'s' ), $slug ); // code to update recently accessed dashboard type update_user_meta( get_current_user_id(), 'sa_sm_recent_dashboard_type', $dashboard_type ); } $column_model_transient = ( ! empty( $this->store_col_model_transient_option_nm ) ) ? get_user_meta( get_current_user_id(), $this->store_col_model_transient_option_nm, true ) : array(); // Code for handling views $is_view_contain_search_params = false; if( ( defined('SMPRO') && true === SMPRO ) && ! empty( $this->req_params['is_view'] ) && ! empty( $this->req_params['active_view'] ) ) { if( class_exists( 'Smart_Manager_Pro_Views' ) ) { $view_obj = Smart_Manager_Pro_Views::get_instance(); if( is_callable( array( $view_obj, 'get' ) ) ){ $view_slug = $this->req_params['active_view']; $view_data = $view_obj->get($view_slug); if( ! empty( $view_data ) ) { $this->dashboard_key = $view_data['post_type']; $column_model_transient = get_user_meta(get_current_user_id(), 'sa_sm_'.$view_slug, true); $column_model_transient = json_decode( $view_data['params'], true ); if( !empty( $column_model_transient['search_params'] ) ) { if( ! empty( $column_model_transient['search_params']['isAdvanceSearch'] ) && "true" == $column_model_transient['search_params']['isAdvanceSearch'] ) { // For advanced search if( ! empty( $column_model_transient['search_params']['params'] ) && is_array( $column_model_transient['search_params']['params'] ) ) { // array_walk( // $column_model_transient['search_params']['params'], // function ( &$value ) { // $value = ( ! empty( $value ) ) ? addslashes( json_encode( $value ) ) : ''; // } // ); $this->req_params['advanced_search_query'] = addslashes( json_encode( $column_model_transient['search_params']['params']) ); $is_view_contain_search_params = ( ! empty( $this->req_params['advanced_search_query'] ) && '[]' !== $this->req_params['advanced_search_query'] ) ? true : $is_view_contain_search_params; } } else { //for simple search $this->req_params['search_text'] = $column_model_transient['search_params']['params']; $is_view_contain_search_params = ( ! empty( $this->req_params['search_text'] ) ) ? true : $is_view_contain_search_params; } } } } } } // code for assigning the sort params if( ! empty( $column_model_transient ) && empty( $this->req_params['sort_params'] ) ){ $this->req_params['sort_params'] = ( ! empty( $column_model_transient['sort_params'] ) ) ? $column_model_transient['sort_params'] : array(); } $store_model_transient = ( ! empty( $this->store_col_model_transient_option_nm ) ) ? get_transient( $this->store_col_model_transient_option_nm ) : ''; if( ! empty( $store_model_transient ) && !is_array( $store_model_transient ) ) { $store_model_transient = json_decode( $store_model_transient, true ); } else { $store_model_transient = $this->get_dashboard_model( true ); } if( !empty( $column_model_transient ) && !empty( $store_model_transient ) ) { $store_model_transient = $this->map_column_to_store_model( $store_model_transient, $column_model_transient ); } $col_model = ( ! empty( $this->req_params[ 'columnsToBeExported' ] ) && ! empty( $col_model ) && is_array( $col_model ) ) ? $col_model : ( ( ! empty( $store_model_transient['columns'] ) ) ? $store_model_transient['columns'] : array() ); $required_cols = apply_filters('sm_required_cols', array()); $load_default_data_model = apply_filters('sm_beta_load_default_data_model', true); //Code for getting the relevant columns $data_cols_dropdown = array(); $data_cols_multilist = array(); $data_cols_longstring = array(); $data_cols_serialized = array(); $data_cols_checkbox = array(); $data_cols_unchecked_template = array(); $data_cols_timestamp = array(); $data_date_cols_timestamp = array(); $data_time_cols_timestamp = array(); $data_cols_display_date_in_site_timezone = array(); $data_cols_datetime = array(); $data_cols_multi_select2 = array(); $numeric_postmeta_cols_decimal_places = array(); $view_edit_cols = array( 'custom_view_link', 'custom_edit_link' ); $data_cols = array('ID'); $postmeta_cols = array(); $numeric_postmeta_cols = array(); $image_postmeta_cols = array(); $multiple_image_postmeta_cols = array(); $terms_visible_cols = array(); $visible_cols = array(); //array for all visible cols $search_cols_type = array(); //array for col & its type for advanced search if (!empty($col_model)) { foreach ($col_model as $col) { $validator = ( !empty( $col['validator'] ) ) ? $col['validator'] : ''; $type = ( !empty( $col['type'] ) ) ? $col['type'] : ''; if( ! empty( $col['table_name'] ) && ! empty( $col['col_name'] ) ){ // added $validator condition for spl cols like '_regular_price', '_sale_price', etc. $search_cols_type[ $col['table_name'] .'.'. $col['col_name'] ] = ( ( "customNumericTextEditor" === $validator && "text" == $type ) || ( ! empty( $col['date_type'] ) && 'timestamp' === $col['date_type'] ) ) ? 'numeric' : $type; $search_cols_type[ $col['table_name'] .'.'. $col['col_name'] ] = ( ! empty( $col['search_type'] ) ) ? $col['search_type'] : $search_cols_type[ $col['table_name'] .'.'. $col['col_name'] ]; //Code to handle sp. search data type passed for any col } if( !empty( $col['hidden'] ) && !empty( $col['data'] ) && array_search($col['data'], $required_cols) === false ) { continue; } $col_exploded = (!empty($col['src'])) ? explode("/", $col['src']) : array(); if (empty($col_exploded)) continue; $visible_cols[] = $col; if ( sizeof($col_exploded) > 2) { $col_meta = explode("=",$col_exploded[1]); $col_nm = $col_meta[1]; } else { $col_nm = $col_exploded[1]; } $editor = ( !empty( $col['editor'] ) ) ? $col['editor'] : ''; $data_cols[] = ( in_array( $col['data'], $view_edit_cols ) ) ? $col['data'] : $col_nm; if( !empty( $col_exploded[0] ) && $col_exploded[0] == 'postmeta' && $col_nm != 'post_id' ) { $postmeta_cols[] = $col_nm; if( ( $type == 'number' || $type == 'numeric' || $validator == 'customNumericTextEditor' ) && 'sm.image' !== $type ) { if( isset( $col['decimalPlaces'] ) ) { $numeric_postmeta_cols_decimal_places[ $col_nm ] = $col['decimalPlaces']; } $numeric_postmeta_cols[] = $col_nm; } if( 'sm.image' === $type ){ $image_postmeta_cols[] = $col_nm; } else if( 'sm.multipleImage' === $type ){ $multiple_image_postmeta_cols[] = $col_nm; } } // Code for storing the serialized cols if( $type == 'sm.serialized' ) { $data_cols_serialized[] = $col_nm; if( $editor == 'text' ) { $data_cols_serialized_text_editor[ $col_nm ] = ( !empty( $col['separator'] ) ? $col['separator'] : ',' ); } } if( $type == 'sm.longstring' ) { $data_cols_longstring[] = $col_nm; } else if( $type == 'sm.multilist' ) { $data_cols_multilist[] = $col_nm; } else if( $editor == 'select2' && !empty( $col['select2Options']['multiple'] ) ) { $data_cols_multi_select2[ $col['data'] ] = ( !empty( $col['separator'] ) ? $col['separator'] : '' ); } else if( $type == 'dropdown' ) { $data_cols_dropdown[] = $col_nm; } else if( $type == 'checkbox' ) { $data_cols_checkbox[] = $col_nm; if( !empty( $col['uncheckedTemplate'] ) ) { $data_cols_unchecked_template[$col_nm] = $col['uncheckedTemplate']; } } else if( $type == 'sm.datetime' && !empty( $col['date_type'] ) && $col['date_type'] == 'timestamp' ) { $data_cols_timestamp[] = $col_nm; } else if( $type == 'sm.date' && !empty( $col['date_type'] ) && $col['date_type'] == 'timestamp' ) { $data_date_cols_timestamp[] = $col_nm; } else if( $type == 'sm.time' && !empty( $col['date_type'] ) && $col['date_type'] == 'timestamp' ) { $data_time_cols_timestamp[] = $col_nm; } else if( $type == 'sm.datetime' && empty( $col['date_type'] ) ) { $data_cols_datetime[] = $col_nm; } // Code for saving the taxonomy names if ($col_exploded[0] == 'terms' && $col_nm != 'object_id' ) { $terms_visible_cols[$col_nm] = ( ! empty( $col['values'] ) ) ? $col['values'] : array(); } if( ! empty( $col['is_display_date_in_site_timezone'] ) ){ $data_cols_display_date_in_site_timezone[] = $col_nm; } } } // Code for setting limit & offset $start = (!empty($this->req_params['start'])) ? $this->req_params['start'] : 0; $limit = ( ! empty( $this->req_params['cmd'] ) && 'get_export_csv' === $this->req_params['cmd'] && ( ! empty( $this->req_params['storewide_option'] ) ) ) ? -1 : ( ( ! empty( $this->req_params['sm_limit'] ) ) ? $this->req_params['sm_limit'] : 50 ); $current_page = (!empty($this->req_params['sm_page'])) ? $this->req_params['sm_page'] : '1'; $start_offset = ($current_page > 1) ? (($current_page - 1) * $limit) : $start; $data_col_params = array( 'limit' => $limit, 'offset' => $start_offset, 'current_page' => $current_page, 'data_cols' => $data_cols, 'required_cols' => $required_cols, 'data_cols_serialized' => $data_cols_serialized, 'data_cols_longstring' => $data_cols_longstring, 'data_cols_multilist' => $data_cols_multilist, 'data_cols_dropdown' => $data_cols_dropdown, 'data_cols_checkbox' => $data_cols_checkbox, 'data_cols_timestamp' => $data_cols_timestamp, 'data_date_cols_timestamp' => $data_date_cols_timestamp, 'data_time_cols_timestamp' => $data_time_cols_timestamp, 'data_cols_display_date_in_site_timezone' => $data_cols_display_date_in_site_timezone, 'data_cols_datetime' => $data_cols_datetime, 'data_cols_multi_select2' => $data_cols_multi_select2, 'data_cols_numeric_decimal_places' => $numeric_postmeta_cols_decimal_places, 'col_model' => $col_model, 'search_cols_type' => $search_cols_type, 'visible_cols' => $visible_cols, 'terms_visible_cols' => $terms_visible_cols, 'advance_search_operators' => $this->advance_search_operators ); if( $load_default_data_model ) { //condition to skip the default data model $this->req_params['table_model'] = ( empty( $this->req_params['table_model'] ) && ! empty( $store_model_transient['tables'] ) ) ? $store_model_transient['tables'] : $this->req_params['table_model']; $post_cond = (!empty($this->req_params['table_model']['posts']['where'])) ? $this->req_params['table_model']['posts']['where'] : array('post_type' => $this->dashboard_key, 'post_status' => 'any' ); $meta_query = (!empty($this->req_params['table_model']['postmeta']['where'])) ? $this->req_params['table_model']['postmeta']['where'] : ''; $tax_query = (!empty($this->req_params['table_model']['terms']['where'])) ? $this->req_params['table_model']['terms']['where'] : ''; // Condition to handle display of 'trash' records if( ! empty( $this->is_show_trash_records() ) && ! empty( $post_cond['post_status'] ) ){ $post_cond['post_status'] = ( ! is_array( $post_cond['post_status'] ) ) ? array( $post_cond['post_status'] ) : $post_cond['post_status']; $post_cond['post_status'] = array_merge( $post_cond['post_status'], array( 'trash' ) ); } //Code for advanced search $search = ""; $search_condn = ""; //Code to clear the advanced search temp table if( empty($this->req_params['advanced_search_query'])) { $wpdb->query("DELETE FROM {$wpdb->base_prefix}sm_advanced_search_temp"); delete_option('sm_advanced_search_query'); } // TODO: revise this code as per new advanced search // if( !empty($this->req_params['date_filter_query']) && ( defined('SMPRO') && true === SMPRO ) ) { // if( empty($this->req_params['search_query']) ) { // $this->req_params['search_query'] = array( $this->req_params['date_filter_query'] ); // } else { // $date_filter_array = json_decode(stripslashes($this->req_params['date_filter_query']),true); // foreach( $this->req_params['search_query'] as $key => $search_string_array ) { // $search_string_array = json_decode(stripslashes($search_string_array),true); // foreach( $date_filter_array as $date_filter ) { // $search_string_array[] = $date_filter; // } // $this->req_params['search_query'][$key] = addslashes(json_encode($search_string_array)); // } // } // } $sm_advanced_search_results_persistent = 0; // flag to handle persistent search results if ( ! empty( $this->req_params['table_model']['posts']['where']['post_type'] ) ) { $post_type = ( is_array( $this->req_params['table_model']['posts']['where']['post_type'] ) ) ? $this->req_params['table_model']['posts']['where']['post_type'] : array( $this->req_params['table_model']['posts']['where']['post_type'] ); } //Code fo handling advanced search functionality if( !empty( $this->req_params['advanced_search_query'] ) && $this->req_params['advanced_search_query'] != '[]' ) { $this->req_params['advanced_search_query'] = json_decode(stripslashes($this->req_params['advanced_search_query']), true); if (!empty($this->req_params['advanced_search_query'])) { $this->process_search_cond( array( 'post_type' => $post_type, 'search_query' => (!empty($this->req_params['advanced_search_query'])) ? $this->req_params['advanced_search_query'] : array(), 'SM_IS_WOO30' => (!empty($this->req_params['SM_IS_WOO30'])) ? $this->req_params['SM_IS_WOO30'] : '', 'search_cols_type' => $search_cols_type, 'data_col_params' => $data_col_params ) ); } } // Code for handling sorting of the postmeta $sort_params = $this->build_query_sort_params( array( 'sort_params' => $this->req_params['sort_params'], 'numeric_meta_cols' => $numeric_postmeta_cols, 'data_cols' => $data_cols ) ); //WP_Query to get all the relevant post_ids $args = array( 'posts_per_page' => $limit, 'offset' => $start_offset, 'meta_query' => array( $meta_query ), 'tax_query' => array( $tax_query ), 'orderby' => ( !empty( $sort_params['column_nm'] ) ? $sort_params['column_nm'] : '' ), 'order' => ( !empty( $sort_params['sortOrder'] ) ? $sort_params['sortOrder'] : '' ), 'sm_sort_params' => ( !empty( $sort_params ) ? $sort_params : array() ) ); $args = array_merge($args, $post_cond); $can_optimize_dashboard_speed = apply_filters( 'sm_can_optimize_dashboard_speed', false ); if ( ! empty( $can_optimize_dashboard_speed ) ) { $exclude_statuses = in_array( 'trash', (array) $post_cond['post_status'], true ) ? array( 'auto-draft' ) : array( 'trash', 'auto-draft' ); $join = apply_filters( 'sm_posts_join_paged', '', $sort_params ); $fields = apply_filters( 'sm_posts_fields', "{$wpdb->prefix}posts.*", $sort_params ); $where = "{$wpdb->prefix}posts.post_type IN (" . implode( ', ', array_fill( 0, count( $post_type ), '%s') ) . ") AND {$wpdb->prefix}posts.post_status NOT IN (" . implode( ', ', array_fill( 0, count( $exclude_statuses ), '%s') ) . ")"; $where_cond = apply_filters( 'sm_posts_where', $where ); $where = ( ! empty( $where_cond[ 'sql' ] ) ) ? " AND " . $where_cond[ 'sql' ] : ""; $params = array_merge( $post_type, $exclude_statuses ); $params = ( ! empty( $where_cond[ 'value' ] ) ) ? array_merge( $params, $where_cond[ 'value' ] ) : $params; $group_by = apply_filters( 'sm_posts_groupby', "{$wpdb->prefix}posts.ID" ); $group_by = ( ! empty( $group_by ) ) ? " GROUP BY " . $group_by : ""; $not_allowed_orderby_cols = array( 'meta_key' ); $order_by = ( ! empty( $sort_params['column_nm'] ) ) ? ( in_array( $sort_params['column_nm'], $not_allowed_orderby_cols ) ? "{$wpdb->prefix}posts.post_date " . $sort_params['sortOrder'] : '' ) : ''; $order_by = apply_filters( 'sm_posts_orderby', $order_by, array( 'sort_params' => $sort_params, 'start_offset' => $start_offset, 'limit' => $limit ) ); $order_by = ( ! empty( $order_by ) ) ? " ORDER BY " . $order_by : ""; $limits = ""; $placeholder_params = $params; if ( ( ! empty( $limit ) ) && ( -1 !== $limit ) ) { $limits = " LIMIT %d, %d"; $placeholder_params = array_merge( $params, array( $start_offset, $limit ) ); } $query = $wpdb->prepare( "SELECT $fields FROM {$wpdb->prefix}posts AS {$wpdb->prefix}posts $join WHERE 1=1 $where $group_by $order_by $limits ", $placeholder_params ); $posts_data = $wpdb->get_results( $query, ARRAY_A ); do_action( 'sm_found_posts', $query ); // To get total count. $total_count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(DISTINCT {$wpdb->prefix}posts.id) FROM {$wpdb->prefix}posts AS {$wpdb->prefix}posts $join WHERE 1=1 $where", $params ) ); } else { $result_posts = new WP_Query( $args ); $posts_data = $result_posts->posts; $total_count = $result_posts->found_posts; } // Code for saving the post_ids in case of simple search/advanced search. if ( ( defined('SMPRO') && true === SMPRO ) && ! empty( $this->req_params['search_text'] ) || ( ! empty($this->req_params['advanced_search_query'] ) && $this->req_params['advanced_search_query'] != '[]' ) ) { if ( ! empty( $can_optimize_dashboard_speed ) ) { $ids = $wpdb->get_col( $wpdb->prepare( "SELECT {$wpdb->prefix}posts.ID FROM {$wpdb->prefix}posts AS {$wpdb->prefix}posts $join WHERE 1=1 $where $group_by ORDER BY {$wpdb->prefix}posts.post_date DESC ", $params ) ); $ids = ( ( ! empty( $ids ) ) && is_array( $ids ) ) ? implode( ",", $ids ) : ''; } else { $search_query_args = array_merge( $args, array( 'posts_per_page' => -1, 'fields' => 'ids' ) ); unset( $search_query_args['offset'] ); $search_results = new WP_Query( $search_query_args ); $ids = implode( ",", $search_results->posts ); } set_transient( 'sa_sm_search_post_ids', $ids , WEEK_IN_SECONDS ); } $items = array(); $post_ids = array(); $index_ids = array(); $index = 0; $total_pages = 1; if ($total_count > $limit) { $total_pages = ceil($total_count/$limit); } if ( !empty( $posts_data ) ) { foreach ($posts_data as $key => $value) { $post = ( ! empty( $can_optimize_dashboard_speed ) ) ? $value : ( array ) $value; $id_val = ( ! empty( $can_optimize_dashboard_speed ) ) ? $value['ID'] : $value->ID; foreach ($post as $post_key => $post_value) { if ( is_array( $data_cols ) && !empty( $data_cols ) ) { if ( array_search( $post_key, $data_cols ) === false ) { continue; //cond for checking col in col model } } if ( is_array( $data_cols_checkbox ) && !empty( $data_cols_checkbox ) ) { if( array_search( $post_key, $data_cols_checkbox ) !== false && $post_value == '' ) { //added for bad_value checkbox $post_value = $data_cols_unchecked_template[$post_key]; } } if( is_array( $data_cols_serialized ) && !empty( $data_cols_serialized ) ) { if( in_array( $post_key, $data_cols_serialized ) ) { $post_value = maybe_unserialize( $post_value ); if( !empty( $post_value ) ) { $post_value = ( !empty( $data_cols_serialized_text_editor[$post_key] ) ) ? implode($data_cols_serialized_text_editor[$post_key], $post_value) : json_encode( $post_value ); } } } $key = 'posts_'.strtolower(str_replace(' ', '_', $post_key)); $items [$index][$key] = $post_value; } //Code for generating the view & edit links for the post if ( is_array( $data_cols ) && !empty( $data_cols ) ) { foreach( $view_edit_cols as $col ) { if ( array_search( $col, $data_cols ) ) { $link = ( 'custom_view_link' === $col ) ? get_permalink( $id_val ) : get_edit_post_link( $id_val, '' ); $items [$index]['custom_'. ( ( 'custom_view_link' === $col ) ? 'view' : 'edit' ) .'_link'] = ( !empty( $this->req_params['cmd'] ) && $this->req_params['cmd'] != 'get_export_csv' && $this->req_params['cmd'] != 'get_print_invoice' ) ? '' : $link; } } } $post_ids[] = $id_val; $index_ids[ $id_val ] = $index; $index++; } } //Code for getting the postmeta data if( !empty( $post_ids ) && !empty( $postmeta_cols ) ) { if( !empty( $items ) ) { //Code to create and initialize all the meta columns foreach ( $items as $key => $item ) { foreach ( $postmeta_cols as $col ) { $meta_key = 'postmeta_meta_key_'.$col.'_meta_value_'.$col; $meta_value = ''; //Code for handling checkbox data if( is_array( $data_cols_checkbox ) && !empty( $data_cols_checkbox ) && is_array( $data_cols_unchecked_template ) && !empty( $data_cols_unchecked_template ) ) { if( in_array( $col, $data_cols_checkbox ) && !empty( $data_cols_unchecked_template[ $col ] ) ) { //added for bad_value checkbox $meta_value = $data_cols_unchecked_template[ $col ]; } } $items [$key][$meta_key] = $meta_value; } } } $postmeta_data = array(); //TODO: Check Not working on client site if( count( $post_ids ) > 100 ) { $post_id_chunks = array_chunk( $post_ids, 100 ); foreach( $post_id_chunks as $id_chunk ){ $results = $wpdb->get_results( $wpdb->prepare( "SELECT post_id as post_id, meta_key AS meta_key, meta_value AS meta_value FROM {$wpdb->prefix}postmeta as prod_othermeta WHERE post_id IN (". implode(",",$id_chunk) .") AND meta_key IN ('". implode("','", $postmeta_cols) ."') AND 1=%d GROUP BY post_id, meta_key", 1 ), 'ARRAY_A' ); if( ! empty( $results ) ) { $postmeta_data = array_merge( $postmeta_data, $results ); } } } else { $postmeta_data = $wpdb->get_results( $wpdb->prepare( "SELECT post_id as post_id, meta_key AS meta_key, meta_value AS meta_value FROM {$wpdb->prefix}postmeta as prod_othermeta WHERE post_id IN (". implode(",",$post_ids) .") AND meta_key IN ('". implode("','", $postmeta_cols) ."') AND 1=%d GROUP BY post_id, meta_key", 1 ), 'ARRAY_A' ); } if( !empty( $postmeta_data ) ) { foreach( $postmeta_data as $data ) { $index = ( isset( $index_ids[$data['post_id']] ) ) ? $index_ids[$data['post_id']] : ''; if( '' === $index ) { continue; } $items [$index]['postmeta_post_id'] = $data['post_id']; $meta_key = ( isset( $data['meta_key'] ) ) ? $data['meta_key'] : ''; if( empty( $meta_key ) ) { continue; } if( !in_array( $data['meta_key'], $data_cols_checkbox ) ) { $meta_value = ( isset( $data['meta_value'] ) ) ? $data['meta_value'] : ''; } else { $meta_value = ( isset( $data['meta_value'] ) && $data['meta_value'] != '' ) ? $data['meta_value'] : $items[$key]['postmeta_meta_key_'.$meta_key.'_meta_value_'.$meta_key]; } //Code for handling serialized data if( is_array( $data_cols_serialized ) && !empty( $data_cols_serialized ) ) { if( in_array( $meta_key, $data_cols_serialized ) ) { $meta_value = maybe_unserialize( $meta_value ); if( !empty( $meta_value ) ) { $meta_value = ( !empty( $data_cols_serialized_text_editor[$meta_key] ) && ! empty( $meta_value ) && is_array( $meta_value ) ) ? implode($data_cols_serialized_text_editor[$meta_key], $meta_value) : json_encode( $meta_value ); } } } //Code for handling timestamp data if( ( is_array( $data_cols_timestamp ) && !empty( $data_cols_timestamp ) ) || ( is_array( $data_date_cols_timestamp ) && !empty( $data_date_cols_timestamp ) ) || ( is_array( $data_time_cols_timestamp ) && !empty( $data_time_cols_timestamp ) ) ) { if( ( in_array( $meta_key, $data_cols_timestamp ) || in_array( $meta_key, $data_date_cols_timestamp ) || in_array( $meta_key, $data_time_cols_timestamp ) ) && !empty( $meta_value ) && is_numeric( $meta_value ) ) { $format = 'Y-m-d H:i:s'; if( in_array( $meta_key, $data_date_cols_timestamp ) ) { $format = 'Y-m-d'; } else if ( in_array( $meta_key, $data_time_cols_timestamp ) ) { $format = 'H:i'; } $meta_value = ( in_array( $meta_key, $data_cols_display_date_in_site_timezone ) ) ? sa_sm_get_site_timestamp_from_utc_date( $meta_value ) : $meta_value; $date = new DateTime(); $date->setTimestamp($meta_value); $meta_value = $date->format($format); } } //Code for handling blank date values if( is_array( $data_cols_datetime ) && !empty( $data_cols_datetime ) ) { if( in_array( $meta_key, $data_cols_datetime ) && empty( $meta_value ) && is_numeric( $meta_value ) ) { $meta_value = '-'; } } // //Code for handling blank numeric fields // if( in_array( $meta_key, $numeric_postmeta_cols ) && ! isset( $numeric_postmeta_cols_decimal_places[$meta_key] ) ) { // $meta_value = ( ! empty( $meta_value ) ) ? $meta_value : 0; // } //Code for handling image fields if( in_array( $meta_key, $image_postmeta_cols ) ) { if( ! empty( $meta_value ) ){ $attachment = wp_get_attachment_image_url( $meta_value, 'full' ); $meta_value = ( ! empty( $attachment ) ) ? $attachment : ''; } } //Code for handling multiple image fields if( in_array( $meta_key, $multiple_image_postmeta_cols ) ) { if( ! empty( $meta_value ) ){ $image_ids = ( ! is_array( $meta_value ) ) ? explode( ",", $meta_value ) : array(); if( !empty( $image_ids ) ) { $meta_value = array(); $img_url = ''; foreach( $image_ids as $image_id ) { $img_url = wp_get_attachment_image_url( $image_id, 'full' ); $meta_value[] = ( !empty( $this->req_params['cmd'] ) && $this->req_params['cmd'] == 'get_export_csv' ) ? $img_url : array( 'id' => $image_id, 'val' => $img_url ); } } } } //Code for rounding of integer fields if( isset( $numeric_postmeta_cols_decimal_places[$meta_key] ) && !empty( $meta_value ) ) { $meta_value = round( intval( $meta_value ), intval( $numeric_postmeta_cols_decimal_places[$meta_key] ) ); } $meta_key = sanitize_title($meta_key); $meta_key = 'postmeta_meta_key_'.$meta_key.'_meta_value_'.$meta_key; $items [$index][$meta_key] = $meta_value; } } } // Handling multilist data. $items = $this->format_terms_data( array( 'items' => $items, 'terms_visible_cols' => $terms_visible_cols, 'data_cols_multilist' => $data_cols_multilist, 'data_cols_dropdown' => $data_cols_dropdown, 'ids' => $post_ids, 'id_name' => 'posts_id', 'postmeta_cols' => $postmeta_cols ) ); foreach( $items as $key => $item ) { //Code for handling multi-select2 columns foreach( $data_cols_multi_select2 as $col => $separator ) { if( isset( $item[ $col ] ) ) { if( !empty( $separator ) ) { $val = explode( $separator, $item[ $col ] ); } else { //for serialized strings $val = maybe_unserialize( $item[ $col ] ); } if( is_array( $val ) ) { $items[$key][ $col ] = implode(',', $val); } else { $items[$key][ $col ] = ''; } } } } $data_model ['items'] = (!empty($items)) ? $items : ''; $data_model ['start'] = $start+$limit; $data_model ['page'] = $current_page; $data_model ['total_pages'] = $total_pages; $data_model ['total_count'] = $total_count; } $data_model ['meta'] = array( 'is_view_contain_search_params' => $is_view_contain_search_params ); //added to pass any meta to FE //Filter to modify the data model $data_model = apply_filters( 'sm_data_model', $data_model, $data_col_params ); if( !empty( $this->req_params['cmd'] ) && ( $this->req_params['cmd'] == 'get_export_csv' || $this->req_params['cmd'] == 'get_print_invoice' ) ) { return $data_model; } else { wp_send_json( $data_model ); } } public function get_batch_update_copy_from_record_ids( $args = array() ) { global $wpdb; $data = array(); $dashboard_key = ( !empty( $args['dashboard_key'] ) ) ? $args['dashboard_key'] : $this->dashboard_key; $is_ajax = ( isset( $args['is_ajax'] ) ) ? $args['is_ajax'] : true; if( !empty( $dashboard_key ) || !empty( $this->req_params['table_model']['posts']['where']['post_type'] ) ) { $dashboards = ( !empty( $this->req_params['table_model']['posts']['where']['post_type'] ) && empty( $args['dashboard_key'] ) ) ? $this->req_params['table_model']['posts']['where']['post_type'] : $dashboard_key; $dashboards = ( is_array( $dashboards ) ) ? $dashboards : array( $dashboards ); $search_term = ( ! empty( $this->req_params['search_term'] ) ) ? $this->req_params['search_term'] : ( ( ! empty( $args['search_term'] ) ) ? $args['search_term'] : '' ); $select = apply_filters( 'sm_batch_update_copy_from_ids_select', "SELECT ID AS id, post_title AS title", $args ); $search_cond = ( ! empty( $search_term ) ) ? " AND ( id LIKE '%".$search_term."%' OR post_title LIKE '%".$search_term."%' OR post_excerpt LIKE '%".$search_term."%' ) " : ''; $search_cond_ids = ( !empty( $args['search_ids'] ) ) ? " AND id IN ( ". implode(",", $args['search_ids']) ." ) " : ''; $results = $wpdb->get_results( $select . " FROM {$wpdb->prefix}posts WHERE post_status != 'trash' ". $search_cond ." ". $search_cond_ids ." AND post_type IN ('". implode("','", $dashboards) ."') ", 'ARRAY_A' ); if( count( $results ) > 0 ) { foreach( $results as $result ) { $data[ $result['id'] ] = trim($result['title']); } } $data = apply_filters( 'sm_batch_update_copy_from_ids', $data ); } if( $is_ajax ){ wp_send_json( $data ); } else { return $data; } } public function save_state() { $slug = ( ! empty( $this->req_params['active_module'] ) ) ? $this->req_params['active_module'] : ''; $is_view = ( isset( $this->req_params['is_view'] ) ) ? $this->req_params['is_view'] : ''; if( ! empty( $slug ) && ! empty( $this->req_params['dashboard_states'] ) ) { // Code to update the dashboards column state foreach ($this->req_params['dashboard_states'] as $dashboard => $value) { $value = json_decode( stripslashes( $value ), true ); $column_model_transient = sa_sm_generate_column_state( $value ); if ( ( 1 !== intval( $is_view ) ) && ( ! empty( $this->store_col_model_transient_option_nm ) ) ) { update_user_meta( get_current_user_id(), $this->store_col_model_transient_option_nm, $column_model_transient ); } } // State saving for view should not be done. if( 1 === intval( $is_view ) ) { global $wpdb; $result = $wpdb->query( // phpcs:ignore $wpdb->prepare( // phpcs:ignore "UPDATE {$wpdb->prefix}sm_views SET params = %s WHERE slug = %s", wp_json_encode( $column_model_transient ), $slug ) ); } } if( ( defined('SMPRO') && true === SMPRO ) && isset( $this->req_params['edited_column_titles'] ) && is_callable( 'Smart_Manager_Pro_Base', 'update_column_titles' ) ){ $this->req_params['state_option_name'] = $this->store_col_model_transient_option_nm; Smart_Manager_Pro_Base::update_column_titles( $this->req_params ); } wp_send_json( array( 'ACK'=> 'Success' ) ); } // Function to reset the column state to default public function reset_state() { global $wpdb; $current_user_id = get_current_user_id(); $slug = ( ! empty( $this->req_params['active_module'] ) ) ? $this->req_params['active_module'] : ''; $is_view = ( isset( $this->req_params['is_view'] ) ) ? ( 1 === intval( $this->req_params['is_view'] ) ) : false; if( ! $is_view && ! empty( $slug ) ) { delete_user_meta( $current_user_id, 'sa_sm_'.$slug ); } else { $column_model_transient = array(); if( ! empty( $this->req_params['dashboard_key'] ) ) { $column_model_transient = get_user_meta( $current_user_id, 'sa_sm_'.$this->req_params['dashboard_key'], true); if( empty( $column_model_transient ) ) { $store_model_transient = get_transient( 'sa_sm_'.$this->req_params['dashboard_key'] ); if( ! empty( $store_model_transient ) && !is_array( $store_model_transient ) ) { $column_model_transient = sa_sm_generate_column_state( json_decode( $store_model_transient, true ) ); } } } if( ! empty( $column_model_transient ) ) { $result = $wpdb->query( // phpcs:ignore $wpdb->prepare( // phpcs:ignore "UPDATE {$wpdb->prefix}sm_views SET params = %s WHERE slug = %s", wp_json_encode( $column_model_transient ), $slug ) ); } } wp_send_json( array( 'ACK'=> 'Success' ) ); } public function inline_update() { global $wpdb, $current_user; $is_advanced_search = ( ( ! empty( $this->req_params['is_advanced_search'] ) ) && ( sanitize_text_field( $this->req_params['is_advanced_search'] ) === 'true' ) ) ? true : false; $edited_data = ( ! empty( $this->req_params['edited_data'] ) ) ? json_decode( stripslashes( $this->req_params['edited_data'] ), true ) : array(); $updated_edited_data = apply_filters( 'sm_filter_updated_edited_data', ( ! empty( $this->req_params['updatedEditedData'] ) ) ? json_decode( stripslashes( $this->req_params['updatedEditedData'] ), true ) : $edited_data ); $store_model_transient = $store_model_transient = get_transient( 'sa_sm_' . $this->dashboard_key ); $store_model_transient = ( ! empty( $store_model_transient ) && ! is_array( $store_model_transient ) ) ? json_decode( $store_model_transient, true ) : $this->get_dashboard_model( true ); $table_model = ( ! empty( $store_model_transient['tables'] ) ) ? $store_model_transient['tables'] : array(); $col_model = ( ! empty( $store_model_transient['columns'] ) ) ? $store_model_transient['columns'] : array(); if ( empty( $edited_data ) || empty( $table_model ) || empty( $col_model ) ) return; if ( is_callable( array( 'Smart_Manager_Task', 'task_update' ) ) && ( is_array( $updated_edited_data ) && ( ! empty( $updated_edited_data ) ) ) && ( ! empty( $this->req_params['title'] ) ) && ( ! empty( $this->dashboard_key ) ) ) { $this->task_id = Smart_Manager_Task::task_update( array( 'title' => $this->req_params['title'], 'created_date' => date( 'Y-m-d H:i:s' ), 'completed_date' => '0000-00-00 00:00:00', 'post_type' => $this->dashboard_key, 'type' => 'inline', 'status' => 'in-progress', 'actions' => array_values( $updated_edited_data ), 'record_count' => count( $updated_edited_data ) ) ); } $edited_data['task_id'] = intval( $this->task_id ); $edited_data = apply_filters( 'sm_inline_update_pre', $edited_data ); if ( true === array_key_exists( 'task_id', $edited_data ) ) { unset( $edited_data['task_id'] ); } $data_cols_serialized = array(); $data_cols_multiselect = array(); $data_cols_multiselect_val = array(); $data_cols_list = array(); $data_cols_list_val = array(); $data_cols_timestamp = array(); $data_date_cols_timestamp = array(); $data_time_cols_timestamp = array(); $date_cols_site_timezone = array(); $date_cols_utc_timezone = array(); $data_cols_checkbox = array(); $data_cols_numeric = array(); $numeric_cols_decimal_places = array(); $taxonomies = array(); $taxonomy_data_to_update = array(); //Code for storing the serialized cols foreach ($col_model as $col) { $col_exploded = (!empty($col['src'])) ? explode("/", $col['src']) : array(); if (empty($col_exploded)) continue; if ( sizeof($col_exploded) > 2) { $col_meta = explode("=",$col_exploded[1]); $col_nm = $col_meta[1]; } else { $col_nm = $col_exploded[1]; } if ( !empty( $col['type'] ) ) { if( $col['type'] == 'sm.serialized' ) { $data_cols_serialized[] = $col_nm; } elseif( $col['type'] == 'sm.multilist' ) { $data_cols_multiselect[] = $col_nm; $data_cols_multiselect_val[$col_nm] = (!empty($col['values'])) ? $col['values'] : array(); if (empty($data_cols_multiselect_val[$col_nm])) continue; $final_multiselect_val = array(); foreach ($data_cols_multiselect_val[$col_nm] as $key => $value) { if( ! empty( $value['term'] ) ) { $final_multiselect_val[$key] = $value['term']; } } $data_cols_multiselect_val[$col_nm] = $final_multiselect_val; } elseif ( $col['type'] == 'dropdown' ) { $data_cols_list[] = $col_nm; $data_cols_list_val[$col_nm] = (!empty($col['values'])) ? $col['values'] : array(); } else if( $col['type'] == 'sm.datetime' && !empty( $col['date_type'] ) && $col['date_type'] == 'timestamp' ) { $data_cols_timestamp[] = $col_nm; } else if( $col['type'] == 'sm.date' && !empty( $col['date_type'] ) && $col['date_type'] == 'timestamp' ) { $data_date_cols_timestamp[] = $col_nm; } else if( $col['type'] == 'sm.time' && !empty( $col['date_type'] ) && $col['date_type'] == 'timestamp' ) { $data_time_cols_timestamp[] = $col_nm; } else if( 'checkbox' === $col['type'] ) { $data_cols_checkbox[] = $col_nm; } else if( sizeof($col_exploded) <= 2 && ( 'number' === $col['type'] || 'numeric' === $col['type'] || ( ! empty( $col['validator'] ) && 'customNumericTextEditor' === $col['validator'] ) ) ){ if( isset( $col['decimalPlaces'] ) ) { $numeric_cols_decimal_places[ $col_nm ] = $col['decimalPlaces']; } $data_cols_numeric[] = $col_nm; } if( ($col['type'] == 'sm.datetime' || $col['type'] == 'sm.date') ) { if( ! empty( $col['is_utc'] ) ){ $date_cols_utc_timezone[] = $col_nm; } else if( ( isset($col['is_utc']) && false === $col['is_utc'] ) ){ $date_cols_site_timezone[] = $col_nm; } } } } $sm_default_inline_update = true; $data_col_params = array( 'data_cols_multiselect' => $data_cols_multiselect, 'data_cols_multiselect_val' => $data_cols_multiselect_val, 'data_cols_list' => $data_cols_list, 'data_cols_list_val' => $data_cols_list_val, 'data_cols_timestamp' => $data_cols_timestamp, 'data_date_cols_timestamp' => $data_date_cols_timestamp, 'data_time_cols_timestamp' => $data_time_cols_timestamp, 'col_model' => $col_model, 'data_cols_serialized' => $data_cols_serialized, 'data_cols_checkbox' => $data_cols_checkbox, 'data_cols_numeric' => $data_cols_numeric, 'numeric_cols_decimal_places' => $numeric_cols_decimal_places, 'task_id' => $this->task_id ); $sm_default_inline_update = apply_filters('sm_default_inline_update', $sm_default_inline_update); set_transient('sm_beta_skip_delete_dashboard_transients', 1, DAY_IN_SECONDS); // for preventing delete dashboard transients if( !empty($sm_default_inline_update) ) { $update_params_meta = array(); // for all tables with meta_key = meta_value like structure for updating the values $insert_params_meta = array(); // for all tables with meta_key = meta_value like structure for inserting the values $meta_data_edited = array(); $meta_index = 0; $old_post_id = ''; $meta_case_cond = 'CASE post_id '; $meta_keys_edited = array(); // array for storing the edited meta_keys $data_col_params['posts_fields'] = array(); // array for keeping track of all 'posts' table fields foreach ($edited_data as $id => $edited_row) { $update_params_custom = array(); // for custom tables $where_cond = array(); $insert_post = 0; $temp_id = $id; $id = ( strpos($id, 'sm_temp_') !== false ) ? 0 : $id; //for newly added records //Code for inserting the post if ( empty($id) ) { $insert_params_posts = array(); foreach ($edited_row as $key => $value) { $edited_value_exploded = explode("/", $key); if (empty($edited_value_exploded)) continue; $update_table = $edited_value_exploded[0]; $update_column = $edited_value_exploded[1]; if ($update_table == 'posts') { $insert_params_posts [$update_column] = $value; } } if( empty( $insert_params_posts['post_type'] ) ) { $insert_params_posts['post_type'] = $this->dashboard_key; } if ( !empty($insert_params_posts) ) { $inserted_id = wp_insert_post($insert_params_posts); if ( !is_wp_error( $inserted_id ) && !empty($inserted_id) ) { if( ! empty( $edited_data[$temp_id] ) ){ unset( $edited_data[$temp_id] ); } $id = $inserted_id; $insert_post = 1; //Flag for determining whether post has been inserted $edited_data[$id] = $edited_row; } else { continue; } } else { continue; } } // if (empty($edited_row['posts/ID'])) continue; // $id = $edited_row['posts/ID']; foreach ($edited_row as $key => $value) { $prev_val = $meta_key_name = ''; $edited_value_exploded = explode("/", $key); if (empty($edited_value_exploded)) continue; $update_cond = array(); // for handling the where condition $update_params_meta_flag = false; // flag for handling the query for meta_key = meta_value like structure $update_table = $edited_value_exploded[0]; $update_column = $edited_value_exploded[1]; if (empty($where_cond[$update_table])) { $where_cond[$update_table] = (!empty($table_model[$update_table]['pkey']) && $update_column == $table_model[$update_table]['pkey']) ? 'WHERE '. $table_model[$update_table]['pkey'] . ' = ' . $value : ''; } if ( sizeof( $edited_value_exploded ) > 2 ) { $cond = explode( '=', $edited_value_exploded[1] ); if ( 2 === sizeof( $cond ) ) { $update_cond[ $cond[0] ] = $meta_key_name = $cond[1]; } $update_column_exploded = explode( '=', $edited_value_exploded[2] ); $update_column = $update_column_exploded[0]; $update_params_meta_flag = true; } $update_column_name = ( 'postmeta' === $update_table ) ? $meta_key_name : $update_column; $this->field_names[ $id ][ $update_column_name ] = $key; // For fetching previous value if ( ( ! empty( $id ) ) && ( ! empty( $update_table ) ) && ( ! empty( $update_column_name ) ) && ( is_callable( array( 'Smart_Manager_Task', 'get_previous_data' ) ) ) ){ $prev_val = Smart_Manager_Task::get_previous_data( $id, $update_table, $update_column_name ); $prev_val = ( ! empty( $data_col_params ) ) ? sa_sm_format_prev_val( array( 'prev_val' => $prev_val, 'update_column' => $update_column_name, 'col_data_type' => $data_col_params, 'updated_val' => $value ) ) : $prev_val; } // handling the update array for posts table if ( $update_table == 'posts' && $insert_post != 1 ) { if ( ! empty( $id ) && empty($data_col_params['posts_fields'][$id][$table_model[$update_table]['pkey']]) ) { $data_col_params['posts_fields'][$id][$table_model[$update_table]['pkey']] = $id; } $data_col_params['posts_fields'][$id][$update_column] = $value; if ( ( ! empty( $update_column ) ) && ( 'post_date' === $update_column ) ) { $data_col_params['posts_fields'][ $id ]['post_date_gmt'] = get_gmt_from_date( $value ); $data_col_params['posts_fields'][ $id ]['edit_date'] = true; } $this->prev_post_values[ $id ][ $update_column ] = $prev_val; } else if ( $update_params_meta_flag === true ) { if (empty($id) || empty($update_cond['meta_key'])) continue; $meta_key = $update_cond['meta_key']; $updated_val = $value; $this->prev_postmeta_values[ $id ][ $meta_key ] = $prev_val; //Code for handling serialized data if( in_array($meta_key, $data_cols_serialized) ) { if (!empty($value)) { $updated_val = json_decode($value,true); if( empty( $updated_val ) ) { // for comma separated string values $updated_val = explode(",", $value); if( empty($updated_val) ) { $updated_val = $value; } } } } //Code for handling timestamp data if( in_array($meta_key, $data_cols_timestamp) || in_array($meta_key, $data_date_cols_timestamp) || in_array($meta_key, $data_time_cols_timestamp) ) { if( in_array($meta_key, $data_time_cols_timestamp) ) { $value = '1970-01-01'.$value; } //Code for converting date & datetime values to localize timezone $value = !empty ( $value ) ? strtotime( $value ) : ''; if( in_array( $meta_key, $date_cols_site_timezone ) ){ $offset = get_option( 'gmt_offset' ) * HOUR_IN_SECONDS; $updated_val = ( ! empty( $value ) ) ? $value + $offset : ''; } else if( in_array( $meta_key, $date_cols_utc_timezone ) ){ $updated_val = ( ! empty( $value ) ) ? sa_sm_get_utc_timestamp_from_site_date( $value ) : ''; } else { $updated_val = $value; } } //Code for forming the edited data array if ( empty( $meta_data_edited[$update_table] ) ) { $meta_data_edited[$update_table] = array(); } if ( empty( $meta_data_edited[$update_table][$id] ) ) { $meta_data_edited[$update_table][$id] = array(); } $meta_data_edited[$update_table][$id][$update_cond['meta_key']] = $updated_val; $meta_keys_edited [$update_cond['meta_key']] = ''; } else if($update_table == 'terms') { if ( ( defined('SMPRO') ) && ( true === SMPRO ) ) { $args = apply_filters( 'sm_process_inline_terms_update', array( 'update_column' => $update_column, 'term_ids' => array_map( 'absint', explode( ',', $value ) ), 'id' => $id, 'prev_val' => $prev_val, 'value' => $value, 'taxonomies' => $taxonomies, 'prev_postmeta_values' => $this->prev_postmeta_values, 'meta_data_edited' => $meta_data_edited, 'meta_keys_edited' => $meta_keys_edited, 'taxonomy_data_to_update' => $taxonomy_data_to_update, ) ); if ( ( empty( $args ) ) ) { continue; } $taxonomy_data_to_update = ( ! empty( $args['taxonomy_data_to_update'] ) ) ? $args['taxonomy_data_to_update'] : $taxonomy_data_to_update; $this->prev_postmeta_values = ( ! empty( $args['prev_postmeta_values'] ) ) ? $args['prev_postmeta_values'] : $this->prev_postmeta_values; $meta_data_edited = ( ! empty( $args['meta_data_edited'] ) ) ? $args['meta_data_edited'] : $meta_data_edited; $meta_keys_edited = ( ! empty( $args['meta_keys_edited'] ) ) ? $args['meta_keys_edited'] : $meta_keys_edited; $taxonomies = ( ! empty( $args['taxonomies'] ) ) ? $args['taxonomies'] : $taxonomies; } else { $this->update_terms_table_data( array( 'update_column' => $update_column,//taxonomy. 'data_cols_multiselect' => $data_cols_multiselect, 'data_cols_multiselect_val' => $data_cols_multiselect_val, 'data_cols_list' => $data_cols_list, 'data_cols_list_val' => $data_cols_list_val, 'value' => $value, //terms. 'id' => $id //post id. ) ); } } } } //Code for updating the terms data. do_action( 'sm_inline_update_post_terms', array( 'taxonomy_data_to_update'=> $taxonomy_data_to_update, 'taxonomies' => $taxonomies, 'task_id' => ( ! empty( $this->task_id ) ) ? $this->task_id : 0, ) ); //Code for updating the meta data. do_action( 'sm_inline_update_post_meta', array( 'meta_data_edited' => ( ! empty( $meta_data_edited ) ) ? $meta_data_edited : array(), 'meta_keys_edited' => ( ! empty( $meta_keys_edited ) ) ? array_keys( $meta_keys_edited ) : array(), 'task_id' => ( ! empty( $this->task_id ) ) ? $this->task_id : 0, 'prev_postmeta_values'=> ( ! empty( $this->prev_postmeta_values ) ) ? $this->prev_postmeta_values : array(), ) ); if ( ( ! empty( $meta_data_edited ) ) && ( ! empty( $meta_keys_edited ) ) && ( defined('SMPRO') && empty( SMPRO ) ) ) { foreach ( $meta_data_edited as $update_params ) { if( empty( $update_params ) || !is_array( $update_params ) ) continue; foreach ($update_params as $id => $updated_data) { if( empty( $id ) || empty( $updated_data ) || !is_array( $updated_data ) ) continue; foreach ($updated_data as $key => $value) { if( empty( $key ) ) continue; $key = wp_unslash( $key ); $value = wp_unslash( $value ); $prev_val = ( ( ! empty( $this->prev_postmeta_values[$id] ) ) && ( ! empty($this->prev_postmeta_values[$id][$key]) ) ) ? $this->prev_postmeta_values[$id][$key] : ''; update_post_meta( $id, $key, $value, $prev_val ); } } } } // Code for updating the posts data. do_action( 'sm_inline_update_post_data', array( 'posts_data' => $data_col_params['posts_fields'], 'task_id' => ( ! empty( $this->task_id ) ) ? $this->task_id : 0, ) ); if ( ( ! empty( $data_col_params['posts_fields'] ) ) && ( defined('SMPRO') && empty( SMPRO ) ) ) { foreach ( $data_col_params['posts_fields'] as $id => $post_params ) { if ( empty( $id ) || empty( $post_params ) ) { continue; } wp_update_post( $post_params ); } } } do_action( 'sm_inline_update_post', $edited_data, $data_col_params ); // For updating task details table. if ( ( ! empty( self::$update_task_details_params ) ) && is_callable( array( 'Smart_Manager_Task', 'task_details_update' ) ) ) { Smart_Manager_Task::task_details_update(); } delete_transient('sm_beta_skip_delete_dashboard_transients', 1, DAY_IN_SECONDS); // for preventing delete dashboard transients $msg_str = ''; if ( sizeof($edited_data) > 1 ) { $msg_str = 's'; } //Update man-hrs data in DB Smart_Manager::sm_update_man_hours_data( $is_advanced_search ? 'advanced_search_inline' : 'inline', sizeof( $edited_data ) ); if( isset( $this->req_params['pro'] ) && empty( $this->req_params['pro'] ) ) { $sm_inline_update_count = get_option( 'sm_inline_update_count', 0 ); $sm_inline_update_count += sizeof($edited_data); update_option( 'sm_inline_update_count', $sm_inline_update_count, 'no' ); //Get time saved $modal_message = ''; $time_saved_details = Smart_Manager::sm_get_time_saved_with_additional_savings( $is_advanced_search ? 'advanced_search_inline' : 'inline', sizeof( $edited_data ), 'mins' ); if( ! empty( $time_saved_details ) && is_array( $time_saved_details ) ){ $modal_message = sprintf( /* translators: %1$s: time saved in minutes/hours, %2$s: additional savings possible, %3$s: Pro upgrade link */ __( 'You saved %1$s, and you can save more %2$s by upgrading to %3$s.', 'smart-manager-for-wp-e-commerce' ), __( ( ( ! empty( $time_saved_details['time_saved'] ) ) ? $time_saved_details['time_saved'] : '' ) . ' ' . ( ( ! empty( $time_saved_details['unit'] ) ) ? $time_saved_details['unit'] : '' ) ), // Time saved in mins/hrs. __( ( ( ! empty( $time_saved_details['additional_savings'] ) ) ? $time_saved_details['additional_savings'] : '' ) . ' ' . ( ( ! empty( $time_saved_details['unit'] ) ) ? $time_saved_details['unit'] : '' ) ), // Additional savings in mins/hrs. sprintf( '%s', esc_url( SM_APP_ADMIN_URL . "-pricing" ), esc_html__( 'Pro', 'smart-manager-for-wp-e-commerce' ) ) ); } $resp = array( 'sm_inline_update_count' => $sm_inline_update_count, 'modal_message' => $modal_message, 'msg' => sprintf( /* translators: %1$d: number of updated record %2$s: record update message */ esc_html__( '%1$d record%2$s updated successfully!', 'smart-manager-for-wp-e-commerce'), sizeof( $edited_data ), $msg_str ), ); $msg = json_encode($resp); } else { $msg = sprintf( /* translators: %1$d: number of updated record %2$s: record update message */ esc_html__( '%1$d record%2$s updated successfully!', 'smart-manager-for-wp-e-commerce' ), sizeof( $edited_data ), $msg_str ); } echo $msg; exit; } // Function to handle the delete data functionality public function delete() { global $wpdb; $delete_ids = (!empty($this->req_params['ids'])) ? json_decode(stripslashes($this->req_params['ids']), true) : array(); if( empty( $delete_ids ) ) return; $default_process = apply_filters( 'sm_default_process_delete_records', true ); if( ! empty( $default_process ) ){ $deleter = apply_filters( 'sm_deleter', null, array( 'source' => $this ) ); $is_callable = false; if ( ! empty( $deleter ) ) { if ( ! empty( $deleter['callable'] ) ) { if ( is_array( $deleter['callable'] ) ) { if ( is_callable( $deleter['callable'] ) ) { $is_callable = true; } } elseif ( is_string( $deleter['callable'] ) ) { if ( function_exists( $deleter['callable'] ) ) { $is_callable = true; } } } if ( ! empty( $deleter['delete_ids'] ) ) { $delete_ids = $deleter['delete_ids']; } } foreach ( $delete_ids as $delete_id ) { ( $is_callable ) ? call_user_func_array( $deleter['callback'], array( intval( $delete_id ) ) ) : wp_trash_post( intval( $delete_id ) ); } } $delete_ids_count = apply_filters( 'sm_default_process_delete_records_result', sizeof( $delete_ids ), array( 'ids' => $delete_ids, 'this' => $this ) ); echo sprintf( /* translators: %1$d: number of updated record %2$s: record update message */ esc_html__( '%1$d record%2$s deleted successfully!', 'smart-manager-for-wp-e-commerce' ), $delete_ids_count, ( ( $delete_ids_count > 1 ) ? 's' : '' ) ); exit; } /** * Function to check if 'trash' records are to be shown or not * * @return boolean flag for whether 'trash' records are to be shown or not */ public function is_show_trash_records(){ return apply_filters( 'sm_view_trash_records', ( 'yes' === get_option( 'sm_view_'.$this->dashboard_key.'_trash_records', 'no' ) || 'yes' === Smart_Manager_Settings::get( 'view_trash_records' ) ) ); } // ***************************************************************************************** // Functions for handling advanced search functionality // ***************************************************************************************** /** * Function to generate meta_query for advanced search for any flat tables like 'posts', 'term_taxonomy', etc. * * @param array $params The search condition params. * @return array updated search query. */ public function create_flat_table_search_query( $params = array() ){ $table_nm = ( ! empty( $params['table_nm'] ) ) ? $params['table_nm'] : ''; $search_params = ( ! empty( $params['search_params'] ) ) ? $params['search_params'] : ''; if( empty( $table_nm ) || empty( $search_params ) ){ return array(); } $search_col = apply_filters('sm_search_format_query_'. $table_nm .'_col_name', $search_params['search_col'], $search_params); $search_value = apply_filters('sm_search_format_query_'. $table_nm .'_col_value', $search_params['search_value'], $search_params); if ( empty( $params['search_query']['cond_'.$table_nm.'_col_vals'] ) ) { $params['search_query']['cond_'.$table_nm.'_col_vals'] = array(); } if ( empty( $params['search_query']['cond_'.$table_nm.'_selected_search_operators'] ) ) { $params['search_query']['cond_'.$table_nm.'_selected_search_operators'] = array(); } if( in_array( $search_params['search_data_type'], array( "number", "numeric" ) ) ) { $val = ( empty( $search_value ) && '0' != $search_value ) ? "''" : $search_value; $cond = "( ".$params['rule']['table_name'].".".$search_col . " ". $search_params['search_operator'] ." %f )"; } else if ( $search_params['search_data_type'] == "date" || $search_params['search_data_type'] == "sm.datetime" ) { $cond = "( ".$params['rule']['table_name'].".".$search_col . " ". $search_params['search_operator'] ." %s AND ". $params['rule']['table_name'] .".". $search_col ." NOT IN ('0', '1970-01-01 00:00:00', '1970-01-01', '', 0) )"; } else { if ($search_params['search_operator'] == 'is') { $cond = "( ".$params['rule']['table_name'].".".$search_col . " LIKE %s )"; } else if ($search_params['search_operator'] == 'is not') { $cond = "( ".$params['rule']['table_name'].".".$search_col . " NOT LIKE %s )"; } else { $cond = "( ".$params['rule']['table_name'].".".$search_col . " ". $search_params['search_operator'] ." %s )"; } } $cond = apply_filters( 'sm_search_'.$table_nm.'_cond', $cond, array_merge( $search_params, array( 'table_nm' => $params['rule']['table_name'] ) ) ); $params['search_query']['cond_'.$table_nm] .= $cond ." && "; $params['search_query']['cond_'.$table_nm.'_col_vals'][] = $search_value; $params['search_query']['cond_'.$table_nm.'_selected_search_operators'][] = $search_params['selected_search_operator']; return $params['search_query']; } /** * Function to generate meta_query for advanced search for any meta tables like 'postmeta', 'termmeta', etc. * * @param array $params The search condition params. * @return array updated search query. */ public function create_meta_table_search_query( $params = array() ){ global $wpdb; $meta_table = ( ! empty( $params['table_nm'] ) ) ? $params['table_nm'] : ''; $search_params = ( ! empty( $params['search_params'] ) ) ? $params['search_params'] : ''; if( empty( $meta_table ) || empty( $search_params ) ){ return array(); } $params['search_query']['cond_'.$meta_table.'_col_name'] .= $search_params['search_col']; $params['search_query']['cond_'.$meta_table.'_col_value'] .= $search_params['search_value']; $search_params['search_col'] = apply_filters('sm_search_format_query_'.$meta_table.'_col_name', $search_params['search_col'], $search_params); $search_params['search_value'] = apply_filters('sm_search_format_query_'.$meta_table.'_col_value', $search_params['search_value'], $search_params); if ( empty( $params['search_query']['cond_'.$meta_table.'_col_vals'] ) ) { $params['search_query']['cond_'.$meta_table.'_col_vals'] = array(); } if ( empty( $params['search_query']['cond_'.$meta_table.'_selected_search_operators'] ) ) { $params['search_query']['cond_'.$meta_table.'_selected_search_operators'] = array(); } if( in_array( $search_params['search_data_type'], array( "number", "numeric" ) ) ) { $val = ( empty( $search_params['search_value'] ) && '0' != $search_params['search_value'] ) ? "''" : $search_params['search_value']; //Condition for exact matching of '0' numeric values if( '0' == $search_params['search_value'] && ( '=' === $search_params['search_operator'] || '!=' === $search_params['search_operator'] ) ) { $val = "'". $val . "'"; } $meta_cond = "( ". $params['rule']['table_name'].".meta_key LIKE '". $search_params['search_col'] . "' AND ". $params['rule']['table_name'] .".meta_value ". $search_params['search_operator'] ." %f )"; $params['search_query']['cond_'.$meta_table.'_operator'] .= $search_params['search_operator']; } else if( $search_params['search_data_type'] == "date" || $search_params['search_data_type'] == "sm.datetime" ) { $meta_cond = "( ". $params['rule']['table_name'].".meta_key LIKE '". $search_params['search_col'] . "' AND ". $params['rule']['table_name'] .".meta_value ". $search_params['search_operator'] ." %s AND ". $params['rule']['table_name'] .".meta_value NOT IN ('0', '1970-01-01 00:00:00', '1970-01-01', '', 0) )"; $params['search_query']['cond_'.$meta_table.'_operator'] .= $search_params['search_operator']; } else { if ($search_params['search_operator'] == 'is') { $params['search_query']['cond_'.$meta_table.'_operator'] .= 'LIKE'; $meta_cond = "( ". $params['rule']['table_name'].".meta_key LIKE '". $search_params['search_col'] . "' AND ". $params['rule']['table_name'] .".meta_value LIKE %s" . " )"; } else if ($search_params['search_operator'] == 'is not') { $params['search_query']['cond_'.$meta_table.'_operator'] .= 'NOT LIKE'; $meta_cond = "( ". $params['rule']['table_name'].".meta_key LIKE '". $search_params['search_col'] . "' AND ". $params['rule']['table_name'] .".meta_value NOT LIKE %s" . " )"; } else { $params['search_query']['cond_'.$meta_table.'_operator'] .= $search_params['search_operator']; $meta_cond = "( ". $params['rule']['table_name'].".meta_key LIKE '". $search_params['search_col'] . "' AND ". $params['rule']['table_name'] .".meta_value ". $search_params['search_operator'] ." %s )"; } } $meta_cond = apply_filters( 'sm_search_'.$meta_table.'_cond', $meta_cond, array_merge( $search_params, array( 'table_nm' => $params['rule']['table_name'], 'rule_val' => $params['rule']['value'] ) ) ); $pkey = ( ! empty( $search_params['pkey'] ) ) ? $search_params['pkey'] : 'post_id'; $join_table = ( ! empty( $search_params['join_table'] ) ) ? $search_params['join_table'] : 'posts'; $type = ( ! empty( $search_params['type'] ) ) ? $search_params['type'] : 'post_type'; $post_type_condn = ''; if ( ! empty( $search_params['post_type'] ) ) { $post_type_condn = ( is_array( $search_params['post_type'] ) && count( $search_params['post_type'] ) > 0 ) ? $type . " IN ('" . implode( "','", $search_params['post_type'] ) ."')" : $type . " = '". $search_params['post_type']."'"; } if( ( ( empty( $params['rule']['value'] ) && '0' !== $params['rule']['value'] ) || $params['rule']['value'] == "''") && ! empty( $search_params['post_type'] ) && ! empty( $search_params['search_col'] ) && ! empty( $post_type_condn ) ) { $empty_search_value = ( $search_params['search_operator'] == 'is' || $search_params['search_operator'] == '=' ) ? 'IS NULL' : 'IS NOT NULL'; $meta_cond = "( ". $meta_cond ." OR ( ". $params['rule']['table_name'] .".meta_key LIKE '". $search_params['search_col'] . "' AND ". $params['rule']['table_name'] .".meta_value " . $empty_search_value ." ) OR ( ". $params['rule']['table_name'] .".".$pkey." ". ( ( $search_params['search_operator'] == 'is' || $search_params['search_operator'] == '=' ) ? 'NOT IN' : 'IN' ) ." ( SELECT DISTINCT ft.id FROM {$wpdb->prefix}".$meta_table." as mt JOIN {$wpdb->prefix}".$join_table." as ft ON(ft.id = mt.".$pkey." AND ft.".$post_type_condn." ) WHERE mt.meta_key = '". $search_params['search_col'] . "' ) ) )"; } $params['search_query']['cond_'.$meta_table.''] .= $meta_cond ." && "; $params['search_query']['cond_'.$meta_table.'_col_name'] .= " && "; $params['search_query']['cond_'.$meta_table.'_col_value'] .= " && "; $params['search_query']['cond_'.$meta_table.'_operator'] .= " && "; $params['search_query']['cond_'.$meta_table.'_col_vals'][] = $search_params['search_value']; $params['search_query']['cond_'.$meta_table.'_selected_search_operators'][] = $search_params['selected_search_operator']; return $params['search_query']; } /** * Function to generate terms query for advanced search. * * @param array $params The search condition params. * @return array updated search query. */ public function create_terms_table_search_query( $params = array() ){ global $wpdb; $search_params = ( ! empty( $params['search_params'] ) ) ? $params['search_params'] : ''; if( empty( $search_params ) ){ return array(); } $params['search_query']['cond_terms_col_name'] .= $search_params['search_col']; $params['search_query']['cond_terms_col_value'] .= $search_params['search_value']; $search_params['search_col'] = apply_filters('sm_search_format_query_terms_col_name', $search_params['search_col'], $search_params); $search_params['search_value'] = apply_filters('sm_search_format_query_terms_col_value', $search_params['search_value'], $search_params); if ( empty( $params['search_query']['cond_terms_col_vals'] ) ) { $params['search_query']['cond_terms_col_vals'] = array(); } if ( empty( $params['search_query']['cond_terms_selected_search_operators'] ) ) { $params['search_query']['cond_terms_selected_search_operators'] = array(); } if ( 'is' === $search_params['search_operator'] ) { if( $params['rule']['value'] == "''" ) { //for handling empty search strings $terms_cond = "( ". $wpdb->prefix ."term_taxonomy.taxonomy NOT LIKE '". $search_params['search_col'] . "' AND ". $wpdb->prefix ."term_taxonomy.taxonomy NOT LIKE 'product_type' )"; $params['search_query']['cond_terms_operator'] .= 'NOT LIKE'; } else { $terms_cond = "( ". $wpdb->prefix ."term_taxonomy.taxonomy LIKE '". $search_params['search_col'] . "' AND ". $wpdb->prefix ."terms.slug LIKE %s" . " )"; $params['search_query']['cond_terms_operator'] .= 'LIKE'; } } else if( 'is not' === $search_params['search_operator'] ) { if( $params['rule']['value'] == "''" ) { //for handling empty search strings $terms_cond = "( ". $wpdb->prefix ."term_taxonomy.taxonomy LIKE '". $search_params['search_col'] . "' )"; $params['search_query']['cond_terms_operator'] .= 'LIKE'; } else { $terms_cond = "( ". $wpdb->prefix ."term_taxonomy.taxonomy NOT LIKE '". $search_params['search_col'] . "' AND ". $wpdb->prefix ."terms.slug NOT LIKE %s" . " )"; $params['search_query']['cond_terms_operator'] .= 'NOT LIKE'; } } else { $terms_cond = "( ". $wpdb->prefix ."term_taxonomy.taxonomy LIKE '". $search_params['search_col'] . "' AND ". $wpdb->prefix ."terms.slug ". $search_params['search_operator'] ." %s )"; $params['search_query']['cond_terms_operator'] .= $search_params['search_operator']; } $terms_cond = apply_filters( 'sm_search_terms_cond', $terms_cond, array_merge( $search_params, array( 'table_nm' => $wpdb->prefix .'term_taxonomy.taxonomy' ) ) ); $params['search_query']['cond_terms'] .= $terms_cond ." && "; $params['search_query']['cond_terms_col_name'] .= " && "; $params['search_query']['cond_terms_col_value'] .= " && "; $params['search_query']['cond_terms_operator'] .= " && "; $params['search_query']['cond_terms_col_vals'][] = $search_params['search_value']; $params['search_query']['cond_terms_selected_search_operators'][] = $search_params['selected_search_operator']; return $params['search_query']; } /** * Function to process terms query for advanced search. * * @param array $params The search condition params. * @return void. */ public function process_terms_table_search_query( $params = array() ){ global $wpdb, $wp_version; $search_query = ( ! empty( $params['search_query'] ) ) ? $params['search_query'] : array(); if( empty( $params ) || empty( $search_query ) ){ return; } $cond_terms_array = explode(" && ",$search_query['cond_terms']); $cond_terms_col_name = (!empty($search_query['cond_terms_col_name'])) ? explode(" && ",$search_query['cond_terms_col_name']) : ''; $cond_terms_col_value = (!empty($search_query['cond_terms_col_value'])) ? explode(" && ",$search_query['cond_terms_col_value']) : ''; $cond_terms_operator = (!empty($search_query['cond_terms_operator'])) ? explode(" && ",$search_query['cond_terms_operator']) : ''; $index = 0; $terms_advanced_search_from = ''; $terms_advanced_search_where = ''; $result_terms_search = ''; foreach ($cond_terms_array as $cond_terms) { $exp_search_val = ( is_array( $params['search_vals'] ) && ( ! empty( $params['search_vals'][ $index ] ) ) ) ? $params['search_vals'][ $index ] : ''; $exp_search_val = $this->format_advanced_search_value( array( 'search_val' => $exp_search_val, 'selected_search_operator' => $params['selected_search_operators'][ $index ], ) ); $search_params = array('cond_terms_col_name' => $cond_terms_col_name[$index], 'cond_terms_col_value' => $cond_terms_col_value[$index], 'cond_terms_operator' => $cond_terms_operator[$index], 'SM_IS_WOO30' => (!empty($params['SM_IS_WOO30'])) ? $params['SM_IS_WOO30'] : '', 'post_type' => (!empty($params['post_type'])) ? $params['post_type'] : array()); $cond_terms = apply_filters('sm_search_terms_condition_start', $cond_terms, $search_params); $query_advanced_search_taxonomy_id = $wpdb->prepare( "SELECT {$wpdb->prefix}term_taxonomy.term_taxonomy_id FROM {$wpdb->prefix}term_taxonomy JOIN {$wpdb->prefix}terms ON ( {$wpdb->prefix}terms.term_id = {$wpdb->prefix}term_taxonomy.term_id) WHERE ".$cond_terms, $exp_search_val ); $result_advanced_search_taxonomy_id = $wpdb->get_col ( $query_advanced_search_taxonomy_id ); //Query to get the child taxonomy ids $query_advanced_search_parent_id = $wpdb->prepare( "SELECT {$wpdb->prefix}term_taxonomy.term_taxonomy_id FROM {$wpdb->prefix}term_taxonomy JOIN {$wpdb->prefix}terms ON ( {$wpdb->prefix}term_taxonomy.parent = {$wpdb->prefix}terms.term_id ) WHERE {$wpdb->prefix}terms.slug = %s", $exp_search_val ); $result_advanced_search_parent_id = $wpdb->get_col( $query_advanced_search_parent_id); if (!empty($result_advanced_search_taxonomy_id)) { $terms_search_result_flag = ( $index == (sizeof($cond_terms_array) - 1) ) ? ', '.$params['search_query_index'] : ', 0'; $terms_advanced_search_select = "SELECT DISTINCT ".$wpdb->prefix."posts.id, ". $params['search_query_index']; $search_params['terms_search_result_flag'] = $terms_search_result_flag; $result_taxonomy_ids = implode(",",$result_advanced_search_taxonomy_id); $result_taxonomy_ids .= (!empty($result_advanced_search_parent_id)) ? ','.implode(',',$result_advanced_search_parent_id) : ''; //condition added for displaying child taxonomies when searching for parent taxonomies $search_params['search_query_index'] = $params['search_query_index']; $search_params['result_taxonomy_ids'] = $result_taxonomy_ids; $terms_advanced_search_from = "FROM {$wpdb->prefix}posts JOIN {$wpdb->prefix}term_relationships ON ({$wpdb->prefix}term_relationships.object_id = {$wpdb->prefix}posts.id AND {$wpdb->prefix}posts.post_type IN ('". implode( "','", $params['post_type'] ) ."') )"; $terms_advanced_search_where = "WHERE {$wpdb->prefix}term_relationships.term_taxonomy_id IN (". $result_taxonomy_ids .")"; //Code for handling blank taxonomy search conditions if( !empty($search_params['cond_terms_operator']) && $search_params['cond_terms_operator'] == 'NOT LIKE' ) { $tt_ids_to_exclude = array(); $taxonomy = apply_filters('sm_search_format_query_terms_col_name', $search_params['cond_terms_col_name'], $search_params); if( ( $search_params['cond_terms_col_value'] == "''" || empty( $search_params['cond_terms_col_value'] ) ) ) { if (version_compare ( $wp_version, '4.5', '>=' )) { $tt_ids_to_exclude = get_terms( array( 'taxonomy' => $taxonomy, 'fields' => 'tt_ids', )); } else { $tt_ids_to_exclude = get_terms( $taxonomy, array( 'fields' => 'tt_ids', )); } } else { $term_meta = get_term_by( 'slug', $search_params['cond_terms_col_value'], $taxonomy ); if ( ! is_wp_error( $term_meta ) && ! empty( $term_meta->term_taxonomy_id ) ) { $tt_ids_to_exclude[] = $term_meta->term_taxonomy_id; } } if( ! empty( $tt_ids_to_exclude ) ) { $search_params['tt_ids_to_exclude'] = $tt_ids_to_exclude; $terms_advanced_search_where .= " AND {$wpdb->prefix}posts.ID NOT IN ( SELECT object_id FROM {$wpdb->prefix}term_relationships WHERE term_taxonomy_id IN (". implode(",", $tt_ids_to_exclude) .") )"; } } $terms_advanced_search_select_old = $terms_advanced_search_select; $terms_advanced_search_select = apply_filters('sm_search_query_terms_select', $terms_advanced_search_select, $search_params); $terms_advanced_search_from = apply_filters('sm_search_query_terms_from', $terms_advanced_search_from, $search_params); $terms_advanced_search_where = apply_filters('sm_search_query_terms_where', $terms_advanced_search_where, $search_params); if( $terms_advanced_search_select_old == $terms_advanced_search_select ) { $terms_advanced_search_select .= " ,1 "; } //Query to find if there are any previous conditions $count_temp_previous_cond = $wpdb->query("UPDATE {$wpdb->base_prefix}sm_advanced_search_temp SET flag = 0 WHERE flag = ". $params['search_query_index']); if ( ! empty( $this->previous_cond_has_results ) ) { //Code to handle condition if the ids of previous cond are present in temp table if ( ( 0 === $index && $count_temp_previous_cond > 0 ) || ( ! empty( $result_terms_search ) ) || $index > 0 ) { $terms_advanced_search_from .= " JOIN ".$wpdb->base_prefix."sm_advanced_search_temp ON (".$wpdb->base_prefix."sm_advanced_search_temp.product_id = ".$wpdb->prefix."posts.id)"; $terms_advanced_search_where .= "AND ".$wpdb->base_prefix."sm_advanced_search_temp.flag = 0"; } $result_terms_search = array(); if (!empty($terms_advanced_search_select ) && !empty($terms_advanced_search_from ) && !empty($terms_advanced_search_where )) { $terms_advanced_search_select = esc_sql( $terms_advanced_search_select ); $query_terms_search = "REPLACE INTO {$wpdb->base_prefix}sm_advanced_search_temp ( {$terms_advanced_search_select} {$terms_advanced_search_from} {$terms_advanced_search_where} )"; $result_terms_search = $wpdb->query ( $query_terms_search ); } } do_action('sm_search_terms_condition_complete',$result_terms_search,$search_params); } //Code to delete the unwanted post_ids $wpdb->query("DELETE FROM {$wpdb->base_prefix}sm_advanced_search_temp WHERE flag = 0"); $index++; } $this->previous_cond_has_results = ( ! empty( $result_terms_search ) ) ? true : false; do_action('sm_search_terms_conditions_array_complete',$search_params); //Query to reset the cat_flag $wpdb->query("UPDATE {$wpdb->base_prefix}sm_advanced_search_temp SET cat_flag = 0"); } /** * Function to process meta_query for advanced search for any meta tables like 'postmeta', 'termmeta', etc. * * @param array $params The search condition params. * @return void. */ public function process_meta_table_search_query( $params = array() ){ global $wpdb; $search_query = ( ! empty( $params['search_query'] ) ) ? $params['search_query'] : array(); $meta_table = ( ! empty( $params['table_nm'] ) ) ? $params['table_nm'] : ''; if( empty( $params ) || empty( $search_query ) ){ return; } $meta_conditions = explode( " && ",$search_query['cond_'.$meta_table] ); $col_names = (!empty($search_query['cond_'. $meta_table .'_col_name'])) ? explode(" && ",$search_query['cond_'. $meta_table .'_col_name']) : array(); $col_values = (!empty($search_query['cond_'. $meta_table .'_col_value'])) ? explode(" && ",$search_query['cond_'. $meta_table .'_col_value']) : array(); $col_ops = (!empty($search_query['cond_'. $meta_table .'_operator'])) ? explode(" && ",$search_query['cond_'. $meta_table .'_operator']) : array(); $index = 0; $results = array(); foreach( $meta_conditions as $cond ) { $flag = ', '.$params['search_query_index']; $search_params = array_merge( array( 'cond_'. $meta_table .'_col_name' => (!empty($col_names[$index])) ? trim($col_names[$index]) : '', 'cond_'. $meta_table .'_col_value' => (!empty($col_values[$index])) ? trim($col_values[$index]) : '', 'cond_'. $meta_table .'_operator' => (!empty($col_ops[$index])) ? trim($col_ops[$index]) : '', 'flag' => $flag ), $params ); $cond = apply_filters('sm_search_'. $meta_table .'_condition_start', $cond, $search_params); $search_params['cond_'.$meta_table] = $cond; $select = 'SELECT DISTINCT '.$wpdb->prefix.''.$meta_table.'.'. $params['meta_key_col'] .' '. $flag .' ,0 '; $from = "FROM ".$wpdb->prefix."".$meta_table; $where = 'WHERE '.$cond; $select = apply_filters( 'sm_search_query_'. $meta_table .'_select', $select, $search_params) ; $from = apply_filters( 'sm_search_query_'. $meta_table .'_from', $from, $search_params ); $where = apply_filters( 'sm_search_query_'. $meta_table .'_where', $where, $search_params ); //Query to find if there are any previous conditions $count_temp_previous_cond = $wpdb->query("UPDATE {$wpdb->base_prefix}sm_advanced_search_temp SET flag = 0 WHERE flag = ". $params['search_query_index']); //Code to handle condition if the ids of previous cond are present in temp table if ( ! empty( $this->previous_cond_has_results ) ) { if ( ( 0 === $index && $count_temp_previous_cond > 0 ) || ( ! empty( $results ) ) || $index > 0 ) { $from .= apply_filters( 'sm_search_query_'. $meta_table .'_join', " JOIN ".$wpdb->base_prefix."sm_advanced_search_temp ON (".$wpdb->base_prefix."sm_advanced_search_temp.product_id = {$wpdb->prefix}". $meta_table .".". $params['meta_key_col'] .")", $search_params ); $where .= " AND ".$wpdb->base_prefix."sm_advanced_search_temp.flag = 0"; } $results = array(); if ( ( ! empty( $select ) ) && ( ! empty( $from ) ) && ( ! empty( $where ) ) ) { $select = esc_sql( $select ); $exp_search_val = ( is_array( $params['search_vals'] ) && ( ! empty( $params['search_vals'][ $index ] ) ) ) ? $params['search_vals'][ $index ] : ''; $exp_search_val = $this->format_advanced_search_value( array( 'search_val' => $exp_search_val, 'selected_search_operator' => $params['selected_search_operators'][ $index ], ) ); $query_postmeta_search = $wpdb->prepare( "REPLACE INTO {$wpdb->base_prefix}sm_advanced_search_temp ( {$select} {$from} {$where} )", $exp_search_val ); // Prepare a SQL query using $wpdb->prepare for safe execution. $results = $wpdb->query ( $query_postmeta_search ); } } do_action('sm_search_'. $meta_table .'_condition_complete',$results,$search_params, array( 'select' => $select, 'from' => $from, 'where' => $where )); //Query to delete the unwanted post_ids $wpdb->query("DELETE FROM {$wpdb->base_prefix}sm_advanced_search_temp WHERE flag = 0"); $index++; } $this->previous_cond_has_results = ( ! empty( $results ) ) ? true : false; do_action('sm_search_'. $meta_table .'_conditions_array_complete',$search_params); } /** * Function to process meta_query for advanced search for any flat tables like 'posts', 'term_taxonomy', etc. * * @param array $params The search condition params. * @return void. */ public function process_flat_table_search_query( $params = array() ){ global $wpdb; $search_query = ( ! empty( $params['search_query'] ) ) ? $params['search_query'] : array(); $table_nm = ( ! empty( $params['table_nm'] ) ) ? $params['table_nm'] : ''; if( empty( $params ) || empty( $search_query ) ){ return; } $conditions = explode(" && ",$search_query['cond_'. $table_nm]); $index = 0; $results = array(); foreach ( $conditions as $cond ) { $flag = ', '.$params['search_query_index']; $cat_flag = ( $index == (sizeof($conditions) - 1) ) ? ", 999" : ', 0'; $cond = apply_filters( 'sm_search_'. $table_nm .'_condition_start', $cond, $params ); $search_params = array('cond' => $cond, 'SM_IS_WOO30' => (!empty($params['SM_IS_WOO30'])) ? $params['SM_IS_WOO30'] : '', 'post_type' => (!empty($params['post_type'])) ? $params['post_type'] : '', 'search_query' => $search_query, 'search_query_index' => $params['search_query_index'], 'flag' => $flag, 'cat_flag' => $cat_flag ); $select = "SELECT DISTINCT ".$wpdb->prefix."". $table_nm .".". $params['key_col'] ." ". $flag ." ". $cat_flag ." "; $from = " FROM ".$wpdb->prefix."". $table_nm ." "; $where = " WHERE ". $cond ." "; $select = apply_filters('sm_search_query_'. $table_nm .'_select', $select, $search_params); $from = apply_filters('sm_search_query_'. $table_nm .'_from', $from, $search_params); $where = apply_filters('sm_search_query_'. $table_nm .'_where', $where, $search_params); //Query to find if there are any previous conditions $count_temp_previous_cond = $wpdb->query("UPDATE {$wpdb->base_prefix}sm_advanced_search_temp SET flag = 0 WHERE flag = ". $params['search_query_index']); if ( ! empty( $this->previous_cond_has_results ) ) { //Code to handle condition if the ids of previous cond are present in temp table if ( ( 0 === $index && $count_temp_previous_cond > 0 ) || ( ! empty( $results ) ) || $index > 0 ) { $from .= " JOIN ".$wpdb->base_prefix."sm_advanced_search_temp ON (".$wpdb->base_prefix."sm_advanced_search_temp.product_id = {$wpdb->prefix}". $table_nm .".". $params['key_col'] .") "; $where .= " AND ".$wpdb->base_prefix."sm_advanced_search_temp.flag = 0 "; } $results = array(); if ( ( ! empty( $select ) ) && ( ! empty( $from ) ) && ( ! empty( $where ) ) ) { $select = esc_sql( $select ); $from = esc_sql( $from ); $exp_search_val = ( is_array( $params['search_vals'] ) && ( ! empty( $params['search_vals'][ $index ] ) ) ) ? $params['search_vals'][ $index ] : ''; $exp_search_val = $this->format_advanced_search_value( array( 'search_val' => $exp_search_val, 'selected_search_operator' => $params['selected_search_operators'][ $index ], ) ); $query_posts_search = $wpdb->prepare( "REPLACE INTO {$wpdb->base_prefix}sm_advanced_search_temp ( {$select} {$from} {$where} )", $exp_search_val ); // Prepare a SQL query using $wpdb->prepare for safe execution. $results = $wpdb->query ( $query_posts_search ); } } //Query to delete the unwanted post_ids $wpdb->query("DELETE FROM {$wpdb->base_prefix}sm_advanced_search_temp WHERE flag = 0"); do_action('sm_search_'. $table_nm .'_condition_complete',$results,$search_params); $index++; } $this->previous_cond_has_results = ( ! empty( $results ) ) ? true : false; do_action('sm_search_'. $table_nm .'_conditions_array_complete',$search_params); } /** * Function for modifying advanced search condition for flat tables. * * @param string $cond The search query condition. * @param array $params The search condition params. * @return string updated query condition. */ public function modify_posts_advanced_search_condition( $cond = '', $params = array() ){ global $wpdb; return $cond . ( ( ! empty( $params['post_type'] ) ) ? " AND ".$wpdb->prefix."posts.post_type IN ('". implode( "','", $params['post_type'] ) ."') " : '' ); } /** * Function for modifying advanced search from clause for meta tables. * * @param string $from The search query from clause. * @param array $params The search condition params. * @return string updated from clause. */ public function modify_postmeta_advanced_search_from( $from = '', $params = array() ){ global $wpdb; $join = " JOIN ".$wpdb->prefix."posts ON( ".$wpdb->prefix."posts.id = ".$wpdb->prefix."". $params['table_nm'] .".". $params['meta_key_col'] ." AND ".$wpdb->prefix."posts.post_type IN ('". implode( "','", $params['post_type'] ) ."') )"; return $from . ( ( ! empty( $params['post_type'] ) && strpos( $from, $join ) === false ) ? $join : '' ); } /** * Function for handling ANDing with att and other fields for advanced search. * * @param array $params The search condition params. * @return void. */ public function get_matching_children_advanced_search( $params = array() ){ global $wpdb; $child_where_cond = ''; if ( !empty( $advanced_search_query_string['cond_terms'] ) || !empty( $advanced_search_query_string['cond_postmeta'] ) ) { $child_where_cond = " WHERE ".$wpdb->prefix."posts.id IN (SELECT product_id FROM {$wpdb->base_prefix}sm_advanced_search_temp ) "; } //Query to get the variations of the parent product in result set $wpdb->query ( "REPLACE INTO {$wpdb->base_prefix}sm_advanced_search_temp (SELECT DISTINCT {$wpdb->prefix}posts.id ,". $params['search_query_index'] .", 0 FROM {$wpdb->prefix}posts JOIN {$wpdb->base_prefix}sm_advanced_search_temp ON ({$wpdb->base_prefix}sm_advanced_search_temp.product_id = {$wpdb->prefix}posts.post_parent AND {$wpdb->base_prefix}sm_advanced_search_temp.cat_flag = 999 AND {$wpdb->base_prefix}sm_advanced_search_temp.flag = ". $params['search_query_index'] .") ". $child_where_cond .")" ); } // Function to build query sort params from supplied arguments public function build_query_sort_params( $args = array() ){ $query_sort_params = array(); $sort_params = ( ! empty( $args['sort_params'] ) ) ? esc_sql( $args['sort_params'] ) : array(); if( empty( $sort_params ) ){ return $query_sort_params; } $numeric_meta_cols = ( ! empty( $args['numeric_meta_cols'] ) ) ? $args['numeric_meta_cols'] : array(); $data_cols = ( ! empty( $args['data_cols'] ) ) ? $args['data_cols'] : array(); $tables = array( 'terms' ); foreach( $this->advanced_search_table_types as $table_types ){ if( ! is_array( $table_types ) ) { continue; } $tables = array_merge( $tables, array_keys( $table_types ) ); } if( !empty( $sort_params['column'] ) && !empty( $sort_params['sortOrder'] ) ) { $col_exploded = explode( "/", $sort_params['column'] ); $query_sort_params['table'] = ( ! empty( $col_exploded[0] ) && in_array( $col_exploded[0], $tables ) ) ? $col_exploded[0] : ''; if ( sizeof( $col_exploded ) > 2) { $col_meta = explode( "=", $col_exploded[1] ); $query_sort_params['column_nm'] = ( ! empty( $col_meta[0] ) && ( 'meta_key' === $col_meta[0] || in_array( $col_meta[0], $data_cols ) ) ) ? $col_meta[0] : ''; if( 'meta_key' === $query_sort_params['column_nm'] && ( ! empty( $col_meta[1] ) && in_array( $col_meta[1], $data_cols ) ) ) { $query_sort_params['sort_by_meta_key'] = $col_meta[1]; $query_sort_params['column_nm'] = ( ! empty( $numeric_meta_cols ) && in_array( $col_meta[1], $numeric_meta_cols ) ) ? 'meta_value_num' : 'meta_value'; } } else { $query_sort_params['column_nm'] = ( ! empty( $col_exploded[1] ) && in_array( $col_exploded[1], $data_cols ) ) ? $col_exploded[1] : ''; } $query_sort_params['sortOrder'] = ( ! empty( $sort_params['sortOrder'] ) && in_array( strtoupper( $sort_params['sortOrder'] ), array('ASC', 'DESC') ) ) ? strtoupper( $sort_params['sortOrder'] ) : ''; } return $query_sort_params; } // Function to return saved col_model from transients public function get_col_model( $dashboard_key = '' ){ if( empty( $dashboard_key ) ){ return array(); } $store_model_transient = get_transient( 'sa_sm_'. $dashboard_key ); if( ! empty( $store_model_transient ) && !is_array( $store_model_transient ) ) { $store_model_transient = json_decode( $store_model_transient, true ); } return ( ! empty( $store_model_transient['columns'] ) ) ? $store_model_transient['columns'] : array(); } public function create_search_condition( $search_params = array() ){ global $wpdb; if( empty( $search_params ) ){ return array(); } $db_table_name = ( ! empty( $search_params['search_string']['table_name'] ) ) ? $search_params['search_string']['table_name'] : ''; $table_name = substr( $db_table_name, strlen( $wpdb->prefix ) ); $is_meta_table = ( false !== strpos( $db_table_name, 'meta' ) ) ? true : false; $is_taxonomy_cond = ( ! empty( $search_params['is_taxonomy'] ) ) ? $search_params['is_taxonomy'] : false; $db_operator_map = array( 'is' => 'LIKE', 'is not' => 'NOT LIKE' ); $search_col = apply_filters('sm_search_format_query_'. $table_name .'_col_name', $search_params['search_col'], $search_params); $search_value = apply_filters('sm_search_format_query_'. $table_name .'_col_value', $search_params['search_value'], $search_params); $additional_cond = ( ! empty( $is_meta_table ) ) ? " AND ". $db_table_name .".meta_key LIKE '". $search_col . "' " : ""; if( in_array( $search_params['search_data_type'], array( "number", "numeric" ) ) ) { $search_value = ( empty( $search_value ) && '0' != $search_value ) ? "''" : $search_value; if( $is_meta_table && '0' == $search_value && ( '=' === $search_params['search_operator'] || '!=' === $search_params['search_operator'] ) ) { $search_value = "'". $search_value . "'"; } } else if ( $search_params['search_data_type'] == "date" || $search_params['search_data_type'] == "sm.datetime" || ! empty( $db_operator_map[$search_params['search_operator']] ) ) { $search_value = " '" . $search_value ."' "; if( ! empty( $db_operator_map[$search_params['search_operator']] ) ){ $search_params['search_operator'] = $db_operator_map[$search_params['search_operator']]; } else { $additional_cond .= " AND ". $db_table_name .".". $search_col ." NOT IN ('0', '1970-01-01 00:00:00', '1970-01-01', '', 0)"; } } else { $search_value = " '%" . $search_value ."%' "; } $cond = "( ". $db_table_name .".". ( ( ! empty( $is_meta_table ) ) ? 'meta_value' : $search_col ) ." ". $search_params['search_operator'] ." ". $search_value ." ". $additional_cond .")"; return apply_filters('sm_search_'. $table_name .'_cond', $cond, $search_params) ." && "; } /** * Get columns from flat tables. * @param array $args actual flat table name, flat table name, post type/ type and id column to get columns from flat tables. * @return array $col_model Updated column model. */ public function get_flat_table_columns( $args = array() ) { if ( empty( $args ) || ( ! empty( $args ) && empty( $args['table_nm'] ) ) ){ return array(); } global $wpdb; $results = $wpdb->get_results( "SHOW COLUMNS FROM {$wpdb->prefix}". $args['table_nm'], 'ARRAY_A' ); $num_rows = $wpdb->num_rows; if ( empty( $num_rows ) || empty( $results ) ) { return array(); } $col_model = array(); $ignored_cols = apply_filters( 'sm_ignored_cols', ( ( ! empty( $args['ignored_cols'] ) && is_array( $args['ignored_cols'] ) ) ? $args['ignored_cols'] : array() ) ); $uneditable_cols = apply_filters( 'sm_uneditable_cols', ( ( ! empty( $args['uneditable_cols'] ) && is_array( $args['uneditable_cols'] ) ) ? $args['uneditable_cols'] : array() ) ); $col_titles = apply_filters( 'sm_flat_table_col_titles', array() ); foreach ( $results as $result ) { $field_nm = ( ! empty( $result['Field'] ) ) ? $result['Field'] : ''; if( empty( $field_nm ) || ( is_array( $ignored_cols ) && isset( $ignored_cols[ $args['table_nm'] ] ) && is_array( $ignored_cols[ $args['table_nm'] ] ) && in_array( $field_nm, $ignored_cols[ $args['table_nm'] ] ) ) ) { continue; } $col_args = apply_filters( 'sm_get_custom_cols', array( 'table_nm' => $args['table_nm'], 'col' => $field_nm, 'db_type' => ( ! empty( $result['Type'] ) ) ? $result['Type'] : '', 'editable' => ( in_array( $field_nm, $uneditable_cols ) ) ? false : true, 'visible_cols' => ( ! empty( $args['visible_columns'] ) ) ? $args['visible_columns'] : array(), 'name' => ( ! empty( $col_titles[ $args['table_nm'] ] ) && is_array( $col_titles[ $args['table_nm'] ] ) && ! empty( $col_titles[ $args['table_nm'] ][$field_nm] ) ) ? $col_titles[ $args['table_nm'] ][$field_nm] : '' ), $field_nm ); if ( ! empty( $col_args ) ) { if( is_array( $col_args ) && ! empty( $col_args[0] ) && is_array( $col_args[0] ) && empty( $col_args['table_nm'] ) ){ foreach ( $col_args as $arg ) { $col_model[] = $this->get_default_column_model( $arg ); } continue; } $col_model[] = $this->get_default_column_model( $col_args ); } } return $col_model; } /** * Get columns from meta tables. * @param array $args actual meta table name, meta table name, post type/ type and id column to get columns from meta tables. * @return array $col_model Updated column model. */ public function get_meta_table_columns( $args = array() ) { if ( empty( $args ) || empty( $args['table_nm'] ) || empty( $args['post_type'] ) || empty( $args['meta_table_nm'] ) || empty( $args['child_id'] ) || empty( $args['parent_id'] ) ) { return array(); } global $wpdb; $table_nm = $wpdb->prefix.''.$args['table_nm']; $meta_table_nm = $wpdb->prefix.''.$args['meta_table_nm']; $post_type_cond = ( is_array( $this->post_type ) ) ? " AND " . $table_nm . "." . $args['post_type'] . "IN ('" . implode( "','", $this->post_type ) . "')" : " AND {$wpdb->prefix}" . $args['table_nm'] . "." . $args['post_type'] . " = '" . $this->post_type . "'"; $results = $wpdb->get_results( "SELECT DISTINCT " . $meta_table_nm . ".meta_key, " . $meta_table_nm . ".meta_value FROM " . $meta_table_nm . " JOIN " . $table_nm . " ON (" . $table_nm . ".{$args['parent_id']} = " . $meta_table_nm . "." . $args['child_id'] . ") WHERE " . $meta_table_nm . ".meta_key != '' AND " . $meta_table_nm . ".meta_key NOT LIKE 'free-%' AND " . $meta_table_nm . ".meta_key NOT LIKE '_oembed%'" . $post_type_cond . " GROUP BY ". $meta_table_nm . ".meta_key", 'ARRAY_A'); $num_rows = $wpdb->num_rows; if( ! empty( $results ) && $num_rows > 0 ) { $meta_keys = array(); foreach ( $results as $key => $col ) { if ( empty( $col['meta_value'] ) || '1' == $col['meta_value'] || '0.00' == $col['meta_value'] ) { $meta_keys [] = $col['meta_key']; //TODO: if possible store in db instead of using an array } unset( $results[ $key ] ); $results[ $col['meta_key'] ] = $col; } //not in 0 added for handling empty date columns if ( ! empty( $meta_keys ) ) { $results_meta_value = $wpdb->get_results ( "SELECT " . $meta_table_nm . ".meta_key, " . $meta_table_nm . ".meta_value FROM " . $meta_table_nm." JOIN " . $table_nm . " ON (" . $table_nm . ".{$args['parent_id']} = " . $meta_table_nm . ".{$args['child_id']}) WHERE " . $table_nm . "." . $args['post_type'] . " = '" . $this->dashboard_key . "' AND " . $meta_table_nm . ".meta_value NOT IN ('','0','0.00','1') AND " . $meta_table_nm . ".meta_key IN ('" . implode( "','",$meta_keys ) . "') GROUP BY " . $meta_table_nm . ".meta_key", 'ARRAY_A' ); $num_rows_meta_value = $wpdb->num_rows; if( ! empty( $results_meta_value ) && $num_rows_meta_value > 0 ) { foreach ( $results_meta_value as $result_meta_value ) { if ( isset( $results [ $result_meta_value['meta_key'] ] ) ) { $results [ $result_meta_value['meta_key'] ]['meta_value'] = $result_meta_value['meta_value']; } } } } //Filter to add custom meta columns for custom plugins $results = apply_filters( 'sm_default_dashboard_model_meta_cols', $results ); $meta_count = 0; //Code for pkey column for meta table $col_model[] = $this->get_default_column_model( array( 'table_nm' => $args['meta_table_nm'], 'col' => $args['child_id'], 'type' => 'numeric', 'hidden' => true, 'allow_showhide' => false, 'visible_cols' => ( ! empty( $args['visible_columns'] ) ) ? $args['visible_columns'] : array(), 'editor' => false, ) ); foreach ( $results as $col ) { $meta_key = ( ! empty( $col['meta_key'] ) ) ? $col['meta_key'] : ''; $meta_value = ( ! empty( $col['meta_value'] ) || 0 === $col['meta_value'] ) ? $col['meta_value'] : ''; $col_model[] = $this->get_default_column_model( apply_filters( 'sm_meta_col_model_args', array( 'table_nm' => $args['meta_table_nm'], 'col' => $meta_key, 'is_meta' => true, 'col_value' => $meta_value, 'visible_cols' => ( ! empty( $args['visible_columns'] ) ) ? $args['visible_columns'] : array(), 'hidden' => ( $meta_count > 5 ) ? true : false ) ) ); $meta_count++; } return $col_model; } } /** * Function for formatting terms data. * @param array $args terms related data. * @return array $args['items'] updated items array. */ public function format_terms_data( $args = array() ) { if ( empty( $args ) || ( ! is_array( $args ) ) || empty( $args['terms_visible_cols'] ) || empty( $args['ids'] ) || empty( $args['items'] ) || empty( $args['id_name'] ) ) { return $args['items']; } $valid_term_visible_cols = array_filter( array_keys( $args['terms_visible_cols'] ), function( $taxonomy ) { return taxonomy_exists( $taxonomy ); } ); if ( empty( $valid_term_visible_cols ) ) { return $args['items']; } $terms_objects = wp_get_object_terms( $args['ids'], $valid_term_visible_cols, 'orderby=none&fields=all_with_object_id' ); // Code to create and initialize all the terms columns. foreach ( $args['items'] as $key => $item ) { foreach ( array_keys( $args['terms_visible_cols'] ) as $col ) { $terms_key = 'terms_' . strtolower( str_replace( ' ', '_', $col ) ); $args['items'][ $key ][ $terms_key ] = ''; } } if ( empty( $terms_objects ) || ( ! is_array( $terms_objects ) ) ) { return $args['items']; } $terms_data = array(); //Code for creating the terms data array foreach ( $terms_objects as $term_obj ) { if ( empty( $term_obj->object_id ) || empty( $term_obj->taxonomy ) ) { continue; } if ( empty( $terms_data[ $term_obj->object_id ] ) ) { $terms_data[ $term_obj->object_id ] = array(); } $taxonomy_nm = $term_obj->taxonomy; // Code for export CSV functionality if ( ! empty( $this->req_params[ 'cmd' ] ) && ( 'get_export_csv' === $this->req_params[ 'cmd' ] ) ) { if ( ! isset( $terms_data[ $term_obj->object_id ][ $taxonomy_nm ] ) ){ $terms_data[ $term_obj->object_id ][ $taxonomy_nm ] = array(); } $terms_data[ $term_obj->object_id ][ $taxonomy_nm ][] = $term_obj->term_id; continue; } //Code for handling multilist data if ( is_array( $args['data_cols_multilist'] ) && ( false !== array_search( $taxonomy_nm, $args['data_cols_multilist'] ) ) && ( ( isset( $args['postmeta_cols'] ) ) && ( is_array( $args['postmeta_cols'] ) && ( false === array_search( $taxonomy_nm, $args['postmeta_cols'] ) ) ) ) ) { //added postmeta check condition for multilist columns if ( empty( $term_obj->name ) || empty( $term_obj->term_id ) ) { continue; } $multilist_value = $term_obj->name; $multilist_separator = ', '; if ( ! empty( $args['terms_visible_cols'][ $taxonomy_nm ] ) ) { if ( ! empty( $args['terms_visible_cols'][ $taxonomy_nm ][ $term_obj->term_id ] ) ) { $multilist_value = ( ! empty( $args['terms_visible_cols'][ $taxonomy_nm ][ $term_obj->term_id ]['title'] ) ) ? $args['terms_visible_cols'][ $taxonomy_nm ][ $term_obj->term_id ]['title'] : $multilist_value; } } if ( empty( $terms_data[ $term_obj->object_id ][ $taxonomy_nm ] ) ) { $terms_data[ $term_obj->object_id ][ $taxonomy_nm ] = $multilist_value; } else { $terms_data[ $term_obj->object_id ][ $taxonomy_nm ] .= $multilist_separator . "" . $multilist_value; } } elseif ( is_array( $args['data_cols_dropdown'] ) && ( false !== array_search( $taxonomy_nm, $args['data_cols_dropdown'] ) ) ) { $terms_data[ $term_obj->object_id ][ $taxonomy_nm ] = $term_obj->term_id; } else { $terms_data[ $term_obj->object_id ][ $taxonomy_nm ] = $term_obj->name; } } foreach ( $args['items'] as $key => $item ) { $id = ( ! empty( $item[ $args['id_name'] ] ) ) ? $item[ $args['id_name'] ] : ''; if ( empty( $id ) ) continue; foreach ( array_keys( $args['terms_visible_cols'] ) as $visible_taxonomy ) { $terms_key = 'terms_' . strtolower( str_replace( ' ', '_', $visible_taxonomy ) ); // Code for export CSV functionality if ( ! empty( $this->req_params[ 'cmd' ] ) && ( 'get_export_csv' === $this->req_params[ 'cmd' ] ) ) { if ( empty( $terms_data[ $id ][ $visible_taxonomy ] ) || ( ! is_array( $terms_data[ $id ][ $visible_taxonomy ] ) ) ) { $args['items'][ $key ][ $terms_key ] = ''; continue; } rsort( $terms_data[ $id ][ $visible_taxonomy ] ); $args['items'][ $key ][ $terms_key ] = sa_sm_format_term_ids( $terms_data[ $id ][ $visible_taxonomy ], $visible_taxonomy ); continue; } $args['items'][ $key ][ $terms_key ] = ( ! empty( $terms_data[ $id ][ $visible_taxonomy ] ) ) ? $terms_data[ $id ][ $visible_taxonomy ] : ''; } } return $args['items']; } /** * Function to Update terms table data. * @param array $args terms related data. * @return result of function call. */ public function update_terms_table_data( $args = array() ) { if ( empty( $args ) || ( ! is_array( $args ) ) || empty( $args['id'] ) || empty( $args['update_column'] ) ) { return; } if ( ( ! empty( $args['data_cols_multiselect'] ) ) && ( false !== array_search( $args['update_column'], $args['data_cols_multiselect'] ) ) ) { $actual_val = ( ! empty( $args['data_cols_multiselect_val'][ $args['update_column'] ] ) ) ? $args['data_cols_multiselect_val'][ $args['update_column'] ] : array(); if ( empty( $actual_val ) ) { return; } $term_ids = array_map( 'intval', explode( ",", $args['value'] ) ); if ( empty( $term_ids ) ) { return; } $result = wp_set_object_terms( $args['id'], $term_ids, $args['update_column'] ); } elseif ( ( ! empty( $args['data_cols_list'] ) ) && ( false !== array_search( $args['update_column'], $args['data_cols_list'] ) ) ) { $actual_val = ( ! empty( $args['data_cols_list_val'][ $args['update_column'] ] ) ) ? $args['data_cols_list_val'][ $args['update_column'] ] : array(); if ( empty( $actual_val ) ) { return; } $edited_values = explode( ", ", $args['value'] ); if ( empty( $edited_values ) || ( ! is_array( $edited_values ) ) ) { return; } foreach ( $edited_values as $edited_value ) { $term_id = array_search( $edited_value, $actual_val ); if ( false === $term_id ) { if ( ! isset( $actual_val[ $edited_value ] ) ) { continue; } $term_id = intval( $edited_value ); } if ( ! empty( $term_id ) ) { $term_ids[] = $term_id; } } if ( empty( $term_ids ) ) { return; } $result = wp_set_object_terms( $args['id'], $term_ids, $args['update_column'] ); } return $result; } /** * Function to get query for sort terms table column. * @param array $args sort params. * @return string $join updated join query. */ public function terms_table_column_sort_query( $args = array() ) { global $wpdb; if ( empty( $args ) || ( ! is_array( $args ) ) || ( empty( $args['col_name'] ) ) ) { return $args['join']; } $join_condition = "AND " . $wpdb->prefix . "term_taxonomy.taxonomy = '" . $args['col_name'] . "'"; $join_condition = ( ! empty( $args['sort_params'] ) ) ? apply_filters( 'sm_terms_sort_join_condition', $join_condition, $args['sort_params'] ) : $join_condition; // Query to get the ordered term_taxonomy_ids of the taxonomy being sorted. $taxonomy_ids = $wpdb->get_col( $wpdb->prepare( "SELECT {$wpdb->prefix}term_taxonomy.term_taxonomy_id FROM {$wpdb->prefix}term_taxonomy JOIN {$wpdb->prefix}terms ON ( {$wpdb->prefix}terms.term_id = {$wpdb->prefix}term_taxonomy.term_id ". $join_condition ." ) WHERE 1=%d", 1 ) ); $wpdb->num_rows; if ( empty( $taxonomy_ids ) || ( ! is_array( $taxonomy_ids ) ) || count( $taxonomy_ids ) < 0 || ( false !== strpos( $args['join'], 'taxonomy_sort' ) ) || ( empty( $args['id'] ) ) ) { return $args['join']; } //added 'term_relationships' check as the event gets fired more than once in some cases causing the query to break. $args['join'] .= " LEFT JOIN ( SELECT {$wpdb->prefix}term_relationships.object_id as object_id, {$wpdb->prefix}terms.name as term_name FROM {$wpdb->prefix}term_relationships JOIN {$wpdb->prefix}term_taxonomy ON( {$wpdb->prefix}term_taxonomy.term_taxonomy_id = {$wpdb->prefix}term_relationships.term_taxonomy_id AND {$wpdb->prefix}term_relationships.term_taxonomy_id IN (" .implode(",",$taxonomy_ids). ") ) JOIN {$wpdb->prefix}terms ON ( {$wpdb->prefix}terms.term_id = {$wpdb->prefix}term_taxonomy.term_id ) ". $join_condition ." ) as taxonomy_sort ON (taxonomy_sort.object_id = " . $args['id'] . ")"; $this->terms_sort_join = true; return $args['join']; } /** * Function to generate and export the CSV data. * @return void */ public function get_export_csv() { global $current_user; ini_set('memory_limit','-1'); set_time_limit(0); $this->req_params['sort_params'] = json_decode( stripslashes( $this->req_params['sort_params'] ), true ); $this->req_params['table_model'] = json_decode( stripslashes( $this->req_params['table_model'] ), true ); $current_store_model = get_transient( 'sa_sm_'.$this->dashboard_key ); if( ! empty( $current_store_model ) && !is_array( $current_store_model ) ) { $current_store_model = json_decode( $current_store_model, true ); } $column_model_transient = get_user_meta(get_current_user_id(), 'sa_sm_'.$this->dashboard_key, true); // Code for handling views if( ( defined('SMPRO') && true === SMPRO ) && ! empty( $this->req_params['is_view'] ) && ! empty( $this->req_params['active_view'] ) ) { if( class_exists( 'Smart_Manager_Pro_Views' ) ) { $view_obj = Smart_Manager_Pro_Views::get_instance(); if( is_callable( array( $view_obj, 'get' ) ) ){ $view_slug = $this->req_params['active_view']; $view_data = $view_obj->get($view_slug); if( ! empty( $view_data ) ) { $this->dashboard_key = $view_data['post_type']; $column_model_transient = get_user_meta(get_current_user_id(), 'sa_sm_'.$view_slug, true); $column_model_transient = json_decode( $view_data['params'], true ); if( !empty( $column_model_transient['search_params'] ) ) { if( ! empty( $column_model_transient['search_params']['isAdvanceSearch'] ) ) { // For advanced search if( ! empty( $column_model_transient['search_params']['params'] ) && is_array( $column_model_transient['search_params']['params'] ) ) { array_walk( $column_model_transient['search_params']['params'], function ( &$value ) { $value = ( ! empty( $value ) ) ? ( json_encode( $value ) ) : ''; } ); } } $search_params = $column_model_transient['search_params']; } } } } } if( !empty( $column_model_transient ) && !empty( $current_store_model ) ) { $current_store_model = $this->map_column_to_store_model( $current_store_model, $column_model_transient ); } $col_model = (!empty($current_store_model['columns'])) ? $current_store_model['columns'] : array(); $col_model = apply_filters( 'sm_col_model_for_export', $col_model, $this->req_params ); $data = $this->get_data_model( $col_model ); if ( empty( $data ) && is_callable( array( 'Smart_Manager', 'log' ) ) ) { Smart_Manager::log( 'error', _x( 'Export CSV: no data found ', 'export data model', 'smart-manager-for-wp-e-commerce' ) ); } $columns_header = $select_cols = $numeric_cols = array(); $getfield = ''; foreach( $col_model as $col ) { if( empty( $col['exportable'] ) || !empty( $col['hidden'] ) ) { continue; } $columns_header[ $col['data'] ] = $col['key']; $getfield .= $col['key'] . ','; if( ! empty( $col['values'] ) ) { $select_cols[ $col['data'] ] = $col['values']; } if( ( ( ! empty( $col['type'] ) && 'numeric' === $col['type'] ) ) || ( ( ! empty( $col['validator'] ) && 'customNumericTextEditor' === $col['validator'] ) ) ){ $numeric_cols[] = $col['data']; } } $fields = substr_replace($getfield, '', -1); $each_field = array_keys( $columns_header ); $view_name = ( ! empty( $this->req_params['active_view'] ) ) ? $this->req_params['active_view'] . '-view_' : ''; $csv_file_name = sanitize_title(get_bloginfo( 'name' )) . '_' . $this->dashboard_key . '_' . $view_name . gmdate('d-M-Y_H:i:s'); $csv_file_name = ( ! empty( $this->req_params[ 'storewide_option' ] ) ) ? ( ( 'entire_store' === $this->req_params[ 'storewide_option' ] ? $csv_file_name : $csv_file_name . '_all_products_stock_columns') ) . ".csv" : $csv_file_name . ( ( ! empty( $this->req_params[ 'columnsToBeExported' ] ) && 'visible' === $this->req_params[ 'columnsToBeExported' ] ) ? '_selected_records' : '_selected_products_' . $this->req_params[ 'columnsToBeExported' ] . '_columns' ) . ".csv"; $escaped_html_columns = apply_filters( 'sa_sm_escaped_html_columns', array( 'posts_post_excerpt', 'posts_post_content' ) ); foreach( (array) $data['items'] as $row ){ for($i = 0; $i < count ( $columns_header ); $i++){ if( $i == 0 ){ $fields .= "\n"; } if( !empty( $select_cols[ $each_field[$i] ] ) && !empty( $row[$each_field[$i]] ) ) { $row_each_field = !empty( $select_cols[ $each_field[$i] ][ $row[$each_field[$i]] ] ) ? $select_cols[ $each_field[$i] ][ $row[$each_field[$i]] ] : $row[$each_field[$i]]; } else { $row_each_field = !empty($row[$each_field[$i]]) ? $row[$each_field[$i]] : ''; } $array_temp = str_replace(array("\n", "\n\r", "\r\n", "\r"), "\t", $row_each_field); $array = str_replace("
            ", "\n", $array_temp); $array = str_replace('"', '""', $array); if( ! empty( $numeric_cols ) && in_array( $each_field[$i], $numeric_cols ) ){ $str = $array; } else{ $array = ( ! is_array( $array ) ) ? str_getcsv ( $array , ",", "\"" , "\\") : $array; $str = ( $array && is_array( $array ) ) ? implode( ', ', $array ) : ''; } $fields .= ( ! empty( $each_field[ $i ] ) && ! empty( $escaped_html_columns ) && is_array( $escaped_html_columns ) && in_array( $each_field[ $i ], $escaped_html_columns ) ) ? '"'. esc_html( $str ) . '",' : '"'. $str . '",'; } $fields = substr_replace($fields, '', -1); } $upload_dir = wp_upload_dir(); $file_data = array(); $file_data['wp_upload_dir'] = $upload_dir['path'] . '/'; $file_data['file_name'] = $csv_file_name; $file_data['file_content'] = $fields; if ( empty( $file_data ) && is_callable( array( 'Smart_Manager', 'log' ) ) ) { Smart_Manager::log( 'error', _x( 'Export CSV: no file data found ', 'export file data', 'smart-manager-for-wp-e-commerce' ) ); } header("Content-type: text/x-csv; charset=UTF-8"); header("Content-Transfer-Encoding: binary"); header("Content-Disposition: attachment; filename=".$file_data['file_name']); header("Pragma: no-cache"); header("Expires: 0"); while(ob_get_contents()) { ob_clean(); } echo $file_data['file_content']; exit; } /** * Function to get parent term values for taxonomies. * * @param array $args array of taxonomy related data. * @return array terms data. */ public function get_parent_term_values( $args = array() ) { if ( empty( $args['include_taxonomy'] ) || ! is_array( $args['taxonomy_obj'] ) ) { return; } $terms_val = array(); $terms_val_search = array(); // Code for storing the parent taxonomies titles $taxonomy_parents = array(); foreach ( $args['taxonomy_obj'] as $term_obj ) { if ( 'product_cat' === $args['include_taxonomy'] && ( 'product_cat' !== $term_obj->taxonomy ) ) { continue; } if ( empty( $term_obj->parent ) ) { $taxonomy_parents[ $term_obj->term_id ] = $term_obj->name; } } foreach ( $args['taxonomy_obj'] as $term_obj ) { if ( empty( $terms_val[ $term_obj->taxonomy ] ) ) { $terms_val[ $term_obj->taxonomy ] = array(); } $title = ucwords( ( ! empty( $taxonomy_parents[ $term_obj->parent ] ) ) ? ( $taxonomy_parents[ $term_obj->parent ] . ' — ' . $term_obj->name ) : $term_obj->name ); $terms_val[ $term_obj->taxonomy ][ $term_obj->term_id ] = $title; $terms_val_search[ $term_obj->taxonomy ][ $term_obj->slug ] = $title; //for advanced search $this->terms_val_parent[ $term_obj->taxonomy ][ $term_obj->term_id ] = array( 'term' => $term_obj->name, 'parent' => $term_obj->parent, 'title' => $title ); } return array( 'terms_val' => $terms_val, 'terms_val_search' => $terms_val_search ); } /** * Function to format advanced search value. * * @param array $params array contains search value, selected search operator. * @return string $params['search_val'] formatted search value. */ public function format_advanced_search_value( $params = array() ) { if ( empty( $params ) || ( ! is_array( $params ) ) || empty( $params['selected_search_operator'] ) ) { return; } global $wpdb; $params['search_val'] = trim( $params['search_val'] ); $params['search_val'] = ( ! empty( $params['selected_search_operator'] ) && ( in_array( $params['selected_search_operator'], array( 'like', 'not like') ) ) ) ? '%'.$wpdb->esc_like( $params['search_val'] ) . '%' : $params['search_val']; // To handle operators like startsWith, endsWith, notStartsWith, notEndswith. if ( in_array( $params['selected_search_operator'], array( 'anyOf', 'notAnyOf' ) ) ) { // to handle search values for anyOf, notAnyOf operators. $params['search_val'] = array_map( function( $value ) use ( $wpdb ) { return '%' . $wpdb->esc_like( trim( $value ) ) . '%'; }, explode( "|", $params['search_val'] ) ); } return $params['search_val']; } /** * Generates the WHERE clause for search queries. * * @param array $params The parameters for constructing the WHERE clause. * @return array An array containing the WHERE clause, additional conditions, and the search text. */ public function get_where_clause_for_search( $params = array() ) { if ( empty( $params ) || ( ! is_array( $params ) ) || empty( $params['where'] ) ) { return array(); } global $wpdb; $where_cond = array(); $search_text = ''; // Code for handling advanced search. if ( ! empty( $this->req_params ) && ( ! empty( $this->req_params['advanced_search_query'] ) ) && ( '[]' !== $this->req_params['advanced_search_query'] ) && ( false === strpos( $params['where'], 'sm_advanced_search_temp.flag > 0' ) ) ) { $params['where'] .= " AND {$wpdb->base_prefix}sm_advanced_search_temp.flag > 0 AND " . time() . " = " . time(); // Added time() as a unique identification condition so that when using advanced search the query doesn't get cached. } // Code for handling simple search. if ( ! empty( $this->req_params['search_text'] ) ) { $store_model_transient = get_transient( 'sa_sm_' . $this->dashboard_key ); if ( ! empty($store_model_transient) && ( ! is_array( $store_model_transient ) ) ) { $store_model_transient = json_decode($store_model_transient, true); } $col_model = ( ! empty( $store_model_transient['columns'] ) ) ? $store_model_transient['columns'] : array(); $search_text = $wpdb->_real_escape( $this->req_params['search_text'] ); $search_val = ( ! empty( $params['optimize_dashboard_speed'] ) ) ? '%s': '%'. $search_text .'%'; $ignored_cols = array( 'comment_count', 'post_mime_type', 'post_type', 'menu_order' ); $simple_search_ignored_cols = apply_filters( 'sm_simple_search_ignored_posts_columns', $ignored_cols, $col_model ); $matchedResults = array(); // Code for getting users table condition if ( ( ! empty( $col_model ) ) && is_array( $col_model ) ) { foreach ( $col_model as $col ) { if ( empty( $col['src'] ) ) { continue; } $src_exploded = explode( "/", $col['src'] ); if ( ! empty( $src_exploded[0] ) && ( 'posts' === $src_exploded[0] ) && ( ! in_array( $src_exploded[1], $simple_search_ignored_cols ) ) ) { if ( ! empty( $col['selectOptions'] ) ) { $matchedResults = preg_grep( '/' . ucfirst( $search_text ) . '.*/', $col['selectOptions'] ); } if ( is_array( $matchedResults ) && ( ! empty( $matchedResults ) ) ) { foreach ( array_keys( $matchedResults ) as $search ) { $search = ( ! empty( $params['optimize_dashboard_speed'] ) ) ? '%s': '%'. $search .'%'; if ( false === strpos( $params['where'], "{$wpdb->prefix}posts." . $src_exploded[1] . " LIKE '{$search}'") ) { $where_cond[] = "( {$wpdb->prefix}posts." . $src_exploded[1] . " LIKE '{$search}' )"; } } } else { if ( false === strpos( $params['where'], "{$wpdb->prefix}posts." . $src_exploded[1] . " LIKE '{$search_val}'") ) { $where_cond[] = "( {$wpdb->prefix}posts." . $src_exploded[1] . " LIKE '{$search_val}' )"; } } } } } $params['where'] .= ( ( false === strpos( $params['where'], 'meta_value LIKE' ) ) || ( ! empty( $where_cond ) ) ) ? ' AND ( ' : ''; $params['where'] .= ( false === strpos( $params['where'], "meta_value LIKE '{$search_val}'") ) ? " ({$wpdb->prefix}postmeta.meta_value LIKE '{$search_val}') " : ''; $params['where'] .= ( ! empty( $where_cond ) ) ? ' OR ' . implode( " OR ", $where_cond ) : ''; $params['where'] .= ( ( true === strpos( $params['where'], 'meta_value LIKE') ) || ( ! empty( $where_cond ) ) ) ? ' ) ' : ''; } if ( ! empty( $this->req_params['selected_ids'] ) && ( '[]' !== $this->req_params['selected_ids'] ) && empty( $this->req_params['storewide_option'] ) && ( ! empty( $this->req_params['cmd'] ) ) && ( 'get_export_csv' === $this->req_params['cmd'] ) ) { $selected_ids = json_decode( stripslashes( $this->req_params['selected_ids'] ) ); $params['where'] .= ( ! empty( $selected_ids ) ) ? " AND {$wpdb->prefix}posts.ID IN (" . implode( ",", $selected_ids ) . ")" : $params['where']; } return array( 'where' => $params['where'], 'where_cond' => $where_cond, 'search_text' => $search_text ); } /** * Adds custom JOIN clauses to the SQL query for search. * * @param array $params The parameters for constructing the JOIN clause. * @return string The modified JOIN clause. */ public function get_join_clause_for_search( $params = array() ) { if ( empty( $params ) || ( ! is_array( $params ) ) ) { return; } global $wpdb; $sort_params = array(); if ( ! empty( $params['wp_query_obj'] ) ) { $sort_params = ( ! empty( $params['wp_query_obj']->query_vars['sm_sort_params'] ) ) ? $params['wp_query_obj']->query_vars['sm_sort_params'] : array(); } elseif ( ! empty( $params['sort_params'] ) ) { $sort_params = $params['sort_params']; } // Code for sorting of the terms columns if ( ! empty( $sort_params ) ) { if ( ! empty( $sort_params['column_nm'] ) && ! empty( $sort_params['sortOrder'] ) ) { if ( ! empty( $sort_params['table'] ) && ( 'terms' === $sort_params['table'] ) ) { $params['join'] = $this->terms_table_column_sort_query( array( 'col_name' => $sort_params['column_nm'], 'id' => $wpdb->prefix . 'posts.ID', 'sort_order' => $sort_params['sortOrder'], 'join' => $params['join'], 'wp_query_obj' => ( ! empty( $params['wp_query_obj'] ) ) ? $params['wp_query_obj'] : '', 'sort_params' => $sort_params ) ); } } } // Code for handling advanced search. if ( ! empty( $this->req_params ) && ! empty( $this->req_params['advanced_search_query'] ) && $this->req_params['advanced_search_query'] != '[]' && ( false === strpos( $params['join'], 'sm_advanced_search_temp' ) ) ) { $params['join'] .= " JOIN {$wpdb->base_prefix}sm_advanced_search_temp ON ({$wpdb->base_prefix}sm_advanced_search_temp.product_id = {$wpdb->prefix}posts.id)"; } // Code for handling simple search. if ( ! empty( $this->req_params['search_text'] ) && ( false === strpos( $params['join'], 'postmeta' ) ) ) { $params['join'] .= " JOIN {$wpdb->prefix}postmeta ON ({$wpdb->prefix}postmeta.post_id = {$wpdb->prefix}posts.id)"; } return $params['join']; } /** * Generates the GROUP BY clause for search queries. * * @param array $params The parameters for constructing the GROUP BY clause. * @return string The modified GROUP BY clause. */ public function get_group_by_clause_for_search( $params = array() ) { if ( empty( $params ) || ( ! is_array( $params ) ) ) { return; } global $wpdb; return ( false === strpos( $params['group_by'], 'posts.id' ) ) ? $wpdb->prefix.'posts.id' : $params['group_by']; } /** * Generates the ORDER BY clause for sorting based on the provided parameters. * * @param array $params. An array of parameters to determine the sorting order. * @return string The ORDER BY clause for the SQL query. */ public function get_order_by_clause_for_sort( $params = array() ) { if ( empty( $params ) || ( ! is_array( $params ) ) ) { return; } global $wpdb; $sort_params = array(); if ( ! empty( $params['wp_query_obj'] ) ) { $sort_params = ( ! empty( $params['wp_query_obj']->query_vars['sm_sort_params'] ) ) ? $params['wp_query_obj']->query_vars['sm_sort_params'] : array(); } elseif( ! empty( $params['sort_params'] ) ) { $sort_params = $params['sort_params']; } if ( ! empty( $sort_params ) && ( ! empty( $sort_params['column_nm'] ) ) ) { $sort_order = ( ! empty( $sort_params['sortOrder'] ) ) ? $sort_params['sortOrder'] : 'ASC'; if ( ! empty( $sort_params['table'] ) ) { if ( 'posts' === $sort_params['table'] ) { $params['order_by'] = $sort_params['column_nm'] .' '. $sort_order; } else if ( ( 'terms' === $sort_params['table'] ) && ( true === $this->terms_sort_join ) ) { $params['order_by'] = ' taxonomy_sort.term_name '.$sort_order ; } } } // Condition for sorting of postmeta_cols. if ( ! empty( $sort_params ) && ( ! empty( $sort_params['sort_by_meta_key'] ) ) ) { $sort_order = ( ! empty( $sort_params['sortOrder'] ) ) ? $sort_params['sortOrder'] : 'ASC'; $post_type = ( ! empty( $this->post_type ) ) ? $this->post_type : $this->req_params['active_module']; $post_type = ( ! is_array( $post_type ) ) ? array( $post_type ) : $post_type; $meta_value = ( ! empty( $sort_params['column_nm'] ) && ( 'meta_value_num' === $sort_params['column_nm'] ) ) ? 'pm.meta_value+0' : 'pm.meta_value'; $post_ids = $wpdb->get_col( "SELECT DISTINCT p.ID FROM {$wpdb->prefix}posts AS p LEFT JOIN {$wpdb->prefix}postmeta AS pm ON (p.ID = pm.post_id AND pm.meta_key = '". $sort_params['sort_by_meta_key'] ."') WHERE p.post_type IN ('". implode("','", $post_type) ."') ORDER BY ". $meta_value ." ". $sort_order ); $option_name = 'sm_data_model_sorted_ids'; update_option( $option_name, implode( ',', $post_ids ), 'no' ); $limit = ( isset( $params['wp_query_obj']->query['posts_per_page'] ) && isset( $params['wp_query_obj']->query['offset'] ) && $params['wp_query_obj']->query['posts_per_page'] > 0 ) ? ( " LIMIT ". $params['wp_query_obj']->query['offset'] .", ". $params['wp_query_obj']->query['posts_per_page'] ) : ''; $params['order_by'] = " FIND_IN_SET( ".$wpdb->prefix."posts.ID, ( SELECT option_value FROM ".$wpdb->prefix."options WHERE option_name = '".$option_name."' ) ) "; } return $params['order_by']; } } } classes/class-smart-manager-product-stock-log.php000064400000035772147600337620016157 0ustar00 array( 'sm_task_details' => 'task_id', 'posts' => 'ID', ), 'meta' => array( 'postmeta' => 'post_id', ), 'terms' => array( 'terms' => 'term_id', ) ); } ); parent::__construct( $dashboard_key ); global $wpdb; $this->dashboard_key = 'product'; $this->key_mod_fields = array( 'record_id', 'prev_val', 'updated_val' ); $this->posts_join = " JOIN {$wpdb->prefix}posts ON ({$wpdb->prefix}posts.ID = {$wpdb->prefix}sm_task_details.record_id)"; $this->postmeta_join = " LEFT JOIN {$wpdb->prefix}postmeta ON ({$wpdb->prefix}sm_task_details.record_id = {$wpdb->prefix}postmeta.post_id AND {$wpdb->prefix}postmeta.meta_key = '_sku')"; $this->terms_join = " LEFT JOIN {$wpdb->prefix}term_relationships ON ({$wpdb->prefix}sm_task_details.record_id = {$wpdb->prefix}term_relationships.object_id)"; add_filter( 'sm_default_dashboard_model', array( &$this, 'dashboard_model' ) ); add_filter( 'sm_data_model', array( &$this, 'data_model' ), 99, 2 ); add_filter( 'sm_where_tasks_cond', array( &$this, 'where_cond' ) ); add_filter( 'sm_join_tasks_cond', array( &$this, 'join_cond' ) ); add_filter( 'sm_select_tasks_query', array( &$this, 'select_query' ) ); add_filter( 'sm_search_query_posts_select', array( &$this, 'modify_posts_for_advanced_search_select' ), 10, 2 ); add_filter( 'sm_search_query_posts_from', array( &$this, 'modify_posts_for_advanced_search_from' ), 10, 2 ); add_filter( 'sm_search_query_postmeta_select', array( &$this, 'modify_postmeta_for_advanced_search_select' ), 10, 2 ); add_filter( 'sm_search_query_postmeta_from', array( &$this, 'modify_postmeta_for_advanced_search_from' ), 11, 2 ); add_filter( 'sm_search_query_terms_select', array( &$this, 'modify_terms_for_advanced_search_select' ), 10, 2 ); add_filter( 'sm_search_query_terms_from', array( &$this, 'modify_terms_for_advanced_search_from' ), 10, 2 ); add_filter( 'sm_search_query_terms_where',array( &$this,'modify_terms_for_advanced_search_where' ), 10, 2 ); } /** * Generate dashboard model for product stock log * * @param array $dashboard_model array contains the dashboard_model data. * @return array $dashboard_model returns dashboard_model data */ public function dashboard_model( $dashboard_model = array() ) { global $wpdb; if ( empty( $dashboard_model ) || empty( $dashboard_model['columns'] ) ) { return $dashboard_model; } $task_cols = array( 'id' => _x( 'Task ID', 'task id', 'smart-manager-for-wp-e-commerce' ), 'type' => _x( 'Type', 'task type', 'smart-manager-for-wp-e-commerce' ), 'status' => _x( 'Status', 'task status', 'smart-manager-for-wp-e-commerce' ), 'completed_date' => _x( 'Date', 'task completed date', 'smart-manager-for-wp-e-commerce' ), 'author' => _x( 'Author', 'name and email address of the user who created the task', 'smart-manager-for-wp-e-commerce' ) ); $column_model = array(); $column_model = &$dashboard_model['columns']; foreach ( $column_model as $key => &$column ) { if ( empty( $column['src'] ) ) continue; $src_exploded = explode( "/", $column['src'] ); if ( empty( $src_exploded ) ) { $src = $column['src']; } $src = $src_exploded[1]; $col_table = $src_exploded[0]; if ( sizeof( $src_exploded ) > 2 ) { $col_table = $src_exploded[0]; $cond = explode( "=", $src_exploded[1] ); if ( 2 === sizeof( $cond ) ) { $src = $cond[1]; } } if ( empty( $src ) ) { continue; } if ( false === array_key_exists( $src, $task_cols ) ) { unset( $column_model[ $key ] ); continue; } $column['name'] = $column['key'] = $task_cols[ $src ]; } $product_stock_fields = array( 'record_id' => _x( 'Product ID', 'product id', 'smart-manager-for-wp-e-commerce' ), 'prev_val' => _x( 'Old Value', 'old stock value', 'smart-manager-for-wp-e-commerce' ), 'updated_val' => _x( 'New Value', 'New stock value', 'smart-manager-for-wp-e-commerce' ) ); $numeric_cols = array_merge( $product_stock_fields, array( 'post_parent' => _x( 'Parent ID', 'parent id', 'smart-manager-for-wp-e-commerce' ) ) ); $product_cols = array( '_sku' => _x( 'SKU', 'product SKU', 'smart-manager-for-wp-e-commerce' ), 'post_title' => _x( 'Product Title', 'product title', 'smart-manager-for-wp-e-commerce' ), 'product_type' => _x( 'Product Type', 'product type', 'smart-manager-for-wp-e-commerce' ) ); $cols = array_merge( $numeric_cols, $product_cols ); foreach ( $cols as $key => $val ) { $args = array( 'table_nm' => 'posts', 'col' => $key, 'type' => ( array_key_exists( $key, $numeric_cols ) ) ? 'numeric' : 'text', 'editable' => false, 'editor' => false, 'name' => $cols[ $key ] ); if ( array_key_exists( $key, $product_stock_fields ) ) { $args['table_nm' ] = 'sm_task_details'; } elseif ( '_sku' === $key ) { $args['table_nm' ] = 'postmeta'; $args['is_meta'] = true; } elseif ( 'product_type' === $key ) { $args['table_nm' ] = 'terms'; $args['type'] = 'dropdown'; $taxonomy_terms = get_terms( array( 'taxonomy' => $key, 'hide_empty' => false, ) ); $terms_val = array(); $terms_val_search = array(); if ( ! is_wp_error( $taxonomy_terms ) && ! empty( $taxonomy_terms ) ) { foreach ( $taxonomy_terms as $term_obj ) { if ( empty( $terms_val[ $term_obj->taxonomy ] ) ) { $terms_val[ $term_obj->taxonomy ] = array(); } $title = ucwords( $term_obj->name ); $terms_val[ $term_obj->taxonomy ][ $term_obj->term_id ] = $title; $terms_val_search[ $term_obj->taxonomy ][ $term_obj->slug ] = $title; //for advanced search } } if ( ! empty( $terms_val[ $key ] ) ) { if( ! empty( $terms_val_search[ $key ] ) ){ $args['search_values'] = array(); foreach( $terms_val_search[ $key ] as $key => $value ) { $args['search_values'][] = array( 'key' => $key, 'value' => $value ); } } } } $column_model[] = $this->get_default_column_model( $args ); } $dashboard_model['display_name'] = _x( 'Product Stock Log', 'product stock log dashboard', 'smart-manager-for-wp-e-commerce' ); return $dashboard_model; } /** * Generate data model * * @param array $data_model array containing the data model. * @param array $data_col_params array containing column params. * @return array $data_model returns data_model array */ public function data_model( $data_model = array(), $data_col_params = array() ) { if ( empty( $data_model ) || ( ! is_array( $data_model ) ) || empty( $data_model['items'] ) ) { return $data_model; } global $wpdb; $index = 0; $items = $data_model['items']; $product = null; foreach ( $items as $value ) { if ( ( ( ! empty( $value ) ) && is_array( $value ) ) && in_array( 'sm_task_details_record_id', array_keys( $value ) ) && ( ! empty( $value['sm_task_details_record_id'] ) ) ) { $product = function_exists( 'wc_get_product' ) ? wc_get_product( absint( $value['sm_task_details_record_id'] ) ) : null; ; } if ( ! $product instanceof WC_Product ) { continue; } $items[ $index ]['posts_post_title'] = ( is_callable( array( $product, 'get_name' ) ) ) ? $product->get_name() : ''; $items[ $index ]['terms_product_type'] = ( is_callable( array( $product, 'get_type' ) ) ) ? $product->get_type() : ''; $items[ $index ]['postmeta_meta_key__sku_meta_value__sku'] = ( is_callable( array( $product, 'get_sku' ) ) ) ? $product->get_sku() : ''; $items[ $index ]['posts_post_parent'] = ( is_callable( array( $product, 'get_parent_id' ) ) ) ? $product->get_parent_id() : 0; $index++; } $data_model['items'] = ( ! empty( $items ) ) ? $items : array(); return $data_model; } /** * Modify where condition for fetching stock fields from task details * * @param string $where where condition of sm_tasks table. * @return string updated where condition */ public function where_cond( $where = '' ) { global $wpdb; $where_cond = " AND {$wpdb->prefix}sm_task_details.field = 'postmeta/meta_key=_stock/meta_value=_stock'"; return ( false === strpos( $where, $where_cond ) ) ? $where . $where_cond : $where; } /** * Modify join condition for fetching stock fields from task details * * @param string $join join condition of sm_tasks table. * @return string updated join condition */ public function join_cond( $join = '' ) { global $wpdb; $join_cond = " JOIN {$wpdb->prefix}sm_task_details ON ({$wpdb->prefix}sm_task_details.task_id = {$wpdb->prefix}sm_tasks.id)"; if ( ! empty( $this->req_params['sort_params'] ) ) { if ( ! empty( $this->req_params['sort_params']['column'] ) && ! empty( $this->req_params['sort_params']['sortOrder'] ) ) { if ( false !== strpos( $this->req_params['sort_params']['column'], '/' ) ) { $col_exploded = explode( '/', $this->req_params['sort_params']['column'] ); $table_nm = $col_exploded[0]; } switch ( $table_nm ) { case 'posts': $join_cond .= $this->posts_join; break; case 'postmeta': $join_cond .= $this->postmeta_join; break; case 'terms': $join_cond .= $this->posts_join . $this->terms_join; break; } } } return ( false === strpos( $join, $join_cond ) ) ? $join . $join_cond : $join; } /** * Modify select condition for fetching stock fields from task details * * @param string $select select query of sm_tasks table. * @return string updated select query */ public function select_query( $select = '' ) { global $wpdb; return "SELECT {$wpdb->prefix}sm_tasks.*, {$wpdb->prefix}sm_task_details.record_id, {$wpdb->prefix}sm_task_details.prev_val, {$wpdb->prefix}sm_task_details.updated_val"; } /** * Modify advanced search select query for posts table * * @param string $select select query of posts table. * @param array $params array of search params. * @return string updated select query */ public function modify_posts_for_advanced_search_select( $select = '', $params = array() ) { return $this->modify_select_query_for_advanced_search( array( 'flag' => $params['flag'], 'cat_flag' => $params['cat_flag'] ) ); } /** * Modify advanced search from clause for posts table * * @param string $from from clause of posts table. * @param array $params array of search params. * @return string updated from clause */ public function modify_posts_for_advanced_search_from( $from = '', $params = array() ) { global $wpdb; return " FROM {$wpdb->prefix}sm_task_details" . $this->posts_join; } /** * Modify advanced search select query for postmeta table * * @param string $select select query of postmeta table. * @param array $params array of search params. * @return string updated select query */ public function modify_postmeta_for_advanced_search_select( $select = '', $params = array() ) { return $this->modify_select_query_for_advanced_search( array( 'flag' => $params['flag'], 'cat_flag' => ", 0" ) ); } /** * Modify advanced search from clause for postmeta table * * @param string $from from clause of postmeta table. * @param array $params array of search params. * @return string updated from clause */ public function modify_postmeta_for_advanced_search_from( $from = '', $params = array() ) { global $wpdb; return " FROM {$wpdb->prefix}sm_task_details" . $this->postmeta_join; } /** * Modify advanced search select query for terms table * * @param string $select select query. * @param array $params array of search params. * @return string updated select query */ public function modify_terms_for_advanced_search_select( $select = '', $params = array() ) { return $this->modify_select_query_for_advanced_search( array( 'flag' => $params['terms_search_result_flag'], 'cat_flag' => ", 0" ) ); } /** * Modify advanced search select query * * @param array $args array of flag and cat_flag data. * @return string updated select query */ public function modify_select_query_for_advanced_search( $args = array() ) { global $wpdb; return "SELECT DISTINCT {$wpdb->prefix}sm_task_details.task_id " . $args['flag'] ." ". $args['cat_flag']; } /** * Modify advanced search select query for terms table * * @param string $from from clause of terms table. * @param array $params array of search params. * @return string updated from clause */ public function modify_terms_for_advanced_search_from( $from = '', $params = array() ) { global $wpdb; return " FROM {$wpdb->prefix}sm_task_details" . $this->terms_join; } /** * Modify advanced search select query for terms table * * @param string $search_query_terms_where search query of terms table. * @param array $search_params array of search params. * @return string updated select query */ public function modify_terms_for_advanced_search_where( $search_query_terms_where = '', $search_params = array() ) { global $wpdb; $search_query_terms_where = "WHERE {$wpdb->prefix}term_relationships.term_taxonomy_id IN (". $search_params['result_taxonomy_ids'] .")"; return ( ! empty( $search_params['tt_ids_to_exclude'] ) ) ? $search_query_terms_where . " AND {$wpdb->prefix}sm_task_details.record_id NOT IN ( SELECT object_id FROM {$wpdb->prefix}term_relationships WHERE term_taxonomy_id IN (". implode( ",", $search_params['tt_ids_to_exclude'] ) .") )" : $search_query_terms_where; } } } languages/smart-manager-for-wp-e-commerce-fr_FR.mo000064400000004773147600337620016046 0ustar00Þ•!$,,:-hn …¦¶Å× Üè ïúÿ!(1 5 CPYj {‰”˜ œ?ª9ês$J˜ãæ%&=+U †’ ›¦ª®¿ÄÍ Õßãü   2 D R Y ^ b e <u H² A required Smart Manager file is missing. Can't continue. AcromAdditional DescriptionAn upgrade for Smart Manager ProBilling AddressBilling PeriodClick to upgrade.DateDescriptionError:Export CSVNameNoPayment MethodsPriceProductsPublicQuantitySKUSelect ActionSelect FieldShippingShipping AddressShipping methodsSmart ManagerStatusTaxYesforis available.notificationThis feature is available only in the Pro version.titleFor more than one values, use pipe (|) as delimiterProject-Id-Version: Smart Manager 4.2.1 Report-Msgid-Bugs-To: POT-Creation-Date: 2019-04-20 14:04:35+00:00 PO-Revision-Date: 2022-03-17 04:14+0000 Last-Translator: Mansi Language-Team: French (France) Language: fr_FR Plural-Forms: nplurals=2; plural=n > 1; MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-SourceCharset: utf-8 X-Poedit-KeywordsList: _:1;gettext:1;dgettext:2;ngettext:1,2;dngettext:2,3;__:1;_e:1;_c:1;_n:1,2;_n_noop:1,2;_nc:1,2;__ngettext:1,2;__ngettext_noop:1,2;_x:1,2c;_ex:1,2c;_nx:1,2,4c;_nx_noop:1,2,3c;_n_js:1,2;_nx_js:1,2,3c;esc_attr__:1;esc_html__:1;esc_attr_e:1;esc_html_e:1;esc_attr_x:1,2c;esc_html_x:1,2c;comments_number_link:2,3;t:1;st:1;trans:1;transChoice:1,2 X-Poedit-Basepath: ../ X-Poedit-SearchPath-0: . X-Loco-Target-Locale: fr_FR X-Generator: Loco https://localise.biz/Impossible de continuer, un fichier requis par Smart Manager est manquant.DuDescription additionnelleUne mise à jour de Smart Manager ProAdresse de facturationRégion de factuarationCliquez ici pour effectuer la mise à jour.EtatDescriptionErreur :Export CSVNomNonMode de paiementPrixProduitsPubliéQuantitéUGSSélectionner une actionSélectionner un champLivraisonAdresse de livraisonMode de livraisonSmart ManagerStatutTaxeOuiOuest disponible.Cette fonction est disponible uniquement dans la version ProPour plus d’une valeur, utiliser le caractère | comme délimiteurlanguages/smart-manager-for-wp-e-commerce-ro_RU.po000064400000236511147600337620016076 0ustar00# Translation of Plugins - Smart Manager For WooCommerce – Stock Management, Bulk Edit & more… - Stable (latest release) in Russian # This file is distributed under the same license as the Plugins - Smart Manager For WooCommerce – Stock Management, Bulk Edit & more… - Stable (latest release) package. msgid "" msgstr "" "PO-Revision-Date: 2022-03-17 04:14+0000\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : ((n % " "10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14)) ? 1 : 2);\n" "X-Generator: Loco https://localise.biz/\n" "Language: ro_RU\n" "Project-Id-Version: Plugins - Smart Manager For WooCommerce – Stock " "Management, Bulk Edit & more… - Stable (latest release)\n" "Language-Team: Romanian (Russian Federation)\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2022-03-07 04:07+0000\n" "Last-Translator: fg\n" "X-Loco-Version: 2.5.8; wp-5.9.1" #: classes/class-smart-manager-pricing.php:405 msgid " More powerful features with Smart Manager Pro!" msgstr "Более мощный функционал в Smart Manager Pro!" #: classes/class-smart-manager-pricing.php:351 msgid "$112" msgstr "$112" #: classes/class-smart-manager-pricing.php:363 msgid "$135" msgstr "$135" #: classes/class-smart-manager-pricing.php:350 msgid "$149" msgstr "$149" #: classes/class-smart-manager-pricing.php:362 msgid "$179" msgstr "$179" #: classes/class-smart-manager-pricing.php:374 msgid "$360" msgstr "" #: classes/class-smart-manager-pricing.php:385 msgid "$375" msgstr "" #: classes/class-smart-manager-pricing.php:373 msgid "$479" msgstr "$479" #: classes/class-smart-manager-pricing.php:384 #, fuzzy #| msgid "$449" msgid "$499" msgstr "$449" #: classes/class-smart-manager-pricing.php:351 msgid "$75" msgstr "$75" #: classes/class-smart-manager-pricing.php:363 msgid "$90" msgstr "$90" #: pro/classes/class-smart-manager-pro-background-updater.php:165 msgid "% Completed" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:143 #, php-format msgid "% completed" msgstr "" #. 1. Error title 2. The bulk process #: pro/classes/class-smart-manager-pro-background-updater.php:307 #, php-format msgid "" "%1$s: The %2$s process has stopped. Please review the Smart Manager " "dashboard to check the status." msgstr "" #: class-smart-manager.php:1460 msgid "%1s" msgstr "%1s" #: classes/class-smart-manager-admin-welcome.php:429 msgid "%s" msgstr "%s" #: class-smart-manager.php:862 msgid "%s to check Smart Manager Pro features and claim your discount." msgstr "%s, чтобы узнать о возможноÑÑ‚ÑÑ… Smart Manager Pro и получить Ñкидку." #: pro/classes/class-smart-manager-pro-background-updater.php:323 msgid "--:--:--" msgstr "" #: classes/class-smart-manager-pricing.php:348 msgid "1 site (Annual)" msgstr "1 Ñайт (на год)" #: classes/class-smart-manager-pricing.php:371 msgid "1 site (Lifetime)" msgstr "1 Ñайт (пожизненно)" #: classes/class-smart-manager-pricing.php:667 msgid "20 or 30 times quicker store management" msgstr "Управление магазином в 20 — 30 раз быÑтрее" #: class-smart-manager.php:861 classes/class-smart-manager-pricing.php:340 msgid "25% Off" msgstr "Скидка 25%" #: classes/class-smart-manager-pricing.php:360 msgid "5 sites (Annual)" msgstr "5 Ñайтов (на год)" #: classes/class-smart-manager-pricing.php:382 msgid "5 sites (Lifetime)" msgstr "5 Ñайтов (пожизненно)" #: class-smart-manager.php:665 msgid " 🔥 Go Pro" msgstr " 🔥 Переходите на Pro" #. Description of the plugin #, fuzzy #| msgid "" #| "Lite Version Installed. The #1 and a powerful tool to " #| "manage stock, inventory from a single place. Super quick and super easy." msgid "" "Pro Version Installed. The #1 and a powerful tool to manage " "stock, inventory from a single place. Super quick and super easy." msgstr "" "ВерÑÐ¸Ñ Lite уÑтановлена. Мощный инÑтрумент â„–1 Ð´Ð»Ñ " "ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð°Ñами товаров магазина из одного меÑта. Супер-быÑтро и Ñупер-" "легко." #: class-smart-manager.php:1570 msgid "A required Smart Manager file is missing. Can't continue. " msgstr "ОтÑутÑтвует важный файл плагина Smart Manager. Ðевозможно продолжить." #: classes/class-smart-manager-pricing.php:659 msgid "A whole afternoon’s work in seconds" msgstr "ÐŸÐ¾Ð»Ð´Ð½Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ за Ñчитанные Ñекунды" #: classes/class-smart-manager-pricing.php:662 msgid "Acrom" msgstr "Acrom" #: pro/templates/email.php:43 msgid "Action" msgstr "" #: pro/assets/js/smart-manager-product.js:154 pro/assets/js/smart-manager.js:37 msgctxt "action operator" msgid "add to" msgstr "" #: pro/assets/js/smart-manager.js:25 pro/assets/js/smart-manager.js:47 msgctxt "action operator" msgid "copy from" msgstr "" #: pro/assets/js/smart-manager-product.js:155 pro/assets/js/smart-manager.js:37 msgctxt "action operator" msgid "remove from" msgstr "" #: pro/assets/js/smart-manager.js:39 msgctxt "action operator" msgid "search & replace" msgstr "" #: pro/assets/js/smart-manager-product.js:153 pro/assets/js/smart-manager.js:46 #: pro/assets/js/smart-manager.js:891 pro/assets/js/smart-manager.js:1027 msgctxt "action operator" msgid "set to" msgstr "" #: assets/js/smart-manager-product.js:229 msgctxt "add attribute button" msgid "Add" msgstr "" #: classes/class-smart-manager-pricing.php:451 msgid "Add or Delete records" msgstr "Добавление или удаление запиÑей" #: classes/class-smart-manager-product.php:958 msgid "Additional Description" msgstr "Дополнительное опиÑание" #: pro/assets/js/smart-manager.js:28 msgctxt "additional operator" msgid "decrease by" msgstr "" #: pro/assets/js/smart-manager.js:28 msgctxt "additional operator" msgid "increase by" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:326 msgid "Address to look in" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:125 msgid "Adjacent Buffering?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:295 msgid "Advanced Search" msgstr "РаÑширенный поиÑк" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:42 #, javascript-format msgctxt "advanced search conditions" msgid "%d condition%s" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:42 msgctxt "advanced search conditions" msgid "s" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:155 msgctxt "advanced search content" msgid "condition groups pass" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:148 msgctxt "advanced search content" msgid "When" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:153 msgctxt "advanced search option" msgid "all" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:152 msgctxt "advanced search option" msgid "at least one" msgstr "" #: classes/class-smart-manager-pricing.php:484 msgid "Advanced Search using “AND†filter" msgstr "РаÑширенный поиÑк Ñ Ð¸Ñпользованием фильтра «И»" #: classes/class-smart-manager-pricing.php:495 msgid "Advanced Search using “OR†filter" msgstr "РаÑширенный поиÑк Ñ Ð¸Ñпользованием фильтра «ИЛИ»" #: pro/classes/class-smart-manager-pro-background-updater.php:294 msgid "All" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:237 msgid "All blocks being booked" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:227 msgid "All dates are..." msgstr "" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:50 #: pro/assets/js/smart-manager.js:868 msgid "All Items In Search Results" msgstr "" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:50 #: pro/assets/js/smart-manager.js:868 msgid "All Items In Store" msgstr "" #: classes/class-smart-manager-product.php:912 msgid "Allow" msgstr "Разрешить" #: pro/classes/class-smart-manager-pro-product.php:136 msgid "Allow Combination" msgstr "" #: classes/class-smart-manager-shop-coupon.php:123 msgid "Allow Free Shipping" msgstr "Разрешить беÑплатную доÑтавку" #: pro/classes/class-smart-manager-pro-shop-coupon.php:252 msgid "Allow free shipping" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:132 #, php-format msgid "Allow search engines to show this %1$s in search results?" msgstr "" #: classes/class-smart-manager-product.php:911 msgid "Allow, but notify customer" msgstr "Разрешить, но уведомить клиента" #: classes/class-smart-manager-shop-coupon.php:119 msgid "Allowed Emails" msgstr "ДопуÑтимые Email'Ñ‹" #: pro/classes/class-smart-manager-pro-shop-coupon.php:291 msgid "Allowed emails" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:213 msgid "Allowed user roles" msgstr "" #: class-smart-manager.php:1468 msgid "An upgrade for Smart Manager Pro" msgstr "Переход на Smart Manager Pro" #: classes/class-smart-manager-admin-welcome.php:281 msgid "any custom post type in WordPress" msgstr "любые типы запиÑей WordPress" #: classes/class-smart-manager-admin-welcome.php:281 msgid "" "Apart from WooCommerce post types like Products, Orders, Coupons, now you " "can manage %s. Be it Posts, Pages, Media, WordPress Users, etc. you can now " "manage everything using Smart Manager." msgstr "" "Помимо типов запиÑей WooCommerce, таких как товары, заказы и купоны, теперь " "Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупны %s. Будь то запиÑи блога, Ñтраницы, файлы, " "пользователи WordPress и Ñ‚.д. Теперь Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Smart Manager можно управлÑÑ‚ÑŒ " "вÑем." #. 1. The bulk process #: pro/classes/class-smart-manager-pro-background-updater.php:348 #, php-format msgid "Are you sure you want to stop the %s process? Click OK to stop." msgstr "" #: assets/js/smart-manager-product.js:302 msgctxt "attribute button" msgid "Select all" msgstr "" #: assets/js/smart-manager-product.js:303 msgctxt "attribute button" msgid "Select none" msgstr "" #: assets/js/smart-manager-product.js:121 msgctxt "attribute list" msgid "Custom product attribute" msgstr "" #: pro/assets/js/smart-manager-product.js:40 msgctxt "attribute operator" msgid "Add Attribute" msgstr "" #: pro/assets/js/smart-manager-product.js:49 msgctxt "attribute operator" msgid "Remove Attribute" msgstr "" #: assets/js/smart-manager-product.js:283 msgctxt "attribute variation" msgid "Used for variations" msgstr "" #: assets/js/smart-manager-product.js:280 msgctxt "attribute visibility" msgid "Visible on the product page" msgstr "" #: classes/class-smart-manager-product.php:1068 msgid "Attributes" msgstr "Ðтрибуты" #: classes/class-smart-manager-product.php:1101 msgid "Attributes: custom" msgstr "Ðтрибуты: произвольные" #: pro/classes/class-smart-manager-pro-shop-coupon.php:253 msgid "Auto Generate Coupon" msgstr "" #: class-smart-manager.php:1649 msgid "Auto-updates are not available for this plugin." msgstr "ÐвтоматичеÑкие Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтупны Ð´Ð»Ñ Ñтого плагина." #: pro/classes/class-smart-manager-pro-product.php:222 msgid "Automatically assigned" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:229 msgid "available by default" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:264 msgid "Back to Smart Manager" msgstr "" #: pro/assets/js/smart-manager-product.js:216 msgctxt "batch update option" msgid "All" msgstr "" #: pro/templates/email.php:39 msgid "Below are the lists of updates done:" msgstr "" #: classes/class-smart-manager-pricing.php:359 msgid "Best Seller" msgstr "Лидер продаж" #: classes/class-smart-manager-admin-welcome.php:333 msgid "Biggest Time Saver" msgstr "Ð¡Ð°Ð¼Ð°Ñ Ð±Ð¾Ð»ÑŒÑˆÐ°Ñ ÑÐºÐ¾Ð½Ð¾Ð¼Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸" #: pro/classes/class-smart-manager-pro-shop-coupon.php:327 msgid "Billing" msgstr "" #: pro/templates/order-invoice.php:144 msgid "Billing Address" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:252 msgid "Billing Period" msgstr "" #: pro/classes/class-smart-manager-pro-wc-booking.php:171 msgid "Booked Product" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:80 msgid "Booking can be cancelled until" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:196 msgid "Booking can be cancelled until (Unit)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:77 msgid "Booking duration" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:183 msgid "Booking Duration (Type)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:191 msgid "Booking Duration (Unit)" msgstr "" #: assets/js/smart-manager.js:987 #, javascript-format msgctxt "bottom bar" msgid "%d %s loaded" msgstr "" #: assets/js/smart-manager.js:1005 #, javascript-format msgctxt "bottom bar" msgid "%d of %d %s loaded" msgstr "" #: assets/js/smart-manager.js:980 assets/js/smart-manager.js:1005 #, javascript-format msgctxt "bottom bar" msgid "No %s Found" msgstr "" #: classes/class-smart-manager-pricing.php:670 msgid "Brian Batcher" msgstr "Brian Batcher" #: class-smart-manager.php:1149 #: classes/class-smart-manager-admin-welcome.php:331 msgid "Bulk Edit" msgstr "МаÑÑÐ¾Ð²Ð°Ñ Ð¿Ñ€Ð°Ð²ÐºÐ°" #: classes/class-smart-manager-admin-welcome.php:333 msgid "Bulk Edit - %1s (only in %2s)" msgstr "МаÑÑÐ¾Ð²Ð°Ñ Ð¿Ñ€Ð°Ð²ÐºÐ° - %1s (только в %2s)" #: classes/class-smart-manager-pricing.php:506 msgid "Bulk Edit / Batch Update" msgstr "МаÑÑовое правка/пакетное обновление" #: assets/js/smart-manager.js:1705 msgctxt "button" msgid "Add" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:50 msgctxt "button" msgid "Add a condition" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:66 msgctxt "button" msgid "Add another group" msgstr "" #: assets/js/smart-manager.js:1713 msgctxt "button" msgid "Add images to product gallery" msgstr "" #: assets/js/smart-manager.js:396 msgctxt "button" msgid "Add Row" msgstr "" #: assets/js/smart-manager.js:1714 msgctxt "button" msgid "Add to gallery" msgstr "" #: assets/js/smart-manager.js:382 msgctxt "button" msgid "Bulk Edit" msgstr "" #: assets/js/smart-manager.js:2436 msgctxt "button" msgid "Cancel" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:118 #: src/views/BulkEditDialog.js:112 msgctxt "button" msgid "Clear" msgstr "" #: assets/js/smart-manager.js:438 msgctxt "button" msgid "Columns" msgstr "" #: assets/js/smart-manager.js:2435 msgctxt "button" msgid "Create" msgstr "" #: assets/js/smart-manager.js:412 msgctxt "button" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:402 msgctxt "button" msgid "Duplicate" msgstr "" #: assets/js/smart-manager.js:424 msgctxt "button" msgid "Export CSV" msgstr "" #: assets/js/smart-manager.js:2579 msgctxt "button" msgid "Get Pro at 25% OFF" msgstr "" #: assets/js/smart-manager.js:175 #, javascript-format msgctxt "button" msgid "Load More %s" msgstr "" #: assets/js/smart-manager.js:3151 msgctxt "button" msgid "No" msgstr "" #: assets/js/smart-manager-product.js:243 assets/js/smart-manager.js:1092 msgctxt "button" msgid "OK" msgstr "" #: assets/js/smart-manager.js:430 msgctxt "button" msgid "Print Invoice" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:74 msgctxt "button" msgid "Remove this group" msgstr "" #: pro/assets/js/smart-manager.js:968 msgctxt "button" msgid "Reset" msgstr "" #: assets/js/smart-manager.js:390 msgctxt "button" msgid "Save" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:99 msgctxt "button" msgid "Search" msgstr "" #: assets/js/smart-manager-product.js:199 msgctxt "button" msgid "Select all" msgstr "" #: assets/js/smart-manager-product.js:200 msgctxt "button" msgid "Select none" msgstr "" #: assets/js/admin.js:1 assets/js/smart-manager.js:2744 #: src/views/BulkEditDialog.js:98 pro/assets/js/smart-manager.js:963 msgctxt "button" msgid "Update" msgstr "" #: assets/js/smart-manager.js:3134 msgctxt "button" msgid "Yes" msgstr "" #: classes/class-smart-manager-pricing.php:355 #: classes/class-smart-manager-pricing.php:367 #: classes/class-smart-manager-pricing.php:378 #: classes/class-smart-manager-pricing.php:389 msgid "Buy Now" msgstr "Купить ÑейчаÑ" #: classes/class-smart-manager-pricing.php:648 msgid "Buy Smart Manager Pro" msgstr "Купить Smart Manager Pro" #: pro/classes/class-smart-manager-pro-product.php:144 msgid "Calculate unit prices automatically" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:214 msgid "Calendar always visible" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:211 msgid "Calendar display mode" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:118 msgid "Can be cancelled?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:405 msgid "Can I import using Smart Manager?" msgstr "Могу ли Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ данные Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Smart Manager?" #: classes/class-smart-manager-product.php:1147 msgid "Catalog Visibility" msgstr "ВидимоÑÑ‚ÑŒ каталога" #: pro/classes/class-smart-manager-pro-product.php:139 msgid "Category group-of rules: Exclude" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:235 msgid "Check rules against..." msgstr "" #: assets/js/smart-manager-product.js:285 msgctxt "checkbox list" msgid "Position:" msgstr "" #: class-smart-manager.php:862 msgid "Click here" msgstr "Ðажмите Ñюда" #: classes/class-smart-manager-admin-welcome.php:402 msgid "click here" msgstr "нажмите Ñюда" #: pro/classes/class-smart-manager-pro-shop-coupon.php:423 msgid "Click to copy" msgstr "" #: class-smart-manager.php:1468 msgid "Click to upgrade." msgstr "Ðажмите Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð°." #: classes/class-smart-manager-pricing.php:462 msgid "Columns (Show / Hide / Sort)" msgstr "Столбцы (отображение / Ñкрытие / Ñортировка)" #: classes/class-smart-manager-pricing.php:612 #: classes/class-smart-manager-pricing.php:623 msgid "Coming soon" msgstr "ОжидаетÑÑ" #: pro/classes/class-smart-manager-pro-access-privilege.php:335 msgid "Company logo:" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:337 msgid "completed Successfully" msgstr "" #: pro/classes/class-smart-manager-pro-acf-field-group.php:43 #: pro/classes/class-smart-manager-pro-acf-field.php:43 msgid "Config Options" msgstr "" #: classes/class-smart-manager-pricing.php:340 msgid "Congratulations! You just unlocked %s on Smart Manager Pro" msgstr "ПоздравлÑем! Ð’Ñ‹ только что разблокировали %s в Smart Manager Pro" #: classes/class-smart-manager-admin-welcome.php:414 msgid "contact us" msgstr "ÑвÑжитеÑÑŒ Ñ Ð½Ð°Ð¼Ð¸" #: classes/class-smart-manager-shop-order.php:440 #: pro/classes/class-smart-manager-pro-product.php:107 msgid "Cost of Good" msgstr "СтоимоÑÑ‚ÑŒ товара" #: pro/classes/class-smart-manager-pro-product.php:122 msgid "Count persons as bookings" msgstr "" #: classes/class-smart-manager-shop-coupon.php:115 msgid "Coupon Code" msgstr "Код купона" #: pro/classes/class-smart-manager-pro-shop-coupon.php:333 msgid "Coupon expiry date" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:338 msgid "Coupon expiry time" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:255 msgid "Coupon Is Visible Storewide" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:354 msgid "Coupon shareable link" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:242 msgid "Coupon Title Prefix" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:243 msgid "Coupon Title Suffix" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:240 msgid "Coupon Validity" msgstr "" #: classes/class-smart-manager-pricing.php:551 msgid "Create Column Sets / Custom Views" msgstr "Создание наборов Ñтолбцов / произвольных отображений" #: classes/class-smart-manager-pricing.php:433 msgid "custom post types and their custom fields." msgstr "произвольные типы запиÑей и их произвольные полÑ." #: assets/js/smart-manager.js:364 msgctxt "custom view button" msgid "Create" msgstr "" #: assets/js/smart-manager.js:366 msgctxt "custom view button" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:365 msgctxt "custom view button" msgid "Update" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:186 msgid "Customer defined blocks of" msgstr "" #: classes/class-smart-manager-shop-order.php:164 msgid "Customer provided note" msgstr "Примечание от клиента" #: pro/classes/class-smart-manager-pro-product.php:221 msgid "Customer selected" msgstr "" #: assets/js/smart-manager.js:315 msgctxt "dashboard groups" msgid "All post types" msgstr "" #: assets/js/smart-manager.js:326 msgctxt "dashboard groups" msgid "All saved views" msgstr "" #: assets/js/smart-manager.js:299 msgctxt "dashboard groups" msgid "Common post types" msgstr "" #: assets/js/smart-manager.js:310 msgctxt "dashboard groups" msgid "Recently used views" msgstr "" #: classes/class-smart-manager-shop-order.php:160 #: pro/classes/class-smart-manager-pro-shop-subscription.php:175 msgid "Date" msgstr "Дата" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "days" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "months" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "weeks" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "years" msgstr "" #: pro/assets/js/smart-manager.js:34 msgctxt "date operator" msgid "set date to" msgstr "" #: pro/assets/js/smart-manager.js:33 msgctxt "datetime operator" msgid "set date to" msgstr "" #: pro/assets/js/smart-manager.js:33 msgctxt "datetime operator" msgid "set datetime to" msgstr "" #: pro/assets/js/smart-manager.js:33 msgctxt "datetime operator" msgid "set time to" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:149 msgid "Day(s)" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:133 msgid "Default" msgstr "" #: assets/js/smart-manager.js:415 msgctxt "delete button" msgid "Delete Permanently" msgstr "" #: assets/js/smart-manager.js:414 msgctxt "delete button" msgid "Move to Trash" msgstr "" #: class-smart-manager.php:1118 msgid "" "Delete Permanently is disabled. Please contact store administrator for " "enabling the same." msgstr "" "ВозможноÑÑ‚ÑŒ безвозвратного ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°. Ð”Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ†Ð¸Ð¸ ÑвÑжитеÑÑŒ " "Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратором магазина." #: class-smart-manager.php:1149 #: classes/class-smart-manager-admin-welcome.php:319 msgid "Delete Records" msgstr "Удалить запиÑи" #: classes/class-smart-manager-product.php:956 #: classes/class-smart-manager-shop-coupon.php:117 msgid "Description" msgstr "ОпиÑание" #: assets/js/smart-manager.js:2719 msgctxt "description" msgid "" "Drag & drop the enabled columns to the right side to disable them. Drag & " "drop the disabled columns to the left side to enable them." msgstr "" #: assets/js/smart-manager.js:2721 msgctxt "description" msgid "Drag the columns to the top or bottom to sort them." msgstr "" #: pro/assets/js/smart-manager.js:603 msgctxt "description" msgid "" "Marking this view public will make it available to all users having access " "to the Smart Manager." msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:248 msgid "Disable Email Restriction" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:213 msgid "Display calendar on click" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:244 msgid "Display message" msgstr "" #: classes/class-smart-manager-product.php:910 msgid "Do Not Allow" msgstr "Ðе разрешать" #: classes/class-smart-manager-admin-welcome.php:254 msgid "Docs" msgstr "ДокументациÑ" #: class-smart-manager.php:672 msgid "Docs & Support" msgstr "Ð”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¸ поддержка" #: assets/js/smart-manager.js:101 msgctxt "dropdown operator" msgid "is" msgstr "" #: assets/js/smart-manager.js:101 msgctxt "dropdown operator" msgid "is not" msgstr "" #: classes/class-smart-manager-pricing.php:540 msgid "Duplicate all records in a single click" msgstr "Дублирование вÑех запиÑей одним нажатием" #: assets/js/smart-manager.js:405 msgctxt "duplicate button" msgid "Entire Store" msgstr "" #: assets/js/smart-manager.js:404 msgctxt "duplicate button" msgid "Selected Records" msgstr "" #: class-smart-manager.php:1149 msgid "Duplicate Records" msgstr "Дублирование запиÑей" #: classes/class-smart-manager-pricing.php:529 msgid "Duplicate single / multiple records" msgstr "Дублирование одиночных/множеÑтвенных запиÑей" #: pro/templates/email.php:7 msgid "Duplicated" msgstr "" #: classes/class-smart-manager-pricing.php:636 msgid "Email / Call" msgstr "Email / Звонок" #: pro/classes/class-smart-manager-pro-user.php:1257 msgid "Email already exists. Please enter another email." msgstr "" #: pro/classes/class-smart-manager-pro-user.php:1251 msgid "Email cannot be empty" msgstr "" #: pro/templates/order-invoice.php:158 msgid "Email id" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:251 msgid "Email message?" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:116 msgid "Enable Calendar Range Picker?" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:130 msgid "Enable Min Max Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:123 msgid "Enable person types" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:307 msgid "Error" msgstr "" #: class-smart-manager.php:1585 msgid "Error:" msgstr "Ошибка:" #: classes/class-smart-manager-pricing.php:431 msgid "Everything in Lite +" msgstr "Ð’ÑÑ‘, что в беÑплатном +" #: pro/classes/class-smart-manager-pro-shop-coupon.php:226 msgid "Exclude Attributes" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:211 msgid "Exclude categories" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:231 msgid "Exclude products" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:249 msgid "Exclude sale items" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:257 msgid "Expire After" msgstr "" #: pro/classes/class-smart-manager-pro-wc-user-membership.php:169 #: pro/classes/class-smart-manager-pro-wc-user-membership.php:170 msgid "Expires" msgstr "" #: classes/class-smart-manager-pricing.php:518 msgid "Export all / Filtered records as CSV" msgstr "ЭкÑпорт вÑех/отфильтрованных запиÑей в виде CSV" #: classes/class-smart-manager-admin-welcome.php:347 msgid "Export CSV" msgstr "ЭкÑпорт CSV" #: classes/class-smart-manager-admin-welcome.php:349 msgid "Export CSV (only in %s)" msgstr "ЭкÑпорт CSV (только в %s)" #: classes/class-smart-manager-product.php:972 msgid "External Url" msgstr "Внешний URL" #: classes/class-smart-manager-admin-welcome.php:380 msgid "FAQ / Common Problems" msgstr "ЧаВо / раÑпроÑтранённые проблемы" #: classes/class-smart-manager-admin-welcome.php:264 msgid "FAQ's" msgstr "ЧаВо" #: classes/class-smart-manager-product.php:1194 msgid "Featured" msgstr "Рекомендуемые" #: classes/class-smart-manager-product.php:2018 #: classes/class-smart-manager-product.php:2021 msgid "Featured Image updated successfully" msgstr "Изображение уÑпешно обновлено" #: classes/class-smart-manager-pricing.php:410 msgid "Features" msgstr "Функционал" #: pro/templates/email.php:42 msgid "Field" msgstr "" #: classes/class-smart-manager-admin-welcome.php:290 msgid "Filter / Search Records" msgstr "ФильтрациÑ/поиÑк запиÑей" #: pro/classes/class-smart-manager-pro-product.php:185 msgid "Fixed blocks of" msgstr "" #: classes/class-smart-manager-admin-welcome.php:419 msgid "Follow steps listed here: %s" msgstr "Следуйте инÑтрукциÑм, перечиÑленным здеÑÑŒ: %s" #: pro/classes/class-smart-manager-pro-background-updater.php:337 msgid "for" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:256 msgid "For new user only?" msgstr "" #: classes/class-smart-manager-pricing.php:413 msgid "Free" msgstr "БеÑплатный" #: pro/classes/class-smart-manager-pro-product.php:105 msgid "Free Trial" msgstr "" #: classes/class-smart-manager-admin-welcome.php:236 #: classes/class-smart-manager-admin-welcome.php:362 msgid "Get started with Smart Manager" msgstr "Ðачало работы Ñо Smart Manager" #: classes/class-smart-manager-admin-welcome.php:232 msgid "" "Glad to have you onboard. We hope Smart Manager adds to your desired success " "ðŸ†" msgstr "" "Рады видеть Ð²Ð°Ñ Ð½Ð° борту. Мы надеемÑÑ, что Smart Manager поможет вам " "добитьÑÑ Ð¶ÐµÐ»Ð°ÐµÐ¼Ð¾Ð³Ð¾ уÑпеха ðŸ†" #: assets/js/admin.js:1 src/views/RuleGroup.js:38 msgctxt "group content" msgid "of the following conditions is true." msgstr "" #: pro/classes/class-smart-manager-pro-acf-field.php:45 msgid "Group Id" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:90 msgid "Group of..." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:119 msgid "Has persons" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:120 msgid "Has resources" msgstr "" #: assets/js/smart-manager.js:2732 msgctxt "heading" msgid "Disabled" msgstr "" #: assets/js/smart-manager.js:2725 msgctxt "heading" msgid "Enabled" msgstr "" #: class-smart-manager.php:861 msgid "Hey %1s, you just unlocked %2s on Smart Manager Pro!" msgstr "Привет, %1s, вы только что разблокировали %2s в Smart Manager Pro!" #: pro/templates/email.php:35 msgid "Hi there!" msgstr "" #: classes/class-smart-manager-product.php:736 msgid "Hidden" msgstr "Скрытый" #: pro/classes/class-smart-manager-pro-product.php:150 msgid "Hour(s)" msgstr "" #: classes/class-smart-manager-admin-welcome.php:418 msgid "How do I upgrade a Lite version to a Pro version?" msgstr "Как мне перейти Ñ Ð±ÐµÑплатной верÑии до верÑии Pro?" #: classes/class-smart-manager-admin-welcome.php:401 msgid "How to add columns to Smart Manager dashboard?" msgstr "Как добавить Ñтолбцы в панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Smart Manager?" #: classes/class-smart-manager-admin-welcome.php:397 msgid "" "How to manage any custom field of any custom plugin using Smart Manager?" msgstr "" "Как управлÑÑ‚ÑŒ любым произвольным полем любого плагина Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Smart " "Manager?" #. Author URI of the plugin msgid "https://www.storeapps.org/" msgstr "https://www.storeapps.org/" #. URI of the plugin msgid "https://www.storeapps.org/product/smart-manager/" msgstr "https://www.storeapps.org/product/smart-manager/" #: classes/class-smart-manager-admin-welcome.php:413 msgid "I can't find a way to do X..." msgstr "Я не могу найти ÑпоÑоб Ñделать..." #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:118 msgid "I found another plugin for my needs" msgstr "Я нашёл другой плагин Ð´Ð»Ñ Ñвоих задач." #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:106 msgid "I only needed the plugin for a short period" msgstr "Плагин мне нужен был только на короткое времÑ" #: classes/class-smart-manager-pricing.php:397 msgid "I would happily pay five times for this product!" msgstr "Я бы Ñ Ñ€Ð°Ð´Ð¾Ñтью заплатил пÑÑ‚ÑŒ раз за Ñтот продукт!" #: classes/class-smart-manager-pricing.php:669 msgid "" "I've got over 200 products and dreaded managing them one by one. Smart " "Manager Pro plugin lets me do this so much quicker. Probably 20 or 30 times " "quicker. It is an absolutely invaluable tool." msgstr "" "У Ð¼ÐµÐ½Ñ Ð±Ð¾Ð»ÐµÐµ 200 товаров, и Ñ Ð±Ð¾ÑлÑÑ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÑÑ‚ÑŒ ими один за другим. Плагин " "Smart Manager Pro позволÑет мне делать Ñто намного быÑтрее. БыÑтрее, " "наверное, в 20 или 30 раз. Это абÑолютно беÑценный инÑтрумент." #: pro/templates/email.php:62 msgid "If you like" msgstr "" #: classes/class-smart-manager-pricing.php:606 msgid "Import" msgstr "Импорт" #: pro/classes/class-smart-manager-pro-background-updater.php:315 #, fuzzy #| msgid "Important:" msgid "Important" msgstr "Важно:" #: classes/class-smart-manager-product.php:862 msgid "In stock" msgstr "Ð’ наличии" #: pro/classes/class-smart-manager-pro-background-updater.php:317 msgid "in the background. You will be notified on" msgstr "" #: class-smart-manager.php:1149 msgid "" "In the meanwhile, you can use Smart Manager. But before using actions like " msgstr "" "Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹ можете иÑпользовать Smart Manager. Ðо прежде чем иÑпользовать " "такие дейÑтвиÑ, как" #: pro/classes/class-smart-manager-pro-base.php:34 msgid "Index" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:250 msgid "Individual use only" msgstr "" #: classes/class-smart-manager-admin-welcome.php:299 msgid "Inline Editing" msgstr "Ð’Ñтроенное редактирование" #: classes/class-smart-manager-pricing.php:438 msgid "Inline editing" msgstr "Ð’Ñтроенное редактирование" #: class-smart-manager.php:1468 msgid "is available." msgstr "доÑтупен." #: pro/classes/class-smart-manager-pro-shop-coupon.php:254 msgid "Is Pick Price of Product" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:124 msgid "It is a temporary deactivation. I am just debugging an issue." msgstr "Это временное отключение. Я проÑто отлаживаю проблему." #: classes/class-smart-manager-pricing.php:400 msgid "Jeff" msgstr "Jeff" #: pro/classes/class-smart-manager-pro-acf-field-group.php:44 #: pro/classes/class-smart-manager-pro-acf-field.php:44 msgid "Key" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:102 msgid "" "Kindly share what did not work for you / conflicting with which plugin so we " "can fix it..." msgstr "" "ПожалуйÑта, поделитеÑÑŒ тем, что у Ð²Ð°Ñ Ð½Ðµ работало/конфликтовало и Ñ ÐºÐ°ÐºÐ¸Ð¼ " "плагином, чтобы мы могли Ñто иÑправить..." #: classes/class-smart-manager-admin-welcome.php:261 msgid "Know Smart Manager" msgstr "Узнайте о Smart Manager" #: pro/classes/class-smart-manager-pro-acf-field-group.php:41 #: pro/classes/class-smart-manager-pro-acf-field.php:41 msgid "Label" msgstr "" #: classes/class-smart-manager-admin-welcome.php:386 #: classes/class-smart-manager-admin-welcome.php:419 msgid "latest version" msgstr "поÑледнÑÑ Ð²ÐµÑ€ÑиÑ" #: class-smart-manager.php:1447 msgid "LITE" msgstr "" #: classes/class-smart-manager-admin-welcome.php:386 msgid "" "Make sure you are using %s of Smart Manager. If still the issue persist, " "temporarily de-activate all plugins except WooCommerce/WPeCommerce & Smart " "Manager. Re-check the issue, if the issue still persists, contact us. If the " "issue goes away, re-activate other plugins one-by-one & re-checking the " "fields, to find out which plugin is conflicting." msgstr "" "УбедитеÑÑŒ, что вы иÑпользуете %s Smart Manager. ЕÑли проблема не уÑтранена, " "временно отключите вÑе другие плагины, кроме WooCommerce/WPeCommerce и Smart " "Manager. Еще раз проверьте наличие проблемы и еÑли она не иÑчезнет, " "​​ÑвÑжитеÑÑŒ Ñ Ð½Ð°Ð¼Ð¸. ЕÑли проблема решитÑÑ, ​​повторно активируйте " "отключенные ранее плагины один за другим и отÑлеживайте проÑвление проблемы, " "чтобы узнать, какой плагин Ñоздаёт конфликт." #: classes/class-smart-manager-pricing.php:617 msgid "Manage Custom Taxonomies" msgstr "Управление произвольными такÑономиÑми" #: classes/class-smart-manager-pricing.php:573 msgid "Manage WordPress User roles" msgstr "Управление ролÑми пользователей WordPress" #: classes/class-smart-manager-admin-welcome.php:287 msgid "Manage your entire store from a single screen" msgstr "УправлÑйте вÑем Ñвоим магазином Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñкрана" #: classes/class-smart-manager-pricing.php:677 msgid "Massive time-savings and 10x productivity boost. Choice is yours!" msgstr "" "Ð—Ð½Ð°Ñ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÑÐºÐ¾Ð½Ð¾Ð¼Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ и 10-кратное повышение производительноÑти. Ваш " "выбор!" #: pro/classes/class-smart-manager-pro-product.php:83 msgid "Max bookings per block" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:236 msgid "Max discount" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:82 msgid "Max persons" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:101 msgid "Max Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:85 msgid "Maximum block bookable" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:206 msgid "Maximum block bookable (Unit)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:79 msgid "Maximum duration" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:96 msgid "Maximum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:89 msgid "Maximum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-wc-user-membership.php:164 #: pro/classes/class-smart-manager-pro-wc-user-membership.php:165 msgid "Member since" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:148 msgid "Meta robots advanced" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:81 msgid "Min persons" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:100 msgid "Min Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:135 msgid "Min/Max Rules" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:84 msgid "Minimum block bookable" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:201 msgid "Minimum block bookable (Unit)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:78 msgid "Minimum duration" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:95 msgid "Minimum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:88 msgid "Minimum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:151 msgid "Minutes(s)" msgstr "" #: assets/js/smart-manager.js:2330 msgctxt "modal content" msgid "all" msgstr "" #: assets/js/smart-manager.js:2329 #, javascript-format msgctxt "modal content" msgid "Are you sure you want to %s" msgstr "" #: assets/js/smart-manager.js:2330 #, javascript-format msgctxt "modal content" msgid "Are you sure you want to %s the %s?" msgstr "" #: assets/js/smart-manager.js:2529 msgctxt "modal content" msgid "Are you sure you want to duplicate the " msgstr "" #: assets/js/smart-manager.js:3114 msgctxt "modal content" msgid "Are you sure?" msgstr "" #: assets/js/smart-manager.js:3092 msgctxt "modal content" msgid "Continue in background" msgstr "" #: pro/assets/js/smart-manager.js:595 msgctxt "modal content" msgid "" "Create a custom view to save selected columns from a dashboard. Use it for " "saved searches, giving specific columns access to other users, etc." msgstr "" #: assets/js/smart-manager.js:2472 msgctxt "modal content" msgid "delete" msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "delete all" msgstr "" #: assets/js/smart-manager.js:2433 #, javascript-format msgctxt "modal content" msgid "Enter how many new %s(s) to create!" msgstr "" #: assets/js/smart-manager.js:261 assets/js/smart-manager.js:2207 #, javascript-format msgctxt "modal content" msgid "For managing %s, %s %s version" msgstr "" #: assets/js/smart-manager.js:3092 msgctxt "modal content" msgid "Initializing..." msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "Note: Looking to" msgstr "" #: assets/js/smart-manager.js:2323 msgctxt "modal content" msgid "permanently delete" msgstr "" #: assets/js/smart-manager.js:261 assets/js/smart-manager.js:2207 #: assets/js/smart-manager.js:3061 msgctxt "modal content" msgid "Pro" msgstr "" #: assets/js/smart-manager.js:2329 msgctxt "modal content" msgid "record" msgstr "" #: assets/js/smart-manager.js:2329 msgctxt "modal content" msgid "records" msgstr "" #: assets/js/smart-manager.js:2472 msgctxt "modal content" msgid "the current view. Are you sure you want to continue?" msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "the records?" msgstr "" #: assets/js/smart-manager.js:2329 msgctxt "modal content" msgid "the selected" msgstr "" #: assets/js/smart-manager.js:3061 #, javascript-format msgctxt "modal content" msgid "This feature is available only in the %s version" msgstr "" #: assets/js/smart-manager.js:2472 msgctxt "modal content" msgid "This will" msgstr "" #: assets/js/smart-manager.js:2528 msgctxt "modal content" msgid "" "This will duplicate only the records in posts, postmeta and related " "taxonomies." msgstr "" #: assets/js/smart-manager.js:2323 msgctxt "modal content" msgid "trash" msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "Upgrade to Pro" msgstr "" #: assets/js/smart-manager.js:2557 msgctxt "modal description" msgid "" "You can change / update multiple fields of the entire store OR for selected " "items by selecting multiple records and then click on Bulk Edit." msgstr "" #: assets/js/smart-manager.js:2560 msgctxt "modal description" msgid "" "You can export all the records OR filtered records (using Simple Search or " "Advanced Search) by simply clicking on the Export CSV button at the bottom " "right of the grid." msgstr "" #: assets/js/smart-manager.js:2566 msgctxt "modal title" msgid "(Only in" msgstr "" #: assets/js/smart-manager.js:2432 #, javascript-format msgctxt "modal title" msgid "Add %s(s)" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:60 msgctxt "modal title" msgid "Advanced Search" msgstr "" #: assets/js/smart-manager.js:2319 assets/js/smart-manager.js:2471 #: assets/js/smart-manager.js:2527 msgctxt "modal title" msgid "Attention!!!" msgstr "" #: assets/js/smart-manager.js:2566 msgctxt "modal title" msgid "Biggest Time Saver" msgstr "" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:66 #: pro/assets/js/smart-manager.js:718 pro/assets/js/smart-manager.js:973 msgctxt "modal title" msgid "Bulk Edit" msgstr "" #: assets/js/smart-manager.js:2749 msgctxt "modal title" msgid "Column Manager - Show/Hide Columns" msgstr "" #: pro/assets/js/smart-manager.js:1273 msgctxt "modal title" msgid "Delete Records" msgstr "" #: pro/assets/js/smart-manager.js:489 msgctxt "modal title" msgid "Duplicate Records" msgstr "" #: assets/js/smart-manager.js:2994 assets/js/smart-manager.js:3060 msgctxt "modal title" msgid "Note" msgstr "" #: assets/js/smart-manager.js:3091 msgctxt "modal title" msgid "Please Wait" msgstr "" #: assets/js/smart-manager.js:2566 msgctxt "modal title" msgid "Pro" msgstr "" #: assets/js/smart-manager.js:2992 msgctxt "modal title" msgid "Success" msgstr "" #: assets/js/smart-manager.js:3113 msgctxt "modal title" msgid "Warning" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:148 msgid "Month(s)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:121 msgid "Multiply all costs by person count" msgstr "" #: classes/class-smart-manager-product.php:952 #: pro/classes/class-smart-manager-pro-acf-field-group.php:42 #: pro/classes/class-smart-manager-pro-acf-field.php:42 msgid "Name" msgstr "Ðазвание" #: pro/classes/class-smart-manager-pro-product.php:260 msgid "Never expire" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:185 msgid "Nickname" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:135 #: pro/classes/class-smart-manager-pro-base.php:143 #, fuzzy #| msgid "to" msgid "No" msgstr "чтобы" #: pro/classes/class-smart-manager-pro-base.php:29 #: pro/classes/class-smart-manager-pro-base.php:37 msgid "No Archive" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:36 msgid "No Follow" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:28 #: pro/classes/class-smart-manager-pro-base.php:38 msgid "No Image Index" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:35 msgid "No Index" msgstr "" #: classes/class-smart-manager-product.php:941 #: classes/class-smart-manager-product.php:943 msgid "No shipping class" msgstr "Ðе указан клаÑÑ Ð´Ð¾Ñтавки" #: pro/classes/class-smart-manager-pro-base.php:30 #: pro/classes/class-smart-manager-pro-base.php:39 msgid "No Snippet" msgstr "" #: classes/class-smart-manager-product.php:846 #: classes/class-smart-manager-product.php:852 #: pro/classes/class-smart-manager-pro-base.php:27 msgid "None" msgstr "Ðет" #: pro/classes/class-smart-manager-pro-product.php:230 msgid "not-available by default" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:329 msgid "NOTE" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "column if not enabled using" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "column show/hide functionality" msgstr "" #: assets/js/smart-manager.js:2460 assets/js/smart-manager.js:2482 msgctxt "notification" msgid "Custom Views avialable (Only in" msgstr "" #: assets/js/smart-manager.js:2590 msgctxt "notification" msgid "Duplicate Records (Only in" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "Enable" msgstr "" #: assets/js/smart-manager.js:3048 msgctxt "notification" msgid "Error" msgstr "" #: assets/js/smart-manager.js:2422 msgctxt "notification" msgid "For editing more records upgrade to Pro" msgstr "" #: assets/js/smart-manager.js:263 assets/js/smart-manager.js:2208 #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "Note" msgstr "" #: assets/js/smart-manager.js:2272 msgctxt "notification" msgid "Please edit a record" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "Please enter user email" msgstr "" #: assets/js/smart-manager.js:2309 assets/js/smart-manager.js:2545 msgctxt "notification" msgid "Please select a record" msgstr "" #: assets/js/smart-manager.js:2460 assets/js/smart-manager.js:2482 #: assets/js/smart-manager.js:2590 msgctxt "notification" msgid "Pro" msgstr "" #: assets/js/smart-manager.js:2314 msgctxt "notification" msgid "records at a time" msgstr "" #: assets/js/smart-manager.js:2954 pro/assets/js/smart-manager.js:567 #: pro/assets/js/smart-manager.js:690 msgctxt "notification" msgid "Success" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:57 msgctxt "notification" msgid "This feature is available only in the Pro version." msgstr "" #: assets/js/smart-manager.js:2314 msgctxt "notification" msgid "To delete more than" msgstr "" #: assets/js/smart-manager.js:2299 msgctxt "notification" msgid "To permanently delete records" msgstr "" #: assets/js/smart-manager.js:2299 assets/js/smart-manager.js:2314 msgctxt "notification" msgid "upgrade to Pro" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "User Email" msgstr "" #: pro/assets/js/smart-manager.js:567 #, javascript-format msgctxt "notification" msgid "View %sd successfully!" msgstr "" #: pro/assets/js/smart-manager.js:658 msgctxt "notification" msgid "View already exists. Please try another name" msgstr "" #: pro/assets/js/smart-manager.js:690 msgctxt "notification" msgid "View deleted successfully!" msgstr "" #: assets/js/smart-manager.js:3048 msgctxt "notification" msgid "You have entered incorrect data in the highlighted cells." msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "decrease by %" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "decrease by number" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "increase by %" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "increase by number" msgstr "" #: classes/class-smart-manager-product.php:864 msgid "On backorder" msgstr "Под заказ" #: pro/templates/order-invoice.php:201 msgid "Order Discount" msgstr "" #: pro/templates/order-invoice.php:195 msgid "Order Notes" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:137 msgid "Order rules: Do not count" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:138 msgid "Order rules: Exclude" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:130 msgid "Other" msgstr "Другое" #: classes/class-smart-manager-product.php:863 msgid "Out of stock" msgstr "Ðет в наличии" #: pro/classes/class-smart-manager-pro-shop-coupon.php:217 msgid "Payment Methods" msgstr "" #: pro/assets/js/smart-manager.js:853 pro/assets/js/smart-manager.js:857 #: pro/assets/js/smart-manager.js:943 pro/assets/js/smart-manager.js:1054 #: pro/assets/js/smart-manager.js:1075 pro/assets/js/smart-manager.js:1094 msgctxt "placeholder" msgid "Enter a value..." msgstr "" #: pro/assets/js/smart-manager-product.js:225 msgctxt "placeholder" msgid "Enter Attribute name..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:428 msgctxt "placeholder" msgid "Enter attribute name..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:63 src/views/Rule.js:357 #: src/views/Rule.js:372 msgctxt "placeholder" msgid "Enter value" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:429 #: pro/assets/js/smart-manager-product.js:226 msgctxt "placeholder" msgid "Enter values..." msgstr "" #: pro/assets/js/smart-manager.js:596 msgctxt "placeholder" msgid "Give a name to this view" msgstr "" #: assets/js/smart-manager-product.js:208 #: assets/js/smart-manager-product.js:313 msgctxt "placeholder" msgid "Name" msgstr "" #: assets/js/smart-manager-product.js:203 #: assets/js/smart-manager-product.js:209 #: assets/js/smart-manager-product.js:307 #: assets/js/smart-manager-product.js:314 msgctxt "placeholder" msgid "Pipe (|) separate terms" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:429 #: pro/assets/js/smart-manager.js:1155 msgctxt "placeholder" msgid "Replace with..." msgstr "" #: assets/js/smart-manager.js:2733 msgctxt "placeholder" msgid "Search For Disabled Columns..." msgstr "" #: assets/js/smart-manager.js:2726 msgctxt "placeholder" msgid "Search For Enabled Columns..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:428 #: pro/assets/js/smart-manager.js:1154 msgctxt "placeholder" msgid "Search for..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:230 #: pro/assets/js/smart-manager.js:1119 #, javascript-format msgctxt "placeholder" msgid "Select %s" msgstr "" #: assets/js/smart-manager-product.js:190 #: assets/js/smart-manager-product.js:293 msgctxt "placeholder" msgid "Select terms" msgstr "" #: assets/js/smart-manager.js:278 msgctxt "placeholder" msgid "Type to search..." msgstr "" #: pro/templates/email.php:62 msgid "please leave us a" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:132 msgid "Please mention..." msgstr "ПожалуйÑта, напишите об Ñтом..." #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:71 msgid "Please select an option" msgstr "Выберите вариант" #: assets/js/smart-manager-product.js:183 msgctxt "position checkbox" msgid "Position:" msgstr "" #: classes/class-smart-manager-shop-order.php:437 #: pro/templates/order-invoice.php:163 msgid "Price" msgstr "Цена" #: classes/class-smart-manager-pricing.php:641 msgid "Pricing" msgstr "Цены" #: pro/classes/class-smart-manager-pro-access-privilege.php:330 msgid "Print Order Settings" msgstr "" #: classes/class-smart-manager-pricing.php:584 msgid "Print packing slips for WooCommerce orders in bulk" msgstr "ÐŸÐ°ÐºÐµÑ‚Ð½Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚ÑŒ упаковочных лиÑтов Ð´Ð»Ñ Ð·Ð°ÐºÐ°Ð·Ð¾Ð² WooCommerce" #: classes/class-smart-manager-pricing.php:562 msgid "Print PDF invoices" msgstr "Формирование Ñчетов в PDF" #: pro/classes/class-smart-manager-pro-access-privilege.php:195 msgid "Privileges for Smart Manager for different System Roles" msgstr "" #: class-smart-manager.php:1447 msgid "PRO" msgstr "" #: classes/class-smart-manager-admin-welcome.php:333 #: classes/class-smart-manager-admin-welcome.php:349 #: classes/class-smart-manager-pricing.php:416 msgid "Pro" msgstr "Pro" #: pro/templates/order-invoice.php:162 msgid "Product" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:223 msgid "Product Attributes" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:209 msgid "Product categories" msgstr "" #: pro/assets/js/smart-manager-product.js:127 msgctxt "product price operator" msgid "set to regular price" msgstr "" #: pro/assets/js/smart-manager-product.js:123 msgctxt "product price operator" msgid "set to sale price" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:109 msgid "Product Units" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:229 msgid "Products" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:322 msgid "Progress" msgstr "" #: pro/assets/js/smart-manager.js:601 msgid "Public" msgstr "" #: classes/class-smart-manager-shop-order.php:437 msgid "Qty" msgstr "Кол-во" #: pro/templates/order-invoice.php:163 msgid "Quantity" msgstr "" #: classes/class-smart-manager-admin-welcome.php:248 msgid "Questions? Need Help?" msgstr "ОÑталиÑÑŒ вопроÑÑ‹? Ðужна помощь?" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:65 msgid "Quick Feedback for Smart Manager plugin" msgstr "БыÑÑ‚Ñ€Ð°Ñ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð°Ñ ÑвÑзь по плагину Smart Manager" #: pro/classes/class-smart-manager-pro-base.php:103 msgid "Rank Math SEO Score" msgstr "" #: pro/templates/email.php:62 msgid "rating. A huge thank you from StoreApps in advance!" msgstr "" #: pro/templates/email.php:45 msgid "Records Updated" msgstr "" #: classes/class-smart-manager-product.php:890 msgid "Reduced Rate" msgstr "ÐŸÐ¾Ð½Ð¸Ð¶ÐµÐ½Ð½Ð°Ñ Ñтавка" #: pro/classes/class-smart-manager-pro-product.php:111 msgid "Regular Unit Price" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:316 msgid "request is running" msgstr "" #: classes/class-smart-manager-admin-welcome.php:390 msgid "" "Request you to kindly de-activate and activate the Smart Manager plugin once " "and then have a recheck with the search functionality." msgstr "" "Деактивируйте и активируйте плагин Smart Manager, а затем ещё раз проверьте " "функцию поиÑка." #: pro/classes/class-smart-manager-pro-product.php:86 msgid "Require a buffer period of" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:117 msgid "Requires confirmation?" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:219 msgid "Resources are..." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:124 msgid "Restrict start and end days?" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:153 msgid "Robots Meta" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:32 msgctxt "rule content" msgid "This group is a \"pass\" when" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:35 msgctxt "rule option" msgid "all" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:36 msgctxt "rule option" msgid "at least one" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:112 msgid "Sale Unit Price" msgstr "" #: assets/js/smart-manager.js:280 assets/js/smart-manager.js:539 #, javascript-format msgctxt "search conditions" msgid "%d condition%s" msgstr "" #: assets/js/smart-manager.js:280 assets/js/smart-manager.js:539 msgctxt "search conditions" msgid "s" msgstr "" #: classes/class-smart-manager-product.php:735 msgid "Search results only" msgstr "Только результаты поиÑка" #: assets/js/smart-manager.js:354 assets/js/smart-manager.js:355 #, javascript-format msgctxt "search type" msgid "%s Search" msgstr "" #: assets/js/smart-manager.js:276 msgctxt "search type" msgid "Advanced" msgstr "" #: assets/js/smart-manager.js:276 msgctxt "search type" msgid "Simple" msgstr "" #: classes/class-smart-manager-admin-welcome.php:324 #: classes/class-smart-manager-admin-welcome.php:341 msgid "See how" msgstr "Смотрите как" #: classes/class-smart-manager-admin-welcome.php:295 #: classes/class-smart-manager-admin-welcome.php:304 msgid "see how" msgstr "Ñмотрите как Ñто работает" #: pro/assets/js/smart-manager-product.js:152 pro/assets/js/smart-manager.js:24 #: pro/assets/js/smart-manager.js:890 msgid "Select Action" msgstr "" #: pro/assets/js/smart-manager-product.js:143 msgid "Select Attribute" msgstr "" #: pro/assets/js/smart-manager.js:874 msgid "Select Field" msgstr "" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:147 #: pro/assets/js/smart-manager.js:871 msgid "Selected Items" msgstr "" #: classes/class-smart-manager-pricing.php:513 msgid "" "Set to, Append, Prepend, Increase / Decrease by %, Increase / Decrease by " "number, Set datetime to, Set date to, Set time to, Upload images and many " "more..." msgstr "" "УÑтановка в, дополнение, Ð¿Ñ€ÐµÐ´Ð²Ð°Ñ€Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ, увеличение/уменьшение на %, " "увеличение/уменьшение на чиÑло, уÑтановка времени и даты, загрузка " "изображений и многое другое..." #: class-smart-manager.php:669 class-smart-manager.php:1455 #: classes/class-smart-manager-admin-welcome.php:252 #: pro/classes/class-smart-manager-pro-access-privilege.php:178 msgid "Settings" msgstr "ÐаÑтройки" #: pro/classes/class-smart-manager-pro-access-privilege.php:56 msgid "Settings Saved Successfully!!!" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:328 #: pro/templates/order-invoice.php:197 msgid "Shipping" msgstr "" #: pro/templates/order-invoice.php:151 msgid "Shipping Address" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:215 msgid "Shipping methods" msgstr "" #: classes/class-smart-manager-product.php:845 #: classes/class-smart-manager-product.php:851 msgid "Shipping only" msgstr "Только доÑтавка" #: classes/class-smart-manager-product.php:733 msgid "Shop and search results" msgstr "Магазин и результаты поиÑка" #: classes/class-smart-manager-product.php:734 msgid "Shop only" msgstr "Только магазин" #: pro/classes/class-smart-manager-pro-base.php:141 #, php-format msgid "Should search engines follow links on this %1$s?" msgstr "" #: assets/js/smart-manager-product.js:435 msgctxt "show variations checkbox" msgid "Show Variations" msgstr "" #: classes/class-smart-manager-admin-welcome.php:308 msgid "Show/Hide & Sort Data Columns" msgstr "Отображение/Ñкрытие и Ñортировка Ñтолбцов данных" #: classes/class-smart-manager-admin-welcome.php:313 msgid "" "Show/hide multiple data columns of your WooCommerce store data as per your " "requirements. Sort them in ascending or descending order. Smart Manager also " "gives you persistent state management." msgstr "" "Отображение/Ñкрытие неÑкольких Ñтолбцов данных вашего магазина WooCommerce в " "ÑоответÑтвии Ñ Ð²Ð°ÑˆÐ¸Ð¼Ð¸ требованиÑми. Сортируйте их по возраÑтанию или " "убыванию. Smart Manager также обеÑпечивает поÑтоÑнное управление ÑоÑтоÑнием." #: pro/classes/class-smart-manager-pro-product.php:104 msgid "Sign-up Fee" msgstr "" #: classes/class-smart-manager-pricing.php:473 msgid "Simple Search" msgstr "ПроÑтой поиÑк" #: classes/class-smart-manager-admin-welcome.php:295 msgid "" "Simply enter the keyword you wish to filter records in the “Simple Search†" "field at the top of the grid (%s). If you need to have a more specific " "search result, then you can switch to “%s“ and then search." msgstr "" "ПроÑто введите ключевое Ñлово, по которому вы хотите отфильтровать запиÑи, в " "поле проÑтого поиÑка вверху Ñетки (%s). ЕÑли нужен более конкретный " "результат поиÑка, переключитеÑÑŒ на «%s» и затем выполнить поиÑк." #: pro/classes/class-smart-manager-pro-base.php:26 msgid "Site-wide default" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:68 msgid "Skip & Deactivate" msgstr "ПропуÑтить и отключить" #: classes/class-smart-manager-product.php:949 #: pro/templates/order-invoice.php:162 msgid "SKU" msgstr "Ðртикул" #: classes/class-smart-manager-product.php:954 #: pro/classes/class-smart-manager-pro-wc-membership-plan.php:97 #: pro/classes/class-smart-manager-pro-wc-membership-plan.php:98 msgid "Slug" msgstr "Ярлык" #: pro/templates/email.php:62 msgid "Smart Manager" msgstr "" #. Name of the plugin msgid "Smart Manager For WooCommerce – Stock Management, Bulk Edit & more..." msgstr "" "Smart Manager For WooCommerce - управление запаÑами, маÑÑÐ¾Ð²Ð°Ñ Ð¿Ñ€Ð°Ð²ÐºÐ° и " "многое другое..." #: pro/templates/email.php:36 msgid "Smart Manager has successfully completed" msgstr "" #: classes/class-smart-manager-admin-welcome.php:280 msgid "" "Smart Manager is a unique, revolutionary tool that gives you the power to " "boost your productivity by 10x in managing your WooCommerce store " "by using a familiar, single page, spreadsheet like interface. " msgstr "" "Smart Manager - Ñто уникальный революционный инÑтрумент, дающий возможноÑÑ‚ÑŒ " "в 10 раз повыÑить ÑффективноÑÑ‚ÑŒ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð°Ð³Ð°Ð·Ð¸Ð½Ð¾Ð¼ " "WooCommerce Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ знакомого одноÑтраничного интерфейÑа, похожего " "на документ Ñлектронной таблицы." #: classes/class-smart-manager-admin-welcome.php:414 msgid "" "Smart Manager is actively developed. If you can't find your favorite feature " "(or have a suggestion) %s. We'd love to hear from you." msgstr "" "Smart Manager активно развиваетÑÑ. ЕÑли вы не можете найти в нём нужную " "функцию (или у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ предложение) %s. Мы хотели бы узнать ваше мнение." #: classes/class-smart-manager-admin-welcome.php:394 msgid "" "Smart Manager is based on WooCommerce and WPeCommerce and the same e-" "commerce plugins sets the price/sales price of the variation parents " "automatically based on the price/sales price of its variations." msgstr "" "Smart Manager работает на базе WooCommerce и WPeCommerce, и Ñто плагин " "магазина автоматичеÑки уÑтанавливают цену/цену раÑпродажи родительÑких " "товаров на оÑнове цены/цены Ñо Ñкидкой его вариаций." #: classes/class-smart-manager-admin-welcome.php:385 msgid "Smart Manager is empty?" msgstr "Smart Manager пуÑÑ‚?" #: classes/class-smart-manager-pricing.php:676 msgid "Smart Manager Pro" msgstr "Smart Manager Pro" #: classes/class-smart-manager-admin-welcome.php:389 msgid "Smart Manager search functionality not working" msgstr "Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð¸Ñка Smart Manager не работает" #: classes/class-smart-manager-admin-welcome.php:398 msgid "" "Smart Manager will allow you to manage custom field of any other plugin." msgstr "" "Smart Manager позволит вам управлÑÑ‚ÑŒ наÑтраиваемыми полÑми любого другого " "плагина." #: classes/class-smart-manager-product.php:889 msgid "Standard" msgstr "Стандартный" #: classes/class-smart-manager-shop-order.php:162 #: pro/classes/class-smart-manager-pro-shop-subscription.php:177 msgid "Status" msgstr "СтатуÑ" #. Author of the plugin msgid "StoreApps" msgstr "StoreApps" #: class-smart-manager.php:678 msgid "StoreApps Plugins" msgstr "Плагины StoreApps" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:67 msgid "Submit & Deactivate" msgstr "Применить и отключить" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:70 msgid "Submit a reason to deactivate" msgstr "Укажите причину отключениÑ" #: classes/class-smart-manager-admin-welcome.php:414 msgid "Submit your query" msgstr "отправьте нам Ñвой запроÑ" #: pro/classes/class-smart-manager-pro-product.php:246 msgid "Subscription Periods" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:103 msgid "Subscription Price" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:271 msgid "Subscription Trial Period" msgstr "" #: classes/class-smart-manager-pricing.php:628 msgid "Support" msgstr "Поддержка" #: classes/class-smart-manager-pricing.php:423 msgid "Supported Post Types" msgstr "Поддерживаемые типы запиÑей" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:66 msgid "Take a moment to let us know why you are deactivating" msgstr "Ðайдите минутку, чтобы Ñообщить нам, почему вы отключаете его" #: pro/templates/order-invoice.php:208 msgid "Tax" msgstr "" #: classes/class-smart-manager-product.php:844 #: classes/class-smart-manager-product.php:850 msgid "Taxable" msgstr "Ðалогооблагаемый" #: pro/templates/order-invoice.php:159 msgid "Tel" msgstr "" #: pro/assets/js/smart-manager.js:39 msgctxt "text operator" msgid "append" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "contains" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "is" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "is not" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "not contains" msgstr "" #: pro/assets/js/smart-manager.js:39 msgctxt "text operator" msgid "prepend" msgstr "" #: classes/class-smart-manager-admin-welcome.php:230 msgid "Thank you for installing Smart Manager %s!" msgstr "СпаÑибо за уÑтановку Smart Manager, %s!" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:112 msgid "The plugin is great, but I need specific feature that you don't support" msgstr "Плагин отличный, но мне нужна оÑÐ¾Ð±Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ, которой у него нет." #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:100 msgid "The plugin is not working / not compatible with another plugin." msgstr "Плагин не работает/неÑовмеÑтим Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ плагином." #: pro/classes/class-smart-manager-pro-product.php:238 msgid "The starting block only" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:22 msgctxt "time duration" msgid "hours" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:22 msgctxt "time duration" msgid "minutes" msgstr "" #: pro/assets/js/smart-manager.js:35 msgctxt "time operator" msgid "set time to" msgstr "" #: assets/js/smart-manager.js:279 msgctxt "title" msgid "Click to add/edit condition" msgstr "" #: assets/js/smart-manager.js:362 msgctxt "title" msgid "Custom Views" msgstr "" #: pro/assets/js/smart-manager-product.js:226 msgctxt "title" msgid "For more than one values, use pipe (|) as delimiter" msgstr "" #: assets/js/smart-manager.js:1700 msgctxt "title" msgid "Gallery Images" msgstr "" #: assets/js/smart-manager.js:447 msgctxt "title" msgid "Load more records" msgstr "" #: assets/js/smart-manager.js:1293 msgctxt "title" msgid "Remove gallery image" msgstr "" #: assets/js/smart-manager.js:354 #, javascript-format msgctxt "title" msgid "Switch to %s" msgstr "" #: classes/class-smart-manager-admin-welcome.php:402 msgid "To show / hide columns in the Smart Manager, %s." msgstr "Чтобы показать/Ñкрыть Ñтолбцы в Smart Manager, %s." #: assets/js/smart-manager.js:1410 msgctxt "tooltip" msgid "(Click to sort)" msgstr "" #: assets/js/smart-manager.js:392 msgctxt "tooltip" msgid "Add Row" msgstr "" #: assets/js/smart-manager.js:378 msgctxt "tooltip" msgid "Bulk Edit" msgstr "" #: assets/js/smart-manager.js:412 msgctxt "tooltip" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:402 msgctxt "tooltip" msgid "Duplicate" msgstr "" #: assets/js/smart-manager.js:420 msgctxt "tooltip" msgid "Export CSV" msgstr "" #: assets/js/smart-manager.js:426 msgctxt "tooltip" msgid "Print Invoice" msgstr "" #: assets/js/smart-manager.js:386 msgctxt "tooltip" msgid "Save" msgstr "" #: assets/js/smart-manager.js:434 msgctxt "tooltip" msgid "Show / Hide Columns" msgstr "" #: pro/templates/order-invoice.php:209 msgid "Total" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:110 msgid "Unit Price Units" msgstr "" #: classes/class-smart-manager-pricing.php:446 msgid "Unlimited" msgstr "Ðеограниченно" #: pro/templates/email.php:7 msgid "Updated" msgstr "" #: classes/class-smart-manager-admin-welcome.php:393 msgid "Updating variation parent price/sales price not working?" msgstr "Ðе работает обновление родительÑкой цены вариации/цены раÑпродажи?" #: pro/classes/class-smart-manager-pro-access-privilege.php:339 msgid "Upload Image" msgstr "" #: classes/class-smart-manager-pricing.php:442 msgid "Upto three records without saving" msgstr "До трёх запиÑей без ÑохранениÑ" #: classes/class-smart-manager-shop-coupon.php:121 msgid "Usage Limit Per Coupon" msgstr "Лимит иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÑƒÐ¿Ð¾Ð½Ð°" #: classes/class-smart-manager-admin-welcome.php:357 msgid "using Simple Search†or Advanced Search" msgstr "Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ проÑтого или раÑширенного поиÑка" #: pro/classes/class-smart-manager-pro-shop-coupon.php:241 msgid "Validity Suffix" msgstr "" #: pro/templates/email.php:44 msgid "Value" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:142 msgid "Variation Category group-of rules: Exclude" msgstr "" #: assets/js/smart-manager-product.js:181 msgctxt "variation flag" msgid "Used for variations" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:93 msgid "Variation Group of..." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:98 msgid "Variation Maximum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:92 msgid "Variation Maximum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:97 msgid "Variation Minimum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:91 msgid "Variation Minimum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:140 msgid "Variation Order rules: Do not count" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:141 msgid "Variation Order rules: Exclude" msgstr "" #: classes/class-smart-manager-pricing.php:595 msgid "View Customer Lifetime Value (LTV)" msgstr "Счётчик общей ценноÑти клиента (LTV)" #: classes/class-smart-manager-admin-welcome.php:365 msgid "View our other WooCommerce plugins" msgstr "ПоÑмотрите другие наши плагины Ð´Ð»Ñ WooCommerce" #: assets/js/smart-manager-product.js:179 msgctxt "visibility flag" msgid "Visible on the product page" msgstr "" #: classes/class-smart-manager-pricing.php:661 msgid "" "We recommend Smart Manager Pro to everyone who is looking for an extremely " "multi-functional store manager. The plugin is absolutely worth it. Never " "again without Smart Manager!" msgstr "" "Мы рекомендуем Smart Manager Pro вÑем, кто ищет чрезвычайно " "многофункционального менеджера магазина. Плагин того Ñтоит. Ðикогда больше " "без Smart Manager!" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:108 msgid "What did you wanted to do in short period?" msgstr "Что вы хотели Ñделать в короткий Ñрок?" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:120 msgid "What is that plugin name?" msgstr "Что значит название плагина?" #: classes/class-smart-manager-pricing.php:399 msgid "" "What really sold me on Smart Manager Pro was Bulk Edit. My assistant does " "not have to do any complex math now (earlier, I always feared she would make " "mistakes)! With Smart Manager, she has more free time at hand, so I asked " "her to set up auto responder emails. The response was phenomenal. Repeat " "sales were up by 19.5%." msgstr "" "Что дейÑтвительно понравилоÑÑŒ мне в Smart Manager Pro, так Ñто маÑÑовое " "редактирование. Моей помощнице теперь не нужно заниматьÑÑ Ñложной " "математикой (раньше Ñ Ð²Ñегда боÑлÑÑ, что она Ñделает ошибки)! Ð‘Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ " "Smart Manager у нее поÑвлÑетÑÑ Ð±Ð¾Ð»ÑŒÑˆÐµ Ñвободного времени, поÑтому Ñ Ð¿Ð¾Ð¿Ñ€Ð¾Ñил " "её наÑтроить автоответчик на Ñлектронную почту. Ð ÐµÐ°ÐºÑ†Ð¸Ñ Ð±Ñ‹Ð»Ð° феноменальной. " "Повторные продажи выроÑли на 19,5%." #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:114 msgid "What specific feature you need?" msgstr "ÐšÐ°ÐºÐ°Ñ Ð¾ÑÐ¾Ð±Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²Ð°Ð¼ нужна?" #: pro/classes/class-smart-manager-pro-background-updater.php:317 msgid "when it is completed." msgstr "" #: classes/class-smart-manager-pricing.php:432 msgid "" "WordPress Pages, Media, Users, SEO plugins, WooCommerce Subscriptions, " "Bookings, Memberships, Product Add-ons, Brands…all" msgstr "" "Страницы WordPress, медиафайлы, пользователи, SEO-плагины, подпиÑки " "WooCommerce, заказы, членÑтво, аддоны товаров, бренды… вÑе" #: classes/class-smart-manager-pricing.php:427 msgid "" "WordPress Posts, WooCommerce Products, Product Variations, Orders, Coupons" msgstr "ЗапиÑи WordPress, товары WooCommerce, вариации товаров, заказы, купоны" #: classes/class-smart-manager-pricing.php:632 msgid "WP forum" msgstr "WP-форум" #: pro/classes/class-smart-manager-pro-base.php:134 #: pro/classes/class-smart-manager-pro-base.php:142 msgid "Yes" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:69 msgid "Yes - Deactivate" msgstr "Да - отключить" #: pro/classes/class-smart-manager-pro-base.php:98 msgid "Yoast Focus Keyphrase" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:96 msgid "Yoast Meta Description" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:97 msgid "Yoast Meta Keywords" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:101 msgid "Yoast Readability Score" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:102 msgid "Yoast SEO Score" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:95 msgid "Yoast SEO Title" msgstr "" #: classes/class-smart-manager-admin-welcome.php:341 msgid "" "You can change / update multiple fields of the entire store OR for selected " "items by selecting multiple records and then click on Bulk Edit. %s." msgstr "" "Ð’Ñ‹ можете маÑÑово изменÑÑ‚ÑŒ/обновлÑÑ‚ÑŒ определённые Ð¿Ð¾Ð»Ñ Ð²Ñех запиÑей магазина " "ИЛИ конкретной группы, выделив неÑколько запиÑей и нажав на кнопку маÑÑовой " "правки. %s." #: classes/class-smart-manager-pricing.php:676 msgid "" "You can either spend hours of work in store management or use %s to " "accomplish the same within minutes." msgstr "" "Ð’Ñ‹ можете потратить чаÑÑ‹ работы на управление магазином или иÑпользовать %s, " "чтобы Ñделать то же Ñамое за Ñчитанные минуты." #: classes/class-smart-manager-admin-welcome.php:357 msgid "" "You can export all the records OR filtered records (%s) by simply clicking " "on the Export CSV button at the bottom right of the grid." msgstr "" "Ð’Ñ‹ можете ÑкÑпортировать вÑе ИЛИ отфильтрованные запиÑи (%s), проÑто нажав " "кнопку ÑкÑпорта CSV в правом нижнем углу Ñетки." #: classes/class-smart-manager-admin-welcome.php:304 msgid "" "You can quickly update your Products, Orders, Coupons and Posts from Smart " "Manager itself. This facilitates editing of multiple rows at a time instead " "of editing and saving each row separately, %s." msgstr "" "Ð’Ñ‹ можете быÑтро обновлÑÑ‚ÑŒ Ñвои товары, заказы, купоны и ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð· Ñамого " "Smart Manager. Это упрощает одновременное редактирование неÑкольких Ñтрок " "вмеÑто Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ñтроки отдельно, %s." #: classes/class-smart-manager-admin-welcome.php:324 msgid "" "You can simply select records you want to delete (check the header box if " "you want to delete all records) and click on the “Delete†icon. All the " "selected records will be deleted. You can even delete records by applying " "search filters. %s." msgstr "" "Ð’Ñ‹ можете проÑто выбрать запиÑи, которые надо удалить (уÑтановите выделение " "в заголовке полÑ, еÑли надо удалить вÑе запиÑи), и жмите на значок удалениÑ. " "Ð’Ñе выбранные запиÑи будут удалены. Также можно удалÑÑ‚ÑŒ группы запиÑей, " "применÑÑ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ñ‹ поиÑка. %s" #: classes/class-smart-manager-admin-welcome.php:406 msgid "" "You cannot import using Smart Manager. Use import functionality of " "WooCommerce." msgstr "" "Ð’Ñ‹ не можете оÑущеÑтвить такой импорт Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Smart Manager. ИÑпользуйте " "механизм импорта WooCommerce." #: class-smart-manager.php:1149 msgid "you will have to wait for the current background process to finish." msgstr "вам необходимо дождатьÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ фонового процеÑÑа." #: classes/class-smart-manager-product.php:891 msgid "Zero Rate" msgstr "ÐÑƒÐ»ÐµÐ²Ð°Ñ Ñтавка" #: classes/class-smart-manager-pricing.php:343 msgid "â° Limited time offer" msgstr "" languages/smart-manager-for-wp-e-commerce-fr_FR.po000064400000201456147600337620016046 0ustar00msgid "" msgstr "" "Project-Id-Version: Smart Manager 4.2.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-04-20 14:04:35+00:00\n" "PO-Revision-Date: 2022-03-17 04:14+0000\n" "Last-Translator: Mansi \n" "Language-Team: French (France)\n" "Language: fr_FR\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-SourceCharset: utf-8\n" "X-Poedit-KeywordsList: _:1;gettext:1;dgettext:2;ngettext:1,2;dngettext:2,3;" "__:1;_e:1;_c:1;_n:1,2;_n_noop:1,2;_nc:1,2;__ngettext:1,2;__ngettext_noop:1,2;" "_x:1,2c;_ex:1,2c;_nx:1,2,4c;_nx_noop:1,2,3c;_n_js:1,2;_nx_js:1,2,3c;" "esc_attr__:1;esc_html__:1;esc_attr_e:1;esc_html_e:1;esc_attr_x:1,2c;" "esc_html_x:1,2c;comments_number_link:2,3;t:1;st:1;trans:1;transChoice:1,2\n" "X-Poedit-Basepath: ../\n" "X-Poedit-SearchPath-0: .\n" "X-Loco-Target-Locale: fr_FR\n" "X-Generator: Loco https://localise.biz/" #: classes/class-smart-manager-pricing.php:405 msgid " More powerful features with Smart Manager Pro!" msgstr "" #: classes/class-smart-manager-pricing.php:351 msgid "$112" msgstr "" #: classes/class-smart-manager-pricing.php:363 msgid "$135" msgstr "" #: classes/class-smart-manager-pricing.php:350 msgid "$149" msgstr "" #: classes/class-smart-manager-pricing.php:362 msgid "$179" msgstr "" #: classes/class-smart-manager-pricing.php:374 msgid "$360" msgstr "" #: classes/class-smart-manager-pricing.php:385 msgid "$375" msgstr "" #: classes/class-smart-manager-pricing.php:373 msgid "$479" msgstr "" #: classes/class-smart-manager-pricing.php:384 msgid "$499" msgstr "" #: classes/class-smart-manager-pricing.php:351 msgid "$75" msgstr "" #: classes/class-smart-manager-pricing.php:363 msgid "$90" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:165 msgid "% Completed" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:143 #, php-format msgid "% completed" msgstr "" #. 1. Error title 2. The bulk process #: pro/classes/class-smart-manager-pro-background-updater.php:307 #, php-format msgid "" "%1$s: The %2$s process has stopped. Please review the Smart Manager " "dashboard to check the status." msgstr "" #: class-smart-manager.php:1460 #, php-format msgid "%1s" msgstr "" #: classes/class-smart-manager-admin-welcome.php:429 #, php-format msgid "%s" msgstr "" #: class-smart-manager.php:862 #, php-format msgid "%s to check Smart Manager Pro features and claim your discount." msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:323 msgid "--:--:--" msgstr "" #: classes/class-smart-manager-pricing.php:348 msgid "1 site (Annual)" msgstr "" #: classes/class-smart-manager-pricing.php:371 msgid "1 site (Lifetime)" msgstr "" #: classes/class-smart-manager-pricing.php:667 msgid "20 or 30 times quicker store management" msgstr "" #: class-smart-manager.php:861 classes/class-smart-manager-pricing.php:340 msgid "25% Off" msgstr "" #: classes/class-smart-manager-pricing.php:360 msgid "5 sites (Annual)" msgstr "" #: classes/class-smart-manager-pricing.php:382 msgid "5 sites (Lifetime)" msgstr "" #: class-smart-manager.php:665 msgid " 🔥 Go Pro" msgstr "" #. Description of the plugin msgid "" "Pro Version Installed. The #1 and a powerful tool to manage " "stock, inventory from a single place. Super quick and super easy." msgstr "" #: class-smart-manager.php:1570 msgid "A required Smart Manager file is missing. Can't continue. " msgstr "" "Impossible de continuer, un fichier requis par Smart Manager est manquant." #: classes/class-smart-manager-pricing.php:659 msgid "A whole afternoon’s work in seconds" msgstr "" #: classes/class-smart-manager-pricing.php:662 #, fuzzy #| msgid "From" msgid "Acrom" msgstr "Du" #: pro/templates/email.php:43 msgid "Action" msgstr "" #: pro/assets/js/smart-manager-product.js:154 pro/assets/js/smart-manager.js:37 msgctxt "action operator" msgid "add to" msgstr "" #: pro/assets/js/smart-manager.js:25 pro/assets/js/smart-manager.js:47 msgctxt "action operator" msgid "copy from" msgstr "" #: pro/assets/js/smart-manager-product.js:155 pro/assets/js/smart-manager.js:37 msgctxt "action operator" msgid "remove from" msgstr "" #: pro/assets/js/smart-manager.js:39 msgctxt "action operator" msgid "search & replace" msgstr "" #: pro/assets/js/smart-manager-product.js:153 pro/assets/js/smart-manager.js:46 #: pro/assets/js/smart-manager.js:891 pro/assets/js/smart-manager.js:1027 msgctxt "action operator" msgid "set to" msgstr "" #: assets/js/smart-manager-product.js:229 msgctxt "add attribute button" msgid "Add" msgstr "" #: classes/class-smart-manager-pricing.php:451 msgid "Add or Delete records" msgstr "" #: classes/class-smart-manager-product.php:958 msgid "Additional Description" msgstr "Description additionnelle" #: pro/assets/js/smart-manager.js:28 msgctxt "additional operator" msgid "decrease by" msgstr "" #: pro/assets/js/smart-manager.js:28 msgctxt "additional operator" msgid "increase by" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:326 msgid "Address to look in" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:125 msgid "Adjacent Buffering?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:295 msgid "Advanced Search" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:42 #, javascript-format msgctxt "advanced search conditions" msgid "%d condition%s" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:42 msgctxt "advanced search conditions" msgid "s" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:155 msgctxt "advanced search content" msgid "condition groups pass" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:148 msgctxt "advanced search content" msgid "When" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:153 msgctxt "advanced search option" msgid "all" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:152 msgctxt "advanced search option" msgid "at least one" msgstr "" #: classes/class-smart-manager-pricing.php:484 msgid "Advanced Search using “AND†filter" msgstr "" #: classes/class-smart-manager-pricing.php:495 msgid "Advanced Search using “OR†filter" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:294 msgid "All" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:237 msgid "All blocks being booked" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:227 msgid "All dates are..." msgstr "" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:50 #: pro/assets/js/smart-manager.js:868 msgid "All Items In Search Results" msgstr "" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:50 #: pro/assets/js/smart-manager.js:868 msgid "All Items In Store" msgstr "" #: classes/class-smart-manager-product.php:912 msgid "Allow" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:136 msgid "Allow Combination" msgstr "" #: classes/class-smart-manager-shop-coupon.php:123 msgid "Allow Free Shipping" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:252 msgid "Allow free shipping" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:132 #, php-format msgid "Allow search engines to show this %1$s in search results?" msgstr "" #: classes/class-smart-manager-product.php:911 msgid "Allow, but notify customer" msgstr "" #: classes/class-smart-manager-shop-coupon.php:119 msgid "Allowed Emails" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:291 msgid "Allowed emails" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:213 msgid "Allowed user roles" msgstr "" #: class-smart-manager.php:1468 msgid "An upgrade for Smart Manager Pro" msgstr "Une mise à jour de Smart Manager Pro" #: classes/class-smart-manager-admin-welcome.php:281 msgid "any custom post type in WordPress" msgstr "" #: classes/class-smart-manager-admin-welcome.php:281 #, php-format msgid "" "Apart from WooCommerce post types like Products, Orders, Coupons, now you " "can manage %s. Be it Posts, Pages, Media, WordPress Users, etc. you can now " "manage everything using Smart Manager." msgstr "" #. 1. The bulk process #: pro/classes/class-smart-manager-pro-background-updater.php:348 #, php-format msgid "Are you sure you want to stop the %s process? Click OK to stop." msgstr "" #: assets/js/smart-manager-product.js:302 msgctxt "attribute button" msgid "Select all" msgstr "" #: assets/js/smart-manager-product.js:303 msgctxt "attribute button" msgid "Select none" msgstr "" #: assets/js/smart-manager-product.js:121 msgctxt "attribute list" msgid "Custom product attribute" msgstr "" #: pro/assets/js/smart-manager-product.js:40 msgctxt "attribute operator" msgid "Add Attribute" msgstr "" #: pro/assets/js/smart-manager-product.js:49 msgctxt "attribute operator" msgid "Remove Attribute" msgstr "" #: assets/js/smart-manager-product.js:283 msgctxt "attribute variation" msgid "Used for variations" msgstr "" #: assets/js/smart-manager-product.js:280 msgctxt "attribute visibility" msgid "Visible on the product page" msgstr "" #: classes/class-smart-manager-product.php:1068 msgid "Attributes" msgstr "" #: classes/class-smart-manager-product.php:1101 msgid "Attributes: custom" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:253 msgid "Auto Generate Coupon" msgstr "" #: class-smart-manager.php:1649 msgid "Auto-updates are not available for this plugin." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:222 msgid "Automatically assigned" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:229 msgid "available by default" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:264 msgid "Back to Smart Manager" msgstr "" #: pro/assets/js/smart-manager-product.js:216 msgctxt "batch update option" msgid "All" msgstr "" #: pro/templates/email.php:39 msgid "Below are the lists of updates done:" msgstr "" #: classes/class-smart-manager-pricing.php:359 msgid "Best Seller" msgstr "" #: classes/class-smart-manager-admin-welcome.php:333 msgid "Biggest Time Saver" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:327 msgid "Billing" msgstr "" #: pro/templates/order-invoice.php:144 msgid "Billing Address" msgstr "Adresse de facturation" #: pro/classes/class-smart-manager-pro-product.php:252 #, fuzzy #| msgid "Billing Region" msgid "Billing Period" msgstr "Région de factuaration" #: pro/classes/class-smart-manager-pro-wc-booking.php:171 msgid "Booked Product" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:80 msgid "Booking can be cancelled until" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:196 msgid "Booking can be cancelled until (Unit)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:77 msgid "Booking duration" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:183 msgid "Booking Duration (Type)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:191 msgid "Booking Duration (Unit)" msgstr "" #: assets/js/smart-manager.js:987 #, javascript-format msgctxt "bottom bar" msgid "%d %s loaded" msgstr "" #: assets/js/smart-manager.js:1005 #, javascript-format msgctxt "bottom bar" msgid "%d of %d %s loaded" msgstr "" #: assets/js/smart-manager.js:980 assets/js/smart-manager.js:1005 #, javascript-format msgctxt "bottom bar" msgid "No %s Found" msgstr "" #: classes/class-smart-manager-pricing.php:670 msgid "Brian Batcher" msgstr "" #: class-smart-manager.php:1149 #: classes/class-smart-manager-admin-welcome.php:331 msgid "Bulk Edit" msgstr "" #: classes/class-smart-manager-admin-welcome.php:333 #, php-format msgid "Bulk Edit - %1s (only in %2s)" msgstr "" #: classes/class-smart-manager-pricing.php:506 msgid "Bulk Edit / Batch Update" msgstr "" #: assets/js/smart-manager.js:1705 msgctxt "button" msgid "Add" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:50 msgctxt "button" msgid "Add a condition" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:66 msgctxt "button" msgid "Add another group" msgstr "" #: assets/js/smart-manager.js:1713 msgctxt "button" msgid "Add images to product gallery" msgstr "" #: assets/js/smart-manager.js:396 msgctxt "button" msgid "Add Row" msgstr "" #: assets/js/smart-manager.js:1714 msgctxt "button" msgid "Add to gallery" msgstr "" #: assets/js/smart-manager.js:382 msgctxt "button" msgid "Bulk Edit" msgstr "" #: assets/js/smart-manager.js:2436 msgctxt "button" msgid "Cancel" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:118 #: src/views/BulkEditDialog.js:112 msgctxt "button" msgid "Clear" msgstr "" #: assets/js/smart-manager.js:438 msgctxt "button" msgid "Columns" msgstr "" #: assets/js/smart-manager.js:2435 msgctxt "button" msgid "Create" msgstr "" #: assets/js/smart-manager.js:412 msgctxt "button" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:402 msgctxt "button" msgid "Duplicate" msgstr "" #: assets/js/smart-manager.js:424 msgctxt "button" msgid "Export CSV" msgstr "" #: assets/js/smart-manager.js:2579 msgctxt "button" msgid "Get Pro at 25% OFF" msgstr "" #: assets/js/smart-manager.js:175 #, javascript-format msgctxt "button" msgid "Load More %s" msgstr "" #: assets/js/smart-manager.js:3151 msgctxt "button" msgid "No" msgstr "" #: assets/js/smart-manager-product.js:243 assets/js/smart-manager.js:1092 msgctxt "button" msgid "OK" msgstr "" #: assets/js/smart-manager.js:430 msgctxt "button" msgid "Print Invoice" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:74 msgctxt "button" msgid "Remove this group" msgstr "" #: pro/assets/js/smart-manager.js:968 msgctxt "button" msgid "Reset" msgstr "" #: assets/js/smart-manager.js:390 msgctxt "button" msgid "Save" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:99 msgctxt "button" msgid "Search" msgstr "" #: assets/js/smart-manager-product.js:199 msgctxt "button" msgid "Select all" msgstr "" #: assets/js/smart-manager-product.js:200 msgctxt "button" msgid "Select none" msgstr "" #: assets/js/admin.js:1 assets/js/smart-manager.js:2744 #: src/views/BulkEditDialog.js:98 pro/assets/js/smart-manager.js:963 msgctxt "button" msgid "Update" msgstr "" #: assets/js/smart-manager.js:3134 msgctxt "button" msgid "Yes" msgstr "" #: classes/class-smart-manager-pricing.php:355 #: classes/class-smart-manager-pricing.php:367 #: classes/class-smart-manager-pricing.php:378 #: classes/class-smart-manager-pricing.php:389 msgid "Buy Now" msgstr "" #: classes/class-smart-manager-pricing.php:648 msgid "Buy Smart Manager Pro" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:144 msgid "Calculate unit prices automatically" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:214 msgid "Calendar always visible" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:211 msgid "Calendar display mode" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:118 msgid "Can be cancelled?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:405 msgid "Can I import using Smart Manager?" msgstr "" #: classes/class-smart-manager-product.php:1147 msgid "Catalog Visibility" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:139 msgid "Category group-of rules: Exclude" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:235 msgid "Check rules against..." msgstr "" #: assets/js/smart-manager-product.js:285 msgctxt "checkbox list" msgid "Position:" msgstr "" #: class-smart-manager.php:862 msgid "Click here" msgstr "" #: classes/class-smart-manager-admin-welcome.php:402 msgid "click here" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:423 msgid "Click to copy" msgstr "" #: class-smart-manager.php:1468 msgid "Click to upgrade." msgstr "Cliquez ici pour effectuer la mise à jour." #: classes/class-smart-manager-pricing.php:462 msgid "Columns (Show / Hide / Sort)" msgstr "" #: classes/class-smart-manager-pricing.php:612 #: classes/class-smart-manager-pricing.php:623 msgid "Coming soon" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:335 msgid "Company logo:" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:337 msgid "completed Successfully" msgstr "" #: pro/classes/class-smart-manager-pro-acf-field-group.php:43 #: pro/classes/class-smart-manager-pro-acf-field.php:43 msgid "Config Options" msgstr "" #: classes/class-smart-manager-pricing.php:340 #, php-format msgid "Congratulations! You just unlocked %s on Smart Manager Pro" msgstr "" #: classes/class-smart-manager-admin-welcome.php:414 msgid "contact us" msgstr "" #: classes/class-smart-manager-shop-order.php:440 #: pro/classes/class-smart-manager-pro-product.php:107 msgid "Cost of Good" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:122 msgid "Count persons as bookings" msgstr "" #: classes/class-smart-manager-shop-coupon.php:115 msgid "Coupon Code" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:333 msgid "Coupon expiry date" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:338 msgid "Coupon expiry time" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:255 msgid "Coupon Is Visible Storewide" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:354 msgid "Coupon shareable link" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:242 msgid "Coupon Title Prefix" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:243 msgid "Coupon Title Suffix" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:240 msgid "Coupon Validity" msgstr "" #: classes/class-smart-manager-pricing.php:551 msgid "Create Column Sets / Custom Views" msgstr "" #: classes/class-smart-manager-pricing.php:433 msgid "custom post types and their custom fields." msgstr "" #: assets/js/smart-manager.js:364 msgctxt "custom view button" msgid "Create" msgstr "" #: assets/js/smart-manager.js:366 msgctxt "custom view button" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:365 msgctxt "custom view button" msgid "Update" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:186 msgid "Customer defined blocks of" msgstr "" #: classes/class-smart-manager-shop-order.php:164 msgid "Customer provided note" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:221 msgid "Customer selected" msgstr "" #: assets/js/smart-manager.js:315 msgctxt "dashboard groups" msgid "All post types" msgstr "" #: assets/js/smart-manager.js:326 msgctxt "dashboard groups" msgid "All saved views" msgstr "" #: assets/js/smart-manager.js:299 msgctxt "dashboard groups" msgid "Common post types" msgstr "" #: assets/js/smart-manager.js:310 msgctxt "dashboard groups" msgid "Recently used views" msgstr "" #: classes/class-smart-manager-shop-order.php:160 #: pro/classes/class-smart-manager-pro-shop-subscription.php:175 #, fuzzy #| msgid "State" msgid "Date" msgstr "Etat" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "days" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "months" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "weeks" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "years" msgstr "" #: pro/assets/js/smart-manager.js:34 msgctxt "date operator" msgid "set date to" msgstr "" #: pro/assets/js/smart-manager.js:33 msgctxt "datetime operator" msgid "set date to" msgstr "" #: pro/assets/js/smart-manager.js:33 msgctxt "datetime operator" msgid "set datetime to" msgstr "" #: pro/assets/js/smart-manager.js:33 msgctxt "datetime operator" msgid "set time to" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:149 msgid "Day(s)" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:133 msgid "Default" msgstr "" #: assets/js/smart-manager.js:415 msgctxt "delete button" msgid "Delete Permanently" msgstr "" #: assets/js/smart-manager.js:414 msgctxt "delete button" msgid "Move to Trash" msgstr "" #: class-smart-manager.php:1118 msgid "" "Delete Permanently is disabled. Please contact store administrator for " "enabling the same." msgstr "" #: class-smart-manager.php:1149 #: classes/class-smart-manager-admin-welcome.php:319 msgid "Delete Records" msgstr "" #: classes/class-smart-manager-product.php:956 #: classes/class-smart-manager-shop-coupon.php:117 msgid "Description" msgstr "Description" #: assets/js/smart-manager.js:2719 msgctxt "description" msgid "" "Drag & drop the enabled columns to the right side to disable them. Drag & " "drop the disabled columns to the left side to enable them." msgstr "" #: assets/js/smart-manager.js:2721 msgctxt "description" msgid "Drag the columns to the top or bottom to sort them." msgstr "" #: pro/assets/js/smart-manager.js:603 msgctxt "description" msgid "" "Marking this view public will make it available to all users having access " "to the Smart Manager." msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:248 msgid "Disable Email Restriction" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:213 msgid "Display calendar on click" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:244 msgid "Display message" msgstr "" #: classes/class-smart-manager-product.php:910 msgid "Do Not Allow" msgstr "" #: classes/class-smart-manager-admin-welcome.php:254 msgid "Docs" msgstr "" #: class-smart-manager.php:672 msgid "Docs & Support" msgstr "" #: assets/js/smart-manager.js:101 msgctxt "dropdown operator" msgid "is" msgstr "" #: assets/js/smart-manager.js:101 msgctxt "dropdown operator" msgid "is not" msgstr "" #: classes/class-smart-manager-pricing.php:540 msgid "Duplicate all records in a single click" msgstr "" #: assets/js/smart-manager.js:405 msgctxt "duplicate button" msgid "Entire Store" msgstr "" #: assets/js/smart-manager.js:404 msgctxt "duplicate button" msgid "Selected Records" msgstr "" #: class-smart-manager.php:1149 msgid "Duplicate Records" msgstr "" #: classes/class-smart-manager-pricing.php:529 msgid "Duplicate single / multiple records" msgstr "" #: pro/templates/email.php:7 msgid "Duplicated" msgstr "" #: classes/class-smart-manager-pricing.php:636 msgid "Email / Call" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:1257 msgid "Email already exists. Please enter another email." msgstr "" #: pro/classes/class-smart-manager-pro-user.php:1251 msgid "Email cannot be empty" msgstr "" #: pro/templates/order-invoice.php:158 msgid "Email id" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:251 msgid "Email message?" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:116 msgid "Enable Calendar Range Picker?" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:130 msgid "Enable Min Max Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:123 msgid "Enable person types" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:307 msgid "Error" msgstr "" #: class-smart-manager.php:1585 msgid "Error:" msgstr "Erreur :" #: classes/class-smart-manager-pricing.php:431 msgid "Everything in Lite +" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:226 msgid "Exclude Attributes" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:211 msgid "Exclude categories" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:231 msgid "Exclude products" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:249 msgid "Exclude sale items" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:257 msgid "Expire After" msgstr "" #: pro/classes/class-smart-manager-pro-wc-user-membership.php:169 #: pro/classes/class-smart-manager-pro-wc-user-membership.php:170 msgid "Expires" msgstr "" #: classes/class-smart-manager-pricing.php:518 msgid "Export all / Filtered records as CSV" msgstr "" #: classes/class-smart-manager-admin-welcome.php:347 msgid "Export CSV" msgstr "Export CSV" #: classes/class-smart-manager-admin-welcome.php:349 #, php-format msgid "Export CSV (only in %s)" msgstr "" #: classes/class-smart-manager-product.php:972 msgid "External Url" msgstr "" #: classes/class-smart-manager-admin-welcome.php:380 msgid "FAQ / Common Problems" msgstr "" #: classes/class-smart-manager-admin-welcome.php:264 msgid "FAQ's" msgstr "" #: classes/class-smart-manager-product.php:1194 msgid "Featured" msgstr "" #: classes/class-smart-manager-product.php:2018 #: classes/class-smart-manager-product.php:2021 msgid "Featured Image updated successfully" msgstr "" #: classes/class-smart-manager-pricing.php:410 msgid "Features" msgstr "" #: pro/templates/email.php:42 msgid "Field" msgstr "" #: classes/class-smart-manager-admin-welcome.php:290 msgid "Filter / Search Records" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:185 msgid "Fixed blocks of" msgstr "" #: classes/class-smart-manager-admin-welcome.php:419 #, php-format msgid "Follow steps listed here: %s" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:337 #, fuzzy #| msgid "Or" msgid "for" msgstr "Ou" #: pro/classes/class-smart-manager-pro-shop-coupon.php:256 msgid "For new user only?" msgstr "" #: classes/class-smart-manager-pricing.php:413 msgid "Free" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:105 msgid "Free Trial" msgstr "" #: classes/class-smart-manager-admin-welcome.php:236 #: classes/class-smart-manager-admin-welcome.php:362 msgid "Get started with Smart Manager" msgstr "" #: classes/class-smart-manager-admin-welcome.php:232 msgid "" "Glad to have you onboard. We hope Smart Manager adds to your desired success " "ðŸ†" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:38 msgctxt "group content" msgid "of the following conditions is true." msgstr "" #: pro/classes/class-smart-manager-pro-acf-field.php:45 msgid "Group Id" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:90 msgid "Group of..." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:119 msgid "Has persons" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:120 msgid "Has resources" msgstr "" #: assets/js/smart-manager.js:2732 msgctxt "heading" msgid "Disabled" msgstr "" #: assets/js/smart-manager.js:2725 msgctxt "heading" msgid "Enabled" msgstr "" #: class-smart-manager.php:861 #, php-format msgid "Hey %1s, you just unlocked %2s on Smart Manager Pro!" msgstr "" #: pro/templates/email.php:35 msgid "Hi there!" msgstr "" #: classes/class-smart-manager-product.php:736 msgid "Hidden" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:150 msgid "Hour(s)" msgstr "" #: classes/class-smart-manager-admin-welcome.php:418 msgid "How do I upgrade a Lite version to a Pro version?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:401 msgid "How to add columns to Smart Manager dashboard?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:397 msgid "" "How to manage any custom field of any custom plugin using Smart Manager?" msgstr "" #. Author URI of the plugin msgid "https://www.storeapps.org/" msgstr "" #. URI of the plugin msgid "https://www.storeapps.org/product/smart-manager/" msgstr "" #: classes/class-smart-manager-admin-welcome.php:413 msgid "I can't find a way to do X..." msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:118 msgid "I found another plugin for my needs" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:106 msgid "I only needed the plugin for a short period" msgstr "" #: classes/class-smart-manager-pricing.php:397 msgid "I would happily pay five times for this product!" msgstr "" #: classes/class-smart-manager-pricing.php:669 msgid "" "I've got over 200 products and dreaded managing them one by one. Smart " "Manager Pro plugin lets me do this so much quicker. Probably 20 or 30 times " "quicker. It is an absolutely invaluable tool." msgstr "" #: pro/templates/email.php:62 msgid "If you like" msgstr "" #: classes/class-smart-manager-pricing.php:606 msgid "Import" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:315 msgid "Important" msgstr "" #: classes/class-smart-manager-product.php:862 msgid "In stock" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:317 msgid "in the background. You will be notified on" msgstr "" #: class-smart-manager.php:1149 msgid "" "In the meanwhile, you can use Smart Manager. But before using actions like " msgstr "" #: pro/classes/class-smart-manager-pro-base.php:34 msgid "Index" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:250 msgid "Individual use only" msgstr "" #: classes/class-smart-manager-admin-welcome.php:299 msgid "Inline Editing" msgstr "" #: classes/class-smart-manager-pricing.php:438 msgid "Inline editing" msgstr "" #: class-smart-manager.php:1468 msgid "is available." msgstr "est disponible." #: pro/classes/class-smart-manager-pro-shop-coupon.php:254 msgid "Is Pick Price of Product" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:124 msgid "It is a temporary deactivation. I am just debugging an issue." msgstr "" #: classes/class-smart-manager-pricing.php:400 msgid "Jeff" msgstr "" #: pro/classes/class-smart-manager-pro-acf-field-group.php:44 #: pro/classes/class-smart-manager-pro-acf-field.php:44 msgid "Key" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:102 msgid "" "Kindly share what did not work for you / conflicting with which plugin so we " "can fix it..." msgstr "" #: classes/class-smart-manager-admin-welcome.php:261 msgid "Know Smart Manager" msgstr "" #: pro/classes/class-smart-manager-pro-acf-field-group.php:41 #: pro/classes/class-smart-manager-pro-acf-field.php:41 msgid "Label" msgstr "" #: classes/class-smart-manager-admin-welcome.php:386 #: classes/class-smart-manager-admin-welcome.php:419 msgid "latest version" msgstr "" #: class-smart-manager.php:1447 msgid "LITE" msgstr "" #: classes/class-smart-manager-admin-welcome.php:386 #, php-format msgid "" "Make sure you are using %s of Smart Manager. If still the issue persist, " "temporarily de-activate all plugins except WooCommerce/WPeCommerce & Smart " "Manager. Re-check the issue, if the issue still persists, contact us. If the " "issue goes away, re-activate other plugins one-by-one & re-checking the " "fields, to find out which plugin is conflicting." msgstr "" #: classes/class-smart-manager-pricing.php:617 msgid "Manage Custom Taxonomies" msgstr "" #: classes/class-smart-manager-pricing.php:573 msgid "Manage WordPress User roles" msgstr "" #: classes/class-smart-manager-admin-welcome.php:287 msgid "Manage your entire store from a single screen" msgstr "" #: classes/class-smart-manager-pricing.php:677 msgid "Massive time-savings and 10x productivity boost. Choice is yours!" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:83 msgid "Max bookings per block" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:236 msgid "Max discount" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:82 msgid "Max persons" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:101 msgid "Max Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:85 msgid "Maximum block bookable" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:206 msgid "Maximum block bookable (Unit)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:79 msgid "Maximum duration" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:96 msgid "Maximum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:89 msgid "Maximum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-wc-user-membership.php:164 #: pro/classes/class-smart-manager-pro-wc-user-membership.php:165 msgid "Member since" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:148 msgid "Meta robots advanced" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:81 msgid "Min persons" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:100 msgid "Min Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:135 msgid "Min/Max Rules" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:84 msgid "Minimum block bookable" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:201 msgid "Minimum block bookable (Unit)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:78 msgid "Minimum duration" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:95 msgid "Minimum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:88 msgid "Minimum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:151 msgid "Minutes(s)" msgstr "" #: assets/js/smart-manager.js:2330 msgctxt "modal content" msgid "all" msgstr "" #: assets/js/smart-manager.js:2329 #, javascript-format msgctxt "modal content" msgid "Are you sure you want to %s" msgstr "" #: assets/js/smart-manager.js:2330 #, javascript-format msgctxt "modal content" msgid "Are you sure you want to %s the %s?" msgstr "" #: assets/js/smart-manager.js:2529 msgctxt "modal content" msgid "Are you sure you want to duplicate the " msgstr "" #: assets/js/smart-manager.js:3114 msgctxt "modal content" msgid "Are you sure?" msgstr "" #: assets/js/smart-manager.js:3092 msgctxt "modal content" msgid "Continue in background" msgstr "" #: pro/assets/js/smart-manager.js:595 msgctxt "modal content" msgid "" "Create a custom view to save selected columns from a dashboard. Use it for " "saved searches, giving specific columns access to other users, etc." msgstr "" #: assets/js/smart-manager.js:2472 msgctxt "modal content" msgid "delete" msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "delete all" msgstr "" #: assets/js/smart-manager.js:2433 #, javascript-format msgctxt "modal content" msgid "Enter how many new %s(s) to create!" msgstr "" #: assets/js/smart-manager.js:261 assets/js/smart-manager.js:2207 #, javascript-format msgctxt "modal content" msgid "For managing %s, %s %s version" msgstr "" #: assets/js/smart-manager.js:3092 msgctxt "modal content" msgid "Initializing..." msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "Note: Looking to" msgstr "" #: assets/js/smart-manager.js:2323 msgctxt "modal content" msgid "permanently delete" msgstr "" #: assets/js/smart-manager.js:261 assets/js/smart-manager.js:2207 #: assets/js/smart-manager.js:3061 msgctxt "modal content" msgid "Pro" msgstr "" #: assets/js/smart-manager.js:2329 msgctxt "modal content" msgid "record" msgstr "" #: assets/js/smart-manager.js:2329 msgctxt "modal content" msgid "records" msgstr "" #: assets/js/smart-manager.js:2472 msgctxt "modal content" msgid "the current view. Are you sure you want to continue?" msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "the records?" msgstr "" #: assets/js/smart-manager.js:2329 msgctxt "modal content" msgid "the selected" msgstr "" #: assets/js/smart-manager.js:3061 #, javascript-format msgctxt "modal content" msgid "This feature is available only in the %s version" msgstr "" #: assets/js/smart-manager.js:2472 msgctxt "modal content" msgid "This will" msgstr "" #: assets/js/smart-manager.js:2528 msgctxt "modal content" msgid "" "This will duplicate only the records in posts, postmeta and related " "taxonomies." msgstr "" #: assets/js/smart-manager.js:2323 msgctxt "modal content" msgid "trash" msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "Upgrade to Pro" msgstr "" #: assets/js/smart-manager.js:2557 msgctxt "modal description" msgid "" "You can change / update multiple fields of the entire store OR for selected " "items by selecting multiple records and then click on Bulk Edit." msgstr "" #: assets/js/smart-manager.js:2560 msgctxt "modal description" msgid "" "You can export all the records OR filtered records (using Simple Search or " "Advanced Search) by simply clicking on the Export CSV button at the bottom " "right of the grid." msgstr "" #: assets/js/smart-manager.js:2566 msgctxt "modal title" msgid "(Only in" msgstr "" #: assets/js/smart-manager.js:2432 #, javascript-format msgctxt "modal title" msgid "Add %s(s)" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:60 msgctxt "modal title" msgid "Advanced Search" msgstr "" #: assets/js/smart-manager.js:2319 assets/js/smart-manager.js:2471 #: assets/js/smart-manager.js:2527 msgctxt "modal title" msgid "Attention!!!" msgstr "" #: assets/js/smart-manager.js:2566 msgctxt "modal title" msgid "Biggest Time Saver" msgstr "" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:66 #: pro/assets/js/smart-manager.js:718 pro/assets/js/smart-manager.js:973 msgctxt "modal title" msgid "Bulk Edit" msgstr "" #: assets/js/smart-manager.js:2749 msgctxt "modal title" msgid "Column Manager - Show/Hide Columns" msgstr "" #: pro/assets/js/smart-manager.js:1273 msgctxt "modal title" msgid "Delete Records" msgstr "" #: pro/assets/js/smart-manager.js:489 msgctxt "modal title" msgid "Duplicate Records" msgstr "" #: assets/js/smart-manager.js:2994 assets/js/smart-manager.js:3060 msgctxt "modal title" msgid "Note" msgstr "" #: assets/js/smart-manager.js:3091 msgctxt "modal title" msgid "Please Wait" msgstr "" #: assets/js/smart-manager.js:2566 msgctxt "modal title" msgid "Pro" msgstr "" #: assets/js/smart-manager.js:2992 msgctxt "modal title" msgid "Success" msgstr "" #: assets/js/smart-manager.js:3113 msgctxt "modal title" msgid "Warning" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:148 msgid "Month(s)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:121 msgid "Multiply all costs by person count" msgstr "" #: classes/class-smart-manager-product.php:952 #: pro/classes/class-smart-manager-pro-acf-field-group.php:42 #: pro/classes/class-smart-manager-pro-acf-field.php:42 msgid "Name" msgstr "Nom" #: pro/classes/class-smart-manager-pro-product.php:260 msgid "Never expire" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:185 msgid "Nickname" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:135 #: pro/classes/class-smart-manager-pro-base.php:143 msgid "No" msgstr "Non" #: pro/classes/class-smart-manager-pro-base.php:29 #: pro/classes/class-smart-manager-pro-base.php:37 msgid "No Archive" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:36 msgid "No Follow" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:28 #: pro/classes/class-smart-manager-pro-base.php:38 msgid "No Image Index" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:35 msgid "No Index" msgstr "" #: classes/class-smart-manager-product.php:941 #: classes/class-smart-manager-product.php:943 msgid "No shipping class" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:30 #: pro/classes/class-smart-manager-pro-base.php:39 msgid "No Snippet" msgstr "" #: classes/class-smart-manager-product.php:846 #: classes/class-smart-manager-product.php:852 #: pro/classes/class-smart-manager-pro-base.php:27 msgid "None" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:230 msgid "not-available by default" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:329 msgid "NOTE" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "column if not enabled using" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "column show/hide functionality" msgstr "" #: assets/js/smart-manager.js:2460 assets/js/smart-manager.js:2482 msgctxt "notification" msgid "Custom Views avialable (Only in" msgstr "" #: assets/js/smart-manager.js:2590 msgctxt "notification" msgid "Duplicate Records (Only in" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "Enable" msgstr "" #: assets/js/smart-manager.js:3048 msgctxt "notification" msgid "Error" msgstr "" #: assets/js/smart-manager.js:2422 msgctxt "notification" msgid "For editing more records upgrade to Pro" msgstr "" #: assets/js/smart-manager.js:263 assets/js/smart-manager.js:2208 #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "Note" msgstr "" #: assets/js/smart-manager.js:2272 msgctxt "notification" msgid "Please edit a record" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "Please enter user email" msgstr "" #: assets/js/smart-manager.js:2309 assets/js/smart-manager.js:2545 msgctxt "notification" msgid "Please select a record" msgstr "" #: assets/js/smart-manager.js:2460 assets/js/smart-manager.js:2482 #: assets/js/smart-manager.js:2590 msgctxt "notification" msgid "Pro" msgstr "" #: assets/js/smart-manager.js:2314 msgctxt "notification" msgid "records at a time" msgstr "" #: assets/js/smart-manager.js:2954 pro/assets/js/smart-manager.js:567 #: pro/assets/js/smart-manager.js:690 msgctxt "notification" msgid "Success" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:57 #, fuzzy msgctxt "notification" msgid "This feature is available only in the Pro version." msgstr "Cette fonction est disponible uniquement dans la version Pro" #: assets/js/smart-manager.js:2314 msgctxt "notification" msgid "To delete more than" msgstr "" #: assets/js/smart-manager.js:2299 msgctxt "notification" msgid "To permanently delete records" msgstr "" #: assets/js/smart-manager.js:2299 assets/js/smart-manager.js:2314 msgctxt "notification" msgid "upgrade to Pro" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "User Email" msgstr "" #: pro/assets/js/smart-manager.js:567 #, javascript-format msgctxt "notification" msgid "View %sd successfully!" msgstr "" #: pro/assets/js/smart-manager.js:658 msgctxt "notification" msgid "View already exists. Please try another name" msgstr "" #: pro/assets/js/smart-manager.js:690 msgctxt "notification" msgid "View deleted successfully!" msgstr "" #: assets/js/smart-manager.js:3048 msgctxt "notification" msgid "You have entered incorrect data in the highlighted cells." msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "decrease by %" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "decrease by number" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "increase by %" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "increase by number" msgstr "" #: classes/class-smart-manager-product.php:864 msgid "On backorder" msgstr "" #: pro/templates/order-invoice.php:201 msgid "Order Discount" msgstr "" #: pro/templates/order-invoice.php:195 msgid "Order Notes" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:137 msgid "Order rules: Do not count" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:138 msgid "Order rules: Exclude" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:130 msgid "Other" msgstr "" #: classes/class-smart-manager-product.php:863 msgid "Out of stock" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:217 #, fuzzy #| msgid "Payment Method" msgid "Payment Methods" msgstr "Mode de paiement" #: pro/assets/js/smart-manager.js:853 pro/assets/js/smart-manager.js:857 #: pro/assets/js/smart-manager.js:943 pro/assets/js/smart-manager.js:1054 #: pro/assets/js/smart-manager.js:1075 pro/assets/js/smart-manager.js:1094 msgctxt "placeholder" msgid "Enter a value..." msgstr "" #: pro/assets/js/smart-manager-product.js:225 msgctxt "placeholder" msgid "Enter Attribute name..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:428 msgctxt "placeholder" msgid "Enter attribute name..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:63 src/views/Rule.js:357 #: src/views/Rule.js:372 msgctxt "placeholder" msgid "Enter value" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:429 #: pro/assets/js/smart-manager-product.js:226 msgctxt "placeholder" msgid "Enter values..." msgstr "" #: pro/assets/js/smart-manager.js:596 msgctxt "placeholder" msgid "Give a name to this view" msgstr "" #: assets/js/smart-manager-product.js:208 #: assets/js/smart-manager-product.js:313 msgctxt "placeholder" msgid "Name" msgstr "" #: assets/js/smart-manager-product.js:203 #: assets/js/smart-manager-product.js:209 #: assets/js/smart-manager-product.js:307 #: assets/js/smart-manager-product.js:314 msgctxt "placeholder" msgid "Pipe (|) separate terms" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:429 #: pro/assets/js/smart-manager.js:1155 msgctxt "placeholder" msgid "Replace with..." msgstr "" #: assets/js/smart-manager.js:2733 msgctxt "placeholder" msgid "Search For Disabled Columns..." msgstr "" #: assets/js/smart-manager.js:2726 msgctxt "placeholder" msgid "Search For Enabled Columns..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:428 #: pro/assets/js/smart-manager.js:1154 msgctxt "placeholder" msgid "Search for..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:230 #: pro/assets/js/smart-manager.js:1119 #, javascript-format msgctxt "placeholder" msgid "Select %s" msgstr "" #: assets/js/smart-manager-product.js:190 #: assets/js/smart-manager-product.js:293 msgctxt "placeholder" msgid "Select terms" msgstr "" #: assets/js/smart-manager.js:278 msgctxt "placeholder" msgid "Type to search..." msgstr "" #: pro/templates/email.php:62 msgid "please leave us a" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:132 msgid "Please mention..." msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:71 msgid "Please select an option" msgstr "" #: assets/js/smart-manager-product.js:183 msgctxt "position checkbox" msgid "Position:" msgstr "" #: classes/class-smart-manager-shop-order.php:437 #: pro/templates/order-invoice.php:163 msgid "Price" msgstr "Prix" #: classes/class-smart-manager-pricing.php:641 msgid "Pricing" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:330 msgid "Print Order Settings" msgstr "" #: classes/class-smart-manager-pricing.php:584 msgid "Print packing slips for WooCommerce orders in bulk" msgstr "" #: classes/class-smart-manager-pricing.php:562 msgid "Print PDF invoices" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:195 msgid "Privileges for Smart Manager for different System Roles" msgstr "" #: class-smart-manager.php:1447 msgid "PRO" msgstr "" #: classes/class-smart-manager-admin-welcome.php:333 #: classes/class-smart-manager-admin-welcome.php:349 #: classes/class-smart-manager-pricing.php:416 msgid "Pro" msgstr "" #: pro/templates/order-invoice.php:162 msgid "Product" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:223 msgid "Product Attributes" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:209 msgid "Product categories" msgstr "" #: pro/assets/js/smart-manager-product.js:127 msgctxt "product price operator" msgid "set to regular price" msgstr "" #: pro/assets/js/smart-manager-product.js:123 msgctxt "product price operator" msgid "set to sale price" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:109 msgid "Product Units" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:229 msgid "Products" msgstr "Produits" #: pro/classes/class-smart-manager-pro-background-updater.php:322 msgid "Progress" msgstr "" #: pro/assets/js/smart-manager.js:601 #, fuzzy #| msgid "Publish" msgid "Public" msgstr "Publié" #: classes/class-smart-manager-shop-order.php:437 msgid "Qty" msgstr "" #: pro/templates/order-invoice.php:163 msgid "Quantity" msgstr "Quantité" #: classes/class-smart-manager-admin-welcome.php:248 msgid "Questions? Need Help?" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:65 msgid "Quick Feedback for Smart Manager plugin" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:103 msgid "Rank Math SEO Score" msgstr "" #: pro/templates/email.php:62 msgid "rating. A huge thank you from StoreApps in advance!" msgstr "" #: pro/templates/email.php:45 msgid "Records Updated" msgstr "" #: classes/class-smart-manager-product.php:890 msgid "Reduced Rate" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:111 msgid "Regular Unit Price" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:316 msgid "request is running" msgstr "" #: classes/class-smart-manager-admin-welcome.php:390 msgid "" "Request you to kindly de-activate and activate the Smart Manager plugin once " "and then have a recheck with the search functionality." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:86 msgid "Require a buffer period of" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:117 msgid "Requires confirmation?" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:219 msgid "Resources are..." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:124 msgid "Restrict start and end days?" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:153 msgid "Robots Meta" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:32 msgctxt "rule content" msgid "This group is a \"pass\" when" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:35 msgctxt "rule option" msgid "all" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:36 msgctxt "rule option" msgid "at least one" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:112 msgid "Sale Unit Price" msgstr "" #: assets/js/smart-manager.js:280 assets/js/smart-manager.js:539 #, javascript-format msgctxt "search conditions" msgid "%d condition%s" msgstr "" #: assets/js/smart-manager.js:280 assets/js/smart-manager.js:539 msgctxt "search conditions" msgid "s" msgstr "" #: classes/class-smart-manager-product.php:735 msgid "Search results only" msgstr "" #: assets/js/smart-manager.js:354 assets/js/smart-manager.js:355 #, javascript-format msgctxt "search type" msgid "%s Search" msgstr "" #: assets/js/smart-manager.js:276 msgctxt "search type" msgid "Advanced" msgstr "" #: assets/js/smart-manager.js:276 msgctxt "search type" msgid "Simple" msgstr "" #: classes/class-smart-manager-admin-welcome.php:324 #: classes/class-smart-manager-admin-welcome.php:341 msgid "See how" msgstr "" #: classes/class-smart-manager-admin-welcome.php:295 #: classes/class-smart-manager-admin-welcome.php:304 msgid "see how" msgstr "" #: pro/assets/js/smart-manager-product.js:152 pro/assets/js/smart-manager.js:24 #: pro/assets/js/smart-manager.js:890 #, fuzzy #| msgid "Select an action" msgid "Select Action" msgstr "Sélectionner une action" #: pro/assets/js/smart-manager-product.js:143 msgid "Select Attribute" msgstr "" #: pro/assets/js/smart-manager.js:874 #, fuzzy #| msgid "Select a field" msgid "Select Field" msgstr "Sélectionner un champ" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:147 #: pro/assets/js/smart-manager.js:871 msgid "Selected Items" msgstr "" #: classes/class-smart-manager-pricing.php:513 msgid "" "Set to, Append, Prepend, Increase / Decrease by %, Increase / Decrease by " "number, Set datetime to, Set date to, Set time to, Upload images and many " "more..." msgstr "" #: class-smart-manager.php:669 class-smart-manager.php:1455 #: classes/class-smart-manager-admin-welcome.php:252 #: pro/classes/class-smart-manager-pro-access-privilege.php:178 msgid "Settings" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:56 msgid "Settings Saved Successfully!!!" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:328 #: pro/templates/order-invoice.php:197 msgid "Shipping" msgstr "Livraison" #: pro/templates/order-invoice.php:151 msgid "Shipping Address" msgstr "Adresse de livraison" #: pro/classes/class-smart-manager-pro-shop-coupon.php:215 #, fuzzy #| msgid "Shipping Method" msgid "Shipping methods" msgstr "Mode de livraison" #: classes/class-smart-manager-product.php:845 #: classes/class-smart-manager-product.php:851 msgid "Shipping only" msgstr "" #: classes/class-smart-manager-product.php:733 msgid "Shop and search results" msgstr "" #: classes/class-smart-manager-product.php:734 msgid "Shop only" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:141 #, php-format msgid "Should search engines follow links on this %1$s?" msgstr "" #: assets/js/smart-manager-product.js:435 msgctxt "show variations checkbox" msgid "Show Variations" msgstr "" #: classes/class-smart-manager-admin-welcome.php:308 msgid "Show/Hide & Sort Data Columns" msgstr "" #: classes/class-smart-manager-admin-welcome.php:313 msgid "" "Show/hide multiple data columns of your WooCommerce store data as per your " "requirements. Sort them in ascending or descending order. Smart Manager also " "gives you persistent state management." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:104 msgid "Sign-up Fee" msgstr "" #: classes/class-smart-manager-pricing.php:473 msgid "Simple Search" msgstr "" #: classes/class-smart-manager-admin-welcome.php:295 #, php-format msgid "" "Simply enter the keyword you wish to filter records in the “Simple Search†" "field at the top of the grid (%s). If you need to have a more specific " "search result, then you can switch to “%s“ and then search." msgstr "" #: pro/classes/class-smart-manager-pro-base.php:26 msgid "Site-wide default" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:68 msgid "Skip & Deactivate" msgstr "" #: classes/class-smart-manager-product.php:949 #: pro/templates/order-invoice.php:162 msgid "SKU" msgstr "UGS" #: classes/class-smart-manager-product.php:954 #: pro/classes/class-smart-manager-pro-wc-membership-plan.php:97 #: pro/classes/class-smart-manager-pro-wc-membership-plan.php:98 msgid "Slug" msgstr "" #: pro/templates/email.php:62 msgid "Smart Manager" msgstr "Smart Manager" #. Name of the plugin msgid "Smart Manager For WooCommerce – Stock Management, Bulk Edit & more..." msgstr "" #: pro/templates/email.php:36 msgid "Smart Manager has successfully completed" msgstr "" #: classes/class-smart-manager-admin-welcome.php:280 msgid "" "Smart Manager is a unique, revolutionary tool that gives you the power to " "boost your productivity by 10x in managing your WooCommerce store " "by using a familiar, single page, spreadsheet like interface. " msgstr "" #: classes/class-smart-manager-admin-welcome.php:414 #, php-format msgid "" "Smart Manager is actively developed. If you can't find your favorite feature " "(or have a suggestion) %s. We'd love to hear from you." msgstr "" #: classes/class-smart-manager-admin-welcome.php:394 msgid "" "Smart Manager is based on WooCommerce and WPeCommerce and the same e-" "commerce plugins sets the price/sales price of the variation parents " "automatically based on the price/sales price of its variations." msgstr "" #: classes/class-smart-manager-admin-welcome.php:385 msgid "Smart Manager is empty?" msgstr "" #: classes/class-smart-manager-pricing.php:676 msgid "Smart Manager Pro" msgstr "" #: classes/class-smart-manager-admin-welcome.php:389 msgid "Smart Manager search functionality not working" msgstr "" #: classes/class-smart-manager-admin-welcome.php:398 msgid "" "Smart Manager will allow you to manage custom field of any other plugin." msgstr "" #: classes/class-smart-manager-product.php:889 msgid "Standard" msgstr "" #: classes/class-smart-manager-shop-order.php:162 #: pro/classes/class-smart-manager-pro-shop-subscription.php:177 msgid "Status" msgstr "Statut" #. Author of the plugin msgid "StoreApps" msgstr "" #: class-smart-manager.php:678 msgid "StoreApps Plugins" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:67 msgid "Submit & Deactivate" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:70 msgid "Submit a reason to deactivate" msgstr "" #: classes/class-smart-manager-admin-welcome.php:414 msgid "Submit your query" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:246 msgid "Subscription Periods" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:103 msgid "Subscription Price" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:271 msgid "Subscription Trial Period" msgstr "" #: classes/class-smart-manager-pricing.php:628 msgid "Support" msgstr "" #: classes/class-smart-manager-pricing.php:423 msgid "Supported Post Types" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:66 msgid "Take a moment to let us know why you are deactivating" msgstr "" #: pro/templates/order-invoice.php:208 msgid "Tax" msgstr "Taxe" #: classes/class-smart-manager-product.php:844 #: classes/class-smart-manager-product.php:850 msgid "Taxable" msgstr "" #: pro/templates/order-invoice.php:159 msgid "Tel" msgstr "" #: pro/assets/js/smart-manager.js:39 msgctxt "text operator" msgid "append" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "contains" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "is" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "is not" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "not contains" msgstr "" #: pro/assets/js/smart-manager.js:39 msgctxt "text operator" msgid "prepend" msgstr "" #: classes/class-smart-manager-admin-welcome.php:230 #, php-format msgid "Thank you for installing Smart Manager %s!" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:112 msgid "The plugin is great, but I need specific feature that you don't support" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:100 msgid "The plugin is not working / not compatible with another plugin." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:238 msgid "The starting block only" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:22 msgctxt "time duration" msgid "hours" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:22 msgctxt "time duration" msgid "minutes" msgstr "" #: pro/assets/js/smart-manager.js:35 msgctxt "time operator" msgid "set time to" msgstr "" #: assets/js/smart-manager.js:279 msgctxt "title" msgid "Click to add/edit condition" msgstr "" #: assets/js/smart-manager.js:362 msgctxt "title" msgid "Custom Views" msgstr "" #: pro/assets/js/smart-manager-product.js:226 #, fuzzy msgctxt "title" msgid "For more than one values, use pipe (|) as delimiter" msgstr "Pour plus d’une valeur, utiliser le caractère | comme délimiteur" #: assets/js/smart-manager.js:1700 msgctxt "title" msgid "Gallery Images" msgstr "" #: assets/js/smart-manager.js:447 msgctxt "title" msgid "Load more records" msgstr "" #: assets/js/smart-manager.js:1293 msgctxt "title" msgid "Remove gallery image" msgstr "" #: assets/js/smart-manager.js:354 #, javascript-format msgctxt "title" msgid "Switch to %s" msgstr "" #: classes/class-smart-manager-admin-welcome.php:402 #, php-format msgid "To show / hide columns in the Smart Manager, %s." msgstr "" #: assets/js/smart-manager.js:1410 msgctxt "tooltip" msgid "(Click to sort)" msgstr "" #: assets/js/smart-manager.js:392 msgctxt "tooltip" msgid "Add Row" msgstr "" #: assets/js/smart-manager.js:378 msgctxt "tooltip" msgid "Bulk Edit" msgstr "" #: assets/js/smart-manager.js:412 msgctxt "tooltip" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:402 msgctxt "tooltip" msgid "Duplicate" msgstr "" #: assets/js/smart-manager.js:420 msgctxt "tooltip" msgid "Export CSV" msgstr "" #: assets/js/smart-manager.js:426 msgctxt "tooltip" msgid "Print Invoice" msgstr "" #: assets/js/smart-manager.js:386 msgctxt "tooltip" msgid "Save" msgstr "" #: assets/js/smart-manager.js:434 msgctxt "tooltip" msgid "Show / Hide Columns" msgstr "" #: pro/templates/order-invoice.php:209 msgid "Total" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:110 msgid "Unit Price Units" msgstr "" #: classes/class-smart-manager-pricing.php:446 msgid "Unlimited" msgstr "" #: pro/templates/email.php:7 msgid "Updated" msgstr "" #: classes/class-smart-manager-admin-welcome.php:393 msgid "Updating variation parent price/sales price not working?" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:339 msgid "Upload Image" msgstr "" #: classes/class-smart-manager-pricing.php:442 msgid "Upto three records without saving" msgstr "" #: classes/class-smart-manager-shop-coupon.php:121 msgid "Usage Limit Per Coupon" msgstr "" #: classes/class-smart-manager-admin-welcome.php:357 msgid "using Simple Search†or Advanced Search" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:241 msgid "Validity Suffix" msgstr "" #: pro/templates/email.php:44 msgid "Value" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:142 msgid "Variation Category group-of rules: Exclude" msgstr "" #: assets/js/smart-manager-product.js:181 msgctxt "variation flag" msgid "Used for variations" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:93 msgid "Variation Group of..." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:98 msgid "Variation Maximum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:92 msgid "Variation Maximum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:97 msgid "Variation Minimum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:91 msgid "Variation Minimum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:140 msgid "Variation Order rules: Do not count" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:141 msgid "Variation Order rules: Exclude" msgstr "" #: classes/class-smart-manager-pricing.php:595 msgid "View Customer Lifetime Value (LTV)" msgstr "" #: classes/class-smart-manager-admin-welcome.php:365 msgid "View our other WooCommerce plugins" msgstr "" #: assets/js/smart-manager-product.js:179 msgctxt "visibility flag" msgid "Visible on the product page" msgstr "" #: classes/class-smart-manager-pricing.php:661 msgid "" "We recommend Smart Manager Pro to everyone who is looking for an extremely " "multi-functional store manager. The plugin is absolutely worth it. Never " "again without Smart Manager!" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:108 msgid "What did you wanted to do in short period?" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:120 msgid "What is that plugin name?" msgstr "" #: classes/class-smart-manager-pricing.php:399 msgid "" "What really sold me on Smart Manager Pro was Bulk Edit. My assistant does " "not have to do any complex math now (earlier, I always feared she would make " "mistakes)! With Smart Manager, she has more free time at hand, so I asked " "her to set up auto responder emails. The response was phenomenal. Repeat " "sales were up by 19.5%." msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:114 msgid "What specific feature you need?" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:317 msgid "when it is completed." msgstr "" #: classes/class-smart-manager-pricing.php:432 msgid "" "WordPress Pages, Media, Users, SEO plugins, WooCommerce Subscriptions, " "Bookings, Memberships, Product Add-ons, Brands…all" msgstr "" #: classes/class-smart-manager-pricing.php:427 msgid "" "WordPress Posts, WooCommerce Products, Product Variations, Orders, Coupons" msgstr "" #: classes/class-smart-manager-pricing.php:632 msgid "WP forum" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:134 #: pro/classes/class-smart-manager-pro-base.php:142 msgid "Yes" msgstr "Oui" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:69 msgid "Yes - Deactivate" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:98 msgid "Yoast Focus Keyphrase" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:96 msgid "Yoast Meta Description" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:97 msgid "Yoast Meta Keywords" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:101 msgid "Yoast Readability Score" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:102 msgid "Yoast SEO Score" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:95 msgid "Yoast SEO Title" msgstr "" #: classes/class-smart-manager-admin-welcome.php:341 #, php-format msgid "" "You can change / update multiple fields of the entire store OR for selected " "items by selecting multiple records and then click on Bulk Edit. %s." msgstr "" #: classes/class-smart-manager-pricing.php:676 #, php-format msgid "" "You can either spend hours of work in store management or use %s to " "accomplish the same within minutes." msgstr "" #: classes/class-smart-manager-admin-welcome.php:357 #, php-format msgid "" "You can export all the records OR filtered records (%s) by simply clicking " "on the Export CSV button at the bottom right of the grid." msgstr "" #: classes/class-smart-manager-admin-welcome.php:304 #, php-format msgid "" "You can quickly update your Products, Orders, Coupons and Posts from Smart " "Manager itself. This facilitates editing of multiple rows at a time instead " "of editing and saving each row separately, %s." msgstr "" #: classes/class-smart-manager-admin-welcome.php:324 #, php-format msgid "" "You can simply select records you want to delete (check the header box if " "you want to delete all records) and click on the “Delete†icon. All the " "selected records will be deleted. You can even delete records by applying " "search filters. %s." msgstr "" #: classes/class-smart-manager-admin-welcome.php:406 msgid "" "You cannot import using Smart Manager. Use import functionality of " "WooCommerce." msgstr "" #: class-smart-manager.php:1149 msgid "you will have to wait for the current background process to finish." msgstr "" #: classes/class-smart-manager-product.php:891 msgid "Zero Rate" msgstr "" #: classes/class-smart-manager-pricing.php:343 msgid "â° Limited time offer" msgstr "" languages/smart-manager-for-wp-e-commerce-da_DK.mo000064400000004724147600337620016006 0ustar00Þ•#4LL:MˆŽ ¥ÆÖå÷ ü  ".>DHQXa e s€‰š «¹ÀÄÈ Ì?Ú9kT:Àûÿ#:Nav {‡¢¦¶ÆËÏ×Ý ãî ÿ  . B P W \ _ e 2u +¨ A required Smart Manager file is missing. Can't continue. AcromAdditional DescriptionAn upgrade for Smart Manager ProBilling AddressBilling PeriodClick to upgrade.DateDescriptionError:Export CSVNameNoOrder NotesPayment MethodsPriceProProductsPublicQuantitySKUSelect ActionSelect FieldShippingShipping AddressShipping methodsSmart ManagerStatusTaxYesforis available.notificationThis feature is available only in the Pro version.titleFor more than one values, use pipe (|) as delimiterProject-Id-Version: Smart Manager 4.2.1 Report-Msgid-Bugs-To: POT-Creation-Date: 2019-04-20 14:04:35+00:00 PO-Revision-Date: 2022-03-17 04:14+0000 Last-Translator: Mansi Language-Team: Danish Language: da_DK Plural-Forms: nplurals=2; plural=n != 1; MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-SourceCharset: utf-8 X-Poedit-KeywordsList: _:1;gettext:1;dgettext:2;ngettext:1,2;dngettext:2,3;__:1;_e:1;_c:1;_n:1,2;_n_noop:1,2;_nc:1,2;__ngettext:1,2;__ngettext_noop:1,2;_x:1,2c;_ex:1,2c;_nx:1,2,4c;_nx_noop:1,2,3c;_n_js:1,2;_nx_js:1,2,3c;esc_attr__:1;esc_html__:1;esc_attr_e:1;esc_html_e:1;esc_attr_x:1,2c;esc_html_x:1,2c;comments_number_link:2,3;t:1;st:1;trans:1;transChoice:1,2 X-Poedit-Basepath: ../ X-Poedit-SearchPath-0: . X-Loco-Target-Locale: da_DK X-Generator: Loco https://localise.biz/Fejl! En Smart Manager fil mangler. Du kan ikke fortsætteFraYderligere beskrivelseEn opdatering til Smart Manager ProAdresse pÃ¥ betalerRegion for betalerKlik for at opdatereStatBeskrivelseFejl:Eksport til CSVNavnNejNoter pÃ¥ ordreBetalingsmetodePrisProProduktUdgivAntalVarenummerUdfør følgendeVælg et feltForsendelseAdresse pÃ¥ modtagerForsendelses metodeSmart ManagerStatusMomsJaEllerer tilgængeligDenne funktion er kun tilgængelig i Pro-versionenIndtastes flere værdier, adskil da med (|)languages/smart-manager-for-wp-e-commerce-it_IT.mo000064400000074464147600337620016064 0ustar00Þ•` /bM?°ð':BS2fŽ™:(%c‰¦½Ðä&ô%AE]nt†š9®è! 4¼U? R]p/…µÌ$â &.>M\tŒ%«Ñ âì #+#Ae}!“µÇ Úû  += Z ft:ƒ ¾Ë åñ !5EXk!£¾ÕçìóYûU d p Š ¤ ´ Á Æ Õ 'ç #! 3! >!1K!}!“!œ!«!É!á!õ!û!""*"="N" a"n" v""$™" ¾"Ë"á"#ê"###5#E#b#u# z#…#Q¤#ö# ÿ# $ $4%$ Z$d$k$1s$.¥$HÔ$%#;%+_%0‹%À¼% }&‰& &š&K£&ï&õ& ''''=@'~'Z‚'Ý'ð'Yö'P)i)-…)A³) õ)* * &*2*C*Z*x*‰* š*§* ¼* É* Õ*ã*ô* +)+:+ K+V+"_+‚+ ‡+”+ + ¨+²+Á+ Ê+Õ+ç+ ì+ù+ ,,.,C, I,V,f,x,,–,ž,³,2Æ,7ù,1-9- L-Z-m-v--ƒ-Œ-'¢-Ê-Þ- î-û-ƒ.’.­.Ä.Õ. ò.þ.//&/›./Ê/Ó/Ü/í/ þ/ 0 $00.0_0¾}0 <1 H1ÕV1,2>2GP2(˜2ßÁ2ƒ¡3É%4ï4.5H655†5˜5¬5Ê5Ü5ñ566&65;6q6u6*}6G¨6?ð6070H7y77 7š78¢7 Û7!è7 8!818*78b8x8“8®8É8#ä89"'9"J9m9°v9*':R:Al:®;{Î;JJ<•<™<ª<À<×<ë<==#=g´=„>Å¡>óg?O[@ «@!µ@×@ ì@÷@ A*ADA*HA sAAA©A3»AïAB) B4BCJBŽBô¥B2šDjÍDP8E‰EšE.ªE ÙEçEøE5F >F?ßF/GOGVGpG‡GG²G,ÃG+ðGH"HAHWH`HvH“HO°HII/I?I&UIÆ|IOCJ “JJ·JDÕJK4K6JKK!‘K ³KÀKÚKòK L"&L.IL4xL­LÁL'ÔL+üL(M8M(SM|M+—M*ÃMîMN#NBN bNmN€N$—N ¼NÆNÖN=ðN.O"=O `O)nO˜O·OÖOçOPP.8PgP‡P P´P ¹P ÃPuÏPEQ UQaQ Q¢Q·QÆQÕQåQ'õQ!R ?R IR5VRŒRªR³R4ÄR"ùRS6S=SESUSgSySŠS ¦S±S ·SÃS*ÜS T#T7T-FTtT„TŠT¡T!²TÔTëTôTUgU „U ŽU ›U ¦U7±UéU ñUûU;V6>ViuV*ßV/ W2:W5mWÒ£W vX‚X ŠX •XL¡XîXõX YY#.YMRY Yx§Y Z 6Z]@Z"ž[$Á[/æ[V\ m\){\¥\´\Ä\Ö\#ñ\]$] 6]@] U]c]r]]’]"¬] Ï]Ý] î]ø]7^8^ =^ K^V^ f^r^ Œ^š^«^È^ Ð^ Ý^ ë^÷^_3_9_B_V_l__ ˆ_ “_´_DÇ_8 `E`N`a`q`„` `—` `§`+Æ`#ò`a )a6aŒNa Ûaüab#"b FbRbVbqb ‹b­—b Ec Rc]cucŠcšc ¹c=Æc+dÐ0deeç&e*f9fQKf.fÌfŽÕgÙdh>i9ViZiëiñij!j7jLjcj!vj˜j¡j:¹jôj üj,kV4kA‹kÍk8èk!l(l Bl MlVXl¯l¿lßl÷l m.m@mXmxm˜m·m*Öm&n-(n2Vn‰n¥’n 8oYoyo. q“9qMÍqrr-rFr]rvr–rªr§»rwcsÛsÊlt7ujUv Àv2Ëv(þv 'w2w Jw<Uw’w–w´wÄw,Úwx7xWx ux8xºxFÐxy More powerful features with Smart Manager Pro!%1$s: The %2$s process has stopped. Please review the Smart Manager dashboard to check the status.%s to check Smart Manager Pro features and claim your discount.1 site (Annual)1 site (Lifetime)20 or 30 times quicker store management25% Off5 sites (Annual)5 sites (Lifetime) 🔥 Go ProPro Version Installed. The #1 and a powerful tool to manage stock, inventory from a single place. Super quick and super easy.A required Smart Manager file is missing. Can't continue. A whole afternoon’s work in secondsActionAdd or Delete recordsAdditional DescriptionAddress to look inAdjacent Buffering?Advanced SearchAdvanced Search using “AND†filterAdvanced Search using “OR†filterAllAll blocks being bookedAll dates are...AllowAllow CombinationAllow Free ShippingAllow free shippingAllow search engines to show this %1$s in search results?Allow, but notify customerAllowed EmailsAllowed emailsAllowed user rolesAn upgrade for Smart Manager ProApart from WooCommerce post types like Products, Orders, Coupons, now you can manage %s. Be it Posts, Pages, Media, WordPress Users, etc. you can now manage everything using Smart Manager.Are you sure you want to stop the %s process? Click OK to stop.AttributesAttributes: customAuto Generate CouponAuto-updates are not available for this plugin.Automatically assignedBack to Smart ManagerBelow are the lists of updates done:Best SellerBiggest Time SaverBillingBilling AddressBilling PeriodBooked ProductBooking Duration (Type)Booking Duration (Unit)Booking can be cancelled untilBooking can be cancelled until (Unit)Booking durationBulk EditBulk Edit - %1s (only in %2s)Bulk Edit / Batch UpdateBuy NowBuy Smart Manager ProCalculate unit prices automaticallyCalendar always visibleCalendar display modeCan I import using Smart Manager?Can be cancelled?Catalog VisibilityCategory group-of rules: ExcludeCheck rules against...Click hereClick to copyClick to upgrade.Columns (Show / Hide / Sort)Coming soonCompany logo:Config OptionsCongratulations! You just unlocked %s on Smart Manager ProCost of GoodCount persons as bookingsCoupon CodeCoupon Is Visible StorewideCoupon Title PrefixCoupon Title SuffixCoupon ValidityCoupon expiry dateCoupon expiry timeCoupon shareable linkCreate Column Sets / Custom ViewsCustomer defined blocks ofCustomer provided noteCustomer selectedDateDay(s)DefaultDelete Permanently is disabled. Please contact store administrator for enabling the same.Delete RecordsDescriptionDisable Email RestrictionDisplay calendar on clickDisplay messageDo Not AllowDocsDocs & SupportDuplicate RecordsDuplicate all records in a single clickDuplicate single / multiple recordsDuplicatedEmail / CallEmail already exists. Please enter another email.Email cannot be emptyEmail idEmail message?Enable Calendar Range Picker?Enable Min Max QuantityEnable person typesErrorError:Everything in Lite +Exclude AttributesExclude categoriesExclude productsExclude sale itemsExpire AfterExpiresExport CSVExport CSV (only in %s)Export all / Filtered records as CSVExternal UrlFAQ / Common ProblemsFeaturedFeatured Image updated successfullyFeaturesFieldFilter / Search RecordsFixed blocks ofFollow steps listed here: %sFor new user only?FreeFree TrialGet started with Smart ManagerGlad to have you onboard. We hope Smart Manager adds to your desired success ðŸ†Group IdGroup of...Has personsHas resourcesHey %1s, you just unlocked %2s on Smart Manager Pro!Hi there!HiddenHour(s)How do I upgrade a Lite version to a Pro version?How to add columns to Smart Manager dashboard?How to manage any custom field of any custom plugin using Smart Manager?I can't find a way to do X...I found another plugin for my needsI only needed the plugin for a short periodI would happily pay five times for this product!I've got over 200 products and dreaded managing them one by one. Smart Manager Pro plugin lets me do this so much quicker. Probably 20 or 30 times quicker. It is an absolutely invaluable tool.If you likeImportImportantIn stockIn the meanwhile, you can use Smart Manager. But before using actions like IndexIndividual use onlyInline EditingInline editingIs Pick Price of ProductIt is a temporary deactivation. I am just debugging an issue.KeyKindly share what did not work for you / conflicting with which plugin so we can fix it...Know Smart ManagerLabelMake sure you are using %s of Smart Manager. If still the issue persist, temporarily de-activate all plugins except WooCommerce/WPeCommerce & Smart Manager. Re-check the issue, if the issue still persists, contact us. If the issue goes away, re-activate other plugins one-by-one & re-checking the fields, to find out which plugin is conflicting.Manage Custom TaxonomiesManage WordPress User rolesManage your entire store from a single screenMassive time-savings and 10x productivity boost. Choice is yours!Max QuantityMax bookings per blockMax discountMax personsMaximum QuantityMaximum block bookableMaximum block bookable (Unit)Maximum durationMaximum quantityMember sinceMeta robots advancedMin QuantityMin personsMin/Max RulesMinimum QuantityMinimum block bookableMinimum block bookable (Unit)Minimum durationMinimum quantityMinutes(s)Month(s)Multiply all costs by person countNameNever expireNicknameNo ArchiveNo FollowNo Image IndexNo IndexNo SnippetNo shipping classNoneOn backorderOrder DiscountOrder NotesOrder rules: Do not countOrder rules: ExcludeOtherOut of stockPayment MethodsPlease mention...Please select an optionPricePricingPrint Order SettingsPrint PDF invoicesPrint packing slips for WooCommerce orders in bulkPrivileges for Smart Manager for different System RolesProductProduct AttributesProduct UnitsProduct categoriesProductsProgressQtyQuantityQuestions? Need Help?Quick Feedback for Smart Manager pluginRank Math SEO ScoreRecords UpdatedReduced RateRegular Unit PriceRequest you to kindly de-activate and activate the Smart Manager plugin once and then have a recheck with the search functionality.Require a buffer period ofRequires confirmation?Resources are...Restrict start and end days?Robots MetaSKUSale Unit PriceSearch results onlySee howSet to, Append, Prepend, Increase / Decrease by %, Increase / Decrease by number, Set datetime to, Set date to, Set time to, Upload images and many more...SettingsShippingShipping AddressShipping methodsShipping onlyShop and search resultsShop onlyShould search engines follow links on this %1$s?Show/Hide & Sort Data ColumnsShow/hide multiple data columns of your WooCommerce store data as per your requirements. Sort them in ascending or descending order. Smart Manager also gives you persistent state management.Sign-up FeeSimple SearchSimply enter the keyword you wish to filter records in the “Simple Search†field at the top of the grid (%s). If you need to have a more specific search result, then you can switch to “%s“ and then search.Site-wide defaultSkip & DeactivateSmart Manager For WooCommerce – Stock Management, Bulk Edit & more...Smart Manager has successfully completedSmart Manager is a unique, revolutionary tool that gives you the power to boost your productivity by 10x in managing your WooCommerce store by using a familiar, single page, spreadsheet like interface. Smart Manager is actively developed. If you can't find your favorite feature (or have a suggestion) %s. We'd love to hear from you.Smart Manager is based on WooCommerce and WPeCommerce and the same e-commerce plugins sets the price/sales price of the variation parents automatically based on the price/sales price of its variations.Smart Manager is empty?Smart Manager search functionality not workingSmart Manager will allow you to manage custom field of any other plugin.StatusStoreApps PluginsSubmit & DeactivateSubmit a reason to deactivateSubmit your querySubscription PeriodsSubscription PriceSubscription Trial PeriodSupportSupported Post TypesTake a moment to let us know why you are deactivatingTaxTaxableThank you for installing Smart Manager %s!The plugin is great, but I need specific feature that you don't supportThe plugin is not working / not compatible with another plugin.The starting block onlyTo show / hide columns in the Smart Manager, %s.TotalUnit Price UnitsUnlimitedUpdatedUpdating variation parent price/sales price not working?Upload ImageUpto three records without savingUsage Limit Per CouponValidity SuffixValueVariation Category group-of rules: ExcludeVariation Group of...Variation Maximum QuantityVariation Maximum quantityVariation Minimum QuantityVariation Minimum quantityVariation Order rules: Do not countVariation Order rules: ExcludeView Customer Lifetime Value (LTV)View our other WooCommerce pluginsWP forumWe recommend Smart Manager Pro to everyone who is looking for an extremely multi-functional store manager. The plugin is absolutely worth it. Never again without Smart Manager!What did you wanted to do in short period?What is that plugin name?What really sold me on Smart Manager Pro was Bulk Edit. My assistant does not have to do any complex math now (earlier, I always feared she would make mistakes)! With Smart Manager, she has more free time at hand, so I asked her to set up auto responder emails. The response was phenomenal. Repeat sales were up by 19.5%.What specific feature you need?WordPress Pages, Media, Users, SEO plugins, WooCommerce Subscriptions, Bookings, Memberships, Product Add-ons, Brands…allWordPress Posts, WooCommerce Products, Product Variations, Orders, CouponsYesYes - DeactivateYoast Focus KeyphraseYoast Meta DescriptionYoast Meta KeywordsYoast Readability ScoreYoast SEO ScoreYoast SEO TitleYou can change / update multiple fields of the entire store OR for selected items by selecting multiple records and then click on Bulk Edit. %s.You can either spend hours of work in store management or use %s to accomplish the same within minutes.You can export all the records OR filtered records (%s) by simply clicking on the Export CSV button at the bottom right of the grid.You can quickly update your Products, Orders, Coupons and Posts from Smart Manager itself. This facilitates editing of multiple rows at a time instead of editing and saving each row separately, %s.You can simply select records you want to delete (check the header box if you want to delete all records) and click on the “Delete†icon. All the selected records will be deleted. You can even delete records by applying search filters. %s.You cannot import using Smart Manager. Use import functionality of WooCommerce.Zero Rateany custom post type in WordPressavailable by defaultclick herecompleted Successfullycontact uscustom post types and their custom fields.forin the background. You will be notified onis available.latest versionnot-available by defaultplease leave us arating. A huge thank you from StoreApps in advance!request is runningsee howusing Simple Search†or Advanced Searchwhen it is completed.you will have to wait for the current background process to finish.â° Limited time offerProject-Id-Version: Smart Manager For WooCommerce – Stock Management, Bulk Edit & more... 5.37.0 Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/smart-manager-for-wp-e-commerce POT-Creation-Date: 2022-03-04 09:38+0000 PO-Revision-Date: 2022-03-17 04:14+0000 Last-Translator: Language-Team: Italian Language: it_IT MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n != 1); X-Generator: Loco https://localise.biz/ Funzionalità più potenti con Smart Manager Pro!%1$s: il processo %2$s è stato interrotto. Consulta la bacheca di Smart Manager per verificarne lo stato.%s per controllare le funzionalità di Smart Manager Pro e richiedere lo sconto.1 sito (annuale)1 sito (a vita)Gestione del negozio 20 o 30 volte più rapida25% di sconto5 siti (annuale)5 siti (a vita) 🔥 Vai a ProVersione Pro installata. Il numero 1 e un potente strumento per gestire le scorte, l'inventario da un unico posto. Super veloce e super facile.Manca un file Smart Manager richiesto. Impossibile continuare. Un intero pomeriggio di lavoro in pochi secondiAzioneAggiungi o elimina recordDescrizione aggiuntivaIndirizzo per cercareBuffering adiacente?Ricerca avanzataRicerca avanzata utilizzando il filtro "AND"Ricerca avanzata utilizzando il filtro "OR"TuttoTutti i blocchi sono prenotatiTutte le date sono...PermettiPermetti combinazioneSpedizione gratuita permessaPermetti spedizione gratuitaConsenti ai motori di ricerca di mostrare questo %1$s nei risultati di ricerca?Consenti, ma avvisa il clienteEmails permesseEmails permesseRuoli utente permessiUn aggiornamento per Smart Manager ProOltre ai tipi di post WooCommerce come Prodotti, Ordini, Buoni, ora puoi gestire %s. Che si tratti di post, pagine, media, utenti di WordPress, ecc. ora puoi gestire tutto utilizzando Smart Manager.Sei sicuro di voler interrompere il processo %s? Clicca su OK per interrompere.AttributiAttributi: personalizzatoGenera coupon automaticamenteGli aggiornamenti automatici non sono disponibili per questo plugin.Assegnato automaticamenteTorna a Smart ManagerDi seguito gli elenchi degli aggiornamenti effettuati:Il più vendutoIl più grande risparmio di tempoFatturazioneIndirizzo di fatturazionePeriodo di fatturazioneProdotto prenotatoDurata della prenotazione (tipo)Durata della prenotazione (unità)La prenotazione può essere cancellata fino alLa prenotazione può essere cancellata fino (unità)Durata prenotazioneModifica in bloccoModifica collettiva - %1s (solo in %2s)Modifica in blocco / Aggiornamento in batchAcquista adessoAcquista Smart Manager ProCalcola automaticamente i prezzi unitariCalendario sempre visibileModalità di visualizzazione del calendarioPosso importare utilizzando Smart Manager?Può essere annullato?Visibilità del catalogoRegole categoria gruppo-di: escluseControllare le regole contro...Clicca quiClicca per copiareClicca per aggiornare.Colonne (mostra / nascondi / ordina)In arrivoLogo compagnia:Opzioni di configurazioneCongratulazioni! Hai appena sbloccato %s su Smart Manager ProCosto del beneConta le persone come prenotazioniCodice couponIl coupon è visibile in tutto il negozioPrefisso del titolo del couponSuffisso del titolo del couponValidità couponData di scadenza del couponOra di scadenza del couponLink coupon condivisibileCrea insiemi di colonne / Viste personalizzateBlocchi definiti dal cliente diNota fornita dal clienteCliente selezionatoDataGiorno(i)PredefinitoElimina definitivamente è disabilitato. Si prega di contattare l'amministratore del negozio per abilitare lo stesso.Elimina recordsDescrizioneDisabilita la restrizione emailVisualizza il calendario al clicVisualizza messaggioNon permettereDocumentazioneDocs e supportoDuplica recordsDuplica tutti i record con un solo clicDuplica record singoli / multipliDuplicatoEmail/ChiamaEmail già esistente. Si prega di inserirne un'altra.L'email non può essere vuotaID emailMessaggio email?Abilita il selettore dell'intervallo del calendario?Abilita quantità minima e massimaAbilita i tipi di personaErroreErrore:Tutto in Lite +Escludi attributiEscludi categorieEscludi prodottiEscludi articoli in venditaScade dopoScadeEsporta CSVEsporta CSV (solo in %s)Esporta tutti / filtrati i record come CSVURL esternoDomande frequenti / Problemi comuniIn primo pianoImmagine in evidenza aggiornata correttamenteCaratteristicheCampoFiltra / Cerca recordsBlocchi fissi diSegui i passaggi elencati qui: %sSolo per nuovi utenti?GratuitoProva gratuitaInizia con Smart ManagerFelice di averti a bordo. Ci auguriamo che Smart Manager ti faccia raggiungere successo desiderato ðŸ†ID gruppoGruppo di...Ha personeHa risorseEhi %1s, hai appena sbloccato %2s su Smart Manager Pro!Ehilà!NascosstoOra(e)Come posso aggiornare una versione Lite a una versione Pro?Come aggiungere colonne alla bacheca di Smart Manager?Come gestire qualsiasi campo personalizzato di qualsiasi plugin personalizzato utilizzando Smart Manager?Non riesco a trovare un modo per fare X...Ho trovato un altro plugin per i miei interessiAvevo bisogno del plugin solo per un breve periodoPagherei volentieri cinque volte per questo prodotto!Ho oltre 200 prodotti e temevo di gestirli uno per uno. Il plugin Smart Manager Pro mi consente di farlo molto più velocemente. Probabilmente 20 o 30 volte più veloce. È uno strumento assolutamente prezioso.Se ti piaceImportaImportanteDisponibileNel frattempo, puoi utilizzare Smart Manager. Ma prima di usare azioni come IndiceSolo uso individualeModifica in lineaModifica in lineaÈ il prezzo di scelta del prodottoÈ una disattivazione temporanea. Sto solo eseguendo il debug di un problema.ChiaveTi prego di condividere ciò che non ti ha funzionato / in conflitto con quale plugin in modo che possiamo risolverlo...Conosci Smart ManagerEtichettaAssicurati di utilizzare %s di Smart Manager. Se il problema persiste, disattiva temporaneamente tutti i plugin tranne WooCommerce/WPeCommerce e Smart Manager. Ricontrolla il problema, se il problema persiste, contattaci. Se il problema scompare, riattiva gli altri plugin uno per uno e ricontrolla i campi per scoprire quale plugin è in conflitto.Gestisci tassonomie personalizzateGestisci i ruoli utente di WordPressGestisci l'intero negozio da un'unica schermataRisparmio di tempo enorme e aumento della produttività di 10 volte. La scelta è tua!Quantità maxNumero massimo di prenotazioni per bloccoSconto massimoMassimo personeQuantità massimaBlocco massimo prenotabileBlocco massimo prenotabile (unità)Durata massimaQuantità massimaMembro daMeta robots avanzatiQuantità minMinimo personeRegole min/maxQuantità minimaBlocco minimo prenotabileBlocco minimo prenotabile (unità)Durata minimaQuantità minimaMinuto(i)Mese(i)Moltiplica tutti i costi per il conteggio delle personeNomeNon scade maiSoprannomeNessun archivioNon seguireNessun indice di immagineNessun indiceNessun frammentoNessuna classe di spedizioneNessunoIn arretratoSconto ordineNote ordineRegole dell'ordine: non contanoRegole dell'ordine: escluseAltroEsauritoMetodi di pagamentoSi prega di citare...Seleziona un'opzionePrezzoPrezziarioImpostazioni della stampa ordineStampa fatture PDFStampa i documenti di trasporto per gli ordini WooCommerce in bloccoPrivilegi per Smart Manager per diversi ruoli di sistemaProdottoAttributi prodottoUnità prodottoCategorie prodottoProdottiProgressoQ.tàQuantitàDomande? Hai bisogno di aiuto?Feedback rapido per il plugin Smart ManagerClassifica matematica punteggio SEORecords aggiornatiRata ridottaPrezzo unitario normaleTi chiedo gentilmente di disattivare e attivare il plugin Smart Manager una volta e quindi di ricontrollare con la funzionalità di ricerca.Richiede un periodo di buffer diRichiede conferma?Le risorse sono...Limitare i giorni di inizio e fine?Meta robotsCODPrezzo unitario di venditaSolo risultati di ricercaGuarda comeImposta su, Aggiungi, Anteponi, Aumenta/Diminuisci di %, Aumenta/Diminuisci per numero, Imposta data e ora a, Imposta data a, Imposta ora a, Carica immagini e molto altro...ImpostazioniSpedizioneIndirizzo di spedizioneMetodi di spedizioniSolo spedizioneNegozio e risultati di ricercaSolo negozioI motori di ricerca dovrebbero seguire i link su questo %1$s?Mostra/Nascondi e ordina le colonne di datiMostra/nascondi più colonne di dati dei dati del tuo negozio WooCommerce secondo le tue esigenze. Ordinali in ordine crescente o decrescente. Smart Manager ti offre anche una gestione permanente dello stato.Quota di iscrizioneRicerca sempliceNel campo "Ricerca semplice", nella parte superiore della griglia (%s), inserisci semplicemente la parola chiave per filtrare i record. Se hai bisogno di un risultato di ricerca più specifico, puoi passare a "%s" e quindi cercare.Impostazione predefinita a livello di sitoSalta e disattivaSmart Manager per WooCommerce – Gestione magazzino, Editor in blocco e altro...Smart Manager è stato completato con successoSmart Manager è uno strumento unico e rivoluzionario che ti dà il potere di aumentare la tua produttività di 10 volte nella gestione del tuo negozio WooCommerce utilizzando un foglio di calcolo familiare, a pagina singola come interfaccia. Smart Manager è attivamente sviluppato. Se non riesci a trovare la tua funzione preferita (o hai un suggerimento) %s. Ci piacerebbe sentirti.Smart Manager si basa su WooCommerce e WPeCommerce e gli stessi plugin di e-commerce impostano automaticamente il prezzo/prezzo di vendita delle varianti padre in base al prezzo/prezzo di vendita delle sue variazioni.Smart Manager è vuoto?La funzionalità di ricerca di Smart Manager non funzionaSmart Manager ti consentirà di gestire il campo personalizzato di qualsiasi altro plugin.StatoPlugins StoreAppsInvia e disattivaInvia una ragione per disattivareInvia la tua domandaPeriodi di abbonamentoPrezzo abbonamentoPeriodo di prova dell'abbonamentoSupportoTipi di post supportatiDedica un momento a farci sapere perché stai disattivandoImpostaImponibileGrazie per aver installato Smart Manager %s!Il plugin è fantastico, ma ho bisogno di funzionalità specifiche che tu non supportiIl plugin non sta funzionando / non compatibile con altro plugin.Solo il blocco di partenzaPer mostrare/nascondere le colonne in Smart Manager, %s.TotaleUnità di prezzo unitarioIllimitatoAggiornatoL'aggiornamento del prezzo di vendita/prezzo principale della variazione non funziona?Carica immagineFino a tre record senza salvareLimite d'uso del couponSuffisso validitàValoreRegole variazione categoria gruppo-di: escluseGruppo variazione di...Quantità massima di variazioneQuantità di variazione massimaQuantità minima di variazioneQuantità di variazione minimaRegole variazione dell'ordine: non contanoRegole variazione dell'ordine: escluseVisualizza il valore a vita del cliente (LTV)Visualizza gli altri nostri plugin per WooCommerceForum WPConsigliamo Smart Manager Pro a tutti coloro che cercano uno store manager estremamente multifunzionale. Ne vale assolutamente la pena. Mai più senza Smart Manager!Cosa volevi fare in breve tempo?Qual è il nome di quel plugin?Quello che mi ha davvero stupito di Smart Manager Pro è stata la modifica collettiva. La mia assistente non deve fare calcoli complessi ora (prima, ho sempre temuto che avrebbe commesso degli errori)! Con Smart Manager, ha più tempo libero a disposizione, quindi le ho chiesto di impostare email di risposta automatica. La risposta è stata fenomenale. Le vendite ripetute sono aumentate del 19,5%.Di quale caratteristica specifica hai bisogno?Pagine WordPress, media, utenti, plugin SEO, abbonamenti WooCommerce, prenotazioni, abbonamenti, componenti aggiuntivi di prodotti, marchi... tuttoPost di WordPress, prodotti WooCommerce, varianti di prodotto, ordini, couponSiSi - DisattivaFocus frase chiave YoastDescrizione meta YoastParole chiave meta YoastPunteggio di leggibilità YoastPunteggio SEO YoastTitolo SEO YoastPuoi modificare/aggiornare più campi dell'intero negozio OPPURE per gli articoli selezionati selezionando più record e quindi facendo clic su Modifica in blocco. %s.Puoi dedicare ore di lavoro alla gestione del negozio o utilizzare %s per ottenere lo stesso risultato in pochi minuti.Puoi esportare tutti i record OPPURE i record filtrati (%s) semplicemente facendo clic sul pulsante Esporta CSV in basso a destra della griglia.Puoi aggiornare rapidamente i tuoi prodotti, ordini, coupon e post da Smart Manager stesso. Ciò facilita la modifica di più righe alla volta invece di modificare e salvare ogni riga separatamente, %s.Puoi semplicemente selezionare i record che desideri eliminare (selezionare la casella di intestazione se desideri eliminare tutti i record) e fare clic sull'icona "Elimina". Tutti i record selezionati verranno eliminati. Puoi anche eliminare i record applicando filtri di ricerca. %s.Non è possibile importare utilizzando Smart Manager. Usa la funzionalità di importazione di WooCommerce.Tasso zeroqualsiasi tipo di post personalizzato in WordPressdisponibile per impostazione predefinitaclicca quicompletato con successocontattacitipi di post personalizzati e relativi campi personalizzati.perin background. Sarai avvisatoè disponibile.versione più recentenon disponibile per impostazione predefinitaper favore lasciaci unavalutazione. Un enorme grazie da StoreApps in anticipo!la richiesta è in esecuzioneguarda comeutilizzando la ricerca semplice†o la ricerca avanzataquando è completata.dovrai attendere il completamento del processo in background in corso.â° Offerta a tempo limitatolanguages/smart-manager-for-wp-e-commerce-it_IT.po000064400000231544147600337620016061 0ustar00# Copyright (C) 2021 Smart Manager For WooCommerce – Stock Management, Bulk Edit & more... # This file is distributed under the same license as the Smart Manager For WooCommerce – Stock Management, Bulk Edit & more... package. msgid "" msgstr "" "Project-Id-Version: Smart Manager For WooCommerce – Stock Management, Bulk " "Edit & more... 5.37.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/smart-manager-for-" "wp-e-commerce\n" "POT-Creation-Date: 2022-03-04 09:38+0000\n" "PO-Revision-Date: 2022-03-17 04:14+0000\n" "Last-Translator: \n" "Language-Team: Italian\n" "Language: it_IT\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" "X-Generator: Loco https://localise.biz/" #: classes/class-smart-manager-pricing.php:405 msgid " More powerful features with Smart Manager Pro!" msgstr " Funzionalità più potenti con Smart Manager Pro!" #: classes/class-smart-manager-pricing.php:351 msgid "$112" msgstr "" #: classes/class-smart-manager-pricing.php:363 msgid "$135" msgstr "" #: classes/class-smart-manager-pricing.php:350 msgid "$149" msgstr "" #: classes/class-smart-manager-pricing.php:362 msgid "$179" msgstr "" #: classes/class-smart-manager-pricing.php:374 msgid "$360" msgstr "" #: classes/class-smart-manager-pricing.php:385 msgid "$375" msgstr "" #: classes/class-smart-manager-pricing.php:373 msgid "$479" msgstr "" #: classes/class-smart-manager-pricing.php:384 msgid "$499" msgstr "" #: classes/class-smart-manager-pricing.php:351 msgid "$75" msgstr "" #: classes/class-smart-manager-pricing.php:363 msgid "$90" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:165 msgid "% Completed" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:143 #, php-format msgid "% completed" msgstr "" #. 1. Error title 2. The bulk process #: pro/classes/class-smart-manager-pro-background-updater.php:307 #, php-format msgid "" "%1$s: The %2$s process has stopped. Please review the Smart Manager " "dashboard to check the status." msgstr "" "%1$s: il processo %2$s è stato interrotto. Consulta la bacheca di Smart " "Manager per verificarne lo stato." #: class-smart-manager.php:1460 #, php-format msgid "%1s" msgstr "" #: classes/class-smart-manager-admin-welcome.php:429 #, php-format msgid "%s" msgstr "" #: class-smart-manager.php:862 #, php-format msgid "%s to check Smart Manager Pro features and claim your discount." msgstr "" "%s per controllare le funzionalità di Smart Manager Pro e richiedere lo " "sconto." #: pro/classes/class-smart-manager-pro-background-updater.php:323 msgid "--:--:--" msgstr "" #: classes/class-smart-manager-pricing.php:348 msgid "1 site (Annual)" msgstr "1 sito (annuale)" #: classes/class-smart-manager-pricing.php:371 msgid "1 site (Lifetime)" msgstr "1 sito (a vita)" #: classes/class-smart-manager-pricing.php:667 msgid "20 or 30 times quicker store management" msgstr "Gestione del negozio 20 o 30 volte più rapida" #: class-smart-manager.php:861 classes/class-smart-manager-pricing.php:340 msgid "25% Off" msgstr "25% di sconto" #: classes/class-smart-manager-pricing.php:360 msgid "5 sites (Annual)" msgstr "5 siti (annuale)" #: classes/class-smart-manager-pricing.php:382 msgid "5 sites (Lifetime)" msgstr "5 siti (a vita)" #: class-smart-manager.php:665 msgid " 🔥 Go Pro" msgstr " 🔥 Vai a Pro" #. Description of the plugin msgid "" "Pro Version Installed. The #1 and a powerful tool to manage " "stock, inventory from a single place. Super quick and super easy." msgstr "" "Versione Pro installata. Il numero 1 e un potente strumento " "per gestire le scorte, l'inventario da un unico posto. Super veloce e super " "facile." #: class-smart-manager.php:1570 msgid "A required Smart Manager file is missing. Can't continue. " msgstr "Manca un file Smart Manager richiesto. Impossibile continuare. " #: classes/class-smart-manager-pricing.php:659 msgid "A whole afternoon’s work in seconds" msgstr "Un intero pomeriggio di lavoro in pochi secondi" #: classes/class-smart-manager-pricing.php:662 msgid "Acrom" msgstr "" #: pro/templates/email.php:43 msgid "Action" msgstr "Azione" #: pro/assets/js/smart-manager-product.js:154 pro/assets/js/smart-manager.js:37 msgctxt "action operator" msgid "add to" msgstr "" #: pro/assets/js/smart-manager.js:25 pro/assets/js/smart-manager.js:47 msgctxt "action operator" msgid "copy from" msgstr "" #: pro/assets/js/smart-manager-product.js:155 pro/assets/js/smart-manager.js:37 msgctxt "action operator" msgid "remove from" msgstr "" #: pro/assets/js/smart-manager.js:39 msgctxt "action operator" msgid "search & replace" msgstr "" #: pro/assets/js/smart-manager-product.js:153 pro/assets/js/smart-manager.js:46 #: pro/assets/js/smart-manager.js:891 pro/assets/js/smart-manager.js:1027 msgctxt "action operator" msgid "set to" msgstr "" #: assets/js/smart-manager-product.js:229 msgctxt "add attribute button" msgid "Add" msgstr "" #: classes/class-smart-manager-pricing.php:451 msgid "Add or Delete records" msgstr "Aggiungi o elimina record" #: classes/class-smart-manager-product.php:958 msgid "Additional Description" msgstr "Descrizione aggiuntiva" #: pro/assets/js/smart-manager.js:28 msgctxt "additional operator" msgid "decrease by" msgstr "" #: pro/assets/js/smart-manager.js:28 msgctxt "additional operator" msgid "increase by" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:326 msgid "Address to look in" msgstr "Indirizzo per cercare" #: pro/classes/class-smart-manager-pro-product.php:125 msgid "Adjacent Buffering?" msgstr "Buffering adiacente?" #: classes/class-smart-manager-admin-welcome.php:295 msgid "Advanced Search" msgstr "Ricerca avanzata" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:42 #, javascript-format msgctxt "advanced search conditions" msgid "%d condition%s" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:42 msgctxt "advanced search conditions" msgid "s" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:155 msgctxt "advanced search content" msgid "condition groups pass" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:148 msgctxt "advanced search content" msgid "When" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:153 msgctxt "advanced search option" msgid "all" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:152 msgctxt "advanced search option" msgid "at least one" msgstr "" #: classes/class-smart-manager-pricing.php:484 msgid "Advanced Search using “AND†filter" msgstr "Ricerca avanzata utilizzando il filtro \"AND\"" #: classes/class-smart-manager-pricing.php:495 msgid "Advanced Search using “OR†filter" msgstr "Ricerca avanzata utilizzando il filtro \"OR\"" #: pro/classes/class-smart-manager-pro-background-updater.php:294 msgid "All" msgstr "Tutto" #: pro/classes/class-smart-manager-pro-product.php:237 msgid "All blocks being booked" msgstr "Tutti i blocchi sono prenotati" #: pro/classes/class-smart-manager-pro-product.php:227 msgid "All dates are..." msgstr "Tutte le date sono..." #: assets/js/admin.js:1 src/views/BulkEditDialog.js:50 #: pro/assets/js/smart-manager.js:868 msgid "All Items In Search Results" msgstr "" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:50 #: pro/assets/js/smart-manager.js:868 msgid "All Items In Store" msgstr "" #: classes/class-smart-manager-product.php:912 msgid "Allow" msgstr "Permetti" #: pro/classes/class-smart-manager-pro-product.php:136 msgid "Allow Combination" msgstr "Permetti combinazione" #: classes/class-smart-manager-shop-coupon.php:123 msgid "Allow Free Shipping" msgstr "Spedizione gratuita permessa" #: pro/classes/class-smart-manager-pro-shop-coupon.php:252 msgid "Allow free shipping" msgstr "Permetti spedizione gratuita" #: pro/classes/class-smart-manager-pro-base.php:132 #, php-format msgid "Allow search engines to show this %1$s in search results?" msgstr "" "Consenti ai motori di ricerca di mostrare questo %1$s nei risultati di " "ricerca?" #: classes/class-smart-manager-product.php:911 msgid "Allow, but notify customer" msgstr "Consenti, ma avvisa il cliente" #: classes/class-smart-manager-shop-coupon.php:119 msgid "Allowed Emails" msgstr "Emails permesse" #: pro/classes/class-smart-manager-pro-shop-coupon.php:291 msgid "Allowed emails" msgstr "Emails permesse" #: pro/classes/class-smart-manager-pro-shop-coupon.php:213 msgid "Allowed user roles" msgstr "Ruoli utente permessi" #: class-smart-manager.php:1468 msgid "An upgrade for Smart Manager Pro" msgstr "Un aggiornamento per Smart Manager Pro" #: classes/class-smart-manager-admin-welcome.php:281 msgid "any custom post type in WordPress" msgstr "qualsiasi tipo di post personalizzato in WordPress" #: classes/class-smart-manager-admin-welcome.php:281 #, php-format msgid "" "Apart from WooCommerce post types like Products, Orders, Coupons, now you " "can manage %s. Be it Posts, Pages, Media, WordPress Users, etc. you can now " "manage everything using Smart Manager." msgstr "" "Oltre ai tipi di post WooCommerce come Prodotti, Ordini, Buoni, ora puoi " "gestire %s. Che si tratti di post, pagine, media, utenti di WordPress, ecc. " "ora puoi gestire tutto utilizzando Smart Manager." #. 1. The bulk process #: pro/classes/class-smart-manager-pro-background-updater.php:348 #, php-format msgid "Are you sure you want to stop the %s process? Click OK to stop." msgstr "" "Sei sicuro di voler interrompere il processo %s? Clicca su OK per " "interrompere." #: assets/js/smart-manager-product.js:302 msgctxt "attribute button" msgid "Select all" msgstr "" #: assets/js/smart-manager-product.js:303 msgctxt "attribute button" msgid "Select none" msgstr "" #: assets/js/smart-manager-product.js:121 msgctxt "attribute list" msgid "Custom product attribute" msgstr "" #: pro/assets/js/smart-manager-product.js:40 msgctxt "attribute operator" msgid "Add Attribute" msgstr "" #: pro/assets/js/smart-manager-product.js:49 msgctxt "attribute operator" msgid "Remove Attribute" msgstr "" #: assets/js/smart-manager-product.js:283 msgctxt "attribute variation" msgid "Used for variations" msgstr "" #: assets/js/smart-manager-product.js:280 msgctxt "attribute visibility" msgid "Visible on the product page" msgstr "" #: classes/class-smart-manager-product.php:1068 msgid "Attributes" msgstr "Attributi" #: classes/class-smart-manager-product.php:1101 msgid "Attributes: custom" msgstr "Attributi: personalizzato" #: pro/classes/class-smart-manager-pro-shop-coupon.php:253 msgid "Auto Generate Coupon" msgstr "Genera coupon automaticamente" #: class-smart-manager.php:1649 msgid "Auto-updates are not available for this plugin." msgstr "Gli aggiornamenti automatici non sono disponibili per questo plugin." #: pro/classes/class-smart-manager-pro-product.php:222 msgid "Automatically assigned" msgstr "Assegnato automaticamente" #: pro/classes/class-smart-manager-pro-product.php:229 msgid "available by default" msgstr "disponibile per impostazione predefinita" #: pro/classes/class-smart-manager-pro-access-privilege.php:264 msgid "Back to Smart Manager" msgstr "Torna a Smart Manager" #: pro/assets/js/smart-manager-product.js:216 msgctxt "batch update option" msgid "All" msgstr "" #: pro/templates/email.php:39 msgid "Below are the lists of updates done:" msgstr "Di seguito gli elenchi degli aggiornamenti effettuati:" #: classes/class-smart-manager-pricing.php:359 msgid "Best Seller" msgstr "Il più venduto" #: classes/class-smart-manager-admin-welcome.php:333 msgid "Biggest Time Saver" msgstr "Il più grande risparmio di tempo" #: pro/classes/class-smart-manager-pro-shop-coupon.php:327 msgid "Billing" msgstr "Fatturazione" #: pro/templates/order-invoice.php:144 msgid "Billing Address" msgstr "Indirizzo di fatturazione" #: pro/classes/class-smart-manager-pro-product.php:252 msgid "Billing Period" msgstr "Periodo di fatturazione" #: pro/classes/class-smart-manager-pro-wc-booking.php:171 msgid "Booked Product" msgstr "Prodotto prenotato" #: pro/classes/class-smart-manager-pro-product.php:80 msgid "Booking can be cancelled until" msgstr "La prenotazione può essere cancellata fino al" #: pro/classes/class-smart-manager-pro-product.php:196 msgid "Booking can be cancelled until (Unit)" msgstr "La prenotazione può essere cancellata fino (unità)" #: pro/classes/class-smart-manager-pro-product.php:77 msgid "Booking duration" msgstr "Durata prenotazione" #: pro/classes/class-smart-manager-pro-product.php:183 msgid "Booking Duration (Type)" msgstr "Durata della prenotazione (tipo)" #: pro/classes/class-smart-manager-pro-product.php:191 msgid "Booking Duration (Unit)" msgstr "Durata della prenotazione (unità)" #: assets/js/smart-manager.js:987 #, javascript-format msgctxt "bottom bar" msgid "%d %s loaded" msgstr "" #: assets/js/smart-manager.js:1005 #, javascript-format msgctxt "bottom bar" msgid "%d of %d %s loaded" msgstr "" #: assets/js/smart-manager.js:980 assets/js/smart-manager.js:1005 #, javascript-format msgctxt "bottom bar" msgid "No %s Found" msgstr "" #: classes/class-smart-manager-pricing.php:670 msgid "Brian Batcher" msgstr "" #: class-smart-manager.php:1149 #: classes/class-smart-manager-admin-welcome.php:331 msgid "Bulk Edit" msgstr "Modifica in blocco" #: classes/class-smart-manager-admin-welcome.php:333 #, php-format msgid "Bulk Edit - %1s (only in %2s)" msgstr "Modifica collettiva - %1s (solo in %2s)" #: classes/class-smart-manager-pricing.php:506 msgid "Bulk Edit / Batch Update" msgstr "Modifica in blocco / Aggiornamento in batch" #: assets/js/smart-manager.js:1705 msgctxt "button" msgid "Add" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:50 msgctxt "button" msgid "Add a condition" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:66 msgctxt "button" msgid "Add another group" msgstr "" #: assets/js/smart-manager.js:1713 msgctxt "button" msgid "Add images to product gallery" msgstr "" #: assets/js/smart-manager.js:396 msgctxt "button" msgid "Add Row" msgstr "" #: assets/js/smart-manager.js:1714 msgctxt "button" msgid "Add to gallery" msgstr "" #: assets/js/smart-manager.js:382 msgctxt "button" msgid "Bulk Edit" msgstr "" #: assets/js/smart-manager.js:2436 msgctxt "button" msgid "Cancel" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:118 #: src/views/BulkEditDialog.js:112 msgctxt "button" msgid "Clear" msgstr "" #: assets/js/smart-manager.js:438 msgctxt "button" msgid "Columns" msgstr "" #: assets/js/smart-manager.js:2435 msgctxt "button" msgid "Create" msgstr "" #: assets/js/smart-manager.js:412 msgctxt "button" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:402 msgctxt "button" msgid "Duplicate" msgstr "" #: assets/js/smart-manager.js:424 msgctxt "button" msgid "Export CSV" msgstr "" #: assets/js/smart-manager.js:2579 msgctxt "button" msgid "Get Pro at 25% OFF" msgstr "" #: assets/js/smart-manager.js:175 #, javascript-format msgctxt "button" msgid "Load More %s" msgstr "" #: assets/js/smart-manager.js:3151 msgctxt "button" msgid "No" msgstr "" #: assets/js/smart-manager-product.js:243 assets/js/smart-manager.js:1092 msgctxt "button" msgid "OK" msgstr "" #: assets/js/smart-manager.js:430 msgctxt "button" msgid "Print Invoice" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:74 msgctxt "button" msgid "Remove this group" msgstr "" #: pro/assets/js/smart-manager.js:968 msgctxt "button" msgid "Reset" msgstr "" #: assets/js/smart-manager.js:390 msgctxt "button" msgid "Save" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:99 msgctxt "button" msgid "Search" msgstr "" #: assets/js/smart-manager-product.js:199 msgctxt "button" msgid "Select all" msgstr "" #: assets/js/smart-manager-product.js:200 msgctxt "button" msgid "Select none" msgstr "" #: assets/js/admin.js:1 assets/js/smart-manager.js:2744 #: src/views/BulkEditDialog.js:98 pro/assets/js/smart-manager.js:963 msgctxt "button" msgid "Update" msgstr "" #: assets/js/smart-manager.js:3134 msgctxt "button" msgid "Yes" msgstr "" #: classes/class-smart-manager-pricing.php:355 #: classes/class-smart-manager-pricing.php:367 #: classes/class-smart-manager-pricing.php:378 #: classes/class-smart-manager-pricing.php:389 msgid "Buy Now" msgstr "Acquista adesso" #: classes/class-smart-manager-pricing.php:648 msgid "Buy Smart Manager Pro" msgstr "Acquista Smart Manager Pro" #: pro/classes/class-smart-manager-pro-product.php:144 msgid "Calculate unit prices automatically" msgstr "Calcola automaticamente i prezzi unitari" #: pro/classes/class-smart-manager-pro-product.php:214 msgid "Calendar always visible" msgstr "Calendario sempre visibile" #: pro/classes/class-smart-manager-pro-product.php:211 msgid "Calendar display mode" msgstr "Modalità di visualizzazione del calendario" #: pro/classes/class-smart-manager-pro-product.php:118 msgid "Can be cancelled?" msgstr "Può essere annullato?" #: classes/class-smart-manager-admin-welcome.php:405 msgid "Can I import using Smart Manager?" msgstr "Posso importare utilizzando Smart Manager?" #: classes/class-smart-manager-product.php:1147 msgid "Catalog Visibility" msgstr "Visibilità del catalogo" #: pro/classes/class-smart-manager-pro-product.php:139 msgid "Category group-of rules: Exclude" msgstr "Regole categoria gruppo-di: escluse" #: pro/classes/class-smart-manager-pro-product.php:235 msgid "Check rules against..." msgstr "Controllare le regole contro..." #: assets/js/smart-manager-product.js:285 msgctxt "checkbox list" msgid "Position:" msgstr "" #: class-smart-manager.php:862 msgid "Click here" msgstr "Clicca qui" #: classes/class-smart-manager-admin-welcome.php:402 msgid "click here" msgstr "clicca qui" #: pro/classes/class-smart-manager-pro-shop-coupon.php:423 msgid "Click to copy" msgstr "Clicca per copiare" #: class-smart-manager.php:1468 msgid "Click to upgrade." msgstr "Clicca per aggiornare." #: classes/class-smart-manager-pricing.php:462 msgid "Columns (Show / Hide / Sort)" msgstr "Colonne (mostra / nascondi / ordina)" #: classes/class-smart-manager-pricing.php:612 #: classes/class-smart-manager-pricing.php:623 msgid "Coming soon" msgstr "In arrivo" #: pro/classes/class-smart-manager-pro-access-privilege.php:335 msgid "Company logo:" msgstr "Logo compagnia:" #: pro/classes/class-smart-manager-pro-background-updater.php:337 msgid "completed Successfully" msgstr "completato con successo" #: pro/classes/class-smart-manager-pro-acf-field-group.php:43 #: pro/classes/class-smart-manager-pro-acf-field.php:43 msgid "Config Options" msgstr "Opzioni di configurazione" #: classes/class-smart-manager-pricing.php:340 #, php-format msgid "Congratulations! You just unlocked %s on Smart Manager Pro" msgstr "Congratulazioni! Hai appena sbloccato %s su Smart Manager Pro" #: classes/class-smart-manager-admin-welcome.php:414 msgid "contact us" msgstr "contattaci" #: classes/class-smart-manager-shop-order.php:440 #: pro/classes/class-smart-manager-pro-product.php:107 msgid "Cost of Good" msgstr "Costo del bene" #: pro/classes/class-smart-manager-pro-product.php:122 msgid "Count persons as bookings" msgstr "Conta le persone come prenotazioni" #: classes/class-smart-manager-shop-coupon.php:115 msgid "Coupon Code" msgstr "Codice coupon" #: pro/classes/class-smart-manager-pro-shop-coupon.php:333 msgid "Coupon expiry date" msgstr "Data di scadenza del coupon" #: pro/classes/class-smart-manager-pro-shop-coupon.php:338 msgid "Coupon expiry time" msgstr "Ora di scadenza del coupon" #: pro/classes/class-smart-manager-pro-shop-coupon.php:255 msgid "Coupon Is Visible Storewide" msgstr "Il coupon è visibile in tutto il negozio" #: pro/classes/class-smart-manager-pro-shop-coupon.php:354 msgid "Coupon shareable link" msgstr "Link coupon condivisibile" #: pro/classes/class-smart-manager-pro-shop-coupon.php:242 msgid "Coupon Title Prefix" msgstr "Prefisso del titolo del coupon" #: pro/classes/class-smart-manager-pro-shop-coupon.php:243 msgid "Coupon Title Suffix" msgstr "Suffisso del titolo del coupon" #: pro/classes/class-smart-manager-pro-shop-coupon.php:240 msgid "Coupon Validity" msgstr "Validità coupon" #: classes/class-smart-manager-pricing.php:551 msgid "Create Column Sets / Custom Views" msgstr "Crea insiemi di colonne / Viste personalizzate" #: classes/class-smart-manager-pricing.php:433 msgid "custom post types and their custom fields." msgstr "tipi di post personalizzati e relativi campi personalizzati." #: assets/js/smart-manager.js:364 msgctxt "custom view button" msgid "Create" msgstr "" #: assets/js/smart-manager.js:366 msgctxt "custom view button" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:365 msgctxt "custom view button" msgid "Update" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:186 msgid "Customer defined blocks of" msgstr "Blocchi definiti dal cliente di" #: classes/class-smart-manager-shop-order.php:164 msgid "Customer provided note" msgstr "Nota fornita dal cliente" #: pro/classes/class-smart-manager-pro-product.php:221 msgid "Customer selected" msgstr "Cliente selezionato" #: assets/js/smart-manager.js:315 msgctxt "dashboard groups" msgid "All post types" msgstr "" #: assets/js/smart-manager.js:326 msgctxt "dashboard groups" msgid "All saved views" msgstr "" #: assets/js/smart-manager.js:299 msgctxt "dashboard groups" msgid "Common post types" msgstr "" #: assets/js/smart-manager.js:310 msgctxt "dashboard groups" msgid "Recently used views" msgstr "" #: classes/class-smart-manager-shop-order.php:160 #: pro/classes/class-smart-manager-pro-shop-subscription.php:175 msgid "Date" msgstr "Data" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "days" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "months" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "weeks" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "years" msgstr "" #: pro/assets/js/smart-manager.js:34 msgctxt "date operator" msgid "set date to" msgstr "" #: pro/assets/js/smart-manager.js:33 msgctxt "datetime operator" msgid "set date to" msgstr "" #: pro/assets/js/smart-manager.js:33 msgctxt "datetime operator" msgid "set datetime to" msgstr "" #: pro/assets/js/smart-manager.js:33 msgctxt "datetime operator" msgid "set time to" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:149 msgid "Day(s)" msgstr "Giorno(i)" #: pro/classes/class-smart-manager-pro-base.php:133 msgid "Default" msgstr "Predefinito" #: assets/js/smart-manager.js:415 msgctxt "delete button" msgid "Delete Permanently" msgstr "" #: assets/js/smart-manager.js:414 msgctxt "delete button" msgid "Move to Trash" msgstr "" #: class-smart-manager.php:1118 msgid "" "Delete Permanently is disabled. Please contact store administrator for " "enabling the same." msgstr "" "Elimina definitivamente è disabilitato. Si prega di contattare " "l'amministratore del negozio per abilitare lo stesso." #: class-smart-manager.php:1149 #: classes/class-smart-manager-admin-welcome.php:319 msgid "Delete Records" msgstr "Elimina records" #: classes/class-smart-manager-product.php:956 #: classes/class-smart-manager-shop-coupon.php:117 msgid "Description" msgstr "Descrizione" #: assets/js/smart-manager.js:2719 msgctxt "description" msgid "" "Drag & drop the enabled columns to the right side to disable them. Drag & " "drop the disabled columns to the left side to enable them." msgstr "" #: assets/js/smart-manager.js:2721 msgctxt "description" msgid "Drag the columns to the top or bottom to sort them." msgstr "" #: pro/assets/js/smart-manager.js:603 msgctxt "description" msgid "" "Marking this view public will make it available to all users having access " "to the Smart Manager." msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:248 msgid "Disable Email Restriction" msgstr "Disabilita la restrizione email" #: pro/classes/class-smart-manager-pro-product.php:213 msgid "Display calendar on click" msgstr "Visualizza il calendario al clic" #: pro/classes/class-smart-manager-pro-shop-coupon.php:244 msgid "Display message" msgstr "Visualizza messaggio" #: classes/class-smart-manager-product.php:910 msgid "Do Not Allow" msgstr "Non permettere" #: classes/class-smart-manager-admin-welcome.php:254 msgid "Docs" msgstr "Documentazione" #: class-smart-manager.php:672 msgid "Docs & Support" msgstr "Docs e supporto" #: assets/js/smart-manager.js:101 msgctxt "dropdown operator" msgid "is" msgstr "" #: assets/js/smart-manager.js:101 msgctxt "dropdown operator" msgid "is not" msgstr "" #: classes/class-smart-manager-pricing.php:540 msgid "Duplicate all records in a single click" msgstr "Duplica tutti i record con un solo clic" #: assets/js/smart-manager.js:405 msgctxt "duplicate button" msgid "Entire Store" msgstr "" #: assets/js/smart-manager.js:404 msgctxt "duplicate button" msgid "Selected Records" msgstr "" #: class-smart-manager.php:1149 msgid "Duplicate Records" msgstr "Duplica records" #: classes/class-smart-manager-pricing.php:529 msgid "Duplicate single / multiple records" msgstr "Duplica record singoli / multipli" #: pro/templates/email.php:7 msgid "Duplicated" msgstr "Duplicato" #: classes/class-smart-manager-pricing.php:636 msgid "Email / Call" msgstr "Email/Chiama" #: pro/classes/class-smart-manager-pro-user.php:1257 msgid "Email already exists. Please enter another email." msgstr "Email già esistente. Si prega di inserirne un'altra." #: pro/classes/class-smart-manager-pro-user.php:1251 msgid "Email cannot be empty" msgstr "L'email non può essere vuota" #: pro/templates/order-invoice.php:158 msgid "Email id" msgstr "ID email" #: pro/classes/class-smart-manager-pro-shop-coupon.php:251 msgid "Email message?" msgstr "Messaggio email?" #: pro/classes/class-smart-manager-pro-product.php:116 msgid "Enable Calendar Range Picker?" msgstr "Abilita il selettore dell'intervallo del calendario?" #: pro/classes/class-smart-manager-pro-product.php:130 msgid "Enable Min Max Quantity" msgstr "Abilita quantità minima e massima" #: pro/classes/class-smart-manager-pro-product.php:123 msgid "Enable person types" msgstr "Abilita i tipi di persona" #: pro/classes/class-smart-manager-pro-background-updater.php:307 msgid "Error" msgstr "Errore" #: class-smart-manager.php:1585 msgid "Error:" msgstr "Errore:" #: classes/class-smart-manager-pricing.php:431 msgid "Everything in Lite +" msgstr "Tutto in Lite +" #: pro/classes/class-smart-manager-pro-shop-coupon.php:226 msgid "Exclude Attributes" msgstr "Escludi attributi" #: pro/classes/class-smart-manager-pro-shop-coupon.php:211 msgid "Exclude categories" msgstr "Escludi categorie" #: pro/classes/class-smart-manager-pro-shop-coupon.php:231 msgid "Exclude products" msgstr "Escludi prodotti" #: pro/classes/class-smart-manager-pro-shop-coupon.php:249 msgid "Exclude sale items" msgstr "Escludi articoli in vendita" #: pro/classes/class-smart-manager-pro-product.php:257 msgid "Expire After" msgstr "Scade dopo" #: pro/classes/class-smart-manager-pro-wc-user-membership.php:169 #: pro/classes/class-smart-manager-pro-wc-user-membership.php:170 msgid "Expires" msgstr "Scade" #: classes/class-smart-manager-pricing.php:518 msgid "Export all / Filtered records as CSV" msgstr "Esporta tutti / filtrati i record come CSV" #: classes/class-smart-manager-admin-welcome.php:347 msgid "Export CSV" msgstr "Esporta CSV" #: classes/class-smart-manager-admin-welcome.php:349 #, php-format msgid "Export CSV (only in %s)" msgstr "Esporta CSV (solo in %s)" #: classes/class-smart-manager-product.php:972 msgid "External Url" msgstr "URL esterno" #: classes/class-smart-manager-admin-welcome.php:380 msgid "FAQ / Common Problems" msgstr "Domande frequenti / Problemi comuni" #: classes/class-smart-manager-admin-welcome.php:264 msgid "FAQ's" msgstr "" #: classes/class-smart-manager-product.php:1194 msgid "Featured" msgstr "In primo piano" #: classes/class-smart-manager-product.php:2018 #: classes/class-smart-manager-product.php:2021 msgid "Featured Image updated successfully" msgstr "Immagine in evidenza aggiornata correttamente" #: classes/class-smart-manager-pricing.php:410 msgid "Features" msgstr "Caratteristiche" #: pro/templates/email.php:42 msgid "Field" msgstr "Campo" #: classes/class-smart-manager-admin-welcome.php:290 msgid "Filter / Search Records" msgstr "Filtra / Cerca records" #: pro/classes/class-smart-manager-pro-product.php:185 msgid "Fixed blocks of" msgstr "Blocchi fissi di" #: classes/class-smart-manager-admin-welcome.php:419 #, php-format msgid "Follow steps listed here: %s" msgstr "Segui i passaggi elencati qui: %s" #: pro/classes/class-smart-manager-pro-background-updater.php:337 msgid "for" msgstr "per" #: pro/classes/class-smart-manager-pro-shop-coupon.php:256 msgid "For new user only?" msgstr "Solo per nuovi utenti?" #: classes/class-smart-manager-pricing.php:413 msgid "Free" msgstr "Gratuito" #: pro/classes/class-smart-manager-pro-product.php:105 msgid "Free Trial" msgstr "Prova gratuita" #: classes/class-smart-manager-admin-welcome.php:236 #: classes/class-smart-manager-admin-welcome.php:362 msgid "Get started with Smart Manager" msgstr "Inizia con Smart Manager" #: classes/class-smart-manager-admin-welcome.php:232 msgid "" "Glad to have you onboard. We hope Smart Manager adds to your desired success " "ðŸ†" msgstr "" "Felice di averti a bordo. Ci auguriamo che Smart Manager ti faccia " "raggiungere successo desiderato ðŸ†" #: assets/js/admin.js:1 src/views/RuleGroup.js:38 msgctxt "group content" msgid "of the following conditions is true." msgstr "" #: pro/classes/class-smart-manager-pro-acf-field.php:45 msgid "Group Id" msgstr "ID gruppo" #: pro/classes/class-smart-manager-pro-product.php:90 msgid "Group of..." msgstr "Gruppo di..." #: pro/classes/class-smart-manager-pro-product.php:119 msgid "Has persons" msgstr "Ha persone" #: pro/classes/class-smart-manager-pro-product.php:120 msgid "Has resources" msgstr "Ha risorse" #: assets/js/smart-manager.js:2732 msgctxt "heading" msgid "Disabled" msgstr "" #: assets/js/smart-manager.js:2725 msgctxt "heading" msgid "Enabled" msgstr "" #: class-smart-manager.php:861 #, php-format msgid "Hey %1s, you just unlocked %2s on Smart Manager Pro!" msgstr "Ehi %1s, hai appena sbloccato %2s su Smart Manager Pro!" #: pro/templates/email.php:35 msgid "Hi there!" msgstr "Ehilà!" #: classes/class-smart-manager-product.php:736 msgid "Hidden" msgstr "Nascossto" #: pro/classes/class-smart-manager-pro-product.php:150 msgid "Hour(s)" msgstr "Ora(e)" #: classes/class-smart-manager-admin-welcome.php:418 msgid "How do I upgrade a Lite version to a Pro version?" msgstr "Come posso aggiornare una versione Lite a una versione Pro?" #: classes/class-smart-manager-admin-welcome.php:401 msgid "How to add columns to Smart Manager dashboard?" msgstr "Come aggiungere colonne alla bacheca di Smart Manager?" #: classes/class-smart-manager-admin-welcome.php:397 msgid "" "How to manage any custom field of any custom plugin using Smart Manager?" msgstr "" "Come gestire qualsiasi campo personalizzato di qualsiasi plugin " "personalizzato utilizzando Smart Manager?" #. Author URI of the plugin msgid "https://www.storeapps.org/" msgstr "" #. URI of the plugin msgid "https://www.storeapps.org/product/smart-manager/" msgstr "" #: classes/class-smart-manager-admin-welcome.php:413 msgid "I can't find a way to do X..." msgstr "Non riesco a trovare un modo per fare X..." #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:118 msgid "I found another plugin for my needs" msgstr "Ho trovato un altro plugin per i miei interessi" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:106 msgid "I only needed the plugin for a short period" msgstr "Avevo bisogno del plugin solo per un breve periodo" #: classes/class-smart-manager-pricing.php:397 msgid "I would happily pay five times for this product!" msgstr "Pagherei volentieri cinque volte per questo prodotto!" #: classes/class-smart-manager-pricing.php:669 msgid "" "I've got over 200 products and dreaded managing them one by one. Smart " "Manager Pro plugin lets me do this so much quicker. Probably 20 or 30 times " "quicker. It is an absolutely invaluable tool." msgstr "" "Ho oltre 200 prodotti e temevo di gestirli uno per uno. Il plugin Smart " "Manager Pro mi consente di farlo molto più velocemente. Probabilmente 20 o " "30 volte più veloce. È uno strumento assolutamente prezioso." #: pro/templates/email.php:62 msgid "If you like" msgstr "Se ti piace" #: classes/class-smart-manager-pricing.php:606 msgid "Import" msgstr "Importa" #: pro/classes/class-smart-manager-pro-background-updater.php:315 msgid "Important" msgstr "Importante" #: classes/class-smart-manager-product.php:862 msgid "In stock" msgstr "Disponibile" #: pro/classes/class-smart-manager-pro-background-updater.php:317 msgid "in the background. You will be notified on" msgstr "in background. Sarai avvisato" #: class-smart-manager.php:1149 msgid "" "In the meanwhile, you can use Smart Manager. But before using actions like " msgstr "" "Nel frattempo, puoi utilizzare Smart Manager. Ma prima di usare azioni come " #: pro/classes/class-smart-manager-pro-base.php:34 msgid "Index" msgstr "Indice" #: pro/classes/class-smart-manager-pro-shop-coupon.php:250 msgid "Individual use only" msgstr "Solo uso individuale" #: classes/class-smart-manager-admin-welcome.php:299 msgid "Inline Editing" msgstr "Modifica in linea" #: classes/class-smart-manager-pricing.php:438 msgid "Inline editing" msgstr "Modifica in linea" #: class-smart-manager.php:1468 msgid "is available." msgstr "è disponibile." #: pro/classes/class-smart-manager-pro-shop-coupon.php:254 msgid "Is Pick Price of Product" msgstr "È il prezzo di scelta del prodotto" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:124 msgid "It is a temporary deactivation. I am just debugging an issue." msgstr "" "È una disattivazione temporanea. Sto solo eseguendo il debug di un problema." #: classes/class-smart-manager-pricing.php:400 msgid "Jeff" msgstr "" #: pro/classes/class-smart-manager-pro-acf-field-group.php:44 #: pro/classes/class-smart-manager-pro-acf-field.php:44 msgid "Key" msgstr "Chiave" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:102 msgid "" "Kindly share what did not work for you / conflicting with which plugin so we " "can fix it..." msgstr "" "Ti prego di condividere ciò che non ti ha funzionato / in conflitto con " "quale plugin in modo che possiamo risolverlo..." #: classes/class-smart-manager-admin-welcome.php:261 msgid "Know Smart Manager" msgstr "Conosci Smart Manager" #: pro/classes/class-smart-manager-pro-acf-field-group.php:41 #: pro/classes/class-smart-manager-pro-acf-field.php:41 msgid "Label" msgstr "Etichetta" #: classes/class-smart-manager-admin-welcome.php:386 #: classes/class-smart-manager-admin-welcome.php:419 msgid "latest version" msgstr "versione più recente" #: class-smart-manager.php:1447 msgid "LITE" msgstr "" #: classes/class-smart-manager-admin-welcome.php:386 #, php-format msgid "" "Make sure you are using %s of Smart Manager. If still the issue persist, " "temporarily de-activate all plugins except WooCommerce/WPeCommerce & Smart " "Manager. Re-check the issue, if the issue still persists, contact us. If the " "issue goes away, re-activate other plugins one-by-one & re-checking the " "fields, to find out which plugin is conflicting." msgstr "" "Assicurati di utilizzare %s di Smart Manager. Se il problema persiste, " "disattiva temporaneamente tutti i plugin tranne WooCommerce/WPeCommerce e " "Smart Manager. Ricontrolla il problema, se il problema persiste, contattaci. " "Se il problema scompare, riattiva gli altri plugin uno per uno e ricontrolla " "i campi per scoprire quale plugin è in conflitto." #: classes/class-smart-manager-pricing.php:617 msgid "Manage Custom Taxonomies" msgstr "Gestisci tassonomie personalizzate" #: classes/class-smart-manager-pricing.php:573 msgid "Manage WordPress User roles" msgstr "Gestisci i ruoli utente di WordPress" #: classes/class-smart-manager-admin-welcome.php:287 msgid "Manage your entire store from a single screen" msgstr "Gestisci l'intero negozio da un'unica schermata" #: classes/class-smart-manager-pricing.php:677 msgid "Massive time-savings and 10x productivity boost. Choice is yours!" msgstr "" "Risparmio di tempo enorme e aumento della produttività di 10 volte. La " "scelta è tua!" #: pro/classes/class-smart-manager-pro-product.php:83 msgid "Max bookings per block" msgstr "Numero massimo di prenotazioni per blocco" #: pro/classes/class-smart-manager-pro-shop-coupon.php:236 msgid "Max discount" msgstr "Sconto massimo" #: pro/classes/class-smart-manager-pro-product.php:82 msgid "Max persons" msgstr "Massimo persone" #: pro/classes/class-smart-manager-pro-product.php:101 msgid "Max Quantity" msgstr "Quantità max" #: pro/classes/class-smart-manager-pro-product.php:85 msgid "Maximum block bookable" msgstr "Blocco massimo prenotabile" #: pro/classes/class-smart-manager-pro-product.php:206 msgid "Maximum block bookable (Unit)" msgstr "Blocco massimo prenotabile (unità)" #: pro/classes/class-smart-manager-pro-product.php:79 msgid "Maximum duration" msgstr "Durata massima" #: pro/classes/class-smart-manager-pro-product.php:96 msgid "Maximum Quantity" msgstr "Quantità massima" #: pro/classes/class-smart-manager-pro-product.php:89 msgid "Maximum quantity" msgstr "Quantità massima" #: pro/classes/class-smart-manager-pro-wc-user-membership.php:164 #: pro/classes/class-smart-manager-pro-wc-user-membership.php:165 msgid "Member since" msgstr "Membro da" #: pro/classes/class-smart-manager-pro-base.php:148 msgid "Meta robots advanced" msgstr "Meta robots avanzati" #: pro/classes/class-smart-manager-pro-product.php:81 msgid "Min persons" msgstr "Minimo persone" #: pro/classes/class-smart-manager-pro-product.php:100 msgid "Min Quantity" msgstr "Quantità min" #: pro/classes/class-smart-manager-pro-product.php:135 msgid "Min/Max Rules" msgstr "Regole min/max" #: pro/classes/class-smart-manager-pro-product.php:84 msgid "Minimum block bookable" msgstr "Blocco minimo prenotabile" #: pro/classes/class-smart-manager-pro-product.php:201 msgid "Minimum block bookable (Unit)" msgstr "Blocco minimo prenotabile (unità)" #: pro/classes/class-smart-manager-pro-product.php:78 msgid "Minimum duration" msgstr "Durata minima" #: pro/classes/class-smart-manager-pro-product.php:95 msgid "Minimum Quantity" msgstr "Quantità minima" #: pro/classes/class-smart-manager-pro-product.php:88 msgid "Minimum quantity" msgstr "Quantità minima" #: pro/classes/class-smart-manager-pro-product.php:151 msgid "Minutes(s)" msgstr "Minuto(i)" #: assets/js/smart-manager.js:2330 msgctxt "modal content" msgid "all" msgstr "" #: assets/js/smart-manager.js:2329 #, javascript-format msgctxt "modal content" msgid "Are you sure you want to %s" msgstr "" #: assets/js/smart-manager.js:2330 #, javascript-format msgctxt "modal content" msgid "Are you sure you want to %s the %s?" msgstr "" #: assets/js/smart-manager.js:2529 msgctxt "modal content" msgid "Are you sure you want to duplicate the " msgstr "" #: assets/js/smart-manager.js:3114 msgctxt "modal content" msgid "Are you sure?" msgstr "" #: assets/js/smart-manager.js:3092 msgctxt "modal content" msgid "Continue in background" msgstr "" #: pro/assets/js/smart-manager.js:595 msgctxt "modal content" msgid "" "Create a custom view to save selected columns from a dashboard. Use it for " "saved searches, giving specific columns access to other users, etc." msgstr "" #: assets/js/smart-manager.js:2472 msgctxt "modal content" msgid "delete" msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "delete all" msgstr "" #: assets/js/smart-manager.js:2433 #, javascript-format msgctxt "modal content" msgid "Enter how many new %s(s) to create!" msgstr "" #: assets/js/smart-manager.js:261 assets/js/smart-manager.js:2207 #, javascript-format msgctxt "modal content" msgid "For managing %s, %s %s version" msgstr "" #: assets/js/smart-manager.js:3092 msgctxt "modal content" msgid "Initializing..." msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "Note: Looking to" msgstr "" #: assets/js/smart-manager.js:2323 msgctxt "modal content" msgid "permanently delete" msgstr "" #: assets/js/smart-manager.js:261 assets/js/smart-manager.js:2207 #: assets/js/smart-manager.js:3061 msgctxt "modal content" msgid "Pro" msgstr "" #: assets/js/smart-manager.js:2329 msgctxt "modal content" msgid "record" msgstr "" #: assets/js/smart-manager.js:2329 msgctxt "modal content" msgid "records" msgstr "" #: assets/js/smart-manager.js:2472 msgctxt "modal content" msgid "the current view. Are you sure you want to continue?" msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "the records?" msgstr "" #: assets/js/smart-manager.js:2329 msgctxt "modal content" msgid "the selected" msgstr "" #: assets/js/smart-manager.js:3061 #, javascript-format msgctxt "modal content" msgid "This feature is available only in the %s version" msgstr "" #: assets/js/smart-manager.js:2472 msgctxt "modal content" msgid "This will" msgstr "" #: assets/js/smart-manager.js:2528 msgctxt "modal content" msgid "" "This will duplicate only the records in posts, postmeta and related " "taxonomies." msgstr "" #: assets/js/smart-manager.js:2323 msgctxt "modal content" msgid "trash" msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "Upgrade to Pro" msgstr "" #: assets/js/smart-manager.js:2557 msgctxt "modal description" msgid "" "You can change / update multiple fields of the entire store OR for selected " "items by selecting multiple records and then click on Bulk Edit." msgstr "" #: assets/js/smart-manager.js:2560 msgctxt "modal description" msgid "" "You can export all the records OR filtered records (using Simple Search or " "Advanced Search) by simply clicking on the Export CSV button at the bottom " "right of the grid." msgstr "" #: assets/js/smart-manager.js:2566 msgctxt "modal title" msgid "(Only in" msgstr "" #: assets/js/smart-manager.js:2432 #, javascript-format msgctxt "modal title" msgid "Add %s(s)" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:60 msgctxt "modal title" msgid "Advanced Search" msgstr "" #: assets/js/smart-manager.js:2319 assets/js/smart-manager.js:2471 #: assets/js/smart-manager.js:2527 msgctxt "modal title" msgid "Attention!!!" msgstr "" #: assets/js/smart-manager.js:2566 msgctxt "modal title" msgid "Biggest Time Saver" msgstr "" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:66 #: pro/assets/js/smart-manager.js:718 pro/assets/js/smart-manager.js:973 msgctxt "modal title" msgid "Bulk Edit" msgstr "" #: assets/js/smart-manager.js:2749 msgctxt "modal title" msgid "Column Manager - Show/Hide Columns" msgstr "" #: pro/assets/js/smart-manager.js:1273 msgctxt "modal title" msgid "Delete Records" msgstr "" #: pro/assets/js/smart-manager.js:489 msgctxt "modal title" msgid "Duplicate Records" msgstr "" #: assets/js/smart-manager.js:2994 assets/js/smart-manager.js:3060 msgctxt "modal title" msgid "Note" msgstr "" #: assets/js/smart-manager.js:3091 msgctxt "modal title" msgid "Please Wait" msgstr "" #: assets/js/smart-manager.js:2566 msgctxt "modal title" msgid "Pro" msgstr "" #: assets/js/smart-manager.js:2992 msgctxt "modal title" msgid "Success" msgstr "" #: assets/js/smart-manager.js:3113 msgctxt "modal title" msgid "Warning" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:148 msgid "Month(s)" msgstr "Mese(i)" #: pro/classes/class-smart-manager-pro-product.php:121 msgid "Multiply all costs by person count" msgstr "Moltiplica tutti i costi per il conteggio delle persone" #: classes/class-smart-manager-product.php:952 #: pro/classes/class-smart-manager-pro-acf-field-group.php:42 #: pro/classes/class-smart-manager-pro-acf-field.php:42 msgid "Name" msgstr "Nome" #: pro/classes/class-smart-manager-pro-product.php:260 msgid "Never expire" msgstr "Non scade mai" #: pro/classes/class-smart-manager-pro-user.php:185 msgid "Nickname" msgstr "Soprannome" #: pro/classes/class-smart-manager-pro-base.php:135 #: pro/classes/class-smart-manager-pro-base.php:143 msgid "No" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:29 #: pro/classes/class-smart-manager-pro-base.php:37 msgid "No Archive" msgstr "Nessun archivio" #: pro/classes/class-smart-manager-pro-base.php:36 msgid "No Follow" msgstr "Non seguire" #: pro/classes/class-smart-manager-pro-base.php:28 #: pro/classes/class-smart-manager-pro-base.php:38 msgid "No Image Index" msgstr "Nessun indice di immagine" #: pro/classes/class-smart-manager-pro-base.php:35 msgid "No Index" msgstr "Nessun indice" #: classes/class-smart-manager-product.php:941 #: classes/class-smart-manager-product.php:943 msgid "No shipping class" msgstr "Nessuna classe di spedizione" #: pro/classes/class-smart-manager-pro-base.php:30 #: pro/classes/class-smart-manager-pro-base.php:39 msgid "No Snippet" msgstr "Nessun frammento" #: classes/class-smart-manager-product.php:846 #: classes/class-smart-manager-product.php:852 #: pro/classes/class-smart-manager-pro-base.php:27 msgid "None" msgstr "Nessuno" #: pro/classes/class-smart-manager-pro-product.php:230 msgid "not-available by default" msgstr "non disponibile per impostazione predefinita" #: pro/classes/class-smart-manager-pro-background-updater.php:329 msgid "NOTE" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "column if not enabled using" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "column show/hide functionality" msgstr "" #: assets/js/smart-manager.js:2460 assets/js/smart-manager.js:2482 msgctxt "notification" msgid "Custom Views avialable (Only in" msgstr "" #: assets/js/smart-manager.js:2590 msgctxt "notification" msgid "Duplicate Records (Only in" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "Enable" msgstr "" #: assets/js/smart-manager.js:3048 msgctxt "notification" msgid "Error" msgstr "" #: assets/js/smart-manager.js:2422 msgctxt "notification" msgid "For editing more records upgrade to Pro" msgstr "" #: assets/js/smart-manager.js:263 assets/js/smart-manager.js:2208 #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "Note" msgstr "" #: assets/js/smart-manager.js:2272 msgctxt "notification" msgid "Please edit a record" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "Please enter user email" msgstr "" #: assets/js/smart-manager.js:2309 assets/js/smart-manager.js:2545 msgctxt "notification" msgid "Please select a record" msgstr "" #: assets/js/smart-manager.js:2460 assets/js/smart-manager.js:2482 #: assets/js/smart-manager.js:2590 msgctxt "notification" msgid "Pro" msgstr "" #: assets/js/smart-manager.js:2314 msgctxt "notification" msgid "records at a time" msgstr "" #: assets/js/smart-manager.js:2954 pro/assets/js/smart-manager.js:567 #: pro/assets/js/smart-manager.js:690 msgctxt "notification" msgid "Success" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:57 msgctxt "notification" msgid "This feature is available only in the Pro version." msgstr "" #: assets/js/smart-manager.js:2314 msgctxt "notification" msgid "To delete more than" msgstr "" #: assets/js/smart-manager.js:2299 msgctxt "notification" msgid "To permanently delete records" msgstr "" #: assets/js/smart-manager.js:2299 assets/js/smart-manager.js:2314 msgctxt "notification" msgid "upgrade to Pro" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "User Email" msgstr "" #: pro/assets/js/smart-manager.js:567 #, javascript-format msgctxt "notification" msgid "View %sd successfully!" msgstr "" #: pro/assets/js/smart-manager.js:658 msgctxt "notification" msgid "View already exists. Please try another name" msgstr "" #: pro/assets/js/smart-manager.js:690 msgctxt "notification" msgid "View deleted successfully!" msgstr "" #: assets/js/smart-manager.js:3048 msgctxt "notification" msgid "You have entered incorrect data in the highlighted cells." msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "decrease by %" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "decrease by number" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "increase by %" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "increase by number" msgstr "" #: classes/class-smart-manager-product.php:864 msgid "On backorder" msgstr "In arretrato" #: pro/templates/order-invoice.php:201 msgid "Order Discount" msgstr "Sconto ordine" #: pro/templates/order-invoice.php:195 msgid "Order Notes" msgstr "Note ordine" #: pro/classes/class-smart-manager-pro-product.php:137 msgid "Order rules: Do not count" msgstr "Regole dell'ordine: non contano" #: pro/classes/class-smart-manager-pro-product.php:138 msgid "Order rules: Exclude" msgstr "Regole dell'ordine: escluse" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:130 msgid "Other" msgstr "Altro" #: classes/class-smart-manager-product.php:863 msgid "Out of stock" msgstr "Esaurito" #: pro/classes/class-smart-manager-pro-shop-coupon.php:217 msgid "Payment Methods" msgstr "Metodi di pagamento" #: pro/assets/js/smart-manager.js:853 pro/assets/js/smart-manager.js:857 #: pro/assets/js/smart-manager.js:943 pro/assets/js/smart-manager.js:1054 #: pro/assets/js/smart-manager.js:1075 pro/assets/js/smart-manager.js:1094 msgctxt "placeholder" msgid "Enter a value..." msgstr "" #: pro/assets/js/smart-manager-product.js:225 msgctxt "placeholder" msgid "Enter Attribute name..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:428 msgctxt "placeholder" msgid "Enter attribute name..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:63 src/views/Rule.js:357 #: src/views/Rule.js:372 msgctxt "placeholder" msgid "Enter value" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:429 #: pro/assets/js/smart-manager-product.js:226 msgctxt "placeholder" msgid "Enter values..." msgstr "" #: pro/assets/js/smart-manager.js:596 msgctxt "placeholder" msgid "Give a name to this view" msgstr "" #: assets/js/smart-manager-product.js:208 #: assets/js/smart-manager-product.js:313 msgctxt "placeholder" msgid "Name" msgstr "" #: assets/js/smart-manager-product.js:203 #: assets/js/smart-manager-product.js:209 #: assets/js/smart-manager-product.js:307 #: assets/js/smart-manager-product.js:314 msgctxt "placeholder" msgid "Pipe (|) separate terms" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:429 #: pro/assets/js/smart-manager.js:1155 msgctxt "placeholder" msgid "Replace with..." msgstr "" #: assets/js/smart-manager.js:2733 msgctxt "placeholder" msgid "Search For Disabled Columns..." msgstr "" #: assets/js/smart-manager.js:2726 msgctxt "placeholder" msgid "Search For Enabled Columns..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:428 #: pro/assets/js/smart-manager.js:1154 msgctxt "placeholder" msgid "Search for..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:230 #: pro/assets/js/smart-manager.js:1119 #, javascript-format msgctxt "placeholder" msgid "Select %s" msgstr "" #: assets/js/smart-manager-product.js:190 #: assets/js/smart-manager-product.js:293 msgctxt "placeholder" msgid "Select terms" msgstr "" #: assets/js/smart-manager.js:278 msgctxt "placeholder" msgid "Type to search..." msgstr "" #: pro/templates/email.php:62 msgid "please leave us a" msgstr "per favore lasciaci una" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:132 msgid "Please mention..." msgstr "Si prega di citare..." #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:71 msgid "Please select an option" msgstr "Seleziona un'opzione" #: assets/js/smart-manager-product.js:183 msgctxt "position checkbox" msgid "Position:" msgstr "" #: classes/class-smart-manager-shop-order.php:437 #: pro/templates/order-invoice.php:163 msgid "Price" msgstr "Prezzo" #: classes/class-smart-manager-pricing.php:641 msgid "Pricing" msgstr "Prezziario" #: pro/classes/class-smart-manager-pro-access-privilege.php:330 msgid "Print Order Settings" msgstr "Impostazioni della stampa ordine" #: classes/class-smart-manager-pricing.php:584 msgid "Print packing slips for WooCommerce orders in bulk" msgstr "Stampa i documenti di trasporto per gli ordini WooCommerce in blocco" #: classes/class-smart-manager-pricing.php:562 msgid "Print PDF invoices" msgstr "Stampa fatture PDF" #: pro/classes/class-smart-manager-pro-access-privilege.php:195 msgid "Privileges for Smart Manager for different System Roles" msgstr "Privilegi per Smart Manager per diversi ruoli di sistema" #: class-smart-manager.php:1447 msgid "PRO" msgstr "" #: classes/class-smart-manager-admin-welcome.php:333 #: classes/class-smart-manager-admin-welcome.php:349 #: classes/class-smart-manager-pricing.php:416 msgid "Pro" msgstr "" #: pro/templates/order-invoice.php:162 msgid "Product" msgstr "Prodotto" #: pro/classes/class-smart-manager-pro-shop-coupon.php:223 msgid "Product Attributes" msgstr "Attributi prodotto" #: pro/classes/class-smart-manager-pro-shop-coupon.php:209 msgid "Product categories" msgstr "Categorie prodotto" #: pro/assets/js/smart-manager-product.js:127 msgctxt "product price operator" msgid "set to regular price" msgstr "" #: pro/assets/js/smart-manager-product.js:123 msgctxt "product price operator" msgid "set to sale price" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:109 msgid "Product Units" msgstr "Unità prodotto" #: pro/classes/class-smart-manager-pro-shop-coupon.php:229 msgid "Products" msgstr "Prodotti" #: pro/classes/class-smart-manager-pro-background-updater.php:322 msgid "Progress" msgstr "Progresso" #: pro/assets/js/smart-manager.js:601 msgid "Public" msgstr "" #: classes/class-smart-manager-shop-order.php:437 msgid "Qty" msgstr "Q.tà" #: pro/templates/order-invoice.php:163 msgid "Quantity" msgstr "Quantità" #: classes/class-smart-manager-admin-welcome.php:248 msgid "Questions? Need Help?" msgstr "Domande? Hai bisogno di aiuto?" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:65 msgid "Quick Feedback for Smart Manager plugin" msgstr "Feedback rapido per il plugin Smart Manager" #: pro/classes/class-smart-manager-pro-base.php:103 msgid "Rank Math SEO Score" msgstr "Classifica matematica punteggio SEO" #: pro/templates/email.php:62 msgid "rating. A huge thank you from StoreApps in advance!" msgstr "valutazione. Un enorme grazie da StoreApps in anticipo!" #: pro/templates/email.php:45 msgid "Records Updated" msgstr "Records aggiornati" #: classes/class-smart-manager-product.php:890 msgid "Reduced Rate" msgstr "Rata ridotta" #: pro/classes/class-smart-manager-pro-product.php:111 msgid "Regular Unit Price" msgstr "Prezzo unitario normale" #: pro/classes/class-smart-manager-pro-background-updater.php:316 msgid "request is running" msgstr "la richiesta è in esecuzione" #: classes/class-smart-manager-admin-welcome.php:390 msgid "" "Request you to kindly de-activate and activate the Smart Manager plugin once " "and then have a recheck with the search functionality." msgstr "" "Ti chiedo gentilmente di disattivare e attivare il plugin Smart Manager una " "volta e quindi di ricontrollare con la funzionalità di ricerca." #: pro/classes/class-smart-manager-pro-product.php:86 msgid "Require a buffer period of" msgstr "Richiede un periodo di buffer di" #: pro/classes/class-smart-manager-pro-product.php:117 msgid "Requires confirmation?" msgstr "Richiede conferma?" #: pro/classes/class-smart-manager-pro-product.php:219 msgid "Resources are..." msgstr "Le risorse sono..." #: pro/classes/class-smart-manager-pro-product.php:124 msgid "Restrict start and end days?" msgstr "Limitare i giorni di inizio e fine?" #: pro/classes/class-smart-manager-pro-base.php:153 msgid "Robots Meta" msgstr "Meta robots" #: assets/js/admin.js:1 src/views/RuleGroup.js:32 msgctxt "rule content" msgid "This group is a \"pass\" when" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:35 msgctxt "rule option" msgid "all" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:36 msgctxt "rule option" msgid "at least one" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:112 msgid "Sale Unit Price" msgstr "Prezzo unitario di vendita" #: assets/js/smart-manager.js:280 assets/js/smart-manager.js:539 #, javascript-format msgctxt "search conditions" msgid "%d condition%s" msgstr "" #: assets/js/smart-manager.js:280 assets/js/smart-manager.js:539 msgctxt "search conditions" msgid "s" msgstr "" #: classes/class-smart-manager-product.php:735 msgid "Search results only" msgstr "Solo risultati di ricerca" #: assets/js/smart-manager.js:354 assets/js/smart-manager.js:355 #, javascript-format msgctxt "search type" msgid "%s Search" msgstr "" #: assets/js/smart-manager.js:276 msgctxt "search type" msgid "Advanced" msgstr "" #: assets/js/smart-manager.js:276 msgctxt "search type" msgid "Simple" msgstr "" #: classes/class-smart-manager-admin-welcome.php:324 #: classes/class-smart-manager-admin-welcome.php:341 msgid "See how" msgstr "Guarda come" #: classes/class-smart-manager-admin-welcome.php:295 #: classes/class-smart-manager-admin-welcome.php:304 msgid "see how" msgstr "guarda come" #: pro/assets/js/smart-manager-product.js:152 pro/assets/js/smart-manager.js:24 #: pro/assets/js/smart-manager.js:890 msgid "Select Action" msgstr "" #: pro/assets/js/smart-manager-product.js:143 msgid "Select Attribute" msgstr "" #: pro/assets/js/smart-manager.js:874 msgid "Select Field" msgstr "" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:147 #: pro/assets/js/smart-manager.js:871 msgid "Selected Items" msgstr "" #: classes/class-smart-manager-pricing.php:513 msgid "" "Set to, Append, Prepend, Increase / Decrease by %, Increase / Decrease by " "number, Set datetime to, Set date to, Set time to, Upload images and many " "more..." msgstr "" "Imposta su, Aggiungi, Anteponi, Aumenta/Diminuisci di %, Aumenta/Diminuisci " "per numero, Imposta data e ora a, Imposta data a, Imposta ora a, Carica " "immagini e molto altro..." #: class-smart-manager.php:669 class-smart-manager.php:1455 #: classes/class-smart-manager-admin-welcome.php:252 #: pro/classes/class-smart-manager-pro-access-privilege.php:178 msgid "Settings" msgstr "Impostazioni" #: pro/classes/class-smart-manager-pro-access-privilege.php:56 msgid "Settings Saved Successfully!!!" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:328 #: pro/templates/order-invoice.php:197 msgid "Shipping" msgstr "Spedizione" #: pro/templates/order-invoice.php:151 msgid "Shipping Address" msgstr "Indirizzo di spedizione" #: pro/classes/class-smart-manager-pro-shop-coupon.php:215 msgid "Shipping methods" msgstr "Metodi di spedizioni" #: classes/class-smart-manager-product.php:845 #: classes/class-smart-manager-product.php:851 msgid "Shipping only" msgstr "Solo spedizione" #: classes/class-smart-manager-product.php:733 msgid "Shop and search results" msgstr "Negozio e risultati di ricerca" #: classes/class-smart-manager-product.php:734 msgid "Shop only" msgstr "Solo negozio" #: pro/classes/class-smart-manager-pro-base.php:141 #, php-format msgid "Should search engines follow links on this %1$s?" msgstr "I motori di ricerca dovrebbero seguire i link su questo %1$s?" #: assets/js/smart-manager-product.js:435 msgctxt "show variations checkbox" msgid "Show Variations" msgstr "" #: classes/class-smart-manager-admin-welcome.php:308 msgid "Show/Hide & Sort Data Columns" msgstr "Mostra/Nascondi e ordina le colonne di dati" #: classes/class-smart-manager-admin-welcome.php:313 msgid "" "Show/hide multiple data columns of your WooCommerce store data as per your " "requirements. Sort them in ascending or descending order. Smart Manager also " "gives you persistent state management." msgstr "" "Mostra/nascondi più colonne di dati dei dati del tuo negozio WooCommerce " "secondo le tue esigenze. Ordinali in ordine crescente o decrescente. Smart " "Manager ti offre anche una gestione permanente dello stato." #: pro/classes/class-smart-manager-pro-product.php:104 msgid "Sign-up Fee" msgstr "Quota di iscrizione" #: classes/class-smart-manager-pricing.php:473 msgid "Simple Search" msgstr "Ricerca semplice" #: classes/class-smart-manager-admin-welcome.php:295 #, php-format msgid "" "Simply enter the keyword you wish to filter records in the “Simple Search†" "field at the top of the grid (%s). If you need to have a more specific " "search result, then you can switch to “%s“ and then search." msgstr "" "Nel campo \"Ricerca semplice\", nella parte superiore della griglia (%s), " "inserisci semplicemente la parola chiave per filtrare i record. Se hai " "bisogno di un risultato di ricerca più specifico, puoi passare a \"%s\" e " "quindi cercare." #: pro/classes/class-smart-manager-pro-base.php:26 msgid "Site-wide default" msgstr "Impostazione predefinita a livello di sito" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:68 msgid "Skip & Deactivate" msgstr "Salta e disattiva" #: classes/class-smart-manager-product.php:949 #: pro/templates/order-invoice.php:162 msgid "SKU" msgstr "COD" #: classes/class-smart-manager-product.php:954 #: pro/classes/class-smart-manager-pro-wc-membership-plan.php:97 #: pro/classes/class-smart-manager-pro-wc-membership-plan.php:98 msgid "Slug" msgstr "" #: pro/templates/email.php:62 msgid "Smart Manager" msgstr "" #. Name of the plugin msgid "Smart Manager For WooCommerce – Stock Management, Bulk Edit & more..." msgstr "" "Smart Manager per WooCommerce – Gestione magazzino, Editor in blocco e altro." ".." #: pro/templates/email.php:36 msgid "Smart Manager has successfully completed" msgstr "Smart Manager è stato completato con successo" #: classes/class-smart-manager-admin-welcome.php:280 msgid "" "Smart Manager is a unique, revolutionary tool that gives you the power to " "boost your productivity by 10x in managing your WooCommerce store " "by using a familiar, single page, spreadsheet like interface. " msgstr "" "Smart Manager è uno strumento unico e rivoluzionario che ti dà il potere di " "aumentare la tua produttività di 10 volte nella gestione del tuo " "negozio WooCommerce utilizzando un foglio di calcolo familiare, a " "pagina singola come interfaccia. " #: classes/class-smart-manager-admin-welcome.php:414 #, php-format msgid "" "Smart Manager is actively developed. If you can't find your favorite feature " "(or have a suggestion) %s. We'd love to hear from you." msgstr "" "Smart Manager è attivamente sviluppato. Se non riesci a trovare la tua " "funzione preferita (o hai un suggerimento) %s. Ci piacerebbe sentirti." #: classes/class-smart-manager-admin-welcome.php:394 msgid "" "Smart Manager is based on WooCommerce and WPeCommerce and the same e-" "commerce plugins sets the price/sales price of the variation parents " "automatically based on the price/sales price of its variations." msgstr "" "Smart Manager si basa su WooCommerce e WPeCommerce e gli stessi plugin di e-" "commerce impostano automaticamente il prezzo/prezzo di vendita delle " "varianti padre in base al prezzo/prezzo di vendita delle sue variazioni." #: classes/class-smart-manager-admin-welcome.php:385 msgid "Smart Manager is empty?" msgstr "Smart Manager è vuoto?" #: classes/class-smart-manager-pricing.php:676 msgid "Smart Manager Pro" msgstr "" #: classes/class-smart-manager-admin-welcome.php:389 msgid "Smart Manager search functionality not working" msgstr "La funzionalità di ricerca di Smart Manager non funziona" #: classes/class-smart-manager-admin-welcome.php:398 msgid "" "Smart Manager will allow you to manage custom field of any other plugin." msgstr "" "Smart Manager ti consentirà di gestire il campo personalizzato di qualsiasi " "altro plugin." #: classes/class-smart-manager-product.php:889 msgid "Standard" msgstr "" #: classes/class-smart-manager-shop-order.php:162 #: pro/classes/class-smart-manager-pro-shop-subscription.php:177 msgid "Status" msgstr "Stato" #. Author of the plugin msgid "StoreApps" msgstr "" #: class-smart-manager.php:678 msgid "StoreApps Plugins" msgstr "Plugins StoreApps" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:67 msgid "Submit & Deactivate" msgstr "Invia e disattiva" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:70 msgid "Submit a reason to deactivate" msgstr "Invia una ragione per disattivare" #: classes/class-smart-manager-admin-welcome.php:414 msgid "Submit your query" msgstr "Invia la tua domanda" #: pro/classes/class-smart-manager-pro-product.php:246 msgid "Subscription Periods" msgstr "Periodi di abbonamento" #: pro/classes/class-smart-manager-pro-product.php:103 msgid "Subscription Price" msgstr "Prezzo abbonamento" #: pro/classes/class-smart-manager-pro-product.php:271 msgid "Subscription Trial Period" msgstr "Periodo di prova dell'abbonamento" #: classes/class-smart-manager-pricing.php:628 msgid "Support" msgstr "Supporto" #: classes/class-smart-manager-pricing.php:423 msgid "Supported Post Types" msgstr "Tipi di post supportati" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:66 msgid "Take a moment to let us know why you are deactivating" msgstr "Dedica un momento a farci sapere perché stai disattivando" #: pro/templates/order-invoice.php:208 msgid "Tax" msgstr "Imposta" #: classes/class-smart-manager-product.php:844 #: classes/class-smart-manager-product.php:850 msgid "Taxable" msgstr "Imponibile" #: pro/templates/order-invoice.php:159 msgid "Tel" msgstr "" #: pro/assets/js/smart-manager.js:39 msgctxt "text operator" msgid "append" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "contains" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "is" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "is not" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "not contains" msgstr "" #: pro/assets/js/smart-manager.js:39 msgctxt "text operator" msgid "prepend" msgstr "" #: classes/class-smart-manager-admin-welcome.php:230 #, php-format msgid "Thank you for installing Smart Manager %s!" msgstr "Grazie per aver installato Smart Manager %s!" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:112 msgid "The plugin is great, but I need specific feature that you don't support" msgstr "" "Il plugin è fantastico, ma ho bisogno di funzionalità specifiche che tu non " "supporti" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:100 msgid "The plugin is not working / not compatible with another plugin." msgstr "Il plugin non sta funzionando / non compatibile con altro plugin." #: pro/classes/class-smart-manager-pro-product.php:238 msgid "The starting block only" msgstr "Solo il blocco di partenza" #: assets/js/admin.js:1 src/views/Rule.js:22 msgctxt "time duration" msgid "hours" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:22 msgctxt "time duration" msgid "minutes" msgstr "" #: pro/assets/js/smart-manager.js:35 msgctxt "time operator" msgid "set time to" msgstr "" #: assets/js/smart-manager.js:279 msgctxt "title" msgid "Click to add/edit condition" msgstr "" #: assets/js/smart-manager.js:362 msgctxt "title" msgid "Custom Views" msgstr "" #: pro/assets/js/smart-manager-product.js:226 msgctxt "title" msgid "For more than one values, use pipe (|) as delimiter" msgstr "" #: assets/js/smart-manager.js:1700 msgctxt "title" msgid "Gallery Images" msgstr "" #: assets/js/smart-manager.js:447 msgctxt "title" msgid "Load more records" msgstr "" #: assets/js/smart-manager.js:1293 msgctxt "title" msgid "Remove gallery image" msgstr "" #: assets/js/smart-manager.js:354 #, javascript-format msgctxt "title" msgid "Switch to %s" msgstr "" #: classes/class-smart-manager-admin-welcome.php:402 #, php-format msgid "To show / hide columns in the Smart Manager, %s." msgstr "Per mostrare/nascondere le colonne in Smart Manager, %s." #: assets/js/smart-manager.js:1410 msgctxt "tooltip" msgid "(Click to sort)" msgstr "" #: assets/js/smart-manager.js:392 msgctxt "tooltip" msgid "Add Row" msgstr "" #: assets/js/smart-manager.js:378 msgctxt "tooltip" msgid "Bulk Edit" msgstr "" #: assets/js/smart-manager.js:412 msgctxt "tooltip" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:402 msgctxt "tooltip" msgid "Duplicate" msgstr "" #: assets/js/smart-manager.js:420 msgctxt "tooltip" msgid "Export CSV" msgstr "" #: assets/js/smart-manager.js:426 msgctxt "tooltip" msgid "Print Invoice" msgstr "" #: assets/js/smart-manager.js:386 msgctxt "tooltip" msgid "Save" msgstr "" #: assets/js/smart-manager.js:434 msgctxt "tooltip" msgid "Show / Hide Columns" msgstr "" #: pro/templates/order-invoice.php:209 msgid "Total" msgstr "Totale" #: pro/classes/class-smart-manager-pro-product.php:110 msgid "Unit Price Units" msgstr "Unità di prezzo unitario" #: classes/class-smart-manager-pricing.php:446 msgid "Unlimited" msgstr "Illimitato" #: pro/templates/email.php:7 msgid "Updated" msgstr "Aggiornato" #: classes/class-smart-manager-admin-welcome.php:393 msgid "Updating variation parent price/sales price not working?" msgstr "" "L'aggiornamento del prezzo di vendita/prezzo principale della variazione non " "funziona?" #: pro/classes/class-smart-manager-pro-access-privilege.php:339 msgid "Upload Image" msgstr "Carica immagine" #: classes/class-smart-manager-pricing.php:442 msgid "Upto three records without saving" msgstr "Fino a tre record senza salvare" #: classes/class-smart-manager-shop-coupon.php:121 msgid "Usage Limit Per Coupon" msgstr "Limite d'uso del coupon" #: classes/class-smart-manager-admin-welcome.php:357 msgid "using Simple Search†or Advanced Search" msgstr "utilizzando la ricerca semplice†o la ricerca avanzata" #: pro/classes/class-smart-manager-pro-shop-coupon.php:241 msgid "Validity Suffix" msgstr "Suffisso validità" #: pro/templates/email.php:44 msgid "Value" msgstr "Valore" #: pro/classes/class-smart-manager-pro-product.php:142 msgid "Variation Category group-of rules: Exclude" msgstr "Regole variazione categoria gruppo-di: escluse" #: assets/js/smart-manager-product.js:181 msgctxt "variation flag" msgid "Used for variations" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:93 msgid "Variation Group of..." msgstr "Gruppo variazione di..." #: pro/classes/class-smart-manager-pro-product.php:98 msgid "Variation Maximum Quantity" msgstr "Quantità massima di variazione" #: pro/classes/class-smart-manager-pro-product.php:92 msgid "Variation Maximum quantity" msgstr "Quantità di variazione massima" #: pro/classes/class-smart-manager-pro-product.php:97 msgid "Variation Minimum Quantity" msgstr "Quantità minima di variazione" #: pro/classes/class-smart-manager-pro-product.php:91 msgid "Variation Minimum quantity" msgstr "Quantità di variazione minima" #: pro/classes/class-smart-manager-pro-product.php:140 msgid "Variation Order rules: Do not count" msgstr "Regole variazione dell'ordine: non contano" #: pro/classes/class-smart-manager-pro-product.php:141 msgid "Variation Order rules: Exclude" msgstr "Regole variazione dell'ordine: escluse" #: classes/class-smart-manager-pricing.php:595 msgid "View Customer Lifetime Value (LTV)" msgstr "Visualizza il valore a vita del cliente (LTV)" #: classes/class-smart-manager-admin-welcome.php:365 msgid "View our other WooCommerce plugins" msgstr "Visualizza gli altri nostri plugin per WooCommerce" #: assets/js/smart-manager-product.js:179 msgctxt "visibility flag" msgid "Visible on the product page" msgstr "" #: classes/class-smart-manager-pricing.php:661 msgid "" "We recommend Smart Manager Pro to everyone who is looking for an extremely " "multi-functional store manager. The plugin is absolutely worth it. Never " "again without Smart Manager!" msgstr "" "Consigliamo Smart Manager Pro a tutti coloro che cercano uno store manager " "estremamente multifunzionale. Ne vale assolutamente la pena. Mai più senza " "Smart Manager!" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:108 msgid "What did you wanted to do in short period?" msgstr "Cosa volevi fare in breve tempo?" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:120 msgid "What is that plugin name?" msgstr "Qual è il nome di quel plugin?" #: classes/class-smart-manager-pricing.php:399 msgid "" "What really sold me on Smart Manager Pro was Bulk Edit. My assistant does " "not have to do any complex math now (earlier, I always feared she would make " "mistakes)! With Smart Manager, she has more free time at hand, so I asked " "her to set up auto responder emails. The response was phenomenal. Repeat " "sales were up by 19.5%." msgstr "" "Quello che mi ha davvero stupito di Smart Manager Pro è stata la modifica " "collettiva. La mia assistente non deve fare calcoli complessi ora (prima, ho " "sempre temuto che avrebbe commesso degli errori)! Con Smart Manager, ha più " "tempo libero a disposizione, quindi le ho chiesto di impostare email di " "risposta automatica. La risposta è stata fenomenale. Le vendite ripetute " "sono aumentate del 19,5%." #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:114 msgid "What specific feature you need?" msgstr "Di quale caratteristica specifica hai bisogno?" #: pro/classes/class-smart-manager-pro-background-updater.php:317 msgid "when it is completed." msgstr "quando è completata." #: classes/class-smart-manager-pricing.php:432 msgid "" "WordPress Pages, Media, Users, SEO plugins, WooCommerce Subscriptions, " "Bookings, Memberships, Product Add-ons, Brands…all" msgstr "" "Pagine WordPress, media, utenti, plugin SEO, abbonamenti WooCommerce, " "prenotazioni, abbonamenti, componenti aggiuntivi di prodotti, marchi... tutto" #: classes/class-smart-manager-pricing.php:427 msgid "" "WordPress Posts, WooCommerce Products, Product Variations, Orders, Coupons" msgstr "" "Post di WordPress, prodotti WooCommerce, varianti di prodotto, ordini, coupon" #: classes/class-smart-manager-pricing.php:632 msgid "WP forum" msgstr "Forum WP" #: pro/classes/class-smart-manager-pro-base.php:134 #: pro/classes/class-smart-manager-pro-base.php:142 msgid "Yes" msgstr "Si" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:69 msgid "Yes - Deactivate" msgstr "Si - Disattiva" #: pro/classes/class-smart-manager-pro-base.php:98 msgid "Yoast Focus Keyphrase" msgstr "Focus frase chiave Yoast" #: pro/classes/class-smart-manager-pro-base.php:96 msgid "Yoast Meta Description" msgstr "Descrizione meta Yoast" #: pro/classes/class-smart-manager-pro-base.php:97 msgid "Yoast Meta Keywords" msgstr "Parole chiave meta Yoast" #: pro/classes/class-smart-manager-pro-base.php:101 msgid "Yoast Readability Score" msgstr "Punteggio di leggibilità Yoast" #: pro/classes/class-smart-manager-pro-base.php:102 msgid "Yoast SEO Score" msgstr "Punteggio SEO Yoast" #: pro/classes/class-smart-manager-pro-base.php:95 msgid "Yoast SEO Title" msgstr "Titolo SEO Yoast" #: classes/class-smart-manager-admin-welcome.php:341 #, php-format msgid "" "You can change / update multiple fields of the entire store OR for selected " "items by selecting multiple records and then click on Bulk Edit. %s." msgstr "" "Puoi modificare/aggiornare più campi dell'intero negozio OPPURE per gli " "articoli selezionati selezionando più record e quindi facendo clic su " "Modifica in blocco. %s." #: classes/class-smart-manager-pricing.php:676 #, php-format msgid "" "You can either spend hours of work in store management or use %s to " "accomplish the same within minutes." msgstr "" "Puoi dedicare ore di lavoro alla gestione del negozio o utilizzare %s per " "ottenere lo stesso risultato in pochi minuti." #: classes/class-smart-manager-admin-welcome.php:357 #, php-format msgid "" "You can export all the records OR filtered records (%s) by simply clicking " "on the Export CSV button at the bottom right of the grid." msgstr "" "Puoi esportare tutti i record OPPURE i record filtrati (%s) semplicemente " "facendo clic sul pulsante Esporta CSV in basso a destra della griglia." #: classes/class-smart-manager-admin-welcome.php:304 #, php-format msgid "" "You can quickly update your Products, Orders, Coupons and Posts from Smart " "Manager itself. This facilitates editing of multiple rows at a time instead " "of editing and saving each row separately, %s." msgstr "" "Puoi aggiornare rapidamente i tuoi prodotti, ordini, coupon e post da Smart " "Manager stesso. Ciò facilita la modifica di più righe alla volta invece di " "modificare e salvare ogni riga separatamente, %s." #: classes/class-smart-manager-admin-welcome.php:324 #, php-format msgid "" "You can simply select records you want to delete (check the header box if " "you want to delete all records) and click on the “Delete†icon. All the " "selected records will be deleted. You can even delete records by applying " "search filters. %s." msgstr "" "Puoi semplicemente selezionare i record che desideri eliminare (selezionare " "la casella di intestazione se desideri eliminare tutti i record) e fare clic " "sull'icona \"Elimina\". Tutti i record selezionati verranno eliminati. Puoi " "anche eliminare i record applicando filtri di ricerca. %s." #: classes/class-smart-manager-admin-welcome.php:406 msgid "" "You cannot import using Smart Manager. Use import functionality of " "WooCommerce." msgstr "" "Non è possibile importare utilizzando Smart Manager. Usa la funzionalità di " "importazione di WooCommerce." #: class-smart-manager.php:1149 msgid "you will have to wait for the current background process to finish." msgstr "dovrai attendere il completamento del processo in background in corso." #: classes/class-smart-manager-product.php:891 msgid "Zero Rate" msgstr "Tasso zero" #: classes/class-smart-manager-pricing.php:343 msgid "â° Limited time offer" msgstr "â° Offerta a tempo limitato" languages/smart-manager-for-wp-e-commerce-ro_RU.mo000064400000065734147600337620016102 0ustar00Þ•ÆL| | /} ­ ² · ¼ Á Æ Ë Ï Ó × ?Ú  * '< d l } 2 ŽÃ :R%³¹Ïæ&ö%CI]x ‡¼¨ ep/ƒ ³¿ Ò àê!)!?a t‘ ®:º õ !0GYL¦ µ ÁÎÓâ'ô# @MT it$Œ ±¾ÔÚ#ã(EJQi4»ð1÷.)HX¡#¿+ã0À@ Kgv=…ÃZÈ#Y6©-ÅAó5:=O Ta gt†ž¤¬2¿òöú' 8ƒEÉÍá›é… Žœ ´¾¾Ü ›Õ©‘G–ÞßðƒÐÉT !.6!He!®!·! ¾!È!Ú!î! ""&"5;"q"*y"G¤"?ì"0,# ]#8g#! #Â#"Ù#"ü#$°($*Ù$%A%`&{€&Jü&G'X'gé'„Q(ÅÖ(óœ)O* à*!ê* + +*"+M+0h+ ™+§+¶+)¾+Cè+r,,BŸ.â.ç.ì.ñ.ö.û./// /k/{/!”/J¶/00%/0IU0þŸ0už1@2U2;[2-—2!Å2Wç2[?3›38®3:ç3"4%@4vf4Ý5*î5h6‚69š6 Ô6â697C:7~7˜7Y·7#858'M8Ou8Å8eØ8>9^9br9(Õ9þ9Ä:Ì:è:ù:;.*;'Y;L;UÎ;$< 9<(G<p<'ƒ<U«<=<=Q=Z=8u=®=.Ã=Rò=E>,Z>¥‡>b-??XŸ?Zø?…S@:Ù@EASZAZ®A\ B fC sCCœ‘C1.D1`Dd’D÷DÏüDÌEÂìEH¯HFøHX?I™˜I2J CJ-NJ|JƒJ •J¢J7»JóJKK,%KcRK¶K ºK9ÆKLL!MLœoL M.MJM=bM N³N3ÑNO[!O‰}OQz!Q*œR ÇR„ÒRWSªiS÷UF VSW?kWŽ«W:X QX ^XhX(X2ªX/ÝX Y4 YpUY ÆY9çYu!Z[—ZMóZA[|\[8Ù[2\?E\L…\ Ò\à\Eá]4'^½\^9aÑTam&b”b-®bàÜcÚ½d|˜eÉgªßhŠi,¦iÓiëi[ jfj0j²jÄj/äjOkwdk More powerful features with Smart Manager Pro!$112$135$149$179$479$499$75$90%1s%s%s to check Smart Manager Pro features and claim your discount.1 site (Annual)1 site (Lifetime)20 or 30 times quicker store management25% Off5 sites (Annual)5 sites (Lifetime) 🔥 Go ProPro Version Installed. The #1 and a powerful tool to manage stock, inventory from a single place. Super quick and super easy.A required Smart Manager file is missing. Can't continue. A whole afternoon’s work in secondsAcromAdd or Delete recordsAdditional DescriptionAdvanced SearchAdvanced Search using “AND†filterAdvanced Search using “OR†filterAllowAllow Free ShippingAllow, but notify customerAllowed EmailsAn upgrade for Smart Manager ProApart from WooCommerce post types like Products, Orders, Coupons, now you can manage %s. Be it Posts, Pages, Media, WordPress Users, etc. you can now manage everything using Smart Manager.AttributesAttributes: customAuto-updates are not available for this plugin.Best SellerBiggest Time SaverBrian BatcherBulk EditBulk Edit - %1s (only in %2s)Bulk Edit / Batch UpdateBuy NowBuy Smart Manager ProCan I import using Smart Manager?Catalog VisibilityClick hereClick to upgrade.Columns (Show / Hide / Sort)Coming soonCongratulations! You just unlocked %s on Smart Manager ProCost of GoodCoupon CodeCreate Column Sets / Custom ViewsCustomer provided noteDateDelete Permanently is disabled. Please contact store administrator for enabling the same.Delete RecordsDescriptionDo Not AllowDocsDocs & SupportDuplicate RecordsDuplicate all records in a single clickDuplicate single / multiple recordsEmail / CallError:Everything in Lite +Export CSVExport CSV (only in %s)Export all / Filtered records as CSVExternal UrlFAQ / Common ProblemsFAQ'sFeaturedFeatured Image updated successfullyFeaturesFilter / Search RecordsFollow steps listed here: %sFreeGet started with Smart ManagerGlad to have you onboard. We hope Smart Manager adds to your desired success ðŸ†Hey %1s, you just unlocked %2s on Smart Manager Pro!HiddenHow do I upgrade a Lite version to a Pro version?How to add columns to Smart Manager dashboard?How to manage any custom field of any custom plugin using Smart Manager?I can't find a way to do X...I found another plugin for my needsI only needed the plugin for a short periodI would happily pay five times for this product!I've got over 200 products and dreaded managing them one by one. Smart Manager Pro plugin lets me do this so much quicker. Probably 20 or 30 times quicker. It is an absolutely invaluable tool.ImportImportantIn stockIn the meanwhile, you can use Smart Manager. But before using actions like Inline EditingInline editingIt is a temporary deactivation. I am just debugging an issue.JeffKindly share what did not work for you / conflicting with which plugin so we can fix it...Know Smart ManagerMake sure you are using %s of Smart Manager. If still the issue persist, temporarily de-activate all plugins except WooCommerce/WPeCommerce & Smart Manager. Re-check the issue, if the issue still persists, contact us. If the issue goes away, re-activate other plugins one-by-one & re-checking the fields, to find out which plugin is conflicting.Manage Custom TaxonomiesManage WordPress User rolesManage your entire store from a single screenMassive time-savings and 10x productivity boost. Choice is yours!NameNoNo shipping classNoneOn backorderOtherOut of stockPlease mention...Please select an optionPricePricingPrint PDF invoicesPrint packing slips for WooCommerce orders in bulkProQtyQuestions? Need Help?Quick Feedback for Smart Manager pluginReduced RateRequest you to kindly de-activate and activate the Smart Manager plugin once and then have a recheck with the search functionality.SKUSearch results onlySee howSet to, Append, Prepend, Increase / Decrease by %, Increase / Decrease by number, Set datetime to, Set date to, Set time to, Upload images and many more...SettingsShipping onlyShop and search resultsShop onlyShow/Hide & Sort Data ColumnsShow/hide multiple data columns of your WooCommerce store data as per your requirements. Sort them in ascending or descending order. Smart Manager also gives you persistent state management.Simple SearchSimply enter the keyword you wish to filter records in the “Simple Search†field at the top of the grid (%s). If you need to have a more specific search result, then you can switch to “%s“ and then search.Skip & DeactivateSlugSmart Manager For WooCommerce – Stock Management, Bulk Edit & more...Smart Manager ProSmart Manager is a unique, revolutionary tool that gives you the power to boost your productivity by 10x in managing your WooCommerce store by using a familiar, single page, spreadsheet like interface. Smart Manager is actively developed. If you can't find your favorite feature (or have a suggestion) %s. We'd love to hear from you.Smart Manager is based on WooCommerce and WPeCommerce and the same e-commerce plugins sets the price/sales price of the variation parents automatically based on the price/sales price of its variations.Smart Manager is empty?Smart Manager search functionality not workingSmart Manager will allow you to manage custom field of any other plugin.StandardStatusStoreAppsStoreApps PluginsSubmit & DeactivateSubmit a reason to deactivateSubmit your querySupportSupported Post TypesTake a moment to let us know why you are deactivatingTaxableThank you for installing Smart Manager %s!The plugin is great, but I need specific feature that you don't supportThe plugin is not working / not compatible with another plugin.To show / hide columns in the Smart Manager, %s.UnlimitedUpdating variation parent price/sales price not working?Upto three records without savingUsage Limit Per CouponView Customer Lifetime Value (LTV)View our other WooCommerce pluginsWP forumWe recommend Smart Manager Pro to everyone who is looking for an extremely multi-functional store manager. The plugin is absolutely worth it. Never again without Smart Manager!What did you wanted to do in short period?What is that plugin name?What really sold me on Smart Manager Pro was Bulk Edit. My assistant does not have to do any complex math now (earlier, I always feared she would make mistakes)! With Smart Manager, she has more free time at hand, so I asked her to set up auto responder emails. The response was phenomenal. Repeat sales were up by 19.5%.What specific feature you need?WordPress Pages, Media, Users, SEO plugins, WooCommerce Subscriptions, Bookings, Memberships, Product Add-ons, Brands…allWordPress Posts, WooCommerce Products, Product Variations, Orders, CouponsYes - DeactivateYou can change / update multiple fields of the entire store OR for selected items by selecting multiple records and then click on Bulk Edit. %s.You can either spend hours of work in store management or use %s to accomplish the same within minutes.You can export all the records OR filtered records (%s) by simply clicking on the Export CSV button at the bottom right of the grid.You can quickly update your Products, Orders, Coupons and Posts from Smart Manager itself. This facilitates editing of multiple rows at a time instead of editing and saving each row separately, %s.You can simply select records you want to delete (check the header box if you want to delete all records) and click on the “Delete†icon. All the selected records will be deleted. You can even delete records by applying search filters. %s.You cannot import using Smart Manager. Use import functionality of WooCommerce.Zero Rateany custom post type in WordPressclick herecontact uscustom post types and their custom fields.https://www.storeapps.org/https://www.storeapps.org/product/smart-manager/is available.latest versionsee howusing Simple Search†or Advanced Searchyou will have to wait for the current background process to finish.PO-Revision-Date: 2022-03-17 04:14+0000 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=3; plural=(n % 10 == 1 && n % 100 != 11) ? 0 : ((n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 12 || n % 100 > 14)) ? 1 : 2); X-Generator: Loco https://localise.biz/ Language: ro_RU Project-Id-Version: Plugins - Smart Manager For WooCommerce – Stock Management, Bulk Edit & more… - Stable (latest release) Language-Team: Romanian (Russian Federation) Report-Msgid-Bugs-To: POT-Creation-Date: 2022-03-07 04:07+0000 Last-Translator: fg X-Loco-Version: 2.5.8; wp-5.9.1Более мощный функционал в Smart Manager Pro!$112$135$149$179$479$449$75$90%1s%s%s, чтобы узнать о возможноÑÑ‚ÑÑ… Smart Manager Pro и получить Ñкидку.1 Ñайт (на год)1 Ñайт (пожизненно)Управление магазином в 20 — 30 раз быÑтрееСкидка 25%5 Ñайтов (на год)5 Ñайтов (пожизненно) 🔥 Переходите на ProВерÑÐ¸Ñ Lite уÑтановлена. Мощный инÑтрумент â„–1 Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð°Ñами товаров магазина из одного меÑта. Супер-быÑтро и Ñупер-легко.ОтÑутÑтвует важный файл плагина Smart Manager. Ðевозможно продолжить.ÐŸÐ¾Ð»Ð´Ð½Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ за Ñчитанные ÑекундыAcromДобавление или удаление запиÑейДополнительное опиÑаниеРаÑширенный поиÑкРаÑширенный поиÑк Ñ Ð¸Ñпользованием фильтра «И»РаÑширенный поиÑк Ñ Ð¸Ñпользованием фильтра «ИЛИ»РазрешитьРазрешить беÑплатную доÑтавкуРазрешить, но уведомить клиентаДопуÑтимые Email'ыПереход на Smart Manager ProПомимо типов запиÑей WooCommerce, таких как товары, заказы и купоны, теперь Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ñтупны %s. Будь то запиÑи блога, Ñтраницы, файлы, пользователи WordPress и Ñ‚.д. Теперь Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Smart Manager можно управлÑÑ‚ÑŒ вÑем.ÐтрибутыÐтрибуты: произвольныеÐвтоматичеÑкие Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½ÐµÐ´Ð¾Ñтупны Ð´Ð»Ñ Ñтого плагина.Лидер Ð¿Ñ€Ð¾Ð´Ð°Ð¶Ð¡Ð°Ð¼Ð°Ñ Ð±Ð¾Ð»ÑŒÑˆÐ°Ñ ÑÐºÐ¾Ð½Ð¾Ð¼Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸Brian BatcherМаÑÑÐ¾Ð²Ð°Ñ Ð¿Ñ€Ð°Ð²ÐºÐ°ÐœÐ°ÑÑÐ¾Ð²Ð°Ñ Ð¿Ñ€Ð°Ð²ÐºÐ° - %1s (только в %2s)МаÑÑовое правка/пакетное обновлениеКупить ÑейчаÑКупить Smart Manager ProМогу ли Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ñ‚ÑŒ данные Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Smart Manager?ВидимоÑÑ‚ÑŒ каталогаÐажмите ÑюдаÐажмите Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÑ…Ð¾Ð´Ð°.Столбцы (отображение / Ñкрытие / Ñортировка)ОжидаетÑÑПоздравлÑем! Ð’Ñ‹ только что разблокировали %s в Smart Manager ProСтоимоÑÑ‚ÑŒ товараКод купонаСоздание наборов Ñтолбцов / произвольных отображенийПримечание от клиентаДатаВозможноÑÑ‚ÑŒ безвозвратного ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°. Ð”Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ð¿Ñ†Ð¸Ð¸ ÑвÑжитеÑÑŒ Ñ Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñтратором магазина.Удалить запиÑиОпиÑаниеÐе разрешатьДокументациÑÐ”Ð¾ÐºÑƒÐ¼ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð¸ поддержкаДублирование запиÑейДублирование вÑех запиÑей одним нажатиемДублирование одиночных/множеÑтвенных запиÑейEmail / ЗвонокОшибка:Ð’ÑÑ‘, что в беÑплатном +ЭкÑпорт CSVЭкÑпорт CSV (только в %s)ЭкÑпорт вÑех/отфильтрованных запиÑей в виде CSVВнешний URLЧаВо / раÑпроÑтранённые проблемыЧаВоРекомендуемыеИзображение уÑпешно обновленоФункционалФильтрациÑ/поиÑк запиÑейСледуйте инÑтрукциÑм, перечиÑленным здеÑÑŒ: %sБеÑплатныйÐачало работы Ñо Smart ManagerРады видеть Ð²Ð°Ñ Ð½Ð° борту. Мы надеемÑÑ, что Smart Manager поможет вам добитьÑÑ Ð¶ÐµÐ»Ð°ÐµÐ¼Ð¾Ð³Ð¾ уÑпеха ðŸ†ÐŸÑ€Ð¸Ð²ÐµÑ‚, %1s, вы только что разблокировали %2s в Smart Manager Pro!СкрытыйКак мне перейти Ñ Ð±ÐµÑплатной верÑии до верÑии Pro?Как добавить Ñтолбцы в панель ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Smart Manager?Как управлÑÑ‚ÑŒ любым произвольным полем любого плагина Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Smart Manager?Я не могу найти ÑпоÑоб Ñделать...Я нашёл другой плагин Ð´Ð»Ñ Ñвоих задач.Плагин мне нужен был только на короткое времÑЯ бы Ñ Ñ€Ð°Ð´Ð¾Ñтью заплатил пÑÑ‚ÑŒ раз за Ñтот продукт!У Ð¼ÐµÐ½Ñ Ð±Ð¾Ð»ÐµÐµ 200 товаров, и Ñ Ð±Ð¾ÑлÑÑ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÑÑ‚ÑŒ ими один за другим. Плагин Smart Manager Pro позволÑет мне делать Ñто намного быÑтрее. БыÑтрее, наверное, в 20 или 30 раз. Это абÑолютно беÑценный инÑтрумент.ИмпортВажно:Ð’ Ð½Ð°Ð»Ð¸Ñ‡Ð¸Ð¸Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ð²Ñ‹ можете иÑпользовать Smart Manager. Ðо прежде чем иÑпользовать такие дейÑтвиÑ, какВÑтроенное редактированиеВÑтроенное редактированиеЭто временное отключение. Я проÑто отлаживаю проблему.JeffПожалуйÑта, поделитеÑÑŒ тем, что у Ð²Ð°Ñ Ð½Ðµ работало/конфликтовало и Ñ ÐºÐ°ÐºÐ¸Ð¼ плагином, чтобы мы могли Ñто иÑправить...Узнайте о Smart ManagerУбедитеÑÑŒ, что вы иÑпользуете %s Smart Manager. ЕÑли проблема не уÑтранена, временно отключите вÑе другие плагины, кроме WooCommerce/WPeCommerce и Smart Manager. Еще раз проверьте наличие проблемы и еÑли она не иÑчезнет, ​​ÑвÑжитеÑÑŒ Ñ Ð½Ð°Ð¼Ð¸. ЕÑли проблема решитÑÑ, ​​повторно активируйте отключенные ранее плагины один за другим и отÑлеживайте проÑвление проблемы, чтобы узнать, какой плагин Ñоздаёт конфликт.Управление произвольными такÑономиÑмиУправление ролÑми пользователей WordPressУправлÑйте вÑем Ñвоим магазином Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ ÑÐºÑ€Ð°Ð½Ð°Ð—Ð½Ð°Ñ‡Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ ÑÐºÐ¾Ð½Ð¾Ð¼Ð¸Ñ Ð²Ñ€ÐµÐ¼ÐµÐ½Ð¸ и 10-кратное повышение производительноÑти. Ваш выбор!ÐазваниечтобыÐе указан клаÑÑ Ð´Ð¾ÑтавкиÐетПод заказДругоеÐет в наличииПожалуйÑта, напишите об Ñтом...Выберите вариантЦенаЦеныФормирование Ñчетов в PDFÐŸÐ°ÐºÐµÑ‚Ð½Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚ÑŒ упаковочных лиÑтов Ð´Ð»Ñ Ð·Ð°ÐºÐ°Ð·Ð¾Ð² WooCommerceProКол-воОÑталиÑÑŒ вопроÑÑ‹? Ðужна помощь?БыÑÑ‚Ñ€Ð°Ñ Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð°Ñ ÑвÑзь по плагину Smart ManagerÐŸÐ¾Ð½Ð¸Ð¶ÐµÐ½Ð½Ð°Ñ ÑтавкаДеактивируйте и активируйте плагин Smart Manager, а затем ещё раз проверьте функцию поиÑка.ÐртикулТолько результаты поиÑкаСмотрите какУÑтановка в, дополнение, Ð¿Ñ€ÐµÐ´Ð²Ð°Ñ€Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ, увеличение/уменьшение на %, увеличение/уменьшение на чиÑло, уÑтановка времени и даты, загрузка изображений и многое другое...ÐаÑтройкиТолько доÑтавкаМагазин и результаты поиÑкаТолько магазинОтображение/Ñкрытие и Ñортировка Ñтолбцов данныхОтображение/Ñкрытие неÑкольких Ñтолбцов данных вашего магазина WooCommerce в ÑоответÑтвии Ñ Ð²Ð°ÑˆÐ¸Ð¼Ð¸ требованиÑми. Сортируйте их по возраÑтанию или убыванию. Smart Manager также обеÑпечивает поÑтоÑнное управление ÑоÑтоÑнием.ПроÑтой поиÑкПроÑто введите ключевое Ñлово, по которому вы хотите отфильтровать запиÑи, в поле проÑтого поиÑка вверху Ñетки (%s). ЕÑли нужен более конкретный результат поиÑка, переключитеÑÑŒ на «%s» и затем выполнить поиÑк.ПропуÑтить и отключитьЯрлыкSmart Manager For WooCommerce - управление запаÑами, маÑÑÐ¾Ð²Ð°Ñ Ð¿Ñ€Ð°Ð²ÐºÐ° и многое другое...Smart Manager ProSmart Manager - Ñто уникальный революционный инÑтрумент, дающий возможноÑÑ‚ÑŒ в 10 раз повыÑить ÑффективноÑÑ‚ÑŒ ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼Ð°Ð³Ð°Ð·Ð¸Ð½Ð¾Ð¼ WooCommerce Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ знакомого одноÑтраничного интерфейÑа, похожего на документ Ñлектронной таблицы.Smart Manager активно развиваетÑÑ. ЕÑли вы не можете найти в нём нужную функцию (или у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ предложение) %s. Мы хотели бы узнать ваше мнение.Smart Manager работает на базе WooCommerce и WPeCommerce, и Ñто плагин магазина автоматичеÑки уÑтанавливают цену/цену раÑпродажи родительÑких товаров на оÑнове цены/цены Ñо Ñкидкой его вариаций.Smart Manager пуÑÑ‚?Ð¤ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð¸Ñка Smart Manager не работаетSmart Manager позволит вам управлÑÑ‚ÑŒ наÑтраиваемыми полÑми любого другого плагина.СтандартныйСтатуÑStoreAppsПлагины StoreAppsПрименить и отключитьУкажите причину отключениÑотправьте нам Ñвой запроÑПоддержкаПоддерживаемые типы запиÑейÐайдите минутку, чтобы Ñообщить нам, почему вы отключаете егоÐалогооблагаемыйСпаÑибо за уÑтановку Smart Manager, %s!Плагин отличный, но мне нужна оÑÐ¾Ð±Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ, которой у него нет.Плагин не работает/неÑовмеÑтим Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ плагином.Чтобы показать/Ñкрыть Ñтолбцы в Smart Manager, %s.ÐеограниченноÐе работает обновление родительÑкой цены вариации/цены раÑпродажи?До трёх запиÑей без ÑохранениÑЛимит иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÑƒÐ¿Ð¾Ð½Ð°Ð¡Ñ‡Ñ‘Ñ‚Ñ‡Ð¸Ðº общей ценноÑти клиента (LTV)ПоÑмотрите другие наши плагины Ð´Ð»Ñ WooCommerceWP-форумМы рекомендуем Smart Manager Pro вÑем, кто ищет чрезвычайно многофункционального менеджера магазина. Плагин того Ñтоит. Ðикогда больше без Smart Manager!Что вы хотели Ñделать в короткий Ñрок?Что значит название плагина?Что дейÑтвительно понравилоÑÑŒ мне в Smart Manager Pro, так Ñто маÑÑовое редактирование. Моей помощнице теперь не нужно заниматьÑÑ Ñложной математикой (раньше Ñ Ð²Ñегда боÑлÑÑ, что она Ñделает ошибки)! Ð‘Ð»Ð°Ð³Ð¾Ð´Ð°Ñ€Ñ Smart Manager у нее поÑвлÑетÑÑ Ð±Ð¾Ð»ÑŒÑˆÐµ Ñвободного времени, поÑтому Ñ Ð¿Ð¾Ð¿Ñ€Ð¾Ñил её наÑтроить автоответчик на Ñлектронную почту. Ð ÐµÐ°ÐºÑ†Ð¸Ñ Ð±Ñ‹Ð»Ð° феноменальной. Повторные продажи выроÑли на 19,5%.ÐšÐ°ÐºÐ°Ñ Ð¾ÑÐ¾Ð±Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²Ð°Ð¼ нужна?Страницы WordPress, медиафайлы, пользователи, SEO-плагины, подпиÑки WooCommerce, заказы, членÑтво, аддоны товаров, бренды… вÑеЗапиÑи WordPress, товары WooCommerce, вариации товаров, заказы, купоныДа - отключитьВы можете маÑÑово изменÑÑ‚ÑŒ/обновлÑÑ‚ÑŒ определённые Ð¿Ð¾Ð»Ñ Ð²Ñех запиÑей магазина ИЛИ конкретной группы, выделив неÑколько запиÑей и нажав на кнопку маÑÑовой правки. %s.Ð’Ñ‹ можете потратить чаÑÑ‹ работы на управление магазином или иÑпользовать %s, чтобы Ñделать то же Ñамое за Ñчитанные минуты.Ð’Ñ‹ можете ÑкÑпортировать вÑе ИЛИ отфильтрованные запиÑи (%s), проÑто нажав кнопку ÑкÑпорта CSV в правом нижнем углу Ñетки.Ð’Ñ‹ можете быÑтро обновлÑÑ‚ÑŒ Ñвои товары, заказы, купоны и ÑÐ¾Ð¾Ð±Ñ‰ÐµÐ½Ð¸Ñ Ð¸Ð· Ñамого Smart Manager. Это упрощает одновременное редактирование неÑкольких Ñтрок вмеÑто Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¸ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ñтроки отдельно, %s.Ð’Ñ‹ можете проÑто выбрать запиÑи, которые надо удалить (уÑтановите выделение в заголовке полÑ, еÑли надо удалить вÑе запиÑи), и жмите на значок удалениÑ. Ð’Ñе выбранные запиÑи будут удалены. Также можно удалÑÑ‚ÑŒ группы запиÑей, применÑÑ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ñ‹ поиÑка. %sÐ’Ñ‹ не можете оÑущеÑтвить такой импорт Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Smart Manager. ИÑпользуйте механизм импорта WooCommerce.ÐÑƒÐ»ÐµÐ²Ð°Ñ Ñтавкалюбые типы запиÑей WordPressнажмите ÑюдаÑвÑжитеÑÑŒ Ñ Ð½Ð°Ð¼Ð¸Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð»ÑŒÐ½Ñ‹Ðµ типы запиÑей и их произвольные полÑ.https://www.storeapps.org/https://www.storeapps.org/product/smart-manager/доÑтупен.поÑледнÑÑ Ð²ÐµÑ€ÑиÑÑмотрите как Ñто Ñ€Ð°Ð±Ð¾Ñ‚Ð°ÐµÑ‚Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ проÑтого или раÑширенного поиÑкавам необходимо дождатьÑÑ Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ фонового процеÑÑа.languages/smart-manager-for-wp-e-commerce-pt_BR.po000064400000201427147600337620016054 0ustar00msgid "" msgstr "" "Project-Id-Version: Smart Manager 4.2.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-04-20 14:04:35+00:00\n" "PO-Revision-Date: 2022-03-17 04:14+0000\n" "Last-Translator: Mansi \n" "Language-Team: Portuguese (Brazil)\n" "Language: pt_BR\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-SourceCharset: utf-8\n" "X-Poedit-KeywordsList: _:1;gettext:1;dgettext:2;ngettext:1,2;dngettext:2,3;" "__:1;_e:1;_c:1;_n:1,2;_n_noop:1,2;_nc:1,2;__ngettext:1,2;__ngettext_noop:1,2;" "_x:1,2c;_ex:1,2c;_nx:1,2,4c;_nx_noop:1,2,3c;_n_js:1,2;_nx_js:1,2,3c;" "esc_attr__:1;esc_html__:1;esc_attr_e:1;esc_html_e:1;esc_attr_x:1,2c;" "esc_html_x:1,2c;comments_number_link:2,3;t:1;st:1;trans:1;transChoice:1,2\n" "X-Poedit-Basepath: ../\n" "X-Poedit-SearchPath-0: .\n" "X-Loco-Target-Locale: pt_BR\n" "X-Generator: Loco https://localise.biz/" #: classes/class-smart-manager-pricing.php:405 msgid " More powerful features with Smart Manager Pro!" msgstr "" #: classes/class-smart-manager-pricing.php:351 msgid "$112" msgstr "" #: classes/class-smart-manager-pricing.php:363 msgid "$135" msgstr "" #: classes/class-smart-manager-pricing.php:350 msgid "$149" msgstr "" #: classes/class-smart-manager-pricing.php:362 msgid "$179" msgstr "" #: classes/class-smart-manager-pricing.php:374 msgid "$360" msgstr "" #: classes/class-smart-manager-pricing.php:385 msgid "$375" msgstr "" #: classes/class-smart-manager-pricing.php:373 msgid "$479" msgstr "" #: classes/class-smart-manager-pricing.php:384 msgid "$499" msgstr "" #: classes/class-smart-manager-pricing.php:351 msgid "$75" msgstr "" #: classes/class-smart-manager-pricing.php:363 msgid "$90" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:165 msgid "% Completed" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:143 #, php-format msgid "% completed" msgstr "" #. 1. Error title 2. The bulk process #: pro/classes/class-smart-manager-pro-background-updater.php:307 #, php-format msgid "" "%1$s: The %2$s process has stopped. Please review the Smart Manager " "dashboard to check the status." msgstr "" #: class-smart-manager.php:1460 #, php-format msgid "%1s" msgstr "" #: classes/class-smart-manager-admin-welcome.php:429 #, php-format msgid "%s" msgstr "" #: class-smart-manager.php:862 #, php-format msgid "%s to check Smart Manager Pro features and claim your discount." msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:323 msgid "--:--:--" msgstr "" #: classes/class-smart-manager-pricing.php:348 msgid "1 site (Annual)" msgstr "" #: classes/class-smart-manager-pricing.php:371 msgid "1 site (Lifetime)" msgstr "" #: classes/class-smart-manager-pricing.php:667 msgid "20 or 30 times quicker store management" msgstr "" #: class-smart-manager.php:861 classes/class-smart-manager-pricing.php:340 msgid "25% Off" msgstr "" #: classes/class-smart-manager-pricing.php:360 msgid "5 sites (Annual)" msgstr "" #: classes/class-smart-manager-pricing.php:382 msgid "5 sites (Lifetime)" msgstr "" #: class-smart-manager.php:665 msgid " 🔥 Go Pro" msgstr "" #. Description of the plugin msgid "" "Pro Version Installed. The #1 and a powerful tool to manage " "stock, inventory from a single place. Super quick and super easy." msgstr "" #: class-smart-manager.php:1570 msgid "A required Smart Manager file is missing. Can't continue. " msgstr "" "Um arquivo do Smart Manager está faltando. Não será possível continuar." #: classes/class-smart-manager-pricing.php:659 msgid "A whole afternoon’s work in seconds" msgstr "" #: classes/class-smart-manager-pricing.php:662 #, fuzzy #| msgid "From" msgid "Acrom" msgstr "De" #: pro/templates/email.php:43 msgid "Action" msgstr "" #: pro/assets/js/smart-manager-product.js:154 pro/assets/js/smart-manager.js:37 msgctxt "action operator" msgid "add to" msgstr "" #: pro/assets/js/smart-manager.js:25 pro/assets/js/smart-manager.js:47 msgctxt "action operator" msgid "copy from" msgstr "" #: pro/assets/js/smart-manager-product.js:155 pro/assets/js/smart-manager.js:37 msgctxt "action operator" msgid "remove from" msgstr "" #: pro/assets/js/smart-manager.js:39 msgctxt "action operator" msgid "search & replace" msgstr "" #: pro/assets/js/smart-manager-product.js:153 pro/assets/js/smart-manager.js:46 #: pro/assets/js/smart-manager.js:891 pro/assets/js/smart-manager.js:1027 msgctxt "action operator" msgid "set to" msgstr "" #: assets/js/smart-manager-product.js:229 msgctxt "add attribute button" msgid "Add" msgstr "" #: classes/class-smart-manager-pricing.php:451 msgid "Add or Delete records" msgstr "" #: classes/class-smart-manager-product.php:958 msgid "Additional Description" msgstr "Descrição Adicional" #: pro/assets/js/smart-manager.js:28 msgctxt "additional operator" msgid "decrease by" msgstr "" #: pro/assets/js/smart-manager.js:28 msgctxt "additional operator" msgid "increase by" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:326 msgid "Address to look in" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:125 msgid "Adjacent Buffering?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:295 msgid "Advanced Search" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:42 #, javascript-format msgctxt "advanced search conditions" msgid "%d condition%s" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:42 msgctxt "advanced search conditions" msgid "s" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:155 msgctxt "advanced search content" msgid "condition groups pass" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:148 msgctxt "advanced search content" msgid "When" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:153 msgctxt "advanced search option" msgid "all" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:152 msgctxt "advanced search option" msgid "at least one" msgstr "" #: classes/class-smart-manager-pricing.php:484 msgid "Advanced Search using “AND†filter" msgstr "" #: classes/class-smart-manager-pricing.php:495 msgid "Advanced Search using “OR†filter" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:294 msgid "All" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:237 msgid "All blocks being booked" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:227 msgid "All dates are..." msgstr "" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:50 #: pro/assets/js/smart-manager.js:868 msgid "All Items In Search Results" msgstr "" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:50 #: pro/assets/js/smart-manager.js:868 msgid "All Items In Store" msgstr "" #: classes/class-smart-manager-product.php:912 msgid "Allow" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:136 msgid "Allow Combination" msgstr "" #: classes/class-smart-manager-shop-coupon.php:123 msgid "Allow Free Shipping" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:252 msgid "Allow free shipping" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:132 #, php-format msgid "Allow search engines to show this %1$s in search results?" msgstr "" #: classes/class-smart-manager-product.php:911 msgid "Allow, but notify customer" msgstr "" #: classes/class-smart-manager-shop-coupon.php:119 msgid "Allowed Emails" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:291 msgid "Allowed emails" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:213 msgid "Allowed user roles" msgstr "" #: class-smart-manager.php:1468 msgid "An upgrade for Smart Manager Pro" msgstr "Uma atualização do Smart Manager Pro" #: classes/class-smart-manager-admin-welcome.php:281 msgid "any custom post type in WordPress" msgstr "" #: classes/class-smart-manager-admin-welcome.php:281 #, php-format msgid "" "Apart from WooCommerce post types like Products, Orders, Coupons, now you " "can manage %s. Be it Posts, Pages, Media, WordPress Users, etc. you can now " "manage everything using Smart Manager." msgstr "" #. 1. The bulk process #: pro/classes/class-smart-manager-pro-background-updater.php:348 #, php-format msgid "Are you sure you want to stop the %s process? Click OK to stop." msgstr "" #: assets/js/smart-manager-product.js:302 msgctxt "attribute button" msgid "Select all" msgstr "" #: assets/js/smart-manager-product.js:303 msgctxt "attribute button" msgid "Select none" msgstr "" #: assets/js/smart-manager-product.js:121 msgctxt "attribute list" msgid "Custom product attribute" msgstr "" #: pro/assets/js/smart-manager-product.js:40 msgctxt "attribute operator" msgid "Add Attribute" msgstr "" #: pro/assets/js/smart-manager-product.js:49 msgctxt "attribute operator" msgid "Remove Attribute" msgstr "" #: assets/js/smart-manager-product.js:283 msgctxt "attribute variation" msgid "Used for variations" msgstr "" #: assets/js/smart-manager-product.js:280 msgctxt "attribute visibility" msgid "Visible on the product page" msgstr "" #: classes/class-smart-manager-product.php:1068 msgid "Attributes" msgstr "" #: classes/class-smart-manager-product.php:1101 msgid "Attributes: custom" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:253 msgid "Auto Generate Coupon" msgstr "" #: class-smart-manager.php:1649 msgid "Auto-updates are not available for this plugin." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:222 msgid "Automatically assigned" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:229 msgid "available by default" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:264 msgid "Back to Smart Manager" msgstr "" #: pro/assets/js/smart-manager-product.js:216 msgctxt "batch update option" msgid "All" msgstr "" #: pro/templates/email.php:39 msgid "Below are the lists of updates done:" msgstr "" #: classes/class-smart-manager-pricing.php:359 msgid "Best Seller" msgstr "" #: classes/class-smart-manager-admin-welcome.php:333 msgid "Biggest Time Saver" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:327 msgid "Billing" msgstr "" #: pro/templates/order-invoice.php:144 msgid "Billing Address" msgstr "Endereço de Faturamento" #: pro/classes/class-smart-manager-pro-product.php:252 #, fuzzy #| msgid "Billing Region" msgid "Billing Period" msgstr "Região Faturamento" #: pro/classes/class-smart-manager-pro-wc-booking.php:171 msgid "Booked Product" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:80 msgid "Booking can be cancelled until" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:196 msgid "Booking can be cancelled until (Unit)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:77 msgid "Booking duration" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:183 msgid "Booking Duration (Type)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:191 msgid "Booking Duration (Unit)" msgstr "" #: assets/js/smart-manager.js:987 #, javascript-format msgctxt "bottom bar" msgid "%d %s loaded" msgstr "" #: assets/js/smart-manager.js:1005 #, javascript-format msgctxt "bottom bar" msgid "%d of %d %s loaded" msgstr "" #: assets/js/smart-manager.js:980 assets/js/smart-manager.js:1005 #, javascript-format msgctxt "bottom bar" msgid "No %s Found" msgstr "" #: classes/class-smart-manager-pricing.php:670 msgid "Brian Batcher" msgstr "" #: class-smart-manager.php:1149 #: classes/class-smart-manager-admin-welcome.php:331 msgid "Bulk Edit" msgstr "" #: classes/class-smart-manager-admin-welcome.php:333 #, php-format msgid "Bulk Edit - %1s (only in %2s)" msgstr "" #: classes/class-smart-manager-pricing.php:506 msgid "Bulk Edit / Batch Update" msgstr "" #: assets/js/smart-manager.js:1705 msgctxt "button" msgid "Add" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:50 msgctxt "button" msgid "Add a condition" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:66 msgctxt "button" msgid "Add another group" msgstr "" #: assets/js/smart-manager.js:1713 msgctxt "button" msgid "Add images to product gallery" msgstr "" #: assets/js/smart-manager.js:396 msgctxt "button" msgid "Add Row" msgstr "" #: assets/js/smart-manager.js:1714 msgctxt "button" msgid "Add to gallery" msgstr "" #: assets/js/smart-manager.js:382 msgctxt "button" msgid "Bulk Edit" msgstr "" #: assets/js/smart-manager.js:2436 msgctxt "button" msgid "Cancel" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:118 #: src/views/BulkEditDialog.js:112 msgctxt "button" msgid "Clear" msgstr "" #: assets/js/smart-manager.js:438 msgctxt "button" msgid "Columns" msgstr "" #: assets/js/smart-manager.js:2435 msgctxt "button" msgid "Create" msgstr "" #: assets/js/smart-manager.js:412 msgctxt "button" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:402 msgctxt "button" msgid "Duplicate" msgstr "" #: assets/js/smart-manager.js:424 msgctxt "button" msgid "Export CSV" msgstr "" #: assets/js/smart-manager.js:2579 msgctxt "button" msgid "Get Pro at 25% OFF" msgstr "" #: assets/js/smart-manager.js:175 #, javascript-format msgctxt "button" msgid "Load More %s" msgstr "" #: assets/js/smart-manager.js:3151 msgctxt "button" msgid "No" msgstr "" #: assets/js/smart-manager-product.js:243 assets/js/smart-manager.js:1092 msgctxt "button" msgid "OK" msgstr "" #: assets/js/smart-manager.js:430 msgctxt "button" msgid "Print Invoice" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:74 msgctxt "button" msgid "Remove this group" msgstr "" #: pro/assets/js/smart-manager.js:968 msgctxt "button" msgid "Reset" msgstr "" #: assets/js/smart-manager.js:390 msgctxt "button" msgid "Save" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:99 msgctxt "button" msgid "Search" msgstr "" #: assets/js/smart-manager-product.js:199 msgctxt "button" msgid "Select all" msgstr "" #: assets/js/smart-manager-product.js:200 msgctxt "button" msgid "Select none" msgstr "" #: assets/js/admin.js:1 assets/js/smart-manager.js:2744 #: src/views/BulkEditDialog.js:98 pro/assets/js/smart-manager.js:963 msgctxt "button" msgid "Update" msgstr "" #: assets/js/smart-manager.js:3134 msgctxt "button" msgid "Yes" msgstr "" #: classes/class-smart-manager-pricing.php:355 #: classes/class-smart-manager-pricing.php:367 #: classes/class-smart-manager-pricing.php:378 #: classes/class-smart-manager-pricing.php:389 msgid "Buy Now" msgstr "" #: classes/class-smart-manager-pricing.php:648 msgid "Buy Smart Manager Pro" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:144 msgid "Calculate unit prices automatically" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:214 msgid "Calendar always visible" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:211 msgid "Calendar display mode" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:118 msgid "Can be cancelled?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:405 msgid "Can I import using Smart Manager?" msgstr "" #: classes/class-smart-manager-product.php:1147 msgid "Catalog Visibility" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:139 msgid "Category group-of rules: Exclude" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:235 msgid "Check rules against..." msgstr "" #: assets/js/smart-manager-product.js:285 msgctxt "checkbox list" msgid "Position:" msgstr "" #: class-smart-manager.php:862 msgid "Click here" msgstr "" #: classes/class-smart-manager-admin-welcome.php:402 msgid "click here" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:423 msgid "Click to copy" msgstr "" #: class-smart-manager.php:1468 msgid "Click to upgrade." msgstr "Clique aqui para atualizar." #: classes/class-smart-manager-pricing.php:462 msgid "Columns (Show / Hide / Sort)" msgstr "" #: classes/class-smart-manager-pricing.php:612 #: classes/class-smart-manager-pricing.php:623 msgid "Coming soon" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:335 msgid "Company logo:" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:337 msgid "completed Successfully" msgstr "" #: pro/classes/class-smart-manager-pro-acf-field-group.php:43 #: pro/classes/class-smart-manager-pro-acf-field.php:43 msgid "Config Options" msgstr "" #: classes/class-smart-manager-pricing.php:340 #, php-format msgid "Congratulations! You just unlocked %s on Smart Manager Pro" msgstr "" #: classes/class-smart-manager-admin-welcome.php:414 msgid "contact us" msgstr "" #: classes/class-smart-manager-shop-order.php:440 #: pro/classes/class-smart-manager-pro-product.php:107 msgid "Cost of Good" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:122 msgid "Count persons as bookings" msgstr "" #: classes/class-smart-manager-shop-coupon.php:115 msgid "Coupon Code" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:333 msgid "Coupon expiry date" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:338 msgid "Coupon expiry time" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:255 msgid "Coupon Is Visible Storewide" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:354 msgid "Coupon shareable link" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:242 msgid "Coupon Title Prefix" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:243 msgid "Coupon Title Suffix" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:240 msgid "Coupon Validity" msgstr "" #: classes/class-smart-manager-pricing.php:551 msgid "Create Column Sets / Custom Views" msgstr "" #: classes/class-smart-manager-pricing.php:433 msgid "custom post types and their custom fields." msgstr "" #: assets/js/smart-manager.js:364 msgctxt "custom view button" msgid "Create" msgstr "" #: assets/js/smart-manager.js:366 msgctxt "custom view button" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:365 msgctxt "custom view button" msgid "Update" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:186 msgid "Customer defined blocks of" msgstr "" #: classes/class-smart-manager-shop-order.php:164 msgid "Customer provided note" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:221 msgid "Customer selected" msgstr "" #: assets/js/smart-manager.js:315 msgctxt "dashboard groups" msgid "All post types" msgstr "" #: assets/js/smart-manager.js:326 msgctxt "dashboard groups" msgid "All saved views" msgstr "" #: assets/js/smart-manager.js:299 msgctxt "dashboard groups" msgid "Common post types" msgstr "" #: assets/js/smart-manager.js:310 msgctxt "dashboard groups" msgid "Recently used views" msgstr "" #: classes/class-smart-manager-shop-order.php:160 #: pro/classes/class-smart-manager-pro-shop-subscription.php:175 #, fuzzy #| msgid "State" msgid "Date" msgstr "Estado" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "days" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "months" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "weeks" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "years" msgstr "" #: pro/assets/js/smart-manager.js:34 msgctxt "date operator" msgid "set date to" msgstr "" #: pro/assets/js/smart-manager.js:33 msgctxt "datetime operator" msgid "set date to" msgstr "" #: pro/assets/js/smart-manager.js:33 msgctxt "datetime operator" msgid "set datetime to" msgstr "" #: pro/assets/js/smart-manager.js:33 msgctxt "datetime operator" msgid "set time to" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:149 msgid "Day(s)" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:133 msgid "Default" msgstr "" #: assets/js/smart-manager.js:415 msgctxt "delete button" msgid "Delete Permanently" msgstr "" #: assets/js/smart-manager.js:414 msgctxt "delete button" msgid "Move to Trash" msgstr "" #: class-smart-manager.php:1118 msgid "" "Delete Permanently is disabled. Please contact store administrator for " "enabling the same." msgstr "" #: class-smart-manager.php:1149 #: classes/class-smart-manager-admin-welcome.php:319 msgid "Delete Records" msgstr "" #: classes/class-smart-manager-product.php:956 #: classes/class-smart-manager-shop-coupon.php:117 msgid "Description" msgstr "Descrição" #: assets/js/smart-manager.js:2719 msgctxt "description" msgid "" "Drag & drop the enabled columns to the right side to disable them. Drag & " "drop the disabled columns to the left side to enable them." msgstr "" #: assets/js/smart-manager.js:2721 msgctxt "description" msgid "Drag the columns to the top or bottom to sort them." msgstr "" #: pro/assets/js/smart-manager.js:603 msgctxt "description" msgid "" "Marking this view public will make it available to all users having access " "to the Smart Manager." msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:248 msgid "Disable Email Restriction" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:213 msgid "Display calendar on click" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:244 msgid "Display message" msgstr "" #: classes/class-smart-manager-product.php:910 msgid "Do Not Allow" msgstr "" #: classes/class-smart-manager-admin-welcome.php:254 msgid "Docs" msgstr "" #: class-smart-manager.php:672 msgid "Docs & Support" msgstr "" #: assets/js/smart-manager.js:101 msgctxt "dropdown operator" msgid "is" msgstr "" #: assets/js/smart-manager.js:101 msgctxt "dropdown operator" msgid "is not" msgstr "" #: classes/class-smart-manager-pricing.php:540 msgid "Duplicate all records in a single click" msgstr "" #: assets/js/smart-manager.js:405 msgctxt "duplicate button" msgid "Entire Store" msgstr "" #: assets/js/smart-manager.js:404 msgctxt "duplicate button" msgid "Selected Records" msgstr "" #: class-smart-manager.php:1149 msgid "Duplicate Records" msgstr "" #: classes/class-smart-manager-pricing.php:529 msgid "Duplicate single / multiple records" msgstr "" #: pro/templates/email.php:7 msgid "Duplicated" msgstr "" #: classes/class-smart-manager-pricing.php:636 msgid "Email / Call" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:1257 msgid "Email already exists. Please enter another email." msgstr "" #: pro/classes/class-smart-manager-pro-user.php:1251 msgid "Email cannot be empty" msgstr "" #: pro/templates/order-invoice.php:158 msgid "Email id" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:251 msgid "Email message?" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:116 msgid "Enable Calendar Range Picker?" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:130 msgid "Enable Min Max Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:123 msgid "Enable person types" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:307 msgid "Error" msgstr "" #: class-smart-manager.php:1585 msgid "Error:" msgstr "Erro:" #: classes/class-smart-manager-pricing.php:431 msgid "Everything in Lite +" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:226 msgid "Exclude Attributes" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:211 msgid "Exclude categories" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:231 msgid "Exclude products" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:249 msgid "Exclude sale items" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:257 msgid "Expire After" msgstr "" #: pro/classes/class-smart-manager-pro-wc-user-membership.php:169 #: pro/classes/class-smart-manager-pro-wc-user-membership.php:170 msgid "Expires" msgstr "" #: classes/class-smart-manager-pricing.php:518 msgid "Export all / Filtered records as CSV" msgstr "" #: classes/class-smart-manager-admin-welcome.php:347 msgid "Export CSV" msgstr "Exportar CSV" #: classes/class-smart-manager-admin-welcome.php:349 #, php-format msgid "Export CSV (only in %s)" msgstr "" #: classes/class-smart-manager-product.php:972 msgid "External Url" msgstr "" #: classes/class-smart-manager-admin-welcome.php:380 msgid "FAQ / Common Problems" msgstr "" #: classes/class-smart-manager-admin-welcome.php:264 msgid "FAQ's" msgstr "" #: classes/class-smart-manager-product.php:1194 msgid "Featured" msgstr "" #: classes/class-smart-manager-product.php:2018 #: classes/class-smart-manager-product.php:2021 msgid "Featured Image updated successfully" msgstr "" #: classes/class-smart-manager-pricing.php:410 msgid "Features" msgstr "" #: pro/templates/email.php:42 msgid "Field" msgstr "" #: classes/class-smart-manager-admin-welcome.php:290 msgid "Filter / Search Records" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:185 msgid "Fixed blocks of" msgstr "" #: classes/class-smart-manager-admin-welcome.php:419 #, php-format msgid "Follow steps listed here: %s" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:337 #, fuzzy #| msgid "Or" msgid "for" msgstr "Ou" #: pro/classes/class-smart-manager-pro-shop-coupon.php:256 msgid "For new user only?" msgstr "" #: classes/class-smart-manager-pricing.php:413 msgid "Free" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:105 msgid "Free Trial" msgstr "" #: classes/class-smart-manager-admin-welcome.php:236 #: classes/class-smart-manager-admin-welcome.php:362 msgid "Get started with Smart Manager" msgstr "" #: classes/class-smart-manager-admin-welcome.php:232 msgid "" "Glad to have you onboard. We hope Smart Manager adds to your desired success " "ðŸ†" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:38 msgctxt "group content" msgid "of the following conditions is true." msgstr "" #: pro/classes/class-smart-manager-pro-acf-field.php:45 msgid "Group Id" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:90 msgid "Group of..." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:119 msgid "Has persons" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:120 msgid "Has resources" msgstr "" #: assets/js/smart-manager.js:2732 msgctxt "heading" msgid "Disabled" msgstr "" #: assets/js/smart-manager.js:2725 msgctxt "heading" msgid "Enabled" msgstr "" #: class-smart-manager.php:861 #, php-format msgid "Hey %1s, you just unlocked %2s on Smart Manager Pro!" msgstr "" #: pro/templates/email.php:35 msgid "Hi there!" msgstr "" #: classes/class-smart-manager-product.php:736 msgid "Hidden" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:150 msgid "Hour(s)" msgstr "" #: classes/class-smart-manager-admin-welcome.php:418 msgid "How do I upgrade a Lite version to a Pro version?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:401 msgid "How to add columns to Smart Manager dashboard?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:397 msgid "" "How to manage any custom field of any custom plugin using Smart Manager?" msgstr "" #. Author URI of the plugin msgid "https://www.storeapps.org/" msgstr "" #. URI of the plugin msgid "https://www.storeapps.org/product/smart-manager/" msgstr "" #: classes/class-smart-manager-admin-welcome.php:413 msgid "I can't find a way to do X..." msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:118 msgid "I found another plugin for my needs" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:106 msgid "I only needed the plugin for a short period" msgstr "" #: classes/class-smart-manager-pricing.php:397 msgid "I would happily pay five times for this product!" msgstr "" #: classes/class-smart-manager-pricing.php:669 msgid "" "I've got over 200 products and dreaded managing them one by one. Smart " "Manager Pro plugin lets me do this so much quicker. Probably 20 or 30 times " "quicker. It is an absolutely invaluable tool." msgstr "" #: pro/templates/email.php:62 msgid "If you like" msgstr "" #: classes/class-smart-manager-pricing.php:606 msgid "Import" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:315 msgid "Important" msgstr "" #: classes/class-smart-manager-product.php:862 msgid "In stock" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:317 msgid "in the background. You will be notified on" msgstr "" #: class-smart-manager.php:1149 msgid "" "In the meanwhile, you can use Smart Manager. But before using actions like " msgstr "" #: pro/classes/class-smart-manager-pro-base.php:34 msgid "Index" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:250 msgid "Individual use only" msgstr "" #: classes/class-smart-manager-admin-welcome.php:299 msgid "Inline Editing" msgstr "" #: classes/class-smart-manager-pricing.php:438 msgid "Inline editing" msgstr "" #: class-smart-manager.php:1468 msgid "is available." msgstr "está disponível." #: pro/classes/class-smart-manager-pro-shop-coupon.php:254 msgid "Is Pick Price of Product" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:124 msgid "It is a temporary deactivation. I am just debugging an issue." msgstr "" #: classes/class-smart-manager-pricing.php:400 msgid "Jeff" msgstr "" #: pro/classes/class-smart-manager-pro-acf-field-group.php:44 #: pro/classes/class-smart-manager-pro-acf-field.php:44 msgid "Key" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:102 msgid "" "Kindly share what did not work for you / conflicting with which plugin so we " "can fix it..." msgstr "" #: classes/class-smart-manager-admin-welcome.php:261 msgid "Know Smart Manager" msgstr "" #: pro/classes/class-smart-manager-pro-acf-field-group.php:41 #: pro/classes/class-smart-manager-pro-acf-field.php:41 msgid "Label" msgstr "" #: classes/class-smart-manager-admin-welcome.php:386 #: classes/class-smart-manager-admin-welcome.php:419 msgid "latest version" msgstr "" #: class-smart-manager.php:1447 msgid "LITE" msgstr "" #: classes/class-smart-manager-admin-welcome.php:386 #, php-format msgid "" "Make sure you are using %s of Smart Manager. If still the issue persist, " "temporarily de-activate all plugins except WooCommerce/WPeCommerce & Smart " "Manager. Re-check the issue, if the issue still persists, contact us. If the " "issue goes away, re-activate other plugins one-by-one & re-checking the " "fields, to find out which plugin is conflicting." msgstr "" #: classes/class-smart-manager-pricing.php:617 msgid "Manage Custom Taxonomies" msgstr "" #: classes/class-smart-manager-pricing.php:573 msgid "Manage WordPress User roles" msgstr "" #: classes/class-smart-manager-admin-welcome.php:287 msgid "Manage your entire store from a single screen" msgstr "" #: classes/class-smart-manager-pricing.php:677 msgid "Massive time-savings and 10x productivity boost. Choice is yours!" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:83 msgid "Max bookings per block" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:236 msgid "Max discount" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:82 msgid "Max persons" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:101 msgid "Max Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:85 msgid "Maximum block bookable" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:206 msgid "Maximum block bookable (Unit)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:79 msgid "Maximum duration" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:96 msgid "Maximum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:89 msgid "Maximum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-wc-user-membership.php:164 #: pro/classes/class-smart-manager-pro-wc-user-membership.php:165 msgid "Member since" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:148 msgid "Meta robots advanced" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:81 msgid "Min persons" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:100 msgid "Min Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:135 msgid "Min/Max Rules" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:84 msgid "Minimum block bookable" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:201 msgid "Minimum block bookable (Unit)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:78 msgid "Minimum duration" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:95 msgid "Minimum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:88 msgid "Minimum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:151 msgid "Minutes(s)" msgstr "" #: assets/js/smart-manager.js:2330 msgctxt "modal content" msgid "all" msgstr "" #: assets/js/smart-manager.js:2329 #, javascript-format msgctxt "modal content" msgid "Are you sure you want to %s" msgstr "" #: assets/js/smart-manager.js:2330 #, javascript-format msgctxt "modal content" msgid "Are you sure you want to %s the %s?" msgstr "" #: assets/js/smart-manager.js:2529 msgctxt "modal content" msgid "Are you sure you want to duplicate the " msgstr "" #: assets/js/smart-manager.js:3114 msgctxt "modal content" msgid "Are you sure?" msgstr "" #: assets/js/smart-manager.js:3092 msgctxt "modal content" msgid "Continue in background" msgstr "" #: pro/assets/js/smart-manager.js:595 msgctxt "modal content" msgid "" "Create a custom view to save selected columns from a dashboard. Use it for " "saved searches, giving specific columns access to other users, etc." msgstr "" #: assets/js/smart-manager.js:2472 msgctxt "modal content" msgid "delete" msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "delete all" msgstr "" #: assets/js/smart-manager.js:2433 #, javascript-format msgctxt "modal content" msgid "Enter how many new %s(s) to create!" msgstr "" #: assets/js/smart-manager.js:261 assets/js/smart-manager.js:2207 #, javascript-format msgctxt "modal content" msgid "For managing %s, %s %s version" msgstr "" #: assets/js/smart-manager.js:3092 msgctxt "modal content" msgid "Initializing..." msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "Note: Looking to" msgstr "" #: assets/js/smart-manager.js:2323 msgctxt "modal content" msgid "permanently delete" msgstr "" #: assets/js/smart-manager.js:261 assets/js/smart-manager.js:2207 #: assets/js/smart-manager.js:3061 msgctxt "modal content" msgid "Pro" msgstr "" #: assets/js/smart-manager.js:2329 msgctxt "modal content" msgid "record" msgstr "" #: assets/js/smart-manager.js:2329 msgctxt "modal content" msgid "records" msgstr "" #: assets/js/smart-manager.js:2472 msgctxt "modal content" msgid "the current view. Are you sure you want to continue?" msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "the records?" msgstr "" #: assets/js/smart-manager.js:2329 msgctxt "modal content" msgid "the selected" msgstr "" #: assets/js/smart-manager.js:3061 #, javascript-format msgctxt "modal content" msgid "This feature is available only in the %s version" msgstr "" #: assets/js/smart-manager.js:2472 msgctxt "modal content" msgid "This will" msgstr "" #: assets/js/smart-manager.js:2528 msgctxt "modal content" msgid "" "This will duplicate only the records in posts, postmeta and related " "taxonomies." msgstr "" #: assets/js/smart-manager.js:2323 msgctxt "modal content" msgid "trash" msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "Upgrade to Pro" msgstr "" #: assets/js/smart-manager.js:2557 msgctxt "modal description" msgid "" "You can change / update multiple fields of the entire store OR for selected " "items by selecting multiple records and then click on Bulk Edit." msgstr "" #: assets/js/smart-manager.js:2560 msgctxt "modal description" msgid "" "You can export all the records OR filtered records (using Simple Search or " "Advanced Search) by simply clicking on the Export CSV button at the bottom " "right of the grid." msgstr "" #: assets/js/smart-manager.js:2566 msgctxt "modal title" msgid "(Only in" msgstr "" #: assets/js/smart-manager.js:2432 #, javascript-format msgctxt "modal title" msgid "Add %s(s)" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:60 msgctxt "modal title" msgid "Advanced Search" msgstr "" #: assets/js/smart-manager.js:2319 assets/js/smart-manager.js:2471 #: assets/js/smart-manager.js:2527 msgctxt "modal title" msgid "Attention!!!" msgstr "" #: assets/js/smart-manager.js:2566 msgctxt "modal title" msgid "Biggest Time Saver" msgstr "" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:66 #: pro/assets/js/smart-manager.js:718 pro/assets/js/smart-manager.js:973 msgctxt "modal title" msgid "Bulk Edit" msgstr "" #: assets/js/smart-manager.js:2749 msgctxt "modal title" msgid "Column Manager - Show/Hide Columns" msgstr "" #: pro/assets/js/smart-manager.js:1273 msgctxt "modal title" msgid "Delete Records" msgstr "" #: pro/assets/js/smart-manager.js:489 msgctxt "modal title" msgid "Duplicate Records" msgstr "" #: assets/js/smart-manager.js:2994 assets/js/smart-manager.js:3060 msgctxt "modal title" msgid "Note" msgstr "" #: assets/js/smart-manager.js:3091 msgctxt "modal title" msgid "Please Wait" msgstr "" #: assets/js/smart-manager.js:2566 msgctxt "modal title" msgid "Pro" msgstr "" #: assets/js/smart-manager.js:2992 msgctxt "modal title" msgid "Success" msgstr "" #: assets/js/smart-manager.js:3113 msgctxt "modal title" msgid "Warning" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:148 msgid "Month(s)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:121 msgid "Multiply all costs by person count" msgstr "" #: classes/class-smart-manager-product.php:952 #: pro/classes/class-smart-manager-pro-acf-field-group.php:42 #: pro/classes/class-smart-manager-pro-acf-field.php:42 msgid "Name" msgstr "Nome" #: pro/classes/class-smart-manager-pro-product.php:260 msgid "Never expire" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:185 msgid "Nickname" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:135 #: pro/classes/class-smart-manager-pro-base.php:143 msgid "No" msgstr "Não" #: pro/classes/class-smart-manager-pro-base.php:29 #: pro/classes/class-smart-manager-pro-base.php:37 msgid "No Archive" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:36 msgid "No Follow" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:28 #: pro/classes/class-smart-manager-pro-base.php:38 msgid "No Image Index" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:35 msgid "No Index" msgstr "" #: classes/class-smart-manager-product.php:941 #: classes/class-smart-manager-product.php:943 msgid "No shipping class" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:30 #: pro/classes/class-smart-manager-pro-base.php:39 msgid "No Snippet" msgstr "" #: classes/class-smart-manager-product.php:846 #: classes/class-smart-manager-product.php:852 #: pro/classes/class-smart-manager-pro-base.php:27 msgid "None" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:230 msgid "not-available by default" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:329 msgid "NOTE" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "column if not enabled using" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "column show/hide functionality" msgstr "" #: assets/js/smart-manager.js:2460 assets/js/smart-manager.js:2482 msgctxt "notification" msgid "Custom Views avialable (Only in" msgstr "" #: assets/js/smart-manager.js:2590 msgctxt "notification" msgid "Duplicate Records (Only in" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "Enable" msgstr "" #: assets/js/smart-manager.js:3048 msgctxt "notification" msgid "Error" msgstr "" #: assets/js/smart-manager.js:2422 msgctxt "notification" msgid "For editing more records upgrade to Pro" msgstr "" #: assets/js/smart-manager.js:263 assets/js/smart-manager.js:2208 #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "Note" msgstr "" #: assets/js/smart-manager.js:2272 msgctxt "notification" msgid "Please edit a record" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "Please enter user email" msgstr "" #: assets/js/smart-manager.js:2309 assets/js/smart-manager.js:2545 msgctxt "notification" msgid "Please select a record" msgstr "" #: assets/js/smart-manager.js:2460 assets/js/smart-manager.js:2482 #: assets/js/smart-manager.js:2590 msgctxt "notification" msgid "Pro" msgstr "" #: assets/js/smart-manager.js:2314 msgctxt "notification" msgid "records at a time" msgstr "" #: assets/js/smart-manager.js:2954 pro/assets/js/smart-manager.js:567 #: pro/assets/js/smart-manager.js:690 msgctxt "notification" msgid "Success" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:57 #, fuzzy msgctxt "notification" msgid "This feature is available only in the Pro version." msgstr "Esta função vem somente com a versão Pro" #: assets/js/smart-manager.js:2314 msgctxt "notification" msgid "To delete more than" msgstr "" #: assets/js/smart-manager.js:2299 msgctxt "notification" msgid "To permanently delete records" msgstr "" #: assets/js/smart-manager.js:2299 assets/js/smart-manager.js:2314 msgctxt "notification" msgid "upgrade to Pro" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "User Email" msgstr "" #: pro/assets/js/smart-manager.js:567 #, javascript-format msgctxt "notification" msgid "View %sd successfully!" msgstr "" #: pro/assets/js/smart-manager.js:658 msgctxt "notification" msgid "View already exists. Please try another name" msgstr "" #: pro/assets/js/smart-manager.js:690 msgctxt "notification" msgid "View deleted successfully!" msgstr "" #: assets/js/smart-manager.js:3048 msgctxt "notification" msgid "You have entered incorrect data in the highlighted cells." msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "decrease by %" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "decrease by number" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "increase by %" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "increase by number" msgstr "" #: classes/class-smart-manager-product.php:864 msgid "On backorder" msgstr "" #: pro/templates/order-invoice.php:201 msgid "Order Discount" msgstr "" #: pro/templates/order-invoice.php:195 msgid "Order Notes" msgstr "Notas Do Pedido" #: pro/classes/class-smart-manager-pro-product.php:137 msgid "Order rules: Do not count" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:138 msgid "Order rules: Exclude" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:130 msgid "Other" msgstr "" #: classes/class-smart-manager-product.php:863 msgid "Out of stock" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:217 #, fuzzy #| msgid "Payment Method" msgid "Payment Methods" msgstr "Método De Pagamento" #: pro/assets/js/smart-manager.js:853 pro/assets/js/smart-manager.js:857 #: pro/assets/js/smart-manager.js:943 pro/assets/js/smart-manager.js:1054 #: pro/assets/js/smart-manager.js:1075 pro/assets/js/smart-manager.js:1094 msgctxt "placeholder" msgid "Enter a value..." msgstr "" #: pro/assets/js/smart-manager-product.js:225 msgctxt "placeholder" msgid "Enter Attribute name..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:428 msgctxt "placeholder" msgid "Enter attribute name..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:63 src/views/Rule.js:357 #: src/views/Rule.js:372 msgctxt "placeholder" msgid "Enter value" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:429 #: pro/assets/js/smart-manager-product.js:226 msgctxt "placeholder" msgid "Enter values..." msgstr "" #: pro/assets/js/smart-manager.js:596 msgctxt "placeholder" msgid "Give a name to this view" msgstr "" #: assets/js/smart-manager-product.js:208 #: assets/js/smart-manager-product.js:313 msgctxt "placeholder" msgid "Name" msgstr "" #: assets/js/smart-manager-product.js:203 #: assets/js/smart-manager-product.js:209 #: assets/js/smart-manager-product.js:307 #: assets/js/smart-manager-product.js:314 msgctxt "placeholder" msgid "Pipe (|) separate terms" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:429 #: pro/assets/js/smart-manager.js:1155 msgctxt "placeholder" msgid "Replace with..." msgstr "" #: assets/js/smart-manager.js:2733 msgctxt "placeholder" msgid "Search For Disabled Columns..." msgstr "" #: assets/js/smart-manager.js:2726 msgctxt "placeholder" msgid "Search For Enabled Columns..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:428 #: pro/assets/js/smart-manager.js:1154 msgctxt "placeholder" msgid "Search for..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:230 #: pro/assets/js/smart-manager.js:1119 #, javascript-format msgctxt "placeholder" msgid "Select %s" msgstr "" #: assets/js/smart-manager-product.js:190 #: assets/js/smart-manager-product.js:293 msgctxt "placeholder" msgid "Select terms" msgstr "" #: assets/js/smart-manager.js:278 msgctxt "placeholder" msgid "Type to search..." msgstr "" #: pro/templates/email.php:62 msgid "please leave us a" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:132 msgid "Please mention..." msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:71 msgid "Please select an option" msgstr "" #: assets/js/smart-manager-product.js:183 msgctxt "position checkbox" msgid "Position:" msgstr "" #: classes/class-smart-manager-shop-order.php:437 #: pro/templates/order-invoice.php:163 msgid "Price" msgstr "Preço" #: classes/class-smart-manager-pricing.php:641 msgid "Pricing" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:330 msgid "Print Order Settings" msgstr "" #: classes/class-smart-manager-pricing.php:584 msgid "Print packing slips for WooCommerce orders in bulk" msgstr "" #: classes/class-smart-manager-pricing.php:562 msgid "Print PDF invoices" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:195 msgid "Privileges for Smart Manager for different System Roles" msgstr "" #: class-smart-manager.php:1447 msgid "PRO" msgstr "" #: classes/class-smart-manager-admin-welcome.php:333 #: classes/class-smart-manager-admin-welcome.php:349 #: classes/class-smart-manager-pricing.php:416 msgid "Pro" msgstr "Pro" #: pro/templates/order-invoice.php:162 msgid "Product" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:223 msgid "Product Attributes" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:209 msgid "Product categories" msgstr "" #: pro/assets/js/smart-manager-product.js:127 msgctxt "product price operator" msgid "set to regular price" msgstr "" #: pro/assets/js/smart-manager-product.js:123 msgctxt "product price operator" msgid "set to sale price" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:109 msgid "Product Units" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:229 msgid "Products" msgstr "Produtos" #: pro/classes/class-smart-manager-pro-background-updater.php:322 msgid "Progress" msgstr "" #: pro/assets/js/smart-manager.js:601 #, fuzzy #| msgid "Publish" msgid "Public" msgstr "Publicar" #: classes/class-smart-manager-shop-order.php:437 msgid "Qty" msgstr "" #: pro/templates/order-invoice.php:163 msgid "Quantity" msgstr "Quantidade" #: classes/class-smart-manager-admin-welcome.php:248 msgid "Questions? Need Help?" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:65 msgid "Quick Feedback for Smart Manager plugin" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:103 msgid "Rank Math SEO Score" msgstr "" #: pro/templates/email.php:62 msgid "rating. A huge thank you from StoreApps in advance!" msgstr "" #: pro/templates/email.php:45 msgid "Records Updated" msgstr "" #: classes/class-smart-manager-product.php:890 msgid "Reduced Rate" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:111 msgid "Regular Unit Price" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:316 msgid "request is running" msgstr "" #: classes/class-smart-manager-admin-welcome.php:390 msgid "" "Request you to kindly de-activate and activate the Smart Manager plugin once " "and then have a recheck with the search functionality." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:86 msgid "Require a buffer period of" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:117 msgid "Requires confirmation?" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:219 msgid "Resources are..." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:124 msgid "Restrict start and end days?" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:153 msgid "Robots Meta" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:32 msgctxt "rule content" msgid "This group is a \"pass\" when" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:35 msgctxt "rule option" msgid "all" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:36 msgctxt "rule option" msgid "at least one" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:112 msgid "Sale Unit Price" msgstr "" #: assets/js/smart-manager.js:280 assets/js/smart-manager.js:539 #, javascript-format msgctxt "search conditions" msgid "%d condition%s" msgstr "" #: assets/js/smart-manager.js:280 assets/js/smart-manager.js:539 msgctxt "search conditions" msgid "s" msgstr "" #: classes/class-smart-manager-product.php:735 msgid "Search results only" msgstr "" #: assets/js/smart-manager.js:354 assets/js/smart-manager.js:355 #, javascript-format msgctxt "search type" msgid "%s Search" msgstr "" #: assets/js/smart-manager.js:276 msgctxt "search type" msgid "Advanced" msgstr "" #: assets/js/smart-manager.js:276 msgctxt "search type" msgid "Simple" msgstr "" #: classes/class-smart-manager-admin-welcome.php:324 #: classes/class-smart-manager-admin-welcome.php:341 msgid "See how" msgstr "" #: classes/class-smart-manager-admin-welcome.php:295 #: classes/class-smart-manager-admin-welcome.php:304 msgid "see how" msgstr "" #: pro/assets/js/smart-manager-product.js:152 pro/assets/js/smart-manager.js:24 #: pro/assets/js/smart-manager.js:890 #, fuzzy #| msgid "Select an action" msgid "Select Action" msgstr "Selecione uma ação" #: pro/assets/js/smart-manager-product.js:143 msgid "Select Attribute" msgstr "" #: pro/assets/js/smart-manager.js:874 #, fuzzy #| msgid "Select a field" msgid "Select Field" msgstr "Selecione um campo" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:147 #: pro/assets/js/smart-manager.js:871 msgid "Selected Items" msgstr "" #: classes/class-smart-manager-pricing.php:513 msgid "" "Set to, Append, Prepend, Increase / Decrease by %, Increase / Decrease by " "number, Set datetime to, Set date to, Set time to, Upload images and many " "more..." msgstr "" #: class-smart-manager.php:669 class-smart-manager.php:1455 #: classes/class-smart-manager-admin-welcome.php:252 #: pro/classes/class-smart-manager-pro-access-privilege.php:178 msgid "Settings" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:56 msgid "Settings Saved Successfully!!!" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:328 #: pro/templates/order-invoice.php:197 msgid "Shipping" msgstr "Frete" #: pro/templates/order-invoice.php:151 msgid "Shipping Address" msgstr "Endereço Para Frete" #: pro/classes/class-smart-manager-pro-shop-coupon.php:215 #, fuzzy #| msgid "Shipping Method" msgid "Shipping methods" msgstr "Tipo de Frete" #: classes/class-smart-manager-product.php:845 #: classes/class-smart-manager-product.php:851 msgid "Shipping only" msgstr "" #: classes/class-smart-manager-product.php:733 msgid "Shop and search results" msgstr "" #: classes/class-smart-manager-product.php:734 msgid "Shop only" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:141 #, php-format msgid "Should search engines follow links on this %1$s?" msgstr "" #: assets/js/smart-manager-product.js:435 msgctxt "show variations checkbox" msgid "Show Variations" msgstr "" #: classes/class-smart-manager-admin-welcome.php:308 msgid "Show/Hide & Sort Data Columns" msgstr "" #: classes/class-smart-manager-admin-welcome.php:313 msgid "" "Show/hide multiple data columns of your WooCommerce store data as per your " "requirements. Sort them in ascending or descending order. Smart Manager also " "gives you persistent state management." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:104 msgid "Sign-up Fee" msgstr "" #: classes/class-smart-manager-pricing.php:473 msgid "Simple Search" msgstr "" #: classes/class-smart-manager-admin-welcome.php:295 #, php-format msgid "" "Simply enter the keyword you wish to filter records in the “Simple Search†" "field at the top of the grid (%s). If you need to have a more specific " "search result, then you can switch to “%s“ and then search." msgstr "" #: pro/classes/class-smart-manager-pro-base.php:26 msgid "Site-wide default" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:68 msgid "Skip & Deactivate" msgstr "" #: classes/class-smart-manager-product.php:949 #: pro/templates/order-invoice.php:162 msgid "SKU" msgstr "Controle de Estoque" #: classes/class-smart-manager-product.php:954 #: pro/classes/class-smart-manager-pro-wc-membership-plan.php:97 #: pro/classes/class-smart-manager-pro-wc-membership-plan.php:98 msgid "Slug" msgstr "" #: pro/templates/email.php:62 msgid "Smart Manager" msgstr "Smart Manager" #. Name of the plugin msgid "Smart Manager For WooCommerce – Stock Management, Bulk Edit & more..." msgstr "" #: pro/templates/email.php:36 msgid "Smart Manager has successfully completed" msgstr "" #: classes/class-smart-manager-admin-welcome.php:280 msgid "" "Smart Manager is a unique, revolutionary tool that gives you the power to " "boost your productivity by 10x in managing your WooCommerce store " "by using a familiar, single page, spreadsheet like interface. " msgstr "" #: classes/class-smart-manager-admin-welcome.php:414 #, php-format msgid "" "Smart Manager is actively developed. If you can't find your favorite feature " "(or have a suggestion) %s. We'd love to hear from you." msgstr "" #: classes/class-smart-manager-admin-welcome.php:394 msgid "" "Smart Manager is based on WooCommerce and WPeCommerce and the same e-" "commerce plugins sets the price/sales price of the variation parents " "automatically based on the price/sales price of its variations." msgstr "" #: classes/class-smart-manager-admin-welcome.php:385 msgid "Smart Manager is empty?" msgstr "" #: classes/class-smart-manager-pricing.php:676 msgid "Smart Manager Pro" msgstr "" #: classes/class-smart-manager-admin-welcome.php:389 msgid "Smart Manager search functionality not working" msgstr "" #: classes/class-smart-manager-admin-welcome.php:398 msgid "" "Smart Manager will allow you to manage custom field of any other plugin." msgstr "" #: classes/class-smart-manager-product.php:889 msgid "Standard" msgstr "" #: classes/class-smart-manager-shop-order.php:162 #: pro/classes/class-smart-manager-pro-shop-subscription.php:177 msgid "Status" msgstr "Status" #. Author of the plugin msgid "StoreApps" msgstr "" #: class-smart-manager.php:678 msgid "StoreApps Plugins" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:67 msgid "Submit & Deactivate" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:70 msgid "Submit a reason to deactivate" msgstr "" #: classes/class-smart-manager-admin-welcome.php:414 msgid "Submit your query" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:246 msgid "Subscription Periods" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:103 msgid "Subscription Price" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:271 msgid "Subscription Trial Period" msgstr "" #: classes/class-smart-manager-pricing.php:628 msgid "Support" msgstr "" #: classes/class-smart-manager-pricing.php:423 msgid "Supported Post Types" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:66 msgid "Take a moment to let us know why you are deactivating" msgstr "" #: pro/templates/order-invoice.php:208 msgid "Tax" msgstr "Impostos" #: classes/class-smart-manager-product.php:844 #: classes/class-smart-manager-product.php:850 msgid "Taxable" msgstr "" #: pro/templates/order-invoice.php:159 msgid "Tel" msgstr "" #: pro/assets/js/smart-manager.js:39 msgctxt "text operator" msgid "append" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "contains" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "is" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "is not" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "not contains" msgstr "" #: pro/assets/js/smart-manager.js:39 msgctxt "text operator" msgid "prepend" msgstr "" #: classes/class-smart-manager-admin-welcome.php:230 #, php-format msgid "Thank you for installing Smart Manager %s!" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:112 msgid "The plugin is great, but I need specific feature that you don't support" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:100 msgid "The plugin is not working / not compatible with another plugin." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:238 msgid "The starting block only" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:22 msgctxt "time duration" msgid "hours" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:22 msgctxt "time duration" msgid "minutes" msgstr "" #: pro/assets/js/smart-manager.js:35 msgctxt "time operator" msgid "set time to" msgstr "" #: assets/js/smart-manager.js:279 msgctxt "title" msgid "Click to add/edit condition" msgstr "" #: assets/js/smart-manager.js:362 msgctxt "title" msgid "Custom Views" msgstr "" #: pro/assets/js/smart-manager-product.js:226 #, fuzzy msgctxt "title" msgid "For more than one values, use pipe (|) as delimiter" msgstr "Para mais de um valor, use (|) as delimitador" #: assets/js/smart-manager.js:1700 msgctxt "title" msgid "Gallery Images" msgstr "" #: assets/js/smart-manager.js:447 msgctxt "title" msgid "Load more records" msgstr "" #: assets/js/smart-manager.js:1293 msgctxt "title" msgid "Remove gallery image" msgstr "" #: assets/js/smart-manager.js:354 #, javascript-format msgctxt "title" msgid "Switch to %s" msgstr "" #: classes/class-smart-manager-admin-welcome.php:402 #, php-format msgid "To show / hide columns in the Smart Manager, %s." msgstr "" #: assets/js/smart-manager.js:1410 msgctxt "tooltip" msgid "(Click to sort)" msgstr "" #: assets/js/smart-manager.js:392 msgctxt "tooltip" msgid "Add Row" msgstr "" #: assets/js/smart-manager.js:378 msgctxt "tooltip" msgid "Bulk Edit" msgstr "" #: assets/js/smart-manager.js:412 msgctxt "tooltip" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:402 msgctxt "tooltip" msgid "Duplicate" msgstr "" #: assets/js/smart-manager.js:420 msgctxt "tooltip" msgid "Export CSV" msgstr "" #: assets/js/smart-manager.js:426 msgctxt "tooltip" msgid "Print Invoice" msgstr "" #: assets/js/smart-manager.js:386 msgctxt "tooltip" msgid "Save" msgstr "" #: assets/js/smart-manager.js:434 msgctxt "tooltip" msgid "Show / Hide Columns" msgstr "" #: pro/templates/order-invoice.php:209 msgid "Total" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:110 msgid "Unit Price Units" msgstr "" #: classes/class-smart-manager-pricing.php:446 msgid "Unlimited" msgstr "" #: pro/templates/email.php:7 msgid "Updated" msgstr "" #: classes/class-smart-manager-admin-welcome.php:393 msgid "Updating variation parent price/sales price not working?" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:339 msgid "Upload Image" msgstr "" #: classes/class-smart-manager-pricing.php:442 msgid "Upto three records without saving" msgstr "" #: classes/class-smart-manager-shop-coupon.php:121 msgid "Usage Limit Per Coupon" msgstr "" #: classes/class-smart-manager-admin-welcome.php:357 msgid "using Simple Search†or Advanced Search" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:241 msgid "Validity Suffix" msgstr "" #: pro/templates/email.php:44 msgid "Value" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:142 msgid "Variation Category group-of rules: Exclude" msgstr "" #: assets/js/smart-manager-product.js:181 msgctxt "variation flag" msgid "Used for variations" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:93 msgid "Variation Group of..." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:98 msgid "Variation Maximum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:92 msgid "Variation Maximum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:97 msgid "Variation Minimum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:91 msgid "Variation Minimum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:140 msgid "Variation Order rules: Do not count" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:141 msgid "Variation Order rules: Exclude" msgstr "" #: classes/class-smart-manager-pricing.php:595 msgid "View Customer Lifetime Value (LTV)" msgstr "" #: classes/class-smart-manager-admin-welcome.php:365 msgid "View our other WooCommerce plugins" msgstr "" #: assets/js/smart-manager-product.js:179 msgctxt "visibility flag" msgid "Visible on the product page" msgstr "" #: classes/class-smart-manager-pricing.php:661 msgid "" "We recommend Smart Manager Pro to everyone who is looking for an extremely " "multi-functional store manager. The plugin is absolutely worth it. Never " "again without Smart Manager!" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:108 msgid "What did you wanted to do in short period?" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:120 msgid "What is that plugin name?" msgstr "" #: classes/class-smart-manager-pricing.php:399 msgid "" "What really sold me on Smart Manager Pro was Bulk Edit. My assistant does " "not have to do any complex math now (earlier, I always feared she would make " "mistakes)! With Smart Manager, she has more free time at hand, so I asked " "her to set up auto responder emails. The response was phenomenal. Repeat " "sales were up by 19.5%." msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:114 msgid "What specific feature you need?" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:317 msgid "when it is completed." msgstr "" #: classes/class-smart-manager-pricing.php:432 msgid "" "WordPress Pages, Media, Users, SEO plugins, WooCommerce Subscriptions, " "Bookings, Memberships, Product Add-ons, Brands…all" msgstr "" #: classes/class-smart-manager-pricing.php:427 msgid "" "WordPress Posts, WooCommerce Products, Product Variations, Orders, Coupons" msgstr "" #: classes/class-smart-manager-pricing.php:632 msgid "WP forum" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:134 #: pro/classes/class-smart-manager-pro-base.php:142 msgid "Yes" msgstr "Sim" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:69 msgid "Yes - Deactivate" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:98 msgid "Yoast Focus Keyphrase" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:96 msgid "Yoast Meta Description" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:97 msgid "Yoast Meta Keywords" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:101 msgid "Yoast Readability Score" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:102 msgid "Yoast SEO Score" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:95 msgid "Yoast SEO Title" msgstr "" #: classes/class-smart-manager-admin-welcome.php:341 #, php-format msgid "" "You can change / update multiple fields of the entire store OR for selected " "items by selecting multiple records and then click on Bulk Edit. %s." msgstr "" #: classes/class-smart-manager-pricing.php:676 #, php-format msgid "" "You can either spend hours of work in store management or use %s to " "accomplish the same within minutes." msgstr "" #: classes/class-smart-manager-admin-welcome.php:357 #, php-format msgid "" "You can export all the records OR filtered records (%s) by simply clicking " "on the Export CSV button at the bottom right of the grid." msgstr "" #: classes/class-smart-manager-admin-welcome.php:304 #, php-format msgid "" "You can quickly update your Products, Orders, Coupons and Posts from Smart " "Manager itself. This facilitates editing of multiple rows at a time instead " "of editing and saving each row separately, %s." msgstr "" #: classes/class-smart-manager-admin-welcome.php:324 #, php-format msgid "" "You can simply select records you want to delete (check the header box if " "you want to delete all records) and click on the “Delete†icon. All the " "selected records will be deleted. You can even delete records by applying " "search filters. %s." msgstr "" #: classes/class-smart-manager-admin-welcome.php:406 msgid "" "You cannot import using Smart Manager. Use import functionality of " "WooCommerce." msgstr "" #: class-smart-manager.php:1149 msgid "you will have to wait for the current background process to finish." msgstr "" #: classes/class-smart-manager-product.php:891 msgid "Zero Rate" msgstr "" #: classes/class-smart-manager-pricing.php:343 msgid "â° Limited time offer" msgstr "" languages/smart-manager-for-wp-e-commerce-pt_BR.mo000064400000005026147600337620016046 0ustar00Þ•#4LL:MˆŽ ¥ÆÖå÷ ü  ".>DHQXa e s€‰š «¹ÀÄÈ Ì?Ú9xTKÍ&2Yr†¢ ©µ »ÈÍÒâ÷þ    3 H [ a v „ ’ ™ ¢ ¦ © +¼ -è A required Smart Manager file is missing. Can't continue. AcromAdditional DescriptionAn upgrade for Smart Manager ProBilling AddressBilling PeriodClick to upgrade.DateDescriptionError:Export CSVNameNoOrder NotesPayment MethodsPriceProProductsPublicQuantitySKUSelect ActionSelect FieldShippingShipping AddressShipping methodsSmart ManagerStatusTaxYesforis available.notificationThis feature is available only in the Pro version.titleFor more than one values, use pipe (|) as delimiterProject-Id-Version: Smart Manager 4.2.1 Report-Msgid-Bugs-To: POT-Creation-Date: 2019-04-20 14:04:35+00:00 PO-Revision-Date: 2022-03-17 04:14+0000 Last-Translator: Mansi Language-Team: Portuguese (Brazil) Language: pt_BR Plural-Forms: nplurals=2; plural=n != 1; MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-SourceCharset: utf-8 X-Poedit-KeywordsList: _:1;gettext:1;dgettext:2;ngettext:1,2;dngettext:2,3;__:1;_e:1;_c:1;_n:1,2;_n_noop:1,2;_nc:1,2;__ngettext:1,2;__ngettext_noop:1,2;_x:1,2c;_ex:1,2c;_nx:1,2,4c;_nx_noop:1,2,3c;_n_js:1,2;_nx_js:1,2,3c;esc_attr__:1;esc_html__:1;esc_attr_e:1;esc_html_e:1;esc_attr_x:1,2c;esc_html_x:1,2c;comments_number_link:2,3;t:1;st:1;trans:1;transChoice:1,2 X-Poedit-Basepath: ../ X-Poedit-SearchPath-0: . X-Loco-Target-Locale: pt_BR X-Generator: Loco https://localise.biz/Um arquivo do Smart Manager está faltando. Não será possível continuar.DeDescrição AdicionalUma atualização do Smart Manager ProEndereço de FaturamentoRegião FaturamentoClique aqui para atualizar.EstadoDescriçãoErro:Exportar CSVNomeNãoNotas Do PedidoMétodo De PagamentoPreçoProProdutosPublicarQuantidadeControle de EstoqueSelecione uma açãoSelecione um campoFreteEndereço Para FreteTipo de FreteSmart ManagerStatusImpostosSimOuestá disponível.Esta função vem somente com a versão ProPara mais de um valor, use (|) as delimitadorlanguages/smart-manager-for-wp-e-commerce-ro_RO.po000064400000204005147600337620016061 0ustar00msgid "" msgstr "" "Project-Id-Version: Smart Manager 4.2.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-04-20 14:04:35+00:00\n" "PO-Revision-Date: 2022-03-17 04:14+0000\n" "Last-Translator: fg\n" "Language-Team: Romanian\n" "Language: ro_RO\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 :(((n%100>19)||(( n%100==0)&&(n!" "=0)))? 2 : 1));\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-SourceCharset: utf-8\n" "X-Generator: Loco https://localise.biz/\n" "X-Poedit-KeywordsList: _:1;gettext:1;dgettext:2;ngettext:1,2;dngettext:2,3;" "__:1;_e:1;_c:1;_n:1,2;_n_noop:1,2;_nc:1,2;__ngettext:1,2;__ngettext_noop:1,2;" "_x:1,2c;_ex:1,2c;_nx:1,2,4c;_nx_noop:1,2,3c;_n_js:1,2;_nx_js:1,2,3c;" "esc_attr__:1;esc_html__:1;esc_attr_e:1;esc_html_e:1;esc_attr_x:1,2c;" "esc_html_x:1,2c;comments_number_link:2,3;t:1;st:1;trans:1;transChoice:1,2\n" "X-Poedit-Basepath: ../\n" "X-Textdomain-Support: yes\n" "X-Poedit-SearchPath-0: .\n" "X-Loco-Target-Locale: ro_RO\n" "X-Loco-Version: 2.5.8; wp-5.9.1" #: classes/class-smart-manager-pricing.php:405 msgid " More powerful features with Smart Manager Pro!" msgstr "" #: classes/class-smart-manager-pricing.php:351 msgid "$112" msgstr "" #: classes/class-smart-manager-pricing.php:363 msgid "$135" msgstr "" #: classes/class-smart-manager-pricing.php:350 msgid "$149" msgstr "" #: classes/class-smart-manager-pricing.php:362 msgid "$179" msgstr "" #: classes/class-smart-manager-pricing.php:374 msgid "$360" msgstr "" #: classes/class-smart-manager-pricing.php:385 msgid "$375" msgstr "" #: classes/class-smart-manager-pricing.php:373 msgid "$479" msgstr "" #: classes/class-smart-manager-pricing.php:384 msgid "$499" msgstr "" #: classes/class-smart-manager-pricing.php:351 msgid "$75" msgstr "" #: classes/class-smart-manager-pricing.php:363 msgid "$90" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:165 msgid "% Completed" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:143 #, php-format msgid "% completed" msgstr "" #. 1. Error title 2. The bulk process #: pro/classes/class-smart-manager-pro-background-updater.php:307 #, php-format msgid "" "%1$s: The %2$s process has stopped. Please review the Smart Manager " "dashboard to check the status." msgstr "" #: class-smart-manager.php:1460 #, php-format msgid "%1s" msgstr "" #: classes/class-smart-manager-admin-welcome.php:429 #, php-format msgid "%s" msgstr "" #: class-smart-manager.php:862 #, php-format msgid "%s to check Smart Manager Pro features and claim your discount." msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:323 msgid "--:--:--" msgstr "" #: classes/class-smart-manager-pricing.php:348 msgid "1 site (Annual)" msgstr "" #: classes/class-smart-manager-pricing.php:371 msgid "1 site (Lifetime)" msgstr "" #: classes/class-smart-manager-pricing.php:667 msgid "20 or 30 times quicker store management" msgstr "" #: class-smart-manager.php:861 classes/class-smart-manager-pricing.php:340 msgid "25% Off" msgstr "" #: classes/class-smart-manager-pricing.php:360 msgid "5 sites (Annual)" msgstr "" #: classes/class-smart-manager-pricing.php:382 msgid "5 sites (Lifetime)" msgstr "" #: class-smart-manager.php:665 msgid " 🔥 Go Pro" msgstr "" #. Description of the plugin msgid "" "Pro Version Installed. The #1 and a powerful tool to manage " "stock, inventory from a single place. Super quick and super easy." msgstr "" # @ smart-manager #: class-smart-manager.php:1570 msgid "A required Smart Manager file is missing. Can't continue. " msgstr "Un fisier cerut de Smart Manager lipseste. Nu poate continua." #: classes/class-smart-manager-pricing.php:659 msgid "A whole afternoon’s work in seconds" msgstr "" # @ smart-manager #: classes/class-smart-manager-pricing.php:662 #, fuzzy #| msgid "From" msgid "Acrom" msgstr "De la" #: pro/templates/email.php:43 msgid "Action" msgstr "" #: pro/assets/js/smart-manager-product.js:154 pro/assets/js/smart-manager.js:37 msgctxt "action operator" msgid "add to" msgstr "" #: pro/assets/js/smart-manager.js:25 pro/assets/js/smart-manager.js:47 msgctxt "action operator" msgid "copy from" msgstr "" #: pro/assets/js/smart-manager-product.js:155 pro/assets/js/smart-manager.js:37 msgctxt "action operator" msgid "remove from" msgstr "" #: pro/assets/js/smart-manager.js:39 msgctxt "action operator" msgid "search & replace" msgstr "" #: pro/assets/js/smart-manager-product.js:153 pro/assets/js/smart-manager.js:46 #: pro/assets/js/smart-manager.js:891 pro/assets/js/smart-manager.js:1027 msgctxt "action operator" msgid "set to" msgstr "" #: assets/js/smart-manager-product.js:229 msgctxt "add attribute button" msgid "Add" msgstr "" #: classes/class-smart-manager-pricing.php:451 msgid "Add or Delete records" msgstr "" # @ smart-manager #: classes/class-smart-manager-product.php:958 msgid "Additional Description" msgstr "Descriere aditionala" #: pro/assets/js/smart-manager.js:28 msgctxt "additional operator" msgid "decrease by" msgstr "" #: pro/assets/js/smart-manager.js:28 msgctxt "additional operator" msgid "increase by" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:326 msgid "Address to look in" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:125 msgid "Adjacent Buffering?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:295 msgid "Advanced Search" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:42 #, javascript-format msgctxt "advanced search conditions" msgid "%d condition%s" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:42 msgctxt "advanced search conditions" msgid "s" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:155 msgctxt "advanced search content" msgid "condition groups pass" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:148 msgctxt "advanced search content" msgid "When" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:153 msgctxt "advanced search option" msgid "all" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:152 msgctxt "advanced search option" msgid "at least one" msgstr "" #: classes/class-smart-manager-pricing.php:484 msgid "Advanced Search using “AND†filter" msgstr "" #: classes/class-smart-manager-pricing.php:495 msgid "Advanced Search using “OR†filter" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:294 msgid "All" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:237 msgid "All blocks being booked" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:227 msgid "All dates are..." msgstr "" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:50 #: pro/assets/js/smart-manager.js:868 msgid "All Items In Search Results" msgstr "" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:50 #: pro/assets/js/smart-manager.js:868 msgid "All Items In Store" msgstr "" #: classes/class-smart-manager-product.php:912 msgid "Allow" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:136 msgid "Allow Combination" msgstr "" #: classes/class-smart-manager-shop-coupon.php:123 msgid "Allow Free Shipping" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:252 msgid "Allow free shipping" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:132 #, php-format msgid "Allow search engines to show this %1$s in search results?" msgstr "" #: classes/class-smart-manager-product.php:911 msgid "Allow, but notify customer" msgstr "" #: classes/class-smart-manager-shop-coupon.php:119 msgid "Allowed Emails" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:291 msgid "Allowed emails" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:213 msgid "Allowed user roles" msgstr "" # @ smart-manager #: class-smart-manager.php:1468 msgid "An upgrade for Smart Manager Pro" msgstr "Un update pentru Smart Manager Pro" #: classes/class-smart-manager-admin-welcome.php:281 msgid "any custom post type in WordPress" msgstr "" #: classes/class-smart-manager-admin-welcome.php:281 #, php-format msgid "" "Apart from WooCommerce post types like Products, Orders, Coupons, now you " "can manage %s. Be it Posts, Pages, Media, WordPress Users, etc. you can now " "manage everything using Smart Manager." msgstr "" #. 1. The bulk process #: pro/classes/class-smart-manager-pro-background-updater.php:348 #, php-format msgid "Are you sure you want to stop the %s process? Click OK to stop." msgstr "" #: assets/js/smart-manager-product.js:302 msgctxt "attribute button" msgid "Select all" msgstr "" #: assets/js/smart-manager-product.js:303 msgctxt "attribute button" msgid "Select none" msgstr "" #: assets/js/smart-manager-product.js:121 msgctxt "attribute list" msgid "Custom product attribute" msgstr "" #: pro/assets/js/smart-manager-product.js:40 msgctxt "attribute operator" msgid "Add Attribute" msgstr "" #: pro/assets/js/smart-manager-product.js:49 msgctxt "attribute operator" msgid "Remove Attribute" msgstr "" #: assets/js/smart-manager-product.js:283 msgctxt "attribute variation" msgid "Used for variations" msgstr "" #: assets/js/smart-manager-product.js:280 msgctxt "attribute visibility" msgid "Visible on the product page" msgstr "" # @ smart-manager #: classes/class-smart-manager-product.php:1068 msgid "Attributes" msgstr "Atribute" #: classes/class-smart-manager-product.php:1101 msgid "Attributes: custom" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:253 msgid "Auto Generate Coupon" msgstr "" #: class-smart-manager.php:1649 msgid "Auto-updates are not available for this plugin." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:222 msgid "Automatically assigned" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:229 msgid "available by default" msgstr "" # @ default #: pro/classes/class-smart-manager-pro-access-privilege.php:264 msgid "Back to Smart Manager" msgstr "Inapoi la Smart Manager" #: pro/assets/js/smart-manager-product.js:216 msgctxt "batch update option" msgid "All" msgstr "" #: pro/templates/email.php:39 msgid "Below are the lists of updates done:" msgstr "" #: classes/class-smart-manager-pricing.php:359 msgid "Best Seller" msgstr "" #: classes/class-smart-manager-admin-welcome.php:333 msgid "Biggest Time Saver" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:327 msgid "Billing" msgstr "" # @ smart-manager #: pro/templates/order-invoice.php:144 msgid "Billing Address" msgstr "Adresa de facturare" # @ smart-manager #: pro/classes/class-smart-manager-pro-product.php:252 #, fuzzy #| msgid "Billing Region" msgid "Billing Period" msgstr "Regiunea/Judetul de facturare" #: pro/classes/class-smart-manager-pro-wc-booking.php:171 msgid "Booked Product" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:80 msgid "Booking can be cancelled until" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:196 msgid "Booking can be cancelled until (Unit)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:77 msgid "Booking duration" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:183 msgid "Booking Duration (Type)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:191 msgid "Booking Duration (Unit)" msgstr "" #: assets/js/smart-manager.js:987 #, javascript-format msgctxt "bottom bar" msgid "%d %s loaded" msgstr "" #: assets/js/smart-manager.js:1005 #, javascript-format msgctxt "bottom bar" msgid "%d of %d %s loaded" msgstr "" #: assets/js/smart-manager.js:980 assets/js/smart-manager.js:1005 #, javascript-format msgctxt "bottom bar" msgid "No %s Found" msgstr "" #: classes/class-smart-manager-pricing.php:670 msgid "Brian Batcher" msgstr "" #: class-smart-manager.php:1149 #: classes/class-smart-manager-admin-welcome.php:331 msgid "Bulk Edit" msgstr "" #: classes/class-smart-manager-admin-welcome.php:333 #, php-format msgid "Bulk Edit - %1s (only in %2s)" msgstr "" #: classes/class-smart-manager-pricing.php:506 msgid "Bulk Edit / Batch Update" msgstr "" #: assets/js/smart-manager.js:1705 msgctxt "button" msgid "Add" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:50 msgctxt "button" msgid "Add a condition" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:66 msgctxt "button" msgid "Add another group" msgstr "" #: assets/js/smart-manager.js:1713 msgctxt "button" msgid "Add images to product gallery" msgstr "" #: assets/js/smart-manager.js:396 msgctxt "button" msgid "Add Row" msgstr "" #: assets/js/smart-manager.js:1714 msgctxt "button" msgid "Add to gallery" msgstr "" #: assets/js/smart-manager.js:382 msgctxt "button" msgid "Bulk Edit" msgstr "" #: assets/js/smart-manager.js:2436 msgctxt "button" msgid "Cancel" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:118 #: src/views/BulkEditDialog.js:112 msgctxt "button" msgid "Clear" msgstr "" #: assets/js/smart-manager.js:438 msgctxt "button" msgid "Columns" msgstr "" #: assets/js/smart-manager.js:2435 msgctxt "button" msgid "Create" msgstr "" #: assets/js/smart-manager.js:412 msgctxt "button" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:402 msgctxt "button" msgid "Duplicate" msgstr "" #: assets/js/smart-manager.js:424 msgctxt "button" msgid "Export CSV" msgstr "" #: assets/js/smart-manager.js:2579 msgctxt "button" msgid "Get Pro at 25% OFF" msgstr "" #: assets/js/smart-manager.js:175 #, javascript-format msgctxt "button" msgid "Load More %s" msgstr "" #: assets/js/smart-manager.js:3151 msgctxt "button" msgid "No" msgstr "" #: assets/js/smart-manager-product.js:243 assets/js/smart-manager.js:1092 msgctxt "button" msgid "OK" msgstr "" #: assets/js/smart-manager.js:430 msgctxt "button" msgid "Print Invoice" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:74 msgctxt "button" msgid "Remove this group" msgstr "" #: pro/assets/js/smart-manager.js:968 msgctxt "button" msgid "Reset" msgstr "" #: assets/js/smart-manager.js:390 msgctxt "button" msgid "Save" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:99 msgctxt "button" msgid "Search" msgstr "" #: assets/js/smart-manager-product.js:199 msgctxt "button" msgid "Select all" msgstr "" #: assets/js/smart-manager-product.js:200 msgctxt "button" msgid "Select none" msgstr "" #: assets/js/admin.js:1 assets/js/smart-manager.js:2744 #: src/views/BulkEditDialog.js:98 pro/assets/js/smart-manager.js:963 msgctxt "button" msgid "Update" msgstr "" #: assets/js/smart-manager.js:3134 msgctxt "button" msgid "Yes" msgstr "" #: classes/class-smart-manager-pricing.php:355 #: classes/class-smart-manager-pricing.php:367 #: classes/class-smart-manager-pricing.php:378 #: classes/class-smart-manager-pricing.php:389 msgid "Buy Now" msgstr "" #: classes/class-smart-manager-pricing.php:648 msgid "Buy Smart Manager Pro" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:144 msgid "Calculate unit prices automatically" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:214 msgid "Calendar always visible" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:211 msgid "Calendar display mode" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:118 msgid "Can be cancelled?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:405 msgid "Can I import using Smart Manager?" msgstr "" #: classes/class-smart-manager-product.php:1147 msgid "Catalog Visibility" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:139 msgid "Category group-of rules: Exclude" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:235 msgid "Check rules against..." msgstr "" #: assets/js/smart-manager-product.js:285 msgctxt "checkbox list" msgid "Position:" msgstr "" #: class-smart-manager.php:862 msgid "Click here" msgstr "" #: classes/class-smart-manager-admin-welcome.php:402 msgid "click here" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:423 msgid "Click to copy" msgstr "" # @ smart-manager #: class-smart-manager.php:1468 msgid "Click to upgrade." msgstr "Click pentru upgrade." #: classes/class-smart-manager-pricing.php:462 msgid "Columns (Show / Hide / Sort)" msgstr "" #: classes/class-smart-manager-pricing.php:612 #: classes/class-smart-manager-pricing.php:623 msgid "Coming soon" msgstr "" # @ smart-manager #: pro/classes/class-smart-manager-pro-access-privilege.php:335 msgid "Company logo:" msgstr "Logo-ul firmei:" # @ smart-manager #: pro/classes/class-smart-manager-pro-background-updater.php:337 #, fuzzy #| msgid " Deleted Successfully" msgid "completed Successfully" msgstr "Sters cu succes" #: pro/classes/class-smart-manager-pro-acf-field-group.php:43 #: pro/classes/class-smart-manager-pro-acf-field.php:43 msgid "Config Options" msgstr "" #: classes/class-smart-manager-pricing.php:340 #, php-format msgid "Congratulations! You just unlocked %s on Smart Manager Pro" msgstr "" #: classes/class-smart-manager-admin-welcome.php:414 msgid "contact us" msgstr "" #: classes/class-smart-manager-shop-order.php:440 #: pro/classes/class-smart-manager-pro-product.php:107 msgid "Cost of Good" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:122 msgid "Count persons as bookings" msgstr "" # @ wpsc #: classes/class-smart-manager-shop-coupon.php:115 msgid "Coupon Code" msgstr "Cod cupon" #: pro/classes/class-smart-manager-pro-shop-coupon.php:333 msgid "Coupon expiry date" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:338 msgid "Coupon expiry time" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:255 msgid "Coupon Is Visible Storewide" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:354 msgid "Coupon shareable link" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:242 msgid "Coupon Title Prefix" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:243 msgid "Coupon Title Suffix" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:240 msgid "Coupon Validity" msgstr "" #: classes/class-smart-manager-pricing.php:551 msgid "Create Column Sets / Custom Views" msgstr "" #: classes/class-smart-manager-pricing.php:433 msgid "custom post types and their custom fields." msgstr "" #: assets/js/smart-manager.js:364 msgctxt "custom view button" msgid "Create" msgstr "" #: assets/js/smart-manager.js:366 msgctxt "custom view button" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:365 msgctxt "custom view button" msgid "Update" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:186 msgid "Customer defined blocks of" msgstr "" #: classes/class-smart-manager-shop-order.php:164 msgid "Customer provided note" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:221 msgid "Customer selected" msgstr "" #: assets/js/smart-manager.js:315 msgctxt "dashboard groups" msgid "All post types" msgstr "" #: assets/js/smart-manager.js:326 msgctxt "dashboard groups" msgid "All saved views" msgstr "" #: assets/js/smart-manager.js:299 msgctxt "dashboard groups" msgid "Common post types" msgstr "" #: assets/js/smart-manager.js:310 msgctxt "dashboard groups" msgid "Recently used views" msgstr "" # @ wpsc #: classes/class-smart-manager-shop-order.php:160 #: pro/classes/class-smart-manager-pro-shop-subscription.php:175 #, fuzzy #| msgid "State" msgid "Date" msgstr "Judet" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "days" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "months" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "weeks" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "years" msgstr "" #: pro/assets/js/smart-manager.js:34 msgctxt "date operator" msgid "set date to" msgstr "" #: pro/assets/js/smart-manager.js:33 msgctxt "datetime operator" msgid "set date to" msgstr "" #: pro/assets/js/smart-manager.js:33 msgctxt "datetime operator" msgid "set datetime to" msgstr "" #: pro/assets/js/smart-manager.js:33 msgctxt "datetime operator" msgid "set time to" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:149 msgid "Day(s)" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:133 msgid "Default" msgstr "" #: assets/js/smart-manager.js:415 msgctxt "delete button" msgid "Delete Permanently" msgstr "" #: assets/js/smart-manager.js:414 msgctxt "delete button" msgid "Move to Trash" msgstr "" #: class-smart-manager.php:1118 msgid "" "Delete Permanently is disabled. Please contact store administrator for " "enabling the same." msgstr "" #: class-smart-manager.php:1149 #: classes/class-smart-manager-admin-welcome.php:319 msgid "Delete Records" msgstr "" # @ smart-manager #: classes/class-smart-manager-product.php:956 #: classes/class-smart-manager-shop-coupon.php:117 msgid "Description" msgstr "Descriere" #: assets/js/smart-manager.js:2719 msgctxt "description" msgid "" "Drag & drop the enabled columns to the right side to disable them. Drag & " "drop the disabled columns to the left side to enable them." msgstr "" #: assets/js/smart-manager.js:2721 msgctxt "description" msgid "Drag the columns to the top or bottom to sort them." msgstr "" #: pro/assets/js/smart-manager.js:603 msgctxt "description" msgid "" "Marking this view public will make it available to all users having access " "to the Smart Manager." msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:248 msgid "Disable Email Restriction" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:213 msgid "Display calendar on click" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:244 msgid "Display message" msgstr "" #: classes/class-smart-manager-product.php:910 msgid "Do Not Allow" msgstr "" #: classes/class-smart-manager-admin-welcome.php:254 msgid "Docs" msgstr "" #: class-smart-manager.php:672 msgid "Docs & Support" msgstr "" #: assets/js/smart-manager.js:101 msgctxt "dropdown operator" msgid "is" msgstr "" #: assets/js/smart-manager.js:101 msgctxt "dropdown operator" msgid "is not" msgstr "" #: classes/class-smart-manager-pricing.php:540 msgid "Duplicate all records in a single click" msgstr "" #: assets/js/smart-manager.js:405 msgctxt "duplicate button" msgid "Entire Store" msgstr "" #: assets/js/smart-manager.js:404 msgctxt "duplicate button" msgid "Selected Records" msgstr "" #: class-smart-manager.php:1149 msgid "Duplicate Records" msgstr "" #: classes/class-smart-manager-pricing.php:529 msgid "Duplicate single / multiple records" msgstr "" #: pro/templates/email.php:7 msgid "Duplicated" msgstr "" #: classes/class-smart-manager-pricing.php:636 msgid "Email / Call" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:1257 msgid "Email already exists. Please enter another email." msgstr "" #: pro/classes/class-smart-manager-pro-user.php:1251 msgid "Email cannot be empty" msgstr "" # @ smart-manager #: pro/templates/order-invoice.php:158 msgid "Email id" msgstr "Email id" #: pro/classes/class-smart-manager-pro-shop-coupon.php:251 msgid "Email message?" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:116 msgid "Enable Calendar Range Picker?" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:130 msgid "Enable Min Max Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:123 msgid "Enable person types" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:307 msgid "Error" msgstr "" # @ smart-manager #: class-smart-manager.php:1585 msgid "Error:" msgstr "Eroare:" #: classes/class-smart-manager-pricing.php:431 msgid "Everything in Lite +" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:226 msgid "Exclude Attributes" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:211 msgid "Exclude categories" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:231 msgid "Exclude products" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:249 msgid "Exclude sale items" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:257 msgid "Expire After" msgstr "" #: pro/classes/class-smart-manager-pro-wc-user-membership.php:169 #: pro/classes/class-smart-manager-pro-wc-user-membership.php:170 msgid "Expires" msgstr "" #: classes/class-smart-manager-pricing.php:518 msgid "Export all / Filtered records as CSV" msgstr "" # @ smart-manager #: classes/class-smart-manager-admin-welcome.php:347 msgid "Export CSV" msgstr "Exporta CSV" #: classes/class-smart-manager-admin-welcome.php:349 #, php-format msgid "Export CSV (only in %s)" msgstr "" #: classes/class-smart-manager-product.php:972 msgid "External Url" msgstr "" #: classes/class-smart-manager-admin-welcome.php:380 msgid "FAQ / Common Problems" msgstr "" #: classes/class-smart-manager-admin-welcome.php:264 msgid "FAQ's" msgstr "" #: classes/class-smart-manager-product.php:1194 msgid "Featured" msgstr "" #: classes/class-smart-manager-product.php:2018 #: classes/class-smart-manager-product.php:2021 msgid "Featured Image updated successfully" msgstr "" #: classes/class-smart-manager-pricing.php:410 msgid "Features" msgstr "" #: pro/templates/email.php:42 msgid "Field" msgstr "" #: classes/class-smart-manager-admin-welcome.php:290 msgid "Filter / Search Records" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:185 msgid "Fixed blocks of" msgstr "" #: classes/class-smart-manager-admin-welcome.php:419 #, php-format msgid "Follow steps listed here: %s" msgstr "" # @ smart-manager #: pro/classes/class-smart-manager-pro-background-updater.php:337 #, fuzzy #| msgid "Or" msgid "for" msgstr "Sau" #: pro/classes/class-smart-manager-pro-shop-coupon.php:256 msgid "For new user only?" msgstr "" #: classes/class-smart-manager-pricing.php:413 msgid "Free" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:105 msgid "Free Trial" msgstr "" #: classes/class-smart-manager-admin-welcome.php:236 #: classes/class-smart-manager-admin-welcome.php:362 msgid "Get started with Smart Manager" msgstr "" #: classes/class-smart-manager-admin-welcome.php:232 msgid "" "Glad to have you onboard. We hope Smart Manager adds to your desired success " "ðŸ†" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:38 msgctxt "group content" msgid "of the following conditions is true." msgstr "" #: pro/classes/class-smart-manager-pro-acf-field.php:45 msgid "Group Id" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:90 msgid "Group of..." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:119 msgid "Has persons" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:120 msgid "Has resources" msgstr "" #: assets/js/smart-manager.js:2732 msgctxt "heading" msgid "Disabled" msgstr "" #: assets/js/smart-manager.js:2725 msgctxt "heading" msgid "Enabled" msgstr "" #: class-smart-manager.php:861 #, php-format msgid "Hey %1s, you just unlocked %2s on Smart Manager Pro!" msgstr "" #: pro/templates/email.php:35 msgid "Hi there!" msgstr "" # @ smart-manager #: classes/class-smart-manager-product.php:736 msgid "Hidden" msgstr "Ascuns" #: pro/classes/class-smart-manager-pro-product.php:150 msgid "Hour(s)" msgstr "" #: classes/class-smart-manager-admin-welcome.php:418 msgid "How do I upgrade a Lite version to a Pro version?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:401 msgid "How to add columns to Smart Manager dashboard?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:397 msgid "" "How to manage any custom field of any custom plugin using Smart Manager?" msgstr "" #. Author URI of the plugin msgid "https://www.storeapps.org/" msgstr "" #. URI of the plugin msgid "https://www.storeapps.org/product/smart-manager/" msgstr "" #: classes/class-smart-manager-admin-welcome.php:413 msgid "I can't find a way to do X..." msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:118 msgid "I found another plugin for my needs" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:106 msgid "I only needed the plugin for a short period" msgstr "" #: classes/class-smart-manager-pricing.php:397 msgid "I would happily pay five times for this product!" msgstr "" #: classes/class-smart-manager-pricing.php:669 msgid "" "I've got over 200 products and dreaded managing them one by one. Smart " "Manager Pro plugin lets me do this so much quicker. Probably 20 or 30 times " "quicker. It is an absolutely invaluable tool." msgstr "" #: pro/templates/email.php:62 msgid "If you like" msgstr "" #: classes/class-smart-manager-pricing.php:606 msgid "Import" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:315 msgid "Important" msgstr "" #: classes/class-smart-manager-product.php:862 msgid "In stock" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:317 msgid "in the background. You will be notified on" msgstr "" #: class-smart-manager.php:1149 msgid "" "In the meanwhile, you can use Smart Manager. But before using actions like " msgstr "" #: pro/classes/class-smart-manager-pro-base.php:34 msgid "Index" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:250 msgid "Individual use only" msgstr "" #: classes/class-smart-manager-admin-welcome.php:299 msgid "Inline Editing" msgstr "" #: classes/class-smart-manager-pricing.php:438 msgid "Inline editing" msgstr "" # @ smart-manager #: class-smart-manager.php:1468 msgid "is available." msgstr "este disponibil." #: pro/classes/class-smart-manager-pro-shop-coupon.php:254 msgid "Is Pick Price of Product" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:124 msgid "It is a temporary deactivation. I am just debugging an issue." msgstr "" #: classes/class-smart-manager-pricing.php:400 msgid "Jeff" msgstr "" #: pro/classes/class-smart-manager-pro-acf-field-group.php:44 #: pro/classes/class-smart-manager-pro-acf-field.php:44 msgid "Key" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:102 msgid "" "Kindly share what did not work for you / conflicting with which plugin so we " "can fix it..." msgstr "" #: classes/class-smart-manager-admin-welcome.php:261 msgid "Know Smart Manager" msgstr "" #: pro/classes/class-smart-manager-pro-acf-field-group.php:41 #: pro/classes/class-smart-manager-pro-acf-field.php:41 msgid "Label" msgstr "" #: classes/class-smart-manager-admin-welcome.php:386 #: classes/class-smart-manager-admin-welcome.php:419 msgid "latest version" msgstr "" #: class-smart-manager.php:1447 msgid "LITE" msgstr "" #: classes/class-smart-manager-admin-welcome.php:386 #, php-format msgid "" "Make sure you are using %s of Smart Manager. If still the issue persist, " "temporarily de-activate all plugins except WooCommerce/WPeCommerce & Smart " "Manager. Re-check the issue, if the issue still persists, contact us. If the " "issue goes away, re-activate other plugins one-by-one & re-checking the " "fields, to find out which plugin is conflicting." msgstr "" #: classes/class-smart-manager-pricing.php:617 msgid "Manage Custom Taxonomies" msgstr "" #: classes/class-smart-manager-pricing.php:573 msgid "Manage WordPress User roles" msgstr "" #: classes/class-smart-manager-admin-welcome.php:287 msgid "Manage your entire store from a single screen" msgstr "" #: classes/class-smart-manager-pricing.php:677 msgid "Massive time-savings and 10x productivity boost. Choice is yours!" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:83 msgid "Max bookings per block" msgstr "" # @ smart-manager #: pro/classes/class-smart-manager-pro-shop-coupon.php:236 #, fuzzy #| msgid "Cart Discount" msgid "Max discount" msgstr "Reducere cos" #: pro/classes/class-smart-manager-pro-product.php:82 msgid "Max persons" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:101 msgid "Max Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:85 msgid "Maximum block bookable" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:206 msgid "Maximum block bookable (Unit)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:79 msgid "Maximum duration" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:96 msgid "Maximum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:89 msgid "Maximum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-wc-user-membership.php:164 #: pro/classes/class-smart-manager-pro-wc-user-membership.php:165 msgid "Member since" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:148 msgid "Meta robots advanced" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:81 msgid "Min persons" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:100 msgid "Min Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:135 msgid "Min/Max Rules" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:84 msgid "Minimum block bookable" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:201 msgid "Minimum block bookable (Unit)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:78 msgid "Minimum duration" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:95 msgid "Minimum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:88 msgid "Minimum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:151 msgid "Minutes(s)" msgstr "" #: assets/js/smart-manager.js:2330 msgctxt "modal content" msgid "all" msgstr "" #: assets/js/smart-manager.js:2329 #, javascript-format msgctxt "modal content" msgid "Are you sure you want to %s" msgstr "" #: assets/js/smart-manager.js:2330 #, javascript-format msgctxt "modal content" msgid "Are you sure you want to %s the %s?" msgstr "" #: assets/js/smart-manager.js:2529 msgctxt "modal content" msgid "Are you sure you want to duplicate the " msgstr "" #: assets/js/smart-manager.js:3114 msgctxt "modal content" msgid "Are you sure?" msgstr "" #: assets/js/smart-manager.js:3092 msgctxt "modal content" msgid "Continue in background" msgstr "" #: pro/assets/js/smart-manager.js:595 msgctxt "modal content" msgid "" "Create a custom view to save selected columns from a dashboard. Use it for " "saved searches, giving specific columns access to other users, etc." msgstr "" #: assets/js/smart-manager.js:2472 msgctxt "modal content" msgid "delete" msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "delete all" msgstr "" #: assets/js/smart-manager.js:2433 #, javascript-format msgctxt "modal content" msgid "Enter how many new %s(s) to create!" msgstr "" #: assets/js/smart-manager.js:261 assets/js/smart-manager.js:2207 #, javascript-format msgctxt "modal content" msgid "For managing %s, %s %s version" msgstr "" #: assets/js/smart-manager.js:3092 msgctxt "modal content" msgid "Initializing..." msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "Note: Looking to" msgstr "" #: assets/js/smart-manager.js:2323 msgctxt "modal content" msgid "permanently delete" msgstr "" #: assets/js/smart-manager.js:261 assets/js/smart-manager.js:2207 #: assets/js/smart-manager.js:3061 msgctxt "modal content" msgid "Pro" msgstr "" #: assets/js/smart-manager.js:2329 msgctxt "modal content" msgid "record" msgstr "" #: assets/js/smart-manager.js:2329 msgctxt "modal content" msgid "records" msgstr "" #: assets/js/smart-manager.js:2472 msgctxt "modal content" msgid "the current view. Are you sure you want to continue?" msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "the records?" msgstr "" #: assets/js/smart-manager.js:2329 msgctxt "modal content" msgid "the selected" msgstr "" #: assets/js/smart-manager.js:3061 #, javascript-format msgctxt "modal content" msgid "This feature is available only in the %s version" msgstr "" #: assets/js/smart-manager.js:2472 msgctxt "modal content" msgid "This will" msgstr "" #: assets/js/smart-manager.js:2528 msgctxt "modal content" msgid "" "This will duplicate only the records in posts, postmeta and related " "taxonomies." msgstr "" #: assets/js/smart-manager.js:2323 msgctxt "modal content" msgid "trash" msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "Upgrade to Pro" msgstr "" #: assets/js/smart-manager.js:2557 msgctxt "modal description" msgid "" "You can change / update multiple fields of the entire store OR for selected " "items by selecting multiple records and then click on Bulk Edit." msgstr "" #: assets/js/smart-manager.js:2560 msgctxt "modal description" msgid "" "You can export all the records OR filtered records (using Simple Search or " "Advanced Search) by simply clicking on the Export CSV button at the bottom " "right of the grid." msgstr "" #: assets/js/smart-manager.js:2566 msgctxt "modal title" msgid "(Only in" msgstr "" #: assets/js/smart-manager.js:2432 #, javascript-format msgctxt "modal title" msgid "Add %s(s)" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:60 msgctxt "modal title" msgid "Advanced Search" msgstr "" #: assets/js/smart-manager.js:2319 assets/js/smart-manager.js:2471 #: assets/js/smart-manager.js:2527 msgctxt "modal title" msgid "Attention!!!" msgstr "" #: assets/js/smart-manager.js:2566 msgctxt "modal title" msgid "Biggest Time Saver" msgstr "" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:66 #: pro/assets/js/smart-manager.js:718 pro/assets/js/smart-manager.js:973 msgctxt "modal title" msgid "Bulk Edit" msgstr "" #: assets/js/smart-manager.js:2749 msgctxt "modal title" msgid "Column Manager - Show/Hide Columns" msgstr "" #: pro/assets/js/smart-manager.js:1273 msgctxt "modal title" msgid "Delete Records" msgstr "" #: pro/assets/js/smart-manager.js:489 msgctxt "modal title" msgid "Duplicate Records" msgstr "" #: assets/js/smart-manager.js:2994 assets/js/smart-manager.js:3060 msgctxt "modal title" msgid "Note" msgstr "" #: assets/js/smart-manager.js:3091 msgctxt "modal title" msgid "Please Wait" msgstr "" #: assets/js/smart-manager.js:2566 msgctxt "modal title" msgid "Pro" msgstr "" #: assets/js/smart-manager.js:2992 msgctxt "modal title" msgid "Success" msgstr "" #: assets/js/smart-manager.js:3113 msgctxt "modal title" msgid "Warning" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:148 msgid "Month(s)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:121 msgid "Multiply all costs by person count" msgstr "" # @ wpsc # @ smart-manager #: classes/class-smart-manager-product.php:952 #: pro/classes/class-smart-manager-pro-acf-field-group.php:42 #: pro/classes/class-smart-manager-pro-acf-field.php:42 msgid "Name" msgstr "Nume" #: pro/classes/class-smart-manager-pro-product.php:260 msgid "Never expire" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:185 msgid "Nickname" msgstr "" # @ smart-manager #: pro/classes/class-smart-manager-pro-base.php:135 #: pro/classes/class-smart-manager-pro-base.php:143 msgid "No" msgstr "Nu" #: pro/classes/class-smart-manager-pro-base.php:29 #: pro/classes/class-smart-manager-pro-base.php:37 msgid "No Archive" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:36 msgid "No Follow" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:28 #: pro/classes/class-smart-manager-pro-base.php:38 msgid "No Image Index" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:35 msgid "No Index" msgstr "" #: classes/class-smart-manager-product.php:941 #: classes/class-smart-manager-product.php:943 msgid "No shipping class" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:30 #: pro/classes/class-smart-manager-pro-base.php:39 msgid "No Snippet" msgstr "" # @ smart-manager #: classes/class-smart-manager-product.php:846 #: classes/class-smart-manager-product.php:852 #: pro/classes/class-smart-manager-pro-base.php:27 msgid "None" msgstr "Nici unul" #: pro/classes/class-smart-manager-pro-product.php:230 msgid "not-available by default" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:329 msgid "NOTE" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "column if not enabled using" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "column show/hide functionality" msgstr "" #: assets/js/smart-manager.js:2460 assets/js/smart-manager.js:2482 msgctxt "notification" msgid "Custom Views avialable (Only in" msgstr "" #: assets/js/smart-manager.js:2590 msgctxt "notification" msgid "Duplicate Records (Only in" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "Enable" msgstr "" #: assets/js/smart-manager.js:3048 msgctxt "notification" msgid "Error" msgstr "" #: assets/js/smart-manager.js:2422 msgctxt "notification" msgid "For editing more records upgrade to Pro" msgstr "" #: assets/js/smart-manager.js:263 assets/js/smart-manager.js:2208 #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "Note" msgstr "" #: assets/js/smart-manager.js:2272 msgctxt "notification" msgid "Please edit a record" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "Please enter user email" msgstr "" #: assets/js/smart-manager.js:2309 assets/js/smart-manager.js:2545 msgctxt "notification" msgid "Please select a record" msgstr "" #: assets/js/smart-manager.js:2460 assets/js/smart-manager.js:2482 #: assets/js/smart-manager.js:2590 msgctxt "notification" msgid "Pro" msgstr "" #: assets/js/smart-manager.js:2314 msgctxt "notification" msgid "records at a time" msgstr "" #: assets/js/smart-manager.js:2954 pro/assets/js/smart-manager.js:567 #: pro/assets/js/smart-manager.js:690 msgctxt "notification" msgid "Success" msgstr "" # @ smart-manager #: assets/js/admin.js:1 src/views/RuleGroup.js:57 #, fuzzy msgctxt "notification" msgid "This feature is available only in the Pro version." msgstr "Aceasta optiune este disponibila doar in versiunea Pro" #: assets/js/smart-manager.js:2314 msgctxt "notification" msgid "To delete more than" msgstr "" #: assets/js/smart-manager.js:2299 msgctxt "notification" msgid "To permanently delete records" msgstr "" #: assets/js/smart-manager.js:2299 assets/js/smart-manager.js:2314 msgctxt "notification" msgid "upgrade to Pro" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "User Email" msgstr "" #: pro/assets/js/smart-manager.js:567 #, javascript-format msgctxt "notification" msgid "View %sd successfully!" msgstr "" #: pro/assets/js/smart-manager.js:658 msgctxt "notification" msgid "View already exists. Please try another name" msgstr "" #: pro/assets/js/smart-manager.js:690 msgctxt "notification" msgid "View deleted successfully!" msgstr "" #: assets/js/smart-manager.js:3048 msgctxt "notification" msgid "You have entered incorrect data in the highlighted cells." msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "decrease by %" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "decrease by number" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "increase by %" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "increase by number" msgstr "" #: classes/class-smart-manager-product.php:864 msgid "On backorder" msgstr "" # @ smart-manager #: pro/templates/order-invoice.php:201 msgid "Order Discount" msgstr "Reducere comanda" # @ smart-manager #: pro/templates/order-invoice.php:195 msgid "Order Notes" msgstr "Notite comanda" #: pro/classes/class-smart-manager-pro-product.php:137 msgid "Order rules: Do not count" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:138 msgid "Order rules: Exclude" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:130 msgid "Other" msgstr "" #: classes/class-smart-manager-product.php:863 msgid "Out of stock" msgstr "" # @ smart-manager #: pro/classes/class-smart-manager-pro-shop-coupon.php:217 #, fuzzy #| msgid "Payment Method" msgid "Payment Methods" msgstr "Metoda de plata" #: pro/assets/js/smart-manager.js:853 pro/assets/js/smart-manager.js:857 #: pro/assets/js/smart-manager.js:943 pro/assets/js/smart-manager.js:1054 #: pro/assets/js/smart-manager.js:1075 pro/assets/js/smart-manager.js:1094 msgctxt "placeholder" msgid "Enter a value..." msgstr "" #: pro/assets/js/smart-manager-product.js:225 msgctxt "placeholder" msgid "Enter Attribute name..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:428 msgctxt "placeholder" msgid "Enter attribute name..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:63 src/views/Rule.js:357 #: src/views/Rule.js:372 msgctxt "placeholder" msgid "Enter value" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:429 #: pro/assets/js/smart-manager-product.js:226 msgctxt "placeholder" msgid "Enter values..." msgstr "" #: pro/assets/js/smart-manager.js:596 msgctxt "placeholder" msgid "Give a name to this view" msgstr "" #: assets/js/smart-manager-product.js:208 #: assets/js/smart-manager-product.js:313 msgctxt "placeholder" msgid "Name" msgstr "" #: assets/js/smart-manager-product.js:203 #: assets/js/smart-manager-product.js:209 #: assets/js/smart-manager-product.js:307 #: assets/js/smart-manager-product.js:314 msgctxt "placeholder" msgid "Pipe (|) separate terms" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:429 #: pro/assets/js/smart-manager.js:1155 msgctxt "placeholder" msgid "Replace with..." msgstr "" #: assets/js/smart-manager.js:2733 msgctxt "placeholder" msgid "Search For Disabled Columns..." msgstr "" #: assets/js/smart-manager.js:2726 msgctxt "placeholder" msgid "Search For Enabled Columns..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:428 #: pro/assets/js/smart-manager.js:1154 msgctxt "placeholder" msgid "Search for..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:230 #: pro/assets/js/smart-manager.js:1119 #, javascript-format msgctxt "placeholder" msgid "Select %s" msgstr "" #: assets/js/smart-manager-product.js:190 #: assets/js/smart-manager-product.js:293 msgctxt "placeholder" msgid "Select terms" msgstr "" #: assets/js/smart-manager.js:278 msgctxt "placeholder" msgid "Type to search..." msgstr "" #: pro/templates/email.php:62 msgid "please leave us a" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:132 msgid "Please mention..." msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:71 msgid "Please select an option" msgstr "" #: assets/js/smart-manager-product.js:183 msgctxt "position checkbox" msgid "Position:" msgstr "" # @ wpsc # @ smart-manager #: classes/class-smart-manager-shop-order.php:437 #: pro/templates/order-invoice.php:163 msgid "Price" msgstr "Pret" #: classes/class-smart-manager-pricing.php:641 msgid "Pricing" msgstr "" # @ smart-manager #: pro/classes/class-smart-manager-pro-access-privilege.php:330 msgid "Print Order Settings" msgstr "Setarile de printare" #: classes/class-smart-manager-pricing.php:584 msgid "Print packing slips for WooCommerce orders in bulk" msgstr "" #: classes/class-smart-manager-pricing.php:562 msgid "Print PDF invoices" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:195 msgid "Privileges for Smart Manager for different System Roles" msgstr "" #: class-smart-manager.php:1447 msgid "PRO" msgstr "" #: classes/class-smart-manager-admin-welcome.php:333 #: classes/class-smart-manager-admin-welcome.php:349 #: classes/class-smart-manager-pricing.php:416 msgid "Pro" msgstr "" # @ smart-manager #: pro/templates/order-invoice.php:162 msgid "Product" msgstr "Produs" #: pro/classes/class-smart-manager-pro-shop-coupon.php:223 msgid "Product Attributes" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:209 msgid "Product categories" msgstr "" #: pro/assets/js/smart-manager-product.js:127 msgctxt "product price operator" msgid "set to regular price" msgstr "" #: pro/assets/js/smart-manager-product.js:123 msgctxt "product price operator" msgid "set to sale price" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:109 msgid "Product Units" msgstr "" # @ smart-manager #: pro/classes/class-smart-manager-pro-shop-coupon.php:229 msgid "Products" msgstr "Produse" #: pro/classes/class-smart-manager-pro-background-updater.php:322 msgid "Progress" msgstr "" # @ smart-manager #: pro/assets/js/smart-manager.js:601 #, fuzzy #| msgid "Publish" msgid "Public" msgstr "Public" # @ smart-manager #: classes/class-smart-manager-shop-order.php:437 msgid "Qty" msgstr "Cantitate" # @ wpsc # @ smart-manager #: pro/templates/order-invoice.php:163 msgid "Quantity" msgstr "Cantitate" #: classes/class-smart-manager-admin-welcome.php:248 msgid "Questions? Need Help?" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:65 msgid "Quick Feedback for Smart Manager plugin" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:103 msgid "Rank Math SEO Score" msgstr "" #: pro/templates/email.php:62 msgid "rating. A huge thank you from StoreApps in advance!" msgstr "" #: pro/templates/email.php:45 msgid "Records Updated" msgstr "" #: classes/class-smart-manager-product.php:890 msgid "Reduced Rate" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:111 msgid "Regular Unit Price" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:316 msgid "request is running" msgstr "" #: classes/class-smart-manager-admin-welcome.php:390 msgid "" "Request you to kindly de-activate and activate the Smart Manager plugin once " "and then have a recheck with the search functionality." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:86 msgid "Require a buffer period of" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:117 msgid "Requires confirmation?" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:219 msgid "Resources are..." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:124 msgid "Restrict start and end days?" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:153 msgid "Robots Meta" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:32 msgctxt "rule content" msgid "This group is a \"pass\" when" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:35 msgctxt "rule option" msgid "all" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:36 msgctxt "rule option" msgid "at least one" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:112 msgid "Sale Unit Price" msgstr "" #: assets/js/smart-manager.js:280 assets/js/smart-manager.js:539 #, javascript-format msgctxt "search conditions" msgid "%d condition%s" msgstr "" #: assets/js/smart-manager.js:280 assets/js/smart-manager.js:539 msgctxt "search conditions" msgid "s" msgstr "" #: classes/class-smart-manager-product.php:735 msgid "Search results only" msgstr "" #: assets/js/smart-manager.js:354 assets/js/smart-manager.js:355 #, javascript-format msgctxt "search type" msgid "%s Search" msgstr "" #: assets/js/smart-manager.js:276 msgctxt "search type" msgid "Advanced" msgstr "" #: assets/js/smart-manager.js:276 msgctxt "search type" msgid "Simple" msgstr "" #: classes/class-smart-manager-admin-welcome.php:324 #: classes/class-smart-manager-admin-welcome.php:341 msgid "See how" msgstr "" #: classes/class-smart-manager-admin-welcome.php:295 #: classes/class-smart-manager-admin-welcome.php:304 msgid "see how" msgstr "" # @ smart-manager #: pro/assets/js/smart-manager-product.js:152 pro/assets/js/smart-manager.js:24 #: pro/assets/js/smart-manager.js:890 #, fuzzy #| msgid "Select an action" msgid "Select Action" msgstr "Selecteaza o actiune" #: pro/assets/js/smart-manager-product.js:143 msgid "Select Attribute" msgstr "" # @ smart-manager #: pro/assets/js/smart-manager.js:874 #, fuzzy #| msgid "Select a field" msgid "Select Field" msgstr "Selecteaza un camp" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:147 #: pro/assets/js/smart-manager.js:871 msgid "Selected Items" msgstr "" #: classes/class-smart-manager-pricing.php:513 msgid "" "Set to, Append, Prepend, Increase / Decrease by %, Increase / Decrease by " "number, Set datetime to, Set date to, Set time to, Upload images and many " "more..." msgstr "" #: class-smart-manager.php:669 class-smart-manager.php:1455 #: classes/class-smart-manager-admin-welcome.php:252 #: pro/classes/class-smart-manager-pro-access-privilege.php:178 msgid "Settings" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:56 msgid "Settings Saved Successfully!!!" msgstr "" # @ wpsc # @ smart-manager #: pro/classes/class-smart-manager-pro-shop-coupon.php:328 #: pro/templates/order-invoice.php:197 msgid "Shipping" msgstr "Livrare" # @ smart-manager #: pro/templates/order-invoice.php:151 msgid "Shipping Address" msgstr "Adresa de livrare" # @ smart-manager #: pro/classes/class-smart-manager-pro-shop-coupon.php:215 #, fuzzy #| msgid "Shipping Method" msgid "Shipping methods" msgstr "Metoda livrare" # @ smart-manager #: classes/class-smart-manager-product.php:845 #: classes/class-smart-manager-product.php:851 msgid "Shipping only" msgstr "Doar livrare" #: classes/class-smart-manager-product.php:733 msgid "Shop and search results" msgstr "" #: classes/class-smart-manager-product.php:734 msgid "Shop only" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:141 #, php-format msgid "Should search engines follow links on this %1$s?" msgstr "" #: assets/js/smart-manager-product.js:435 msgctxt "show variations checkbox" msgid "Show Variations" msgstr "" #: classes/class-smart-manager-admin-welcome.php:308 msgid "Show/Hide & Sort Data Columns" msgstr "" #: classes/class-smart-manager-admin-welcome.php:313 msgid "" "Show/hide multiple data columns of your WooCommerce store data as per your " "requirements. Sort them in ascending or descending order. Smart Manager also " "gives you persistent state management." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:104 msgid "Sign-up Fee" msgstr "" #: classes/class-smart-manager-pricing.php:473 msgid "Simple Search" msgstr "" #: classes/class-smart-manager-admin-welcome.php:295 #, php-format msgid "" "Simply enter the keyword you wish to filter records in the “Simple Search†" "field at the top of the grid (%s). If you need to have a more specific " "search result, then you can switch to “%s“ and then search." msgstr "" #: pro/classes/class-smart-manager-pro-base.php:26 msgid "Site-wide default" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:68 msgid "Skip & Deactivate" msgstr "" # @ wpsc # @ smart-manager #: classes/class-smart-manager-product.php:949 #: pro/templates/order-invoice.php:162 msgid "SKU" msgstr "SKU" #: classes/class-smart-manager-product.php:954 #: pro/classes/class-smart-manager-pro-wc-membership-plan.php:97 #: pro/classes/class-smart-manager-pro-wc-membership-plan.php:98 msgid "Slug" msgstr "" # @ smart-manager #: pro/templates/email.php:62 msgid "Smart Manager" msgstr "Smart Manager" #. Name of the plugin msgid "Smart Manager For WooCommerce – Stock Management, Bulk Edit & more..." msgstr "" #: pro/templates/email.php:36 msgid "Smart Manager has successfully completed" msgstr "" #: classes/class-smart-manager-admin-welcome.php:280 msgid "" "Smart Manager is a unique, revolutionary tool that gives you the power to " "boost your productivity by 10x in managing your WooCommerce store " "by using a familiar, single page, spreadsheet like interface. " msgstr "" #: classes/class-smart-manager-admin-welcome.php:414 #, php-format msgid "" "Smart Manager is actively developed. If you can't find your favorite feature " "(or have a suggestion) %s. We'd love to hear from you." msgstr "" #: classes/class-smart-manager-admin-welcome.php:394 msgid "" "Smart Manager is based on WooCommerce and WPeCommerce and the same e-" "commerce plugins sets the price/sales price of the variation parents " "automatically based on the price/sales price of its variations." msgstr "" #: classes/class-smart-manager-admin-welcome.php:385 msgid "Smart Manager is empty?" msgstr "" #: classes/class-smart-manager-pricing.php:676 msgid "Smart Manager Pro" msgstr "" #: classes/class-smart-manager-admin-welcome.php:389 msgid "Smart Manager search functionality not working" msgstr "" #: classes/class-smart-manager-admin-welcome.php:398 msgid "" "Smart Manager will allow you to manage custom field of any other plugin." msgstr "" #: classes/class-smart-manager-product.php:889 msgid "Standard" msgstr "" # @ smart-manager #: classes/class-smart-manager-shop-order.php:162 #: pro/classes/class-smart-manager-pro-shop-subscription.php:177 msgid "Status" msgstr "Status" #. Author of the plugin msgid "StoreApps" msgstr "" #: class-smart-manager.php:678 msgid "StoreApps Plugins" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:67 msgid "Submit & Deactivate" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:70 msgid "Submit a reason to deactivate" msgstr "" #: classes/class-smart-manager-admin-welcome.php:414 msgid "Submit your query" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:246 msgid "Subscription Periods" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:103 msgid "Subscription Price" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:271 msgid "Subscription Trial Period" msgstr "" #: classes/class-smart-manager-pricing.php:628 msgid "Support" msgstr "" #: classes/class-smart-manager-pricing.php:423 msgid "Supported Post Types" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:66 msgid "Take a moment to let us know why you are deactivating" msgstr "" # @ smart-manager #: pro/templates/order-invoice.php:208 msgid "Tax" msgstr "Taxa" # @ smart-manager #: classes/class-smart-manager-product.php:844 #: classes/class-smart-manager-product.php:850 msgid "Taxable" msgstr "Taxabil" # @ smart-manager #: pro/templates/order-invoice.php:159 msgid "Tel" msgstr "Tel" #: pro/assets/js/smart-manager.js:39 msgctxt "text operator" msgid "append" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "contains" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "is" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "is not" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "not contains" msgstr "" #: pro/assets/js/smart-manager.js:39 msgctxt "text operator" msgid "prepend" msgstr "" #: classes/class-smart-manager-admin-welcome.php:230 #, php-format msgid "Thank you for installing Smart Manager %s!" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:112 msgid "The plugin is great, but I need specific feature that you don't support" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:100 msgid "The plugin is not working / not compatible with another plugin." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:238 msgid "The starting block only" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:22 msgctxt "time duration" msgid "hours" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:22 msgctxt "time duration" msgid "minutes" msgstr "" #: pro/assets/js/smart-manager.js:35 msgctxt "time operator" msgid "set time to" msgstr "" #: assets/js/smart-manager.js:279 msgctxt "title" msgid "Click to add/edit condition" msgstr "" #: assets/js/smart-manager.js:362 msgctxt "title" msgid "Custom Views" msgstr "" # @ smart-manager #: pro/assets/js/smart-manager-product.js:226 #, fuzzy msgctxt "title" msgid "For more than one values, use pipe (|) as delimiter" msgstr "Pentru mai multe de o valoare, foloseste (|) ca delimitare" #: assets/js/smart-manager.js:1700 msgctxt "title" msgid "Gallery Images" msgstr "" #: assets/js/smart-manager.js:447 msgctxt "title" msgid "Load more records" msgstr "" #: assets/js/smart-manager.js:1293 msgctxt "title" msgid "Remove gallery image" msgstr "" #: assets/js/smart-manager.js:354 #, javascript-format msgctxt "title" msgid "Switch to %s" msgstr "" #: classes/class-smart-manager-admin-welcome.php:402 #, php-format msgid "To show / hide columns in the Smart Manager, %s." msgstr "" #: assets/js/smart-manager.js:1410 msgctxt "tooltip" msgid "(Click to sort)" msgstr "" #: assets/js/smart-manager.js:392 msgctxt "tooltip" msgid "Add Row" msgstr "" #: assets/js/smart-manager.js:378 msgctxt "tooltip" msgid "Bulk Edit" msgstr "" #: assets/js/smart-manager.js:412 msgctxt "tooltip" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:402 msgctxt "tooltip" msgid "Duplicate" msgstr "" #: assets/js/smart-manager.js:420 msgctxt "tooltip" msgid "Export CSV" msgstr "" #: assets/js/smart-manager.js:426 msgctxt "tooltip" msgid "Print Invoice" msgstr "" #: assets/js/smart-manager.js:386 msgctxt "tooltip" msgid "Save" msgstr "" #: assets/js/smart-manager.js:434 msgctxt "tooltip" msgid "Show / Hide Columns" msgstr "" # @ wpsc # @ smart-manager #: pro/templates/order-invoice.php:209 msgid "Total" msgstr "Total" #: pro/classes/class-smart-manager-pro-product.php:110 msgid "Unit Price Units" msgstr "" #: classes/class-smart-manager-pricing.php:446 msgid "Unlimited" msgstr "" #: pro/templates/email.php:7 msgid "Updated" msgstr "" #: classes/class-smart-manager-admin-welcome.php:393 msgid "Updating variation parent price/sales price not working?" msgstr "" # @ smart-manager #: pro/classes/class-smart-manager-pro-access-privilege.php:339 msgid "Upload Image" msgstr "Incarca Imagine" #: classes/class-smart-manager-pricing.php:442 msgid "Upto three records without saving" msgstr "" #: classes/class-smart-manager-shop-coupon.php:121 msgid "Usage Limit Per Coupon" msgstr "" #: classes/class-smart-manager-admin-welcome.php:357 msgid "using Simple Search†or Advanced Search" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:241 msgid "Validity Suffix" msgstr "" #: pro/templates/email.php:44 msgid "Value" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:142 msgid "Variation Category group-of rules: Exclude" msgstr "" #: assets/js/smart-manager-product.js:181 msgctxt "variation flag" msgid "Used for variations" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:93 msgid "Variation Group of..." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:98 msgid "Variation Maximum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:92 msgid "Variation Maximum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:97 msgid "Variation Minimum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:91 msgid "Variation Minimum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:140 msgid "Variation Order rules: Do not count" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:141 msgid "Variation Order rules: Exclude" msgstr "" #: classes/class-smart-manager-pricing.php:595 msgid "View Customer Lifetime Value (LTV)" msgstr "" #: classes/class-smart-manager-admin-welcome.php:365 msgid "View our other WooCommerce plugins" msgstr "" #: assets/js/smart-manager-product.js:179 msgctxt "visibility flag" msgid "Visible on the product page" msgstr "" #: classes/class-smart-manager-pricing.php:661 msgid "" "We recommend Smart Manager Pro to everyone who is looking for an extremely " "multi-functional store manager. The plugin is absolutely worth it. Never " "again without Smart Manager!" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:108 msgid "What did you wanted to do in short period?" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:120 msgid "What is that plugin name?" msgstr "" #: classes/class-smart-manager-pricing.php:399 msgid "" "What really sold me on Smart Manager Pro was Bulk Edit. My assistant does " "not have to do any complex math now (earlier, I always feared she would make " "mistakes)! With Smart Manager, she has more free time at hand, so I asked " "her to set up auto responder emails. The response was phenomenal. Repeat " "sales were up by 19.5%." msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:114 msgid "What specific feature you need?" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:317 msgid "when it is completed." msgstr "" #: classes/class-smart-manager-pricing.php:432 msgid "" "WordPress Pages, Media, Users, SEO plugins, WooCommerce Subscriptions, " "Bookings, Memberships, Product Add-ons, Brands…all" msgstr "" #: classes/class-smart-manager-pricing.php:427 msgid "" "WordPress Posts, WooCommerce Products, Product Variations, Orders, Coupons" msgstr "" #: classes/class-smart-manager-pricing.php:632 msgid "WP forum" msgstr "" # @ smart-manager #: pro/classes/class-smart-manager-pro-base.php:134 #: pro/classes/class-smart-manager-pro-base.php:142 msgid "Yes" msgstr "Da" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:69 msgid "Yes - Deactivate" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:98 msgid "Yoast Focus Keyphrase" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:96 msgid "Yoast Meta Description" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:97 msgid "Yoast Meta Keywords" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:101 msgid "Yoast Readability Score" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:102 msgid "Yoast SEO Score" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:95 msgid "Yoast SEO Title" msgstr "" #: classes/class-smart-manager-admin-welcome.php:341 #, php-format msgid "" "You can change / update multiple fields of the entire store OR for selected " "items by selecting multiple records and then click on Bulk Edit. %s." msgstr "" #: classes/class-smart-manager-pricing.php:676 #, php-format msgid "" "You can either spend hours of work in store management or use %s to " "accomplish the same within minutes." msgstr "" #: classes/class-smart-manager-admin-welcome.php:357 #, php-format msgid "" "You can export all the records OR filtered records (%s) by simply clicking " "on the Export CSV button at the bottom right of the grid." msgstr "" #: classes/class-smart-manager-admin-welcome.php:304 #, php-format msgid "" "You can quickly update your Products, Orders, Coupons and Posts from Smart " "Manager itself. This facilitates editing of multiple rows at a time instead " "of editing and saving each row separately, %s." msgstr "" #: classes/class-smart-manager-admin-welcome.php:324 #, php-format msgid "" "You can simply select records you want to delete (check the header box if " "you want to delete all records) and click on the “Delete†icon. All the " "selected records will be deleted. You can even delete records by applying " "search filters. %s." msgstr "" #: classes/class-smart-manager-admin-welcome.php:406 msgid "" "You cannot import using Smart Manager. Use import functionality of " "WooCommerce." msgstr "" #: class-smart-manager.php:1149 msgid "you will have to wait for the current background process to finish." msgstr "" #: classes/class-smart-manager-product.php:891 msgid "Zero Rate" msgstr "" #: classes/class-smart-manager-pricing.php:343 msgid "â° Limited time offer" msgstr "" languages/smart-manager-for-wp-e-commerce-ro_RO.mo000064400000006352147600337620016063 0ustar00Þ•4¼\\:]˜ž µ Öá÷ ( 6B GS\ cn u‚‡Š žªºÀÕÝæíñú þ "3 D R`gksw }ŠŽ¥ ©?·9÷º1=ì * 0 "E h q ‰  » Ñ á ë ñ û    , 1 4 > O ^ n s ˆ  — ž ¨ ² ¶ Ë Þ æ ø   " ) . 6 : @ P S c g 6x :¯ A required Smart Manager file is missing. Can't continue. AcromAdditional DescriptionAn upgrade for Smart Manager ProAttributesBack to Smart ManagerBilling AddressBilling PeriodClick to upgrade.Company logo:Coupon CodeDateDescriptionEmail idError:Export CSVHiddenMax discountNameNoNoneOrder DiscountOrder NotesPayment MethodsPricePrint Order SettingsProductProductsPublicQtyQuantitySKUSelect ActionSelect FieldShippingShipping AddressShipping methodsShipping onlySmart ManagerStatusTaxTaxableTelTotalUpload ImageYescompleted Successfullyforis available.notificationThis feature is available only in the Pro version.titleFor more than one values, use pipe (|) as delimiterProject-Id-Version: Smart Manager 4.2.1 Report-Msgid-Bugs-To: POT-Creation-Date: 2019-04-20 14:04:35+00:00 PO-Revision-Date: 2022-03-17 04:14+0000 Last-Translator: fg Language-Team: Romanian Language: ro_RO Plural-Forms: nplurals=3; plural=(n==1 ? 0 :(((n%100>19)||(( n%100==0)&&(n!=0)))? 2 : 1)); MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Poedit-SourceCharset: utf-8 X-Generator: Loco https://localise.biz/ X-Poedit-KeywordsList: _:1;gettext:1;dgettext:2;ngettext:1,2;dngettext:2,3;__:1;_e:1;_c:1;_n:1,2;_n_noop:1,2;_nc:1,2;__ngettext:1,2;__ngettext_noop:1,2;_x:1,2c;_ex:1,2c;_nx:1,2,4c;_nx_noop:1,2,3c;_n_js:1,2;_nx_js:1,2,3c;esc_attr__:1;esc_html__:1;esc_attr_e:1;esc_html_e:1;esc_attr_x:1,2c;esc_html_x:1,2c;comments_number_link:2,3;t:1;st:1;trans:1;transChoice:1,2 X-Poedit-Basepath: ../ X-Textdomain-Support: yes X-Poedit-SearchPath-0: . X-Loco-Target-Locale: ro_RO X-Loco-Version: 2.5.8; wp-5.9.1Un fisier cerut de Smart Manager lipseste. Nu poate continua.De laDescriere aditionalaUn update pentru Smart Manager ProAtributeInapoi la Smart ManagerAdresa de facturareRegiunea/Judetul de facturareClick pentru upgrade.Logo-ul firmei:Cod cuponJudetDescriereEmail idEroare:Exporta CSVAscunsReducere cosNumeNuNici unulReducere comandaNotite comandaMetoda de plataPretSetarile de printareProdusProdusePublicCantitateCantitateSKUSelecteaza o actiuneSelecteaza un campLivrareAdresa de livrareMetoda livrareDoar livrareSmart ManagerStatusTaxaTaxabilTelTotalIncarca ImagineDaSters cu succesSaueste disponibil.Aceasta optiune este disponibila doar in versiunea ProPentru mai multe de o valoare, foloseste (|) ca delimitarelanguages/smart-manager-for-wp-e-commerce-da_DK.po000064400000201322147600337620016002 0ustar00msgid "" msgstr "" "Project-Id-Version: Smart Manager 4.2.1\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-04-20 14:04:35+00:00\n" "PO-Revision-Date: 2022-03-17 04:14+0000\n" "Last-Translator: Mansi \n" "Language-Team: Danish\n" "Language: da_DK\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-SourceCharset: utf-8\n" "X-Poedit-KeywordsList: _:1;gettext:1;dgettext:2;ngettext:1,2;dngettext:2,3;" "__:1;_e:1;_c:1;_n:1,2;_n_noop:1,2;_nc:1,2;__ngettext:1,2;__ngettext_noop:1,2;" "_x:1,2c;_ex:1,2c;_nx:1,2,4c;_nx_noop:1,2,3c;_n_js:1,2;_nx_js:1,2,3c;" "esc_attr__:1;esc_html__:1;esc_attr_e:1;esc_html_e:1;esc_attr_x:1,2c;" "esc_html_x:1,2c;comments_number_link:2,3;t:1;st:1;trans:1;transChoice:1,2\n" "X-Poedit-Basepath: ../\n" "X-Poedit-SearchPath-0: .\n" "X-Loco-Target-Locale: da_DK\n" "X-Generator: Loco https://localise.biz/" #: classes/class-smart-manager-pricing.php:405 msgid " More powerful features with Smart Manager Pro!" msgstr "" #: classes/class-smart-manager-pricing.php:351 msgid "$112" msgstr "" #: classes/class-smart-manager-pricing.php:363 msgid "$135" msgstr "" #: classes/class-smart-manager-pricing.php:350 msgid "$149" msgstr "" #: classes/class-smart-manager-pricing.php:362 msgid "$179" msgstr "" #: classes/class-smart-manager-pricing.php:374 msgid "$360" msgstr "" #: classes/class-smart-manager-pricing.php:385 msgid "$375" msgstr "" #: classes/class-smart-manager-pricing.php:373 msgid "$479" msgstr "" #: classes/class-smart-manager-pricing.php:384 msgid "$499" msgstr "" #: classes/class-smart-manager-pricing.php:351 msgid "$75" msgstr "" #: classes/class-smart-manager-pricing.php:363 msgid "$90" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:165 msgid "% Completed" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:143 #, php-format msgid "% completed" msgstr "" #. 1. Error title 2. The bulk process #: pro/classes/class-smart-manager-pro-background-updater.php:307 #, php-format msgid "" "%1$s: The %2$s process has stopped. Please review the Smart Manager " "dashboard to check the status." msgstr "" #: class-smart-manager.php:1460 #, php-format msgid "%1s" msgstr "" #: classes/class-smart-manager-admin-welcome.php:429 #, php-format msgid "%s" msgstr "" #: class-smart-manager.php:862 #, php-format msgid "%s to check Smart Manager Pro features and claim your discount." msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:323 msgid "--:--:--" msgstr "" #: classes/class-smart-manager-pricing.php:348 msgid "1 site (Annual)" msgstr "" #: classes/class-smart-manager-pricing.php:371 msgid "1 site (Lifetime)" msgstr "" #: classes/class-smart-manager-pricing.php:667 msgid "20 or 30 times quicker store management" msgstr "" #: class-smart-manager.php:861 classes/class-smart-manager-pricing.php:340 msgid "25% Off" msgstr "" #: classes/class-smart-manager-pricing.php:360 msgid "5 sites (Annual)" msgstr "" #: classes/class-smart-manager-pricing.php:382 msgid "5 sites (Lifetime)" msgstr "" #: class-smart-manager.php:665 msgid " 🔥 Go Pro" msgstr "" #. Description of the plugin msgid "" "Pro Version Installed. The #1 and a powerful tool to manage " "stock, inventory from a single place. Super quick and super easy." msgstr "" #: class-smart-manager.php:1570 msgid "A required Smart Manager file is missing. Can't continue. " msgstr "Fejl! En Smart Manager fil mangler. Du kan ikke fortsætte" #: classes/class-smart-manager-pricing.php:659 msgid "A whole afternoon’s work in seconds" msgstr "" #: classes/class-smart-manager-pricing.php:662 #, fuzzy #| msgid "From" msgid "Acrom" msgstr "Fra" #: pro/templates/email.php:43 msgid "Action" msgstr "" #: pro/assets/js/smart-manager-product.js:154 pro/assets/js/smart-manager.js:37 msgctxt "action operator" msgid "add to" msgstr "" #: pro/assets/js/smart-manager.js:25 pro/assets/js/smart-manager.js:47 msgctxt "action operator" msgid "copy from" msgstr "" #: pro/assets/js/smart-manager-product.js:155 pro/assets/js/smart-manager.js:37 msgctxt "action operator" msgid "remove from" msgstr "" #: pro/assets/js/smart-manager.js:39 msgctxt "action operator" msgid "search & replace" msgstr "" #: pro/assets/js/smart-manager-product.js:153 pro/assets/js/smart-manager.js:46 #: pro/assets/js/smart-manager.js:891 pro/assets/js/smart-manager.js:1027 msgctxt "action operator" msgid "set to" msgstr "" #: assets/js/smart-manager-product.js:229 msgctxt "add attribute button" msgid "Add" msgstr "" #: classes/class-smart-manager-pricing.php:451 msgid "Add or Delete records" msgstr "" #: classes/class-smart-manager-product.php:958 msgid "Additional Description" msgstr "Yderligere beskrivelse" #: pro/assets/js/smart-manager.js:28 msgctxt "additional operator" msgid "decrease by" msgstr "" #: pro/assets/js/smart-manager.js:28 msgctxt "additional operator" msgid "increase by" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:326 msgid "Address to look in" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:125 msgid "Adjacent Buffering?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:295 msgid "Advanced Search" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:42 #, javascript-format msgctxt "advanced search conditions" msgid "%d condition%s" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:42 msgctxt "advanced search conditions" msgid "s" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:155 msgctxt "advanced search content" msgid "condition groups pass" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:148 msgctxt "advanced search content" msgid "When" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:153 msgctxt "advanced search option" msgid "all" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:152 msgctxt "advanced search option" msgid "at least one" msgstr "" #: classes/class-smart-manager-pricing.php:484 msgid "Advanced Search using “AND†filter" msgstr "" #: classes/class-smart-manager-pricing.php:495 msgid "Advanced Search using “OR†filter" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:294 msgid "All" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:237 msgid "All blocks being booked" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:227 msgid "All dates are..." msgstr "" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:50 #: pro/assets/js/smart-manager.js:868 msgid "All Items In Search Results" msgstr "" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:50 #: pro/assets/js/smart-manager.js:868 msgid "All Items In Store" msgstr "" #: classes/class-smart-manager-product.php:912 msgid "Allow" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:136 msgid "Allow Combination" msgstr "" #: classes/class-smart-manager-shop-coupon.php:123 msgid "Allow Free Shipping" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:252 msgid "Allow free shipping" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:132 #, php-format msgid "Allow search engines to show this %1$s in search results?" msgstr "" #: classes/class-smart-manager-product.php:911 msgid "Allow, but notify customer" msgstr "" #: classes/class-smart-manager-shop-coupon.php:119 msgid "Allowed Emails" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:291 msgid "Allowed emails" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:213 msgid "Allowed user roles" msgstr "" #: class-smart-manager.php:1468 msgid "An upgrade for Smart Manager Pro" msgstr "En opdatering til Smart Manager Pro" #: classes/class-smart-manager-admin-welcome.php:281 msgid "any custom post type in WordPress" msgstr "" #: classes/class-smart-manager-admin-welcome.php:281 #, php-format msgid "" "Apart from WooCommerce post types like Products, Orders, Coupons, now you " "can manage %s. Be it Posts, Pages, Media, WordPress Users, etc. you can now " "manage everything using Smart Manager." msgstr "" #. 1. The bulk process #: pro/classes/class-smart-manager-pro-background-updater.php:348 #, php-format msgid "Are you sure you want to stop the %s process? Click OK to stop." msgstr "" #: assets/js/smart-manager-product.js:302 msgctxt "attribute button" msgid "Select all" msgstr "" #: assets/js/smart-manager-product.js:303 msgctxt "attribute button" msgid "Select none" msgstr "" #: assets/js/smart-manager-product.js:121 msgctxt "attribute list" msgid "Custom product attribute" msgstr "" #: pro/assets/js/smart-manager-product.js:40 msgctxt "attribute operator" msgid "Add Attribute" msgstr "" #: pro/assets/js/smart-manager-product.js:49 msgctxt "attribute operator" msgid "Remove Attribute" msgstr "" #: assets/js/smart-manager-product.js:283 msgctxt "attribute variation" msgid "Used for variations" msgstr "" #: assets/js/smart-manager-product.js:280 msgctxt "attribute visibility" msgid "Visible on the product page" msgstr "" #: classes/class-smart-manager-product.php:1068 msgid "Attributes" msgstr "" #: classes/class-smart-manager-product.php:1101 msgid "Attributes: custom" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:253 msgid "Auto Generate Coupon" msgstr "" #: class-smart-manager.php:1649 msgid "Auto-updates are not available for this plugin." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:222 msgid "Automatically assigned" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:229 msgid "available by default" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:264 msgid "Back to Smart Manager" msgstr "" #: pro/assets/js/smart-manager-product.js:216 msgctxt "batch update option" msgid "All" msgstr "" #: pro/templates/email.php:39 msgid "Below are the lists of updates done:" msgstr "" #: classes/class-smart-manager-pricing.php:359 msgid "Best Seller" msgstr "" #: classes/class-smart-manager-admin-welcome.php:333 msgid "Biggest Time Saver" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:327 msgid "Billing" msgstr "" #: pro/templates/order-invoice.php:144 msgid "Billing Address" msgstr "Adresse pÃ¥ betaler" #: pro/classes/class-smart-manager-pro-product.php:252 #, fuzzy #| msgid "Billing Region" msgid "Billing Period" msgstr "Region for betaler" #: pro/classes/class-smart-manager-pro-wc-booking.php:171 msgid "Booked Product" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:80 msgid "Booking can be cancelled until" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:196 msgid "Booking can be cancelled until (Unit)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:77 msgid "Booking duration" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:183 msgid "Booking Duration (Type)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:191 msgid "Booking Duration (Unit)" msgstr "" #: assets/js/smart-manager.js:987 #, javascript-format msgctxt "bottom bar" msgid "%d %s loaded" msgstr "" #: assets/js/smart-manager.js:1005 #, javascript-format msgctxt "bottom bar" msgid "%d of %d %s loaded" msgstr "" #: assets/js/smart-manager.js:980 assets/js/smart-manager.js:1005 #, javascript-format msgctxt "bottom bar" msgid "No %s Found" msgstr "" #: classes/class-smart-manager-pricing.php:670 msgid "Brian Batcher" msgstr "" #: class-smart-manager.php:1149 #: classes/class-smart-manager-admin-welcome.php:331 msgid "Bulk Edit" msgstr "" #: classes/class-smart-manager-admin-welcome.php:333 #, php-format msgid "Bulk Edit - %1s (only in %2s)" msgstr "" #: classes/class-smart-manager-pricing.php:506 msgid "Bulk Edit / Batch Update" msgstr "" #: assets/js/smart-manager.js:1705 msgctxt "button" msgid "Add" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:50 msgctxt "button" msgid "Add a condition" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:66 msgctxt "button" msgid "Add another group" msgstr "" #: assets/js/smart-manager.js:1713 msgctxt "button" msgid "Add images to product gallery" msgstr "" #: assets/js/smart-manager.js:396 msgctxt "button" msgid "Add Row" msgstr "" #: assets/js/smart-manager.js:1714 msgctxt "button" msgid "Add to gallery" msgstr "" #: assets/js/smart-manager.js:382 msgctxt "button" msgid "Bulk Edit" msgstr "" #: assets/js/smart-manager.js:2436 msgctxt "button" msgid "Cancel" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:118 #: src/views/BulkEditDialog.js:112 msgctxt "button" msgid "Clear" msgstr "" #: assets/js/smart-manager.js:438 msgctxt "button" msgid "Columns" msgstr "" #: assets/js/smart-manager.js:2435 msgctxt "button" msgid "Create" msgstr "" #: assets/js/smart-manager.js:412 msgctxt "button" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:402 msgctxt "button" msgid "Duplicate" msgstr "" #: assets/js/smart-manager.js:424 msgctxt "button" msgid "Export CSV" msgstr "" #: assets/js/smart-manager.js:2579 msgctxt "button" msgid "Get Pro at 25% OFF" msgstr "" #: assets/js/smart-manager.js:175 #, javascript-format msgctxt "button" msgid "Load More %s" msgstr "" #: assets/js/smart-manager.js:3151 msgctxt "button" msgid "No" msgstr "" #: assets/js/smart-manager-product.js:243 assets/js/smart-manager.js:1092 msgctxt "button" msgid "OK" msgstr "" #: assets/js/smart-manager.js:430 msgctxt "button" msgid "Print Invoice" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:74 msgctxt "button" msgid "Remove this group" msgstr "" #: pro/assets/js/smart-manager.js:968 msgctxt "button" msgid "Reset" msgstr "" #: assets/js/smart-manager.js:390 msgctxt "button" msgid "Save" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:99 msgctxt "button" msgid "Search" msgstr "" #: assets/js/smart-manager-product.js:199 msgctxt "button" msgid "Select all" msgstr "" #: assets/js/smart-manager-product.js:200 msgctxt "button" msgid "Select none" msgstr "" #: assets/js/admin.js:1 assets/js/smart-manager.js:2744 #: src/views/BulkEditDialog.js:98 pro/assets/js/smart-manager.js:963 msgctxt "button" msgid "Update" msgstr "" #: assets/js/smart-manager.js:3134 msgctxt "button" msgid "Yes" msgstr "" #: classes/class-smart-manager-pricing.php:355 #: classes/class-smart-manager-pricing.php:367 #: classes/class-smart-manager-pricing.php:378 #: classes/class-smart-manager-pricing.php:389 msgid "Buy Now" msgstr "" #: classes/class-smart-manager-pricing.php:648 msgid "Buy Smart Manager Pro" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:144 msgid "Calculate unit prices automatically" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:214 msgid "Calendar always visible" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:211 msgid "Calendar display mode" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:118 msgid "Can be cancelled?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:405 msgid "Can I import using Smart Manager?" msgstr "" #: classes/class-smart-manager-product.php:1147 msgid "Catalog Visibility" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:139 msgid "Category group-of rules: Exclude" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:235 msgid "Check rules against..." msgstr "" #: assets/js/smart-manager-product.js:285 msgctxt "checkbox list" msgid "Position:" msgstr "" #: class-smart-manager.php:862 msgid "Click here" msgstr "" #: classes/class-smart-manager-admin-welcome.php:402 msgid "click here" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:423 msgid "Click to copy" msgstr "" #: class-smart-manager.php:1468 msgid "Click to upgrade." msgstr "Klik for at opdatere" #: classes/class-smart-manager-pricing.php:462 msgid "Columns (Show / Hide / Sort)" msgstr "" #: classes/class-smart-manager-pricing.php:612 #: classes/class-smart-manager-pricing.php:623 msgid "Coming soon" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:335 msgid "Company logo:" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:337 msgid "completed Successfully" msgstr "" #: pro/classes/class-smart-manager-pro-acf-field-group.php:43 #: pro/classes/class-smart-manager-pro-acf-field.php:43 msgid "Config Options" msgstr "" #: classes/class-smart-manager-pricing.php:340 #, php-format msgid "Congratulations! You just unlocked %s on Smart Manager Pro" msgstr "" #: classes/class-smart-manager-admin-welcome.php:414 msgid "contact us" msgstr "" #: classes/class-smart-manager-shop-order.php:440 #: pro/classes/class-smart-manager-pro-product.php:107 msgid "Cost of Good" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:122 msgid "Count persons as bookings" msgstr "" #: classes/class-smart-manager-shop-coupon.php:115 msgid "Coupon Code" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:333 msgid "Coupon expiry date" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:338 msgid "Coupon expiry time" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:255 msgid "Coupon Is Visible Storewide" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:354 msgid "Coupon shareable link" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:242 msgid "Coupon Title Prefix" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:243 msgid "Coupon Title Suffix" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:240 msgid "Coupon Validity" msgstr "" #: classes/class-smart-manager-pricing.php:551 msgid "Create Column Sets / Custom Views" msgstr "" #: classes/class-smart-manager-pricing.php:433 msgid "custom post types and their custom fields." msgstr "" #: assets/js/smart-manager.js:364 msgctxt "custom view button" msgid "Create" msgstr "" #: assets/js/smart-manager.js:366 msgctxt "custom view button" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:365 msgctxt "custom view button" msgid "Update" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:186 msgid "Customer defined blocks of" msgstr "" #: classes/class-smart-manager-shop-order.php:164 msgid "Customer provided note" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:221 msgid "Customer selected" msgstr "" #: assets/js/smart-manager.js:315 msgctxt "dashboard groups" msgid "All post types" msgstr "" #: assets/js/smart-manager.js:326 msgctxt "dashboard groups" msgid "All saved views" msgstr "" #: assets/js/smart-manager.js:299 msgctxt "dashboard groups" msgid "Common post types" msgstr "" #: assets/js/smart-manager.js:310 msgctxt "dashboard groups" msgid "Recently used views" msgstr "" #: classes/class-smart-manager-shop-order.php:160 #: pro/classes/class-smart-manager-pro-shop-subscription.php:175 #, fuzzy #| msgid "State" msgid "Date" msgstr "Stat" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "days" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "months" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "weeks" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:21 msgctxt "date duration" msgid "years" msgstr "" #: pro/assets/js/smart-manager.js:34 msgctxt "date operator" msgid "set date to" msgstr "" #: pro/assets/js/smart-manager.js:33 msgctxt "datetime operator" msgid "set date to" msgstr "" #: pro/assets/js/smart-manager.js:33 msgctxt "datetime operator" msgid "set datetime to" msgstr "" #: pro/assets/js/smart-manager.js:33 msgctxt "datetime operator" msgid "set time to" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:149 msgid "Day(s)" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:133 msgid "Default" msgstr "" #: assets/js/smart-manager.js:415 msgctxt "delete button" msgid "Delete Permanently" msgstr "" #: assets/js/smart-manager.js:414 msgctxt "delete button" msgid "Move to Trash" msgstr "" #: class-smart-manager.php:1118 msgid "" "Delete Permanently is disabled. Please contact store administrator for " "enabling the same." msgstr "" #: class-smart-manager.php:1149 #: classes/class-smart-manager-admin-welcome.php:319 msgid "Delete Records" msgstr "" #: classes/class-smart-manager-product.php:956 #: classes/class-smart-manager-shop-coupon.php:117 msgid "Description" msgstr "Beskrivelse" #: assets/js/smart-manager.js:2719 msgctxt "description" msgid "" "Drag & drop the enabled columns to the right side to disable them. Drag & " "drop the disabled columns to the left side to enable them." msgstr "" #: assets/js/smart-manager.js:2721 msgctxt "description" msgid "Drag the columns to the top or bottom to sort them." msgstr "" #: pro/assets/js/smart-manager.js:603 msgctxt "description" msgid "" "Marking this view public will make it available to all users having access " "to the Smart Manager." msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:248 msgid "Disable Email Restriction" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:213 msgid "Display calendar on click" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:244 msgid "Display message" msgstr "" #: classes/class-smart-manager-product.php:910 msgid "Do Not Allow" msgstr "" #: classes/class-smart-manager-admin-welcome.php:254 msgid "Docs" msgstr "" #: class-smart-manager.php:672 msgid "Docs & Support" msgstr "" #: assets/js/smart-manager.js:101 msgctxt "dropdown operator" msgid "is" msgstr "" #: assets/js/smart-manager.js:101 msgctxt "dropdown operator" msgid "is not" msgstr "" #: classes/class-smart-manager-pricing.php:540 msgid "Duplicate all records in a single click" msgstr "" #: assets/js/smart-manager.js:405 msgctxt "duplicate button" msgid "Entire Store" msgstr "" #: assets/js/smart-manager.js:404 msgctxt "duplicate button" msgid "Selected Records" msgstr "" #: class-smart-manager.php:1149 msgid "Duplicate Records" msgstr "" #: classes/class-smart-manager-pricing.php:529 msgid "Duplicate single / multiple records" msgstr "" #: pro/templates/email.php:7 msgid "Duplicated" msgstr "" #: classes/class-smart-manager-pricing.php:636 msgid "Email / Call" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:1257 msgid "Email already exists. Please enter another email." msgstr "" #: pro/classes/class-smart-manager-pro-user.php:1251 msgid "Email cannot be empty" msgstr "" #: pro/templates/order-invoice.php:158 msgid "Email id" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:251 msgid "Email message?" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:116 msgid "Enable Calendar Range Picker?" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:130 msgid "Enable Min Max Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:123 msgid "Enable person types" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:307 msgid "Error" msgstr "" #: class-smart-manager.php:1585 msgid "Error:" msgstr "Fejl:" #: classes/class-smart-manager-pricing.php:431 msgid "Everything in Lite +" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:226 msgid "Exclude Attributes" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:211 msgid "Exclude categories" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:231 msgid "Exclude products" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:249 msgid "Exclude sale items" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:257 msgid "Expire After" msgstr "" #: pro/classes/class-smart-manager-pro-wc-user-membership.php:169 #: pro/classes/class-smart-manager-pro-wc-user-membership.php:170 msgid "Expires" msgstr "" #: classes/class-smart-manager-pricing.php:518 msgid "Export all / Filtered records as CSV" msgstr "" #: classes/class-smart-manager-admin-welcome.php:347 msgid "Export CSV" msgstr "Eksport til CSV" #: classes/class-smart-manager-admin-welcome.php:349 #, php-format msgid "Export CSV (only in %s)" msgstr "" #: classes/class-smart-manager-product.php:972 msgid "External Url" msgstr "" #: classes/class-smart-manager-admin-welcome.php:380 msgid "FAQ / Common Problems" msgstr "" #: classes/class-smart-manager-admin-welcome.php:264 msgid "FAQ's" msgstr "" #: classes/class-smart-manager-product.php:1194 msgid "Featured" msgstr "" #: classes/class-smart-manager-product.php:2018 #: classes/class-smart-manager-product.php:2021 msgid "Featured Image updated successfully" msgstr "" #: classes/class-smart-manager-pricing.php:410 msgid "Features" msgstr "" #: pro/templates/email.php:42 msgid "Field" msgstr "" #: classes/class-smart-manager-admin-welcome.php:290 msgid "Filter / Search Records" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:185 msgid "Fixed blocks of" msgstr "" #: classes/class-smart-manager-admin-welcome.php:419 #, php-format msgid "Follow steps listed here: %s" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:337 #, fuzzy #| msgid "Or" msgid "for" msgstr "Eller" #: pro/classes/class-smart-manager-pro-shop-coupon.php:256 msgid "For new user only?" msgstr "" #: classes/class-smart-manager-pricing.php:413 msgid "Free" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:105 msgid "Free Trial" msgstr "" #: classes/class-smart-manager-admin-welcome.php:236 #: classes/class-smart-manager-admin-welcome.php:362 msgid "Get started with Smart Manager" msgstr "" #: classes/class-smart-manager-admin-welcome.php:232 msgid "" "Glad to have you onboard. We hope Smart Manager adds to your desired success " "ðŸ†" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:38 msgctxt "group content" msgid "of the following conditions is true." msgstr "" #: pro/classes/class-smart-manager-pro-acf-field.php:45 msgid "Group Id" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:90 msgid "Group of..." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:119 msgid "Has persons" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:120 msgid "Has resources" msgstr "" #: assets/js/smart-manager.js:2732 msgctxt "heading" msgid "Disabled" msgstr "" #: assets/js/smart-manager.js:2725 msgctxt "heading" msgid "Enabled" msgstr "" #: class-smart-manager.php:861 #, php-format msgid "Hey %1s, you just unlocked %2s on Smart Manager Pro!" msgstr "" #: pro/templates/email.php:35 msgid "Hi there!" msgstr "" #: classes/class-smart-manager-product.php:736 msgid "Hidden" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:150 msgid "Hour(s)" msgstr "" #: classes/class-smart-manager-admin-welcome.php:418 msgid "How do I upgrade a Lite version to a Pro version?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:401 msgid "How to add columns to Smart Manager dashboard?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:397 msgid "" "How to manage any custom field of any custom plugin using Smart Manager?" msgstr "" #. Author URI of the plugin msgid "https://www.storeapps.org/" msgstr "" #. URI of the plugin msgid "https://www.storeapps.org/product/smart-manager/" msgstr "" #: classes/class-smart-manager-admin-welcome.php:413 msgid "I can't find a way to do X..." msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:118 msgid "I found another plugin for my needs" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:106 msgid "I only needed the plugin for a short period" msgstr "" #: classes/class-smart-manager-pricing.php:397 msgid "I would happily pay five times for this product!" msgstr "" #: classes/class-smart-manager-pricing.php:669 msgid "" "I've got over 200 products and dreaded managing them one by one. Smart " "Manager Pro plugin lets me do this so much quicker. Probably 20 or 30 times " "quicker. It is an absolutely invaluable tool." msgstr "" #: pro/templates/email.php:62 msgid "If you like" msgstr "" #: classes/class-smart-manager-pricing.php:606 msgid "Import" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:315 msgid "Important" msgstr "" #: classes/class-smart-manager-product.php:862 msgid "In stock" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:317 msgid "in the background. You will be notified on" msgstr "" #: class-smart-manager.php:1149 msgid "" "In the meanwhile, you can use Smart Manager. But before using actions like " msgstr "" #: pro/classes/class-smart-manager-pro-base.php:34 msgid "Index" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:250 msgid "Individual use only" msgstr "" #: classes/class-smart-manager-admin-welcome.php:299 msgid "Inline Editing" msgstr "" #: classes/class-smart-manager-pricing.php:438 msgid "Inline editing" msgstr "" #: class-smart-manager.php:1468 msgid "is available." msgstr "er tilgængelig" #: pro/classes/class-smart-manager-pro-shop-coupon.php:254 msgid "Is Pick Price of Product" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:124 msgid "It is a temporary deactivation. I am just debugging an issue." msgstr "" #: classes/class-smart-manager-pricing.php:400 msgid "Jeff" msgstr "" #: pro/classes/class-smart-manager-pro-acf-field-group.php:44 #: pro/classes/class-smart-manager-pro-acf-field.php:44 msgid "Key" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:102 msgid "" "Kindly share what did not work for you / conflicting with which plugin so we " "can fix it..." msgstr "" #: classes/class-smart-manager-admin-welcome.php:261 msgid "Know Smart Manager" msgstr "" #: pro/classes/class-smart-manager-pro-acf-field-group.php:41 #: pro/classes/class-smart-manager-pro-acf-field.php:41 msgid "Label" msgstr "" #: classes/class-smart-manager-admin-welcome.php:386 #: classes/class-smart-manager-admin-welcome.php:419 msgid "latest version" msgstr "" #: class-smart-manager.php:1447 msgid "LITE" msgstr "" #: classes/class-smart-manager-admin-welcome.php:386 #, php-format msgid "" "Make sure you are using %s of Smart Manager. If still the issue persist, " "temporarily de-activate all plugins except WooCommerce/WPeCommerce & Smart " "Manager. Re-check the issue, if the issue still persists, contact us. If the " "issue goes away, re-activate other plugins one-by-one & re-checking the " "fields, to find out which plugin is conflicting." msgstr "" #: classes/class-smart-manager-pricing.php:617 msgid "Manage Custom Taxonomies" msgstr "" #: classes/class-smart-manager-pricing.php:573 msgid "Manage WordPress User roles" msgstr "" #: classes/class-smart-manager-admin-welcome.php:287 msgid "Manage your entire store from a single screen" msgstr "" #: classes/class-smart-manager-pricing.php:677 msgid "Massive time-savings and 10x productivity boost. Choice is yours!" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:83 msgid "Max bookings per block" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:236 msgid "Max discount" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:82 msgid "Max persons" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:101 msgid "Max Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:85 msgid "Maximum block bookable" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:206 msgid "Maximum block bookable (Unit)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:79 msgid "Maximum duration" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:96 msgid "Maximum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:89 msgid "Maximum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-wc-user-membership.php:164 #: pro/classes/class-smart-manager-pro-wc-user-membership.php:165 msgid "Member since" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:148 msgid "Meta robots advanced" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:81 msgid "Min persons" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:100 msgid "Min Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:135 msgid "Min/Max Rules" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:84 msgid "Minimum block bookable" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:201 msgid "Minimum block bookable (Unit)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:78 msgid "Minimum duration" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:95 msgid "Minimum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:88 msgid "Minimum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:151 msgid "Minutes(s)" msgstr "" #: assets/js/smart-manager.js:2330 msgctxt "modal content" msgid "all" msgstr "" #: assets/js/smart-manager.js:2329 #, javascript-format msgctxt "modal content" msgid "Are you sure you want to %s" msgstr "" #: assets/js/smart-manager.js:2330 #, javascript-format msgctxt "modal content" msgid "Are you sure you want to %s the %s?" msgstr "" #: assets/js/smart-manager.js:2529 msgctxt "modal content" msgid "Are you sure you want to duplicate the " msgstr "" #: assets/js/smart-manager.js:3114 msgctxt "modal content" msgid "Are you sure?" msgstr "" #: assets/js/smart-manager.js:3092 msgctxt "modal content" msgid "Continue in background" msgstr "" #: pro/assets/js/smart-manager.js:595 msgctxt "modal content" msgid "" "Create a custom view to save selected columns from a dashboard. Use it for " "saved searches, giving specific columns access to other users, etc." msgstr "" #: assets/js/smart-manager.js:2472 msgctxt "modal content" msgid "delete" msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "delete all" msgstr "" #: assets/js/smart-manager.js:2433 #, javascript-format msgctxt "modal content" msgid "Enter how many new %s(s) to create!" msgstr "" #: assets/js/smart-manager.js:261 assets/js/smart-manager.js:2207 #, javascript-format msgctxt "modal content" msgid "For managing %s, %s %s version" msgstr "" #: assets/js/smart-manager.js:3092 msgctxt "modal content" msgid "Initializing..." msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "Note: Looking to" msgstr "" #: assets/js/smart-manager.js:2323 msgctxt "modal content" msgid "permanently delete" msgstr "" #: assets/js/smart-manager.js:261 assets/js/smart-manager.js:2207 #: assets/js/smart-manager.js:3061 msgctxt "modal content" msgid "Pro" msgstr "" #: assets/js/smart-manager.js:2329 msgctxt "modal content" msgid "record" msgstr "" #: assets/js/smart-manager.js:2329 msgctxt "modal content" msgid "records" msgstr "" #: assets/js/smart-manager.js:2472 msgctxt "modal content" msgid "the current view. Are you sure you want to continue?" msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "the records?" msgstr "" #: assets/js/smart-manager.js:2329 msgctxt "modal content" msgid "the selected" msgstr "" #: assets/js/smart-manager.js:3061 #, javascript-format msgctxt "modal content" msgid "This feature is available only in the %s version" msgstr "" #: assets/js/smart-manager.js:2472 msgctxt "modal content" msgid "This will" msgstr "" #: assets/js/smart-manager.js:2528 msgctxt "modal content" msgid "" "This will duplicate only the records in posts, postmeta and related " "taxonomies." msgstr "" #: assets/js/smart-manager.js:2323 msgctxt "modal content" msgid "trash" msgstr "" #: assets/js/smart-manager.js:2350 msgctxt "modal content" msgid "Upgrade to Pro" msgstr "" #: assets/js/smart-manager.js:2557 msgctxt "modal description" msgid "" "You can change / update multiple fields of the entire store OR for selected " "items by selecting multiple records and then click on Bulk Edit." msgstr "" #: assets/js/smart-manager.js:2560 msgctxt "modal description" msgid "" "You can export all the records OR filtered records (using Simple Search or " "Advanced Search) by simply clicking on the Export CSV button at the bottom " "right of the grid." msgstr "" #: assets/js/smart-manager.js:2566 msgctxt "modal title" msgid "(Only in" msgstr "" #: assets/js/smart-manager.js:2432 #, javascript-format msgctxt "modal title" msgid "Add %s(s)" msgstr "" #: assets/js/admin.js:1 src/views/AdvancedSearchDialog.js:60 msgctxt "modal title" msgid "Advanced Search" msgstr "" #: assets/js/smart-manager.js:2319 assets/js/smart-manager.js:2471 #: assets/js/smart-manager.js:2527 msgctxt "modal title" msgid "Attention!!!" msgstr "" #: assets/js/smart-manager.js:2566 msgctxt "modal title" msgid "Biggest Time Saver" msgstr "" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:66 #: pro/assets/js/smart-manager.js:718 pro/assets/js/smart-manager.js:973 msgctxt "modal title" msgid "Bulk Edit" msgstr "" #: assets/js/smart-manager.js:2749 msgctxt "modal title" msgid "Column Manager - Show/Hide Columns" msgstr "" #: pro/assets/js/smart-manager.js:1273 msgctxt "modal title" msgid "Delete Records" msgstr "" #: pro/assets/js/smart-manager.js:489 msgctxt "modal title" msgid "Duplicate Records" msgstr "" #: assets/js/smart-manager.js:2994 assets/js/smart-manager.js:3060 msgctxt "modal title" msgid "Note" msgstr "" #: assets/js/smart-manager.js:3091 msgctxt "modal title" msgid "Please Wait" msgstr "" #: assets/js/smart-manager.js:2566 msgctxt "modal title" msgid "Pro" msgstr "" #: assets/js/smart-manager.js:2992 msgctxt "modal title" msgid "Success" msgstr "" #: assets/js/smart-manager.js:3113 msgctxt "modal title" msgid "Warning" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:148 msgid "Month(s)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:121 msgid "Multiply all costs by person count" msgstr "" #: classes/class-smart-manager-product.php:952 #: pro/classes/class-smart-manager-pro-acf-field-group.php:42 #: pro/classes/class-smart-manager-pro-acf-field.php:42 msgid "Name" msgstr "Navn" #: pro/classes/class-smart-manager-pro-product.php:260 msgid "Never expire" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:185 msgid "Nickname" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:135 #: pro/classes/class-smart-manager-pro-base.php:143 msgid "No" msgstr "Nej" #: pro/classes/class-smart-manager-pro-base.php:29 #: pro/classes/class-smart-manager-pro-base.php:37 msgid "No Archive" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:36 msgid "No Follow" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:28 #: pro/classes/class-smart-manager-pro-base.php:38 msgid "No Image Index" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:35 msgid "No Index" msgstr "" #: classes/class-smart-manager-product.php:941 #: classes/class-smart-manager-product.php:943 msgid "No shipping class" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:30 #: pro/classes/class-smart-manager-pro-base.php:39 msgid "No Snippet" msgstr "" #: classes/class-smart-manager-product.php:846 #: classes/class-smart-manager-product.php:852 #: pro/classes/class-smart-manager-pro-base.php:27 msgid "None" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:230 msgid "not-available by default" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:329 msgid "NOTE" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "column if not enabled using" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "column show/hide functionality" msgstr "" #: assets/js/smart-manager.js:2460 assets/js/smart-manager.js:2482 msgctxt "notification" msgid "Custom Views avialable (Only in" msgstr "" #: assets/js/smart-manager.js:2590 msgctxt "notification" msgid "Duplicate Records (Only in" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "Enable" msgstr "" #: assets/js/smart-manager.js:3048 msgctxt "notification" msgid "Error" msgstr "" #: assets/js/smart-manager.js:2422 msgctxt "notification" msgid "For editing more records upgrade to Pro" msgstr "" #: assets/js/smart-manager.js:263 assets/js/smart-manager.js:2208 #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "Note" msgstr "" #: assets/js/smart-manager.js:2272 msgctxt "notification" msgid "Please edit a record" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "Please enter user email" msgstr "" #: assets/js/smart-manager.js:2309 assets/js/smart-manager.js:2545 msgctxt "notification" msgid "Please select a record" msgstr "" #: assets/js/smart-manager.js:2460 assets/js/smart-manager.js:2482 #: assets/js/smart-manager.js:2590 msgctxt "notification" msgid "Pro" msgstr "" #: assets/js/smart-manager.js:2314 msgctxt "notification" msgid "records at a time" msgstr "" #: assets/js/smart-manager.js:2954 pro/assets/js/smart-manager.js:567 #: pro/assets/js/smart-manager.js:690 msgctxt "notification" msgid "Success" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:57 #, fuzzy msgctxt "notification" msgid "This feature is available only in the Pro version." msgstr "Denne funktion er kun tilgængelig i Pro-versionen" #: assets/js/smart-manager.js:2314 msgctxt "notification" msgid "To delete more than" msgstr "" #: assets/js/smart-manager.js:2299 msgctxt "notification" msgid "To permanently delete records" msgstr "" #: assets/js/smart-manager.js:2299 assets/js/smart-manager.js:2314 msgctxt "notification" msgid "upgrade to Pro" msgstr "" #: assets/js/smart-manager.js:2280 msgctxt "notification" msgid "User Email" msgstr "" #: pro/assets/js/smart-manager.js:567 #, javascript-format msgctxt "notification" msgid "View %sd successfully!" msgstr "" #: pro/assets/js/smart-manager.js:658 msgctxt "notification" msgid "View already exists. Please try another name" msgstr "" #: pro/assets/js/smart-manager.js:690 msgctxt "notification" msgid "View deleted successfully!" msgstr "" #: assets/js/smart-manager.js:3048 msgctxt "notification" msgid "You have entered incorrect data in the highlighted cells." msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "decrease by %" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "decrease by number" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "increase by %" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "numeric operator" msgid "increase by number" msgstr "" #: classes/class-smart-manager-product.php:864 msgid "On backorder" msgstr "" #: pro/templates/order-invoice.php:201 msgid "Order Discount" msgstr "" #: pro/templates/order-invoice.php:195 msgid "Order Notes" msgstr "Noter pÃ¥ ordre" #: pro/classes/class-smart-manager-pro-product.php:137 msgid "Order rules: Do not count" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:138 msgid "Order rules: Exclude" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:130 msgid "Other" msgstr "" #: classes/class-smart-manager-product.php:863 msgid "Out of stock" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:217 #, fuzzy #| msgid "Payment Method" msgid "Payment Methods" msgstr "Betalingsmetode" #: pro/assets/js/smart-manager.js:853 pro/assets/js/smart-manager.js:857 #: pro/assets/js/smart-manager.js:943 pro/assets/js/smart-manager.js:1054 #: pro/assets/js/smart-manager.js:1075 pro/assets/js/smart-manager.js:1094 msgctxt "placeholder" msgid "Enter a value..." msgstr "" #: pro/assets/js/smart-manager-product.js:225 msgctxt "placeholder" msgid "Enter Attribute name..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:428 msgctxt "placeholder" msgid "Enter attribute name..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:63 src/views/Rule.js:357 #: src/views/Rule.js:372 msgctxt "placeholder" msgid "Enter value" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:429 #: pro/assets/js/smart-manager-product.js:226 msgctxt "placeholder" msgid "Enter values..." msgstr "" #: pro/assets/js/smart-manager.js:596 msgctxt "placeholder" msgid "Give a name to this view" msgstr "" #: assets/js/smart-manager-product.js:208 #: assets/js/smart-manager-product.js:313 msgctxt "placeholder" msgid "Name" msgstr "" #: assets/js/smart-manager-product.js:203 #: assets/js/smart-manager-product.js:209 #: assets/js/smart-manager-product.js:307 #: assets/js/smart-manager-product.js:314 msgctxt "placeholder" msgid "Pipe (|) separate terms" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:429 #: pro/assets/js/smart-manager.js:1155 msgctxt "placeholder" msgid "Replace with..." msgstr "" #: assets/js/smart-manager.js:2733 msgctxt "placeholder" msgid "Search For Disabled Columns..." msgstr "" #: assets/js/smart-manager.js:2726 msgctxt "placeholder" msgid "Search For Enabled Columns..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:428 #: pro/assets/js/smart-manager.js:1154 msgctxt "placeholder" msgid "Search for..." msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:230 #: pro/assets/js/smart-manager.js:1119 #, javascript-format msgctxt "placeholder" msgid "Select %s" msgstr "" #: assets/js/smart-manager-product.js:190 #: assets/js/smart-manager-product.js:293 msgctxt "placeholder" msgid "Select terms" msgstr "" #: assets/js/smart-manager.js:278 msgctxt "placeholder" msgid "Type to search..." msgstr "" #: pro/templates/email.php:62 msgid "please leave us a" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:132 msgid "Please mention..." msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:71 msgid "Please select an option" msgstr "" #: assets/js/smart-manager-product.js:183 msgctxt "position checkbox" msgid "Position:" msgstr "" #: classes/class-smart-manager-shop-order.php:437 #: pro/templates/order-invoice.php:163 msgid "Price" msgstr "Pris" #: classes/class-smart-manager-pricing.php:641 msgid "Pricing" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:330 msgid "Print Order Settings" msgstr "" #: classes/class-smart-manager-pricing.php:584 msgid "Print packing slips for WooCommerce orders in bulk" msgstr "" #: classes/class-smart-manager-pricing.php:562 msgid "Print PDF invoices" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:195 msgid "Privileges for Smart Manager for different System Roles" msgstr "" #: class-smart-manager.php:1447 msgid "PRO" msgstr "" #: classes/class-smart-manager-admin-welcome.php:333 #: classes/class-smart-manager-admin-welcome.php:349 #: classes/class-smart-manager-pricing.php:416 msgid "Pro" msgstr "Pro" #: pro/templates/order-invoice.php:162 msgid "Product" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:223 msgid "Product Attributes" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:209 msgid "Product categories" msgstr "" #: pro/assets/js/smart-manager-product.js:127 msgctxt "product price operator" msgid "set to regular price" msgstr "" #: pro/assets/js/smart-manager-product.js:123 msgctxt "product price operator" msgid "set to sale price" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:109 msgid "Product Units" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:229 msgid "Products" msgstr "Produkt" #: pro/classes/class-smart-manager-pro-background-updater.php:322 msgid "Progress" msgstr "" #: pro/assets/js/smart-manager.js:601 #, fuzzy #| msgid "Publish" msgid "Public" msgstr "Udgiv" #: classes/class-smart-manager-shop-order.php:437 msgid "Qty" msgstr "" #: pro/templates/order-invoice.php:163 msgid "Quantity" msgstr "Antal" #: classes/class-smart-manager-admin-welcome.php:248 msgid "Questions? Need Help?" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:65 msgid "Quick Feedback for Smart Manager plugin" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:103 msgid "Rank Math SEO Score" msgstr "" #: pro/templates/email.php:62 msgid "rating. A huge thank you from StoreApps in advance!" msgstr "" #: pro/templates/email.php:45 msgid "Records Updated" msgstr "" #: classes/class-smart-manager-product.php:890 msgid "Reduced Rate" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:111 msgid "Regular Unit Price" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:316 msgid "request is running" msgstr "" #: classes/class-smart-manager-admin-welcome.php:390 msgid "" "Request you to kindly de-activate and activate the Smart Manager plugin once " "and then have a recheck with the search functionality." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:86 msgid "Require a buffer period of" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:117 msgid "Requires confirmation?" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:219 msgid "Resources are..." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:124 msgid "Restrict start and end days?" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:153 msgid "Robots Meta" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:32 msgctxt "rule content" msgid "This group is a \"pass\" when" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:35 msgctxt "rule option" msgid "all" msgstr "" #: assets/js/admin.js:1 src/views/RuleGroup.js:36 msgctxt "rule option" msgid "at least one" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:112 msgid "Sale Unit Price" msgstr "" #: assets/js/smart-manager.js:280 assets/js/smart-manager.js:539 #, javascript-format msgctxt "search conditions" msgid "%d condition%s" msgstr "" #: assets/js/smart-manager.js:280 assets/js/smart-manager.js:539 msgctxt "search conditions" msgid "s" msgstr "" #: classes/class-smart-manager-product.php:735 msgid "Search results only" msgstr "" #: assets/js/smart-manager.js:354 assets/js/smart-manager.js:355 #, javascript-format msgctxt "search type" msgid "%s Search" msgstr "" #: assets/js/smart-manager.js:276 msgctxt "search type" msgid "Advanced" msgstr "" #: assets/js/smart-manager.js:276 msgctxt "search type" msgid "Simple" msgstr "" #: classes/class-smart-manager-admin-welcome.php:324 #: classes/class-smart-manager-admin-welcome.php:341 msgid "See how" msgstr "" #: classes/class-smart-manager-admin-welcome.php:295 #: classes/class-smart-manager-admin-welcome.php:304 msgid "see how" msgstr "" #: pro/assets/js/smart-manager-product.js:152 pro/assets/js/smart-manager.js:24 #: pro/assets/js/smart-manager.js:890 #, fuzzy #| msgid "Select an action" msgid "Select Action" msgstr "Udfør følgende" #: pro/assets/js/smart-manager-product.js:143 msgid "Select Attribute" msgstr "" #: pro/assets/js/smart-manager.js:874 #, fuzzy #| msgid "Select a field" msgid "Select Field" msgstr "Vælg et felt" #: assets/js/admin.js:1 src/views/BulkEditDialog.js:147 #: pro/assets/js/smart-manager.js:871 msgid "Selected Items" msgstr "" #: classes/class-smart-manager-pricing.php:513 msgid "" "Set to, Append, Prepend, Increase / Decrease by %, Increase / Decrease by " "number, Set datetime to, Set date to, Set time to, Upload images and many " "more..." msgstr "" #: class-smart-manager.php:669 class-smart-manager.php:1455 #: classes/class-smart-manager-admin-welcome.php:252 #: pro/classes/class-smart-manager-pro-access-privilege.php:178 msgid "Settings" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:56 msgid "Settings Saved Successfully!!!" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:328 #: pro/templates/order-invoice.php:197 msgid "Shipping" msgstr "Forsendelse" #: pro/templates/order-invoice.php:151 msgid "Shipping Address" msgstr "Adresse pÃ¥ modtager" #: pro/classes/class-smart-manager-pro-shop-coupon.php:215 #, fuzzy #| msgid "Shipping Method" msgid "Shipping methods" msgstr "Forsendelses metode" #: classes/class-smart-manager-product.php:845 #: classes/class-smart-manager-product.php:851 msgid "Shipping only" msgstr "" #: classes/class-smart-manager-product.php:733 msgid "Shop and search results" msgstr "" #: classes/class-smart-manager-product.php:734 msgid "Shop only" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:141 #, php-format msgid "Should search engines follow links on this %1$s?" msgstr "" #: assets/js/smart-manager-product.js:435 msgctxt "show variations checkbox" msgid "Show Variations" msgstr "" #: classes/class-smart-manager-admin-welcome.php:308 msgid "Show/Hide & Sort Data Columns" msgstr "" #: classes/class-smart-manager-admin-welcome.php:313 msgid "" "Show/hide multiple data columns of your WooCommerce store data as per your " "requirements. Sort them in ascending or descending order. Smart Manager also " "gives you persistent state management." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:104 msgid "Sign-up Fee" msgstr "" #: classes/class-smart-manager-pricing.php:473 msgid "Simple Search" msgstr "" #: classes/class-smart-manager-admin-welcome.php:295 #, php-format msgid "" "Simply enter the keyword you wish to filter records in the “Simple Search†" "field at the top of the grid (%s). If you need to have a more specific " "search result, then you can switch to “%s“ and then search." msgstr "" #: pro/classes/class-smart-manager-pro-base.php:26 msgid "Site-wide default" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:68 msgid "Skip & Deactivate" msgstr "" #: classes/class-smart-manager-product.php:949 #: pro/templates/order-invoice.php:162 msgid "SKU" msgstr "Varenummer" #: classes/class-smart-manager-product.php:954 #: pro/classes/class-smart-manager-pro-wc-membership-plan.php:97 #: pro/classes/class-smart-manager-pro-wc-membership-plan.php:98 msgid "Slug" msgstr "" #: pro/templates/email.php:62 msgid "Smart Manager" msgstr "Smart Manager" #. Name of the plugin msgid "Smart Manager For WooCommerce – Stock Management, Bulk Edit & more..." msgstr "" #: pro/templates/email.php:36 msgid "Smart Manager has successfully completed" msgstr "" #: classes/class-smart-manager-admin-welcome.php:280 msgid "" "Smart Manager is a unique, revolutionary tool that gives you the power to " "boost your productivity by 10x in managing your WooCommerce store " "by using a familiar, single page, spreadsheet like interface. " msgstr "" #: classes/class-smart-manager-admin-welcome.php:414 #, php-format msgid "" "Smart Manager is actively developed. If you can't find your favorite feature " "(or have a suggestion) %s. We'd love to hear from you." msgstr "" #: classes/class-smart-manager-admin-welcome.php:394 msgid "" "Smart Manager is based on WooCommerce and WPeCommerce and the same e-" "commerce plugins sets the price/sales price of the variation parents " "automatically based on the price/sales price of its variations." msgstr "" #: classes/class-smart-manager-admin-welcome.php:385 msgid "Smart Manager is empty?" msgstr "" #: classes/class-smart-manager-pricing.php:676 msgid "Smart Manager Pro" msgstr "" #: classes/class-smart-manager-admin-welcome.php:389 msgid "Smart Manager search functionality not working" msgstr "" #: classes/class-smart-manager-admin-welcome.php:398 msgid "" "Smart Manager will allow you to manage custom field of any other plugin." msgstr "" #: classes/class-smart-manager-product.php:889 msgid "Standard" msgstr "" #: classes/class-smart-manager-shop-order.php:162 #: pro/classes/class-smart-manager-pro-shop-subscription.php:177 msgid "Status" msgstr "Status" #. Author of the plugin msgid "StoreApps" msgstr "" #: class-smart-manager.php:678 msgid "StoreApps Plugins" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:67 msgid "Submit & Deactivate" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:70 msgid "Submit a reason to deactivate" msgstr "" #: classes/class-smart-manager-admin-welcome.php:414 msgid "Submit your query" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:246 msgid "Subscription Periods" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:103 msgid "Subscription Price" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:271 msgid "Subscription Trial Period" msgstr "" #: classes/class-smart-manager-pricing.php:628 msgid "Support" msgstr "" #: classes/class-smart-manager-pricing.php:423 msgid "Supported Post Types" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:66 msgid "Take a moment to let us know why you are deactivating" msgstr "" #: pro/templates/order-invoice.php:208 msgid "Tax" msgstr "Moms" #: classes/class-smart-manager-product.php:844 #: classes/class-smart-manager-product.php:850 msgid "Taxable" msgstr "" #: pro/templates/order-invoice.php:159 msgid "Tel" msgstr "" #: pro/assets/js/smart-manager.js:39 msgctxt "text operator" msgid "append" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "contains" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "is" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "is not" msgstr "" #: assets/js/smart-manager.js:102 msgctxt "text operator" msgid "not contains" msgstr "" #: pro/assets/js/smart-manager.js:39 msgctxt "text operator" msgid "prepend" msgstr "" #: classes/class-smart-manager-admin-welcome.php:230 #, php-format msgid "Thank you for installing Smart Manager %s!" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:112 msgid "The plugin is great, but I need specific feature that you don't support" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:100 msgid "The plugin is not working / not compatible with another plugin." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:238 msgid "The starting block only" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:22 msgctxt "time duration" msgid "hours" msgstr "" #: assets/js/admin.js:1 src/views/Rule.js:22 msgctxt "time duration" msgid "minutes" msgstr "" #: pro/assets/js/smart-manager.js:35 msgctxt "time operator" msgid "set time to" msgstr "" #: assets/js/smart-manager.js:279 msgctxt "title" msgid "Click to add/edit condition" msgstr "" #: assets/js/smart-manager.js:362 msgctxt "title" msgid "Custom Views" msgstr "" #: pro/assets/js/smart-manager-product.js:226 #, fuzzy msgctxt "title" msgid "For more than one values, use pipe (|) as delimiter" msgstr "Indtastes flere værdier, adskil da med (|)" #: assets/js/smart-manager.js:1700 msgctxt "title" msgid "Gallery Images" msgstr "" #: assets/js/smart-manager.js:447 msgctxt "title" msgid "Load more records" msgstr "" #: assets/js/smart-manager.js:1293 msgctxt "title" msgid "Remove gallery image" msgstr "" #: assets/js/smart-manager.js:354 #, javascript-format msgctxt "title" msgid "Switch to %s" msgstr "" #: classes/class-smart-manager-admin-welcome.php:402 #, php-format msgid "To show / hide columns in the Smart Manager, %s." msgstr "" #: assets/js/smart-manager.js:1410 msgctxt "tooltip" msgid "(Click to sort)" msgstr "" #: assets/js/smart-manager.js:392 msgctxt "tooltip" msgid "Add Row" msgstr "" #: assets/js/smart-manager.js:378 msgctxt "tooltip" msgid "Bulk Edit" msgstr "" #: assets/js/smart-manager.js:412 msgctxt "tooltip" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:402 msgctxt "tooltip" msgid "Duplicate" msgstr "" #: assets/js/smart-manager.js:420 msgctxt "tooltip" msgid "Export CSV" msgstr "" #: assets/js/smart-manager.js:426 msgctxt "tooltip" msgid "Print Invoice" msgstr "" #: assets/js/smart-manager.js:386 msgctxt "tooltip" msgid "Save" msgstr "" #: assets/js/smart-manager.js:434 msgctxt "tooltip" msgid "Show / Hide Columns" msgstr "" #: pro/templates/order-invoice.php:209 msgid "Total" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:110 msgid "Unit Price Units" msgstr "" #: classes/class-smart-manager-pricing.php:446 msgid "Unlimited" msgstr "" #: pro/templates/email.php:7 msgid "Updated" msgstr "" #: classes/class-smart-manager-admin-welcome.php:393 msgid "Updating variation parent price/sales price not working?" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:339 msgid "Upload Image" msgstr "" #: classes/class-smart-manager-pricing.php:442 msgid "Upto three records without saving" msgstr "" #: classes/class-smart-manager-shop-coupon.php:121 msgid "Usage Limit Per Coupon" msgstr "" #: classes/class-smart-manager-admin-welcome.php:357 msgid "using Simple Search†or Advanced Search" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:241 msgid "Validity Suffix" msgstr "" #: pro/templates/email.php:44 msgid "Value" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:142 msgid "Variation Category group-of rules: Exclude" msgstr "" #: assets/js/smart-manager-product.js:181 msgctxt "variation flag" msgid "Used for variations" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:93 msgid "Variation Group of..." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:98 msgid "Variation Maximum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:92 msgid "Variation Maximum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:97 msgid "Variation Minimum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:91 msgid "Variation Minimum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:140 msgid "Variation Order rules: Do not count" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:141 msgid "Variation Order rules: Exclude" msgstr "" #: classes/class-smart-manager-pricing.php:595 msgid "View Customer Lifetime Value (LTV)" msgstr "" #: classes/class-smart-manager-admin-welcome.php:365 msgid "View our other WooCommerce plugins" msgstr "" #: assets/js/smart-manager-product.js:179 msgctxt "visibility flag" msgid "Visible on the product page" msgstr "" #: classes/class-smart-manager-pricing.php:661 msgid "" "We recommend Smart Manager Pro to everyone who is looking for an extremely " "multi-functional store manager. The plugin is absolutely worth it. Never " "again without Smart Manager!" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:108 msgid "What did you wanted to do in short period?" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:120 msgid "What is that plugin name?" msgstr "" #: classes/class-smart-manager-pricing.php:399 msgid "" "What really sold me on Smart Manager Pro was Bulk Edit. My assistant does " "not have to do any complex math now (earlier, I always feared she would make " "mistakes)! With Smart Manager, she has more free time at hand, so I asked " "her to set up auto responder emails. The response was phenomenal. Repeat " "sales were up by 19.5%." msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:114 msgid "What specific feature you need?" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:317 msgid "when it is completed." msgstr "" #: classes/class-smart-manager-pricing.php:432 msgid "" "WordPress Pages, Media, Users, SEO plugins, WooCommerce Subscriptions, " "Bookings, Memberships, Product Add-ons, Brands…all" msgstr "" #: classes/class-smart-manager-pricing.php:427 msgid "" "WordPress Posts, WooCommerce Products, Product Variations, Orders, Coupons" msgstr "" #: classes/class-smart-manager-pricing.php:632 msgid "WP forum" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:134 #: pro/classes/class-smart-manager-pro-base.php:142 msgid "Yes" msgstr "Ja" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:69 msgid "Yes - Deactivate" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:98 msgid "Yoast Focus Keyphrase" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:96 msgid "Yoast Meta Description" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:97 msgid "Yoast Meta Keywords" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:101 msgid "Yoast Readability Score" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:102 msgid "Yoast SEO Score" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:95 msgid "Yoast SEO Title" msgstr "" #: classes/class-smart-manager-admin-welcome.php:341 #, php-format msgid "" "You can change / update multiple fields of the entire store OR for selected " "items by selecting multiple records and then click on Bulk Edit. %s." msgstr "" #: classes/class-smart-manager-pricing.php:676 #, php-format msgid "" "You can either spend hours of work in store management or use %s to " "accomplish the same within minutes." msgstr "" #: classes/class-smart-manager-admin-welcome.php:357 #, php-format msgid "" "You can export all the records OR filtered records (%s) by simply clicking " "on the Export CSV button at the bottom right of the grid." msgstr "" #: classes/class-smart-manager-admin-welcome.php:304 #, php-format msgid "" "You can quickly update your Products, Orders, Coupons and Posts from Smart " "Manager itself. This facilitates editing of multiple rows at a time instead " "of editing and saving each row separately, %s." msgstr "" #: classes/class-smart-manager-admin-welcome.php:324 #, php-format msgid "" "You can simply select records you want to delete (check the header box if " "you want to delete all records) and click on the “Delete†icon. All the " "selected records will be deleted. You can even delete records by applying " "search filters. %s." msgstr "" #: classes/class-smart-manager-admin-welcome.php:406 msgid "" "You cannot import using Smart Manager. Use import functionality of " "WooCommerce." msgstr "" #: class-smart-manager.php:1149 msgid "you will have to wait for the current background process to finish." msgstr "" #: classes/class-smart-manager-product.php:891 msgid "Zero Rate" msgstr "" #: classes/class-smart-manager-pricing.php:343 msgid "â° Limited time offer" msgstr "" languages/smart-manager-for-wp-e-commerce.pot000064400000304453147600337620015237 0ustar00# Copyright (C) 2025 StoreApps # This file is distributed under the GNU General Public License v2.0. msgid "" msgstr "" "Project-Id-Version: WooCommerce Advanced Bulk Edit Products, Orders, Coupons, Any WordPress Post Type - Smart Manager 8.54.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/smart-manager-for-wp-e-commerce\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "POT-Creation-Date: 2025-01-16T12:57:24+00:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.9.0\n" "X-Domain: smart-manager-for-wp-e-commerce\n" #. Plugin Name of the plugin msgid "WooCommerce Advanced Bulk Edit Products, Orders, Coupons, Any WordPress Post Type - Smart Manager" msgstr "" #. Plugin URI of the plugin msgid "https://www.storeapps.org/product/smart-manager/" msgstr "" #. Description of the plugin msgid "Pro Version Installed. The #1 tool for WooCommerce inventory management, stock management, bulk edit, export, delete, duplicate...from one place using an Excel-like sheet editor." msgstr "" #. Author of the plugin msgid "StoreApps" msgstr "" #. Author URI of the plugin msgid "https://www.storeapps.org/" msgstr "" #: class-smart-manager.php:254 msgctxt "product stock log dashboard name" msgid "Product Stock Log" msgstr "" #: class-smart-manager.php:266 msgid "LifterLMS Orders" msgstr "" #: class-smart-manager.php:267 msgid "LifterLMS Coupons" msgstr "" #: class-smart-manager.php:780 msgid " 🔥 Go Pro" msgstr "" #: class-smart-manager.php:783 msgid "Docs & Support" msgstr "" #: class-smart-manager.php:789 msgid "StoreApps Plugins" msgstr "" #. translators: %1$s: current user display name %2$s: HTML of Pro price discount #: class-smart-manager.php:984 msgid "Hey %1$s, grab your %2$s Halloween discount!" msgstr "" #: class-smart-manager.php:986 #: class-smart-manager.php:989 msgid "25% off" msgstr "" #. translators: %1$s: current user display name %2$s: HTML of Pro price discount #: class-smart-manager.php:988 msgid "Hey %1$s, you just unlocked %2$s on Smart Manager Pro!" msgstr "" #. translators: %s: pricing page link #: class-smart-manager.php:992 msgid "%s to check Smart Manager Pro features/benefits and claim your discount." msgstr "" #. translators: %s: pricing page link #: class-smart-manager.php:992 msgid "Click here" msgstr "" #: class-smart-manager.php:1262 msgid "This functionality has been disabled. Please contact store administrator for enabling the same." msgstr "" #: class-smart-manager.php:1295 msgid "In the meanwhile, you can use Smart Manager. But before using actions like " msgstr "" #: class-smart-manager.php:1295 #: classes/class-smart-manager-admin-welcome.php:344 #: classes/class-smart-manager-task.php:481 msgid "Bulk Edit" msgstr "" #: class-smart-manager.php:1295 msgid "Duplicate Records" msgstr "" #: class-smart-manager.php:1295 #: classes/class-smart-manager-admin-welcome.php:329 msgid "Delete Records" msgstr "" #: class-smart-manager.php:1295 msgid "Undo Tasks" msgstr "" #: class-smart-manager.php:1295 msgid "Delete Tasks" msgstr "" #: class-smart-manager.php:1295 #: classes/class-smart-manager-admin-welcome.php:367 msgid "Export CSV" msgstr "" #: class-smart-manager.php:1295 msgid "you will have to wait for the current background process to finish." msgstr "" #: class-smart-manager.php:1634 msgid "PRO" msgstr "" #: class-smart-manager.php:1634 msgid "LITE" msgstr "" #: class-smart-manager.php:1647 msgid "An upgrade for Smart Manager Pro" msgstr "" #: class-smart-manager.php:1647 msgid "is available." msgstr "" #: class-smart-manager.php:1647 msgid "Click to upgrade." msgstr "" #: class-smart-manager.php:1748 msgid "A required Smart Manager file is missing. Can't continue. " msgstr "" #: class-smart-manager.php:1763 msgid "Error:" msgstr "" #: class-smart-manager.php:1821 msgid "Auto-updates are not available for this plugin." msgstr "" #: class-smart-manager.php:1876 #: class-smart-manager.php:1885 msgctxt "WooCommerce post type label" msgid "WooCommerce - " msgstr "" #: class-smart-manager.php:1911 msgctxt "go pro link title" msgid "Go Pro" msgstr "" #: class-smart-manager.php:1911 msgctxt "go pro link" msgid "Go Pro" msgstr "" #. translators: %1\$: 5-star link %2s: 5-star link #: class-smart-manager.php:1916 msgid "Boost us with %1$s⭐⭐⭐⭐⭐ 🚀%2$s" msgstr "" #: class-smart-manager.php:1917 msgctxt "5-star link title" msgid "5-star review" msgstr "" #. translators: %1$s: user name, %2$s: saved man-hours #: class-smart-manager.php:2162 msgid "Hey %1$s, you’ve just saved %2$s productive hours with Smart Manager! 🎉" msgstr "" #. translators: %1$s: discount percentage, %2$s: additional man-hours #: class-smart-manager.php:2170 msgid "Upgrade to Smart Manager Pro to save additional %1$s hours (minimum) and unlock all features. %2$s" msgstr "" #: class-smart-manager.php:2172 msgid "Get it at" msgstr "" #: class-smart-manager.php:2172 msgid "25% off!" msgstr "" #. translators: %s: Plugin version number #: classes/class-smart-manager-admin-welcome.php:230 msgid "Thank you for installing Smart Manager %s!" msgstr "" #: classes/class-smart-manager-admin-welcome.php:233 msgid "Glad to have you onboard. We hope Smart Manager adds to your desired success ðŸ†" msgstr "" #: classes/class-smart-manager-admin-welcome.php:237 #: classes/class-smart-manager-admin-welcome.php:388 msgid "Get started with Smart Manager" msgstr "" #: classes/class-smart-manager-admin-welcome.php:249 msgid "Questions? Need Help?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:253 msgid "Settings" msgstr "" #: classes/class-smart-manager-admin-welcome.php:255 msgid "Docs" msgstr "" #: classes/class-smart-manager-admin-welcome.php:262 msgid "Know Smart Manager" msgstr "" #: classes/class-smart-manager-admin-welcome.php:265 msgid "FAQ's" msgstr "" #: classes/class-smart-manager-admin-welcome.php:281 msgid "Smart Manager is a unique, revolutionary tool that gives you the power to boost your productivity by 10x in managing your WooCommerce store by using a familiar, single page, spreadsheet like interface. " msgstr "" #. translators: %s: HTML of Smart Manager about screen #: classes/class-smart-manager-admin-welcome.php:284 msgid "Apart from WooCommerce post types like Products, Orders, Coupons, now you can manage %s. Be it Posts, Pages, Media, WordPress Users, etc. you can now manage everything using Smart Manager." msgstr "" #. translators: %s: HTML of Smart Manager about screen #: classes/class-smart-manager-admin-welcome.php:284 msgid "any custom post type in WordPress" msgstr "" #: classes/class-smart-manager-admin-welcome.php:290 msgid "Manage your entire store from a single screen" msgstr "" #: classes/class-smart-manager-admin-welcome.php:293 msgid "Filter / Search Records" msgstr "" #. translators: %1$s: Simple search doc link %2$s: Advanced search doc link #: classes/class-smart-manager-admin-welcome.php:300 msgid "Simply enter the keyword you wish to filter records in the “Simple Search†field at the top of the grid (%1$s). If you need to have a more specific search result, then you can switch to “%2$s“ and then search." msgstr "" #: classes/class-smart-manager-admin-welcome.php:301 #: classes/class-smart-manager-admin-welcome.php:314 msgid "see how" msgstr "" #: classes/class-smart-manager-admin-welcome.php:302 msgid "Advanced Search" msgstr "" #: classes/class-smart-manager-admin-welcome.php:306 msgid "Inline Editing" msgstr "" #. translators: %s: Inline Editing doc link #: classes/class-smart-manager-admin-welcome.php:313 msgid "You can quickly update your Products, Orders, Coupons and Posts from Smart Manager itself. This facilitates editing of multiple rows at a time instead of editing and saving each row separately, %s." msgstr "" #: classes/class-smart-manager-admin-welcome.php:318 msgid "Show/Hide & Sort Data Columns" msgstr "" #: classes/class-smart-manager-admin-welcome.php:323 msgid "Show/hide multiple data columns of your WooCommerce store data as per your requirements. Sort them in ascending or descending order. Smart Manager also gives you persistent state management." msgstr "" #. translators: %s: Delete Records doc link #: classes/class-smart-manager-admin-welcome.php:336 msgid "You can simply select records you want to delete (check the header box if you want to delete all records) and click on the “Delete†icon. All the selected records will be deleted. You can even delete records by applying search filters. %s." msgstr "" #: classes/class-smart-manager-admin-welcome.php:337 #: classes/class-smart-manager-admin-welcome.php:361 msgid "See how" msgstr "" #. translators: %1$s: HTML for bulk edit %2$s: link to Smart Manager Pro product page #: classes/class-smart-manager-admin-welcome.php:348 msgid "Bulk Edit - %1$s (only in %2$s)" msgstr "" #: classes/class-smart-manager-admin-welcome.php:349 msgid "Biggest Time Saver" msgstr "" #: classes/class-smart-manager-admin-welcome.php:350 #: classes/class-smart-manager-admin-welcome.php:372 #: classes/class-smart-manager-base.php:2768 msgid "Pro" msgstr "" #. translators: %s: Bulk Edit doc link #: classes/class-smart-manager-admin-welcome.php:360 msgid "You can change / update multiple fields of the entire store OR for selected items by selecting multiple records and then click on Bulk Edit. %s." msgstr "" #. translators: %s: Export CSV doc link #: classes/class-smart-manager-admin-welcome.php:371 msgid "Export CSV (only in %s)" msgstr "" #. translators: %s: HTML of Export CSV #: classes/class-smart-manager-admin-welcome.php:382 msgid "You can export all the records OR filtered records (%s) by simply clicking on the Export CSV button at the bottom right of the grid." msgstr "" #: classes/class-smart-manager-admin-welcome.php:383 msgid "using Simple Search†or Advanced Search" msgstr "" #: classes/class-smart-manager-admin-welcome.php:391 msgid "View our other WooCommerce plugins" msgstr "" #: classes/class-smart-manager-admin-welcome.php:406 msgid "FAQ / Common Problems" msgstr "" #: classes/class-smart-manager-admin-welcome.php:411 msgid "Smart Manager is empty?" msgstr "" #. translators: %s: Changelog doc link #: classes/class-smart-manager-admin-welcome.php:414 msgid "Make sure you are using %s of Smart Manager. If still the issue persist, temporarily de-activate all plugins except WooCommerce/WPeCommerce & Smart Manager. Re-check the issue, if the issue still persists, contact us. If the issue goes away, re-activate other plugins one-by-one & re-checking the fields, to find out which plugin is conflicting." msgstr "" #: classes/class-smart-manager-admin-welcome.php:415 #: classes/class-smart-manager-admin-welcome.php:457 msgid "latest version" msgstr "" #: classes/class-smart-manager-admin-welcome.php:418 msgid "Smart Manager search functionality not working" msgstr "" #: classes/class-smart-manager-admin-welcome.php:419 msgid "Request you to kindly de-activate and activate the Smart Manager plugin once and then have a recheck with the search functionality." msgstr "" #: classes/class-smart-manager-admin-welcome.php:422 msgid "Updating variation parent price/sales price not working?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:423 msgid "Smart Manager is based on WooCommerce and WPeCommerce and the same e-commerce plugins sets the price/sales price of the variation parents automatically based on the price/sales price of its variations." msgstr "" #: classes/class-smart-manager-admin-welcome.php:426 msgid "How to manage any custom field of any custom plugin using Smart Manager?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:427 msgid "Smart Manager will allow you to manage custom field of any other plugin." msgstr "" #: classes/class-smart-manager-admin-welcome.php:430 msgid "How to add columns to Smart Manager dashboard?" msgstr "" #. translators: %s: Show and Hide doc link #: classes/class-smart-manager-admin-welcome.php:433 msgid "To show / hide columns in the Smart Manager, %s." msgstr "" #: classes/class-smart-manager-admin-welcome.php:434 msgid "click here" msgstr "" #: classes/class-smart-manager-admin-welcome.php:437 msgid "Can I import using Smart Manager?" msgstr "" #: classes/class-smart-manager-admin-welcome.php:438 msgid "You cannot import using Smart Manager. Use import functionality of WooCommerce." msgstr "" #: classes/class-smart-manager-admin-welcome.php:445 msgid "I can't find a way to do X..." msgstr "" #. translators: %s: contact us link #: classes/class-smart-manager-admin-welcome.php:448 msgid "Smart Manager is actively developed. If you can't find your favorite feature (or have a suggestion) %s. We'd love to hear from you." msgstr "" #: classes/class-smart-manager-admin-welcome.php:449 msgid "Submit your query" msgstr "" #: classes/class-smart-manager-admin-welcome.php:449 msgid "contact us" msgstr "" #: classes/class-smart-manager-admin-welcome.php:453 msgid "How do I upgrade a Lite version to a Pro version?" msgstr "" #. translators: %s: Lite version to a Pro version doc link #: classes/class-smart-manager-admin-welcome.php:456 msgid "Follow steps listed here: %s" msgstr "" #: classes/class-smart-manager-base.php:300 msgid "Featured Image" msgstr "" #: classes/class-smart-manager-base.php:597 msgid "Edit" msgstr "" #: classes/class-smart-manager-base.php:612 msgid "View" msgstr "" #: classes/class-smart-manager-base.php:895 #: classes/class-smart-manager-product.php:996 #: pro/classes/class-smart-manager-pro-wc-membership-plan.php:97 #: pro/classes/class-smart-manager-pro-wc-membership-plan.php:98 msgid "Slug" msgstr "" #: classes/class-smart-manager-base.php:1391 #: classes/class-smart-manager-base.php:1392 #: classes/class-smart-manager-base.php:1393 #: classes/class-smart-manager-shop-order.php:1773 msgid "Trash" msgstr "" #. translators: %1$s: time saved in minutes/hours, %2$s: additional savings possible, %3$s: Pro upgrade link #: classes/class-smart-manager-base.php:2751 msgid "You saved %1$s, and you can save more %2$s by upgrading to %3$s." msgstr "" #. translators: %1$d: number of updated record %2$s: record update message #: classes/class-smart-manager-base.php:2777 #: classes/class-smart-manager-base.php:2785 msgid "%1$d record%2$s updated successfully!" msgstr "" #. translators: %1$d: number of updated record %2$s: record update message #: classes/class-smart-manager-base.php:2833 msgid "%1$d record%2$s deleted successfully!" msgstr "" #: classes/class-smart-manager-base.php:3899 msgctxt "export data model" msgid "Export CSV: no data found " msgstr "" #: classes/class-smart-manager-base.php:3963 msgctxt "export file data" msgid "Export CSV: no file data found " msgstr "" #: classes/class-smart-manager-product-stock-log.php:115 msgctxt "task id" msgid "Task ID" msgstr "" #: classes/class-smart-manager-product-stock-log.php:116 msgctxt "task type" msgid "Type" msgstr "" #: classes/class-smart-manager-product-stock-log.php:117 msgctxt "task status" msgid "Status" msgstr "" #: classes/class-smart-manager-product-stock-log.php:118 msgctxt "task completed date" msgid "Date" msgstr "" #: classes/class-smart-manager-product-stock-log.php:119 msgctxt "name and email address of the user who created the task" msgid "Author" msgstr "" #: classes/class-smart-manager-product-stock-log.php:148 msgctxt "product id" msgid "Product ID" msgstr "" #: classes/class-smart-manager-product-stock-log.php:149 msgctxt "old stock value" msgid "Old Value" msgstr "" #: classes/class-smart-manager-product-stock-log.php:150 msgctxt "New stock value" msgid "New Value" msgstr "" #: classes/class-smart-manager-product-stock-log.php:153 msgctxt "parent id" msgid "Parent ID" msgstr "" #: classes/class-smart-manager-product-stock-log.php:157 msgctxt "product SKU" msgid "SKU" msgstr "" #: classes/class-smart-manager-product-stock-log.php:158 msgctxt "product title" msgid "Product Title" msgstr "" #: classes/class-smart-manager-product-stock-log.php:159 msgctxt "product type" msgid "Product Type" msgstr "" #: classes/class-smart-manager-product-stock-log.php:206 msgctxt "product stock log dashboard" msgid "Product Stock Log" msgstr "" #: classes/class-smart-manager-product.php:773 msgid "Shop and search results" msgstr "" #: classes/class-smart-manager-product.php:774 msgid "Shop only" msgstr "" #: classes/class-smart-manager-product.php:775 msgid "Search results only" msgstr "" #: classes/class-smart-manager-product.php:776 msgid "Hidden" msgstr "" #: classes/class-smart-manager-product.php:847 msgctxt "Product category" msgid "Category" msgstr "" #: classes/class-smart-manager-product.php:886 #: classes/class-smart-manager-product.php:892 msgid "Taxable" msgstr "" #: classes/class-smart-manager-product.php:887 #: classes/class-smart-manager-product.php:893 msgid "Shipping only" msgstr "" #: classes/class-smart-manager-product.php:888 #: classes/class-smart-manager-product.php:894 #: pro/classes/class-smart-manager-pro-base.php:72 msgid "None" msgstr "" #: classes/class-smart-manager-product.php:904 msgid "In stock" msgstr "" #: classes/class-smart-manager-product.php:905 msgid "Out of stock" msgstr "" #: classes/class-smart-manager-product.php:906 msgid "On backorder" msgstr "" #: classes/class-smart-manager-product.php:931 msgid "Standard" msgstr "" #: classes/class-smart-manager-product.php:932 msgid "Reduced Rate" msgstr "" #: classes/class-smart-manager-product.php:933 msgid "Zero Rate" msgstr "" #: classes/class-smart-manager-product.php:952 msgid "Do Not Allow" msgstr "" #: classes/class-smart-manager-product.php:953 msgid "Allow, but notify customer" msgstr "" #: classes/class-smart-manager-product.php:954 msgid "Allow" msgstr "" #: classes/class-smart-manager-product.php:983 #: classes/class-smart-manager-product.php:985 msgid "No shipping class" msgstr "" #: classes/class-smart-manager-product.php:991 #: pro/templates/order-invoice.php:172 msgid "SKU" msgstr "" #: classes/class-smart-manager-product.php:994 #: pro/classes/class-smart-manager-pro-acf-field-group.php:42 #: pro/classes/class-smart-manager-pro-acf-field.php:42 msgid "Name" msgstr "" #: classes/class-smart-manager-product.php:998 #: classes/class-smart-manager-shop-coupon.php:117 msgid "Description" msgstr "" #: classes/class-smart-manager-product.php:1000 msgid "Additional Description" msgstr "" #: classes/class-smart-manager-product.php:1014 msgid "External Url" msgstr "" #: classes/class-smart-manager-product.php:1106 msgid "Attributes" msgstr "" #: classes/class-smart-manager-product.php:1139 msgid "Attributes: custom" msgstr "" #: classes/class-smart-manager-product.php:1181 msgid "Catalog Visibility" msgstr "" #: classes/class-smart-manager-product.php:1228 msgid "Featured" msgstr "" #: classes/class-smart-manager-product.php:1317 #: classes/class-smart-manager-product.php:1318 msgctxt "variations enabled column for advanced search" msgid "Variations Enabled" msgstr "" #: classes/class-smart-manager-product.php:2229 #: classes/class-smart-manager-product.php:2232 msgid "Featured Image updated successfully" msgstr "" #: classes/class-smart-manager-product.php:2275 msgctxt "Title for task" msgid "Edited Stock" msgstr "" #: classes/class-smart-manager-shop-coupon.php:115 msgid "Coupon Code" msgstr "" #: classes/class-smart-manager-shop-coupon.php:119 msgid "Allowed Emails" msgstr "" #: classes/class-smart-manager-shop-coupon.php:121 msgid "Usage Limit Per Coupon" msgstr "" #: classes/class-smart-manager-shop-coupon.php:123 msgid "Allow Free Shipping" msgstr "" #: classes/class-smart-manager-shop-order.php:98 msgctxt "order edit link" msgid "Edit" msgstr "" #: classes/class-smart-manager-shop-order.php:232 #: pro/classes/class-smart-manager-pro-shop-subscription.php:216 msgid "Date" msgstr "" #: classes/class-smart-manager-shop-order.php:234 #: pro/classes/class-smart-manager-pro-shop-subscription.php:218 msgid "Status" msgstr "" #: classes/class-smart-manager-shop-order.php:236 msgid "Customer provided note" msgstr "" #: classes/class-smart-manager-shop-order.php:499 msgid "Qty" msgstr "" #: classes/class-smart-manager-shop-order.php:499 #: pro/templates/order-invoice.php:173 msgid "Price" msgstr "" #: classes/class-smart-manager-shop-order.php:502 #: pro/classes/class-smart-manager-pro-product.php:126 msgid "Cost of Good" msgstr "" #. translators: %1$s: order note %2$s: author name %2$s: order note added date #: classes/class-smart-manager-shop-order.php:526 msgctxt "order note" msgid "Note: %1$s (Added by %2$s on %3$s)" msgstr "" #: classes/class-smart-manager-shop-order.php:2022 msgid "Address Billing Email" msgstr "" #: classes/class-smart-manager-task.php:119 msgid "ID" msgstr "" #: classes/class-smart-manager-task.php:342 msgctxt "task update params" msgid "No params found for updating task " msgstr "" #: classes/class-smart-manager-task.php:474 msgid "In Progress" msgstr "" #: classes/class-smart-manager-task.php:475 msgid "Completed" msgstr "" #: classes/class-smart-manager-task.php:476 msgid "Scheduled" msgstr "" #: classes/class-smart-manager-task.php:480 msgid "Inline" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:65 msgid "Quick Feedback for Smart Manager plugin" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:66 msgid "Take a moment to let us know why you are deactivating" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:67 msgid "Submit & Deactivate" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:68 msgid "Skip & Deactivate" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:69 msgid "Yes - Deactivate" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:70 msgid "Submit a reason to deactivate" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:71 msgid "Please select an option" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:100 msgid "The plugin is not working / not compatible with another plugin." msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:102 msgid "Kindly share what did not work for you / conflicting with which plugin so we can fix it..." msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:106 msgid "I only needed the plugin for a short period" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:108 msgid "What did you wanted to do in short period?" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:112 msgid "The plugin is great, but I need specific feature that you don't support" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:114 msgid "What specific feature you need?" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:118 msgid "I found another plugin for my needs" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:120 msgid "What is that plugin name?" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:124 msgid "It is a temporary deactivation. I am just debugging an issue." msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:130 msgid "Other" msgstr "" #: classes/deactivation-survey/class-sa-smart-manager-deactivation.php:132 msgid "Please mention..." msgstr "" #: classes/sa-includes/class-sa-sm-in-app-offer.php:126 msgctxt "timezone date format" msgid "Y-m-d H:i:s" msgstr "" #: classes/sa-includes/class-sa-sm-in-app-offer.php:228 msgid "Dismiss" msgstr "" #: classes/sa-includes/class-sa-sm-in-app-offer.php:228 msgid "Hide this" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:205 msgctxt "select group title" msgid "Default" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:209 msgctxt "select group title" msgid "WooCommerce" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:217 msgctxt "select group title" msgid "Other" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:275 msgctxt "select group title" msgid "All Post Types" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:285 msgctxt "select group title" msgid "All Taxonomies" msgstr "" #: pro/classes/class-smart-manager-pro-access-privilege.php:301 msgctxt "select group title" msgid "All saved views" msgstr "" #: pro/classes/class-smart-manager-pro-acf-field-group.php:41 #: pro/classes/class-smart-manager-pro-acf-field.php:41 msgid "Label" msgstr "" #: pro/classes/class-smart-manager-pro-acf-field-group.php:43 #: pro/classes/class-smart-manager-pro-acf-field.php:43 msgid "Config Options" msgstr "" #: pro/classes/class-smart-manager-pro-acf-field-group.php:44 #: pro/classes/class-smart-manager-pro-acf-field.php:44 msgid "Key" msgstr "" #: pro/classes/class-smart-manager-pro-acf-field.php:45 msgid "Group Id" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:78 msgctxt "background process task params" msgid "Background process task params " msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:151 msgid "% completed" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:173 msgid "% Completed" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:349 msgid "All" msgstr "" #. translators: 1. Error title 2. The bulk process #: pro/classes/class-smart-manager-pro-background-updater.php:362 msgid "%1$s: The %2$s process has stopped. Please review the Smart Manager dashboard to check the status." msgstr "" #. translators: 1. Error title 2. The bulk process #: pro/classes/class-smart-manager-pro-background-updater.php:362 msgid "Error" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:370 msgid "Important" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:371 msgid "request is running" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:372 msgid "in the background. You will be notified on" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:372 msgid "when it is completed." msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:377 msgid "Progress" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:378 msgid "--:--:--" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:384 msgid "NOTE" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:392 msgid "for" msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:392 msgid "completed successfully" msgstr "" #. translators: %s: process name #: pro/classes/class-smart-manager-pro-background-updater.php:405 msgid "Are you sure you want to stop the %s process? Click OK to stop." msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:521 msgctxt "batch handler params" msgid "Batch handler params " msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:522 msgctxt "batch handler update ids" msgid "Batch handler update ids " msgstr "" #: pro/classes/class-smart-manager-pro-background-updater.php:689 msgid "Every 5 Seconds" msgstr "" #. translators: %s: process name #: pro/classes/class-smart-manager-pro-background-updater.php:822 msgctxt "batch handler time exceed status" msgid "Time is exceeded for %s" msgstr "" #. translators: %s: process name #: pro/classes/class-smart-manager-pro-background-updater.php:826 msgctxt "batch handler memory exceed status" msgid "Memory is exceeded for %s" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:71 msgid "Site-wide default" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:73 #: pro/classes/class-smart-manager-pro-base.php:83 msgid "No Image Index" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:74 #: pro/classes/class-smart-manager-pro-base.php:82 msgid "No Archive" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:75 #: pro/classes/class-smart-manager-pro-base.php:84 msgid "No Snippet" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:79 msgid "Index" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:80 msgid "No Index" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:81 msgid "No Follow" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:140 msgid "Yoast SEO Title" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:141 msgid "Yoast Meta Description" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:142 msgid "Yoast Meta Keywords" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:143 msgid "Yoast Focus Keyphrase" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:146 msgid "Yoast Readability Score" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:147 msgid "Yoast SEO Score" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:148 msgid "Rank Math SEO Score" msgstr "" #. translators: %1$s: dashboard title #: pro/classes/class-smart-manager-pro-base.php:179 msgid "Allow search engines to show this %1$s in search results?" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:180 msgid "Default" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:181 #: pro/classes/class-smart-manager-pro-base.php:191 msgid "Yes" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:182 #: pro/classes/class-smart-manager-pro-base.php:192 msgid "No" msgstr "" #. translators: %1$s: dashboard title #: pro/classes/class-smart-manager-pro-base.php:190 msgid "Should search engines follow links on this %1$s?" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:197 msgid "Meta robots advanced" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:202 msgid "Robots Meta" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:516 #: assets/js/admin.js:1 #: src/views/BulkEditDialog.js:214 msgctxt "process name" msgid "Bulk Edit" msgstr "" #. translators: %1$d: number of updated record %2$s: record update message #: pro/classes/class-smart-manager-pro-base.php:549 msgctxt "success notification" msgid "Bulk Edit action scheduled successfully. Check all your scheduled actions here." msgstr "" #: pro/classes/class-smart-manager-pro-base.php:579 msgctxt "process name" msgid "Bulk edit / Batch update" msgstr "" #. translators: %s process name #: pro/classes/class-smart-manager-pro-base.php:969 msgctxt "update status" msgid "%s failed" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:1039 msgctxt "batch process" msgid "No batch process params found" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:1122 msgctxt "process name" msgid "Duplicate Records" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:1251 msgctxt "duplicate process" msgid "Duplicate process failed" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:1267 msgctxt "process name" msgid "Move to trash" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:1271 msgctxt "process name" msgid "Delete All Records" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:1277 msgctxt "process name" msgid "Delete " msgstr "" #: pro/classes/class-smart-manager-pro-base.php:1329 msgctxt "move to trash process" msgid "Move to trash failed" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:1762 msgctxt "delete permanently" msgid "Delete records permanently failed" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:1876 msgctxt "delete process" msgid "Delete process failed" msgstr "" #: pro/classes/class-smart-manager-pro-base.php:2852 msgctxt "bulk update process" msgid "Bulk update posts batch failed" msgstr "" #: pro/classes/class-smart-manager-pro-course.php:42 msgid "Category" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:96 msgid "Booking duration" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:97 msgid "Minimum duration" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:98 msgid "Maximum duration" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:99 msgid "Booking can be cancelled until" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:100 msgid "Min persons" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:101 msgid "Max persons" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:102 msgid "Max bookings per block" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:103 msgid "Minimum block bookable" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:104 msgid "Maximum block bookable" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:105 msgid "Require a buffer period of" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:107 msgid "Minimum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:108 msgid "Maximum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:109 msgid "Group of..." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:110 msgid "Variation Minimum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:111 msgid "Variation Maximum quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:112 msgid "Variation Group of..." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:114 msgid "Minimum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:115 msgid "Maximum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:116 msgid "Variation Minimum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:117 msgid "Variation Maximum Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:119 msgid "Min Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:120 msgid "Max Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:122 msgid "Subscription Price" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:123 msgid "Sign-up Fee" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:124 msgid "Free Trial" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:128 msgid "Product Units" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:129 msgid "Unit Price Units" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:130 msgid "Regular Unit Price" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:131 msgid "Sale Unit Price" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:138 msgid "Enable Calendar Range Picker?" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:139 msgid "Requires confirmation?" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:140 msgid "Can be cancelled?" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:141 msgid "Has persons" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:142 msgid "Has resources" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:143 msgid "Multiply all costs by person count" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:144 msgid "Count persons as bookings" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:145 msgid "Enable person types" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:146 msgid "Restrict start and end days?" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:147 msgid "Adjacent Buffering?" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:152 msgid "Enable Min Max Quantity" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:157 msgid "Min/Max Rules" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:158 msgid "Allow Combination" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:159 msgid "Order rules: Do not count" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:160 msgid "Order rules: Exclude" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:161 msgid "Category group-of rules: Exclude" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:162 msgid "Variation Order rules: Do not count" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:163 msgid "Variation Order rules: Exclude" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:164 msgid "Variation Category group-of rules: Exclude" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:166 msgid "Calculate unit prices automatically" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:170 msgid "Month(s)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:171 msgid "Day(s)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:172 msgid "Hour(s)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:173 msgid "Minutes(s)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:205 msgid "Booking Duration (Type)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:207 msgid "Fixed blocks of" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:208 msgid "Customer defined blocks of" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:213 msgid "Booking Duration (Unit)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:218 msgid "Booking can be cancelled until (Unit)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:223 msgid "Minimum block bookable (Unit)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:228 msgid "Maximum block bookable (Unit)" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:233 msgid "Calendar display mode" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:235 msgid "Display calendar on click" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:236 msgid "Calendar always visible" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:241 msgid "Resources are..." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:243 msgid "Customer selected" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:244 msgid "Automatically assigned" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:249 msgid "All dates are..." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:251 msgid "available by default" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:252 msgid "not-available by default" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:257 msgid "Check rules against..." msgstr "" #: pro/classes/class-smart-manager-pro-product.php:259 msgid "All blocks being booked" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:260 msgid "The starting block only" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:268 msgid "Subscription Periods" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:274 msgid "Billing Period" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:279 msgid "Expire After" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:282 msgid "Never expire" msgstr "" #: pro/classes/class-smart-manager-pro-product.php:293 msgid "Subscription Trial Period" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:248 msgid "Allowed user roles" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:250 msgid "Shipping methods" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:252 msgid "Payment Methods" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:258 msgid "Product Attributes" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:261 msgid "Exclude Attributes" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:264 msgid "Products" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:266 msgid "Exclude products" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:271 msgid "Max discount" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:275 msgid "Coupon Validity" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:276 msgid "Validity Suffix" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:277 msgid "Coupon Title Prefix" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:278 msgid "Coupon Title Suffix" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:279 msgid "Display message" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:283 msgid "Disable Email Restriction" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:284 msgid "Exclude sale items" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:285 msgid "Individual use only" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:286 msgid "Email message?" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:287 msgid "Allow free shipping" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:288 msgid "Auto Generate Coupon" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:289 msgid "Is Pick Price of Product" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:290 msgid "Coupon Is Visible Storewide" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:291 msgid "For new user only?" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:326 msgid "Allowed emails" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:362 msgid "Address to look in" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:363 msgid "Billing" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:364 #: pro/templates/order-invoice.php:207 msgid "Shipping" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:369 msgid "Coupon expiry date" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:374 msgid "Coupon expiry time" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:381 msgid "Product categories" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:381 msgid "Exclude categories" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:395 msgid "Coupon shareable link" msgstr "" #: pro/classes/class-smart-manager-pro-shop-coupon.php:464 msgid "Click to copy" msgstr "" #: pro/classes/class-smart-manager-pro-task.php:108 msgctxt "process name" msgid "Undo Tasks" msgstr "" #: pro/classes/class-smart-manager-pro-task.php:180 msgctxt "undo process args" msgid "Undo process args " msgstr "" #: pro/classes/class-smart-manager-pro-task.php:264 msgctxt "process name" msgid "Delete Tasks" msgstr "" #: pro/classes/class-smart-manager-pro-task.php:308 msgctxt "delete tasks" msgid "No task ids found for deleting tasks" msgstr "" #: pro/classes/class-smart-manager-pro-task.php:330 msgctxt "delete task details" msgid "No task detail ids found for deleting task details" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:99 msgctxt "AFWC Affiliate Tags field name" msgid "AFWC Affiliate Tags" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:216 msgid "Nickname" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:394 msgctxt "AFWC Is Affiliate field name" msgid "AFWC Is Affiliate" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:395 msgctxt "AFWC Referral URL ID field name" msgid "AFWC Referral URL ID" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:396 msgctxt "AFWC PayPal Email field name" msgid "AFWC PayPal Email" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:397 msgctxt "AFWC Parent Chain field name" msgid "AFWC Parent Chain" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:398 msgctxt "AFWC Lifetime Customers field name" msgid "AFWC Lifetime Customers" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:399 msgctxt "AFWC Affiliate Form Description field name" msgid "AFWC Affiliate Form Description" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:400 msgctxt "AFWC Affiliate Form Contact field name" msgid "AFWC Affiliate Form Contact" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:401 msgctxt "AFWC Affiliate Skype Handle field name" msgid "AFWC Affiliate Skype Handle" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:403 msgctxt "AFWC Additional Form Fields field name" msgid "AFWC Additional Form Fields" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:1435 msgid "Email cannot be empty" msgstr "" #: pro/classes/class-smart-manager-pro-user.php:1441 msgid "Email already exists. Please enter another email." msgstr "" #: pro/classes/class-smart-manager-pro-wc-booking.php:172 msgid "Booked Product" msgstr "" #: pro/classes/class-smart-manager-pro-wc-user-membership.php:164 #: pro/classes/class-smart-manager-pro-wc-user-membership.php:165 msgid "Member since" msgstr "" #: pro/classes/class-smart-manager-pro-wc-user-membership.php:169 #: pro/classes/class-smart-manager-pro-wc-user-membership.php:170 msgid "Expires" msgstr "" #: pro/templates/email.php:7 msgid "Duplicated" msgstr "" #: pro/templates/email.php:7 msgid "Updated" msgstr "" #: pro/templates/email.php:37 msgid "Hi there!" msgstr "" #: pro/templates/email.php:38 msgid "Smart Manager has successfully completed" msgstr "" #: pro/templates/email.php:41 msgid "Below are the lists of updates done:" msgstr "" #: pro/templates/email.php:44 msgid "Field" msgstr "" #: pro/templates/email.php:45 msgid "Action" msgstr "" #: pro/templates/email.php:46 msgid "Value" msgstr "" #: pro/templates/email.php:47 msgid "Records Updated" msgstr "" #: pro/templates/email.php:64 msgid "If you like" msgstr "" #: pro/templates/email.php:64 msgid "Smart Manager" msgstr "" #: pro/templates/email.php:64 msgid "please leave us a" msgstr "" #: pro/templates/email.php:64 msgid "rating. A huge thank you from StoreApps in advance!" msgstr "" #: pro/templates/order-invoice.php:154 msgid "Billing Address" msgstr "" #: pro/templates/order-invoice.php:161 msgid "Shipping Address" msgstr "" #: pro/templates/order-invoice.php:168 msgid "Email id" msgstr "" #: pro/templates/order-invoice.php:169 msgid "Tel" msgstr "" #: pro/templates/order-invoice.php:172 msgid "Product" msgstr "" #: pro/templates/order-invoice.php:173 msgid "Quantity" msgstr "" #: pro/templates/order-invoice.php:205 msgid "Order Notes" msgstr "" #: pro/templates/order-invoice.php:211 msgid "Order Discount" msgstr "" #: pro/templates/order-invoice.php:218 msgid "Tax" msgstr "" #: pro/templates/order-invoice.php:219 msgid "Total" msgstr "" #: assets/js/admin.js:1 #: src/views/Rule.js:22 msgctxt "bulk edit action - date duration" msgid "days" msgstr "" #: assets/js/admin.js:1 #: src/views/Rule.js:22 msgctxt "bulk edit action - date duration" msgid "weeks" msgstr "" #: assets/js/admin.js:1 #: src/views/Rule.js:22 msgctxt "bulk edit action - date duration" msgid "months" msgstr "" #: assets/js/admin.js:1 #: src/views/Rule.js:22 msgctxt "bulk edit action - date duration" msgid "years" msgstr "" #: assets/js/admin.js:1 #: src/views/Rule.js:23 msgctxt "bulk edit action - time duration" msgid "hours" msgstr "" #: assets/js/admin.js:1 #: src/views/Rule.js:23 msgctxt "bulk edit action - time duration" msgid "minutes" msgstr "" #: assets/js/admin.js:1 #: src/views/Rule.js:67 #: src/views/Rule.js:581 msgctxt "placeholder" msgid "Enter value" msgstr "" #. translators: %s: dashboard display name #: assets/js/admin.js:1 #: pro/assets/js/smart-manager.js:1140 #: src/views/Rule.js:268 msgctxt "placeholder" msgid "Select %s" msgstr "" #: assets/js/admin.js:1 #: src/views/Rule.js:272 msgctxt "placeholder" msgid "Select Notes" msgstr "" #: assets/js/admin.js:1 #: src/views/Rule.js:312 msgctxt "placeholder" msgid "Search user roles" msgstr "" #: assets/js/admin.js:1 #: src/views/Rule.js:312 msgctxt "placeholder" msgid "Search user" msgstr "" #: assets/js/admin.js:1 #: src/views/Rule.js:346 msgctxt "placeholder" msgid "Select Dashboards" msgstr "" #. translators: %s: pricing page link #: assets/js/admin.js:1 #: assets/js/smart-manager.js:2676 #: assets/js/smart-manager.js:2896 #: assets/js/smart-manager.js:2946 #: assets/js/smart-manager.js:2956 #: assets/js/smart-manager.js:2964 #: assets/js/smart-manager.js:3444 #: src/views/Rule.js:428 #: src/views/RuleGroup.js:59 msgctxt "modal content" msgid "This feature is available only in the %s version" msgstr "" #: assets/js/admin.js:1 #: assets/js/smart-manager.js:345 #: assets/js/smart-manager.js:2378 #: assets/js/smart-manager.js:2676 #: assets/js/smart-manager.js:2896 #: assets/js/smart-manager.js:2946 #: assets/js/smart-manager.js:2956 #: assets/js/smart-manager.js:2964 #: assets/js/smart-manager.js:3444 #: src/views/Rule.js:428 #: src/views/RuleGroup.js:59 msgctxt "modal content" msgid "Pro" msgstr "" #: assets/js/admin.js:1 #: src/views/Rule.js:581 msgctxt "placeholder" msgid "Enter \"|\" separated values" msgstr "" #: assets/js/admin.js:1 #: pro/assets/js/smart-manager.js:1176 #: src/views/Rule.js:680 msgctxt "placeholder" msgid "Search for..." msgstr "" #: assets/js/admin.js:1 #: src/views/Rule.js:680 msgctxt "placeholder" msgid "Enter attribute name..." msgstr "" #: assets/js/admin.js:1 #: pro/assets/js/smart-manager.js:1177 #: src/views/Rule.js:681 msgctxt "placeholder" msgid "Replace with..." msgstr "" #: assets/js/admin.js:1 #: pro/assets/js/smart-manager-product.js:213 #: src/views/Rule.js:681 msgctxt "placeholder" msgid "Enter values..." msgstr "" #: assets/js/admin.js:1 #: src/views/RuleGroup.js:34 msgctxt "group title" msgid "Restrict by users" msgstr "" #: assets/js/admin.js:1 #: src/views/RuleGroup.js:34 msgctxt "group title" msgid "Restrict by user roles" msgstr "" #: assets/js/admin.js:1 #: src/views/RuleGroup.js:37 msgctxt "rule content" msgid "This group is a \"pass\" when" msgstr "" #: assets/js/admin.js:1 #: src/views/RuleGroup.js:38 msgctxt "rule option" msgid "all" msgstr "" #: assets/js/admin.js:1 #: src/views/RuleGroup.js:39 msgctxt "group content" msgid "of the following conditions is true." msgstr "" #: assets/js/admin.js:1 #: src/views/RuleGroup.js:52 msgctxt "button" msgid "Add a condition" msgstr "" #: assets/js/admin.js:1 #: src/views/RuleGroup.js:69 msgctxt "button" msgid "Add another group" msgstr "" #: assets/js/admin.js:1 #: src/views/RuleGroup.js:77 msgctxt "button" msgid "Remove this group" msgstr "" #: assets/js/admin.js:1 #: src/views/AdvancedSearchDialog.js:21 msgctxt "advanced search notice for custom views" msgid "Conditions cannot be edited when using Custom Views" msgstr "" #. translators: %1$d: Advanced search rule count %2$s: search conditions #: assets/js/admin.js:1 #: src/views/AdvancedSearchDialog.js:46 msgctxt "advanced search conditions" msgid "%1$d condition%2$s" msgstr "" #: assets/js/admin.js:1 #: src/views/AdvancedSearchDialog.js:46 msgctxt "advanced search conditions" msgid "s" msgstr "" #: assets/js/admin.js:1 #: src/views/AdvancedSearchDialog.js:64 msgctxt "side pannel - modal title" msgid "Advanced Search" msgstr "" #: assets/js/admin.js:1 #: src/views/AdvancedSearchDialog.js:110 msgctxt "advanced search button title" msgid "Search [ENTER]" msgstr "" #: assets/js/admin.js:1 #: src/views/AdvancedSearchDialog.js:112 msgctxt "advanced search button" msgid "Search" msgstr "" #: assets/js/admin.js:1 #: src/views/AdvancedSearchDialog.js:137 msgctxt "advanced search button" msgid "Clear" msgstr "" #: assets/js/admin.js:1 #: src/views/AdvancedSearchDialog.js:154 msgctxt "advanced search close button title" msgid "Close [ESC]" msgstr "" #: assets/js/admin.js:1 #: src/views/AdvancedSearchDialog.js:173 msgctxt "advanced search content" msgid "When" msgstr "" #: assets/js/admin.js:1 #: src/views/AdvancedSearchDialog.js:174 msgctxt "advanced search option" msgid "at least one" msgstr "" #: assets/js/admin.js:1 #: src/views/AdvancedSearchDialog.js:175 msgctxt "advanced search content" msgid "condition groups pass" msgstr "" #: assets/js/admin.js:1 #: pro/assets/js/smart-manager.js:887 #: src/views/BulkEditDialog.js:51 msgctxt "bulk edit option" msgid "All Items In Search Results" msgstr "" #: assets/js/admin.js:1 #: pro/assets/js/smart-manager.js:887 #: src/views/BulkEditDialog.js:51 msgctxt "bulk edit option" msgid "All Items In Store" msgstr "" #: assets/js/admin.js:1 #: src/views/BulkEditDialog.js:67 msgctxt "side pannel - modal title" msgid "Bulk Edit" msgstr "" #: assets/js/admin.js:1 #: src/views/BulkEditDialog.js:76 msgctxt "bulk edit button title" msgid "Update" msgstr "" #: assets/js/admin.js:1 #: src/views/BulkEditDialog.js:76 msgctxt "bulk edit button" msgid "Update" msgstr "" #: assets/js/admin.js:1 #: src/views/BulkEditDialog.js:107 msgctxt "bulk edit button" msgid "Schedule for later" msgstr "" #: assets/js/admin.js:1 #: src/views/BulkEditDialog.js:120 msgctxt "bulk edit button" msgid "Clear" msgstr "" #: assets/js/admin.js:1 #: src/views/BulkEditDialog.js:133 msgctxt "bulk edit close button title" msgid "Close [ESC]" msgstr "" #: assets/js/admin.js:1 #: pro/assets/js/smart-manager.js:890 #: src/views/BulkEditDialog.js:156 msgctxt "bulk edit option" msgid "Selected Items" msgstr "" #: assets/js/admin.js:1 #: src/views/ColumnManagerDialog.js:44 msgctxt "side panel - modal title" msgid "Column Manager - Show/Hide Columns" msgstr "" #: assets/js/admin.js:1 #: src/views/ColumnManagerDialog.js:60 msgctxt "column manager button title" msgid "Update [ENTER]" msgstr "" #: assets/js/admin.js:1 #: src/views/ColumnManagerDialog.js:62 msgctxt "column manager button" msgid "Update" msgstr "" #: assets/js/admin.js:1 #: src/views/ColumnManagerDialog.js:75 msgctxt "column manager close button title" msgid "Close [ESC]" msgstr "" #: assets/js/admin.js:1 #: src/views/SettingsDialog.js:125 msgctxt "delete button for image type settings" msgid "Remove image" msgstr "" #: assets/js/admin.js:1 #: src/views/SettingsDialog.js:157 msgctxt "side pannel - modal title" msgid "Settings" msgstr "" #: assets/js/admin.js:1 #: src/views/SettingsDialog.js:176 msgctxt "settings button title" msgid "Save [ENTER]" msgstr "" #: assets/js/admin.js:1 #: src/views/SettingsDialog.js:178 msgctxt "settings button" msgid "Save" msgstr "" #: assets/js/admin.js:1 #: src/views/SettingsDialog.js:191 msgctxt "settings close button title" msgid "Close [ESC]" msgstr "" #: assets/js/admin.js:1 msgctxt "banner heading" msgid "Limited Period Offer" msgstr "" #: assets/js/admin.js:1 msgctxt "banner content" msgid "Get 50% off on Smart Manager Pro" msgstr "" #: assets/js/admin.js:1 msgctxt "banner content" msgid "Get 25% off on Smart Manager Pro" msgstr "" #: assets/js/admin.js:1 msgctxt "banner content" msgid "Upgrade now and take your productivity to the next level!" msgstr "" #: assets/js/admin.js:1 msgctxt "User message conclusion for saved production hours" msgid "with Smart Manager! 🎉" msgstr "" #: assets/js/admin.js:1 msgctxt "Discount message introduction" msgid "Claim your " msgstr "" #: assets/js/admin.js:1 msgctxt "Discount message middle part" msgid "to save additional " msgstr "" #: assets/js/admin.js:1 msgctxt "Discount message conclusion" msgid "and unlock even more features!" msgstr "" #: assets/js/admin.js:1 msgctxt "pricing table badge" msgid "Popular" msgstr "" #: assets/js/admin.js:1 msgctxt "pricing license type" msgid "1 site (Annual)" msgstr "" #: assets/js/admin.js:1 msgctxt "pricing license price" msgid "$199" msgstr "" #: assets/js/admin.js:1 msgctxt "pricing license discounted price" msgid "$99" msgstr "" #: assets/js/admin.js:1 msgctxt "pricing license discounted price" msgid "$149" msgstr "" #: assets/js/admin.js:1 msgctxt "pricing table cta text" msgid "Buy Now →" msgstr "" #: assets/js/admin.js:1 msgctxt "pricing table badge" msgid "Best Seller" msgstr "" #: assets/js/admin.js:1 msgctxt "pricing license type" msgid "5 sites (Annual)" msgstr "" #: assets/js/admin.js:1 msgctxt "pricing license price" msgid "$249" msgstr "" #: assets/js/admin.js:1 msgctxt "pricing license discounted price" msgid "$125" msgstr "" #: assets/js/admin.js:1 msgctxt "pricing license discounted price" msgid "$187" msgstr "" #: assets/js/admin.js:1 msgctxt "pricing table badge" msgid "Trending" msgstr "" #: assets/js/admin.js:1 msgctxt "pricing license type" msgid "1 site (Lifetime)" msgstr "" #: assets/js/admin.js:1 msgctxt "pricing license price" msgid "$549" msgstr "" #: assets/js/admin.js:1 msgctxt "pricing license discounted price" msgid "$355" msgstr "" #: assets/js/admin.js:1 msgctxt "pricing license discounted price" msgid "$412" msgstr "" #: assets/js/admin.js:1 msgctxt "pricing license type" msgid "5 sites (Lifetime)" msgstr "" #: assets/js/admin.js:1 msgctxt "pricing license price" msgid "$599" msgstr "" #: assets/js/admin.js:1 msgctxt "pricing license discounted price" msgid "$389" msgstr "" #: assets/js/admin.js:1 msgctxt "pricing license discounted price" msgid "$449" msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial heading" msgid "I would happily pay five times for this product!" msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial content alt text" msgid "Premium Top Rated WooCommerce Plugin" msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial content" msgid "What really sold me on Smart Manager Pro was Bulk Edit. My assistant does not have to do any complex math now (earlier, I always feared she would make mistakes)! With Smart Manager, she has more free time at hand, so I asked her to set up auto responder emails. The response was phenomenal. Repeat sales were up by 19.5%." msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial customer name alt text" msgid "Jeff" msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial customer name" msgid "Jeff Smith" msgstr "" #: assets/js/admin.js:1 msgctxt "pro features heading" msgid "Smart Manager Pro: Packed with Tons of Powerful Features" msgstr "" #: assets/js/admin.js:1 msgctxt "pro features content" msgid "Upgrade now to enjoy advanced capabilities, enhanced features, improved performance, and premium support on demand." msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table heading" msgid "FEATURES" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table heading" msgid "LITE (FREE)" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table heading" msgid "PRO" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Supported Post Types" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "WordPress Posts, WooCommerce Products, Product Variations, Orders, Coupons" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Everything in Lite + WordPress Pages, Media, Users, SEO plugins, WooCommerce Subscriptions, Bookings, Memberships, Product Add-ons, Brands..." msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "all custom post types and their custom fields" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Inline (Direct) editing" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Upto three records without saving" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Unlimited" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Add or Delete Records" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Import products CSV" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Columns (Show / Hide / Sort)" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "WooCommerce Product Stock Log (Product History)" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Simple Search" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Advanced Search Using “AND†Filter" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Advanced Search Using “OR†Filter" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Bulk Edit / Batch Update" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Set to, Append, Prepend, Increase / Decrease by %, Increase / Decrease by number, Set datetime to, Set date to, Set time to, Upload images and many more..." msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Undo Inline & Bulk Edits" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Schedule Bulk Edits" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Export All / Selected / Filtered Records As CSV" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Only WooCommerce Products Stock Columns" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "All Columns" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Duplicate Single / Multiple Records" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Duplicate All Records In A Single Click" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Create Column Sets / Custom Views" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Print PDF Invoices" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Print Packing Slips For WooCommerce Orders In Bulk" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Manage WordPress User Roles" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "User-role / user based dashboard restrictions\t" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "View Customer Lifetime Value (LTV)" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Manage Custom Taxonomies" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Rename Column Headers" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Support" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "WordPress Forum" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Email, Phone, Video Calls" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Pricing" msgstr "" #: assets/js/admin.js:1 msgctxt "comparison table features data" msgid "Buy Smart Manager Pro →" msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial heading" msgid "\"This is a life-saver!\"" msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial content" msgid "The plugin has saved me HOURS (maybe even days) of work! It" msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial content" msgid "makes tedious tasks really simple and quick" msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial content" msgid "The support team is fantastic too. Totally worth purchasing the premium version." msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial customer name alt text" msgid "The BBCream Girl" msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial customer name" msgid "The BBCream Girl" msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial heading" msgid "\"A whole afternoon’s work in seconds\"" msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial content" msgid "We recommend Smart Manager Pro to everyone who is looking for an" msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial content" msgid "extremely multi-functional store manager" msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial content" msgid "The plugin is absolutely worth it. Never again without Smart Manager." msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial customer name alt text" msgid "Acrom" msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial customer name" msgid "Acrom" msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial heading" msgid "\"20 or 30 times quicker store management\"" msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial content" msgid "I've got over 200 products and dreaded managing them one by one. Smart Manager Pro plugin lets me do this so much quicker, probably 20 or 30 times quicker. It is an absolutely invaluable tool." msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial customer name alt text" msgid "Brian Batcher" msgstr "" #: assets/js/admin.js:1 msgctxt "testimonial customer name" msgid "Brian Batcher" msgstr "" #: assets/js/admin.js:1 msgctxt "section content" msgid "Get your precious time back" msgstr "" #: assets/js/admin.js:1 msgctxt "section heading" msgid "60 hours of work = 6 minutes with Smart Manager Pro" msgstr "" #: assets/js/admin.js:1 msgctxt "section content" msgid "Stop opening each product to edit price, stock, category, description, and other data." msgstr "" #: assets/js/admin.js:1 msgctxt "section content" msgid "Switch to Smart Manager Pro and spend your time wisely." msgstr "" #: assets/js/admin.js:1 msgctxt "section content" msgid "Say goodbye to frustration, stress, and calculation errors that keep piling up." msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using traditional way section heading" msgid "Mundane store tasks without using Smart Manager" msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using traditional way section content" msgid "Add one new product or edit details → 3 mins" msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using traditional way section content" msgid "Open and edit 1000s of products one-by-one → 3 hours – 30 hours" msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using traditional way section content" msgid "Search any record to make edits → 3 mins" msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using traditional way section content" msgid "Create 1000s of duplicates → 3 hours – 30 hours" msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using traditional way section content" msgid "Search and delete products → 3 mins" msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using traditional way section content" msgid "Total ≈ 6 hours – 60 hours" msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using smart manager section heading" msgid "Using Smart Manager" msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using smart manager section content" msgid "30 seconds (Inline edit)" msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using smart manager section content" msgid "2 mins (Bulk edit)" msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using smart manager section content" msgid "1 min (Search & Edit)" msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using smart manager section content" msgid "2 mins (Duplicate)" msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using smart manager section content" msgid "1 min (Search & Delete)" msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using smart manager section content" msgid "≈ 6 minutes" msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using smart manager section content" msgid "And it's not just products –" msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using smart manager section content" msgid "save time in editing orders, coupons, blog posts, users, WordPress post types, WordPress taxonomies and more." msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using smart manager section content" msgid "Experience a 10x productivity boost and massive time-savings with Smart Manager Pro!" msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using smart manager section content" msgid "Reclaim precious time." msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using smart manager section content" msgid "to nurture your business and cherish moments with loved ones. If you're ready for a life with" msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using smart manager section content" msgid "more freedom and fulfillment" msgstr "" #: assets/js/admin.js:1 msgctxt "time spent using smart manager section content" msgid ", Smart Manager is your solution." msgstr "" #: assets/js/admin.js:1 msgctxt "pricing page cta" msgid "Select a Plan Now →" msgstr "" #: assets/js/admin.js:1 msgctxt "footer heading" msgid "Still hesitant? Buy with confidence – you’re in good hands" msgstr "" #: assets/js/admin.js:1 msgctxt "footer content" msgid "You’re buying from the best!" msgstr "" #: assets/js/admin.js:1 msgctxt "footer content" msgid "Rest assured that you will be well taken care of when you buy from StoreApps." msgstr "" #: assets/js/admin.js:1 msgctxt "footer content - storeapps benefits list" msgid "Top selling plugins for marketing and store management" msgstr "" #: assets/js/admin.js:1 msgctxt "footer content - storeapps benefits list" msgid "Official WooCommerce" msgstr "" #: assets/js/admin.js:1 msgctxt "footer content - storeapps benefits list" msgid "and GoDaddy partner" msgstr "" #: assets/js/admin.js:1 msgctxt "footer content - storeapps benefits list" msgid "Founded in 2011, one of the early Woo third party developers" msgstr "" #: assets/js/admin.js:1 msgctxt "footer content - storeapps benefits list" msgid "40k+ customers" msgstr "" #: assets/js/admin.js:1 msgctxt "footer content - storeapps benefits list" msgid "300k+ users, millions of downloads" msgstr "" #: assets/js/admin.js:1 msgctxt "footer content - storeapps benefits list" msgid "Consistent 5 star review ratings" msgstr "" #: assets/js/admin.js:1 msgctxt "footer content - storeapps benefits list" msgid "WordPress" msgstr "" #: assets/js/admin.js:1 msgctxt "footer content - storeapps benefits list" msgid "community contributor" msgstr "" #: assets/js/admin.js:1 msgctxt "footer content - storeapps benefits list" msgid "sponsor, speaker." msgstr "" #: assets/js/admin.js:1 msgctxt "footer content - trust badge alt text" msgid "Guaranteed Safe Checkout" msgstr "" #: assets/js/admin.js:1 msgctxt "footer content - trust badge alt text" msgid "Friendly support from top quality developers" msgstr "" #: assets/js/admin.js:1 msgctxt "footer content" msgid "Our plugins are easy to use. We also have ample documentation. But whenever you need further assistance, you will get support from the same people who develop these plugins! We make sure you succeed!" msgstr "" #: assets/js/admin.js:1 msgctxt "footer content - storeapps team image alt text" msgid "StoreApps team is on your side" msgstr "" #: assets/js/admin.js:1 #: assets/js/smart-manager-product.js:256 #: assets/js/smart-manager.js:2014 #: assets/js/smart-manager.js:2054 #: assets/js/smart-manager.js:2149 #: pro/assets/js/smart-manager.js:1377 #: pro/assets/js/smart-manager.js:1550 #: src/views/Modal.js:17 msgctxt "button" msgid "Ok" msgstr "" #: assets/js/admin.js:1 #: assets/js/smart-manager.js:2728 #: pro/assets/js/smart-manager.js:1402 #: pro/assets/js/smart-manager.js:1571 #: src/views/Modal.js:19 msgctxt "button" msgid "Cancel" msgstr "" #: assets/js/admin.js:1 #: src/views/Modal.js:103 msgctxt "modal close button title" msgid "Close [ESC]" msgstr "" #: assets/js/admin.js:1 #: src/views/PrivilegeSettingsDialog.js:71 msgctxt "access privilege settings side pannel - modal title" msgid "Privilege Settings" msgstr "" #: assets/js/admin.js:1 #: src/views/PrivilegeSettingsDialog.js:131 msgctxt "access privilege settings description" msgid "Manage dashboards access for user roles and users" msgstr "" #: assets/js/admin.js:1 #: src/views/PrivilegeSettingsDialog.js:134 msgctxt "access privilege settings description" msgid "Note: The privilege setting for a user email will always take precedence over a user role" msgstr "" #: assets/js/smart-manager-product.js:124 msgctxt "WooCommerce product attributes list" msgid "Custom product attribute" msgstr "" #: assets/js/smart-manager-product.js:182 #: assets/js/smart-manager-product.js:289 msgctxt "visibility option for WooCommerce product attributes" msgid "Visible on the product page" msgstr "" #: assets/js/smart-manager-product.js:183 #: assets/js/smart-manager-product.js:290 msgctxt "use for variations option for WooCommerce product attributes" msgid "Used for variations" msgstr "" #: assets/js/smart-manager-product.js:184 #: assets/js/smart-manager-product.js:291 msgctxt "position checkbox for WooCommerce product attributes" msgid "Position:" msgstr "" #: assets/js/smart-manager-product.js:190 #: assets/js/smart-manager-product.js:206 #: assets/js/smart-manager-product.js:297 #: assets/js/smart-manager-product.js:313 msgctxt "placeholder" msgid "Pipe (|) separate terms" msgstr "" #: assets/js/smart-manager-product.js:192 #: assets/js/smart-manager-product.js:299 msgctxt "placeholder" msgid "Select terms" msgstr "" #: assets/js/smart-manager-product.js:200 #: assets/js/smart-manager-product.js:307 msgctxt "button for selecting WooCommerce product attribute" msgid "Select all" msgstr "" #: assets/js/smart-manager-product.js:201 #: assets/js/smart-manager-product.js:308 msgctxt "button for selecting WooCommerce product attribute" msgid "Select none" msgstr "" #: assets/js/smart-manager-product.js:205 #: assets/js/smart-manager-product.js:312 msgctxt "placeholder" msgid "Name" msgstr "" #: assets/js/smart-manager-product.js:226 msgctxt "add attribute button for WooCommerce products" msgid "Add" msgstr "" #: assets/js/smart-manager-product.js:251 msgctxt "modal title" msgid "Attribute" msgstr "" #: assets/js/smart-manager-product.js:430 msgctxt "tooltip" msgid "Import CSV" msgstr "" #: assets/js/smart-manager-product.js:434 msgctxt "button" msgid "Import CSV" msgstr "" #: assets/js/smart-manager-product.js:456 msgctxt "checkbox for displaying WooCommerce product variations" msgid "Show Variations" msgstr "" #: assets/js/smart-manager-product.js:485 msgctxt "export button" msgid "Selected Records - Stock Columns" msgstr "" #: assets/js/smart-manager-product.js:486 msgctxt "export button" msgid "Selected Records - Visible Columns" msgstr "" #: assets/js/smart-manager-product.js:487 #: assets/js/smart-manager-product.js:494 msgctxt "export button" msgid "Entire Store - Stock Columns" msgstr "" #: assets/js/smart-manager-product.js:488 #: assets/js/smart-manager-product.js:497 msgctxt "export button" msgid "Entire Store - Visible Columns" msgstr "" #: assets/js/smart-manager-product.js:494 msgctxt "export button" msgid "All Items In Search Results - Stock Columns" msgstr "" #: assets/js/smart-manager-product.js:497 msgctxt "export button" msgid "All Items In Search Results - Visible Columns" msgstr "" #: assets/js/smart-manager.js:113 msgctxt "select options - operator for 'dropdown' data type fields" msgid "is" msgstr "" #: assets/js/smart-manager.js:114 msgctxt "select options - operator for 'dropdown' data type fields" msgid "is not" msgstr "" #: assets/js/smart-manager.js:115 msgctxt "select options - operator for 'text' data type fields" msgid "is" msgstr "" #: assets/js/smart-manager.js:116 msgctxt "select options - operator for 'text' data type fields" msgid "contains" msgstr "" #: assets/js/smart-manager.js:117 msgctxt "select options - operator for 'text' data type fields" msgid "is not" msgstr "" #: assets/js/smart-manager.js:118 msgctxt "select options - operator for 'text' data type fields" msgid "not contains" msgstr "" #: assets/js/smart-manager.js:124 msgctxt "select options - operator for 'text' data type fields" msgid "starts with" msgstr "" #: assets/js/smart-manager.js:125 msgctxt "select options - operator for 'text' data type fields" msgid "ends with" msgstr "" #: assets/js/smart-manager.js:126 msgctxt "select options - operator for 'text' data type fields" msgid "any of" msgstr "" #: assets/js/smart-manager.js:127 msgctxt "select options - operator for 'text' data type fields" msgid "not starts with" msgstr "" #: assets/js/smart-manager.js:128 msgctxt "select options - operator for 'text' data type fields" msgid "not ends with" msgstr "" #: assets/js/smart-manager.js:129 msgctxt "select options - operator for 'text' data type fields" msgid "not any of" msgstr "" #. translators: %s: dashboard display name #: assets/js/smart-manager.js:226 msgctxt "bottom bar button" msgid "Load More %s" msgstr "" #. translators: %1$s: dashboard display name %2$s: success message %3$s: pricing page link #: assets/js/smart-manager.js:345 #: assets/js/smart-manager.js:2378 msgctxt "modal content" msgid "For managing %1$s, %2$s %3$s version" msgstr "" #: assets/js/smart-manager.js:401 msgctxt "search type" msgid "Advanced" msgstr "" #: assets/js/smart-manager.js:401 msgctxt "search type" msgid "Simple" msgstr "" #: assets/js/smart-manager.js:403 msgctxt "placeholder" msgid "Type to search..." msgstr "" #: assets/js/smart-manager.js:404 msgctxt "tooltip" msgid "Click to add/edit condition" msgstr "" #. translators: %1$d: Advanced search rule count %2$s: search conditions #: assets/js/smart-manager.js:407 #: assets/js/smart-manager.js:744 msgctxt "search conditions" msgid "%1$d condition%2$s" msgstr "" #: assets/js/smart-manager.js:407 #: assets/js/smart-manager.js:744 msgctxt "search conditions" msgid "s" msgstr "" #: assets/js/smart-manager.js:425 msgctxt "dashboard option groups" msgid "Common post types" msgstr "" #: assets/js/smart-manager.js:434 msgctxt "dashboard option groups" msgid "Common taxonomies" msgstr "" #: assets/js/smart-manager.js:443 msgctxt "dashboard option groups" msgid "Recently used views" msgstr "" #: assets/js/smart-manager.js:452 msgctxt "dashboard option groups" msgid "Other post types" msgstr "" #: assets/js/smart-manager.js:461 msgctxt "dashboard option groups" msgid "Other taxonomies" msgstr "" #: assets/js/smart-manager.js:476 msgctxt "dashboard option groups" msgid "Other saved views" msgstr "" #: assets/js/smart-manager.js:490 msgctxt "dashboard option groups" msgid "All post types" msgstr "" #: assets/js/smart-manager.js:499 msgctxt "dashboard option groups" msgid "All taxonomies" msgstr "" #. translators: %s: search type #: assets/js/smart-manager.js:516 msgctxt "tooltip" msgid "Switch to %s" msgstr "" #. translators: %s: search type #: assets/js/smart-manager.js:518 msgctxt "search type" msgid "%s Search" msgstr "" #: assets/js/smart-manager.js:539 msgctxt "tooltip" msgid "Docs" msgstr "" #: assets/js/smart-manager.js:551 msgctxt "tooltip" msgid "General settings" msgstr "" #: assets/js/smart-manager.js:551 msgctxt "settings button" msgid "General settings" msgstr "" #: assets/js/smart-manager.js:552 msgctxt "tooltip" msgid "Access Privilege settings" msgstr "" #: assets/js/smart-manager.js:552 msgctxt "access privilege settings button" msgid "Access Privilege Settings" msgstr "" #: assets/js/smart-manager.js:560 msgctxt "tooltip" msgid "Bulk Edit" msgstr "" #: assets/js/smart-manager.js:564 msgctxt "button" msgid "Bulk Edit" msgstr "" #: assets/js/smart-manager.js:568 msgctxt "tooltip" msgid "Save" msgstr "" #: assets/js/smart-manager.js:572 msgctxt "button" msgid "Save" msgstr "" #: assets/js/smart-manager.js:574 msgctxt "tooltip" msgid "Add Row" msgstr "" #: assets/js/smart-manager.js:578 msgctxt "button" msgid "Add Row" msgstr "" #: assets/js/smart-manager.js:584 msgctxt "tooltip" msgid "Duplicate" msgstr "" #: assets/js/smart-manager.js:584 msgctxt "button" msgid "Duplicate" msgstr "" #: assets/js/smart-manager.js:586 msgctxt "duplicate button" msgid "Selected Records" msgstr "" #: assets/js/smart-manager.js:587 #: assets/js/smart-manager.js:1138 msgctxt "duplicate button" msgid "Entire Store" msgstr "" #: assets/js/smart-manager.js:594 #: pro/assets/js/smart-manager.js:1325 msgctxt "tooltip" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:594 #: pro/assets/js/smart-manager.js:1325 msgctxt "button" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:596 msgctxt "delete button" msgid "Move to Trash" msgstr "" #: assets/js/smart-manager.js:597 msgctxt "delete button" msgid "Delete Permanently" msgstr "" #: assets/js/smart-manager.js:606 msgctxt "tooltip" msgid "Custom Views" msgstr "" #: assets/js/smart-manager.js:606 msgctxt "button" msgid "Custom Views" msgstr "" #: assets/js/smart-manager.js:608 msgctxt "custom view button" msgid "Create" msgstr "" #: assets/js/smart-manager.js:609 msgctxt "custom view button" msgid "Update" msgstr "" #: assets/js/smart-manager.js:610 msgctxt "custom view button" msgid "Delete" msgstr "" #: assets/js/smart-manager.js:617 msgctxt "button" msgid "Export CSV" msgstr "" #: assets/js/smart-manager.js:623 msgctxt "tooltip" msgid "Print Invoice" msgstr "" #: assets/js/smart-manager.js:627 msgctxt "button" msgid "Print Invoice" msgstr "" #: assets/js/smart-manager.js:631 msgctxt "tooltip" msgid "Show / Hide Columns" msgstr "" #: assets/js/smart-manager.js:635 msgctxt "button" msgid "Columns" msgstr "" #: assets/js/smart-manager.js:637 msgctxt "checkbox for displaying current dashboard tasks" msgid "Show Tasks" msgstr "" #: assets/js/smart-manager.js:645 msgctxt "tooltip" msgid "Load more records" msgstr "" #: assets/js/smart-manager.js:1135 msgctxt "export button" msgid "All Items In Search Results" msgstr "" #: assets/js/smart-manager.js:1135 #: assets/js/smart-manager.js:3631 msgctxt "export button" msgid "Entire Store" msgstr "" #: assets/js/smart-manager.js:1138 msgctxt "duplicate button" msgid "All Items In Search Results" msgstr "" #. translators: %s: dashboard display name #: assets/js/smart-manager.js:1203 #: assets/js/smart-manager.js:1234 msgctxt "bottom bar status" msgid "No %s Found" msgstr "" #. translators: %1$d: number of display records %2$s: dashboard display name #: assets/js/smart-manager.js:1212 msgctxt "bottom bar status" msgid "%1$d %2$s loaded" msgstr "" #. translators: %1$d: number of total records %2$d: number of display records %3$s: dashboard display name #: assets/js/smart-manager.js:1232 msgctxt "bottom bar status" msgid "%1$d of %2$d %3$s loaded" msgstr "" #: assets/js/smart-manager.js:1323 msgctxt "button" msgid "OK" msgstr "" #: assets/js/smart-manager.js:1524 msgctxt "tooltip" msgid "Remove gallery image" msgstr "" #: assets/js/smart-manager.js:1972 #: assets/js/smart-manager.js:2535 #: assets/js/smart-manager.js:4301 msgctxt "process name" msgid "Inline Edit" msgstr "" #: assets/js/smart-manager.js:2439 msgctxt "search switch notice for custom views" msgid "Cannot switch search when using Custom Views" msgstr "" #: assets/js/smart-manager.js:2481 msgctxt "simple search notice for custom views" msgid "Search string cannot be edited when using Custom Views" msgstr "" #: assets/js/smart-manager.js:2498 msgctxt "notification" msgid "Please edit a record" msgstr "" #: assets/js/smart-manager.js:2506 msgctxt "notification" msgid "Please enter user email" msgstr "" #: assets/js/smart-manager.js:2506 msgctxt "notification" msgid "Enable" msgstr "" #: assets/js/smart-manager.js:2506 msgctxt "notification" msgid "User Email" msgstr "" #: assets/js/smart-manager.js:2506 msgctxt "notification" msgid "column if not enabled using" msgstr "" #: assets/js/smart-manager.js:2506 msgctxt "notification" msgid "column show/hide functionality" msgstr "" #: assets/js/smart-manager.js:2557 msgctxt "notification" msgid "To permanently delete records" msgstr "" #: assets/js/smart-manager.js:2557 #: assets/js/smart-manager.js:2575 msgctxt "notification" msgid "upgrade to Pro" msgstr "" #: assets/js/smart-manager.js:2569 #: assets/js/smart-manager.js:2797 msgctxt "notification" msgid "Please select a record" msgstr "" #: assets/js/smart-manager.js:2575 msgctxt "notification" msgid "To delete more than" msgstr "" #: assets/js/smart-manager.js:2575 msgctxt "notification" msgid "records at a time" msgstr "" #: assets/js/smart-manager.js:2581 #: assets/js/smart-manager.js:2765 #: assets/js/smart-manager.js:2795 #: assets/js/smart-manager.js:4439 #: pro/assets/js/smart-manager.js:1479 msgctxt "modal title" msgid "Attention!" msgstr "" #: assets/js/smart-manager.js:2585 msgctxt "modal content" msgid "permanently delete" msgstr "" #: assets/js/smart-manager.js:2585 msgctxt "modal content" msgid "trash" msgstr "" #. translators: %s: action name #: assets/js/smart-manager.js:2593 msgctxt "modal content" msgid "Are you sure you want to %s" msgstr "" #: assets/js/smart-manager.js:2593 msgctxt "modal content" msgid "the selected" msgstr "" #: assets/js/smart-manager.js:2593 msgctxt "modal content" msgid "records" msgstr "" #: assets/js/smart-manager.js:2593 msgctxt "modal content" msgid "record" msgstr "" #. translators: %1$s: action name %2$s: dashboard display name #: assets/js/smart-manager.js:2596 msgctxt "modal content" msgid "Are you sure you want to %1$s the %2$s?" msgstr "" #: assets/js/smart-manager.js:2596 msgctxt "modal content" msgid "all" msgstr "" #. translators: %s: action name #: assets/js/smart-manager.js:2601 msgctxt "modal content" msgid "Are you sure you want to %s?" msgstr "" #: assets/js/smart-manager.js:2601 msgctxt "modal content" msgid "all items in search results" msgstr "" #: assets/js/smart-manager.js:2622 msgctxt "modal content" msgid "Note: Looking to" msgstr "" #: assets/js/smart-manager.js:2622 msgctxt "modal content" msgid "delete all" msgstr "" #: assets/js/smart-manager.js:2622 msgctxt "modal content" msgid "the records?" msgstr "" #: assets/js/smart-manager.js:2622 msgctxt "modal content" msgid "Upgrade to Pro" msgstr "" #: assets/js/smart-manager.js:2702 msgctxt "notification" msgid "For editing more records upgrade to Pro" msgstr "" #. translators: %s: dashboard display name #: assets/js/smart-manager.js:2713 msgctxt "modal title" msgid "Add %s(s)" msgstr "" #. translators: %s: dashboard display name #: assets/js/smart-manager.js:2716 msgctxt "modal content" msgid "Enter how many new %s(s) to create!" msgstr "" #: assets/js/smart-manager.js:2719 msgctxt "button" msgid "Create" msgstr "" #. translators: %s: pricing page link #: assets/js/smart-manager.js:2753 #: assets/js/smart-manager.js:2778 msgctxt "notification" msgid "Custom Views avialable (Only in %s)" msgstr "" #: assets/js/smart-manager.js:2753 #: assets/js/smart-manager.js:2778 #: assets/js/smart-manager.js:2890 msgctxt "notification" msgid "Pro" msgstr "" #: assets/js/smart-manager.js:2766 msgctxt "modal content" msgid "This will" msgstr "" #: assets/js/smart-manager.js:2766 #: pro/assets/js/smart-manager.js:1486 msgctxt "modal content" msgid "delete" msgstr "" #: assets/js/smart-manager.js:2766 msgctxt "modal content" msgid "the current view. Are you sure you want to continue?" msgstr "" #: assets/js/smart-manager.js:2819 msgctxt "notification" msgid "Comming soon" msgstr "" #: assets/js/smart-manager.js:2824 msgctxt "modal content" msgid "This will duplicate only the records in posts, postmeta and related taxonomies." msgstr "" #: assets/js/smart-manager.js:2825 msgctxt "modal content" msgid "Are you sure you want to duplicate the " msgstr "" #. translators: %s: Bulk Edit doc link #: assets/js/smart-manager.js:2858 msgctxt "modal description" msgid "You can change/update multiple fields of the entire store OR for selected items using the Bulk Edit feature. Refer to this doc on %s or watch the video below." msgstr "" #: assets/js/smart-manager.js:2858 msgctxt "modal description" msgid "how to do bulk edit" msgstr "" #: assets/js/smart-manager.js:2859 msgctxt "modal title" msgid "Biggest Time Saver" msgstr "" #. translators: %s: pricing page link #: assets/js/smart-manager.js:2861 msgctxt "modal title" msgid "(Only in %s)" msgstr "" #: assets/js/smart-manager.js:2861 msgctxt "modal title" msgid "Pro" msgstr "" #: assets/js/smart-manager.js:2863 msgctxt "modal title" msgid "Export CSV of " msgstr "" #: assets/js/smart-manager.js:2864 msgctxt "modal description" msgid "You can export selected/all records OR filtered records (using Simple Search or Advanced Search) by simply clicking on the Export CSV button at the bottom right of the grid." msgstr "" #: assets/js/smart-manager.js:2878 msgctxt "button" msgid "Upgrade Now" msgstr "" #. translators: %s: pricing page link #: assets/js/smart-manager.js:2890 msgctxt "notification" msgid "Duplicate Records (Only in %s)" msgstr "" #: assets/js/smart-manager.js:3061 msgctxt "columns settings description" msgid "Drag the enabled columns to the right to disable them and vise-versa. Drag the columns top or bottom to rearrange their position in the grid." msgstr "" #. translators: %s: reset columns link #: assets/js/smart-manager.js:3065 msgctxt "columns settings description" msgid "Click %s to reset the Columns order to default." msgstr "" #: assets/js/smart-manager.js:3065 msgctxt "columns settings description" msgid "here" msgstr "" #: assets/js/smart-manager.js:3069 msgctxt "columns settings searchbox heading" msgid "Enabled" msgstr "" #: assets/js/smart-manager.js:3070 msgctxt "placeholder" msgid "Search For Enabled Columns..." msgstr "" #: assets/js/smart-manager.js:3076 msgctxt "columns settings searchbox heading" msgid "Disabled" msgstr "" #: assets/js/smart-manager.js:3077 msgctxt "placeholder" msgid "Search For Disabled Columns..." msgstr "" #: assets/js/smart-manager.js:3404 msgctxt "notification" msgid "You have entered incorrect data in the highlighted cells." msgstr "" #: assets/js/smart-manager.js:3441 msgctxt "modal title" msgid "Note" msgstr "" #: assets/js/smart-manager.js:3454 msgctxt "progressbar modal title" msgid "Please Wait" msgstr "" #: assets/js/smart-manager.js:3455 msgctxt "progressbar modal content" msgid "Initializing..." msgstr "" #: assets/js/smart-manager.js:3455 msgctxt "progressbar modal content" msgid "Continue in background" msgstr "" #: assets/js/smart-manager.js:3467 msgctxt "modal title" msgid "Warning" msgstr "" #: assets/js/smart-manager.js:3468 msgctxt "modal content" msgid "Are you sure?" msgstr "" #: assets/js/smart-manager.js:3471 #: assets/js/smart-manager.js:4444 msgctxt "button" msgid "Yes" msgstr "" #: assets/js/smart-manager.js:3484 #: assets/js/smart-manager.js:4461 msgctxt "button" msgid "No" msgstr "" #: assets/js/smart-manager.js:3619 msgctxt "notification" msgid "Settings saved successfully!" msgstr "" #: assets/js/smart-manager.js:3631 msgctxt "export button" msgid "Selected Records" msgstr "" #: assets/js/smart-manager.js:4227 msgctxt "bottom bar display name for tasks" msgid "Tasks" msgstr "" #: assets/js/smart-manager.js:4236 msgctxt "gallery modal title" msgid "Gallery Images" msgstr "" #: assets/js/smart-manager.js:4240 msgctxt "button" msgid "Add" msgstr "" #: assets/js/smart-manager.js:4246 msgctxt "button" msgid "Add images to product gallery" msgstr "" #: assets/js/smart-manager.js:4247 msgctxt "button" msgid "Add to gallery" msgstr "" #: assets/js/smart-manager.js:4347 msgctxt "tooltip" msgid "(Click to sort)" msgstr "" #: assets/js/smart-manager.js:4371 msgctxt "modal content" msgid "Are you sure you want to export the " msgstr "" #: assets/js/smart-manager.js:4441 msgctxt "modal content" msgid "You have unsaved changes. Are you sure you want to continue?" msgstr "" #: pro/assets/js/smart-manager-product.js:33 msgctxt "Bulk Edit option for WooCommerce product attribute" msgid "copy from" msgstr "" #: pro/assets/js/smart-manager-product.js:110 msgctxt "bulk edit option for WooCommerce product price" msgid "set to sale price" msgstr "" #: pro/assets/js/smart-manager-product.js:114 msgctxt "bulk edit option for WooCommerce product price" msgid "set to regular price" msgstr "" #: pro/assets/js/smart-manager-product.js:130 msgctxt "bulk edit default action for WooCommerce product attribute" msgid "Select Attribute" msgstr "" #: pro/assets/js/smart-manager-product.js:139 msgctxt "bulk edit default action for WooCommerce product category" msgid "Select Action" msgstr "" #: pro/assets/js/smart-manager-product.js:140 msgctxt "bulk edit option for WooCommerce product category" msgid "set to" msgstr "" #: pro/assets/js/smart-manager-product.js:141 msgctxt "bulk edit option for WooCommerce product category" msgid "add to" msgstr "" #: pro/assets/js/smart-manager-product.js:142 msgctxt "bulk edit option for WooCommerce product category" msgid "remove from" msgstr "" #: pro/assets/js/smart-manager-product.js:203 msgctxt "radio - bulk edit" msgid "All" msgstr "" #: pro/assets/js/smart-manager-product.js:212 msgctxt "placeholder" msgid "Enter Attribute name..." msgstr "" #: pro/assets/js/smart-manager-product.js:213 msgctxt "tooltip" msgid "For more than one values, use pipe (|) as delimiter" msgstr "" #: pro/assets/js/smart-manager-shop-order.js:8 msgctxt "Bulk Edit option for WooCommerce shop order - order notes" msgid "add to" msgstr "" #: pro/assets/js/smart-manager-shop-order.js:8 msgctxt "Bulk Edit option for WooCommerce shop order - order notes" msgid "remove from" msgstr "" #: pro/assets/js/smart-manager.js:24 #: pro/assets/js/smart-manager.js:909 msgctxt "bulk edit default action" msgid "Select Action" msgstr "" #: pro/assets/js/smart-manager.js:25 #: pro/assets/js/smart-manager.js:47 msgctxt "bulk edit action" msgid "copy from" msgstr "" #: pro/assets/js/smart-manager.js:28 msgctxt "bulk edit action - 'date' fields" msgid "increase by" msgstr "" #: pro/assets/js/smart-manager.js:28 msgctxt "bulk edit action - 'date' fields" msgid "decrease by" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "bulk edit action - 'number' fields" msgid "increase by %" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "bulk edit action - 'number' fields" msgid "decrease by %" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "bulk edit action - 'number' fields" msgid "increase by number" msgstr "" #: pro/assets/js/smart-manager.js:31 msgctxt "bulk edit action - 'number' fields" msgid "decrease by number" msgstr "" #: pro/assets/js/smart-manager.js:34 msgctxt "bulk edit action - 'datetime' fields" msgid "set datetime to" msgstr "" #: pro/assets/js/smart-manager.js:34 msgctxt "bulk edit action - 'datetime' fields" msgid "set date to" msgstr "" #: pro/assets/js/smart-manager.js:34 msgctxt "bulk edit action - 'datetime' fields" msgid "set time to" msgstr "" #: pro/assets/js/smart-manager.js:35 msgctxt "bulk edit action - 'date' fields" msgid "set date to" msgstr "" #: pro/assets/js/smart-manager.js:36 msgctxt "bulk edit action - 'time' fields" msgid "set time to" msgstr "" #: pro/assets/js/smart-manager.js:38 msgctxt "bulk edit action - 'multiselect list' fields" msgid "add to" msgstr "" #: pro/assets/js/smart-manager.js:38 msgctxt "bulk edit action - 'multiselect list' fields" msgid "remove from" msgstr "" #: pro/assets/js/smart-manager.js:40 msgctxt "bulk edit action - 'text' fields" msgid "prepend" msgstr "" #: pro/assets/js/smart-manager.js:40 msgctxt "bulk edit action - 'text' fields" msgid "append" msgstr "" #: pro/assets/js/smart-manager.js:40 msgctxt "bulk edit action - 'text' fields" msgid "search & replace" msgstr "" #: pro/assets/js/smart-manager.js:46 #: pro/assets/js/smart-manager.js:910 #: pro/assets/js/smart-manager.js:1046 msgctxt "bulk edit action" msgid "set to" msgstr "" #: pro/assets/js/smart-manager.js:47 msgctxt "bulk edit action" msgid "copy from field" msgstr "" #: pro/assets/js/smart-manager.js:494 msgctxt "progressbar modal title" msgid "Duplicate Records" msgstr "" #. translators: %s: success notification message #: pro/assets/js/smart-manager.js:574 msgctxt "notification" msgid "View %sd successfully!" msgstr "" #: pro/assets/js/smart-manager.js:601 msgctxt "modal title" msgid "Custom Views" msgstr "" #: pro/assets/js/smart-manager.js:604 msgctxt "modal content" msgid "Create a custom view to save selected columns from a dashboard. Use it for saved searches, giving specific columns access to other users, etc." msgstr "" #: pro/assets/js/smart-manager.js:605 msgctxt "placeholder" msgid "Give a name to this view" msgstr "" #: pro/assets/js/smart-manager.js:610 msgctxt "checkbox for custom view access" msgid "Public" msgstr "" #: pro/assets/js/smart-manager.js:612 msgctxt "description" msgid "Marking this view public will make it available to all users with access to Smart Manager." msgstr "" #: pro/assets/js/smart-manager.js:671 msgctxt "notification" msgid "View already exists. Please try another name" msgstr "" #: pro/assets/js/smart-manager.js:703 msgctxt "notification" msgid "View deleted successfully!" msgstr "" #: pro/assets/js/smart-manager.js:733 msgctxt "progressbar modal title" msgid "Bulk Edit" msgstr "" #: pro/assets/js/smart-manager.js:872 #: pro/assets/js/smart-manager.js:876 #: pro/assets/js/smart-manager.js:962 #: pro/assets/js/smart-manager.js:1073 #: pro/assets/js/smart-manager.js:1094 #: pro/assets/js/smart-manager.js:1113 msgctxt "placeholder" msgid "Enter a value..." msgstr "" #: pro/assets/js/smart-manager.js:893 msgctxt "bulk edit field" msgid "Select Field" msgstr "" #: pro/assets/js/smart-manager.js:982 msgctxt "button" msgid "Update" msgstr "" #: pro/assets/js/smart-manager.js:987 msgctxt "button" msgid "Reset" msgstr "" #: pro/assets/js/smart-manager.js:992 msgctxt "modal title" msgid "Bulk Edit" msgstr "" #: pro/assets/js/smart-manager.js:1315 msgctxt "tooltip" msgid "Undo" msgstr "" #: pro/assets/js/smart-manager.js:1315 msgctxt "button" msgid "Undo" msgstr "" #: pro/assets/js/smart-manager.js:1317 msgctxt "undo button" msgid "Selected Tasks" msgstr "" #: pro/assets/js/smart-manager.js:1318 msgctxt "undo button" msgid "All Tasks" msgstr "" #: pro/assets/js/smart-manager.js:1327 msgctxt "delete tasks button" msgid "Selected Tasks" msgstr "" #: pro/assets/js/smart-manager.js:1328 msgctxt "delete tasks button" msgid "All Tasks" msgstr "" #. translators: %s: Task process content #: pro/assets/js/smart-manager.js:1353 msgctxt "process title" msgid "Edited %s" msgstr "" #: pro/assets/js/smart-manager.js:1354 msgctxt "modal title" msgid "Task Title" msgstr "" #: pro/assets/js/smart-manager.js:1355 msgctxt "title placeholder" msgid "Enter desired title here..." msgstr "" #. translators: %s: Undo modal description #: pro/assets/js/smart-manager.js:1358 msgctxt "modal description" msgid "Name the task for easier reference and future actions, especially for %s option. A pre-filled title has been suggested based on your changes." msgstr "" #: pro/assets/js/smart-manager.js:1358 msgctxt "modal description" msgid "Undo" msgstr "" #: pro/assets/js/smart-manager.js:1367 #: pro/assets/js/smart-manager.js:1545 msgctxt "modal title" msgid "Schedule Bulk Edit" msgstr "" #: pro/assets/js/smart-manager.js:1368 msgctxt "modal title" msgid "Title" msgstr "" #: pro/assets/js/smart-manager.js:1385 #: pro/assets/js/smart-manager.js:1558 msgctxt "notification" msgid "Please select your desired date & time for scheduling an action." msgstr "" #: pro/assets/js/smart-manager.js:1437 msgctxt "progressbar modal title" msgid "Delete Records" msgstr "" #: pro/assets/js/smart-manager.js:1442 msgctxt "progressbar modal title" msgid "Undo Tasks" msgstr "" #: pro/assets/js/smart-manager.js:1446 msgctxt "progressbar modal title" msgid "Delete Tasks" msgstr "" #: pro/assets/js/smart-manager.js:1469 msgctxt "notification" msgid "Please select a task" msgstr "" #: pro/assets/js/smart-manager.js:1482 msgctxt "modal content" msgid "undo" msgstr "" #. translators: %s: schedule actions modal description #: pro/assets/js/smart-manager.js:1527 msgctxt "modal description" msgid "Schedule actions at your convenient date and time." msgstr "" #: pro/assets/js/smart-manager.js:1527 msgctxt "modal description" msgid "Schedule Actions" msgstr "" #: pro/assets/js/smart-manager.js:1528 msgctxt "modal title" msgid "Schedule For" msgstr "" #: pro/assets/js/smart-manager.js:1538 msgctxt "modal description" msgid "Note: " msgstr "" #: pro/assets/js/smart-manager.js:1538 msgctxt "modal description" msgid "Scheduled actions follow timezone of your site. Avoid overlaps to prevent delays." msgstr "" #: pro/assets/js/smart-manager.js:1624 msgctxt "access privilege settings notification" msgid "Privilege settings saved successfully!" msgstr "" pro/assets/css/smart-manager.css000064400000001117147600337620012716 0ustar00.sm_beta_batch_update_field { line-height: 1em; } #batchmod_sm_editor_grid input[class^="batch_update_value"] { height: 28px; width:15em !important; border-radius:0.3em; } .batch_update_table td { padding-bottom: 0.5em; } input.batch_update_value[type="text"], input.batch_update_value[type="number"] { height: 2em; } input.batch_update_value[type="text"], input.batch_update_value[type="number"], textarea.batch_update_value { border-radius: 0.3em; width: 14em; } /*Rank Math Plugin*/ .rank-math-seo-score.good{ color: #58bb58; } .rank-math-seo-score.bad{ color: #e93f30; } pro/assets/js/json-schema/product-addons.json000064400000012610147600337620015322 0ustar00{ "definitions": {}, "$schema": "", "$id": "", "type": "array", "title": "Product Add-ons Schema", "default": null, "items": { "$id": "#/items", "type": "object", "title": "Product Add-on", "default": null, "required": [ "name", "type", "position" ], "properties": { "name": { "$id": "#/items/properties/name", "type": "string", "title": "Title", "default": "" }, "title_format": { "$id": "#/items/properties/title_format", "type": "string", "enum": [ "label", "heading", "hide" ], "title": "Format title", "default": "label", "examples": [ "label", "heading", "hide" ] }, "description_enable": { "$id": "#/items/properties/description_enable", "type": "integer", "enum": [ 0, 1 ], "title": "Add description", "default": 0, "examples": [ 0, 1 ] }, "description": { "$id": "#/items/properties/description", "type": "string", "title": "The Description", "default": "" }, "type": { "$id": "#/items/properties/type", "type": "string", "enum": [ "multiple_choice", "checkbox", "custom_text", "custom_textarea", "file_upload", "custom_price", "input_multiplier", "heading" ], "title": "Type", "default": "multiple_choice", "examples": [ "multiple_choice", "checkbox", "custom_text", "custom_textarea", "file_upload", "custom_price", "input_multiplier", "heading" ], "pattern": "^(.*)$" }, "display": { "$id": "#/items/properties/display", "type": "string", "enum": [ "select", "radiobutton", "images" ], "title": "Display as", "default": "select", "examples": [ "select", "radiobutton", "images" ] }, "position": { "$id": "#/items/properties/position", "type": "integer", "title": "Position of Addon", "default": 0, "examples": [ 0, 1, 2, 3, 4, 5, 6, 7 ], "multipleOf": 1.0, "minimum": 0.0 }, "required": { "$id": "#/items/properties/required", "type": "integer", "enum": [ 0, 1 ], "title": "Required field", "default": 0, "examples": [ 0, 1 ] }, "restrictions": { "$id": "#/items/properties/restrictions", "type": "integer", "enum": [ 0, 1 ], "title": "Restriction", "default": 0, "examples": [ 0, 1 ] }, "restrictions_type": { "$id": "#/items/properties/restrictions_type", "type": "string", "enum": [ "any_text", "only_letters", "only_numbers", "only_letters_numbers", "email" ], "title": "The Restrictions Type", "default": "any_text", "examples": [ "any_text", "only_letters", "only_numbers", "only_letters_numbers", "email" ] }, "adjust_price": { "$id": "#/items/properties/adjust_price", "type": "integer", "enum": [ 0, 1 ], "title": "Adjust price", "default": 0, "examples": [ 0, 1 ] }, "price_type": { "$id": "#/items/properties/price_type", "type": "string", "enum": [ "flat_fee", "quantity_based", "percentage_based" ], "title": "Adjust price type", "default": "flat_fee", "examples": [ "flat_fee", "quantity_based", "percentage_based" ] }, "price": { "$id": "#/items/properties/price", "type": "string", "title": "Price", "default": "", "examples": [ "0.00", "9.99", "0.50", "33.3" ] }, "min": { "$id": "#/items/properties/min", "type": "integer", "title": "Minimum quantity", "default": 0, "examples": [ 0, 10, 55, 999 ] }, "max": { "$id": "#/items/properties/max", "type": "integer", "title": "Maximum quantity", "default": 0, "examples": [ 0, 10, 55, 999 ], "multipleOf": 1.0, "minimum": 0.0 }, "options": { "$id": "#/items/properties/options", "type": "array", "title": "Options", "default": null, "items": { "$id": "#/items/properties/options/items", "type": "object", "title": "The Items Schema", "properties": { "label": { "$id": "#/items/properties/options/items/properties/label", "type": "string", "title": "Label", "default": "" }, "price": { "$id": "#/items/properties/options/items/properties/price", "type": "string", "title": "Price", "default": "", "examples": [ "0.00", "9.99", "0.50", "33.3" ] }, "image": { "$id": "#/items/properties/options/items/properties/image", "type": "string", "title": "Image", "default": "", "examples": [ "10", "68", "43", "97" ] }, "price_type": { "$id": "#/items/properties/options/items/properties/price_type", "type": "string", "enum": [ "flat_fee", "quantity_based", "percentage_based" ], "title": "Price type", "default": "flat_fee", "examples": [ "flat_fee", "quantity_based", "percentage_based" ] } } } } } } }pro/assets/js/smart-manager.js000064400000277450147600337620012405 0ustar00;;; function Smart_Manager_Pro() { Smart_Manager.apply(); } Smart_Manager_Pro.prototype = Object.create(Smart_Manager.prototype); Smart_Manager_Pro.prototype.constructor = Smart_Manager_Pro; Smart_Manager_Pro.prototype.getDataDefaultParams = function(params) { Smart_Manager.prototype.getDataDefaultParams.apply(this, [params]); if ( typeof window.smart_manager.date_params.date_filter_params != 'undefined' ) { window.smart_manager.currentGetDataParams.data['date_filter_params'] = window.smart_manager.date_params.date_filter_params; } if ( typeof window.smart_manager.date_params.date_filter_query != 'undefined' ) { window.smart_manager.currentGetDataParams.data['date_filter_query'] = window.smart_manager.date_params.date_filter_query; } } if(typeof window.smart_manager_pro === 'undefined'){ window.smart_manager = new Smart_Manager_Pro(); } jQuery(document).on('smart_manager_init','#sm_editor_grid', function() { window.smart_manager.batchUpdateSelectActionOption = ''; window.smart_manager.batchUpdateCopyFromOption = ''; window.smart_manager.date_params = {}; //params for date filter let additionalDateOperators = {increase_date_by:_x('increase by', "bulk edit action - 'date' fields", 'smart-manager-for-wp-e-commerce'), decrease_date_by:_x('decrease by', "bulk edit action - 'date' fields", 'smart-manager-for-wp-e-commerce')}; window.smart_manager.batch_update_actions = { 'numeric': {increase_by_per:_x('increase by %', "bulk edit action - 'number' fields", 'smart-manager-for-wp-e-commerce'), decrease_by_per:_x('decrease by %', "bulk edit action - 'number' fields", 'smart-manager-for-wp-e-commerce'), increase_by_num:_x('increase by number', "bulk edit action - 'number' fields", 'smart-manager-for-wp-e-commerce'), decrease_by_num:_x('decrease by number', "bulk edit action - 'number' fields", 'smart-manager-for-wp-e-commerce')}, 'image': {}, 'multipleImage': {}, 'datetime': Object.assign({set_datetime_to:_x('set datetime to', "bulk edit action - 'datetime' fields", 'smart-manager-for-wp-e-commerce'), set_date_to:_x('set date to', "bulk edit action - 'datetime' fields", 'smart-manager-for-wp-e-commerce'), set_time_to:_x('set time to', "bulk edit action - 'datetime' fields", 'smart-manager-for-wp-e-commerce')}, additionalDateOperators), 'date': Object.assign({set_date_to:_x('set date to', "bulk edit action - 'date' fields", 'smart-manager-for-wp-e-commerce')},additionalDateOperators), 'time': Object.assign({set_time_to:_x('set time to', "bulk edit action - 'time' fields", 'smart-manager-for-wp-e-commerce')},additionalDateOperators), 'dropdown': {}, 'multilist': {add_to:_x('add to', "bulk edit action - 'multiselect list' fields", 'smart-manager-for-wp-e-commerce'), remove_from:_x('remove from', "bulk edit action - 'multiselect list' fields", 'smart-manager-for-wp-e-commerce')}, 'serialized': {}, 'text': {prepend:_x('prepend', "bulk edit action - 'text' fields", 'smart-manager-for-wp-e-commerce'), append:_x('append', "bulk edit action - 'text' fields", 'smart-manager-for-wp-e-commerce'), search_and_replace:_x('search & replace', "bulk edit action - 'text' fields", 'smart-manager-for-wp-e-commerce')} } let types_exclude_set_to = ['datetime', 'date', 'time'] Object.keys(window.smart_manager.batch_update_actions).forEach(key => { let setToObj = (types_exclude_set_to.includes(key)) ? {} : {set_to: _x('set to', 'bulk edit action', 'smart-manager-for-wp-e-commerce')} window.smart_manager.batch_update_actions[key] = Object.assign(setToObj, window.smart_manager.batch_update_actions[key],{copy_from: _x('copy from', 'bulk edit action', 'smart-manager-for-wp-e-commerce')}, {copy_from_field: _x('copy from field', 'bulk edit action', 'smart-manager-for-wp-e-commerce')}); }); }) .on('sm_top_bar_loaded', '#sm_top_bar', function() { jQuery(document).off('click', '.sm_date_range_container .smart-date-icon').on('click', '.sm_date_range_container .smart-date-icon', function() { if( jQuery('.sm_date_range_container .dropdown-menu').is(':visible') === false ){ jQuery('.sm_date_range_container .dropdown-menu').show(); } else { jQuery('.sm_date_range_container .dropdown-menu').hide(); } // jQuery('.sm_date_range_container .dropdown-menu').toggle(); }); jQuery(document).off('click', ':not(.sm_date_range_container .dropdown-menu)').on('click', ':not(.sm_date_range_container .dropdown-menu)', function( e ){ if ( jQuery(e.target).hasClass('smart-date-icon') === false && jQuery('.sm_date_range_container .dropdown-menu').is(':visible') === true ) { jQuery('.sm_date_range_container .dropdown-menu').hide(); } }); jQuery(document).off('click', '.sm_date_range_container .dropdown-menu li a').on('click', '.sm_date_range_container .dropdown-menu li a', function(e) { e.preventDefault(); jQuery('.sm_date_range_container .dropdown-menu').hide(); window.smart_manager.proSelectDate(jQuery(this).attr('data-key')); }); //Code for initializing the date picker jQuery('.sm_date_range_container input.sm_date_selector').Zebra_DatePicker({ format: 'd M Y H:i:s', // format: 'dd-mm-yy H:i:s', show_icon: false, show_select_today: false, readonly_element: false, default_position: 'below', lang_clear_date: 'Clear dates', onClear: window.smart_manager.clearDateFilter, start_date: new Date( new Date().setHours(0, 0, 0) ), onSelect: function(fdate, jsdate) { jQuery(this).change(); let id = jQuery(this).attr('id'), selected_date_obj = new Date(fdate), params = {'start_date_formatted':'', 'start_date_default_format':'', 'end_date_formatted':'', 'end_date_default_format':''}; if( id == 'sm_date_selector_start_date' ) { //if end_date is not set params.start_date_formatted = fdate; params.start_date_default_format = jsdate; var end_date = jQuery('#sm_date_selector_end_date').val(), end_time = ''; if( end_date == '' ) { end_date_obj = new Date( selected_date_obj.getFullYear(), selected_date_obj.getMonth(), ( selected_date_obj.getDate() + 29 ) ); end_time = '23:59:59'; } else { end_date_obj = new Date(end_date); end_time = window.smart_manager.strPad(end_date_obj.getHours(), 2) + ':' + window.smart_manager.strPad(end_date_obj.getMinutes(), 2) + ':' + window.smart_manager.strPad(end_date_obj.getSeconds(), 2); } var y = end_date_obj.getFullYear() + '', m = end_date_obj.getMonth(), d = window.smart_manager.strPad(end_date_obj.getDate(), 2); params.end_date_formatted = d + ' ' + window.smart_manager.month_names_short[m] + ' ' + y + ' ' + end_time; params.end_date_default_format = y + '-' + window.smart_manager.strPad((m+1), 2) + '-' + d + ' ' + end_time; if( end_date == '' ) { end_date_datepicker = jQuery('.sm_date_range_container input.end-date').data('Zebra_DatePicker'); end_date_datepicker.set_date(params.end_date_formatted); end_date_datepicker.update({'current_date': new Date(params.end_date_default_format)}); } } else if( id == 'sm_date_selector_end_date' ) { //if start_date is not set params.end_date_formatted = fdate; params.end_date_default_format = jsdate; var start_date = jQuery('#sm_date_selector_start_date').val(), start_time = ''; if( start_date == '' ) { start_date_obj = new Date( selected_date_obj.getFullYear(), selected_date_obj.getMonth(), ( selected_date_obj.getDate() - 29 ) ); start_time = '23:59:59'; } else { start_date_obj = new Date(start_date); start_time = window.smart_manager.strPad(start_date_obj.getHours(), 2) + ':' + window.smart_manager.strPad(start_date_obj.getMinutes(), 2) + ':' + window.smart_manager.strPad(start_date_obj.getSeconds(), 2); } var y = start_date_obj.getFullYear() + '', m = start_date_obj.getMonth(), d = window.smart_manager.strPad(start_date_obj.getDate(), 2); params.start_date_formatted = d + ' ' + window.smart_manager.month_names_short[m] + ' ' + y + ' ' + start_time; params.start_date_default_format = y + '-' + window.smart_manager.strPad((m+1), 2) + '-' + d + ' ' + start_time; if( start_date == '' ) { start_date_datepicker = jQuery('.sm_date_range_container input.start-date').data('Zebra_DatePicker'); start_date_datepicker.set_date(params.start_date_formatted); start_date_datepicker.update({'current_date': new Date(params.start_date_default_format)}); } } window.smart_manager.sm_handle_date_filter(params); } }); if( typeof( window.smart_manager.date_params.date_filter_params ) != 'undefined' && window.smart_manager.isJSON( window.smart_manager.date_params.date_filter_params ) ) { selected_dates = JSON.parse(window.smart_manager.date_params.date_filter_params); start_date_datepicker = jQuery('.sm_date_range_container input.start-date').data('Zebra_DatePicker'); start_date_datepicker.set_date(selected_dates.start_date_formatted); start_date_datepicker.update({'current_date': new Date(selected_dates.start_date_default_format)}); end_date_datepicker = jQuery('.sm_date_range_container input.end-date').data('Zebra_DatePicker'); end_date_datepicker.set_date(selected_dates.end_date_formatted); end_date_datepicker.update({'current_date': new Date(selected_dates.end_date_default_format)}); } }) .off('click','.sm_beta_batch_update_background_link').on('click','.sm_beta_batch_update_background_link',function() { //Code for enabline background updating window.location.reload(); // window.smart_manager.hideNotification(); // window.smart_manager.refresh(); // if( jQuery('#sm_top_bar_action_btns_update #batch_update_sm_editor_grid, #sm_top_bar_action_btns_update .sm_beta_dropdown_content').hasClass('sm-ui-state-disabled') === false ) { // jQuery('#sm_top_bar_action_btns_update #batch_update_sm_editor_grid, #sm_top_bar_action_btns_update .sm_beta_dropdown_content').addClass('sm-ui-state-disabled'); // } // if( jQuery("#wpbody .sm_beta_pro_background_update_notice").length == 0 ) { // jQuery('

            Success! '+ params.title +' initiated – Your records are being updated in the background. You will be notified on your email address '+window.smart_manager.sm_admin_email+' once the process is completed.

            ').insertBefore('#wpbody .wrap'); // // To go to start of the SM page so users can see above notice. // window.scrollTo(0,0); // } }) // Code for handling the undo & delete tasks functionality .on('sm_show_tasks_change', '#sm_editor_grid', function(){ if("undefined" !== typeof(window.smart_manager.showTasks) && "function" === typeof(window.smart_manager.showTasks)){ window.smart_manager.showTasks(); } jQuery(document).off( 'click', ".sm_top_bar_action_btns #sm_beta_undo_selected,.sm_top_bar_action_btns #sm_beta_undo_all_tasks,.sm_top_bar_action_btns #sm_beta_delete_selected_tasks, .sm_top_bar_action_btns #sm_beta_delete_all_tasks").on( 'click', ".sm_top_bar_action_btns #sm_beta_undo_selected,.sm_top_bar_action_btns #sm_beta_undo_all_tasks,.sm_top_bar_action_btns #sm_beta_delete_selected_tasks, .sm_top_bar_action_btns #sm_beta_delete_all_tasks", function(){ if("undefined" !== typeof(window.smart_manager.taskActionsModal) && "function" === typeof(window.smart_manager.taskActionsModal)){ window.smart_manager.taskActionsModal({id: jQuery(this).attr('id'),btnText: jQuery(this).text()}); } }) }) // Code for handling renaming of column titles .off('focusout','.sm-column-title-input').on('focusout','.sm-column-title-input', function(e){ e.target.readOnly = true; e.target.classList.remove('sm-column-title-input-edit') let parent = e.target.closest('li'); if(!parent) return; let keyInput = parent.querySelector(".js-column-key"); if(!keyInput) return; if(!e.target.value){ //handling for empty values (window.smart_manager.editedColumnTitles.hasOwnProperty(keyInput.value)) ? delete window.smart_manager.editedColumnTitles[keyInput.value] : '' return; } let titleInput = parent.querySelector(".js-column-title"); if(!titleInput) return; if(titleInput.value == e.target.value) return; window.smart_manager.editedColumnTitles[keyInput.value] = e.target.value; }); //Function to determine if background process is running or not Smart_Manager.prototype.isBackgroundProcessRunning = function() { if( jQuery('#sa_sm_background_process_progress').length > 0 && jQuery('#sa_sm_background_process_progress').is(":visible") ) { return true; } return false; } //function to clear the datepicker filter Smart_Manager.prototype.clearDateFilter = function() { let startDate = jQuery('#sm_date_selector_start_date').val(), endDate = jQuery('#sm_date_selector_end_date').val(), refresh = 0; if( startDate != '' ) { let startDateDatepicker = jQuery('.sm_date_range_container input.start-date').data('Zebra_DatePicker'); jQuery('#sm_date_selector_start_date').val(''); refresh = 1; } if( endDate != '' ) { let endDateDatepicker = jQuery('.sm_date_range_container input.end-date').data('Zebra_DatePicker'); jQuery('#sm_date_selector_end_date').val(''); refresh = 1; } if( typeof(window.smart_manager.currentGetDataParams.date_filter_params) != 'undefined' && typeof(window.smart_manager.currentGetDataParams.date_filter_query) != 'undefined' ) { delete window.smart_manager.currentGetDataParams.date_filter_params; delete window.smart_manager.currentGetDataParams.date_filter_query; } if( window.smart_manager.date_params.hasOwnProperty('date_filter_params') ) { delete window.smart_manager.date_params['date_filter_params']; } if( window.smart_manager.date_params.hasOwnProperty('date_filter_query') ) { delete window.smart_manager.date_params['date_filter_query']; } if( refresh == 1 ) { window.smart_manager.refresh(); } } //function to process the datepicker filter Smart_Manager.prototype.sm_handle_date_filter = function(params) { let date_search_array = new Array(), dataParams = {}; if( window.smart_manager.dashboard_key == 'user' ) { date_search_array = new Array({"key":"User Registered","value":params.start_date_default_format,"type":"date","operator":">=","table_name":window.smart_manager.wpDbPrefix+"users","col_name":"user_registered","date_filter":1}, {"key":"User Registered","value":params.end_date_default_format,"type":"date","operator":"<=","table_name":window.smart_manager.wpDbPrefix+"users","col_name":"user_registered","date_filter":1}); } else { date_search_array = new Array({"key":"Post Date","value":params.start_date_default_format,"type":"date","operator":">=","table_name":window.smart_manager.wpDbPrefix+"posts","col_name":"post_date","date_filter":1}, {"key":"Post Date","value":params.end_date_default_format,"type":"date","operator":"<=","table_name":window.smart_manager.wpDbPrefix+"posts","col_name":"post_date","date_filter":1}); } window.smart_manager.date_params['date_filter_params'] = JSON.stringify(params); window.smart_manager.date_params['date_filter_query'] = JSON.stringify(date_search_array); if( Object.getOwnPropertyNames(window.smart_manager.date_params).length > 0 ) { dataParams.data = window.smart_manager.date_params; } window.smart_manager.refresh(dataParams); } //function to append 0's to str Smart_Manager.prototype.strPad = function(str, len) { str += ''; while (str.length < len) str = '0' + str; return str; }, Smart_Manager.prototype.proSelectDate = function (dateValue){ if( dateValue == 'all' ) { if ( typeof (window.smart_manager.clearDateFilter) !== "undefined" && typeof (window.smart_manager.clearDateFilter) === "function" ) { window.smart_manager.clearDateFilter(); } return; } let fromDate, toDate, from_time, to_time, from_date_formatted, from_date_default_format, to_date_formatted, to_date_default_format, now = new Date(), params = {'start_date_formatted':'', 'start_date_default_format':'', 'end_date_formatted':'', 'end_date_default_format':''}; switch (dateValue){ case 'today': fromDate = now; toDate = now; break; case 'yesterday': fromDate = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1); toDate = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1); break; case 'this_week': fromDate = new Date(now.getFullYear(), now.getMonth(), now.getDate() - (now.getDay() - 1)); toDate = now; break; case 'last_week': fromDate = new Date(now.getFullYear(), now.getMonth(), (now.getDate() - (now.getDay() - 1) - 7)); toDate = new Date(now.getFullYear(), now.getMonth(), (now.getDate() - (now.getDay() - 1) - 1)); break; case 'last_4_week': fromDate = new Date( now.getFullYear(), now.getMonth(), ( now.getDate() - 29 ) ); //for exactly 30 days limit toDate = now; break; case 'this_month': fromDate = new Date(now.getFullYear(), now.getMonth(), 1); toDate = now; break; case 'last_month': fromDate = new Date(now.getFullYear(), now.getMonth()-1, 1); toDate = new Date(now.getFullYear(), now.getMonth(), 0); break; case '3_months': fromDate = new Date(now.getFullYear(), now.getMonth()-2, 1); toDate = now; break; case '6_months': fromDate = new Date(now.getFullYear(), now.getMonth()-5, 1); toDate = now; break; case 'this_year': fromDate = new Date(now.getFullYear(), 0, 1); toDate = now; break; case 'last_year': fromDate = new Date(now.getFullYear() - 1, 0, 1); toDate = new Date(now.getFullYear(), 0, 0); break; default: fromDate = new Date(now.getFullYear(), now.getMonth(), 1); toDate = now; break; } //Code for format if( typeof fromDate === 'object' && fromDate instanceof Date ) { var y = fromDate.getFullYear() + '', m = fromDate.getMonth(), d = window.smart_manager.strPad(fromDate.getDate(), 2); from_time = '00:00:00'; params.start_date_formatted = d + ' ' + window.smart_manager.month_names_short[m] + ' ' + y + ' ' + from_time; params.start_date_default_format = y + '-' + window.smart_manager.strPad((m+1), 2) + '-' + d + ' ' + from_time; } if( typeof toDate === 'object' && toDate instanceof Date ) { var y = toDate.getFullYear() + '', m = toDate.getMonth(), d = window.smart_manager.strPad(toDate.getDate(), 2); to_time = '23:59:59'; params.end_date_formatted = d + ' ' + window.smart_manager.month_names_short[m] + ' ' + y + ' ' + to_time; params.end_date_default_format = y + '-' + window.smart_manager.strPad((m+1), 2) + '-' + d + ' ' + to_time; } var start_date = jQuery('.sm_date_range_container input.start-date').data('Zebra_DatePicker'), end_date = jQuery('.sm_date_range_container input.end-date').data('Zebra_DatePicker'); if( typeof(start_date) != 'undefined') { start_date.set_date(params.start_date_formatted); start_date.update({'current_date': new Date(params.start_date_default_format), 'start_date': new Date(params.start_date_formatted)}); } if( typeof(end_date) != 'undefined') { end_date.set_date(params.end_date_formatted); end_date.update({'current_date': new Date(params.end_date_default_format), 'start_date': new Date(params.end_date_formatted)}); } window.smart_manager.sm_handle_date_filter( params ); }; var sm_beta_hide_dialog = function(IDs, gID) { jQuery.jgrid.hideModal("#"+IDs.themodal,{gb:"#gbox_"+gID,jqm:true, onClose: null}); index = 0; } // ======================================================================== // PRINT INVOICE // ======================================================================== Smart_Manager.prototype.printInvoice = function() { if( window.smart_manager.duplicateStore === false && window.smart_manager.selectedRows.length == 0 && !window.smart_manager.selectAll ) { return; } let params = {}; params.data = { cmd: 'get_print_invoice', active_module: window.smart_manager.dashboard_key, security: window.smart_manager.sm_nonce, pro: true, sort_params: (window.smart_manager.currentDashboardModel.hasOwnProperty('sort_params') ) ? window.smart_manager.currentDashboardModel.sort_params : '', table_model: (window.smart_manager.currentDashboardModel.hasOwnProperty('tables') ) ? window.smart_manager.currentDashboardModel.tables : '', SM_IS_WOO30: window.smart_manager.sm_is_woo30, SM_IS_WOO22: window.smart_manager.sm_id_woo22, SM_IS_WOO21: window.smart_manager.sm_is_woo21, search_text: (window.smart_manager.searchType == 'simple') ? window.smart_manager.simpleSearchText : '', advanced_search_query: JSON.stringify((window.smart_manager.searchType != 'simple') ? window.smart_manager.advancedSearchQuery : []), storewide_option: (true === window.smart_manager.selectAll) ? 'entire_store' : '', selected_ids: (window.smart_manager.getSelectedKeyIds()) ? JSON.stringify(window.smart_manager.getSelectedKeyIds()) : '' }; let url = window.smart_manager.sm_ajax_url + '&cmd='+ params.data['cmd'] +'&active_module='+ params.data['active_module'] +'&security='+ params.data['security'] +'&pro='+ params.data['pro'] +'&SM_IS_WOO30='+ params.data['SM_IS_WOO30'] +'&SM_IS_WOO30='+ params.data['SM_IS_WOO30'] +'&sort_params='+ encodeURIComponent(JSON.stringify(params.data['sort_params'])) +'&table_model='+ encodeURIComponent(JSON.stringify(params.data['table_model'])) +'&advanced_search_query='+ params.data['advanced_search_query'] +'&search_text='+ params.data['search_text'] + '&storewide_option=' + params.data['storewide_option'] + '&selected_ids=' + params.data['selected_ids']; url += (window.smart_manager.isFilteredData()) ? '&filteredResults=1' : ''; params.call_url = url; params.data_type = 'html'; url += ( window.smart_manager.date_params.hasOwnProperty('date_filter_params') ) ? '&date_filter_params='+ window.smart_manager.date_params['date_filter_params'] : ''; url += ( window.smart_manager.date_params.hasOwnProperty('date_filter_query') ) ? '&date_filter_query='+ window.smart_manager.date_params['date_filter_query'] : ''; window.smart_manager.send_request(params, function(response) { let win = window.open('', 'Invoice'); win.document.write(response); win.document.close(); win.print(); }); } // ======================================================================== // DUPLICATE RECORDS // ======================================================================== Smart_Manager.prototype.duplicateRecords = function() { if( !window.smart_manager.duplicateStore && window.smart_manager.selectedRows.length == 0 && !window.smart_manager.selectAll ) { return; } window.smart_manager.selectAll = (window.smart_manager.duplicateStore || window.smart_manager.selectAll) ? true : false; setTimeout( function() { window.smart_manager.showProgressDialog(_x('Duplicate Records', 'progressbar modal title', 'smart-manager-for-wp-e-commerce')); if( typeof (sa_sm_background_process_heartbeat) !== "undefined" && typeof (sa_sm_background_process_heartbeat) === "function" ) { sa_sm_background_process_heartbeat(1000, 'duplicate'); } } ,1); let params = {}; params.data = { cmd: 'duplicate_records', active_module: window.smart_manager.dashboard_key, security: window.smart_manager.sm_nonce, pro: true, storewide_option: (window.smart_manager.selectAll) ? 'entire_store' : '', selected_ids: JSON.stringify(window.smart_manager.getSelectedKeyIds()), table_model: (window.smart_manager.currentDashboardModel.hasOwnProperty('tables') ) ? window.smart_manager.currentDashboardModel.tables : '', active_module_title: window.smart_manager.dashboardName, backgroundProcessRunningMessage: window.smart_manager.backgroundProcessRunningMessage, SM_IS_WOO30: window.smart_manager.sm_is_woo30, SM_IS_WOO22: window.smart_manager.sm_id_woo22, SM_IS_WOO21: window.smart_manager.sm_is_woo21 }; params.showLoader = false; if(window.smart_manager.isFilteredData()) { params.data.filteredResults = 1; } window.smart_manager.send_request(params, function(response) { }); // setTimeout(function() { // params = { 'func_nm' : 'duplicate_records', 'title' : 'Duplicate Records' } // window.smart_manager.background_process_hearbeat( params ); // }, 1000); }; // ======================================================================== // Function to handle request for both creating & updating view // ======================================================================== Smart_Manager.prototype.saveView = function(action = 'create', name = '') { let viewSlug = window.smart_manager.getViewSlug(window.smart_manager.dashboardName); let activeDashboard = (viewSlug) ? viewSlug : window.smart_manager.dashboard_key; // let name = jQuery('#sm_view_name').val(); let currentDashboardState = ''; if ( typeof (window.smart_manager.getCurrentDashboardState) !== "undefined" && typeof (window.smart_manager.getCurrentDashboardState) === "function" ) { currentDashboardState = window.smart_manager.getCurrentDashboardState(); } if(currentDashboardState){ currentDashboardState = JSON.parse(currentDashboardState); currentDashboardState['search_params'] = { 'isAdvanceSearch': ((window.smart_manager.advancedSearchQuery.length > 0) ? 'true' : 'false'), 'params': ((window.smart_manager.advancedSearchQuery.length > 0) ? window.smart_manager.advancedSearchQuery : window.smart_manager.simpleSearchText), } //AJAX to create & save view let params = {}; params.data_type = 'json'; params.data = { module: 'custom_views', cmd: action, active_module: activeDashboard, security: window.smart_manager.sm_nonce, name: name, isPublic: (jQuery('#sm_view_access_public').is(":checked")) ? true : false, is_view: (viewSlug) ? 1 : 0, currentView: JSON.stringify(currentDashboardState) }; window.smart_manager.send_request(params, function(response){ let ack = (response.hasOwnProperty('ACK')) ? response.ACK : '' let viewSlug = (response.hasOwnProperty('slug')) ? response.slug : '' if(ack == 'Success'){ window.smart_manager.notification = {status:'success', message: sprintf( /* translators: %s: success notification message */ _x('View %sd successfully!', 'notification', 'smart-manager-for-wp-e-commerce'), String(action).capitalize())} if(viewSlug != ''){ setTimeout(function () { window.location.href = (window.smart_manager.smAppAdminURL || window.location.href) + ((window.location.href.indexOf("?")===-1)?"?":"&") + "dashboard="+viewSlug+"&is_view=1"; }, 500); } window.smart_manager.showNotification() } else { location.reload(); } }); } } // ======================================================================== // function to display confirmdialog for create & update view // ======================================================================== Smart_Manager.prototype.createUpdateViewDialog = function(action = 'create') { let params = {}, viewSlug = window.smart_manager.getViewSlug(window.smart_manager.dashboardName); let isView = (viewSlug) ? 1 : 0, isPublicView = (window.smart_manager.publicViews.includes(viewSlug)) ? 1 : 0; params.btnParams = {} params.title = _x('Custom Views', 'modal title', 'smart-manager-for-wp-e-commerce'); params.width = 500; params.height = 350; params.content = '

            '+_x('Create a custom view to save selected columns from a dashboard. Use it for saved searches, giving specific columns access to other users, etc.', 'modal content', 'smart-manager-for-wp-e-commerce')+'

            '+ ''+ ''+ '
            '+ ''+ '

            '+_x('Marking this view public will make it available to all users having access to the Smart Manager.', 'description', 'smart-manager-for-wp-e-commerce')+'

            '+ '
            '; if ( typeof (window.smart_manager.createUpdateView) !== "undefined" && typeof (window.smart_manager.createUpdateView) === "function" ) { params.btnParams.yesText = String(action).capitalize(); params.btnParams.yesCallback = window.smart_manager.createUpdateView; params.btnParams.yesCallbackParams = action; params.btnParams.hideOnYes = false } window.smart_manager.showConfirmDialog(params); } // ======================================================================== // function to handle functionality for checking iof view exists & if not then creating or updating the same // ======================================================================== Smart_Manager.prototype.createUpdateView = function(action = 'create') { let name = jQuery('#sm_view_name').val() // Code to validate name field if(!name){ jQuery('#sm_view_error_msg').html('Please add view name').show(); jQuery('#sm_view_name').addClass('sm_border_red') } else { jQuery('#sm_view_name').removeClass('sm_border_red'); jQuery('#sm_view_error_msg').html('').hide(); let viewSlug = window.smart_manager.getViewSlug(window.smart_manager.dashboardName); let activeDashboard = (viewSlug) ? viewSlug : window.smart_manager.dashboard_key; if(action != 'create' && name == window.smart_manager.dashboardName){ if ( typeof (window.smart_manager.saveView) !== "undefined" && typeof (window.smart_manager.saveView) === "function" ) { window.smart_manager.saveView(action, name); } } else { //Code to check if the view with same name exists let params = {}; params.data_type = 'json'; params.data = { module: 'custom_views', cmd: 'is_view_available', active_module: activeDashboard, security: window.smart_manager.sm_nonce, name: name }; window.smart_manager.send_request(params, function(response){ if(response.hasOwnProperty('is_available')){ let isAvailable = response.is_available; if(isAvailable){ if ( typeof (window.smart_manager.saveView) !== "undefined" && typeof (window.smart_manager.saveView) === "function" ) { window.smart_manager.saveView(action, name); window.smart_manager.modal = {} if(typeof (window.smart_manager.showPannelDialog) !== "undefined" && typeof (window.smart_manager.showPannelDialog) === "function" && typeof (window.smart_manager.getDefaultRoute) !== "undefined" && typeof (window.smart_manager.getDefaultRoute) === "function"){ window.smart_manager.showPannelDialog('',window.smart_manager.getDefaultRoute(true)) } } } else { jQuery('#sm_view_error_msg').html(_x('View already exists. Please try another name', 'notification', 'smart-manager-for-wp-e-commerce')).show(); jQuery('#sm_view_name').addClass('sm_border_red') } } }); } } //If eists show error // If not exists send ajax call for saving the view }; // ======================================================================== // DELETE VIEW // ======================================================================== Smart_Manager.prototype.deleteView = function() { let viewSlug = window.smart_manager.getViewSlug(window.smart_manager.dashboardName); //AJAX to create & save view let params = {}; params.data_type = 'json'; params.data = { module: 'custom_views', cmd: 'delete', security: window.smart_manager.sm_nonce, active_module: viewSlug }; window.smart_manager.send_request(params, function(response){ let ack = (response.hasOwnProperty('ACK')) ? response.ACK : '' if(ack == 'Success'){ window.smart_manager.notification = {status:'success', message: _x('View deleted successfully!', 'notification', 'smart-manager-for-wp-e-commerce')} window.smart_manager.showNotification() } location.reload(); }); } // ======================================================================== // BATCH UPDATE // ======================================================================== Smart_Manager.prototype.processBatchUpdate = function() { if(window.smart_manager.savedBulkEditConditions.length <= 0 || (window.smart_manager.selectedRows.length == 0 && !window.smart_manager.selectAll)){ return; } let ruleGroups = (window.smart_manager.savedBulkEditConditions[0].hasOwnProperty('rules')) ? window.smart_manager.savedBulkEditConditions[0].rules : [] let ruleMeta = (window.smart_manager.savedBulkEditConditions[0].hasOwnProperty('meta')) ? window.smart_manager.savedBulkEditConditions[0].meta : [] if(ruleGroups.length <= 0){ return; } let actions = (ruleGroups[0].hasOwnProperty('rules')) ? ruleGroups[0].rules : []; let updateAll = (ruleMeta.hasOwnProperty('updateAll')) ? ruleMeta.updateAll : false; window.smart_manager.selectAll = (updateAll || window.smart_manager.selectAll) ? true : false; if(!window.smart_manager.isScheduled){ setTimeout( function() { window.smart_manager.showProgressDialog(_x('Bulk Edit', 'progressbar modal title', 'smart-manager-for-wp-e-commerce')); if( typeof (sa_sm_background_process_heartbeat) !== "undefined" && typeof (sa_sm_background_process_heartbeat) === "function" ) { sa_sm_background_process_heartbeat(1000, 'bulk_edit'); } } ,1); } jQuery(document).trigger("sm_batch_update_on_submit"); //trigger to make changes in batch_update_actions //Ajax request to batch update the selected records let params = {}; params.data = { cmd: 'batch_update', active_module: window.smart_manager.dashboard_key, security: window.smart_manager.sm_nonce, pro: true, storewide_option: (window.smart_manager.selectAll) ? 'entire_store' : '', selected_ids: JSON.stringify(window.smart_manager.getSelectedKeyIds()), batch_update_actions: JSON.stringify(actions), active_module_title: window.smart_manager.dashboardName, backgroundProcessRunningMessage: window.smart_manager.backgroundProcessRunningMessage, table_model: (window.smart_manager.currentDashboardModel.hasOwnProperty('tables') ) ? window.smart_manager.currentDashboardModel.tables : '', SM_IS_WOO30: window.smart_manager.sm_is_woo30, SM_IS_WOO22: window.smart_manager.sm_id_woo22, SM_IS_WOO21: window.smart_manager.sm_is_woo21 }; // Code for passing tasks params params.data = ("undefined" !== typeof(window.smart_manager.addTasksParams) && "function" === typeof(window.smart_manager.addTasksParams) && 1 == window.smart_manager.sm_beta_pro) ? window.smart_manager.addTasksParams(params.data) : params.data; params.showLoader = (window.smart_manager.isScheduled)? true : false; if(window.smart_manager.isFilteredData()) { params.data.filteredResults = 1; } window.smart_manager.send_request(params, function(response) { if(window.smart_manager.isScheduled){ window.smart_manager.refresh(); window.smart_manager.notification = {message: response,hideDelay:25000,status:'success'} window.smart_manager.showNotification() } }); } Smart_Manager.prototype.resetBatchUpdate = function() { } Smart_Manager.prototype.displayDefaultBatchUpdateValueHandler = function( row_id ) { if( row_id == '' ) { return; } let selected_field = jQuery( "#"+row_id+" .batch_update_field option:selected" ).val(), type = window.smart_manager.column_names_batch_update[selected_field].type, editor = window.smart_manager.column_names_batch_update[selected_field].editor, multiSelectSeparator = window.smart_manager.column_names_batch_update[selected_field].multiSelectSeparator, col_val = window.smart_manager.column_names_batch_update[selected_field].values, allowMultiSelect = window.smart_manager.column_names_batch_update[selected_field].allowMultiSelect, skip_default_action = false; if( type == 'checkbox') { let checkedVal = '', uncheckedVal = '', checkedDisplayVal = '', uncheckedDisplayVal = ''; if( type == 'checkbox' ) { checkedVal = window.smart_manager.column_names_batch_update[selected_field].checkedTemplate; uncheckedVal = window.smart_manager.column_names_batch_update[selected_field].uncheckedTemplate; checkedDisplayVal = checkedVal.substr(0,1).toUpperCase() + checkedVal.substr(1,checkedVal.length); uncheckedDisplayVal = uncheckedVal.substr(0,1).toUpperCase() + uncheckedVal.substr(1,uncheckedVal.length); } jQuery("#"+row_id+" #batch_update_value_td").empty().append('') jQuery("#"+row_id+" #batch_update_value_td").find(".batch_update_value").select2({ width: '15em', dropdownCssClass: 'sm_beta_batch_update_field', dropdownParent: jQuery('[aria-describedby="sm_inline_dialog"]') }); } else if (col_val != '' && type == 'dropdown') { var batch_update_value_options = ''; if( value_options_empty === false ) { jQuery("#"+row_id+" #batch_update_value_td").empty().append(batch_update_value_options); let args = { width: '15em', dropdownCssClass: 'sm_beta_batch_update_field', dropdownParent: jQuery('[aria-describedby="sm_inline_dialog"]') }; if( editor == 'select2' && allowMultiSelect ) { args['multiple'] = true; } jQuery("#"+row_id+" #batch_update_value_td").find('.batch_update_value').select2(args); } } else if (col_val != '' && type == 'sm.multilist') { let options = {}, index = 0; Object.entries( col_val ).forEach(([key, value]) => { index = key; if( value.hasOwnProperty('parent') ) { if( value.parent > 0 ) { index = value.parent + '_childs'; value.term = ' – '+value.term; } } if( options.hasOwnProperty(index) ) { options[ index ] += ''; } else { options[ index ] = ''; } }); let batch_update_value_options = ''; jQuery("#"+row_id+" #batch_update_value_td").empty().append(batch_update_value_options) jQuery("#"+row_id+" #batch_update_value_td").find('.batch_update_value').select2({ width: '15em', dropdownCssClass: 'sm_beta_batch_update_field', dropdownParent: jQuery('[aria-describedby="sm_inline_dialog"]') }); } else if ( type == 'sm.longstring') { jQuery("#"+row_id+" #batch_update_value_td").empty().append(''); } else if ( type == 'sm.image') { jQuery("#"+row_id+" #batch_update_value_td").empty().append('
            '); } else if ( type == 'numeric') { jQuery("#"+row_id+" #batch_update_value_td").empty().append(''); } } Smart_Manager.prototype.createBatchUpdateDialog = function() { if( window.smart_manager.selectedRows.length <= 0 && window.smart_manager.selectAll === false ) { return; } let allItemsOptionText = ( window.smart_manager.simpleSearchText != '' || window.smart_manager.advancedSearchQuery.length > 0 ) ? _x('All Items In Search Results', 'bulk edit option', 'smart-manager-for-wp-e-commerce') : _x('All Items In Store', 'bulk edit option', 'smart-manager-for-wp-e-commerce'); let entire_store_batch_update_html = ""+ ( ( window.smart_manager.selectAll === false ) ? ""+_x('Selected Items', 'bulk edit option', 'smart-manager-for-wp-e-commerce')+"" : '' ) + ""+ allItemsOptionText +""+ "", batch_update_field_options = '', batch_update_action_options_string = '', batch_update_action_options_number = '', batch_update_action_options_datetime = '', batch_update_action_options_multilist = '', batch_update_actions_row = '', batch_update_dlg_content = '', dlgParams = {}; if( Object.getOwnPropertyNames(window.smart_manager.column_names_batch_update).length > 0 ) { for (let key in window.smart_manager.column_names_batch_update) { batch_update_field_options += ''; }; } //Formating options for default actions window.smart_manager.batch_update_action_options_default = ''; window.smart_manager.batch_update_action_options_default += ''; window.smart_manager.batch_update_action_options_default += window.smart_manager.batchUpdateCopyFromOption; //Formating options for number actions batch_update_action_options_string = window.smart_manager.batchUpdateSelectActionOption; let selected = ''; for (let key in window.smart_manager.batch_update_action_string) { selected = ''; if( key == 'set_to' ) { selected = 'selected'; } batch_update_action_options_string += ''; } batch_update_action_options_string += window.smart_manager.batchUpdateCopyFromOption; //Formating options for datetime actions batch_update_action_options_datetime = window.smart_manager.batchUpdateSelectActionOption; for (let key in window.smart_manager.batch_update_action_datetime) { selected = ''; if( key == 'set_datetime_to' ) { selected = 'selected'; } batch_update_action_options_datetime += ''; } batch_update_action_options_datetime += window.smart_manager.batchUpdateCopyFromOption; //Formating options for multilist actions batch_update_action_options_multilist = window.smart_manager.batchUpdateSelectActionOption; for (let key in window.smart_manager.batch_update_action_multilist) { selected = ''; if( key == 'set_to' ) { selected = 'selected'; } batch_update_action_options_multilist += ''; } batch_update_action_options_multilist += window.smart_manager.batchUpdateCopyFromOption; //Formating options for string actions batch_update_action_options_number = window.smart_manager.batchUpdateSelectActionOption; for (let key in window.smart_manager.batch_update_action_number) { selected = ''; if( key == 'set_to' ) { selected = 'selected'; } batch_update_action_options_number += ''; } batch_update_action_options_number += window.smart_manager.batchUpdateCopyFromOption; batch_update_actions_row = ""+ ""+ ""+ "
            "; batch_update_dlg_content = "
            "+ ""+ ""+ entire_store_batch_update_html + ""+ batch_update_actions_row+ ""+ ""+ ""+ ""+ ""+ "
             
            "+ "
            "; dlgParams.btnParams = {}; dlgParams.btnParams.yesText = _x('Update', 'button', 'smart-manager-for-wp-e-commerce'); if ( typeof (window.smart_manager.processBatchUpdate) !== "undefined" && typeof (window.smart_manager.processBatchUpdate) === "function" ) { dlgParams.btnParams.yesCallback = window.smart_manager.processBatchUpdate; } dlgParams.btnParams.noText = _x('Reset', 'button', 'smart-manager-for-wp-e-commerce'); if ( typeof (window.smart_manager.resetBatchUpdate) !== "undefined" && typeof (window.smart_manager.resetBatchUpdate) === "function" ) { dlgParams.btnParams.noCallback = window.smart_manager.resetBatchUpdate; } dlgParams.title = _x('Bulk Edit', 'modal title', 'smart-manager-for-wp-e-commerce'); dlgParams.content = batch_update_dlg_content; dlgParams.height = 300; dlgParams.width = 850; window.smart_manager.showConfirmDialog(dlgParams); jQuery('.batch_update_field, .batch_update_action').each(function() { jQuery(this).select2({ width: '15em', dropdownCssClass: 'sm_beta_batch_update_field', dropdownParent: jQuery('[aria-describedby="sm_inline_dialog"]') }); }) jQuery(".batch_update_action_row_0").find('#batch_update_add_delete_row .dashicons-trash').hide(); //for hiding the delete icon for the first row //function for handling add row in batch update dialog jQuery(document).off('click','#batch_update_add_delete_row .dashicons-plus').on('click','#batch_update_add_delete_row .dashicons-plus', function() { let count = jQuery('tr[id^=batch_update_action_row_]').length, current_id = 'batch_update_action_row_'+count; jQuery('.batch_update_table tr:last').before(""+ batch_update_actions_row +""); jQuery("#"+current_id).find('.batch_update_field, .batch_update_action').select2({ width: '15em', dropdownCssClass: 'sm_beta_batch_update_field', dropdownParent: jQuery('[aria-describedby="sm_inline_dialog"]') }); jQuery(this).hide(); }); //function for handling delete row in batch update dialog jQuery(document).off('click','#batch_update_add_delete_row .dashicons-trash').on('click','#batch_update_add_delete_row .dashicons-trash', function() { let add_row_visible = jQuery(this).closest('td').find('.dashicons-plus').is(":visible"); jQuery(this).closest('tr').remove(); if( add_row_visible === true ) { //condition for removing plus icon only if visible jQuery('tr[id^=batch_update_action_row_]:last()').find('.dashicons-plus').show(); } }); // For the time now Date.prototype.timeNow = function () { return ((this.getHours() < 10)?"0":"") + this.getHours() +":"+ ((this.getMinutes() < 10)?"0":"") + this.getMinutes() +":"+ ((this.getSeconds() < 10)?"0":"") + this.getSeconds(); } jQuery(document).on('change','.batch_update_field',function(){ let row_id = jQuery(this).closest('tr').attr('id'); let selected_field = jQuery( "#"+row_id+" .batch_update_field option:selected" ).val(), type = window.smart_manager.column_names_batch_update[selected_field].type, editor = window.smart_manager.column_names_batch_update[selected_field].editor, col_val = window.smart_manager.column_names_batch_update[selected_field].values, skip_default_action = false; // Formating options for default actions window.smart_manager.batch_update_action_options_default = window.smart_manager.batchUpdateSelectActionOption + ''+ window.smart_manager.batchUpdateCopyFromOption; jQuery(document).trigger("sm_batch_update_field_on_change",[row_id, selected_field, type, col_val]); if( type == 'numeric' ) { jQuery("#"+row_id+" .batch_update_action").empty().append(batch_update_action_options_number); } else if (type == 'text' || type == 'sm.longstring') { jQuery("#"+row_id+" .batch_update_action").empty().append(batch_update_action_options_string); } else if ( type == 'sm.datetime' ) { jQuery("#"+row_id+" .batch_update_action").empty().append(batch_update_action_options_datetime); } else if ( type == 'sm.multilist' || ( type == 'dropdown' && editor == 'select2' ) ) { jQuery("#"+row_id+" .batch_update_action").empty().append(batch_update_action_options_multilist); } else { jQuery("#"+row_id+" .batch_update_action").empty().append(window.smart_manager.batch_update_action_options_default); jQuery("#"+row_id+" .batch_update_action").find('[value="set_to"]').attr('selected','selected'); } let actionOptions = { 'batch_update_action_options_number': batch_update_action_options_number, 'batch_update_action_options_string': batch_update_action_options_string, 'batch_update_action_options_datetime': batch_update_action_options_datetime, 'batch_update_action_options_multilist': batch_update_action_options_multilist}; jQuery(document).trigger("sm_batch_update_field_post_on_change",[row_id, selected_field, type, col_val, actionOptions]); jQuery("#"+row_id+" .batch_update_value").val(''); jQuery("#"+row_id+" #batch_update_value_td").empty().append(''); if( skip_default_action === true ) { return; } if (type == 'sm.date' || type == 'sm.time' || type == 'sm.datetime' ) { let placeholder = 'YYYY-MM-DD' + ((type == 'sm.datetime') ? ' HH:MM:SS' : ''); placeholder = ( type == 'sm.time' ) ? 'H:i' : placeholder; jQuery("#"+row_id+" .batch_update_value").attr('placeholder',placeholder); let format = 'Y-m-d'+ ((type == 'sm.datetime') ? ' H:i:s' : ''); format = ( type == 'sm.time' ) ? 'H:i' : format; jQuery("#"+row_id+" .batch_update_value").Zebra_DatePicker({ format: format, show_icon: false, show_select_today: false, default_position: 'below', }); } else { jQuery("#"+row_id+" .batch_update_value").attr('placeholder',_x('Enter a value...', 'placeholder', 'smart-manager-for-wp-e-commerce')); let datepicker = jQuery("#"+row_id+" .batch_update_value").data('Zebra_DatePicker'); } if ( typeof (window.smart_manager.displayDefaultBatchUpdateValueHandler) !== "undefined" && typeof (window.smart_manager.displayDefaultBatchUpdateValueHandler) === "function" ) { dlgParams.btnParams.noCallback = window.smart_manager.displayDefaultBatchUpdateValueHandler( row_id ); } }); //Handling action change event only for 'datetime' type fields jQuery(document).on('change','.batch_update_action',function(){ let row_id = jQuery(this).closest('tr').attr('id'); let selected_field = jQuery( "#"+row_id+" .batch_update_field option:selected" ).val(), selected_action = jQuery( "#"+row_id+" .batch_update_action option:selected" ).val(), type = window.smart_manager.column_names_batch_update[selected_field].type; if( jQuery("#"+row_id+" #batch_update_value_td").find(".sm_batch_update_copy_from_ids").length > 0 || jQuery("#"+row_id+" #batch_update_value_td").find(".sm_batch_update_search_value").length > 0 ) { jQuery("#"+row_id+" #batch_update_value_td").empty().append(''); } if( type == 'sm.datetime' ) { let placeholder = ( selected_action == 'set_datetime_to' ) ? 'YYYY-MM-DD HH:MM:SS' : ( ( selected_action == 'set_date_to' ) ? 'YYYY-MM-DD' : 'HH:MM:SS' ); jQuery("#"+row_id+" .batch_update_value").attr('placeholder',placeholder); let format = ( selected_action == 'set_datetime_to' ) ? 'Y-m-d H:i:s' : ( ( selected_action == 'set_date_to' ) ? 'Y-m-d' : 'H:i:s' ); jQuery("#"+row_id+" .batch_update_value").Zebra_DatePicker({ format: format, show_icon: false, show_select_today: false, default_position: 'below', }); } //Code for handling 'copy from' functionality if( selected_action == 'copy_from' ) { let select_str = ''; let select2Params = { width: '15em', dropdownCssClass: 'sm_beta_batch_update_field', placeholder: sprintf( /* translators: %s: dashboard display name */ _x('Select %s', 'placeholder', 'smart-manager-for-wp-e-commerce'), window.smart_manager.dashboardDisplayName), dropdownParent: jQuery('[aria-describedby="sm_inline_dialog"]'), ajax: { url: window.smart_manager.sm_ajax_url, dataType: 'json', delay: 250, data: function( params ) { return { search_term : params.term, cmd :'get_batch_update_copy_from_record_ids', active_module : window.smart_manager.dashboard_key, security : window.smart_manager.sm_nonce, is_taxonomy : window.smart_manager.isTaxonomyDashboard() }; }, processResults: function( data ) { var terms = []; if ( data ) { jQuery.each( data, function( id, title ) { terms.push({ id: id, text: title }); }); } return { results: terms }; }, cache: true } } jQuery("#"+row_id+" #batch_update_value_td").empty().append(select_str); jQuery("#"+row_id+" #batch_update_value_td").find(".batch_update_value").select2(select2Params); } else if( selected_action == 'search_and_replace' ) { jQuery("#"+row_id+" #batch_update_value_td").empty().append(''); jQuery("#"+row_id+" #batch_update_value_td").append(''); } else { if ( typeof (window.smart_manager.displayDefaultBatchUpdateValueHandler) !== "undefined" && typeof (window.smart_manager.displayDefaultBatchUpdateValueHandler) === "function" ) { dlgParams.btnParams.noCallback = window.smart_manager.displayDefaultBatchUpdateValueHandler( row_id ); } } }); jQuery(document).off('click', ".batch_update_image").on('click', ".batch_update_image", function(event){ let row_id = jQuery(this).closest('tr').attr('id'); let file_frame; // If the media frame already exists, reopen it. if ( file_frame ) { file_frame.open(); return; } // Create the media frame. file_frame = wp.media.frames.file_frame = wp.media({ title: jQuery( this ).data( 'uploader_title' ), button: { text: jQuery( this ).data( 'uploader_button_text' ) }, multiple: false // Set to true to allow multiple files to be selected }); file_frame.on( 'open', function() { jQuery('[aria-describedby="sm_inline_dialog"]').hide(); }); file_frame.on( 'close', function() { jQuery('[aria-describedby="sm_inline_dialog"]').show(); }); // When an image is selected, run a callback. file_frame.on( 'select', function() { // We set multiple to false so only get one image from the uploader attachment = file_frame.state().get('selection').first().toJSON(); jQuery('#'+row_id+' .batch_update_image').attr('data-imageId',attachment['id']); jQuery('#'+row_id+' .batch_update_image').html(''); }); file_frame.open(); }); }; // ======================================================================== Smart_Manager.prototype.smToggleFullScreen = function (elem) { // ## The below if statement seems to work better ## if ((document.fullScreenElement && document.fullScreenElement !== null) || (document.msfullscreenElement && document.msfullscreenElement !== null) || (!document.mozFullScreen && !document.webkitIsFullScreen)) { if ((document.fullScreenElement !== undefined && document.fullScreenElement === null) || (document.msFullscreenElement !== undefined && document.msFullscreenElement === null) || (document.mozFullScreen !== undefined && !document.mozFullScreen) || (document.webkitIsFullScreen !== undefined && !document.webkitIsFullScreen)) { if (elem.requestFullScreen) { elem.requestFullScreen(); } else if (elem.mozRequestFullScreen) { elem.mozRequestFullScreen(); } else if (elem.webkitRequestFullScreen) { elem.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT); } else if (elem.msRequestFullscreen) { elem.msRequestFullscreen(); } } else { if (document.cancelFullScreen) { document.cancelFullScreen(); } else if (document.mozCancelFullScreen) { document.mozCancelFullScreen(); } else if (document.webkitCancelFullScreen) { document.webkitCancelFullScreen(); } else if (document.msExitFullscreen) { document.msExitFullscreen(); } } } Smart_Manager.prototype.smScreenHandler = function () { if( window.smart_manager.wpToolsPanelWidth === 0) { window.smart_manager.wpToolsPanelWidth = jQuery('#adminmenuwrap').width(); jQuery('#adminmenuback').hide(); jQuery('#adminmenuwrap').hide(); jQuery('#wpadminbar').hide(); jQuery('#wpcontent').css('margin-left', '0px'); window.smart_manager.grid_width = window.smart_manager.grid_width + window.smart_manager.wpToolsPanelWidth; window.smart_manager.grid_height = document.documentElement.offsetHeight - 260; } else { jQuery('#adminmenuback').show(); jQuery('#adminmenuwrap').show(); jQuery('#wpadminbar').show(); jQuery('#wpcontent').removeAttr("style"); window.smart_manager.grid_width = window.smart_manager.grid_width - window.smart_manager.wpToolsPanelWidth; window.smart_manager.grid_height = document.documentElement.offsetHeight - 360; window.smart_manager.wpToolsPanelWidth = 0; } window.smart_manager.hot.updateSettings({'width':window.smart_manager.grid_width, 'height': window.smart_manager.grid_height}); window.smart_manager.hot.render(); jQuery('#sm_top_bar, #sm_bottom_bar').css('width',window.smart_manager.grid_width+'px'); } if ( document.addEventListener ) { document.addEventListener('webkitfullscreenchange', window.smart_manager.smScreenHandler, false); document.addEventListener('mozfullscreenchange', window.smart_manager.smScreenHandler, false); document.addEventListener('fullscreenchange', window.smart_manager.smScreenHandler, false); document.addEventListener('MSFullscreenChange', window.smart_manager.smScreenHandler, false); } // Function to handle deletion of records Smart_Manager.prototype.deleteAllRecords = function(actionArgs){ if("undefined" !== typeof(window.smart_manager.deleteAndUndoRecords) && "function" === typeof(window.smart_manager.deleteAndUndoRecords)){ window.smart_manager.deleteAndUndoRecords({cmd:'delete_all',args:('undefined' !== typeof('actionArgs')) ? actionArgs:{}}); } } // Function to handle undo tasks Smart_Manager.prototype.undoTasks = function(){ if("undefined" !== typeof(window.smart_manager.deleteAndUndoRecords) && "function" === typeof(window.smart_manager.deleteAndUndoRecords)){ window.smart_manager.deleteAndUndoRecords({cmd:'undo'}); } } // Function to handle tasks deletion Smart_Manager.prototype.deleteTasks = function(){ if("undefined" !== typeof(window.smart_manager.deleteAndUndoRecords) && "function" === typeof(window.smart_manager.deleteAndUndoRecords)){ window.smart_manager.deleteAndUndoRecords({cmd:'delete'}); } } // Function to handle displaying tasks Smart_Manager.prototype.showTasks = function(){ let props = [window.smart_manager.displayTasks,window.smart_manager.resetSearch,window.smart_manager.setDashboardDisplayName,window.smart_manager.load_dashboard,window.smart_manager.isTasksEnabled,window.smart_manager.reset]; if(!props && !(props.every(prop => ("undefined" === typeof(prop) && "function" !== typeof(prop))))){ return; } if(0 === jQuery(".sm_top_bar_action_btns:nth-last-child(5)").find('#undo_sm_editor_grid').length){ jQuery("#sm_top_bar_left .sm_top_bar_action_btns:nth-last-child(5)").append('' + ''); } window.smart_manager.displayTasks({showHideTasks: window.smart_manager.isTasksEnabled()}); window.smart_manager.reset(true); jQuery('#sm_nav_bar_search #search_content').html( ( window.smart_manager.searchType == 'simple' ) ? window.smart_manager.simpleSearchContent : window.smart_manager.advancedSearchContent); window.smart_manager.resetSearch(); window.smart_manager.setDashboardDisplayName(); window.smart_manager.load_dashboard(); } // Display title modal Smart_Manager.prototype.showTitleModal = function(params = {}) { if(!window.smart_manager.processName || !window.smart_manager.processContent){ return; } let title = sprintf( /* translators: %s: Task process content */ _x('Edited %s','process title','smart-manager-for-wp-e-commerce'),window.smart_manager.processContent) let modalTitle = _x('Task Title','modal title','smart-manager-for-wp-e-commerce'); let taskContent = ''; let taskDesc = sprintf( /* translators: %s: Undo modal description */ _x('Name the task for easier reference and future actions, especially for %s option. A pre-filled title has been suggested based on your changes.','modal description','smart-manager-for-wp-e-commerce'), ''+_x('Undo','modal description','smart-manager-for-wp-e-commerce')+''); if(0 === window.smart_manager.showTasksTitleModal){ window.smart_manager.updatedTitle = title if("function" === typeof(window.smart_manager.processCallback)){ ("undefined" !== typeof(window.smart_manager.processCallbackParams) && Object.keys(window.smart_manager.processCallbackParams).length > 0) ? window.smart_manager.processCallback(window.smart_manager.processCallbackParams) : window.smart_manager.processCallback() } return; }else if(window.smart_manager.scheduledActionContent){ modalTitle = _x('Schedule Bulk Edit','modal title','smart-manager-for-wp-e-commerce'); content = '
            '+taskContent+'
            '+taskDesc+'

            '+window.smart_manager.scheduledActionContent+'
            '; }else{ content = '
            '+taskDesc+'
            '+taskContent+'
            '; } window.smart_manager.modal = { title: modalTitle, content: content, autoHide: false, cta: { title: _x('Ok','button','smart-manager-for-wp-e-commerce'), closeModalOnClick: params.hasOwnProperty('btnParams') ? ((params.btnParams.hasOwnProperty('hideOnYes')) ? params.btnParams.hideOnYes : true) : true, callback: function(){ if(window.smart_manager.isScheduled){ if("undefined" !== typeof(window.smart_manager.scheduledForVal) && "function" === typeof(window.smart_manager.scheduledForVal)){ window.smart_manager.scheduledForVal(); } if(!(window.smart_manager.scheduledFor)){ window.smart_manager.notification = {message: _x('Please select your desired date & time for scheduling an action.', 'notification', 'smart-manager-for-wp-e-commerce')} window.smart_manager.showNotification() return; } if("undefined" !== typeof(window.smart_manager.hideModal) && "function" === typeof(window.smart_manager.hideModal)){ window.smart_manager.hideModal(); } } let updatedTitle = jQuery('#sm_add_title').val(); if(updatedTitle){ window.smart_manager.updatedTitle = updatedTitle; if("function" === typeof(window.smart_manager.processCallback)){ ("undefined" !== typeof(window.smart_manager.processCallbackParams) && Object.keys(window.smart_manager.processCallbackParams).length > 0) ? window.smart_manager.processCallback(window.smart_manager.processCallbackParams) : window.smart_manager.processCallback() } } } }, closeCTA: {title: _x('Cancel','button','smart-manager-for-wp-e-commerce')}, onCreate: function(){ if("undefined" !== typeof(window.smart_manager.scheduleDatePicker) && "function" === typeof(window.smart_manager.scheduleDatePicker)){ window.smart_manager.scheduleDatePicker(); } } } window.smart_manager.showModal() } // Function to handle records deletion, tasks undo and deletion of tasks records Smart_Manager.prototype.deleteAndUndoRecords = function(params = {}){ if(!params || (0 === Object.keys(params).length) || (false === params.hasOwnProperty('cmd')) || !params['cmd'] || ((0 === window.smart_manager.selectedRows.length && !window.smart_manager.selectAll) && (!window.smart_manager.selectedAllTasks))){ return; } window.smart_manager.selectAll = (window.smart_manager.selectedAllTasks || window.smart_manager.selectAll) ? true : false; params.data = { cmd:params['cmd'], active_module: window.smart_manager.dashboard_key, security: window.smart_manager.sm_nonce, selected_ids: JSON.stringify(window.smart_manager.getSelectedKeyIds().sort(function(a, b){return b-a})), storewide_option: (window.smart_manager.selectAll) ? 'entire_store' : '', active_module_title: window.smart_manager.dashboardName, backgroundProcessRunningMessage: window.smart_manager.backgroundProcessRunningMessage, pro: true, SM_IS_WOO30: (window.smart_manager.sm_is_woo30) ? window.smart_manager.sm_is_woo30 : '', SM_IS_WOO22: (window.smart_manager.sm_id_woo22) ? window.smart_manager.sm_id_woo22 : '', SM_IS_WOO21: (window.smart_manager.sm_is_woo21) ? window.smart_manager.sm_is_woo21 : '' }; let processName = '', tasksParams = ['undo','delete']; let currentProcessName = ''; if(tasksParams.includes(params['cmd'])){ params.data.isTasks = 1; } switch(params['cmd']){ case 'delete_all': processName = _x('Delete Records','progressbar modal title','smart-manager-for-wp-e-commerce'); params.data.deletePermanently = (params.hasOwnProperty('args') && (params.args.hasOwnProperty('deletePermanently'))) ? params.args.deletePermanently : 0; currentProcessName = (params.data.deletePermanently) ? 'delete_permanently' : 'move_to_trash'; break; case 'undo': processName = _x('Undo Tasks','progressbar modal title','smart-manager-for-wp-e-commerce'); currentProcessName = 'undo'; break; case 'delete': processName = _x('Delete Tasks','progressbar modal title','smart-manager-for-wp-e-commerce'); currentProcessName = 'delete'; break; } setTimeout(function(){ window.smart_manager.showProgressDialog(processName); if("undefined" !== typeof(sa_sm_background_process_heartbeat) && "function" === typeof(sa_sm_background_process_heartbeat)){ sa_sm_background_process_heartbeat(1000, currentProcessName); } },1); params.showLoader = false; if(window.smart_manager.isFilteredData()){ params.data.filteredResults = 1; } window.smart_manager.send_request(params,function(response){}); } // Function for displaying warning modal before doing undo/delete tasks records Smart_Manager.prototype.taskActionsModal = function(args = {}){ if(!args || !((Object.keys(args)).every(arg => args.hasOwnProperty(arg)))){ return; } window.smart_manager.selectedAllTasks = (['sm_beta_undo_all_tasks','sm_beta_delete_all_tasks'].includes(args.id)) ? true : false; if(0 === window.smart_manager.selectedRows.length && !window.smart_manager.selectAll && !window.smart_manager.selectedAllTasks){ window.smart_manager.notification = {message: _x('Please select a task','notification','smart-manager-for-wp-e-commerce')} window.smart_manager.showNotification() return false; } let undoTaskIds = (['sm_beta_undo_selected','sm_beta_undo_all_tasks'].includes(args.id)) ? 1 : 0, deleteTasks = (['sm_beta_delete_selected_tasks','sm_beta_delete_all_tasks'].includes(args.id)) ? 1 : 0, params = {}, paramsContent = ''; params.btnParams = {} params.title = ' '+_x('Attention!', 'modal title', 'smart-manager-for-wp-e-commerce')+''; switch(true){ case (undoTaskIds && "undefined" !== typeof(window.smart_manager.undoTasks) && "function" === typeof(window.smart_manager.undoTasks)): paramsContent = _x('undo', 'modal content', 'smart-manager-for-wp-e-commerce'); params.btnParams.yesCallback = window.smart_manager.undoTasks; break; case (deleteTasks && "undefined" !== typeof(window.smart_manager.deleteTasks) && "function" === typeof(window.smart_manager.deleteTasks)): paramsContent = '' + _x('delete', 'modal content', 'smart-manager-for-wp-e-commerce') + ''; params.btnParams.yesCallback = window.smart_manager.deleteTasks; break; } params.content = _x('Are you sure you want to '+paramsContent+' ', 'modal content', 'smart-manager-for-wp-e-commerce') + ''+ args.btnText.toLowerCase() + '?'; if(window.smart_manager.selectedRows.length > 0 || window.smart_manager.loadedTotalRecords){ params.btnParams.hideOnYes = false; window.smart_manager.showConfirmDialog(params); } else{ window.smart_manager.notification = {message: _x('No task to '+paramsContent, 'warning', 'smart-manager-for-wp-e-commerce')} window.smart_manager.showNotification() } } // Function for handling display of editor for column titles Smart_Manager.prototype.displayColumnTitleEditor = function(e){ let parent = e.target.closest('li'); if(!parent) return; let input = parent.querySelector("input[type='text']"); if(!input) return; let cssClass = 'sm-column-title-input-edit'; input.readOnly = !input.readOnly; if(input.readOnly){ input.classList.remove(cssClass) }else{ input.classList.add(cssClass); input.focus(); //Code for setting the cursor at end of input let val = input.value; input.value = ''; input.value = val; } } // Function for scheduling bulk edit Smart_Manager.prototype.showScheduleModal = function(params = {}) { if(!params || Object.keys(params).length === 0){ return; } let description = sprintf( /* translators: %s: schedule actions modal description */ _x('Schedule actions at your convenient date and time.','modal description','smart-manager-for-wp-e-commerce'), ''+_x('Schedule Actions','modal description','smart-manager-for-wp-e-commerce')+''); let scheduledForContent = `
            ${window.smart_manager.scheduledActionAdminUrl ? `
            ${_x( `Check all scheduled actions here.`, 'scheduled action list', 'smart-manager-for-e-commerce' )}
            ` : ''}
            ${_x('Note: ', 'modal description', 'smart-manager-for-wp-e-commerce')}${_x('Scheduled actions follow timezone of your site. Avoid overlaps to prevent delays.','modal description','smart-manager-for-wp-e-commerce')}
            `; window.smart_manager.scheduledActionContent = '
            '+description+'
            '+scheduledForContent+'
            '; window.smart_manager.modal = { title: _x('Schedule Bulk Edit','modal title','smart-manager-for-wp-e-commerce'), content: window.smart_manager.scheduledActionContent, autoHide: false, width: 'w-1/4', cta: { title: _x('Ok','button','smart-manager-for-wp-e-commerce'), closeModalOnClick: params.hasOwnProperty('btnParams') ? ((params.btnParams.hasOwnProperty('hideOnYes')) ? params.btnParams.hideOnYes : true) : true, callback: function(){ if(window.smart_manager.isScheduled){ if("undefined" !== typeof(window.smart_manager.scheduledForVal) && "function" === typeof(window.smart_manager.scheduledForVal)){ window.smart_manager.scheduledForVal(); } if(!(window.smart_manager.scheduledFor)){ window.smart_manager.notification = {message: _x('Please select your desired date & time for scheduling an action.', 'notification', 'smart-manager-for-wp-e-commerce')} window.smart_manager.showNotification() return; } } if("function" === typeof(window.smart_manager.processCallback)){ ("undefined" !== typeof(window.smart_manager.processCallbackParams) && Object.keys(window.smart_manager.processCallbackParams).length > 0) ? window.smart_manager.processCallback(window.smart_manager.processCallbackParams) : window.smart_manager.processCallback() } if("undefined" !== typeof(window.smart_manager.hideModal) && "function" === typeof(window.smart_manager.hideModal)){ window.smart_manager.hideModal(); } } }, closeCTA: {title: _x('Cancel','button','smart-manager-for-wp-e-commerce')}, onCreate: function(){ if("undefined" !== typeof(window.smart_manager.scheduleDatePicker) && "function" === typeof(window.smart_manager.scheduleDatePicker)){ window.smart_manager.scheduleDatePicker(); } } } if(1 === window.smart_manager.showTasksTitleModal){ if("undefined" !== typeof(window.smart_manager.showTitleModal) && "function" === typeof(window.smart_manager.showTitleModal)){ window.smart_manager.scheduledActionContent = scheduledForContent; window.smart_manager.showTitleModal({btnParams:{hideOnYes: false}}) } }else{ window.smart_manager.showModal() } } // Function for initializing datepicker for schedule bulk edit Smart_Manager.prototype.scheduleDatePicker = function() { if(window.smart_manager.scheduledActionContent){ jQuery('#scheduled_for').Zebra_DatePicker({ format: 'Y-m-d H:i:s', show_icon: false, show_select_today: false, default_position: 'below', readonly_element: false, }) .attr('placeholder','YYYY-MM-DD HH:MM:SS') } } // Function for getting scheduled for value Smart_Manager.prototype.scheduledForVal = function() { window.smart_manager.scheduledFor = jQuery("#scheduled_for").val(); } // ======================================================================== // PRIVILEGE SETTINGS UPDATE // ======================================================================== Smart_Manager.prototype.privilegeSettingsUpdate = function(){ if((window.smart_manager.privilegeSettingsRules.length <= 0)){ return; } window.smart_manager.send_request({ data: { cmd: 'save_access_privilege_settings', active_module: 'access-privilege', security: window.smart_manager.sm_nonce, access_privileges: JSON.stringify(window.smart_manager.privilegeSettingsRules) }, data_type: 'json' }, function(response){ let ack = (response.hasOwnProperty('ACK')) ? response.ACK : '' if('success' === ack){ window.smart_manager.notification = {status:'success', message: _x('Privilege settings saved successfully!', 'access privilege settings notification', 'smart-manager-for-wp-e-commerce'), hideDelay: 2000} window.smart_manager.showNotification() } }); }pro/assets/js/smart-manager-product.js000064400000030775147600337620014060 0ustar00;;; // Code for adding Add Attribute & Remove Attribute in Batch Update jQuery(document).on('smart_manager_post_load_grid','#sm_editor_grid', function() { if( window.smart_manager.current_selected_dashboard == 'product' && typeof(window.smart_manager.column_names_batch_update) != 'undefined' ) { //Code for handling Product Attribute if( typeof(window.smart_manager.column_names_batch_update['custom/product_attributes']) != 'undefined' && Object.keys(window.smart_manager.column_names_batch_update['custom/product_attributes']['values']).length > 0 ) { let attrObj = window.smart_manager.column_names_batch_update['custom/product_attributes']; let attributes = window.smart_manager.column_names_batch_update['custom/product_attributes']['values']; // Code for handling in new UI let attributesActions = {} let attributesValues = {} attributes.forEach((attr) => { let key = attr.hasOwnProperty('key') ? attr.key : '' if(key != ''){ let valObj = attr.hasOwnProperty('value') ? attr.value : {} attributesActions[key] = (valObj.hasOwnProperty('lbl')) ? valObj.lbl : '' let values = valObj.hasOwnProperty('val') ? valObj.val : {} if(Object.keys(values).length > 0){ attributesValues[key] = [{'key': 'all', 'value': 'All'}] Object.keys(values).forEach((valKey) => { attributesValues[key].push({'key': valKey, 'value': values[valKey]}) }) } } }) window.smart_manager.column_names_batch_update['custom/product_attributes']['actions'] = {...window.smart_manager.batch_update_actions['multilist'], ...{copy_from: _x('copy from', 'Bulk Edit option for WooCommerce product attribute', 'smart-manager-for-wp-e-commerce')}}; [ 'set_to', 'copy_from_field' ].forEach(prop => delete window.smart_manager.column_names_batch_update['custom/product_attributes']['actions'][prop]) window.smart_manager.column_names_batch_update['custom/product_attributes']['additionalValues'] = attributesActions window.smart_manager.column_names_batch_update['custom/product_attributes']['values'] = attributesValues window.smart_manager.column_names_batch_update['custom/product_attributes']['type'] = 'dropdown'; if(!window.smart_manager.column_names_batch_update['custom/product_attributes']['additionalValues'].hasOwnProperty('custom')) { window.smart_manager.column_names_batch_update['custom/product_attributes']['additionalValues']['custom'] = 'Custom'; } } //Code for handling Product Category // if( typeof(window.smart_manager.column_names_batch_update['terms/product_cat']) != 'undefined' && Object.keys(window.smart_manager.column_names_batch_update['terms/product_cat']['values']).length > 0 ) { // let attrObj = window.smart_manager.column_names_batch_update['terms/product_cat'], // categories = window.smart_manager.column_names_batch_update['terms/product_cat']['values'], // parentCategories = [], // childCategories = {}, // parentCategoriesObj = {}; // categories.forEach((cat) => { // let val = (cat.hasOwnProperty('value')) ? cat.value : {} // let title = (val.hasOwnProperty('term')) ? val.term : '' // parentCategories.push({'key': cat.key, 'value': title}); // parentCategoriesObj[cat.key] = title // let parent = (val.hasOwnProperty('parent')) ? val.parent : 0 // let parentExists = false // for(let i=0; i 0 && parentExists ) { // if( typeof(childCategories[parent]) == 'undefined' ) { // childCategories[parent] = []; // } // childCategories[parent].push({'key': cat.key, 'value': title}); // } // }); // //Code for parent categories // if( Object.keys(parentCategories).length > 0 ) { // window.smart_manager.column_names_batch_update['custom/product_cat_parent'] = JSON.parse( JSON.stringify( attrObj ) ); // window.smart_manager.column_names_batch_update['custom/product_cat_parent']['name'] = 'Categories'; // window.smart_manager.column_names_batch_update['custom/product_cat_parent']['title'] = window.smart_manager.column_names_batch_update['custom/product_cat_parent']['name']; // window.smart_manager.column_names_batch_update['custom/product_cat_parent']['type'] = 'multilist'; // window.smart_manager.column_names_batch_update['custom/product_cat_parent']['values'] = parentCategories; // } // //Code for child categories // if( Object.keys(childCategories).length > 0 ) { // Object.entries(childCategories).forEach(([key, obj]) => { // let parentCatName = ( parentCategoriesObj[key] ) ? parentCategoriesObj[key] : ''; // let pkey = 'custom/product_cat_'+window.smart_manager.convert_to_slug(parentCatName); // window.smart_manager.column_names_batch_update[pkey] = JSON.parse( JSON.stringify( attrObj ) ); // window.smart_manager.column_names_batch_update[pkey]['name'] = 'Categories: '+parentCatName; // window.smart_manager.column_names_batch_update[pkey]['title'] = window.smart_manager.column_names_batch_update[pkey]['name']; // window.smart_manager.column_names_batch_update[pkey]['type'] = 'multilist'; // window.smart_manager.column_names_batch_update[pkey]['values'] = obj; // }); // } // delete window.smart_manager.column_names_batch_update['terms/product_cat']; // } } }) //Code to handle after change of batch update field .on('smart_manager_post_format_columns','#sm_editor_grid', function() { if(window.smart_manager.column_names_batch_update['postmeta/meta_key=_regular_price/meta_value=_regular_price']){ window.smart_manager.column_names_batch_update['postmeta/meta_key=_regular_price/meta_value=_regular_price']['custom_actions'] = {set_to_sale_price: _x('set to sale price', 'bulk edit option for WooCommerce product price', 'smart-manager-for-wp-e-commerce')} } if(window.smart_manager.column_names_batch_update['postmeta/meta_key=_sale_price/meta_value=_sale_price']){ window.smart_manager.column_names_batch_update['postmeta/meta_key=_sale_price/meta_value=_sale_price']['custom_actions'] = {set_to_regular_price: _x('set to regular price', 'bulk edit option for WooCommerce product price', 'smart-manager-for-wp-e-commerce')} } }) //Code to handle after change of batch update field in case of product attributes and categories .on('sm_batch_update_field_on_change', function(e, rowId, selectedField, type, colVal) { if( jQuery("#"+rowId+" #batch_update_value_td_2").length ) { //handling for removing custom attribute td jQuery("#"+rowId+" #batch_update_value_td_2").remove(); } if( jQuery('#batchmod_sm_editor_grid #batch_update_value_td_2').length == 0 ) { //handling for restoring the batch update dialog size jQuery("#batchmod_sm_editor_grid").css('width','640px'); } if( selectedField == 'custom/product_attributes' ) { window.smart_manager.batch_update_action_options_default = ''; if( Object.keys(colVal).length > 0 ) { for( attr_nm in colVal ) { window.smart_manager.batch_update_action_options_default += ''; } } } else if( selectedField.indexOf('custom/product_cat') != -1 ) { window.smart_manager.batch_update_action_options_default = ''+ ''+ ''+ ''; } }) //Code to handle after change of batch update field in regular & sales price .on('sm_batch_update_field_post_on_change', function(e, rowId, selectedField, type, colVal, actionOptions) { if( selectedField == 'postmeta/meta_key=_regular_price/meta_value=_regular_price' || selectedField == 'postmeta/meta_key=_sale_price/meta_value=_sale_price' ) { let option = ( selectedField == 'postmeta/meta_key=_regular_price/meta_value=_regular_price' ) ? 'set_to_sale_price' : 'set_to_regular_price'; actionOptions.batch_update_action_options_number += ''; jQuery("#"+rowId+" .batch_update_action").empty().append(actionOptions.batch_update_action_options_number); } }) //Code to handle after specific attribute has been selected in case of add or remove attribute .on('change','.batch_update_action',function(){ let rowId = jQuery(this).closest('tr').attr('id'), selectedField = jQuery( "#"+rowId+" .batch_update_field option:selected" ).val(), selectedAction = jQuery( "#"+rowId+" .batch_update_action option:selected" ).val(), type = window.smart_manager.column_names_batch_update[selectedField].type, colVal = window.smart_manager.column_names_batch_update[selectedField].values; if( selectedAction == 'set_to_sale_price' || selectedAction == 'set_to_regular_price' ) { jQuery("#"+rowId+" #batch_update_value_td").hide(); } else { jQuery("#"+rowId+" #batch_update_value_td").show(); } if( jQuery("#"+rowId+" #batch_update_value_td_2").length ) { //handling for removing custom attribute td jQuery("#"+rowId+" #batch_update_value_td_2").remove(); } if( jQuery('#batchmod_sm_editor_grid #batch_update_value_td_2').length == 0 ) { //handling for restoring the batch update dialog size jQuery("#batchmod_sm_editor_grid").css('width','640px'); } if( selectedField == 'custom/product_attributes' ) { if( selectedAction != 'custom' ) { //code for handling action for non-custom attribute let batchUpdateValueOptions = '', batchUpdateValueSelectOptions = '', valueOptionsEmpty = true; if( typeof (colVal[selectedAction]) != 'undefined' && typeof (colVal[selectedAction].val) != 'undefined' ) { colVal = colVal[selectedAction].val; for (var key in colVal) { if( typeof (colVal[key]) != 'object' && typeof (colVal[key]) != 'Array' ) { valueOptionsEmpty = false; batchUpdateValueSelectOptions += ''; } } } if( valueOptionsEmpty === false ) { batchUpdateValueOptions = ''; jQuery("#"+rowId+" #batch_update_value_td").empty().append(batchUpdateValueOptions) jQuery("#"+rowId+" #batch_update_value_td").find('.batch_update_value').select2({ width: '15em', dropdownCssClass: 'sm_beta_batch_update_field', dropdownParent: jQuery('[aria-describedby="sm_inline_dialog"]') }); } } else { //code for handling action for custom attribute jQuery("#"+rowId+" #batch_update_value_td").html(""); jQuery("").insertAfter("#"+rowId+" #batch_update_value_td"); jQuery("#batchmod_sm_editor_grid").css('width','760px'); } } }) //Code to make changes to batch_update_actons on batch update form submit for custom attribute handling .off('sm_batch_update_on_submit').on('sm_batch_update_on_submit',function(){ let index = 0; jQuery('tr[id^=batch_update_action_row_]').each(function() { let value2 = jQuery(this).find('.batch_update_value_2').val(); if( typeof (value2) != 'undefined' ) { window.smart_manager.batch_update_actions[index].value2 = value2; } index++; }); });pro/classes/class-smart-manager-pro-base.php000064400000173115147600337620015101 0ustar00dashboard_key = $dashboard_key; parent::__construct($dashboard_key); $this->advance_search_operators = array_merge( $this->advance_search_operators, array( 'startsWith' => 'like', 'endsWith' => 'like', 'anyOf' => 'like', 'notStartsWith' => 'not like', 'notEndsWith' => 'not like', 'notAnyOf' => 'not like' ) ); add_filter( 'sm_dashboard_model', array( &$this, 'pro_dashboard_model' ), 11, 2 ); add_filter( 'sm_data_model', array( &$this, 'pro_data_model' ), 11, 2); add_filter( 'sm_inline_update_pre', array( &$this, 'pro_inline_update_pre' ), 11, 1); add_filter( 'sm_default_dashboard_model_postmeta_cols', array( &$this, 'pro_custom_postmeta_cols' ), 11, 1 ); // Code for handling of `starts with/ends with` advanced search operators $advanced_search_filter_tables = array( 'posts', 'postmeta', 'terms' ); switch( $this->advanced_search_table_types ) { case ( ! empty( $this->advanced_search_table_types['flat'] ) && ! empty( $this->advanced_search_table_types['meta'] ) ): $advanced_search_filter_tables = array_merge( array_merge( array_keys( $this->advanced_search_table_types['flat'] ), array_keys( $this->advanced_search_table_types['meta'] ) ), array( 'terms' ) ); break; case ( ! empty( $this->advanced_search_table_types['flat'] ) && empty( $this->advanced_search_table_types['meta'] ) ): $advanced_search_filter_tables = array_merge( array_keys( $this->advanced_search_table_types['flat'] ), array( 'terms' ) ); break; case ( empty( $this->advanced_search_table_types['flat'] ) && ! empty( $this->advanced_search_table_types['meta'] ) ): $advanced_search_filter_tables = array_merge( array_keys( $this->advanced_search_table_types['meta'] ), array( 'terms' ) ); break; } if( ! empty( $advanced_search_filter_tables ) && is_array( $advanced_search_filter_tables ) ){ foreach( $advanced_search_filter_tables as $table ){ add_filter( 'sm_search_format_query_' . $table . '_col_value', array( &$this, 'format_search_value' ), 11, 2 ); add_filter( 'sm_search_'. $table .'_cond', array( &$this, 'modify_search_cond' ), 11, 2 ); } } add_filter( 'sm_get_process_names_for_adding_tasks', function( $process_name = '' ) { if( empty( $process_name ) ) { return; } return array( 'Bulk Edit', ); } ); if ( 'yes' === Smart_Manager_Settings::get( 'delete_media_when_permanently_deleting_post_type_records' ) ) { add_action( 'before_delete_post', array( &$this, 'delete_attached_media' ), 11, 2 ); } } public function get_yoast_meta_robots_values() { return array( '-' => __( 'Site-wide default', 'smart-manager-for-wp-e-commerce' ), 'none' => __( 'None', 'smart-manager-for-wp-e-commerce' ), 'noimageindex' => __( 'No Image Index', 'smart-manager-for-wp-e-commerce' ), 'noarchive' => __( 'No Archive', 'smart-manager-for-wp-e-commerce' ), 'nosnippet' => __( 'No Snippet', 'smart-manager-for-wp-e-commerce' ) ); } public function get_rankmath_robots_values() { return array( 'index' => __( 'Index', 'smart-manager-for-wp-e-commerce' ), 'noindex' => __( 'No Index', 'smart-manager-for-wp-e-commerce' ), 'nofollow' => __( 'No Follow', 'smart-manager-for-wp-e-commerce' ), 'noarchive' => __( 'No Archive', 'smart-manager-for-wp-e-commerce' ), 'noimageindex' => __( 'No Image Index', 'smart-manager-for-wp-e-commerce' ), 'nosnippet' => __( 'No Snippet', 'smart-manager-for-wp-e-commerce' ) ); } public function get_rankmath_seo_score_class( $score ) { if ( $score > 80 ) { return 'great'; } if ( $score > 51 && $score < 81 ) { return 'good'; } return 'bad'; } //Filter to add custom columns public function pro_custom_postmeta_cols( $postmeta_cols ) { $yoast_pm_cols = $rank_math_pm_cols = array(); $active_plugins = (array) get_option( 'active_plugins', array() ); if ( is_multisite() ) { $active_plugins = array_merge( $active_plugins, get_site_option( 'active_sitewide_plugins', array() ) ); } if ( ( in_array( 'wordpress-seo/wp-seo.php', $active_plugins, true ) || array_key_exists( 'wordpress-seo/wp-seo.php', $active_plugins ) ) ) { $yoast_pm_cols = array('_yoast_wpseo_metakeywords','_yoast_wpseo_title','_yoast_wpseo_metadesc','_yoast_wpseo_meta-robots-noindex','_yoast_wpseo_primary_product_cat','_yoast_wpseo_focuskw_text_input','_yoast_wpseo_linkdex','_yoast_wpseo_focuskw','_yoast_wpseo_redirect','_yoast_wpseo_primary_category','_yoast_wpseo_content_score','_yoast_wpseo_meta-robots-nofollow','_yoast_wpseo_primary_kbe_taxonomy','_yoast_wpseo_opengraph-title','_yoast_wpseo_opengraph-description','_yoast_wpseo_primary_wpm-testimonial-category','_yoast_wpseo_twitter-title','_yoast_wpseo_twitter-description', '_yoast_wpseo_opengraph-image', '_yoast_wpseo_opengraph-image-id', '_yoast_wpseo_twitter-image', '_yoast_wpseo_twitter-image-id', '_yoast_wpseo_focuskeywords'); } if( !empty( $yoast_pm_cols ) ) { foreach( $yoast_pm_cols as $meta_key ) { if( !isset( $postmeta_cols[ $meta_key ] ) ) { $postmeta_cols[ $meta_key ] = array( 'meta_key' => $meta_key, 'meta_value' => '' ); } } } if ( ( in_array( 'seo-by-rank-math/rank-math.php', $active_plugins, true ) || array_key_exists( 'seo-by-rank-math/rank-math.php', $active_plugins ) ) ) { $rank_math_pm_cols = array('rank_math_title','rank_math_description','rank_math_focus_keyword','rank_math_canonical_url','rank_math_facebook_title','rank_math_facebook_description','rank_math_twitter_title','rank_math_twitter_description','rank_math_breadcrumb_title', 'rank_math_robots', 'rank_math_seo_score', 'rank_math_facebook_image', 'rank_math_twitter_image_id', 'rank_math_twitter_image', 'rank_math_twitter_image_id', 'rank_math_primary_product_cat'); } if( !empty( $rank_math_pm_cols ) ) { foreach( $rank_math_pm_cols as $meta_key ) { if( !isset( $postmeta_cols[ $meta_key ] ) ) { $postmeta_cols[ $meta_key ] = array( 'meta_key' => $meta_key, 'meta_value' => '' ); } } } return $postmeta_cols; } //Function to handle custom fields common in more than 1 post type public function pro_dashboard_model( $dashboard_model, $dashboard_model_saved ) { $colum_name_titles = array( '_yoast_wpseo_title' => __( 'Yoast SEO Title', 'smart-manager-for-wp-e-commerce' ), '_yoast_wpseo_metadesc' => __( 'Yoast Meta Description', 'smart-manager-for-wp-e-commerce' ), '_yoast_wpseo_metakeywords' => __( 'Yoast Meta Keywords', 'smart-manager-for-wp-e-commerce' ), '_yoast_wpseo_focuskw' => __( 'Yoast Focus Keyphrase', 'smart-manager-for-wp-e-commerce' ), ); $html_columns = array( '_yoast_wpseo_content_score' => __( 'Yoast Readability Score', 'smart-manager-for-wp-e-commerce' ), '_yoast_wpseo_linkdex' => __( 'Yoast SEO Score', 'smart-manager-for-wp-e-commerce' ), 'rank_math_seo_score' => __( 'Rank Math SEO Score', 'smart-manager-for-wp-e-commerce' ) ); $product_cat_index = sm_multidimesional_array_search('terms_product_cat', 'data', $dashboard_model['columns']); $column_model = &$dashboard_model['columns']; foreach( $column_model as $key => &$column ) { if ( empty( $column['src'] ) ) continue; $src_exploded = explode("/",$column['src']); if (empty($src_exploded)) { $col_nm = $column['src']; } if ( sizeof($src_exploded) > 2 ) { $col_table = $src_exploded[0]; $cond = explode("=",$src_exploded[1]); if (sizeof($cond) == 2) { $col_nm = $cond[1]; } } else { $col_nm = $src_exploded[1]; $col_table = $src_exploded[0]; } switch( $col_nm ) { case '_yoast_wpseo_meta-robots-noindex': $column['key'] = $column['name'] = sprintf( /* translators: %1$s: dashboard title */ __( 'Allow search engines to show this %1$s in search results?', 'smart-manager-for-wp-e-commerce' ), rtrim( $this->dashboard_title, 's' ) ); $yoast_noindex = array( '0' => __( 'Default', 'smart-manager-for-wp-e-commerce'), '2' => __( 'Yes', 'smart-manager-for-wp-e-commerce' ), '1' => __( 'No', 'smart-manager-for-wp-e-commerce' ) ); $column = $this->generate_dropdown_col_model( $column, $yoast_noindex ); break; case '_yoast_wpseo_meta-robots-nofollow': $column['key'] = $column['name'] = sprintf( /* translators: %1$s: dashboard title */ __( 'Should search engines follow links on this %1$s?', 'smart-manager-for-wp-e-commerce' ), rtrim( $this->dashboard_title, 's' ) ); $yoast_nofollow = array('0' => __( 'Yes', 'smart-manager-for-wp-e-commerce' ), '1' => __( 'No', 'smart-manager-for-wp-e-commerce' ) ); $column = $this->generate_dropdown_col_model( $column, $yoast_nofollow ); break; case '_yoast_wpseo_meta-robots-adv': $column['key'] = $column['name'] = __( 'Meta robots advanced', 'smart-manager-for-wp-e-commerce' ); $values = $this->get_yoast_meta_robots_values(); $column = $this->generate_multilist_col_model( $column, $values ); break; case 'rank_math_robots': $column['key'] = $column['name'] = __( 'Robots Meta', 'smart-manager-for-wp-e-commerce' ); $values = $this->get_rankmath_robots_values(); $column = $this->generate_multilist_col_model( $column, $values ); break; case ($col_nm == '_yoast_wpseo_primary_product_cat' || $col_nm == 'rank_math_primary_product_cat'): $product_cat_values = array(); $taxonomy_terms = get_terms('product_cat', array('hide_empty'=> 0,'orderby'=> 'id')); if( !empty( $taxonomy_terms ) ) { foreach ($taxonomy_terms as $term_obj) { $product_cat_values[$term_obj->term_id] = array(); $product_cat_values[$term_obj->term_id]['term'] = $term_obj->name; $product_cat_values[$term_obj->term_id]['parent'] = $term_obj->parent; } } $values = $parent_cat_term_ids = array(); foreach( $product_cat_values as $term_id => $obj ) { $values[ $term_id ] = $obj['term']; if( !empty( $obj['parent'] ) ) { $values[ $term_id ] = ( ! empty( $product_cat_values[ $obj['parent'] ] ) ) ? $product_cat_values[ $obj['parent'] ]['term']. ' > ' .$values[ $term_id ] : $values[ $term_id ]; if( in_array( $obj['parent'], $parent_cat_term_ids ) === false ) { $parent_cat_term_ids[] = $obj['parent']; } } } //Code for unsetting the parent category ids if( !empty( $parent_cat_term_ids ) ) { foreach( $parent_cat_term_ids as $parent_id ) { if( isset( $values[ $parent_id ] ) ) { unset( $values[ $parent_id ] ); } } } $column = $this->generate_dropdown_col_model( $column, $values ); break; case ( !empty( $colum_name_titles[ $col_nm ] ) ): $column['key'] = $column['name'] = $colum_name_titles[ $col_nm ]; break; case ( !empty( $html_columns[ $col_nm ] ) ): $column['key'] = $column['name'] = $html_columns[ $col_nm ]; $column['type'] = 'text'; $column['renderer']= 'html'; $column['frozen'] = false; $column['sortable'] = false; $column['exportable'] = true; $column['searchable'] = false; $column['editable'] = false; $column['editor'] = false; $column['batch_editable'] = false; $column['hidden'] = true; $column['allow_showhide'] = true; $column['width'] = 200; break; } } if (!empty($dashboard_model_saved)) { $col_model_diff = sm_array_recursive_diff($dashboard_model_saved,$dashboard_model); } //clearing the transients before return if (!empty($col_model_diff)) { delete_transient( 'sa_sm_'.$this->dashboard_key ); } return $dashboard_model; } public function pro_data_model ($data_model, $data_col_params) { if( !class_exists('WPSEO_Rank') && file_exists( WP_PLUGIN_DIR. '/wordpress-seo/inc/class-wpseo-rank.php' ) ) { include_once WP_PLUGIN_DIR. '/wordpress-seo/inc/class-wpseo-rank.php'; } if( empty( $data_model['items'] ) ) { return $data_model; } foreach ($data_model['items'] as $key => $data) { if (empty($data['posts_id'])) continue; //Code for handling data for Yoast Readability Score if( !empty( $data['postmeta_meta_key__yoast_wpseo_content_score_meta_value__yoast_wpseo_content_score'] ) && is_callable( array( 'WPSEO_Rank', 'from_numeric_score' ) ) ) { $rank = WPSEO_Rank::from_numeric_score( (int)$data['postmeta_meta_key__yoast_wpseo_content_score_meta_value__yoast_wpseo_content_score'] ); $title = $rank->get_label(); $data_model['items'][$key]['postmeta_meta_key__yoast_wpseo_content_score_meta_value__yoast_wpseo_content_score'] = '' . $title . ''; } //Code for handling data for Yoast SEO Score if( !empty( $data['postmeta_meta_key__yoast_wpseo_linkdex_meta_value__yoast_wpseo_linkdex'] ) && is_callable( array( 'WPSEO_Rank', 'from_numeric_score' ) ) ) { $rank = WPSEO_Rank::from_numeric_score( (int)$data['postmeta_meta_key__yoast_wpseo_linkdex_meta_value__yoast_wpseo_linkdex'] ); $title = $rank->get_label(); $data_model['items'][$key]['postmeta_meta_key__yoast_wpseo_linkdex_meta_value__yoast_wpseo_linkdex'] = '' . $title . ''; } //Code for handling Yoast Meta Robots if( isset( $data['postmeta_meta_key__yoast_wpseo_meta-robots-adv_meta_value__yoast_wpseo_meta-robots-adv'] ) ) { $actual_values = $this->get_yoast_meta_robots_values(); if( !empty( $data['postmeta_meta_key__yoast_wpseo_meta-robots-adv_meta_value__yoast_wpseo_meta-robots-adv'] ) ) { $current_values = explode( ',', $data['postmeta_meta_key__yoast_wpseo_meta-robots-adv_meta_value__yoast_wpseo_meta-robots-adv'] ); $formatted_value = array(); foreach( $current_values as $value ) { if( !empty( $actual_values[ $value ] ) ) { $formatted_value[] = $actual_values[ $value ]; } } $data_model['items'][$key]['postmeta_meta_key__yoast_wpseo_meta-robots-adv_meta_value__yoast_wpseo_meta-robots-adv'] = implode(',
            ', $formatted_value); } else { $data_model['items'][$key]['postmeta_meta_key__yoast_wpseo_meta-robots-adv_meta_value__yoast_wpseo_meta-robots-adv'] = $actual_values['-']; } } //Code for handling Yoast Meta Robots if( isset( $data['postmeta_meta_key_rank_math_robots_meta_value_rank_math_robots'] ) ) { $actual_values = $this->get_rankmath_robots_values(); if( !empty( $data['postmeta_meta_key_rank_math_robots_meta_value_rank_math_robots'] ) ) { $current_values = maybe_unserialize( $data['postmeta_meta_key_rank_math_robots_meta_value_rank_math_robots'] ); $formatted_value = array(); foreach( $current_values as $value ) { if( !empty( $actual_values[ $value ] ) ) { $formatted_value[] = $actual_values[ $value ]; } } $data_model['items'][$key]['postmeta_meta_key_rank_math_robots_meta_value_rank_math_robots'] = implode(',
            ', $formatted_value); } else { $data_model['items'][$key]['postmeta_meta_key_rank_math_robots_meta_value_rank_math_robots'] = $actual_values['index']; } } //Code for handling data for Rank Math SEO Score if( isset( $data['postmeta_meta_key_rank_math_seo_score_meta_value_rank_math_seo_score'] ) ) { $score = ( !empty( $data['postmeta_meta_key_rank_math_seo_score_meta_value_rank_math_seo_score'] ) ) ? $data['postmeta_meta_key_rank_math_seo_score_meta_value_rank_math_seo_score'] : 0; $class = $this->get_rankmath_seo_score_class( $score ); $score = $score . ' / 100'; $data_model['items'][$key]['postmeta_meta_key_rank_math_seo_score_meta_value_rank_math_seo_score'] = ' '.$score.''; } } return $data_model; } public function pro_inline_update_pre( $edited_data ) { if (empty($edited_data)) return $edited_data; foreach ($edited_data as $id => $edited_row) { if( empty( $id ) ) { continue; } //Code for handling Yoast SEO meta robots editing if( !empty( $edited_row['postmeta/meta_key=_yoast_wpseo_meta-robots-adv/meta_value=_yoast_wpseo_meta-robots-adv'] ) ) { $actual_values = $this->get_yoast_meta_robots_values(); $current_values = explode( ',
            ', $edited_row['postmeta/meta_key=_yoast_wpseo_meta-robots-adv/meta_value=_yoast_wpseo_meta-robots-adv'] ); $formatted_value = array(); foreach( $current_values as $value ) { $key = array_search( $value, $actual_values ); if( $key !== false ) { $formatted_value[] = $key; } } $edited_data[$id]['postmeta/meta_key=_yoast_wpseo_meta-robots-adv/meta_value=_yoast_wpseo_meta-robots-adv'] = implode(',', $formatted_value); } // Code for handling Rank Math robots editing if( !empty( $edited_row['postmeta/meta_key=rank_math_robots/meta_value=rank_math_robots'] ) ) { $actual_values = $this->get_yoast_meta_robots_values(); $current_values = explode( ',
            ', $edited_row['postmeta/meta_key=rank_math_robots/meta_value=rank_math_robots'] ); $formatted_value = array(); foreach( $current_values as $value ) { $key = array_search( $value, $actual_values ); if( $key !== false ) { $formatted_value[] = $key; } } $edited_data[$id]['postmeta/meta_key=rank_math_robots/meta_value=rank_math_robots'] = $formatted_value; } } return $edited_data; } public function generate_multilist_col_model( $colObj, $values = array() ) { $colObj ['values'] = array(); foreach( $values as $key => $value ) { $colObj ['values'][$key] = array( 'term' => $value, 'parent' => 0 ); } //code for handling values for advanced search $colObj['search_values'] = array(); foreach( $values as $key => $value ) { $colObj['search_values'][] = array( 'key' => $key, 'value' => $value ); } $colObj ['type'] = $colObj ['editor'] = 'sm.multilist'; $colObj ['strict'] = true; $colObj ['allowInvalid'] = false; $colObj ['editable'] = false; return $colObj; } public function generate_dropdown_col_model( $colObj, $dropdownValues = array() ) { $dropdownKeys = ( !empty( $dropdownValues ) ) ? array_keys( $dropdownValues ) : array(); $colObj['defaultValue'] = ( !empty( $dropdownKeys[0] ) ) ? $dropdownKeys[0] : ''; $colObj['save_state'] = true; $colObj['values'] = $dropdownValues; $colObj['selectOptions'] = $dropdownValues; //for inline editing $colObj['search_values'] = array(); foreach( $dropdownValues as $key => $value) { $colObj['search_values'][] = array('key' => $key, 'value' => $value); } $colObj['type'] = 'dropdown'; $colObj['strict'] = true; $colObj['allowInvalid'] = false; $colObj['editor'] = 'select'; $colObj['renderer'] = 'selectValueRenderer'; return $colObj; } public function get_entire_store_ids() { global $wpdb; $selected_ids = array(); if( !empty( $this->req_params['filteredResults'] ) ) { $post_ids = get_transient('sa_sm_search_post_ids'); $selected_ids = ( !empty( $post_ids ) ) ? explode( ",", $post_ids ) : array(); } else { $post_type = (!empty($this->req_params['table_model']['posts']['where'])) ? $this->req_params['table_model']['posts']['where'] : array('post_type' => $this->dashboard_key); if( !empty( $this->req_params['table_model']['posts']['where']['post_type'] ) ) { $post_type = ( is_array( $this->req_params['table_model']['posts']['where']['post_type'] ) ) ? $this->req_params['table_model']['posts']['where']['post_type'] : array( $this->req_params['table_model']['posts']['where']['post_type'] ); } $from = " FROM {$wpdb->prefix}posts "; $where = " WHERE post_type IN ('". implode( "','", $post_type ) ."') "; $update_trash_records = apply_filters( 'sm_update_trash_records', ( 'yes' === get_option( 'sm_update_trash_records', 'no' ) ) ); if( empty( $update_trash_records ) && ( is_callable( array( $this, 'is_show_trash_records' ) ) && empty( $this->is_show_trash_records() ) ) ){ $where .= " AND post_status != 'trash'"; } $from = apply_filters('sm_beta_background_entire_store_ids_from', $from, $this->req_params); $where = apply_filters('sm_beta_background_entire_store_ids_where', $where, $this->req_params); $query = apply_filters( 'sm_beta_background_entire_store_ids_query', $wpdb->prepare( "SELECT ID ". $from ." ". $where ." AND 1=%d", 1 ) ); $selected_ids = $wpdb->get_col( $query ); } return $selected_ids; } //function to handle batch update request public function batch_update() { global $wpdb, $current_user; $col_data_type = self::get_column_data_type( $this->dashboard_key ); // For fetching column data type $batch_update_actions = (!empty($this->req_params['batch_update_actions'])) ? json_decode(stripslashes($this->req_params['batch_update_actions']), true) : array(); $dashboard_key = $this->dashboard_key; //fix for PHP 5.3 or earlier $batch_update_actions = array_map( function( $batch_update_action ) use ( $dashboard_key, $col_data_type ) { $batch_update_action['dashboard_key'] = $dashboard_key; $batch_update_action['date_type'] = ( ! empty( $col_data_type[$batch_update_action['type']] ) ) ? $col_data_type[$batch_update_action['type']] : 'text'; //data type for handling copy_from_field operator if ( 'copy_from_field' === $batch_update_action['operator'] ) { $batch_update_action['copy_field_data_type'] = ( ! empty( $col_data_type[$batch_update_action['value']] ) ) ? $col_data_type[$batch_update_action['value']] : 'text'; } return $batch_update_action; }, $batch_update_actions); $get_selected_ids_and_entire_store_flag = $this->get_selected_ids_and_entire_store_flag(); $selected_ids = ( ! empty( $get_selected_ids_and_entire_store_flag['selected_ids'] ) ) ? $get_selected_ids_and_entire_store_flag['selected_ids'] : array(); $is_entire_store = ( ! empty( $get_selected_ids_and_entire_store_flag['entire_store'] ) ) ? $get_selected_ids_and_entire_store_flag['entire_store'] : false; self::send_to_background_process( array( 'process_name' => 'Bulk Edit', 'callback' => array( 'class_path' => $this->req_params['class_path'], 'func' => array( $this->req_params['class_nm'], 'process_batch_update' ) ), 'actions' => $batch_update_actions, 'is_scheduled' => $this->req_params['isScheduled'], 'scheduled_for' => $this->req_params['scheduledFor'], 'title' => $this->req_params['title'], 'selected_ids' => $selected_ids, 'entire_task' => $this->entire_task, 'storewide_option' => $this->req_params['storewide_option'], 'active_module' => $this->req_params['active_module'], 'entire_store' => $is_entire_store, 'dashboard_key' => $this->dashboard_key, 'dashboard_title' => $this->dashboard_title, 'class_path' => $this->req_params['class_path'], 'class_nm' => $this->req_params['class_nm'], 'backgroundProcessRunningMessage' => $this->req_params['backgroundProcessRunningMessage'], 'SM_IS_WOO30' => $this->req_params['SM_IS_WOO30'], 'scheduled_action_admin_url' => $this->req_params['scheduledActionAdminUrl'] ) ); } //function to handle batch update request public static function send_to_background_process( $params = array() ) { if ( empty( $params ) || ! is_array( $params ) ) { return; } if ( ( isset( $params['is_scheduled'] ) && ! empty( $params['is_scheduled'] ) ) && ( isset( $params['scheduled_for'] ) && ! empty( $params['scheduled_for'] && '0000-00-00 00:00:00' !== $params['scheduled_for'] ) ) && ( isset( $params['scheduled_action_admin_url'] ) && ! empty( $params['scheduled_action_admin_url'] ) ) ) { $timestamp = strtotime( date( $params['scheduled_for'] ) ); as_schedule_single_action( $timestamp, 'storeapps_smart_manager_scheduled_actions', array( $params ) ); echo sprintf( /* translators: %1$d: number of updated record %2$s: record update message */ _x( "Bulk Edit action scheduled successfully. Check all your scheduled actions here.", 'success notification', 'smart-manager-for-wp-e-commerce' ), $params['scheduled_action_admin_url'] ); exit; } $identifier = ''; $process_name = apply_filters( 'sm_get_process_names_for_adding_tasks', $params['process_name'] ); if ( ! empty( $process_name ) && ( is_array( $process_name ) ) && ( in_array( $params['process_name'], $process_name, true ) ) ) { $task_id = 0; if ( is_callable( array( 'Smart_Manager_Task', 'task_update' ) ) && ( isset( $params['title'] ) && ( ! empty( $params['title'] ) ) ) && ( ! empty( $params['dashboard_key'] ) ) && ( ! empty( $params['actions'] ) ) && ( ! empty( $params['selected_ids'] ) && is_array( $params['selected_ids'] ) ) ) { $task_id = Smart_Manager_Task::task_update( array( 'title' => $params['title'], 'created_date' => date('Y-m-d H:i:s'), 'completed_date' => '0000-00-00 00:00:00', 'post_type' => $params['dashboard_key'], 'type' => 'bulk_edit', 'status' => 'in-progress', 'actions' => ( ! empty( $params['is_scheduled'] ) && is_array( $params['actions'] ) ) ? array_merge( $params['actions'], array( 'is_scheduled' => $params['is_scheduled'] ) ) : $params['actions'], 'record_count' => count( $params['selected_ids'] ), ) ); } $params['actions'] = array_map( function( $params_action ) use( $task_id ) { $params_action['task_id'] = $task_id; return $params_action; }, $params['actions'] ); } if ( is_callable( array( 'Smart_Manager_Pro_Background_Updater', 'get_identifier' ) ) ) { $identifier = Smart_Manager_Pro_Background_Updater::get_identifier(); } if ( !empty( $identifier ) && ! empty( $params['selected_ids'] ) ) { $default_params = array( 'process_name' => 'Bulk edit / Batch update', 'callback' => array( 'class_path' => $params['class_path'], 'func' => array( $params['class_nm'], 'process_batch_update' ) ), 'id_count' => count( $params['selected_ids'] ), 'active_dashboard' => $params['dashboard_title'] ); $params = ( !empty( $params ) ) ? array_merge( $default_params, $params ) : $default_params; update_option( $identifier.'_params', $params, 'no' ); update_option( $identifier.'_ids', $params['selected_ids'], 'no' ); update_option( $identifier.'_initial_process', 1, 'no' ); //Calling the initiate_batch_process function to initiaite the batch process if ( is_callable( array( Smart_Manager_Pro_Background_Updater::instance(), 'initiate_batch_process' ) ) ) { Smart_Manager_Pro_Background_Updater::instance()->initiate_batch_process(); } } } //function to process batch update conditions public static function process_batch_update( $args= array() ) { do_action( 'sm_beta_pre_process_batch', $args ); // code for processing logic for batch update if( empty($args['type']) || empty($args['operator']) || empty($args['id']) || empty( $args['date_type'] ) ) { return false; } $type_exploded = explode("/",$args['type']); if( empty( $type_exploded ) ) { return false; } if ( sizeof($type_exploded) > 2 ) { $args['table_nm'] = $type_exploded[0]; $cond = explode("=",$type_exploded[1]); if (sizeof($cond) == 2) { $args['col_nm'] = $cond[1]; } } else { $args['col_nm'] = $type_exploded[1]; $args['table_nm'] = $type_exploded[0]; } $prev_val = $new_val = ''; $prev_val = apply_filters( 'sm_beta_batch_update_prev_value', $prev_val, $args ); if( empty( $prev_val ) ) { if( is_callable( array( 'Smart_Manager_Task', 'get_previous_data' ) ) ) { $prev_val = Smart_Manager_Task::get_previous_data( $args['id'], $args['table_nm'], $args['col_nm'] ); } } if( $args['date_type'] == 'numeric' ) { $prev_val = ( ! empty( $prev_val ) ) ? floatval( $prev_val ) : 0; } $args['prev_val'] = $prev_val; $value1 = $args['value']; $args_meta = ( ! empty( $args['meta'] ) ) ? $args['meta'] : array(); // $value1 = ( ( is_array( $args['value'] ) && isset( $args['value'][0]) ) ? $args['value'][0] : $args['value'] ); // $value2 = ( ( is_array( $args['value'] ) && isset( $args['value'][1]) ) ? $args['value'][1] : '' ); if( $args['date_type'] == 'numeric' ) { $value1 = ( ! empty( $value1 ) ) ? floatval( $value1 ) : 0; } //Code for handling different conditions for updating datetime fields if( $args['date_type'] == 'sm.datetime' && ( $args['operator'] == 'set_date_to' || $args['operator'] == 'set_time_to' ) ) { //if prev_val is null if( empty($prev_val) ) { $date = ( $args['operator'] == 'set_date_to' ) ? $value1 : current_time( 'Y-m-d' ); $time = ( $args['operator'] == 'set_time_to' ) ? $value1 : current_time( 'H:i:s' ); } else { $date = ( $args['operator'] == 'set_date_to' ) ? $value1 : date('Y-m-d', strtotime($prev_val)); $time = ( $args['operator'] == 'set_time_to' ) ? $value1 : date('H:i:s', strtotime($prev_val)); } $value1 = $date.' '.$time; } if( ( $args['date_type'] == 'sm.datetime' || $args['date_type'] == 'sm.date' || $args['date_type'] == 'sm.time' ) && !empty( $args['date_type'] ) && $args['date_type'] == 'timestamp' ) { //code for handling timestamp values if( $args['date_type'] == 'sm.time' ) { $value1 = '1970-01-01 '.$value1; } $value1 = strtotime( $value1 ); } // Code for handling increase/decrease date by operator $date_type_fields = array( 'sm.date', 'sm.datetime', 'sm.time', 'timestamp' ); $date_format = 'Y-m-d'; if ( in_array( $args['date_type'], $date_type_fields ) ) { switch ( $args['date_type'] ) { case 'timestamp': case 'sm.date': $date_format = 'Y-m-d'; break; case 'sm.datetime': $date_format = 'Y-m-d H:i:s'; break; case 'sm.time': $date_format = 'h:i'; break; } $args['prev_val'] = ( ! empty( $prev_val ) ? ( strtotime( $prev_val ) ? $prev_val : date( $date_format, $prev_val ) ) : current_time( $date_format ) ); $value1 = ( ! empty( $value1 ) ? ( strtotime( $value1 ) ? $value1 : date( $date_format, $value1 ) ) : $value1 ); } $additional_date_operators = array( 'increase_date_by', 'decrease_date_by' ); if( in_array( $args['date_type'], $date_type_fields ) && in_array( $args['operator'], $additional_date_operators ) ) { $args['meta']['dateDuration'] = !empty ( $args['meta']['dateDuration'] ) ? $args['meta']['dateDuration'] : ( ( 'sm.time' === $args['date_type'] ) ? 'hours' : 'days' ); $args['value'] = !empty ( $args['value'] ) ? $args['value'] : 0; $prev_val = ( ! empty( $args['prev_val'] ) ) ? $args['prev_val'] : current_time( $date_format ); $value1 = date( $date_format, strtotime( $prev_val. ( ( 'increase_date_by' === $args['operator'] ) ? '+' : '-' ) .$args['value']. $args['meta']['dateDuration'] ) ); } if( $args['date_type'] == 'dropdown' || $args['date_type'] == 'multilist' ) { if( $args['operator'] == 'add_to' || $args['operator'] == 'remove_from' ) { if( $args['table_nm'] == 'terms' ) { $prev_val = wp_get_object_terms( $args['id'], $args['col_nm'], 'orderby=none&fields=ids' ); } else { if( !empty( $args['multiSelectSeparator'] ) && !empty( $prev_val ) ) { $prev_val = explode( $args['multiSelectSeparator'], $prev_val ); } else { $prev_val = ( !empty( $prev_val ) ) ? $prev_val : array(); } } $value1 = ( !is_array( $value1 ) ) ? array( $value1 ) : $value1; if( !empty( $prev_val ) ) { $value1 = ( $args['operator'] == 'add_to' ) ? array_merge($prev_val, $value1) : array_diff($prev_val, $value1); } $value1 = array_unique( $value1 ); } $separator = ( !empty( $args['multiSelectSeparator'] ) ) ? $args['multiSelectSeparator'] : ","; $value1 = ( !empty( $separator ) && is_array( $value1 ) ) ? implode( $separator, $value1 ) : $value1; } if( $args['date_type'] == 'sm.multilist' && $args['operator'] != 'set_to' && $args['table_nm'] == 'postmeta' ) { //code for handling multilist values } // Code for handling serialized data updates if( $args['date_type'] == 'sm.serialized' ) { $value1 = maybe_unserialize( $value1 ); } // default value for prev_val $numeric_operators = array( 'increase_by_per', 'decrease_by_per', 'increase_by_num', 'decrease_by_num' ); if ( in_array( $args['operator'], $numeric_operators ) && empty( $prev_val ) ) { $prev_val = 0; } //cases to update the value based on the batch update actions switch( $args['operator'] ) { case 'set_to': $new_val = $value1; break; case 'prepend': $new_val = $value1.''.$prev_val; break; case 'append': $new_val = $prev_val.''.$value1; break; case 'search_and_replace': if( isset( $args_meta['replace_value'] ) ){ $replace_val = ( ! empty( $args_meta['replace_value'] ) ) ? $args_meta['replace_value'] : ''; $new_val = str_replace( $value1, $replace_val, $prev_val ); } else { $new_val = $prev_val; } break; case 'increase_by_per': $new_val = ( ! empty( $prev_val ) ) ? round( ($prev_val + ($prev_val * ($value1 / 100))), apply_filters('sm_beta_pro_num_decimals',get_option( 'woocommerce_price_num_decimals' )) ) : ''; break; case 'decrease_by_per': $new_val = ( ! empty( $prev_val ) ) ? round( ($prev_val - ($prev_val * ($value1 / 100))), apply_filters('sm_beta_pro_num_decimals',get_option( 'woocommerce_price_num_decimals' )) ) : ''; break; case 'increase_by_num': $new_val = round( ($prev_val + $value1), apply_filters('sm_beta_pro_num_decimals',get_option( 'woocommerce_price_num_decimals' )) ); break; case 'decrease_by_num': $new_val = ( ! empty( $prev_val ) ) ? round( ($prev_val - $value1), apply_filters('sm_beta_pro_num_decimals',get_option( 'woocommerce_price_num_decimals' )) ) : ''; break; default: $new_val = $value1; break; } //Code for handling 'copy_from' and 'copy_from_field' action $args['copy_from_operators'] = array('copy_from', 'copy_from_field'); $value1 = ( 'copy_from_field' === $args['operator'] && empty( $value1 ) ) ? $args['type'] : $value1; if( in_array( $args['operator'], $args['copy_from_operators'] ) && ( ! empty( $value1 ) ) ) { $args['selected_table_name'] = $args['table_nm']; $args['selected_column_name'] = $args['col_nm']; $args['selected_value'] = $value1; if( 'copy_from_field' === $args['operator'] ) { $explode_selected_value = ( false !== strpos( $args['selected_value'], '/' ) ) ? explode('/', $args['selected_value']) : $args['selected_value']; if ( is_array( $explode_selected_value ) && sizeof( $explode_selected_value ) >= 2 ) { $args['selected_table_name'] = $explode_selected_value[0]; $args['selected_column_name'] = $explode_selected_value[1]; $cond = ( false !== strpos( $args['selected_column_name'], '=' ) ) ? explode( "=", $args['selected_column_name'] ) : $args['selected_column_name']; $args['selected_column_name'] = ( ( is_array( $cond ) ) && ( 2 === sizeof( $cond ) ) ) ? $cond[1] : $cond; } $args['selected_value'] = $args['id']; } switch ( $args['selected_table_name'] ) { case 'posts': $new_val = get_post_field( $args['selected_column_name'], $args['selected_value'] ); break; case 'postmeta': $new_val = get_post_meta( $args['selected_value'], $args['selected_column_name'], true ); break; case 'terms': $term_ids = wp_get_object_terms( $args['selected_value'], $args['selected_column_name'], array( 'orderby' => 'term_id', 'order' => 'ASC', 'fields' => 'ids' ) ); $new_val = ( ! is_wp_error( $term_ids ) && ! empty( $term_ids ) ) ? $term_ids : array(); break; case 'custom': $new_val = apply_filters( 'sm_get_value_for_copy_from_operator', $new_val, $args ); break; default: $new_val = $value1; break; } $new_val = ( 'numeric' === $args['date_type'] && empty( $new_val ) ) ? 0 : $new_val; $args['new_value'] = $new_val; $new_val = ( ( 'copy_from_field' === $args['operator'] && ( ! empty ( $args['copy_field_data_type'] ) ) ) && is_callable( array( 'Smart_Manager_Pro_Base', 'handle_serialized_data' ) ) ) ? self::handle_serialized_data( $args ) : $new_val; } $args['value'] = $new_val; $args = apply_filters( 'sm_beta_post_batch_process_args', $args ); self::process_batch_update_db_updates( $args ); } //function to handle serialized values for copy from field operator public static function handle_serialized_data( $args = array() ) { if( empty( $args['date_type'] ) || empty( $args['new_value'] ) ) { return ''; } switch( true ) { case( 'sm.serialized' === $args['date_type'] ): return maybe_unserialize( $args['new_value'] ); case( 'sm.serialized' !== $args['date_type'] && 'sm.serialized' === $args['copy_field_data_type'] ): return maybe_serialize( $args['new_value'] ); default: return $args['new_value']; } } //function to handle the batch update db updates public static function process_batch_update_db_updates( $args = array() ) { do_action( 'sm_pre_batch_update_db_updates',$args ); set_transient( 'sm_beta_skip_delete_dashboard_transients', 1, DAY_IN_SECONDS ); // for preventing delete dashboard transients Smart_Manager_Base::$update_task_details_params = array(); $update = false; $default_batch_update = true; $default_batch_update = apply_filters( 'sm_default_batch_update_db_updates', $default_batch_update, $args ); if( $default_batch_update ) { switch ( $args['table_nm'] ) { case 'posts': $update = wp_update_post( array( 'ID' => $args['id'], $args['col_nm'] => $args['value'] ) ); break; case 'postmeta': $update = update_post_meta( $args['id'], $args['col_nm'], $args['value'] ); break; case 'terms': self::batch_update_terms_table_data( $args ); break; case ( 'custom' === $args['table_nm'] && 'copy_from' === $args['operator'] ): $update = apply_filters( 'sm_update_value_for_copy_from_operator', $args ); break; default: $update = wp_update_post( array( 'ID' => $args['id'], $args['col_nm'] => $args['value'] ) ); $value = $args['value']; break; } } $update = apply_filters( 'sm_post_batch_update_db_updates',$update ,$args ); if ( is_wp_error( $update ) ) { if ( is_callable( array( 'Smart_Manager', 'log' ) ) ) { /* translators: %s process name */ Smart_Manager::log( 'error', sprintf( _x( '%s failed', 'update status', 'smart-manager-for-wp-e-commerce' ), ( ( ! empty( $args['process_name'] ) ) ? $args['process_name'] : '' ) ) ); } return false; } elseif ( ! empty( $args['task_id'] ) && ( ! empty( property_exists( 'Smart_Manager_Base', 'update_task_details_params' ) ) ) ) { $action = 'set_to'; if ( in_array( $args['operator'], array( 'add_to', 'remove_from' ) ) ) { $action = apply_filters( 'sm_task_update_action', $args['operator'], $args ); } Smart_Manager_Base::$update_task_details_params[] = array( 'task_id' => $args['task_id'], 'action' => $action, 'status' => 'completed', 'record_id' => $args['id'], 'field' => $args['type'], 'prev_val' => ( ( ! empty( $args['col_nm'] ) ) && ( ! empty( $args['date_type'] ) ) ) ? sa_sm_format_prev_val( array( 'prev_val' => $args['prev_val'], 'update_column' => $args['col_nm'], 'col_data_type' => $args['date_type'], 'updated_val' => $args['value'] ) ) : $args['prev_val'], 'updated_val' => $args['value'], 'operator' => $args['operator'], ); apply_filters( 'sm_task_details_update_by_prev_val', Smart_Manager_Base::$update_task_details_params ); // For updating task details table if ( ( ! empty( Smart_Manager_Base::$update_task_details_params ) ) && is_callable( array( 'Smart_Manager_Task', 'task_details_update' ) ) ) { return Smart_Manager_Task::task_details_update(); } } else { return true; } } //function to handle batch process complete public static function batch_process_complete() { $identifier = ''; if ( is_callable( array( 'Smart_Manager_Pro_Background_Updater', 'get_identifier' ) ) ) { $identifier = Smart_Manager_Pro_Background_Updater::get_identifier(); } if( empty( $identifier ) ) { return; } $background_process_params = get_option( $identifier.'_params', false ); if( empty( $background_process_params ) ) { if ( is_callable( array( 'Smart_Manager', 'log' ) ) ) { Smart_Manager::log( 'error', _x( 'No batch process params found', 'batch process', 'smart-manager-for-wp-e-commerce' ) ); } return; } delete_option( $identifier.'_params' ); // Preparing email content $email = get_option('admin_email'); $site_title = get_option( 'blogname' ); $email_heading_color = get_option('woocommerce_email_base_color'); $email_heading_color = (empty($email_heading_color)) ? '#96588a' : $email_heading_color; $email_text_color = get_option('woocommerce_email_text_color'); $email_text_color = (empty($email_text_color)) ? '#3c3c3c' : $email_text_color; $actions = ( !empty($background_process_params['actions']) ) ? $background_process_params['actions'] : array(); $records_str = $background_process_params['id_count'] .' '. (( $background_process_params['id_count'] > 1 ) ? __( 'records', SM_TEXT_DOMAIN ) : __( 'record', SM_TEXT_DOMAIN )); $records_str .= ( $background_process_params['entire_store'] ) ? ' ('. __( 'entire store', SM_TEXT_DOMAIN ) .')' : ''; $background_process_param_name = $background_process_params['process_name']; $title = sprintf( __( '[%1s] %2s process completed!', SM_TEXT_DOMAIN ), $site_title, $background_process_param_name ); ob_start(); include( apply_filters( 'sm_beta_pro_batch_email_template', SM_PRO_URL.'templates/email.php' ) ); $message = ob_get_clean(); $subject = $title; if( function_exists( 'wc_mail' ) ) { wc_mail( $email, $subject, $message ); } else { wp_mail( $email, $subject, $message ); } } //Function to generate the data for print_invoice public function get_print_invoice() { global $smart_manager_beta; ini_set('memory_limit','512M'); set_time_limit(0); $purchase_id_arr = ( ! empty( $this->req_params['selected_ids'] ) ) ? json_decode( stripslashes( $this->req_params['selected_ids'] ), true ) : array(); if ( ( ! empty( $this->req_params['storewide_option'] ) ) && ( 'entire_store' === $this->req_params['storewide_option'] ) && ( ! empty( $this->req_params['active_module'] ) ) ) { //code for fetching all the ids $purchase_id_arr = $this->get_entire_store_ids(); } $sm_text_domain = 'smart-manager-for-wp-e-commerce'; $sm_is_woo30 = ( ! empty( Smart_Manager::$sm_is_woo30 ) && 'true' === Smart_Manager::$sm_is_woo30 ) ? true : false; $sm_is_woo44 = ( ! empty( Smart_Manager::$sm_is_woo44 ) && 'true' === Smart_Manager::$sm_is_woo44 ) ? true : false; ob_start(); if ( function_exists( 'wc_get_template' ) ) { $template = 'order-invoice.php'; wc_get_template( $template, array( 'purchase_id_arr' => $purchase_id_arr, 'sm_text_domain' => $sm_text_domain, 'sm_is_woo30' => $sm_is_woo30, 'sm_is_woo44' => $sm_is_woo44, 'smart_manager_beta' => $smart_manager_beta ), $this->get_template_base_dir( $template ), SM_PLUGIN_DIR_PATH .'/pro/templates/' ); } else { include( apply_filters( 'sm_beta_pro_batch_order_invoice_template', SM_PRO_URL.'templates/order-invoice.php' ) ); } echo ob_get_clean(); exit; } //function to handle duplicate records functionality public function duplicate_records() { $get_selected_ids_and_entire_store_flag = $this->get_selected_ids_and_entire_store_flag(); $selected_ids = ( ! empty( $get_selected_ids_and_entire_store_flag['selected_ids'] ) ) ? $get_selected_ids_and_entire_store_flag['selected_ids'] : array(); $is_entire_store = ( ! empty( $get_selected_ids_and_entire_store_flag['entire_store'] ) ) ? $get_selected_ids_and_entire_store_flag['entire_store'] : false; self::send_to_background_process( array( 'process_name' => 'Duplicate Records', 'callback' => array( 'class_path' => $this->req_params['class_path'], 'func' => array( $this->req_params['class_nm'], 'process_duplicate_record' ) ), 'selected_ids' => $selected_ids, 'entire_task' => $this->entire_task, 'storewide_option' => $this->req_params['storewide_option'],'active_module' => $this->req_params['active_module'], 'entire_store' => $is_entire_store, 'dashboard_key' => $this->dashboard_key, 'dashboard_title' => $this->dashboard_title, 'class_path' => $this->req_params['class_path'], 'class_nm' => $this->req_params['class_nm'], 'backgroundProcessRunningMessage' => $this->req_params['backgroundProcessRunningMessage'], 'SM_IS_WOO30' => $this->req_params['SM_IS_WOO30'] ) ); } public static function get_duplicate_record_settings() { $defaults = array( 'status' => 'same', 'type' => 'same', 'timestamp' => 'current', 'title' => '('.__('Copy', SM_TEXT_DOMAIN).')', 'slug' => 'copy', 'time_offset' => false, 'time_offset_days' => 0, 'time_offset_hours' => 0, 'time_offset_minutes' => 0, 'time_offset_seconds' => 0, 'time_offset_direction' => 'newer' ); $settings = apply_filters( 'sm_beta_duplicate_records_settings', $defaults ); return $settings; } //function to process duplicate records logic public static function process_duplicate_record( $params ) { $original_id = ( !empty( $params['id'] ) ) ? $params['id'] : ''; do_action('sm_beta_pre_process_duplicate_records', $original_id ); //code for processing logic for duplicate records if( empty( $original_id ) ) { return false; } global $wpdb; // Get the post as an array $duplicate = get_post( $original_id, 'ARRAY_A' ); $settings = self::get_duplicate_record_settings(); // Modify title $appended = ( $settings['title'] != '' ) ? ' '.$settings['title'] : ''; $duplicate['post_title'] = $duplicate['post_title'].' '.$appended; $duplicate['post_name'] = sanitize_title($duplicate['post_name'].'-'.$settings['slug']); // Set the post status if( $settings['status'] != 'same' ) { $duplicate['post_status'] = $settings['status']; } // Set the post type if( $settings['type'] != 'same' ) { $duplicate['post_type'] = $settings['type']; } // Set the post date $timestamp = ( $settings['timestamp'] == 'duplicate' ) ? strtotime($duplicate['post_date']) : current_time('timestamp',0); $timestamp_gmt = ( $settings['timestamp'] == 'duplicate' ) ? strtotime($duplicate['post_date_gmt']) : current_time('timestamp',1); if( $settings['time_offset'] ) { $offset = intval($settings['time_offset_seconds']+$settings['time_offset_minutes']*60+$settings['time_offset_hours']*3600+$settings['time_offset_days']*86400); if( $settings['time_offset_direction'] == 'newer' ) { $timestamp = intval($timestamp+$offset); $timestamp_gmt = intval($timestamp_gmt+$offset); } else { $timestamp = intval($timestamp-$offset); $timestamp_gmt = intval($timestamp_gmt-$offset); } } $duplicate['post_date'] = date('Y-m-d H:i:s', $timestamp); $duplicate['post_date_gmt'] = date('Y-m-d H:i:s', $timestamp_gmt); $duplicate['post_modified'] = date('Y-m-d H:i:s', current_time('timestamp',0)); $duplicate['post_modified_gmt'] = date('Y-m-d H:i:s', current_time('timestamp',1)); // Remove some of the keys unset( $duplicate['ID'] ); unset( $duplicate['guid'] ); unset( $duplicate['comment_count'] ); // Insert the post into the database $duplicate_id = wp_insert_post( $duplicate ); // Duplicate all the taxonomies/terms $taxonomies = get_object_taxonomies( $duplicate['post_type'] ); foreach( $taxonomies as $taxonomy ) { $terms = wp_get_post_terms( $original_id, $taxonomy, array('fields' => 'names') ); wp_set_object_terms( $duplicate_id, $terms, $taxonomy ); } // Duplicate all the custom fields $custom_fields = get_post_custom( $original_id ); $postmeta_data = array(); foreach ( $custom_fields as $key => $value ) { if( is_array($value) && count($value) > 0 ) { //TODO: optimize foreach( $value as $i=>$v ) { $postmeta_data[] = '('.$duplicate_id.',\''.$key.'\',\''.$v.'\')'; } } } if( !empty($postmeta_data) ) { $q = "INSERT INTO {$wpdb->prefix}postmeta(post_id, meta_key, meta_value) VALUES ". implode(",", $postmeta_data); $query = $wpdb->query("INSERT INTO {$wpdb->prefix}postmeta(post_id, meta_key, meta_value) VALUES ". implode(",", $postmeta_data)); } do_action( 'sm_beta_post_process_duplicate_records', array( 'original_id' => $original_id, 'duplicate_id' => $duplicate_id, 'settings' => $settings, 'duplicate' => $duplicate ) ); if( is_wp_error($duplicate_id) ) { if ( is_callable( array( 'Smart_Manager', 'log' ) ) ) { Smart_Manager::log( 'error', _x( 'Duplicate process failed', 'duplicate process', 'smart-manager-for-wp-e-commerce' ) ); } return false; } else { return true; } } /** * Function to handle deletion via background process */ public function delete_all() { $get_selected_ids_and_entire_store_flag = $this->get_selected_ids_and_entire_store_flag(); $selected_ids = ( ! empty( $get_selected_ids_and_entire_store_flag['selected_ids'] ) ) ? $get_selected_ids_and_entire_store_flag['selected_ids'] : array(); $is_entire_store = ( ! empty( $get_selected_ids_and_entire_store_flag['entire_store'] ) ) ? $get_selected_ids_and_entire_store_flag['entire_store'] : false; self::send_to_background_process( array( 'process_name' => 'Delete All Records', 'callback' => array( 'class_path' => $this->req_params['class_path'], 'func' => array( $this->req_params['class_nm'], 'process_delete_record' ) ), 'callback_params' => array ( 'delete_permanently' => $this->req_params['deletePermanently'] ), 'selected_ids' => $selected_ids, 'entire_task' => $this->entire_task, 'storewide_option' => $this->req_params['storewide_option'],'active_module' => $this->req_params['active_module'], 'entire_store' => $is_entire_store, 'dashboard_key' => $this->dashboard_key, 'dashboard_title' => $this->dashboard_title, 'class_path' => $this->req_params['class_path'], 'class_nm' => $this->req_params['class_nm'], 'backgroundProcessRunningMessage' => $this->req_params['backgroundProcessRunningMessage'], 'SM_IS_WOO30' => $this->req_params['SM_IS_WOO30'] ) ); } /** * Function to handle delete of a single record * * @param integer $deleting_id The ID of the record to be deleted. * @return boolean */ public static function process_delete_record( $params ) { $deleting_id = ( !empty( $params['id'] ) ) ? $params['id'] : ''; do_action('sm_pro_pre_process_delete_records', array( 'deleting_id' => $deleting_id, 'source' => __CLASS__ ) ); //code for processing logic for duplicate records if( empty( $deleting_id ) ) { return false; } $force_delete = ( !empty($params['delete_permanently']) ) ? true : false; $default_process = apply_filters( 'sm_pro_default_process_delete_records', true ); $result = false; if( ! empty( $default_process ) ){ $result = ( $force_delete ) ? wp_delete_post( $deleting_id, $force_delete ) : wp_trash_post( $deleting_id ); } $params[$force_delete] = $force_delete; $result = apply_filters( 'sm_pro_default_process_delete_records_result', $result, $deleting_id, $params ); do_action( 'sm_pro_post_process_delete_records', array( 'deleting_id' => $deleting_id, 'source' => __CLASS__ ) ); if( empty( $result ) ) { if ( is_callable( array( 'Smart_Manager', 'log' ) ) ) { Smart_Manager::log( 'error', _x( 'Delete process failed', 'delete process', 'smart-manager-for-wp-e-commerce' ) ); } return false; } else { return true; } } /** * Function to get template base directory for Smart Manager templates * * @param string $template_name Template name. * @return string $template_base_dir Base directory for Smart Manager templates. */ public function get_template_base_dir( $template_name = '' ) { $template_base_dir = ''; $sm_dir_name = SM_PLUGIN_DIR . '/'; $sm_base_dir = 'woocommerce/' . $sm_dir_name; // First locate the template in woocommerce/smart-manager-for-wp-e-commerce folder of active theme. $template = locate_template( array( $sm_base_dir . $template_name, ) ); if ( ! empty( $template ) ) { $template_base_dir = $sm_base_dir; } else { // If not found then locate the template in smart-manager-for-wp-e-commerce folder of active theme. $template = locate_template( array( $sm_dir_name . $template_name, ) ); if ( ! empty( $template ) ) { $template_base_dir = $sm_dir_name; } } $template_base_dir = apply_filters( 'sm_template_base_dir', $template_base_dir, $template_name ); return $template_base_dir; } /** * Function to get modify the search cond for `any of/not any of` search operators * * @param string $cond Search condition. * @param array $search_params Advanced search params. * * @return string $cond Updated search condition. */ public function modify_search_cond( $cond = '', $search_params = array() ) { $operator = ( ! empty( $search_params['selected_search_operator'] ) ) ? $search_params['selected_search_operator'] : ''; if( empty( $operator ) ){ return $cond; } $val = ( ! empty( $search_params['search_value'] ) ) ? $search_params['search_value'] : ''; $col = ( ! empty( $search_params['search_col'] ) ) ? $search_params['search_col'] : ''; if( ! in_array( $operator, array( 'anyOf', 'notAnyOf' ) ) || empty( $val ) || empty( $col ) ){ return $cond; } $val = explode( "|", $val ); if( ! is_array( $val ) ){ return $cond; } $addln_cond = ''; if( ! empty( $search_params['is_meta_table'] ) ){ $addln_cond = $search_params['table_nm'] . ".meta_key LIKE '%". trim( $col ) . "%' AND "; $col = 'meta_value'; } $col = $search_params['table_nm'] . "." . $col; $cond = array_reduce( $val, function( $carry, $item ) use( $col, $operator, $addln_cond ){ return $carry . ( " ( ". $addln_cond . " " . $col . " ". ( ( 'notAnyOf' === $operator ) ? 'NOT ' : '' ) . "LIKE '%". trim( $item ) . "%'" . " ) ".( ( 'notAnyOf' === $operator ) ? 'AND' : 'OR' ) ); } ); return ( 'notAnyOf' === $operator ) ? ( ( " AND" === substr( $cond, -4 ) ) ? "( " . substr( $cond, 0, -4 ) . " )" : $cond ) : ( ( " OR" === substr( $cond, -3 ) ) ? "( " . substr( $cond, 0, -3 ) . " )" : $cond ); } /** * Function to get format the search value for `starts with/ends with` search operators * * @param string $search_value Searched value. * @param array $search_params Advanced search params. * * @return string $search_value Formatted searched value. */ public function format_search_value( $search_value = '', $search_params = array() ) { $operator = ( ! empty( $search_params['selected_search_operator'] ) ) ? $search_params['selected_search_operator'] : ''; if( empty( $operator ) ){ return $search_value; } switch( true ) { case( in_array( $operator, array( 'startsWith', 'notStartsWith' ) ) ): return $search_value. '%'; case( in_array( $operator, array( 'endsWith', 'notEndsWith' ) ) ): return '%'. $search_value; default: return $search_value; } } /** * Function to fetch column data type * * @param string $dashboard_key current dashboard name. * @return string $col_data_type column data type */ public static function get_column_data_type( $dashboard_key = '' ) { if ( empty( $dashboard_key ) ) { return; } $current_store_model = get_transient( 'sa_sm_' . $dashboard_key ); if ( empty( $current_store_model ) && is_array( $current_store_model ) ) { return; } $current_store_model = json_decode( $current_store_model, true ); $col_model = ( ! empty( $current_store_model['columns'] ) ) ? $current_store_model['columns'] : array(); if ( empty( $col_model ) ) { return; } $col_data_type = array(); $date_type_cols = array( 'sm.date', 'sm.datetime', 'sm.time', 'timestamp' ); //Code for storing the timestamp cols foreach ( $col_model as $col ) { if ( empty( $col['type'] ) ) { continue; } $col_data_type[ $col['src'] ] = ( ( in_array( $col['type'], $date_type_cols, true ) ) && ( ! empty( $col['date_type'] ) && ( 'timestamp' === $col['date_type'] ) ) ) ? 'timestamp' : $col['type']; } return $col_data_type; } /** * Function update the edited column titles for the specific dashboard * * @param array $args request params array. * @return void */ public static function update_column_titles( $args = array() ){ ( ! empty( $args['edited_column_titles'] ) && ! empty( $args['state_option_name'] ) ) ? update_option( $args['state_option_name'] .'_columns', array_merge( get_option( $args['state_option_name'] .'_columns', array() ), $args['edited_column_titles'] ), 'no' ) : ''; } /** * Function to batch update terms table related data * * @param array $args request params array. * @return boolean $update result of the function call. */ public static function batch_update_terms_table_data( $args = array() ) { if ( empty( $args ) || ( ! is_array( $args ) ) || empty( $args['operator'] ) || empty( $args['id'] ) || empty( $args['col_nm'] ) ) { return false; } $update = false; $value = ( is_array( $args['value'] ) && ! empty( $args['value'][0] ) ) ? intval( $args['value'][0] ) : intval( $args['value'] ); if ( ( ! empty( $args['copy_from_operators'] ) && is_array( $args['copy_from_operators'] ) ) && in_array( $args['operator'], $args['copy_from_operators'] ) ) { $value = $args['value']; } if ( 'remove_from' === $args['operator'] ) { return wp_remove_object_terms( $args['id'], $value, $args['col_nm'] ); } else { $append = ( 'add_to' === $args['operator'] ) ? true : false; return wp_set_object_terms( $args['id'], $value, $args['col_nm'], $append ); } } /** * Before deleting a post, do some cleanup like removing attached media. * * @param int $order_id Order ID. * @param WP_Post $post Post data. */ public function delete_attached_media( $post_id = 0, $post = null ) { if ( empty( intval( $post_id ) ) ) { return; } global $wpdb; $attachments = get_children( array( 'post_parent' => $post_id, 'post_type' => 'attachment', 'numberposts' => -1, 'post_status' => 'any' ) ); if ( empty( $attachments ) || ! is_array( $attachments ) ) { return; } $attached_media_post_ids = array(); $post_ids = array(); foreach ( $attachments as $attachment ) { $attachment_id = $attachment->ID; if ( empty( intval( $attachment_id ) ) ) { continue; } $attached_media_post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT post_id FROM {$wpdb->prefix}postmeta WHERE post_id <> %d AND meta_key = %s AND meta_value = %s", $post_id, '_thumbnail_id', $attachment_id ) ); $attached_media_post_ids = apply_filters( 'sm_delete_attachment_get_matching_gallery_images_post_ids', $attached_media_post_ids, array( 'post_id' => $post_id, 'attachment_id' => $attachment_id ) ); $post_ids = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT ID FROM {$wpdb->prefix}posts WHERE ID <> %d AND post_content LIKE '%wp-image-" . $attachment_id . "%' OR post_excerpt LIKE '%wp-image-" . $attachment_id . "%' OR post_content LIKE '%wp:image {\"id\":$attachment_id%' OR post_excerpt LIKE '%wp:image {\"id\":$attachment_id%'", $post_id ) ); } if ( empty( ( is_array( $attached_media_post_ids ) && is_array( $post_ids ) ) && array_merge( $attached_media_post_ids, $post_ids ) ) ) { wp_delete_attachment( $attachment_id, true ); wp_delete_post( $attachment_id, true ); } } /** * Get selected ids. * * @param WP_Post $post Post data. */ public function get_selected_ids_and_entire_store_flag() { $selected_ids = ( ! empty( $this->req_params['selected_ids'] ) ) ? json_decode( stripslashes( $this->req_params['selected_ids'] ), true ) : array(); $entire_store = false; if ( ( false === $this->entire_task ) && ( ! empty( $this->req_params['storewide_option'] ) ) && ( 'entire_store' === $this->req_params['storewide_option'] ) && ( ! empty( $this->req_params['active_module'] ) ) ) { $selected_ids = $this->get_entire_store_ids(); $entire_store = true; } return array( 'selected_ids' => $selected_ids, 'entire_store' => $entire_store ); } } } pro/classes/class-smart-manager-pro-product.php000064400000127130147600337620015643 0ustar00post_type = array('product', 'product_variation'); $this->plugin_path = untrailingslashit( plugin_dir_path( __FILE__ ) ); if ( file_exists(SM_PLUGIN_DIR_PATH . '/classes/class-smart-manager-product.php') ) { include_once SM_PLUGIN_DIR_PATH . '/classes/class-smart-manager-product.php'; $this->product = new Smart_Manager_Product( $dashboard_key ); } add_filter('sm_dashboard_model',array(&$this,'products_dashboard_model'),12,2); add_filter( 'sm_data_model', array( &$this, 'products_data_model' ), 12, 2 ); } public function __call( $function_name, $arguments = array() ) { if( empty( $this->product ) ) { return; } if ( ! is_callable( array( $this->product, $function_name ) ) ) { return; } if ( ! empty( $arguments ) ) { return call_user_func_array( array( $this->product, $function_name ), $arguments ); } else { return call_user_func( array( $this->product, $function_name ) ); } } public static function actions() { // add_filter('sm_beta_batch_update_entire_store_ids_query', __CLASS__. '::products_batch_update_entire_store_ids_query', 10, 1); add_filter('sm_beta_post_batch_process_args', __CLASS__. '::products_post_batch_process_args', 10, 1); add_action('sm_pre_batch_update_db_updates', __CLASS__. '::products_pre_batch_update_db_updates', 10, 2); add_filter('sm_post_batch_update_db_updates', __CLASS__. '::products_post_batch_update_db_updates', 10, 2); add_filter( 'sm_beta_batch_update_prev_value',__CLASS__. '::products_batch_update_prev_value', 12, 2 ); add_filter( 'sm_task_details_update_by_prev_val',__CLASS__. '::task_details_update_by_prev_val', 12, 1 ); add_filter( 'sm_disable_task_details_update',__CLASS__. '::disable_task_details_update', 12, 2 ); add_filter( 'sm_get_value_for_copy_from_operator',__CLASS__. '::get_value_for_copy_from_operator', 12, 2 ); add_filter( 'sm_update_value_for_copy_from_operator',__CLASS__. '::update_value_for_copy_from_operator', 12, 1 ); add_filter( 'sm_process_undo_args_before_update',__CLASS__. '::process_undo_args_before_update', 12, 1 ); add_filter( 'sm_task_update_action',__CLASS__. '::task_update_action', 12, 2 ); add_filter( 'sm_delete_attachment_get_matching_gallery_images_post_ids',__CLASS__. '::get_matching_gallery_images_post_ids', 12, 2 ); add_action( 'woocommerce_product_duplicate_before_save', __CLASS__. '::product_duplicate_before_save', 10, 2 ); add_action( 'sm_beta_pre_process_batch', __CLASS__. '::products_pre_batch_update' ); } public static function products_post_batch_process_args( $args ) { if( !empty( $args['operator'] ) && ( $args['operator'] == 'set_to_regular_price' || $args['operator'] == 'set_to_sale_price' ) ) { $col = ( $args['operator'] == 'set_to_regular_price' ) ? '_regular_price' : '_sale_price'; $args['value'] = get_post_meta( $args['id'], $col, true ); } return $args; } public function products_dashboard_model ($dashboard_model, $dashboard_model_saved) { global $wpdb; $numeric_columns = array( '_wc_booking_duration' => __( 'Booking duration', 'smart-manager-for-wp-e-commerce' ), '_wc_booking_min_duration' => __( 'Minimum duration', 'smart-manager-for-wp-e-commerce' ), '_wc_booking_max_duration' => __( 'Maximum duration', 'smart-manager-for-wp-e-commerce' ), '_wc_booking_cancel_limit' => __( 'Booking can be cancelled until', 'smart-manager-for-wp-e-commerce' ), '_wc_booking_min_persons_group' => __( 'Min persons', 'smart-manager-for-wp-e-commerce' ), '_wc_booking_max_persons_group' => __( 'Max persons', 'smart-manager-for-wp-e-commerce' ), '_wc_booking_qty' => __( 'Max bookings per block', 'smart-manager-for-wp-e-commerce' ), '_wc_booking_min_date' => __( 'Minimum block bookable', 'smart-manager-for-wp-e-commerce' ), '_wc_booking_max_date' => __( 'Maximum block bookable', 'smart-manager-for-wp-e-commerce' ), '_wc_booking_buffer_period' => __( 'Require a buffer period of', 'smart-manager-for-wp-e-commerce' ), // https://woocommerce.com/products/minmax-quantities/ 'minimum_allowed_quantity' => __( 'Minimum quantity', 'smart-manager-for-wp-e-commerce' ), 'maximum_allowed_quantity' => __( 'Maximum quantity', 'smart-manager-for-wp-e-commerce' ), 'group_of_quantity' => __( 'Group of...', 'smart-manager-for-wp-e-commerce' ), 'variation_minimum_allowed_quantity' => __( 'Variation Minimum quantity', 'smart-manager-for-wp-e-commerce' ), 'variation_maximum_allowed_quantity' => __( 'Variation Maximum quantity', 'smart-manager-for-wp-e-commerce' ), 'variation_group_of_quantity' => __( 'Variation Group of...', 'smart-manager-for-wp-e-commerce' ), // https://wordpress.org/plugins/minmax-quantity-for-woocommerce/ 'min_quantity' => __( 'Minimum Quantity', 'smart-manager-for-wp-e-commerce' ), 'max_quantity' => __( 'Maximum Quantity', 'smart-manager-for-wp-e-commerce' ), 'min_quantity_var' => __( 'Variation Minimum Quantity', 'smart-manager-for-wp-e-commerce' ), 'max_quantity_var' => __( 'Variation Maximum Quantity', 'smart-manager-for-wp-e-commerce' ), // https://wordpress.org/plugins/woo-min-max-quantity-limit/ '_wc_mmax_min' => __( 'Min Quantity', 'smart-manager-for-wp-e-commerce' ), '_wc_mmax_max' => __( 'Max Quantity', 'smart-manager-for-wp-e-commerce' ), // [WooCommerce Subscriptions](https://woocommerce.com/products/woocommerce-subscriptions/) '_subscription_price' => __( 'Subscription Price', 'smart-manager-for-wp-e-commerce' ), '_subscription_sign_up_fee' => __( 'Sign-up Fee', 'smart-manager-for-wp-e-commerce' ), '_subscription_trial_length' => __( 'Free Trial', 'smart-manager-for-wp-e-commerce' ), // [WooCommerce Cost Of Goods](https://woocommerce.com/products/woocommerce-cost-of-goods/) '_wc_cog_cost' => __( 'Cost of Good', 'smart-manager-for-wp-e-commerce' ), // [Germanized for WooCommerce](https://wordpress.org/plugins/woocommerce-germanized/) '_unit_product' => __( 'Product Units', 'smart-manager-for-wp-e-commerce' ), '_unit_base' => __( 'Unit Price Units', 'smart-manager-for-wp-e-commerce' ), '_unit_price_regular' => __( 'Regular Unit Price', 'smart-manager-for-wp-e-commerce' ), '_unit_price_sale' => __( 'Sale Unit Price', 'smart-manager-for-wp-e-commerce' ), ); $numeric_text_editor_columns = array( '_wc_booking_duration', '_wc_booking_min_duration', '_wc_booking_max_duration', '_wc_booking_cancel_limit', '_wc_booking_min_date', '_wc_booking_max_date' ); $checkbox_empty_one_columns = array( '_wc_booking_enable_range_picker' => __( 'Enable Calendar Range Picker?', 'smart-manager-for-wp-e-commerce' ), '_wc_booking_requires_confirmation' => __( 'Requires confirmation?', 'smart-manager-for-wp-e-commerce' ), '_wc_booking_user_can_cancel' => __( 'Can be cancelled?', 'smart-manager-for-wp-e-commerce' ), '_wc_booking_has_persons' => __( 'Has persons', 'smart-manager-for-wp-e-commerce' ), '_wc_booking_has_resources' => __( 'Has resources', 'smart-manager-for-wp-e-commerce' ), '_wc_booking_person_cost_multiplier' => __( 'Multiply all costs by person count', 'smart-manager-for-wp-e-commerce' ), '_wc_booking_person_qty_multiplier' => __( 'Count persons as bookings', 'smart-manager-for-wp-e-commerce' ), '_wc_booking_has_person_types' => __( 'Enable person types', 'smart-manager-for-wp-e-commerce' ), '_wc_booking_has_restricted_days' => __( 'Restrict start and end days?', 'smart-manager-for-wp-e-commerce' ), '_wc_booking_apply_adjacent_buffer' => __( 'Adjacent Buffering?', 'smart-manager-for-wp-e-commerce' ), ); $checkbox_zero_one_columns = array( // https://wordpress.org/plugins/woo-min-max-quantity-limit/ '_wc_mmax_prd_opt_enable' => __( 'Enable Min Max Quantity', 'smart-manager-for-wp-e-commerce' ), ); $checkbox_yes_no_columns = array( // https://woocommerce.com/products/minmax-quantities/ 'min_max_rules' => __( 'Min/Max Rules', 'smart-manager-for-wp-e-commerce' ), 'allow_combination' => __( 'Allow Combination', 'smart-manager-for-wp-e-commerce' ), 'minmax_do_not_count' => __( 'Order rules: Do not count', 'smart-manager-for-wp-e-commerce' ), 'minmax_cart_exclude' => __( 'Order rules: Exclude', 'smart-manager-for-wp-e-commerce' ), 'minmax_category_group_of_exclude' => __( 'Category group-of rules: Exclude', 'smart-manager-for-wp-e-commerce' ), 'variation_minmax_do_not_count' => __( 'Variation Order rules: Do not count', 'smart-manager-for-wp-e-commerce' ), 'variation_minmax_cart_exclude' => __( 'Variation Order rules: Exclude', 'smart-manager-for-wp-e-commerce' ), 'variation_minmax_category_group_of_exclude' => __( 'Variation Category group-of rules: Exclude', 'smart-manager-for-wp-e-commerce' ), // [Germanized for WooCommerce](https://wordpress.org/plugins/woocommerce-germanized/) '_unit_price_auto' => __( 'Calculate unit prices automatically', 'smart-manager-for-wp-e-commerce' ), ); $booking_duration_unit = array( 'month' => __( 'Month(s)', 'smart-manager-for-wp-e-commerce'), 'day' => __( 'Day(s)', 'smart-manager-for-wp-e-commerce' ), 'hour' => __( 'Hour(s)', 'smart-manager-for-wp-e-commerce' ), 'minute' => __( 'Minutes(s)', 'smart-manager-for-wp-e-commerce' ) ); $column_model = &$dashboard_model['columns']; foreach( $column_model as $key => &$column ) { if ( empty( $column['src'] ) ) continue; $src_exploded = explode("/",$column['src']); if (empty($src_exploded)) { $col_nm = $column['src']; } if ( sizeof($src_exploded) > 2 ) { $col_table = $src_exploded[0]; $cond = explode("=",$src_exploded[1]); if (sizeof($cond) == 2) { $col_nm = $cond[1]; } } else { $col_nm = $src_exploded[1]; $col_table = $src_exploded[0]; } if( empty( $col_nm ) ) { continue; } switch( $col_nm ) { case '_wc_booking_duration_type': $column['key'] = __( 'Booking Duration (Type)', 'smart-manager-for-wp-e-commerce' ); $column['name'] = $column['key']; $booking_duration_type = array( 'fixed' => __( 'Fixed blocks of', 'smart-manager-for-wp-e-commerce'), 'customer' => __( 'Customer defined blocks of', 'smart-manager-for-wp-e-commerce' ) ); $column = $this->generate_dropdown_col_model( $column, $booking_duration_type ); break; case '_wc_booking_duration_unit': $column['key'] = __( 'Booking Duration (Unit)', 'smart-manager-for-wp-e-commerce' ); $column['name'] = $column['key']; $column = $this->generate_dropdown_col_model( $column, $booking_duration_unit ); break; case '_wc_booking_cancel_limit_unit': $column['key'] = __( 'Booking can be cancelled until (Unit)', 'smart-manager-for-wp-e-commerce' ); $column['name'] = $column['key']; $column = $this->generate_dropdown_col_model( $column, $booking_duration_unit ); break; case '_wc_booking_min_date_unit': $column['key'] = __( 'Minimum block bookable (Unit)', 'smart-manager-for-wp-e-commerce' ); $column['name'] = $column['key']; $column = $this->generate_dropdown_col_model( $column, $booking_duration_unit ); break; case '_wc_booking_max_date_unit': $column['key'] = __( 'Maximum block bookable (Unit)', 'smart-manager-for-wp-e-commerce' ); $column['name'] = $column['key']; $column = $this->generate_dropdown_col_model( $column, $booking_duration_unit ); break; case '_wc_booking_calendar_display_mode': $column['key'] = __( 'Calendar display mode', 'smart-manager-for-wp-e-commerce' ); $column['name'] = $column['key']; $booking_calendar_display_mode = array( '' => __( 'Display calendar on click', 'smart-manager-for-wp-e-commerce' ), 'always_visible' => __( 'Calendar always visible', 'smart-manager-for-wp-e-commerce' ) ); $column = $this->generate_dropdown_col_model( $column, $booking_calendar_display_mode ); break; case '_wc_booking_resources_assignment': $column['key'] = __( 'Resources are...', 'smart-manager-for-wp-e-commerce' ); $column['name'] = $column['key']; $booking_resources_assignment = array( 'customer' => __( 'Customer selected', 'smart-manager-for-wp-e-commerce' ), 'automatic' => __( 'Automatically assigned', 'smart-manager-for-wp-e-commerce' ) ); $column = $this->generate_dropdown_col_model( $column, $booking_resources_assignment ); break; case '_wc_booking_default_date_availability': $column['key'] = __( 'All dates are...', 'smart-manager-for-wp-e-commerce' ); $column['name'] = $column['key']; $booking_resources_date_availability = array( 'available' => __( 'available by default', 'smart-manager-for-wp-e-commerce' ), 'non-available' => __( 'not-available by default', 'smart-manager-for-wp-e-commerce' ) ); $column = $this->generate_dropdown_col_model( $column, $booking_resources_date_availability ); break; case '_wc_booking_check_availability_against': $column['key'] = __( 'Check rules against...', 'smart-manager-for-wp-e-commerce' ); $column['name'] = $column['key']; $booking_resources_date_availability = array( '' => __( 'All blocks being booked', 'smart-manager-for-wp-e-commerce' ), 'start' => __( 'The starting block only', 'smart-manager-for-wp-e-commerce' ) ); $column = $this->generate_dropdown_col_model( $column, $booking_resources_date_availability ); break; case '_product_addons': $column['editor_schema'] = file_get_contents( SM_PLUGIN_DIR_PATH . '/pro/assets/js/json-schema/product-addons.json' ); break; case '_subscription_period_interval': $column['key'] = __( 'Subscription Periods', 'smart-manager-for-wp-e-commerce' ); $column['name'] = $column['key']; $subscription_period_interval = ( function_exists('wcs_get_subscription_period_interval_strings') ) ? wcs_get_subscription_period_interval_strings() : array(); $column = $this->generate_dropdown_col_model( $column, $subscription_period_interval ); break; case '_subscription_period': $column['key'] = $column['name'] = __( 'Billing Period', 'smart-manager-for-wp-e-commerce' ); $subscription_period = ( function_exists('wcs_get_subscription_period_strings') ) ? wcs_get_subscription_period_strings() : array(); $column = $this->generate_dropdown_col_model( $column, $subscription_period ); break; case '_subscription_length': $column['key'] = __( 'Expire After', 'smart-manager-for-wp-e-commerce' ); $column['name'] = $column['key']; $wcs_subscription_ranges = ( function_exists('wcs_get_subscription_ranges') ) ? wcs_get_subscription_ranges() : array(); $subscription_ranges = array( __( 'Never expire', 'smart-manager-for-wp-e-commerce' ) ); if( !empty( $wcs_subscription_ranges['day'] ) ) { foreach( $wcs_subscription_ranges['day'] as $key => $values ) { if( $key > 0 ) { $subscription_ranges[ $key ] = $key .' Renewals'; } } } $column = $this->generate_dropdown_col_model( $column, $subscription_ranges ); break; case '_subscription_trial_period': $column['key'] = __( 'Subscription Trial Period', 'smart-manager-for-wp-e-commerce' ); $column['name'] = $column['key']; $subscription_time_periods = ( function_exists('wcs_get_available_time_periods') ) ? wcs_get_available_time_periods() : array(); $column = $this->generate_dropdown_col_model( $column, $subscription_time_periods ); break; case ( !empty( $numeric_columns[ $col_nm ] ) ): $column['key'] = $numeric_columns[ $col_nm ]; $column['name'] = $column['key']; $column['type'] = 'numeric'; $column['editor'] = ( in_array( $col_nm, $numeric_text_editor_columns ) ) ? $column['type'] : 'customNumericEditor'; $column['min'] = 0; $column['width'] = 50; $column['align'] = 'right'; break; case ( !empty( $checkbox_empty_one_columns[ $col_nm ] ) ): $column['key'] = $checkbox_empty_one_columns[ $col_nm ]; $column['name'] = $column['key']; $column['type'] = 'checkbox'; $column['editor'] = $column['type']; $column['checkedTemplate'] = 1; $column['uncheckedTemplate'] = ''; $column['width'] = 30; break; case ( !empty( $checkbox_zero_one_columns[ $col_nm ] ) ): $column['key'] = $checkbox_zero_one_columns[ $col_nm ]; $column['name'] = $column['key']; $column['type'] = 'checkbox'; $column['editor'] = $column['type']; $column['checkedTemplate'] = 1; $column['uncheckedTemplate'] = 0; $column['width'] = 30; break; case ( !empty( $checkbox_yes_no_columns[ $col_nm ] ) ): $column['key'] = $checkbox_yes_no_columns[ $col_nm ]; $column['name'] = $column['key']; $column['type'] = 'checkbox'; $column['editor'] = $column['type']; $column['checkedTemplate'] = 'yes'; $column['uncheckedTemplate'] = 'no'; $column['width'] = 30; break; // [Germanized for WooCommerce](https://wordpress.org/plugins/woocommerce-germanized/) case 'product_unit': $column ['type']= 'dropdown'; $column ['renderer']= 'selectValueRenderer'; $column ['editable']= false; $column ['editor']= 'select'; $column ['strict'] = true; $column ['allowInvalid'] = false; $column ['selectOptions'] = $column['values']; break; case '_unit': $column ['type']= 'dropdown'; $column ['renderer']= 'selectValueRenderer'; $column ['editable']= false; $column ['editor']= 'select'; $column ['strict'] = true; $column ['allowInvalid'] = false; $column ['values'] = $column ['selectOptions'] = array(); $column ['search_values'] = array(); if( function_exists( 'WC_Germanized' ) ){ $wc_germanized = WC_Germanized(); if( is_callable( array( $wc_germanized, 'plugin_path' ) ) ){ $column ['values'] = $column ['selectOptions'] = ( file_exists( $wc_germanized->plugin_path() . '/i18n/units.php' ) ) ? include( $wc_germanized->plugin_path() . '/i18n/units.php' ) : array(); if( ! empty( $column ['values'] ) ){ foreach( $column ['values'] as $key => $value ) { $column['search_values'][] = array( 'key' => $key, 'value' => $value ); } } } } break; } } if (!empty($dashboard_model_saved)) { $col_model_diff = sm_array_recursive_diff($dashboard_model_saved,$dashboard_model); } //clearing the transients before return if (!empty($col_model_diff)) { delete_transient( 'sa_sm_'.$this->dashboard_key ); } return $dashboard_model; } public static function products_batch_update_entire_store_ids_query( $query ) { global $wpdb; $query = $wpdb->prepare( "SELECT ID FROM {$wpdb->prefix}posts WHERE 1=%d AND post_type IN ('product', 'product_variation')", 1 ); return $query; } public static function products_pre_batch_update_db_updates($args) { if( !empty( $args['id'] ) && ( !empty( $args['table_nm'] ) && $args['table_nm'] == 'posts' ) && ( !empty( $args['col_nm'] ) && $args['col_nm'] == 'post_title' ) && !empty( Smart_Manager::$sm_is_woo30 ) ) { $results = sm_get_current_variation_title( array($args['id']) ); if( count( $results ) > 0 ) { foreach( $results as $result ) { self::$_instance->variation_product_old_title[ $result['id'] ] = $result['post_title']; } } } } public static function products_post_batch_update_db_updates($update_flag = false, $args = array()) { //code for handling updation of price & sales pice in woocommerce $price_columns = array( '_regular_price', '_sale_price', '_sale_price_dates_from', '_sale_price_dates_to'); if ( ! empty( $args['table_nm'] ) && ( 'postmeta' === $args['table_nm'] ) && ( ( ! empty( $args['col_nm'] ) ) && ( true === in_array( $args['col_nm'], $price_columns ) ) ) ) { switch ( $args['col_nm'] ) { case '_sale_price_dates_from': update_post_meta( $args['id'], '_sale_price_dates_from', sa_sm_get_utc_timestamp_from_site_date( $args['value'].' 00:00:00' ) ); break; case '_sale_price_dates_to': update_post_meta( $args['id'], '_sale_price_dates_to', sa_sm_get_utc_timestamp_from_site_date( $args['value'].' 23:59:59' ) ); break; // Code to handle setting of 'regular_price' & 'sale_price' in proper way case ( empty( $args['operator'] ) || ( ! empty( $args['operator'] ) && ! in_array( $args['operator'], array( 'set_to_regular_price', 'set_to_sale_price', 'copy_from_field' ) ) ) ): $regular_price = ( '_regular_price' === $args['col_nm'] ) ? $args['value'] : get_post_meta( $args['id'], '_regular_price', true ); $sale_price = ( '_sale_price' === $args['col_nm'] ) ? $args['value'] : get_post_meta( $args['id'], '_sale_price', true ); if ( $sale_price >= $regular_price ) { update_post_meta( $args['id'], '_sale_price', '' ); } break; } sm_update_price_meta(array($args['id'])); //Code For updating the parent price of the product sm_variable_parent_sync_price(array($args['id'])); $update_flag = true; } if ( ! empty( $args['table_nm'] ) && 'postmeta' === $args['table_nm'] && ( ! empty( $args['col_nm'] ) && in_array( $args['col_nm'], array( '_stock', '_backorders' ) ) ) ) { //For handling product inventory updates $update_flag = sm_update_stock_status( $args['id'], $args['col_nm'], $args['value'] ); } // Code for 'WooCommerce Product Stock Alert' plugin compat -- triggering `save_post` action if ( !empty($args['table_nm']) && $args['table_nm'] == 'postmeta' && (!empty($args['col_nm']) && ( '_stock' === $args['col_nm'] || '_manage_stock' === $args['col_nm'] )) ) { sm_update_post( $args['id'] ); } //code to sync the variations title if the variation parent title has been updated if( !empty( Smart_Manager::$sm_is_woo30 ) && ( !empty( $args['table_nm'] ) && $args['table_nm'] == 'posts' ) && ( !empty( $args['col_nm'] ) && $args['col_nm'] == 'post_title' ) ) { $new_title = ( !empty( $args['value'] ) ) ? $args['value'] : ''; if( !empty( self::$_instance->variation_product_old_title[ $args['id'] ] ) && self::$_instance->variation_product_old_title[ $args['id'] ] != $new_title ) { $new_title_update_case = 'WHEN post_parent='. $args['id'] .' THEN REPLACE(post_title, \''. self::$_instance->variation_product_old_title[ $args['id'] ] .'\', \''. $new_title .'\')'; sm_sync_variation_title( array($new_title_update_case), array($args['id']) ); } } if( ( ! empty( $args['table_nm'] ) && 'terms' === $args['table_nm'] ) && ( ! empty( $args['col_nm'] ) && 'product_visibility' === $args['col_nm'] ) ) { $val = ( ! empty( $args['value'] ) ) ? $args['value'] : ''; $update_flag = self::$_instance->set_product_visibility( $args['id'], $val ); } if( ( !empty( $args['table_nm'] ) && $args['table_nm'] == 'terms' ) && ( !empty( $args['col_nm'] ) && $args['col_nm'] == 'product_visibility_featured' ) ) { $val = ( !empty( $args['value'] ) ) ? $args['value'] : ''; $update_flag = ( $val == "Yes" || $val == "yes" ) ? wp_set_object_terms( $args['id'], 'featured', 'product_visibility', true ) : wp_remove_object_terms( $args['id'], 'featured', 'product_visibility' ); } //Code for updating product attributes if ( ! empty( $args['table_nm'] ) && 'custom' === $args['table_nm'] && ( !empty( $args['col_nm'] ) && in_array( $args['col_nm'], array( 'product_attributes', 'product_attributes_add', 'product_attributes_remove' ) ) || ( ! empty($args['operator'] ) && in_array( $args['operator'], array( 'add_to', 'remove_from', 'copy_from' ) ) ) ) && ( ! empty( $args['meta']['attributeName'] ) ) ) { $action = $args['meta']['attributeName']; $current_term_ids = array(); if( !empty($action) ) { delete_transient( 'wc_layered_nav_counts_' . $action ); } $product_attributes = get_post_meta( $args['id'], '_product_attributes', true ); if( empty( $product_attributes ) || ! is_array( $product_attributes ) ) { $product_attributes = array(); } $all_terms_ids = array(); if( !empty($action) && $action != 'custom' ) { $current_term_ids = wp_get_object_terms( $args['id'], $action, 'orderby=none&fields=ids' ); $current_term_ids = ( ! is_wp_error( $current_term_ids ) ) ? $current_term_ids : array(); if( !empty($args['value']) && $args['value'] == 'all' ) { //creating array of all values for the attribute $taxonomy_terms = get_terms($action, array('hide_empty'=> 0,'orderby'=> 'id')); if (!empty($taxonomy_terms)) { foreach ($taxonomy_terms as $term_obj) { $all_terms_ids[] = $term_obj->term_id; } } } } if ( 'add_to' === $args['operator'] ) { if( !empty($action) && $action != 'custom' ) { if( ( is_array( $current_term_ids ) ) && !in_array($args['value'], $current_term_ids) ) { if( $args['value'] != 'all' ) { $current_term_ids[] = intval( $args['value'] ); } else { $current_term_ids = $all_terms_ids; } $update_flag = wp_set_object_terms( $args['id'], $current_term_ids, $action ); } if( empty($product_attributes[$action]) ) { $product_attributes[$action] = array( 'name' => $action, 'value' => '', 'position' => 1, 'is_visible' => 1, 'is_variation' => 0, 'is_taxonomy' => 1 ); } } else if( !empty($action) && $action == 'custom' ) { $value = ( (!empty($args['value2'])) ? $args['value2'] : '' ); if( !empty($product_attributes[$args['value']]) ) { $product_attributes[$args['value']]['value'] = $value; } else { $product_attributes[$args['value']] = array( 'name' => $args['value'], 'value' => $value, 'position' => 1, 'is_visible' => 1, 'is_variation' => 0, 'is_taxonomy' => 0 ); } $update_flag = true; } } else if ( 'remove_from' === $args['operator'] ) { if( !empty($action) && $action != 'custom' ) { $all = ( !empty($args['value']) && $args['value'] == 'all') ? true : false; $key = array_search($args['value'], $current_term_ids); if( $key !== false ) { unset($current_term_ids[$key]); $update_flag = wp_set_object_terms( $args['id'], $current_term_ids, $action ); } else if( $all === true ) { $update_flag = wp_set_object_terms( $args['id'], array(), $action ); } if( (count($current_term_ids) == 0 || $all === true) && !empty($product_attributes[$action]) ) { unset($product_attributes[$action]); } } } else if ( 'copy_from' === $args['operator'] && ( ! empty( $args['selected_value'] ) ) && ( ! empty( $args['id'] ) ) ) { if ( ! empty( $args['value'] ) && is_array( $args['value'] ) ) { foreach ( $args['value'] as $action => $value ) { wp_set_object_terms( $args['id'], array(), $action ); $current_term_ids = wp_get_object_terms( $args['selected_value'], $action, 'orderby=none&fields=ids' ); $update_flag = wp_set_object_terms( $args['id'], $current_term_ids, $action ); if ( empty( $product_attributes[ $action ] ) ) { $product_attributes[ $action ] = array( 'name' => $action, 'value' => '', 'position' => 1, 'is_visible' => 1, 'is_variation' => 0, 'is_taxonomy' => 1 ); } } } } update_post_meta( $args['id'], '_product_attributes', $product_attributes ); sm_update_product_attribute_lookup_table( array( $args['id'] ) ); } //Code for updating product categories if( !empty($args['table_nm']) && $args['table_nm'] == 'custom' && (!empty($args['col_nm']) && strpos($args['col_nm'], 'product_cat') !== false ) ) { $action = ( !empty($args['operator']) ) ? $args['operator'] : ''; $value = ( !empty($args['value']) ) ? intval( $args['value'] ) : 0; $taxonomy_nm = 'product_cat'; $current_term_ids = array(); if( !empty($action) && $action != 'set_to' ) { $current_term_ids = wp_get_object_terms( $args['id'], $taxonomy_nm, 'orderby=none&fields=ids' ); if( $action == 'add_to' ) { $current_term_ids[] = $value; } else if( $action == 'remove_from' ) { $key = array_search($value, $current_term_ids); if( $key !== false ) { unset($current_term_ids[$key]); } } } else if( !empty($action) && $action == 'set_to' ) { $current_term_ids = array( $value ); } $update_flag = wp_set_object_terms( $args['id'], $current_term_ids, $taxonomy_nm ); } //product clear_caches clean_post_cache( $args['id'] ); wc_delete_product_transients( $args['id'] ); if ( class_exists( 'WC_Cache_Helper' ) ) { ( !empty( Smart_Manager::$sm_is_woo39 ) && is_callable( array('WC_Cache_Helper', 'invalidate_cache_group') ) ) ? WC_Cache_Helper::invalidate_cache_group( 'product_' . $args['id'] ) : WC_Cache_Helper::incr_cache_prefix( 'product_' . $args['id'] ); } do_action( 'woocommerce_update_product', $args['id'], wc_get_product( $args['id'] ) ); return ( ( ! empty( $update_flag ) ) && ( ! is_wp_error( $update_flag ) ) ) ? true : false; } //function to process duplicate products logic public static function process_duplicate_record( $params ) { $original_id = ( !empty( $params['id'] ) ) ? $params['id'] : ''; //code for processing logic for duplicate products if( empty( $original_id ) ) { return false; } $identifier = ''; if ( is_callable( array( 'Smart_Manager_Pro_Background_Updater', 'get_identifier' ) ) ) { $identifier = Smart_Manager_Pro_Background_Updater::get_identifier(); } if( empty( $identifier ) ) { return; } $background_process_params = get_option( $identifier.'_params', false ); if( empty( $background_process_params ) ) { return; } do_action('sm_beta_pre_process_duplicate_products', $original_id ); $product = wc_get_product( $original_id ); $parent_id = 0; $woo_dup_obj = ''; $dup_prod_id = ''; if( !empty( $background_process_params ) && (!empty( $background_process_params['SM_IS_WOO30'] ) || !empty( $background_process_params['SM_IS_WOO22'] ) || !empty( $background_process_params['SM_IS_WOO21'] ) ) ) { $parent_id = wp_get_post_parent_id($original_id); $file = WP_PLUGIN_DIR . '/woocommerce/includes/admin/class-wc-admin-duplicate-product.php'; if( file_exists( $file ) ) { include_once ( $file ); // for handling the duplicate product functionality } if ( class_exists( 'WC_Admin_Duplicate_Product' ) ) { $woo_dup_obj = new WC_Admin_Duplicate_Product(); } } else { $file = WP_PLUGIN_DIR . '/woocommerce/admin/includes/duplicate_product.php'; if( file_exists( $file ) ) { include_once ( $file ); // for handling the duplicate product functionality } $post = get_post( $original_id ); $parent_id = $post->post_parent; } if ($parent_id == 0) { if ($woo_dup_obj instanceof WC_Admin_Duplicate_Product) { if( !empty( $background_process_params ) && !empty( $background_process_params['SM_IS_WOO30'] ) ) { $product = wc_get_product( $original_id ); $dup_prod = $woo_dup_obj->product_duplicate( $product ); do_action( 'woocommerce_product_duplicate', $dup_prod, $product ); // Added for supporting custom fields when duplicating the product. if( !is_wp_error($dup_prod) ) { $dup_prod_id = $dup_prod->get_id(); } } else { $dup_prod_id = $woo_dup_obj -> duplicate_product($post,0,$post->post_status); } } else { $dup_prod_id = woocommerce_create_duplicate_from_product($post,0,$post->post_status); //TODO check } //Code for updating the post name if( !empty( $background_process_params ) && empty( $background_process_params['SM_IS_WOO30'] ) ) { $new_slug = sanitize_title( get_the_title($dup_prod_id) ); wp_update_post( array ( 'ID' => $dup_prod_id, 'post_name' => $new_slug ) ); } } if( is_wp_error($dup_prod_id) ) { return false; } else { return true; } } /** * Get previous values for the taxonomy * * @param string $prev_val previous value for current taxonomy * @param array $args args has id, column name and table name * @return result of function call or empty value */ public static function products_batch_update_prev_value( $prev_val = '', $args = array() ) { if ( 'custom' === $args['table_nm'] && 'product_attributes' === $args['col_nm'] && !empty( $args['meta']['attributeName'] ) ) { $result = wp_get_object_terms( $args['id'], $args['meta']['attributeName'], 'orderby=none&fields=ids' ); return ( ( ! empty( $result ) ) && ( ! is_wp_error( $result ) ) ) ? $result : $prev_val; } return $prev_val; } /** * Update update_task_details_params param by using previous value * * @param array $args args has array of task details update values * @return void */ public static function task_details_update_by_prev_val( $args = array() ) { if ( empty( $args ) ) { return $args; } $field_name = ''; foreach ( $args as $arg ) { if ( ! empty( $arg['prev_val'] ) && is_array( $arg['prev_val'] ) ) { foreach ( $arg['prev_val'] as $key => $prev_val ) { switch (true) { case empty( $prev_val ): $field_name = 'custom/product_attributes_add'; break; case ( ! empty( $prev_val ) && ( empty( in_array( $arg['updated_val'], $arg['prev_val'] ) ) && ( 'all' === $arg['updated_val'] && ( 'add_to' === $arg['operator'] ) ) ) ): $field_name = 'custom/product_attributes_remove'; break; case ( ! empty( $prev_val ) && ! empty( in_array( $arg['updated_val'], $arg['prev_val'] ) ) ): $field_name = 'custom/product_attributes_add'; break; case ( ! empty( $prev_val ) && ( empty( in_array( $arg['updated_val'], $arg['prev_val'] ) ) || ( 'all' === $arg['updated_val'] && ( 'remove_from' === $arg['operator'] ) ) ) ): $field_name = 'custom/product_attributes_add'; break; } if ( ( ! empty( $arg['task_id'] ) ) ) { Smart_Manager_Base::$update_task_details_params[] = array( 'task_id' => $arg['task_id'], 'action' => $arg['action'], 'status' => $arg['status'], 'record_id' => $arg['record_id'], 'field' => $field_name, 'prev_val' => $prev_val, 'updated_val' => $arg['updated_val'], ); } } } else if ( empty( $arg['prev_val'] ) && ! is_array( $arg['prev_val'] ) ) { $field_name = 'custom/product_attributes_remove'; if ( ( ! empty( $arg['task_id'] ) ) ) { Smart_Manager_Base::$update_task_details_params[] = array( 'task_id' => $arg['task_id'], 'action' => $arg['action'], 'status' => $arg['status'], 'record_id' => $arg['record_id'], 'field' => $field_name, 'prev_val' => $arg['updated_val'], 'updated_val' => $arg['updated_val'], ); } } } } /** * Disable task details update * * @param array $prev_val prev_val has previous value * @param string $field_nm field name * @return boolean */ public static function disable_task_details_update( $prev_val = array(), $field_nm = '' ) { return ( ( ! empty( $prev_val ) ) && ( 'postmeta/meta_key=_product_attributes/meta_value=_product_attributes' === $field_nm ) ) ? true : false; } /** * Get value for copy from operator * * @param string $new_val new value * @param array $args array of selected field, operator and value * @return array value of selected column */ public static function get_value_for_copy_from_operator( $new_val = '', $args = array() ) { if ( empty( $args['selected_column_name'] ) || ( 'product_attributes' !== $args['selected_column_name'] ) || empty( intval( $args['selected_value'] ) ) ) { return $new_val; } return get_post_meta( $args['selected_value'], '_product_attributes', true ); } /** * Update value for copy from operator * * @param array $args array of selected field, operator and value * @return boolean */ public static function update_value_for_copy_from_operator( $args = array() ) { if ( empty( $args['id'] ) || ( 'product_attributes' !== $args['col_nm'] ) || ( ! isset( $args['value'] ) ) ) { return false; } return update_post_meta( $args['id'], '_product_attributes', $args['value'] ); } /** * Update task args before processing undo * * @param array $args array of selected field, operator and value * @return array $args array of updated args */ public static function process_undo_args_before_update( $args = array() ) { if ( empty( $args['type'] ) || empty( $args['operator'] ) || ( ! in_array( $args['type'], array( 'custom/product_attributes_add', 'custom/product_attributes_remove' ) ) ) ) { return $args; } if ( empty( $args['meta']['attributeName'] ) ) { $args['meta']['attributeName'] = $args['operator']; } switch ( $args['type'] ) { case 'custom/product_attributes_add': $args['operator'] = 'add_to'; break; case 'custom/product_attributes_remove': $args['operator'] = 'remove_from'; break; } $args['type'] = 'custom/product_attributes'; return $args; } /** * Update task action * * @param string $operator operator name * @param array $args array of field, operator and value * @return string action name */ public static function task_update_action( $operator = '', $args = array() ) { if ( empty( $args['type'] ) || ( 'custom/product_attributes' !== $args['type'] ) || empty( $operator ) || empty( $args['meta']['attributeName'] ) ) { return $operator; } return $args['meta']['attributeName']; } /** * Get gallery images post ids * * @param array $attached_media_post_ids attached media post ids * @param array $args array of post id and attachment id * @return array $attached_media_post_ids Updated value of attached media post ids */ public static function get_matching_gallery_images_post_ids( $attached_media_post_ids = array(), $args = array() ) { if ( ! is_array( $attached_media_post_ids ) || empty( $args ) || ! is_array( $args ) || empty( $args['post_id'] ) || empty( $args['attachment_id'] ) ) { return $attached_media_post_ids; } global $wpdb; $results = $wpdb->get_col( $wpdb->prepare( "SELECT DISTINCT post_id FROM {$wpdb->prefix}postmeta WHERE post_id <> %d AND meta_key = %s AND meta_value REGEXP %s", $args['post_id'], '_product_image_gallery', $args['attachment_id'] ) ); // Improve REGEXP. if ( empty( $results ) || ! is_array( $results ) ) { return $attached_media_post_ids; } return array_merge( $attached_media_post_ids, $results ); } /** * Function for updating value before saving duplicate product * * @param WC_Product $duplicate product object for duplicate * @param WC_Product $product product object * @return void */ public static function product_duplicate_before_save( $duplicate = null, $product = null ) { if ( ( is_admin() && ! empty( $_GET['page'] ) && ( 'smart-manager' !== $_GET['page'] ) ) || empty( $duplicate ) || empty( $product ) ) { return; } $status = ( is_callable( array( $product, 'get_status' ) ) ) ? $product->get_status() : ''; if ( ! empty( $status ) && is_callable( array( $duplicate, 'set_status' ) ) ) { $duplicate->set_status( $status ); } } /** * Adding new custom column in data model for stock column color code based on each product level low stock threshold * * @param array $data_model data model array. * @param array $data_col_params data columns params array. * @return array $data_model Updated data model array */ public function products_data_model( $data_model = array(), $data_col_params = array() ) { if ( empty( $data_model ) || ! is_array( $data_model ) || empty( $data_model['items'] ) || ! is_array( $data_model['items'] ) ) { return $data_model; } $color_code = 'red'; foreach ( $data_model['items'] as $key => $data ) { if ( empty( $data['postmeta_meta_key__stock_meta_value__stock'] ) || empty( $data['posts_id'] ) ) { continue; } $low_stock_threshold = get_post_meta( $data['posts_id'], '_low_stock_amount', true ); $low_stock_threshold = ( '' !== $low_stock_threshold ) ? absint( $low_stock_threshold ) : -1; if ( $low_stock_threshold < 0 ) { continue; } switch ( true ) { case ( absint( $data['postmeta_meta_key__stock_meta_value__stock'] ) > absint( $low_stock_threshold ) ): $color_code = 'green'; break; case ( absint( $data['postmeta_meta_key__stock_meta_value__stock'] ) <= absint( $low_stock_threshold ) && ! empty( absint( $data['postmeta_meta_key__stock_meta_value__stock'] ) ) ): $color_code = 'yellow'; break; } $data_model['items'][ $key ]['custom_stock_color_code'] = $color_code; } return $data_model; } /** * Update certain columns before doing batch update * * @param array $args array of update related data. * @return void */ public static function products_pre_batch_update( $args = array() ) { if ( empty( $args['type'] ) || ( ! empty( $args['type'] ) && ( 'postmeta/meta_key=_sale_price/meta_value=_sale_price' !== $args['type'] ) ) || ( ! in_array( $args['operator'], array( 'increase_by_per', 'decrease_by_per', 'increase_by_num', 'decrease_by_num' ) ) ) || empty( $args['id'] ) ) { return; } $regular_price = get_post_meta( $args['id'], '_regular_price', true ); if ( ! empty( $regular_price ) && empty( get_post_meta( $args['id'], '_sale_price', true ) ) ) { update_post_meta( $args['id'], '_sale_price', $regular_price ); } } } //End of Class } pro/classes/class-smart-manager-pro-acf-field.php000064400000007422147600337620015776 0ustar00hooks(); $this->plugin_path = untrailingslashit( plugin_dir_path( __FILE__ ) ); } public static function actions() { } public function hooks() { add_filter('sm_dashboard_model',array(&$this,'dashboard_model'),10,2); } public function dashboard_model ($dashboard_model, $dashboard_model_saved) { $visible_columns = array( 'ID', 'post_excerpt', 'post_title', 'post_name', 'post_content', 'post_parent' ); $column_titles = array( 'post_title' => __( 'Label', 'smart-manager-for-wp-e-commerce' ), 'post_excerpt' => __( 'Name', 'smart-manager-for-wp-e-commerce' ), 'post_content' => __( 'Config Options', 'smart-manager-for-wp-e-commerce' ), 'post_name' => __( 'Key', 'smart-manager-for-wp-e-commerce' ), 'post_parent' => __( 'Group Id', 'smart-manager-for-wp-e-commerce' ), ); $serialized_columns = array( 'post_content' ); $numeric_columns = array( 'id', 'post_author', 'post_parent', 'menu_order', 'comment_count', 'post_id' ); $datetime_columns = array( 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt'); $column_model = &$dashboard_model['columns']; foreach ( $column_model as $key => &$column ) { if (empty($column['src'])) continue; $src_exploded = explode("/",$column['src']); if (empty($src_exploded)) { $src = $column['src']; } if ( sizeof($src_exploded) > 2) { $col_table = $src_exploded[0]; $cond = explode("=",$src_exploded[1]); if (sizeof($cond) == 2) { $src = $cond[1]; } } else { $src = $src_exploded[1]; $col_table = $src_exploded[0]; } if ( empty( $dashboard_model_saved ) ) { //Code for unsetting the position for hidden columns if ( ! empty( $column['position'] ) ) { unset( $column['position'] ); } $position = array_search( $src, $visible_columns ); if ( $position !== false ) { $column['position'] = $position + 1; $column['hidden'] = false; } else { $column['hidden'] = true; } } if ( ! empty( $src ) ) { if ( empty( $dashboard_model_saved ) ) { if( ! empty( $column_titles[ $src ] ) ){ $column['name'] = $column['key'] = $column_titles[ $src ]; } if ( in_array( $src, $numeric_columns ) ) { $column['type'] = 'numeric'; $column['editor'] = 'customNumericEditor'; } elseif ( in_array( $src, $datetime_columns ) ) { $column['type'] = $column['editor'] = 'sm.datetime'; } elseif ( in_array( $src, $serialized_columns ) ) { $column['type'] = $column['editor'] = 'sm.serialized'; $column['editor_schema'] = false; } elseif( 'post_excerpt' === $src ){ $column['type'] = $column['editor'] = 'text'; } } } } if (!empty($dashboard_model_saved)) { $col_model_diff = sm_array_recursive_diff( $dashboard_model_saved, $dashboard_model ); } //clearing the transients before return if (!empty($col_model_diff)) { delete_transient( 'sa_sm_'.$this->dashboard_key ); } return $dashboard_model; } } } pro/classes/class-smart-manager-pro-acf-field-group.php000064400000007274147600337620017135 0ustar00hooks(); $this->plugin_path = untrailingslashit( plugin_dir_path( __FILE__ ) ); } public static function actions() { } public function hooks() { add_filter('sm_dashboard_model',array(&$this,'dashboard_model'),10,2); } public function dashboard_model ($dashboard_model, $dashboard_model_saved) { $visible_columns = array( 'ID', 'post_excerpt', 'post_title', 'post_name', 'post_content', 'edit_link' ); $column_titles = array( 'post_title' => __( 'Label', 'smart-manager-for-wp-e-commerce' ), 'post_excerpt' => __( 'Name', 'smart-manager-for-wp-e-commerce' ), 'post_content' => __( 'Config Options', 'smart-manager-for-wp-e-commerce' ), 'post_name' => __( 'Key', 'smart-manager-for-wp-e-commerce' ), ); $serialized_columns = array( 'post_content' ); $numeric_columns = array( 'id', 'post_author', 'post_parent', 'menu_order', 'comment_count', 'post_id' ); $datetime_columns = array( 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt'); $column_model = &$dashboard_model['columns']; foreach ( $column_model as $key => &$column ) { if (empty($column['src'])) continue; $src_exploded = explode("/",$column['src']); if (empty($src_exploded)) { $src = $column['src']; } if ( sizeof($src_exploded) > 2) { $col_table = $src_exploded[0]; $cond = explode("=",$src_exploded[1]); if (sizeof($cond) == 2) { $src = $cond[1]; } } else { $src = $src_exploded[1]; $col_table = $src_exploded[0]; } if ( empty( $dashboard_model_saved ) ) { //Code for unsetting the position for hidden columns if ( ! empty( $column['position'] ) ) { unset( $column['position'] ); } $position = array_search( $src, $visible_columns ); if ( $position !== false ) { $column['position'] = $position + 1; $column['hidden'] = false; } else { $column['hidden'] = true; } } if ( ! empty( $src ) ) { if ( empty( $dashboard_model_saved ) ) { if( ! empty( $column_titles[ $src ] ) ){ $column['name'] = $column['key'] = $column_titles[ $src ]; } if ( in_array( $src, $numeric_columns ) ) { $column['type'] = 'numeric'; $column['editor'] = 'customNumericEditor'; } elseif ( in_array( $src, $datetime_columns ) ) { $column['type'] = $column['editor'] = 'sm.datetime'; } elseif ( in_array( $src, $serialized_columns ) ) { $column['type'] = $column['editor'] = 'sm.serialized'; $column['editor_schema'] = false; } elseif( 'post_excerpt' === $src ){ $column['type'] = $column['editor'] = 'text'; } } } } if (!empty($dashboard_model_saved)) { $col_model_diff = sm_array_recursive_diff( $dashboard_model_saved, $dashboard_model ); } //clearing the transients before return if (!empty($col_model_diff)) { delete_transient( 'sa_sm_'.$this->dashboard_key ); } return $dashboard_model; } } } pro/classes/class-smart-manager-pro-task.php000064400000041771147600337620015133 0ustar00dashboard_key = $dashboard_key; if ( file_exists(SM_PLUGIN_DIR_PATH . '/classes/class-smart-manager-task.php') ) { include_once SM_PLUGIN_DIR_PATH . '/classes/class-smart-manager-task.php'; $this->task = new Smart_Manager_Task( $dashboard_key ); } $this->store_col_model_transient_option_nm = 'sa_sm_' . $this->dashboard_key . '_tasks'; // Kept this here as it will override the base file $this->store_col_model_transient_option_nm. } /** * Add filters for doing actions * * @return void */ public static function actions() { add_filter( 'sm_beta_background_entire_store_ids_from', __CLASS__ . '::undo_all_task_ids_from_clause' ); add_filter( 'sm_beta_background_entire_store_ids_where', __CLASS__ . '::undo_all_task_ids_where_clause' ); add_filter( 'sm_post_batch_update_db_updates', __CLASS__ . '::post_undo', 10, 2 ); add_action( 'sm_background_process_complete', __CLASS__ . '::background_process_complete' ); } public function __call( $function_name, $arguments = array() ) { if( empty( $this->task ) ) { return; } if ( ! is_callable( array( $this->task, $function_name ) ) ) { return; } if ( ! empty( $arguments ) ) { return call_user_func_array( array( $this->task, $function_name ), $arguments ); } else { return call_user_func( array( $this->task, $function_name ) ); } } /** * Undo changes for task records * * @return void */ public function undo() { $this->get_task_detail_ids( '_undo_task_id' ); $get_selected_ids_and_entire_store_flag = $this->get_selected_ids_and_entire_store_flag(); $selected_ids = ( ! empty( $get_selected_ids_and_entire_store_flag['selected_ids'] ) ) ? $get_selected_ids_and_entire_store_flag['selected_ids'] : array(); $is_entire_store = ( ! empty( $get_selected_ids_and_entire_store_flag['entire_store'] ) ) ? $get_selected_ids_and_entire_store_flag['entire_store'] : false; Smart_Manager_Pro_Base::send_to_background_process( array( 'process_name' => 'Undo Tasks', 'callback' => array( 'class_path' => $this->req_params['class_path'], 'func' => array( $this->req_params['class_nm'], 'process_undo', ), ), 'selected_ids' => $selected_ids, 'entire_task' => $this->entire_task, 'storewide_option' => $this->req_params['storewide_option'],'active_module' => $this->req_params['active_module'], 'entire_store' => $is_entire_store, 'dashboard_key' => $this->dashboard_key, 'dashboard_title' => $this->dashboard_title, 'class_path' => $this->req_params['class_path'], 'class_nm' => $this->req_params['class_nm'], 'backgroundProcessRunningMessage' => $this->req_params['backgroundProcessRunningMessage'], 'SM_IS_WOO30' => $this->req_params['SM_IS_WOO30'] ) ); } /** * Processing undo for task record * * @param array $args contains task_details_ids, fetch. * @return void */ public static function process_undo( $args = array() ) { if ( empty( $args )|| empty( $args['id'] ) ) { return; } $col_data_type = parent::get_column_data_type( $args['dashboard_key'] ); $dashboard_key = $args['dashboard_key']; $args = self::get_task_details( array( 'task_details_ids' => ( ! is_array( $args['id'] ) ) ? array( $args['id'] ) : $args['id'], 'fetch' => 'all', ) ); $args['date_type'] = ( ! empty( $col_data_type[ $args['type'] ] ) ) ? $col_data_type[ $args['type'] ] : 'text'; $args['dashboard_key'] = $dashboard_key; $arg_values = ( ! empty( $args['value'] ) ) ? explode( ',', $args['value'] ) : ''; $args = apply_filters( 'sm_process_undo_args_before_update', $args ); if ( is_callable( array( 'Smart_Manager', 'log' ) ) ) { Smart_Manager::log( 'info', _x( 'Undo process args ', 'undo process args', 'smart-manager-for-wp-e-commerce' ) . print_r( $args, true ) ); } if ( 'set_to' === $args['operator'] && 'sm.multilist' === $args['date_type'] && ( ! empty( $arg_values ) && ( count( $arg_values ) > 0 ) ) && ( ! empty( $args['updated_value'] ) ) ) { $arg_updated_values = explode( ',', $args['updated_value'] ); foreach ( $arg_updated_values as $arg_updated_value ) { $args['value'] = $arg_updated_value; $args['operator'] = 'remove_from'; if ( ! empty( $args ) ) { parent::process_batch_update( $args ); } } foreach ( $arg_values as $value ) { $args['value'] = $value; $args['operator'] = 'add_to'; if ( ! empty( $args ) ) { parent::process_batch_update( $args ); } } } elseif ( ! empty( $args ) ) { $args = parent::process_batch_update( $args ); } } /** * Function to update the from clause for getting entire task ids from tasks table * * @param string $from from string. * @return string from query */ public static function undo_all_task_ids_from_clause( $from = '' ) { return ( empty( $from ) ) ? $from : str_replace( 'posts', 'sm_tasks', $from ); } /** * Function to update the where clause for getting entire task ids from tasks table * * @param string $where where string. * @return string where query */ public static function undo_all_task_ids_where_clause( $where = '' ) { return ( ! empty( $where ) && ( false === strpos( $where, 'WHERE' ) ) ) ? 'WHERE 1=1 ' : str_replace( "AND post_status != 'trash'", '', $where ); } /** * Get task ids from tasks table based on completed and scheduled date time * * @param string $scheduled_datetime scheduled datetime. * @return array $task_ids task ids array */ public static function get_task_ids( $scheduled_datetime = '' ) { if ( empty( $scheduled_datetime ) ) { return; } global $wpdb; $task_ids = $wpdb->get_col( "SELECT id FROM {$wpdb->prefix}sm_tasks WHERE completed_date < '" . $scheduled_datetime . "'" ); return ( ! is_wp_error( $task_ids ) ) ? $task_ids : array(); } /** * Delete tasks * * @return void */ public function delete() { $this->get_task_detail_ids( '_delete_task_id' ); $get_selected_ids_and_entire_store_flag = $this->get_selected_ids_and_entire_store_flag(); $selected_ids = ( ! empty( $get_selected_ids_and_entire_store_flag['selected_ids'] ) ) ? $get_selected_ids_and_entire_store_flag['selected_ids'] : array(); $is_entire_store = ( ! empty( $get_selected_ids_and_entire_store_flag['entire_store'] ) ) ? $get_selected_ids_and_entire_store_flag['entire_store'] : false; Smart_Manager_Pro_Base::send_to_background_process( array( 'process_name' => 'Delete Tasks', 'callback' => array( 'class_path' => $this->req_params['class_path'], 'func' => array( $this->req_params['class_nm'], 'process_delete' ), ), 'selected_ids' => $selected_ids, 'entire_task' => $this->entire_task, 'storewide_option' => $this->req_params['storewide_option'],'active_module' => $this->req_params['active_module'], 'entire_store' => $is_entire_store, 'dashboard_key' => $this->dashboard_key, 'dashboard_title' => $this->dashboard_title, 'class_path' => $this->req_params['class_path'], 'class_nm' => $this->req_params['class_nm'], 'backgroundProcessRunningMessage' => $this->req_params['backgroundProcessRunningMessage'], 'SM_IS_WOO30' => $this->req_params['SM_IS_WOO30'] ) ); } /** * Process the deletion of task details record * * @param array $args record id. * @return boolean */ public static function process_delete( $args = array() ) { if ( empty( $args ) && empty( $args['id'] ) ) { return false; } return ( self::delete_task_details( ( ! is_array( $args['id'] ) ? array( $args['id'] ) : $args['id'] ) ) ) ? true : false; } /** * Delete tasks from tasks table * * @param array $task_ids array of task ids. * @return boolean true if number of rows deleted, or false on error */ public static function delete_tasks( $task_ids = array() ) { if ( empty( $task_ids ) || ( ! is_array( $task_ids ) ) ) { if ( is_callable( array( 'Smart_Manager', 'log' ) ) ) { Smart_Manager::log( 'error', _x( 'No task ids found for deleting tasks', 'delete tasks', 'smart-manager-for-wp-e-commerce' ) ); } return false; } global $wpdb; return ( ! is_wp_error( $wpdb->query( "DELETE FROM {$wpdb->prefix}sm_tasks WHERE id IN (" . implode( ',', $task_ids ) . ')' ) ) ) ? true : false; } /** * Delete task details from task details table * * @param array $task_detail_ids task detail ids. * @return boolean true if number of rows deleted, or false on error */ public static function delete_task_details( $task_detail_ids = array() ) { if ( empty( $task_detail_ids ) && ! is_array( $task_detail_ids ) ) { if ( is_callable( array( 'Smart_Manager', 'log' ) ) ) { Smart_Manager::log( 'error', _x( 'No task detail ids found for deleting task details', 'delete task details', 'smart-manager-for-wp-e-commerce' ) ); } return false; } global $wpdb; return ( ! is_wp_error( $wpdb->query( "DELETE FROM {$wpdb->prefix}sm_task_details WHERE id IN (" . implode( ',', $task_detail_ids ) . ')' ) ) ) ? true : false; } /** * Schedule task deletion after x number of days * * @return void */ public static function schedule_task_deletion() { if ( ! function_exists( 'as_has_scheduled_action' ) ) { return; } $is_scheduled = as_has_scheduled_action( 'sm_schedule_tasks_cleanup' ) ? true : false; if ( ! ( ( false === $is_scheduled ) && function_exists( 'as_schedule_single_action' ) ) ) { return; } $task_deletion_days = intval( get_option( 'sa_sm_tasks_cleanup_interval_days' ) ); if ( empty( $task_deletion_days ) ) { $task_deletion_days = intval( apply_filters( 'sa_sm_tasks_cleanup_interval_days', 90 ) ); if ( empty( $task_deletion_days ) ) { return; } update_option( 'sa_sm_tasks_cleanup_interval_days', $task_deletion_days, 'no' ); } $timestamp = strtotime( date('Y-m-d H:i:s', strtotime( "+".$task_deletion_days." Days" ) ) ); if ( empty( $timestamp ) ) { return; } as_schedule_single_action( $timestamp, 'sm_schedule_tasks_cleanup' ); } /** * Delete task details after changes are undone * * @param boolean $delete_flag flag for delete. * @param array $params task_details_id. * @return boolean */ public static function post_undo( $delete_flag = true, $params = array() ) { if ( empty( $params['task_details_id'] ) && ( empty( $delete_flag ) ) ) { return; } return ( self::delete_task_details( ( ! is_array( $params['task_details_id'] ) ? array( $params['task_details_id'] ) : $params['task_details_id'] ) ) ) ? true : false; } /** * Delete tasks from tasks table and delete undo/delete option from options table after completing undo/delete action * * @param string $identifier identifier name - either undo or delete. * @return void */ public static function background_process_complete( $identifier = '' ) { if ( empty( $identifier ) ) { return $identifier; } $failed_task_ids = array(); $option_nm = self::get_process_option_name( $identifier ); if ( empty( $option_nm ) ) { return; } $task_ids = get_option( $identifier . $option_nm ); if ( empty( $task_ids ) ) { return; } $results = self::get_task_details( array( 'task_ids' => $task_ids, 'fetch' => 'count', ) ); if ( ! empty( $results ) ) { foreach ( $results as $result ) { if ( ! empty( $result['count'] ) ) { $failed_task_ids[] = $result['id']; } } } $delete_task_ids = ( ! empty( $failed_task_ids ) && is_array( $failed_task_ids ) && is_array( $task_ids ) ) ? array_diff( $task_ids, $failed_task_ids ) : $task_ids; if ( empty( $delete_task_ids ) ) { return; } if ( self::delete_tasks( $delete_task_ids ) ) { delete_option( $identifier . $option_nm ); } } /** * Get task detail ids using selected task ids and store them in options table in case of undo and delete actions * * @param string $option_nm option name - either _undo_task_id or _delete_task_id. * @return array $fetched_task_details_ids ids of task details */ public function get_task_detail_ids( $option_nm = '' ) { if ( empty( $option_nm ) ) { return; } $identifier = ''; $task_ids = ( ! empty( $this->req_params['selected_ids'] ) ) ? json_decode( stripslashes( $this->req_params['selected_ids'] ), true ) : array(); if ( ( ! empty( $this->req_params['storewide_option'] ) ) && ( 'entire_store' === $this->req_params['storewide_option'] ) && ( ! empty( $this->req_params['active_module'] ) ) ) { $task_ids = $this->get_entire_store_ids(); $this->entire_task = true; } if ( is_callable( array( 'Smart_Manager_Pro_Background_Updater', 'get_identifier' ) ) ) { $identifier = Smart_Manager_Pro_Background_Updater::get_identifier(); } if ( ! empty( $identifier ) && ( ! empty( $task_ids ) ) ) { update_option( $identifier . $option_nm, $task_ids, 'no' ); } $task_details_ids = self::get_task_details( array( 'task_ids' => $task_ids, 'fetch' => 'ids', ) ); $fetched_task_details_ids = array(); foreach ( $task_details_ids as $task_details_id ) { $fetched_task_details_ids[] = $task_details_id['task_details_id']; } $this->req_params['selected_ids'] = ( ! empty( $fetched_task_details_ids ) && is_array( $fetched_task_details_ids ) ) ? json_encode( $fetched_task_details_ids ) : $this->req_params['selected_ids']; // ids of task details. } /** * Get process option name from options table incase of undo and delete actions * * @param string $identifier identifier name - either undo or delete. * @return string | boolean process option name if true, else false */ public static function get_process_option_name( $identifier = '' ) { if ( empty( $identifier ) ) { return; } $params = get_option( $identifier . '_params' ); if ( empty( $params['process_name'] ) ) { return; } $process_names = array( 'Undo Tasks', 'Delete Tasks' ); return ( in_array( $params['process_name'], $process_names, true ) ) ? ( ( 'Undo Tasks' === $params['process_name'] ) ? '_undo_task_id' : '_delete_task_id' ) : false; } /** * Get task details * * @param array $params task_ids, task_details_ids, fetch. * @return array task details [ids( tasks/task details ), count of id, record_id, field, prev_value, operator] */ public static function get_task_details( $params = array() ) { if ( empty( $params ) ) { return; } global $wpdb; $task_ids = ( ! empty( $params['task_ids'] ) ) ? $params['task_ids'] : array(); $task_details_ids = ( ! empty( $params['task_details_ids'] ) ) ? $params['task_details_ids'] : array(); $fetch = ( ! empty( $params['fetch'] ) ) ? $params['fetch'] : array(); switch ( $params ) { case ( ( ! empty( $task_ids ) ) && ( ! empty( $fetch ) ) && ( 'ids' === $fetch ) ): return $wpdb->get_results( "SELECT task_id AS task_id, id AS task_details_id FROM {$wpdb->prefix}sm_task_details WHERE task_id IN (" . implode( ',', $task_ids ) . ')', 'ARRAY_A' ); case ( ( ! empty( $task_details_ids ) ) && ( ! empty( $fetch ) ) && ( 'all' === $fetch ) ): return $wpdb->get_row( "SELECT id AS task_details_id, record_id AS id, field AS type, prev_val AS value, action AS operator, updated_val AS updated_value FROM {$wpdb->prefix}sm_task_details WHERE id IN (" . implode( ',', $task_details_ids ) . ')', 'ARRAY_A' ); case ( ( ! empty( $task_ids ) ) && ( ! empty( $fetch ) ) && ( 'count' === $fetch ) ): return $wpdb->get_results( "SELECT task_id AS id, IFNULL( count(id), 0 ) AS count FROM {$wpdb->prefix}sm_task_details WHERE task_id IN (" . implode( ',', $task_ids ) . ') GROUP BY task_id', 'ARRAY_A' ); } } } } pro/classes/class-smart-manager-pro-wc-booking.php000064400000024437147600337620016230 0ustar00dashboard_key = $dashboard_key; $this->post_type = $dashboard_key; $this->req_params = (!empty($_REQUEST)) ? $_REQUEST : array(); add_filter( 'sm_dashboard_model',array( &$this,'bookings_dashboard_model' ), 10, 2 ); add_filter( 'sm_data_model', array( &$this, 'bookings_data_model' ), 10, 2 ); add_filter('sm_inline_update_pre',array(&$this,'bookings_inline_update_pre'),10,1); } public static function actions() { } //Function to override the dashboard model public function bookings_dashboard_model ($dashboard_model, $dashboard_model_saved) { global $wpdb, $current_user; $post_status_col_index = $bookable_product_col_index = ''; $visible_columns = array( 'ID', 'post_date', 'post_status', '_booking_product_id', '_booking_customer_id', '_booking_start', '_booking_end', '_booking_cost' ); $numeric_columns = array( '_booking_cost', '_booking_resource_id', '_booking_parent_id' ); $datetime_columns = array( '_booking_start', '_booking_end' ); $checkbox_empty_one_columns = array( '_booking_all_day' ); if( !empty( $dashboard_model['columns'] ) ) { $column_model = &$dashboard_model['columns']; foreach( $column_model as $key => &$column ) { if (empty($column['src'])) continue; $src_exploded = explode("/",$column['src']); if (empty($src_exploded)) { $src = $column['src']; } if ( sizeof($src_exploded) > 2) { $col_table = $src_exploded[0]; $cond = explode("=",$src_exploded[1]); if (sizeof($cond) == 2) { $src = $cond[1]; } } else { $src = $src_exploded[1]; $col_table = $src_exploded[0]; } if( empty($dashboard_model_saved) ) { if (!empty($column['position'])) { unset($column['position']); } $position = array_search($src, $visible_columns); if ($position !== false) { $column['position'] = $position + 1; $column['hidden'] = false; } else { $column['hidden'] = true; } } switch( $src ) { case 'post_status': $post_status_col_index = $key; break; case '_booking_product_id': $bookable_product_col_index = $key; break; case '_booking_customer_id': $column['type'] = $column['editor'] = 'text'; break; case in_array( $src, $datetime_columns ): $column['type'] = $column['editor'] = 'sm.datetime'; $column['width'] = 102; break; case in_array( $src, $numeric_columns ): $column['type'] = 'numeric'; $column['editor'] = 'customNumericEditor'; $column['min'] = 0; $column['width'] = 50; $column['align'] = 'right'; break; case in_array( $src, $checkbox_empty_one_columns ): $column['type'] = $column['editor'] = 'checkbox'; $column['checkedTemplate'] = 1; $column['uncheckedTemplate'] = ''; $column['width'] = 30; break; } } } //Code for Booking Status select box if( function_exists('get_wc_booking_statuses') && $post_status_col_index != '' ) { $booking_statuses = array_unique( array_merge( get_wc_booking_statuses( null, true ), get_wc_booking_statuses( 'user', true ), get_wc_booking_statuses( 'cancel', true ) ) ); $booking_statuses_keys = ( !empty( $booking_statuses ) ) ? array_keys($booking_statuses) : array(); $dashboard_model['columns'][$post_status_col_index]['defaultValue'] = ( !empty( $booking_statuses_keys[0] ) ) ? $booking_statuses_keys[0] : 'pending-confirmation'; $dashboard_model['columns'][$post_status_col_index]['save_state'] = true; $dashboard_model['columns'][$post_status_col_index]['values'] = $booking_statuses; $dashboard_model['columns'][$post_status_col_index]['selectOptions'] = $booking_statuses; //for inline editing $dashboard_model['columns'][$post_status_col_index]['search_values'] = array(); foreach ($booking_statuses as $key => $value) { $dashboard_model['columns'][$post_status_col_index]['search_values'][] = array('key' => $key, 'value' => $value); } $dashboard_model['columns'][$post_status_col_index] ['type'] = 'dropdown'; $dashboard_model['columns'][$post_status_col_index] ['strict'] = true; $dashboard_model['columns'][$post_status_col_index] ['allowInvalid'] = false; $dashboard_model['columns'][$post_status_col_index] ['editor'] = 'select'; $dashboard_model['columns'][$post_status_col_index] ['renderer'] = 'selectValueRenderer'; $color_codes = array( 'green' => array( 'confirmed', 'paid', 'complete' ), 'red' => array( 'cancelled' ), 'orange' => array( 'unpaid' ), 'blue' => array( 'in-cart', 'pending-confirmation' ) ); $dashboard_model['columns'][$post_status_col_index]['colorCodes'] = apply_filters( 'sm_'.$this->dashboard_key.'_status_color_codes', $color_codes ); } //Code for Booked Product select box if ( is_callable( array( 'WC_Bookings_Admin', 'get_booking_products' ) ) && $bookable_product_col_index != '' ) { $bookable_products = array( '' => __( 'N/A', 'woocommerce-bookings' ) ); foreach ( WC_Bookings_Admin::get_booking_products() as $bookable_product ) { $bookable_products[ $bookable_product->get_id() ] = $bookable_product->get_name(); $resources = $bookable_product->get_resources(); foreach ( $resources as $resource ) { $bookable_products[ $bookable_product->get_id() . '=>' . $resource->get_id() ] = '   ' . $resource->get_name(); } } $bookable_products_keys = ( !empty( $bookable_products ) ) ? array_keys($bookable_products) : array(); $dashboard_model['columns'][$bookable_product_col_index]['name'] = __( 'Booked Product', 'smart-manager-for-wp-e-commerce' ); $dashboard_model['columns'][$bookable_product_col_index]['key'] = $dashboard_model['columns'][$bookable_product_col_index]['name']; $dashboard_model['columns'][$bookable_product_col_index]['defaultValue'] = ( !empty( $bookable_products_keys[0] ) ) ? $bookable_products_keys[0] : ''; $dashboard_model['columns'][$bookable_product_col_index]['save_state'] = true; $dashboard_model['columns'][$bookable_product_col_index]['values'] = $bookable_products; $dashboard_model['columns'][$bookable_product_col_index]['selectOptions'] = $bookable_products; //for inline editing $dashboard_model['columns'][$bookable_product_col_index]['search_values'] = array(); foreach ($bookable_products as $key => $value) { $dashboard_model['columns'][$bookable_product_col_index]['search_values'][] = array('key' => $key, 'value' => $value); } $dashboard_model['columns'][$bookable_product_col_index] ['type'] = 'dropdown'; $dashboard_model['columns'][$bookable_product_col_index] ['strict'] = true; $dashboard_model['columns'][$bookable_product_col_index] ['allowInvalid'] = false; $dashboard_model['columns'][$bookable_product_col_index] ['editor'] = 'select'; $dashboard_model['columns'][$bookable_product_col_index] ['renderer'] = 'selectValueRenderer'; } if (!empty($dashboard_model_saved)) { $col_model_diff = sm_array_recursive_diff($dashboard_model_saved,$dashboard_model); } //clearing the transients before return if (!empty($col_model_diff)) { delete_transient( 'sa_sm_'.$this->dashboard_key ); } return $dashboard_model; } //Function to modify the data_model public function bookings_data_model( $data_model, $data_col_params ) { if( empty( $data_model ) || empty( $data_model['items'] ) ) { return $data_model; } $store_model_transient = get_transient( 'sa_sm_'.$this->dashboard_key ); if( ! empty( $store_model_transient ) && !is_array( $store_model_transient ) ) { $store_model_transient = json_decode( $store_model_transient, true ); } $col_model = (!empty($store_model_transient['columns'])) ? $store_model_transient['columns'] : array(); $data_cols_datetime = array(); if (!empty($col_model)) { foreach ($col_model as $col) { if( !empty( $col['hidden'] ) && !empty( $col['data'] ) && array_search($col['data'], $data_col_params['required_cols']) === false ) { continue; } $data = ( !empty( $col['data'] ) ) ? $col['data'] : ''; $type = ( !empty( $col['type'] ) ) ? $col['type'] : ''; // Code for storing the datetime cols if( $type == 'sm.datetime' && empty( $col['date_type'] ) && !empty( $data ) ) { $data_cols_datetime[] = $data; } } } foreach( $data_model['items'] as $index => $items ) { foreach( $items as $key => $value ) { if( in_array( $key, $data_cols_datetime ) ) { $data_model['items'][$index][$key] = date( 'Y-m-d H:i:s', (int)strtotime($value) ); } } } return $data_model; } //function for modifying edited data before updating public function bookings_inline_update_pre( $edited_data ) { $store_model_transient = get_transient( 'sa_sm_'.$this->dashboard_key ); if( ! empty( $store_model_transient ) && !is_array( $store_model_transient ) ) { $store_model_transient = json_decode( $store_model_transient, true ); } $col_model = (!empty($store_model_transient['columns'])) ? $store_model_transient['columns'] : array(); $data_cols_datetime = array(); if (!empty($col_model)) { foreach ($col_model as $col) { $data = ( !empty( $col['data'] ) ) ? $col['data'] : ''; $type = ( !empty( $col['type'] ) ) ? $col['type'] : ''; // Code for storing the datetime cols if( $type == 'sm.datetime' && empty( $col['date_type'] ) && !empty( $data ) ) { $data_cols_datetime[] = $data; } } } foreach( $edited_data as $id => $cols ) { foreach( $cols as $key => $value ) { if( in_array( $key, $data_cols_datetime ) ) { $edited_data[$id][$key] = date( 'YmdHis', (int)strtotime($value) ); } } } return $edited_data; } } } pro/classes/class-smart-manager-pro-user.php000064400000240172147600337620015143 0ustar00 array( 'users' => 'id' ), 'meta' => array( 'usermeta' => 'user_id' ) ); protected static $_instance = null; public static function instance($dashboard_key) { if ( is_null( self::$_instance ) ) { self::$_instance = new self($dashboard_key); } return self::$_instance; } function __construct($dashboard_key) { add_filter( 'sm_search_table_types', function( $advanced_search_table_types = array() ) { return $this->advanced_search_table_types; } ); // should be kept before calling the parent class constructor. parent::__construct($dashboard_key); self::actions(); $this->dashboard_key = $dashboard_key; $this->post_type = $dashboard_key; $this->req_params = (!empty($_REQUEST)) ? $_REQUEST : array(); $this->usermeta_ignored_cols = apply_filters('sm_usermeta_ignored_cols', array('session_tokens', 'wp_woocommerce_product_import_mapping', 'wp_product_import_error_log')); add_filter( 'sm_default_dashboard_model',array(&$this,'default_user_dashboard_model') ); add_filter( 'sm_beta_load_default_data_model',array(&$this,'load_default_data_model') ); add_filter( 'sm_default_inline_update', function() { return false; } ); add_action( 'sm_inline_update_post',array(&$this,'user_inline_update'), 10, 2 ); add_filter( 'sm_data_model',array(&$this,'generate_data_model'), 10, 2 ); add_filter( 'sm_deleter', array( &$this, 'user_deleter' ), 10, 2 ); add_filter( 'sm_beta_delete_records_ids', array( $this, 'users_delete_record_ids' ), 10, 2 ); add_filter( 'sm_search_query_terms_select', array( &$this,'search_query_terms_select' ), 10, 2 ); add_filter( 'sm_search_query_terms_from', array( &$this,'search_query_terms_from' ), 10, 2 ); add_filter( 'sm_search_query_terms_where', array( &$this,'search_query_terms_where' ), 10, 2 ); } public static function actions() { // add_filter('sm_beta_batch_update_entire_store_ids_query', __CLASS__. '::users_batch_update_entire_store_ids_query', 10, 1); add_filter( 'sm_beta_background_entire_store_ids_from', __CLASS__. '::users_batch_update_entire_store_ids_from', 10, 2 ); add_filter( 'sm_beta_background_entire_store_ids_where', __CLASS__. '::users_batch_update_entire_store_ids_where', 10, 2 ); add_filter( 'sm_beta_batch_update_prev_value', __CLASS__. '::users_batch_update_prev_value', 10, 2 ); add_filter( 'sm_default_batch_update_db_updates', __CLASS__. '::users_default_batch_update_db_updates', 10, 2 ); add_filter( 'sm_post_batch_update_db_updates', __CLASS__. '::users_post_batch_update_db_updates', 10, 2 ); } public function get_batch_update_copy_from_record_ids( $args = array() ) { global $wpdb; $data = array(); $is_ajax = ( isset( $args['is_ajax'] ) ) ? $args['is_ajax'] : true; $search_term = ( ! empty( $this->req_params['search_term'] ) ) ? $this->req_params['search_term'] : ( ( ! empty( $args['search_term'] ) ) ? $args['search_term'] : '' ); $select = apply_filters( 'sm_batch_update_copy_from_user_ids_select', "SELECT ID AS id, user_login AS title", $args ); $search_cond = ( ! empty( $search_term ) ) ? " AND ( id LIKE '%".$search_term."%' OR user_login LIKE '%".$search_term."%' OR user_email LIKE '%".$search_term."%' ) " : ''; $search_cond_ids = ( !empty( $args['search_ids'] ) ) ? " AND id IN ( ". implode(",", $args['search_ids']) ." ) " : ''; $results = $wpdb->get_results( $select . " FROM {$wpdb->prefix}users WHERE 1=1 ". $search_cond ." ". $search_cond_ids, 'ARRAY_A' ); if( count( $results ) > 0 ) { foreach( $results as $result ) { $data[ $result['id'] ] = trim($result['title']); } } $data = apply_filters( 'sm_batch_update_copy_from_user_ids', $data ); if( $is_ajax ){ wp_send_json( $data ); } else { return $data; } } public function default_user_dashboard_model ($dashboard_model) { if ( empty( $dashboard_model ) ) { return; } global $wpdb, $current_user, $_wp_admin_css_colors; $col_model = array(); $ignored_term_cols = array( 'object_id' ); // fetching terms columns. $afwc_multilist_fields = array( 'afwc_user_tags' => _x( 'AFWC Affiliate Tags', 'AFWC Affiliate Tags field name', 'smart-manager-for-wp-e-commerce' ) ); foreach ( $dashboard_model['columns'] as $key => &$value ) { if ( empty( $value ) || empty( $value['src'] ) ) { continue; } $col_explode = explode( '/', $value['src'] ); if ( empty( $col_explode[0] ) || empty( $col_explode[1] ) ) { continue; } if ( ( 'terms' === $col_explode[0] ) ) { if ( in_array( $col_explode[1], $ignored_term_cols ) ) { continue; } $value['name'] = $value['key'] = $afwc_multilist_fields[ $col_explode[1] ]; $col_model[] = $dashboard_model['columns'][$key]; } } $default_hidden_cols = apply_filters( 'sm_users_default_hidden_cols', array( 'user_url', 'user_activation_key', 'user_status' ) ); $default_non_editable_cols = apply_filters( 'sm_users_default_non_editable_cols', array( 'ID', 'user_login' ) ); $default_ignored_cols = apply_filters( 'sm_users_default_ignored_cols', array( 'user_activation_key', 'user_status' ) ); $query_users_col = "SHOW COLUMNS FROM {$wpdb->users}"; $results_users_col = $wpdb->get_results($query_users_col, 'ARRAY_A'); $users_num_rows = $wpdb->num_rows; if ($users_num_rows > 0) { foreach ($results_users_col as $col) { $temp = array(); $field_nm = (!empty($col['Field'])) ? $col['Field'] : ''; if( in_array($field_nm, $default_ignored_cols) ) { continue; } $temp ['src'] = 'users/'.$field_nm; $temp ['data'] = sanitize_title(str_replace('/', '_', $temp ['src'])); // generate slug using the wordpress function if not given $temp ['name'] = __(ucwords(str_replace('_', ' ', $field_nm)), 'smart-manager-for-wp-e-commerce'); $temp ['table_name'] = $wpdb->prefix.'users'; $temp ['col_name'] = $field_nm; $temp ['key'] = $temp ['name']; //for advanced search $type = 'text'; $temp ['width'] = 100; $temp ['align'] = 'left'; if (!empty($col['Type'])) { $type_strpos = strrpos($col['Type'],'('); if ($type_strpos !== false) { $type = substr($col['Type'], 0, $type_strpos); } else { $types = explode( " ", $col['Type'] ); // for handling types with attributes (biginit unsigned) $type = ( ! empty( $types ) ) ? $types[0] : $col['Type']; } if (substr($type,-3) == 'int') { $type = 'numeric'; $temp ['min'] = 0; $temp ['width'] = 50; $temp ['align'] = 'right'; } else if ($type == 'text') { $temp ['width'] = 130; $type = 'text'; } else if (substr($type,-4) == 'char' || substr($type,-4) == 'text') { if ($type == 'longtext') { $type = 'sm.longstring'; $temp ['width'] = 150; } else { $type = 'text'; } } else if (substr($type,-4) == 'blob') { $type = 'sm.longstring'; } else if ($type == 'datetime' || $type == 'timestamp') { $type = 'sm.datetime'; $temp ['width'] = 102; } else if ($type == 'date' || $type == 'year') { $type = 'date'; } else if ($type == 'decimal' || $type == 'float' || $type == 'double' || $type == 'real') { $type = 'numeric'; $temp ['min'] = 0; $temp ['width'] = 50; $temp ['align'] = 'right'; } else if ($type == 'boolean') { $type = 'checkbox'; $temp ['width'] = 30; } } $temp ['hidden'] = false; $temp ['editable'] = true; $temp ['batch_editable'] = true; // flag for enabling the batch edit for the column $temp ['sortable'] = true; $temp ['resizable'] = true; //For disabling frozen $temp ['frozen'] = false; $temp ['allow_showhide'] = true; $temp ['exportable'] = true; //default true. flag for enabling the column in export $temp ['searchable'] = true; $temp ['placeholder'] = ''; //for advanced search //Code for handling the positioning of the columns if ($field_nm == 'ID') { $temp ['position'] = 1; $temp ['align'] = 'left'; } else if ($field_nm == 'user_login') { $temp ['position'] = 2; } else if ($field_nm == 'user_pass') { $temp ['position'] = 3; $temp ['searchable'] = false; $temp ['placeholder'] = 'Click to change'; $type = 'text'; } else if ($field_nm == 'user_nicename') { $temp ['name'] = __('Nickname', 'smart-manager-for-wp-e-commerce'); $temp ['key'] = $temp ['name']; } if( !empty( $default_non_editable_cols ) && in_array( $field_nm, $default_non_editable_cols ) ) { $temp ['editable'] = false; $temp ['batch_editable'] = false; } if( $field_nm == 'user_pass' ){ $temp ['type'] = 'password'; } else { $temp ['type'] = $type; } $temp ['values'] = array(); $temp ['hidden'] = ( in_array($field_nm, $default_hidden_cols) ) ? true : false; $temp ['category'] = ''; //for advanced search $col_model [] = $temp; } } $default_um_visible_cols = apply_filters('sm_usermeta_visible_cols', array('first_name', 'last_name', 'description', 'rich_editing', 'billing_first_name', 'billing_last_name', 'billing_company', 'billing_address_1', 'billing_address_2', 'billing_city', 'billing_state', 'billing_postcode', 'billing_country', 'billing_email', 'billing_phone')); $default_um_disabled_cols = apply_filters('sm_usermeta_disabled_cols', array('billing_country', 'billing_state')); $default_um_non_searchable_cols = apply_filters( 'sm_usermeta_non_searchable_cols', array( $wpdb->prefix.'capabilities' ) ); $um_serialized_cols = apply_filters( 'sm_usermeta_serialized_cols', array( $wpdb->prefix.'capabilities', 'afwc_additional_fields' ) ); //code for getting the meta cols $results_usermeta_col = $wpdb->get_results($wpdb->prepare("SELECT DISTINCT(meta_key) as meta_key, meta_value FROM {$wpdb->usermeta} WHERE meta_key NOT LIKE 'sa_sm_%' AND meta_key NOT LIKE 'free-%' AND meta_key NOT LIKE '_oembed%' AND meta_key NOT IN ( '". implode("','", $this->usermeta_ignored_cols) ."' ) AND 1=%d GROUP BY meta_key", 1), 'ARRAY_A'); $um_num_rows = $wpdb->num_rows; if ($um_num_rows > 0) { $meta_keys = array(); foreach ($results_usermeta_col as $key => $usermeta_col) { if (empty($usermeta_col['meta_value'])) { $meta_keys [] = $usermeta_col['meta_key']; //TODO: if possible store in db instead of using an array } unset($results_usermeta_col[$key]); $results_usermeta_col[$usermeta_col['meta_key']] = $usermeta_col; } if (!empty($meta_keys)) { $results_um_meta_value = $wpdb->get_results($wpdb->prepare("SELECT DISTINCT(meta_key) as meta_key, meta_value FROM {$wpdb->usermeta} WHERE meta_key IN ( '". implode("','", $meta_keys) ."' ) AND meta_value != %s GROUP BY meta_key", ''), 'ARRAY_A'); $num_rows_meta_value = $wpdb->num_rows; if ($num_rows_meta_value > 0) { foreach ($results_um_meta_value as $result_meta_value) { if (isset($results_usermeta_col [$result_meta_value['meta_key']])) { $results_usermeta_col [$result_meta_value['meta_key']]['meta_value'] = $result_meta_value['meta_value']; } } } } $index = count($col_model); $col_model [$index] = array(); $col_model [$index]['src'] = 'usermeta/user_id'; $src = ''; if( ! empty( $col_model [$index]['src'] ) ) { $src = str_replace('/', '_', $col_model [$index]['src']); } $user_id = 'user id'; $col_model [$index]['data'] = sanitize_title($src); // generate slug using the WordPress function if not given $col_model [$index]['name'] = __(ucwords($user_id), 'smart-manager-for-wp-e-commerce'); $col_model [$index]['key'] = $col_model [$index]['name']; //for advanced search $col_model [$index]['type'] = 'numeric'; $col_model [$index]['hidden'] = true; $col_model [$index]['allow_showhide'] = false; $col_model [$index]['editable'] = false; $col_model [$index]['batch_editable'] = false; $col_model [$index]['exportable'] = true; //default true. flag for enabling the column in export $col_model [$index]['searchable'] = true; $col_model [$index]['table_name'] = $wpdb->prefix.'usermeta'; $col_model [$index]['col_name'] = 'user_id'; $col_model [$index] ['category'] = ''; //for advanced search $col_model [$index] ['placeholder'] = ''; //for advanced search $index++; $col_model [$index] = array(); $col_model [$index]['src'] = 'usermeta/role'; $src = ''; if( ! empty( $col_model [$index]['src'] ) ){ $src = str_replace('/', '_', $col_model [$index]['src']); } $role = 'role'; $col_model [$index]['data'] = sanitize_title($src); // generate slug using the wordpress function if not given $col_model [$index]['name'] = __(ucwords($role), 'smart-manager-for-wp-e-commerce'); $col_model [$index]['key'] = $col_model [$index]['name']; //for advanced search $col_model [$index]['type'] = 'dropdown'; $col_model [$index]['strict'] = true; $col_model [$index]['allowInvalid'] = false; $col_model [$index]['hidden'] = false; $col_model [$index]['allow_showhide'] = true; $col_model [$index]['editable'] = true; $col_model [$index]['position'] = 2; $col_model [$index]['batch_editable'] = true; // flag for enabling the batch edit for the column $col_model [$index]['exportable'] = true; //default true. flag for enabling the column in export $col_model [$index]['searchable'] = true; $all_roles = array(); $col_model [$index]['values'] = array(); if( function_exists('get_editable_roles') ) { $all_roles = get_editable_roles(); } if( !empty( $all_roles ) ) { $col_model [$index]['search_values'] = array(); foreach ( $all_roles as $role => $details) { $name = translate_user_role( $details['name'] ); $col_model [$index]['values'][$role] = $name; $col_model [$index]['search_values'][] = array('key' => $role, 'value' => $name); } } $col_model [$index] ['editor'] = 'select'; $col_model [$index] ['selectOptions'] = $col_model [$index]['values']; $col_model [$index] ['renderer'] = 'selectValueRenderer'; $col_model [$index]['table_name'] = $wpdb->prefix.'usermeta'; $col_model [$index]['col_name'] = $wpdb->prefix.'capabilities'; $col_model [$index] ['category'] = ''; //for advanced search $col_model [$index] ['placeholder'] = ''; //for advanced search $index++; $custom_cols = array('last_order_date', 'last_order_total', 'orders_count', 'orders_total'); foreach( $custom_cols as $col ) { $col_model [$index] = array(); $col_model [$index]['src'] = 'custom/'.$col; $col_model [$index]['data'] = sanitize_title(str_replace('/', '_', $col_model [$index]['src'])); // generate slug using the wordpress function if not given $col_model [$index]['name'] = __(ucwords(str_replace('_', ' ', $col)), 'smart-manager-for-wp-e-commerce'); $col_model [$index]['key'] = $col_model [$index]['name']; //for advanced search $col_model [$index]['type'] = 'text'; $col_model [$index]['hidden'] = false; $col_model [$index]['allow_showhide'] = true; $col_model [$index]['editable'] = false; $col_model [$index]['sortable'] = false; $col_model [$index]['table_name'] = $wpdb->prefix.'usermeta'; $col_model [$index]['col_name'] = 'user_id'; $col_model [$index]['exportable'] = true; //default true. flag for enabling the column in export $col_model [$index]['searchable'] = true; $col_model [$index] ['category'] = ''; //for advanced search $col_model [$index] ['placeholder'] = ''; //for advanced search $index++; } // Mapping for AFW plugin fields. $afwc_text_fields = array( 'afwc_is_affiliate' => _x( 'AFWC Is Affiliate', 'AFWC Is Affiliate field name', 'smart-manager-for-wp-e-commerce' ), 'afwc_ref_url_id' => _x( 'AFWC Referral URL ID', 'AFWC Referral URL ID field name', 'smart-manager-for-wp-e-commerce' ), 'afwc_paypal_email' => _x( 'AFWC PayPal Email', 'AFWC PayPal Email field name', 'smart-manager-for-wp-e-commerce' ), 'afwc_parent_chain' => _x( 'AFWC Parent Chain', 'AFWC Parent Chain field name', 'smart-manager-for-wp-e-commerce' ), 'afwc_ltc_customers' => _x( 'AFWC Lifetime Customers', 'AFWC Lifetime Customers field name', 'smart-manager-for-wp-e-commerce' ), 'afwc_affiliate_desc' => _x( 'AFWC Affiliate Form Description', 'AFWC Affiliate Form Description field name', 'smart-manager-for-wp-e-commerce' ), 'afwc_affiliate_contact' => _x( 'AFWC Affiliate Form Contact', 'AFWC Affiliate Form Contact field name', 'smart-manager-for-wp-e-commerce' ), 'afwc_affiliate_skype' => _x( 'AFWC Affiliate Skype Handle', 'AFWC Affiliate Skype Handle field name', 'smart-manager-for-wp-e-commerce' ) ); $afwc_serialized_fields = array( 'afwc_additional_fields' => _x( 'AFWC Additional Form Fields', 'AFWC Additional Form Fields field name', 'smart-manager-for-wp-e-commerce' ) ); foreach ($results_usermeta_col as $usermeta_col) { $temp = array(); $type = 'text'; $meta_key = ( !empty( $usermeta_col['meta_key'] ) ) ? $usermeta_col['meta_key'] : ''; $meta_value = ( !empty( $usermeta_col['meta_value'] ) || $usermeta_col['meta_value'] == 0 ) ? $usermeta_col['meta_value'] : ''; $temp ['src'] = 'usermeta/meta_key='.$meta_key.'/meta_value='.$meta_key; $temp ['data'] = strtolower(str_replace(array('/','='), '_', $temp ['src'])); // generate slug using the wordpress function if not given $temp ['name'] = __(ucwords(str_replace('_', ' ', $meta_key)), 'smart-manager-for-wp-e-commerce'); $temp ['key'] = $temp ['name']; //for advanced search $temp ['table_name'] = $wpdb->prefix.'usermeta'; $temp ['col_name'] = $meta_key; $temp ['width'] = 100; $temp ['align'] = 'left'; if ( $meta_value == 'yes' || $meta_value == 'no' || $meta_value == 'true' || $meta_value == 'false' || ( is_numeric($meta_value) && ( $meta_value == 0 || $meta_value == 1 ) ) ) { $type = 'checkbox'; if( $meta_value == 'yes' || $meta_value == 'no' ) { $temp ['checkedTemplate'] = 'yes'; $temp ['uncheckedTemplate'] = 'no'; } else if( is_int( $meta_value ) && ( $meta_value == 0 || $meta_value == 1 ) ) { $temp ['checkedTemplate'] = 0; $temp ['uncheckedTemplate'] = 1; } $temp ['width'] = 30; } else if( is_numeric( $meta_value ) ) { if( function_exists('isTimestamp') ) { if( isTimestamp( $meta_value ) ) { $type = 'sm.datetime'; $temp ['width'] = 102; $temp ['date_type'] = 'timestamp'; } } if( $type != 'sm.datetime' ) { $type = 'numeric'; $temp ['min'] = 0; $temp ['width'] = 50; $temp ['align'] = 'right'; } } else if( is_serialized( $meta_value ) === true || ( !empty($um_serialized_cols) && in_array($meta_key, $um_serialized_cols) ) ) { $type = 'sm.serialized'; $temp ['width'] = 200; if ( 'afwc_additional_fields' === $meta_key ) { $temp ['editor'] = $type; $temp ['name'] = $temp ['key'] = $afwc_serialized_fields[ $meta_key ]; } } $type = ( 'nickname' === $meta_key ) ? 'text' : $type; $temp ['type'] = $type; $temp ['values'] = array(); if( $meta_key == 'admin_color' ) { $temp ['search_values'] = array(); $themes = array_keys($_wp_admin_css_colors); foreach( $themes as $theme ) { $name = ( !empty($_wp_admin_css_colors[$theme]) ) ? $_wp_admin_css_colors[$theme]->name : ucwords($theme); $temp ['values'][$theme] = $name; $temp ['search_values'][] = array('key' => $theme, 'value' => $name); } } elseif ( ( ! empty( $afwc_text_fields ) && is_array( $afwc_text_fields ) ) && in_array( $meta_key, array_keys($afwc_text_fields) ) ) { $temp['type'] = $temp['editor'] = 'text'; $temp['name'] = $temp['key'] = $afwc_text_fields[ $meta_key ]; } $temp ['hidden'] = ( !empty($default_um_visible_cols) && in_array($meta_key, $default_um_visible_cols) ) ? false : true; $hidden_col_array = array('_edit_lock','_edit_last'); if (array_search($meta_key,$hidden_col_array) !== false ) { $temp ['hidden'] = true; } $temp ['editable'] = ( !empty($default_um_disabled_cols) && in_array($meta_key, $default_um_disabled_cols) ) ? false : true; $temp ['editor'] = ( 'numeric' === $temp ['type'] ) ? 'customNumericEditor' : $temp ['type']; $temp ['batch_editable'] = true; // flag for enabling the batch edit for the column $temp ['sortable'] = true; $temp ['resizable'] = true; $temp ['frozen'] = false; $temp ['allow_showhide'] = true; $temp ['exportable'] = true; //default true. flag for enabling the column in export $temp ['searchable'] = ( !empty($default_um_non_searchable_cols) && in_array($meta_key, $default_um_non_searchable_cols) ) ? false : true; $temp ['category'] = ''; //for advanced search $temp ['placeholder'] = ''; //for advanced search $col_model [] = $temp; } if ( ! empty( $col_model ) && is_array( $col_model ) ) { $col_model = &$col_model; } } $dashboard_model['columns'] = $col_model; return $dashboard_model; } //function to avoid generation of the default data model public function load_default_data_model ($flag) { return false; } public function process_user_search_cond($params = array()) { global $wpdb; if( empty($params) || empty($params['search_query']) ) { return; } $rule_groups = ( ! empty( $params['search_query'] ) ) ? $params['search_query'][0]['rules'] : array(); if( empty( $rule_groups ) ) { return; } $wpdb->query("DELETE FROM {$wpdb->base_prefix}sm_advanced_search_temp"); // query to reset advanced search temp table $advanced_search_query = array(); $i = 0; $search_cols_type = ( ! empty( $params['search_cols_type'] ) ) ? $params['search_cols_type'] : array(); $non_flat_table_types = ( ! empty( $this->advanced_search_table_types['meta'] ) ) ? array_merge( array( 'terms' ), array_keys( $this->advanced_search_table_types['meta'] ) ) : array( 'terms' ); foreach ($rule_groups as $rule_group) { if (is_array($rule_group)) { // START FROM HERE if ( ! empty( $this->advanced_search_table_types ) ) { if ( ! empty( $this->advanced_search_table_types['flat'] ) ) { foreach ( array_keys( $this->advanced_search_table_types['flat'] ) as $table ) { $advanced_search_query[$i]['cond_'. $table] = ''; } } if ( ! empty( $non_flat_table_types ) ) { foreach ( $non_flat_table_types as $table ) { $advanced_search_query[$i]['cond_'. $table] = ''; $advanced_search_query[$i]['cond_'. $table .'_col_name'] = ''; $advanced_search_query[$i]['cond_'. $table .'_col_value'] = ''; $advanced_search_query[$i]['cond_'. $table .'_operator'] = ''; } } } $search_value_is_array = 0; //flag for array of search_values $rule_group = apply_filters('sm_user_before_search_string_process', $rule_group); $rules = ( ! empty( $rule_group['rules'] ) ) ? $rule_group['rules'] : array(); foreach( $rules as $rule ) { if( ! empty( $rule['type'] ) ) { $field = explode( '.', $rule['type'] ); $rule['table_name'] = ( ! empty( $field[0] ) ) ? $field[0] : ''; $rule['col_name'] = ( ! empty( $field[1] ) ) ? $field[1] : ''; } $search_col = (!empty($rule['col_name'])) ? $rule['col_name'] : ''; $search_operator = (!empty($rule['operator'])) ? $rule['operator'] : ''; $search_operator = ( ! empty( $this->advance_search_operators[$search_operator] ) ) ? $this->advance_search_operators[$search_operator] : $search_operator; $search_data_type = ( ! empty( $search_cols_type[$rule['type']] ) ) ? $search_cols_type[$rule['type']] : 'text'; $search_value = (!empty($rule['value']) && $rule['value'] != "''") ? $rule['value'] : ( ( in_array( $search_data_type, array( "number", "numeric" ) ) ) ? '0' : '' ); if ( 'terms' === $rule['table_name'] && "''" === $search_value ){ // For handling taxonomy empty strings switch( $search_operator ){ case 'is': $search_operator = 'is not'; break; case 'is not': $search_operator = 'is'; break; } } $search_params = array('search_string' => $rule, 'search_col' => $search_col, 'search_operator' => $search_operator, 'search_data_type' => $search_data_type, 'search_value' => $search_value, 'SM_IS_WOO30' => (!empty($params['SM_IS_WOO30'])) ? $params['SM_IS_WOO30'] : ''); if( !empty( $params['data_col_params'] ) ) { $search_value = ( in_array($search_col, $params['data_col_params']['data_cols_timestamp']) ) ? strtotime($search_value) : $search_value; } if (!empty($rule['table_name']) && $rule['table_name'] == $wpdb->prefix.'users') { $search_col = apply_filters('sm_search_format_query_users_col_name', $search_col, $search_params); $search_value = apply_filters('sm_search_format_query_users_col_value', $search_value, $search_params); if ( in_array( $search_data_type, array( "number", "numeric" ) ) ) { $users_cond = $rule['table_name'].".".$search_col . " ". $search_operator ." " . $search_value; } else if ( $search_data_type == "date" || $search_data_type == "sm.datetime" ) { $users_cond = $rule['table_name'].".".$search_col . " ". $search_operator ." '" . $search_value ."' "; } else { if ($search_operator == 'is') { $users_cond = $rule['table_name'].".".$search_col . " LIKE '" . $search_value . "'"; } else if ($search_operator == 'is not') { $users_cond = $rule['table_name'].".".$search_col . " NOT LIKE '" . $search_value . "'"; } else { $users_cond = $rule['table_name'].".".$search_col . " ". $search_operator ."'%" . $search_value . "%'"; } } $users_cond = apply_filters('sm_search_users_cond', $users_cond, $search_params); $advanced_search_query[$i]['cond_users'] .= $users_cond ." && "; } else if (!empty($rule['table_name']) && $rule['table_name'] == $wpdb->prefix.'usermeta') { $advanced_search_query[$i]['cond_usermeta_col_name'] .= $search_col; $advanced_search_query[$i]['cond_usermeta_col_value'] .= $search_value; $search_col = apply_filters('sm_search_format_query_usermeta_col_name', $search_col, $search_params); $search_value = apply_filters('sm_search_format_query_usermeta_col_value', $search_value, $search_params); if ( in_array( $search_data_type, array( "number", "numeric" ) ) ) { $postmeta_cond = " ( ". $rule['table_name'].".meta_key LIKE '". $search_col . "' AND ". $rule['table_name'] .".meta_value ". $search_operator ." " . $search_value . " )"; $advanced_search_query[$i]['cond_usermeta_operator'] .= $search_operator; } else if ( $search_data_type == "date" || $search_data_type == "sm.datetime" ) { $postmeta_cond = " ( ". $rule['table_name'].".meta_key LIKE '". $search_col . "' AND ". $rule['table_name'] .".meta_value ". $search_operator ." '" . $search_value . "' )"; $advanced_search_query[$i]['cond_usermeta_operator'] .= $search_operator; } else { if( $search_operator == 'is' ) { if( $search_col == $wpdb->prefix.'capabilities' ) { $search_value = '%'. $search_value .'%'; } $advanced_search_query[$i]['cond_usermeta_operator'] .= 'LIKE'; $postmeta_cond = " ( ". $rule['table_name'].".meta_key LIKE '". $search_col . "' AND ". $rule['table_name'] .".meta_value LIKE '" . $search_value . "'" . " )"; } else if( $search_operator == 'is not' ) { if( $search_col == $wpdb->prefix.'capabilities' ) { $search_value = '%'. $search_value .'%'; } $advanced_search_query[$i]['cond_usermeta_operator'] .= 'NOT LIKE'; $postmeta_cond = " ( ". $rule['table_name'].".meta_key LIKE '". $search_col . "' AND ". $rule['table_name'] .".meta_value NOT LIKE '" . $search_value . "'" . " )"; } else { $advanced_search_query[$i]['cond_usermeta_operator'] .= $search_operator; $postmeta_cond = " ( ". $rule['table_name'].".meta_key LIKE '". $search_col . "' AND ". $rule['table_name'] .".meta_value ". $search_operator ." '%" . $search_value . "%'" . " )"; } } $postmeta_cond = apply_filters('sm_search_usermeta_cond', $postmeta_cond, $search_params); $advanced_search_query[$i]['cond_usermeta'] .= $postmeta_cond ." && "; $advanced_search_query[$i]['cond_usermeta_col_name'] .= " && "; $advanced_search_query[$i]['cond_usermeta_col_value'] .= " && "; $advanced_search_query[$i]['cond_usermeta_operator'] .= " && "; } elseif ( ( ! empty( $rule['table_name'] ) ) && $wpdb->prefix.'terms' === $rule['table_name'] ) { $advanced_search_query[$i] = $this->create_terms_table_search_query( array( 'search_query' => $advanced_search_query[$i], 'search_params' => $search_params, 'rule' => $rule ) ); } $advanced_search_query[$i] = apply_filters('sm_user_search_query_formatted', $advanced_search_query[$i], $search_params); } if ( ! empty( $advanced_search_query[$i] ) ) { foreach( $advanced_search_query[$i] as $key => $value ){ if( " && " !== substr( $value, -4 ) ){ continue; } $advanced_search_query[$i][ $key ] = ( ! empty( $value ) ) ? substr( $value, 0, -4 ) : ''; } } } $i++; } //Code for handling advanced search conditions if (!empty($advanced_search_query)) { $index_search_string = 1; // index to keep a track of flags in the advanced search temp $search_params = array(); foreach ($advanced_search_query as &$advanced_search_query_string) { $this->previous_cond_has_results = true; //Cond for usermeta if (!empty($advanced_search_query_string['cond_usermeta'])) { $cond_usermeta_array = explode(" && ",$advanced_search_query_string['cond_usermeta']); $cond_usermeta_col_name = (!empty($advanced_search_query_string['cond_usermeta_col_name'])) ? explode(" && ",$advanced_search_query_string['cond_usermeta_col_name']) : ''; $cond_usermeta_col_value = (!empty($advanced_search_query_string['cond_usermeta_col_value'])) ? explode(" && ",$advanced_search_query_string['cond_usermeta_col_value']) : ''; $cond_usermeta_operator = (!empty($advanced_search_query_string['cond_usermeta_operator'])) ? explode(" && ",$advanced_search_query_string['cond_usermeta_operator']) : ''; $index = 0; $cond_usermeta_post_ids = ''; $result_usermeta_search = ''; foreach ($cond_usermeta_array as $cond_usermeta) { $usermeta_search_result_flag = ( $index == (sizeof($cond_usermeta_array) - 1) ) ? ', '.$index_search_string : ', 0'; $cond_usermeta_col_name1 = (!empty($cond_usermeta_col_name[$index])) ? trim($cond_usermeta_col_name[$index]) : ''; $cond_usermeta_col_value1 = (!empty($cond_usermeta_col_value[$index])) ? trim($cond_usermeta_col_value[$index]) : ''; $cond_usermeta_operator1 = (!empty($cond_usermeta_operator[$index])) ? trim($cond_usermeta_operator[$index]) : ''; $search_params = array('cond_usermeta_col_name' => $cond_usermeta_col_name1, 'cond_usermeta_col_value' => $cond_usermeta_col_value1, 'cond_usermeta_operator' => $cond_usermeta_operator1, 'SM_IS_WOO30' => (!empty($params['SM_IS_WOO30'])) ? $params['SM_IS_WOO30'] : ''); $cond_usermeta = apply_filters('sm_search_usermeta_condition_start', $cond_usermeta, $search_params); $search_params['cond_usermeta'] = $cond_usermeta; $usermeta_advanced_search_select = 'SELECT DISTINCT '.$wpdb->prefix.'usermeta.user_id '. $usermeta_search_result_flag .' ,0 '; $usermeta_advanced_search_from = 'FROM '.$wpdb->prefix.'usermeta '; $usermeta_advanced_search_where = 'WHERE '.$cond_usermeta; $usermeta_advanced_search_select = apply_filters('sm_search_query_usermeta_select', $usermeta_advanced_search_select, $search_params); $usermeta_advanced_search_from = apply_filters('sm_search_query_usermeta_from', $usermeta_advanced_search_from, $search_params); $usermeta_advanced_search_where = apply_filters('sm_search_query_usermeta_where', $usermeta_advanced_search_where, $search_params); //Query to find if there are any previous conditions $count_temp_previous_cond = $wpdb->query("UPDATE {$wpdb->base_prefix}sm_advanced_search_temp SET flag = 0 WHERE flag = ". $index_search_string); //Code to handle condition if the ids of previous cond are present in temp table if (($index == 0 && $count_temp_previous_cond > 0) || (!empty($result_usermeta_search))) { $usermeta_advanced_search_from .= " JOIN ".$wpdb->base_prefix."sm_advanced_search_temp ON (".$wpdb->base_prefix."sm_advanced_search_temp.product_id = {$wpdb->usermeta}.user_id)"; $usermeta_advanced_search_where .= " AND ".$wpdb->base_prefix."sm_advanced_search_temp.flag = 0"; } $result_usermeta_search = array(); if (!empty($usermeta_advanced_search_select ) && !empty($usermeta_advanced_search_from ) && !empty($usermeta_advanced_search_where )) { $query_usermeta_search = "REPLACE INTO {$wpdb->base_prefix}sm_advanced_search_temp (". $usermeta_advanced_search_select ." ". $usermeta_advanced_search_from ." ".$usermeta_advanced_search_where.")"; $result_usermeta_search = $wpdb->query ( $query_usermeta_search ); } do_action('sm_search_usermeta_condition_complete',$result_usermeta_search,$search_params); $index++; } do_action('sm_search_usermeta_conditions_array_complete',$search_params); //Query to delete the unwanted post_ids $wpdb->query("DELETE FROM {$wpdb->base_prefix}sm_advanced_search_temp WHERE flag = 0"); } //Cond for users if (!empty($advanced_search_query_string['cond_users'])) { $cond_users_array = explode(" && ",$advanced_search_query_string['cond_users'] ); $index = 0; $cond_users_post_ids = ''; $result_users_search = ''; foreach ( $cond_users_array as $cond_users ) { $users_search_result_flag = ( $index == (sizeof($cond_users_array) - 1) ) ? ', '.$index_search_string : ', 0'; $cond_users = apply_filters('sm_search_users_condition_start', $cond_users); $search_params = array('cond_users' => $cond_users, 'SM_IS_WOO30' => (!empty($params['SM_IS_WOO30'])) ? $params['SM_IS_WOO30'] : ''); $users_advanced_search_select = "SELECT DISTINCT {$wpdb->users}.id ". $users_search_result_flag ." ,0 "; $users_advanced_search_from = " FROM {$wpdb->users} "; $users_advanced_search_where = " WHERE ". $cond_users ." "; $users_advanced_search_select = apply_filters('sm_search_query_users_select', $users_advanced_search_select, $search_params); $users_advanced_search_from = apply_filters('sm_search_query_users_from', $users_advanced_search_from, $search_params); $users_advanced_search_where = apply_filters('sm_search_query_users_where', $users_advanced_search_where, $search_params); //Query to find if there are any previous conditions $count_temp_previous_cond = $wpdb->query("UPDATE {$wpdb->base_prefix}sm_advanced_search_temp SET flag = 0 WHERE flag = ". $index_search_string); //Code to handle condition if the ids of previous cond are present in temp table if ( ($index == 0 && $count_temp_previous_cond > 0) || (!empty($result_users_search)) ) { $users_advanced_search_from .= " JOIN ".$wpdb->base_prefix."sm_advanced_search_temp ON (".$wpdb->base_prefix."sm_advanced_search_temp.product_id = {$wpdb->users}.id) "; $users_advanced_search_where .= " AND ".$wpdb->base_prefix."sm_advanced_search_temp.flag = 0 "; } $result_users_search = array(); if (!empty($users_advanced_search_select ) && !empty($users_advanced_search_from ) && !empty($users_advanced_search_where )) { $query_users_search = "REPLACE INTO {$wpdb->base_prefix}sm_advanced_search_temp ( ". $users_advanced_search_select ." ". $users_advanced_search_from ." ". $users_advanced_search_where .")"; $result_users_search = $wpdb->query ( $query_users_search ); } do_action('sm_search_users_condition_complete',$result_users_search,$search_params); $index++; } do_action('sm_search_users_conditions_array_complete',$search_params); //Query to delete the unwanted post_ids $wpdb->query("DELETE FROM {$wpdb->base_prefix}sm_advanced_search_temp WHERE flag = 0"); } elseif ( ! empty( $advanced_search_query_string['cond_terms'] ) ) { $this->process_terms_table_search_query( array_merge( $params, array( 'search_query' => $advanced_search_query_string, 'search_query_index' => $index_search_string ) ) ); } $index_search_string++; } } } //function to generate data model public function generate_data_model ($data_model, $data_col_params) { global $wpdb, $current_user; $items = array(); $index = 0; $join = $where = ''; $order_by = " ORDER BY {$wpdb->users}.id DESC "; $start = (!empty($this->req_params['start'])) ? $this->req_params['start'] : 0; $limit = (!empty($this->req_params['sm_limit'])) ? $this->req_params['sm_limit'] : 50; $current_page = (!empty($this->req_params['sm_page'])) ? $this->req_params['sm_page'] : '1'; $start_offset = ($current_page > 1) ? (($current_page - 1) * $limit) : $start; $current_store_model = get_transient( 'sa_sm_'.$this->dashboard_key ); if( ! empty( $current_store_model ) && !is_array( $current_store_model ) ) { $current_store_model = json_decode( $current_store_model, true ); } $col_model = (!empty($current_store_model['columns'])) ? $current_store_model['columns'] : array(); $search_cols_type = array(); //array for col & its type for advanced search if (!empty($col_model)) { foreach ($col_model as $col) { if( ! empty( $col['table_name'] ) && ! empty( $col['col_name'] ) ){ $search_cols_type[ $col['table_name'] .'.'. $col['col_name'] ] = $col['type']; } } } //Code to clear the advanced search temp table if ( empty($this->req_params['advanced_search_query']) || $this->req_params['advanced_search_query'] == '[]') { $wpdb->query("DELETE FROM {$wpdb->base_prefix}sm_advanced_search_temp"); delete_option('sm_advanced_search_query'); } // if( !empty($this->req_params['date_filter_query']) && ( defined('SMPRO') && true === SMPRO ) ) { // if( empty($this->req_params['search_query']) ) { // $this->req_params['search_query'] = array( $this->req_params['date_filter_query'] ); // } else { // $date_filter_array = json_decode(stripslashes($this->req_params['date_filter_query']),true); // foreach( $this->req_params['search_query'] as $key => $search_string_array ) { // $search_string_array = json_decode(stripslashes($search_string_array),true); // foreach( $date_filter_array as $date_filter ) { // $search_string_array[] = $date_filter; // } // $this->req_params['search_query'][$key] = addslashes(json_encode($search_string_array)); // } // } // } $sm_advanced_search_results_persistent = 0; //flag to handle persistent search results //Code fo handling advanced search functionality if( !empty( $this->req_params['advanced_search_query'] ) && $this->req_params['advanced_search_query'] != '[]' ) { $this->req_params['advanced_search_query'] = json_decode(stripslashes($this->req_params['advanced_search_query']), true); if (!empty($this->req_params['advanced_search_query'])) { $post_type = $wpdb->prefix . $this->dashboard_key; if ( ! empty( $this->req_params['table_model']['posts']['where']['post_type'] ) ) { $post_type = ( is_array( $this->req_params['table_model']['posts']['where']['post_type'] ) ) ? $this->req_params['table_model']['posts']['where']['post_type'] : array( $this->req_params['table_model']['posts']['where']['post_type'] ); } $this->process_user_search_cond(array( 'search_query' => (!empty($this->req_params['advanced_search_query'])) ? $this->req_params['advanced_search_query'] : array(), 'SM_IS_WOO30' => (!empty($this->req_params['SM_IS_WOO30'])) ? $this->req_params['SM_IS_WOO30'] : '', 'search_cols_type' => $search_cols_type, 'post_type' => $post_type ) ); } $join = " JOIN {$wpdb->base_prefix}sm_advanced_search_temp ON ({$wpdb->base_prefix}sm_advanced_search_temp.product_id = {$wpdb->users}.id)"; $where = " AND {$wpdb->base_prefix}sm_advanced_search_temp.flag > 0"; } //Code to handle simple search functionality if( !empty( $this->req_params['search_text'] ) ) { $user_where_cond = array(); $search_text = $wpdb->_real_escape( $this->req_params['search_text'] ); $join = " JOIN {$wpdb->usermeta} ON ({$wpdb->usermeta}.user_id = {$wpdb->users}.id)"; //Code for getting users table condition if( !empty( $col_model ) ) { foreach( $col_model as $col ) { if (empty($col['src'])) continue; $src_exploded = explode("/",$col['src']); $ignored_cols = array('user_pass'); $simple_search_ignored_cols = apply_filters('sm_simple_search_ignored_users_columns', $ignored_cols, $col_model); if( !empty( $src_exploded[0] ) && $src_exploded[0] == 'users' && !in_array($src_exploded[1], $simple_search_ignored_cols) ) { $user_where_cond[] = "( {$wpdb->users}.".$src_exploded[1]." LIKE '%".$search_text."%' )"; } } } $where = " AND (({$wpdb->usermeta}.meta_value LIKE '%".$search_text."%') "; $where .= ( ( !empty( $user_where_cond ) ) ? ' OR '. implode(" OR ", $user_where_cond) : '' )." )"; } if( !empty( $this->req_params['sort_params'] ) ) { if( !empty( $this->req_params['sort_params']['column'] ) && !empty( $this->req_params['sort_params']['sortOrder'] ) ) { $usermeta_cols = $numeric_usermeta_cols = $data_cols = array(); foreach( $col_model as $col ) { if (empty($col['src'])) continue; $src_exploded = explode("/",$col['src']); if (empty($src_exploded)) continue; $type = ( !empty( $col['type'] ) ) ? $col['type'] : ''; if ( sizeof($src_exploded) > 2) { $col_meta = explode("=",$src_exploded[1]); $col_nm = $col_meta[1]; } else { $col_nm = $src_exploded[1]; } $data_cols[] = $col_nm; if( !empty( $src_exploded[0] ) && $src_exploded[0] == 'usermeta' && $col_nm != 'user_id' ) { $usermeta_cols[] = $col_nm; if( in_array( $type, array( "number", "numeric" ) ) ) { $numeric_usermeta_cols[] = $col_nm; } } } // Code for handling sorting of the postmeta $sort_params = $this->build_query_sort_params( array( 'sort_params' => $this->req_params['sort_params'], 'numeric_meta_cols' => $numeric_usermeta_cols, 'data_cols' => $data_cols ) ); if( ! empty( $sort_params ) && ! empty( $sort_params['table'] ) && ! empty( $sort_params['column_nm'] && ! empty( $sort_params['sortOrder'] ) ) ) { $sort_params['column_nm'] = ( 'meta_value_num' === $sort_params['column_nm'] ) ? 'meta_value+0' : $sort_params['column_nm']; if( ! empty( $sort_params['sort_by_meta_key'] ) ) { $join .= ( false === strpos( $join, "JOIN {$wpdb->usermeta}" ) ) ? " JOIN {$wpdb->usermeta} ON ({$wpdb->usermeta}.user_id = {$wpdb->users}.id)" : ""; $where .= " AND ( ".$wpdb->prefix."". $sort_params['table'] .".meta_key ='". $sort_params['sort_by_meta_key'] ."' ) "; } $order_by = " ORDER BY ".$wpdb->prefix."". $sort_params['table'] .".". $sort_params['column_nm'] ." ". $sort_params['sortOrder'] ." "; if ( ! empty( $sort_params['table'] ) && 'terms' === $sort_params['table'] ) { $join = $this->terms_table_column_sort_query( array( 'col_name' => $sort_params['column_nm'], 'id' => $wpdb->prefix . 'users.id', 'sort_order' => $sort_params['sortOrder'], 'join' => $join, 'wp_query_obj' => '', ) ); $order_by = ' ORDER BY taxonomy_sort.term_name ' . $sort_params['sortOrder'] ; } } } } $query_limit_str = ( ! empty( $this->req_params['cmd'] ) && 'get_export_csv' === $this->req_params['cmd'] && ( ! empty( $this->req_params['storewide_option'] ) ) ) ? '' : 'LIMIT '.$start_offset.', '.$limit; if ( ( ! empty( $this->req_params[ 'selected_ids' ] ) && '[]' !== $this->req_params[ 'selected_ids' ] ) && empty( $this->req_params['storewide_option'] ) && ( ! empty( $this->req_params[ 'cmd' ] ) && ( 'get_export_csv' === $this->req_params[ 'cmd' ] ) ) ) { $selected_ids = json_decode( stripslashes( $this->req_params[ 'selected_ids' ] ) ); $where .= ( ! empty( $selected_ids ) ) ? " AND {$wpdb->prefix}users.ID IN (" . implode( ",", $selected_ids ) . ")" : $where; } //code to fetch data from users table $user_ids = $wpdb->get_col( $wpdb->prepare("SELECT DISTINCT {$wpdb->users}.id FROM {$wpdb->users} ". $join ." WHERE 1=%d ".$where, 1)); $users_total_count = $wpdb->num_rows; //Code for saving the post_ids in case of simple search if( ( defined('SMPRO') && true === SMPRO ) && !empty( $this->req_params['search_text'] ) || (!empty($this->req_params['advanced_search_query']) && $this->req_params['advanced_search_query'] != '[]') ) { $user_ids_imploded = implode( ",",$user_ids ); set_transient( 'sa_sm_search_post_ids', $user_ids_imploded , WEEK_IN_SECONDS ); } $users_results = $wpdb->get_results( $wpdb->prepare("SELECT {$wpdb->users}.* FROM {$wpdb->users} ". $join ." WHERE 1=%d ". $where ." GROUP BY {$wpdb->users}.id ". $order_by ." ". $query_limit_str, 1), ARRAY_A ); if ( ! empty( $sort_params['column_nm'] ) && in_array( $sort_params['column_nm'], array( 'last_order_date','last_order_total', 'orders_count', 'orders_total' ) ) ) { switch ( $sort_params['column_nm'] ) { case 'orders_total': case 'last_order_total': $order_by = " ORDER BY order_total ". $sort_params['sortOrder'] ." "; break; case 'orders_count': $order_by = " ORDER BY order_count ". $sort_params['sortOrder'] ." "; break; case 'last_order_date': $order_by = " ORDER BY date ". $sort_params['sortOrder'] ." "; break; } if ( ! empty( Smart_Manager::$sm_is_woo79 ) && ! empty( Smart_Manager::$sm_is_wc_hpos_tables_exists ) ) { $join .= ( false === strpos( $join, "LEFT JOIN {$wpdb->prefix}wc_orders" ) ) ? " LEFT JOIN {$wpdb->prefix}wc_orders as wo ON( wo.customer_id = {$wpdb->prefix}users.ID ) AND wo.type = 'shop_order' AND wo.status IN ( 'wc-completed','wc-processing' ) " : ""; $users_results = $wpdb->get_results( $wpdb->prepare( "SELECT {$wpdb->prefix}users.*, IFNULL(wo.total_amount, 0) AS order_total, IFNULL(wo.customer_id, 0) AS customer_id, IFNULL( date_format( max( wo.date_created_gmt ), '%%Y-%%m-%%d, %%r' ), NULL ) AS date, IFNULL( count( wo.id ), 0 ) AS order_count FROM {$wpdb->prefix}users ". $join ." WHERE 1=%d ". $where ." GROUP BY {$wpdb->prefix}users.id ". $order_by ." ". $query_limit_str, 1 ), ARRAY_A ); } else { $join .= ( false === strpos( $join, "LEFT JOIN {$wpdb->prefix}wc_order_stats" ) ) ? " LEFT JOIN {$wpdb->prefix}wc_order_stats as os ON( os.customer_id = u.ID AND os.status IN ( 'wc-completed','wc-processing' ) AND os.total_sales > 0 ) " : ""; $users_results = $wpdb->get_results( $wpdb->prepare( "SELECT u.*, IFNULL( SUM( os.total_sales ), 0 ) as order_total, IFNULL( GROUP_CONCAT( distinct os.order_id ORDER BY os.date_created DESC SEPARATOR ',' ), 0 ) AS all_id, IFNULL( date_format( max( os.date_created ), '%%Y-%%m-%%d, %%r' ), NULL ) AS date, IFNULL( count( os.order_id ), 0 ) AS order_count FROM {$wpdb->prefix}users as u ". $join ." WHERE 1=%d ". $where ." GROUP BY u.ID ". $order_by ." ". $query_limit_str, 1 ), ARRAY_A ); } } $total_pages = 1; if( $users_total_count > $limit && $this->req_params['cmd'] != 'get_export_csv' ) { $total_pages = ceil($users_total_count/$limit); } if( !empty( $users_results ) ) { $user_ids = array(); foreach( $users_results as $user ) { if( !empty($user['ID']) ) { $user_ids[] = $user['ID']; } } //code to get the usermeta data $um_results = $wpdb->get_results( $wpdb->prepare("SELECT user_id, meta_key, meta_value FROM {$wpdb->usermeta} WHERE 1=%d AND user_id IN (". implode(",", $user_ids) .") AND meta_key NOT IN ('". implode("','",$this->usermeta_ignored_cols) ."') GROUP BY user_id, meta_key", 1), ARRAY_A ); if( count($um_results) > 0 ) { $records_meta = array(); foreach ($um_results as $meta_data) { $key = preg_replace('/[^A-Za-z0-9\-_]/', '', $meta_data['meta_key']); //for formatting meta keys of custom keys $records_meta[$meta_data['user_id']][$key] = $meta_data['meta_value']; } } $customer_ids = array(); foreach( $users_results as $user ) { $user_id = (!empty( $user['ID'] )) ? $user['ID'] : 0; foreach( $user as $key => $value ) { if( is_array( $data_col_params['data_cols'] ) && !empty( $data_col_params['data_cols'] ) ) { if( array_search( $key, $data_col_params['data_cols'] ) === false ) { continue; //cond for checking col in col model } } if( is_array( $data_col_params['data_cols_checkbox'] ) && !empty( $data_col_params['data_cols_checkbox'] ) && !empty( $data_col_params['data_cols_unchecked_template'] ) && is_array( $data_col_params['data_cols_unchecked_template'] ) ) { if( array_search( $key, $data_col_params['data_cols_checkbox'] ) !== false && $value == '' ) { //added for bad_value checkbox $value = $data_col_params['data_cols_unchecked_template'][$key]; } } $key_mod = 'users_'.strtolower(str_replace(' ', '_', $key)); $items [$index][$key_mod] = ( $key != 'user_pass' ) ? $value : ''; } if( !empty( $records_meta[$user_id] ) ) { foreach( $records_meta[$user_id] as $key => $value ) { if (array_search($key, $data_col_params['data_cols']) === false) continue; //cond for checking col in col model //Code for handling serialized data if (array_search($key, $data_col_params['data_cols_serialized']) !== false) { $value = maybe_unserialize($value); if ( !empty( $value ) ) { $value = json_encode($value); } } else if( array_search($key, $data_col_params['data_cols_checkbox']) !== false && $value == '' ) { //added for bad_value checkbox $value = $data_col_params['data_cols_unchecked_template'][$key]; } else if( is_array( $data_col_params['data_cols_timestamp'] ) && !empty( $data_col_params['data_cols_timestamp'] ) ) { if( in_array( $key, $data_col_params['data_cols_timestamp'] ) && !empty( $value ) && is_numeric( $value ) ) { if( function_exists('isTimestamp') && isTimestamp( $value ) ){ $date = new DateTime("@".$value); $value = $date->format('Y-m-d H:i:s'); } } } $key_mod = 'usermeta_meta_key_'.$key.'_meta_value_'.$key; $items [$index][$key_mod] = (!empty($value)) ? $value : ''; } if( ( defined('SMPRO') && true === SMPRO ) ) { $items [$index]['custom_last_order_date'] = '-'; $items [$index]['custom_last_order_total'] = '-'; $items [$index]['custom_orders_count'] = '-'; $items [$index]['custom_orders_total'] = '-'; } else { $items [$index]['custom_last_order_date'] = ' Pro only '; $items [$index]['custom_last_order_total'] = ' Pro only '; $items [$index]['custom_orders_count'] = ' Pro only '; $items [$index]['custom_orders_total'] = ' Pro only '; } $cap_key = $wpdb->prefix.'capabilities'; if( !empty($records_meta[$user_id][$cap_key]) ) { $caps = maybe_unserialize($records_meta[$user_id][$cap_key]); $role = array_keys($caps); $items [$index]['usermeta_role'] = ( !empty($role[0]) ) ? $role[0] : ''; if( !empty( $items [$index]['usermeta_role'] ) && $items [$index]['usermeta_role'] == 'customer' ) { $customer_ids[$user_id] = $index; } } } $index++; } if( ! empty( $customer_ids ) && ( defined('SMPRO') && true === SMPRO ) ) { $customers_order_meta = array(); if ( ! empty( Smart_Manager::$sm_is_woo79 ) && ! empty( Smart_Manager::$sm_is_wc_hpos_tables_exists ) ) { $customers_order_meta = $this->sm_get_custom_order_data( $customers_order_meta, 'customers_order_meta', array_keys( $customer_ids ) ); } else { $customers_order_meta = $wpdb->get_results( $wpdb->prepare( "SELECT pm.meta_value as cust_id, GROUP_CONCAT(distinct pm.post_ID ORDER BY p.post_date DESC SEPARATOR ',' ) AS all_id, date_format(max(p.post_date), '%%Y-%%m-%%d, %%r') AS date, count(pm.post_id) as count FROM {$wpdb->prefix}postmeta AS pm JOIN {$wpdb->prefix}posts AS p ON (p.ID = pm.post_id AND p.post_type = 'shop_order' AND p.post_status IN ('wc-completed','wc-processing') AND pm.meta_key = %s) WHERE pm.meta_value IN (" . implode( ",", array_keys( $customer_ids ) ) . ") GROUP BY pm.meta_value ORDER BY date", '_customer_user' ), 'ARRAY_A' ); } if( ! empty( $customers_order_meta ) ) { $order_ids = array(); $max_oid = array(); foreach( $customers_order_meta as $customer_order_meta ) { $oids = ( !empty( $customer_order_meta['all_id'] ) ) ? explode( ",", $customer_order_meta['all_id'] ) : array(''); foreach( $oids as $oid ) { $order_ids[$oid] = $customer_order_meta['cust_id']; } $max_oid[ $oids[0] ] = $customer_order_meta['cust_id']; $index = $customer_ids[$customer_order_meta['cust_id']]; $items [$index]['custom_last_order_date'] = ( !empty( $customer_order_meta['date'] ) ) ? $customer_order_meta['date'] : '-'; $items [$index]['custom_orders_count'] = ( !empty( $customer_order_meta['count'] ) ) ? $customer_order_meta['count'] : 0; } if( !empty( $order_ids ) ) { $customer_totals = array(); if ( ! empty( Smart_Manager::$sm_is_woo79 ) && ! empty( Smart_Manager::$sm_is_wc_hpos_tables_exists ) ) { $customer_totals = $this->sm_get_custom_order_data( $customer_totals, 'customer_totals', array_keys( $order_ids ) ); } else { $customer_totals = $wpdb->get_results( $wpdb->prepare( "SELECT post_id AS order_id, meta_value AS order_total FROM {$wpdb->prefix}postmeta WHERE meta_key = %s AND post_id IN ( ". implode( ",", array_keys( $order_ids ) ) ." )", '_order_total' ), 'ARRAY_A' ); } if( !empty( $customer_totals ) ) { foreach( $customer_totals as $customer_total ) { $order_id = ( !empty( $customer_total['order_id'] ) ) ? intval( $customer_total['order_id'] ) : ''; $order_total = ( !empty( $customer_total['order_total'] ) ) ? floatval( $customer_total['order_total'] ) : 0; if( empty( $order_id ) ) { return; } if( !empty( $max_oid[ $order_id ] ) ) { $index = $customer_ids[$max_oid[ $order_id ]]; $items [$index]['custom_last_order_total'] = $order_total; } if( !empty( $order_ids[ $order_id ] ) ) { $index = $customer_ids[$order_ids[ $order_id ]]; if( '-' == $items [$index]['custom_orders_total'] ){ $items [$index]['custom_orders_total'] = 0; } $items [$index]['custom_orders_total'] += $order_total; } } } } } } } $formatted_terms_data = $this->format_terms_data( array( 'items' => $items, 'terms_visible_cols' => $data_col_params['terms_visible_cols'], 'data_cols_multilist' => $data_col_params['data_cols_multilist'], 'data_cols_dropdown' => $data_col_params['data_cols_dropdown'], 'ids' => $user_ids, 'id_name' => 'users_id', 'postmeta_cols' => array() ) ); if ( ! empty( $formatted_terms_data ) ) { $items = $formatted_terms_data; } $data_model ['items'] = (!empty($items)) ? $items : ''; $data_model ['start'] = $start+$limit; $data_model ['page'] = $current_page; $data_model ['total_pages'] = $total_pages; $data_model ['total_count'] = $users_total_count; return $data_model; } //function for modifying edited data before updating public function user_inline_update($edited_data, $params) { if (empty($edited_data)) return $edited_data; global $wpdb; $default_user_keys = array( 'ID', 'user_pass', 'user_login', 'user_nicename', 'user_url', 'user_email', 'display_name', 'nickname', 'first_name', 'last_name', 'description', 'rich_editing', 'syntax_highlighting', 'comment_shortcuts', 'admin_color', 'use_ssl', 'user_registered', 'show_admin_bar_front', 'role', 'locale' ); foreach ($edited_data as $id => $edited_row) { if( empty( $id ) ) { continue; } $default_insert_users = array(); $insert_usermeta = array(); foreach( $edited_row as $key => $value ) { $prev_val = ''; $edited_value_exploded = explode("/", $key); if( empty( $edited_value_exploded ) ) continue; $update_table = $edited_value_exploded[0]; $update_column = $edited_value_exploded[1]; if ( sizeof( $edited_value_exploded ) <= 2) { if( ( ($update_table == 'users') || ($update_table == 'usermeta' && $update_column == 'role') ) ) { if( $update_table == 'usermeta' && $update_column == 'role' && (!empty( $params['data_cols_list_val'][$update_column][$value] )) ) { $default_insert_users [$update_column] = $value; } else if ( $update_column != 'role' ) { $default_insert_users [$update_column] = $value; } } elseif ( 'terms' === $update_table ) { $this->update_terms_table_data( array( 'update_column' => $update_column, 'data_cols_multiselect' => $params['data_cols_multiselect'], 'data_cols_multiselect_val' => $params['data_cols_multiselect_val'], 'data_cols_list' => $params['data_cols_list'], 'data_cols_list_val' => $params['data_cols_list_val'], 'value' => $value, 'id' => $id ) ); } } elseif ( sizeof( $edited_value_exploded ) > 2) { $cond = explode( '=', $edited_value_exploded[1]); $update_column_exploded = explode( '=', $edited_value_exploded[2]); $update_column = $update_column_exploded[1]; if( in_array( $update_column, $params['data_cols_timestamp'] ) ) { $value = strtotime($value); } if( 'usermeta' === $update_table && in_array( $update_column, $default_user_keys ) ) { if( $update_column == 'use_ssl' ) { $value = ( $value == 'yes' ) ? 0 : 1; } $default_insert_users [$update_column] = $value; } else if( $update_table == 'usermeta' && in_array( $update_column, $default_user_keys ) === false ) { $insert_usermeta [$update_column] = $value; } } $this->field_names[ $id ][ $update_column ] = $key; // For fetching previous values. if ( ! empty( $id ) && ! empty( $update_table ) && ! empty( $update_column ) ) { $prev_val = self:: users_batch_update_prev_value( $prev_val, array( 'id' => $id, 'table_nm' => $update_table, 'col_nm' => $update_column ) ); $prev_val = ( ( ! empty( $params ) ) && ( ! empty( $update_column ) ) ) ? sa_sm_format_prev_val( array( 'prev_val' => $prev_val, 'update_column' => $update_column, 'col_data_type' => $params, 'updated_val' => $value ) ) : $prev_val; $this->prev_post_values[ $id ][ $update_column ] = $prev_val; } } if ( !empty ( $default_insert_users ) ) { $default_insert_users['ID'] = intval( $id ); if( isset( $default_insert_users ['user_email'] ) && empty( $default_insert_users ['user_email'] ) ){ wp_send_json( array( 'msg' => __( 'Email cannot be empty', 'smart-manager-for-wp-e-commerce' ) ) ); } $email_exists = ( ! empty ( $default_insert_users ['user_email'] ) ) ? ( email_exists( $default_insert_users ['user_email'] ) ) : ''; if ( ! empty( $email_exists ) && ( empty( $default_insert_users['ID'] ) || ( ! empty( $default_insert_users['ID'] ) && intval( $email_exists ) !== $default_insert_users['ID'] ) ) ){ wp_send_json( array( 'msg' => __( 'Email already exists. Please enter another email.', 'smart-manager-for-wp-e-commerce' ) ) ); } if ( empty( $default_insert_users['ID'] ) ){ //Code for inserting users $default_insert_users ['user_pass'] = ( empty( $default_insert_users ['user_pass'] ) ) ? wp_generate_password() : $default_insert_users ['user_pass']; $default_insert_users ['user_login'] = $default_insert_users ['user_email'] ; $id = wp_insert_user( $default_insert_users ); if ( ! is_wp_error( $id ) ) { do_action( 'register_new_user', $id); } } else { //Code for updating users $id = wp_update_user( $default_insert_users ); if ( ( ! property_exists( 'Smart_Manager_Base', 'update_task_details_params' ) ) || empty( $this->task_id ) ||is_wp_error( $id ) || empty( $id ) ) { continue; } foreach ( $default_insert_users as $key => $value ) { if ( ( ( ! empty( $key ) ) && ('ID' === $key ) ) || ! isset( $this->field_names[ $id ][ $key ] ) ) { continue; } Smart_Manager_Base::$update_task_details_params[] = array( 'task_id' => $this->task_id, 'action' => 'set_to', 'status' => 'completed', 'record_id' => $id, 'field' => $this->field_names[ $id ][ $key ], 'prev_val' => $this->prev_post_values[ $id ][ $key ], 'updated_val' => $value, ); } } } if ( ! is_wp_error( $id ) && ! empty( $insert_usermeta ) ) { if ( ( ! property_exists( 'Smart_Manager_Base', 'update_task_details_params' ) ) || empty( $this->task_id ) || empty( $id ) ) { continue; } foreach ( $insert_usermeta as $key => $value ) { if ( ( is_wp_error( update_user_meta( $id, $key, $value ) ) ) || empty( $key ) || ! isset( $this->field_names[ $id ][ $key ] ) ) { continue; } Smart_Manager_Base::$update_task_details_params[] = array( 'task_id' => $this->task_id, 'action' => 'set_to', 'status' => 'completed', 'record_id' => $id, 'field' => $this->field_names[ $id ][ $key ], 'prev_val' => $this->prev_post_values[ $id ][ $key ], 'updated_val' => $value, ); } } } } public static function users_batch_update_entire_store_ids_from( $from, $params ) { $from = str_replace('posts', 'users', $from); return $from; } public static function users_batch_update_entire_store_ids_where( $where, $params ) { global $wpdb; $search_cond_pos = strpos( $where, "AND {$wpdb->base_prefix}sm_advanced_search_temp" ); if( !empty( $search_cond_pos ) ) { $where = 'WHERE '. substr( $where, ($search_cond_pos + 3) ); } else { $where = 'WHERE 1=1 '; } return $where; } public static function users_batch_update_entire_store_ids_query( $query ) { global $wpdb; $query = $wpdb->prepare( "SELECT ID FROM {$wpdb->users} WHERE 1=%d", 1 ); return $query; } public static function users_batch_update_prev_value( $prev_val = '', $args = array() ) { global $wpdb; if( 'users' === $args['table_nm'] ) { $prev_val = $wpdb->get_var( $wpdb->prepare( "SELECT ". $args['col_nm'] ." FROM $wpdb->users WHERE ID = %d", $args['id'] ) ); } else if( 'usermeta' === $args['table_nm'] && 'role' !== $args['col_nm'] ) { $prev_val = get_user_meta( $args['id'], $args['col_nm'], true ); } else if( 'usermeta' === $args['table_nm'] && 'role' === $args['col_nm'] ) { $caps = get_user_meta($args['id'], 'wp_capabilities', true); $prev_val = array_keys((array)$caps); } return $prev_val; } public static function users_default_batch_update_db_updates( $flag = false, $args = array() ) { return false; } public static function users_post_batch_update_db_updates( $update_flag = false, $args = array() ) { $default_user_keys = array( 'ID', 'user_pass', 'user_login', 'user_nicename', 'user_url', 'user_email', 'display_name', 'nickname', 'first_name', 'last_name', 'description', 'rich_editing', 'syntax_highlighting', 'comment_shortcuts', 'admin_color', 'use_ssl', 'user_registered', 'show_admin_bar_front', 'role', 'locale' ); $id = ( !empty( $args['id'] ) ) ? $args['id'] : 0; $col_nm = ( !empty( $args['col_nm'] ) ) ? $args['col_nm'] : ''; $value = ( !empty( $args['value'] ) ) ? $args['value'] : ''; if( ! empty( $args['copy_from_operators'] ) && in_array( $args['operator'], $args['copy_from_operators'] ) ) { $value = ( is_callable( array( 'Smart_Manager_Pro_User', 'users_batch_update_new_value' ) ) ) ? self::users_batch_update_new_value( $args ) : $value; } if( !empty( $col_nm ) && in_array( $col_nm, $default_user_keys ) ) { $id = wp_update_user( array( 'ID' => $id, $args['col_nm'] => $value ) ); if( !is_wp_error( $id ) ) { $update_flag = true; } } else if ( !empty( $args['table_nm'] ) && $args['table_nm'] == 'usermeta' ) { update_user_meta( $id, $col_nm, $value ); $update_flag = true; } elseif ( 'terms' === $args['table_nm'] ) { self::batch_update_terms_table_data( $args ); } return $update_flag; } /** * Function to get new value for copy from operators */ public static function users_batch_update_new_value( $args = array() ) { global $wpdb; if( empty( $args['selected_table_name'] ) || empty( $args['selected_column_name'] ) || empty( $args['selected_value'] ) ) { return ''; } $args['new_value'] = ''; if( 'users' === $args['selected_table_name'] ) { $args['new_value'] = $wpdb->get_var( $wpdb->prepare( "SELECT IFNULL( ". $args['selected_column_name'] .", '' ) FROM $wpdb->users WHERE ID = %d", $args['selected_value'] ) ); } else if( 'usermeta' === $args['selected_table_name'] ) { if( 'role' === $args['selected_column_name'] ) { $user_meta = get_userdata( $args['selected_value'] ); $user_roles = ( ! empty( $user_meta ) ) ? $user_meta->roles : ''; $args['new_value'] = ( ! empty( $user_roles ) && is_array( $user_roles ) ) ? $user_roles[0] : ''; } else { $args['new_value'] = get_user_meta( $args['selected_value'], $args['selected_column_name'], true ); } } return ( ( 'copy_from_field' === $args['operator'] && ( ! empty ( $args['copy_field_data_type'] ) ) ) && is_callable( array( 'Smart_Manager_Pro_Base', 'handle_serialized_data' ) ) ) ? Smart_Manager_Pro_Base::handle_serialized_data( $args ) : $args['new_value']; } /** * Function to provide deleter for the user * * @param mixed $deleter The deleter. * @param array $args Additional arguments. * @return mixed $deleter The modified deleter */ public function user_deleter( $deleter = null, $args = array() ) { if ( ! empty( $args['source']->req_params['active_module'] ) && 'user' === $args['source']->req_params['active_module'] ) { global $wpdb; $deleter = array( 'callback' => 'wp_delete_user' ); $delete_ids = (!empty($args['source']->req_params['ids'])) ? json_decode(stripslashes($args['source']->req_params['ids']), true) : array(); $ignore_user_ids = self::get_admin_user_ids(); $ignore_user_ids[] = get_current_user_id(); $ignore_user_ids = array_unique( $ignore_user_ids ); $valid_delete_ids = array(); if ( ! empty( $ignore_user_ids ) ) { $valid_delete_ids = array_diff( $delete_ids, $ignore_user_ids ); } if ( ! empty( $valid_delete_ids ) ) { $deleter['delete_ids'] = $valid_delete_ids; } } return $deleter; } /** * Function to get user ids of administrator of the website * * @return array $admin_user_ids The found ids */ public static function get_admin_user_ids() { $args = array( 'role' => 'administrator', 'orderby' => 'ID', 'order' => 'ASC', 'fields' => 'ID', ); $admin_user_ids = get_users( $args ); return $admin_user_ids; } /** * Handle user ids to be deleted * * @param array $ids The user ids. * @param array $args Additional arguments. * @return array $ids */ public function users_delete_record_ids( $ids = array(), $args = array() ) { if ( !empty( $ids ) ) { $ignore_user_ids = self::get_admin_user_ids(); $ignore_user_ids[] = get_current_user_id(); $ignore_user_ids = array_unique( $ignore_user_ids ); $ids = array_diff( $ids, $ignore_user_ids ); } return $ids; } /** * Function to handle delete of a single record * * @param integer $deleting_id The ID of the record to be deleted. * @return boolean */ public static function process_delete_record( $params ) { $deleting_id = ( !empty( $params['id'] ) ) ? $params['id'] : ''; do_action('sm_beta_pre_process_delete_users', array( 'deleting_id' => $deleting_id, 'source' => __CLASS__ ) ); //code for processing logic for duplicate records if( empty( $deleting_id ) ) { return false; } $result = wp_delete_user( $deleting_id ); do_action( 'sm_beta_post_process_delete_users', array( 'deleting_id' => $deleting_id, 'source' => __CLASS__ ) ); if( empty( $result ) ) { return false; } else { return true; } } /** * Function for getting custom order data. * * @param array $data customers order meta data or customers order total. * @param string $key customer order meta or order total data. * @param array $ids array of customer ids. * @return array fetched data. */ public function sm_get_custom_order_data( $data = array(), $key = '', $ids = array() ) { global $wpdb; if ( empty( Smart_Manager::$sm_is_woo79 ) || empty( Smart_Manager::$sm_is_wc_hpos_tables_exists ) || ( empty( $key ) ) || ( empty( $ids ) ) || ( ! is_array( $ids ) ) ) { return $data; } switch( $key ) { case 'customers_order_meta': return $wpdb->get_results( $wpdb->prepare( "SELECT customer_id as cust_id, GROUP_CONCAT(ID ORDER BY date_created_gmt DESC SEPARATOR ',' ) AS all_id, date_format( max( date_created_gmt ), '%%Y-%%m-%%d, %%r' ) AS date, count( ID ) as count FROM {$wpdb->prefix}wc_orders WHERE customer_id IN (" . implode( ",", $ids ) . ") AND type = 'shop_order' AND status IN ('wc-completed','wc-processing') GROUP BY customer_id ORDER BY date" ), 'ARRAY_A' ); case 'customer_totals': return $wpdb->get_results( "SELECT id AS order_id, total_amount AS order_total FROM {$wpdb->prefix}wc_orders WHERE ID IN ( ". implode( ",", $ids ) ." )", 'ARRAY_A' ); } } /** * Function for getting select query for terms table. * * @param string $search_query_terms_select select query for terms table. * @param array $search_params array of search_params. * @return string select query. */ public function search_query_terms_select( $search_query_terms_select = '', $search_params = array() ) { global $wpdb; if ( ( ! is_array( $search_params ) ) || ( ! isset( $search_params['search_query_index'] ) ) ) { return $search_query_terms_select; } return "SELECT DISTINCT " . $wpdb->prefix . "users.id, " . $search_params['search_query_index'] . " , 0 "; } /** * Function for getting from query for terms table. * * @param string $search_query_terms_from from query for terms table. * @param array $search_params array of search_params. * @return string from query. */ public function search_query_terms_from( $search_query_terms_from = '', $search_params = array() ) { global $wpdb; return "FROM {$wpdb->prefix}users JOIN {$wpdb->prefix}term_relationships ON ({$wpdb->prefix}term_relationships.object_id = {$wpdb->prefix}users.id )"; } /** * Function for getting where query for terms table. * * @param string $search_query_terms_where where query for terms table. * @param array $search_params array of search_params. * @return string where query. */ public function search_query_terms_where( $search_query_terms_where = '', $search_params = array() ) { global $wpdb; if ( ( ! is_array( $search_params ) ) || ( ! isset( $search_params['result_taxonomy_ids'] ) ) ) { return $search_query_terms_where; } $search_query_terms_where = "WHERE {$wpdb->prefix}term_relationships.term_taxonomy_id IN (". $search_params['result_taxonomy_ids'] .")"; if ( ! empty( $search_params['tt_ids_to_exclude'] ) ) { $search_query_terms_where .= " AND {$wpdb->prefix}users.id NOT IN ( SELECT object_id FROM {$wpdb->prefix}term_relationships WHERE term_taxonomy_id IN (". implode( ",", $search_params['tt_ids_to_exclude'] ) .") )"; } return $search_query_terms_where; } } } pro/classes/class-smart-manager-pro-llms-order.php000064400000005534147600337620016246 0ustar00dashboard_key = $dashboard_key; $this->post_type = $dashboard_key; $this->req_params = (!empty($_REQUEST)) ? $_REQUEST : array(); $this->is_dashboard_class_called = true; //Flag for handling of actions in the LLMS_Base class parent::__construct($this->dashboard_key); add_filter( 'sm_dashboard_model',array( &$this,'dashboard_model' ), 10, 2 ); } public static function actions() { } //Function to override the dashboard model public function dashboard_model( $dashboard_model, $dashboard_model_saved ) { $this->dashboard_model = $dashboard_model; $this->dashboard_model_saved = $dashboard_model_saved; $this->visible_columns = array(); // Code for order statuses $post_status_col_index = sm_multidimesional_array_search('posts_post_status', 'data', $this->dashboard_model['columns']); if( function_exists('llms_get_order_statuses') ) { $order_statuses = llms_get_order_statuses(); } $order_statuses_keys = ( !empty( $order_statuses ) ) ? array_keys($order_statuses) : array(); $this->dashboard_model['columns'][$post_status_col_index]['defaultValue'] = ( !empty( $order_statuses_keys[0] ) ) ? $order_statuses_keys[0] : 'wc-pending'; $this->dashboard_model['columns'][$post_status_col_index]['save_state'] = true; $this->dashboard_model['columns'][$post_status_col_index]['values'] = $order_statuses; $this->dashboard_model['columns'][$post_status_col_index]['selectOptions'] = $order_statuses; //for inline editing $this->dashboard_model['columns'][$post_status_col_index]['search_values'] = array(); foreach ($order_statuses as $key => $value) { $this->dashboard_model['columns'][$post_status_col_index]['search_values'][] = array('key' => $key, 'value' => $value); } // Code for handling color codes for order statuses $color_codes = array( 'green' => array( 'llms-completed', 'llms-active' ), 'red' => array( 'llms-expired', 'llms-cancelled', 'llms-failed', 'llms-refunded' ), 'orange' => array( 'llms-on-hold', 'llms-pending' ), 'blue' => array( 'llms-pending-cancel' ) ); $this->dashboard_model['columns'][$post_status_col_index]['colorCodes'] = apply_filters( 'sm_'.$this->dashboard_key.'_status_color_codes', $color_codes ); return $this->llms_dashboard_model(); } } } pro/classes/class-smart-manager-pro-llms-coupon.php000064400000005733147600337620016437 0ustar00dashboard_key = $dashboard_key; $this->post_type = $dashboard_key; $this->req_params = (!empty($_REQUEST)) ? $_REQUEST : array(); $this->is_dashboard_class_called = true; //Flag for handling of actions in the LLMS_Base class parent::__construct($this->dashboard_key); add_filter( 'sm_dashboard_model',array( &$this,'dashboard_model' ), 10, 2 ); } public static function actions() { } //Function to override the dashboard model public function dashboard_model( $dashboard_model, $dashboard_model_saved ) { $this->dashboard_model = $dashboard_model; $this->dashboard_model_saved = $dashboard_model_saved; $this->visible_columns = array(); // Code for handling discount type for coupon $discount_type_col_index = sm_multidimesional_array_search('postmeta_meta_key__llms_discount_type_meta_value__llms_discount_type', 'data', $this->dashboard_model['columns']); $discount_types = array( 'percent' => __( 'Percentage Discount', 'lifterlms' ), 'dollar' => sprintf( _x( '%s Discount', 'flat rate coupon discount', 'lifterlms' ), ( function_exists( 'get_lifterlms_currency_symbol' ) ? html_entity_decode( get_lifterlms_currency_symbol() ) : '$' ) ) ); $this->dashboard_model['columns'][$discount_type_col_index]['type'] = 'dropdown'; $this->dashboard_model['columns'][$discount_type_col_index]['editor'] = 'select2'; $this->dashboard_model['columns'][$discount_type_col_index]['editable'] = false; $this->dashboard_model['columns'][$discount_type_col_index]['renderer'] = 'select2Renderer'; $this->dashboard_model['columns'][$discount_type_col_index]['select2Options'] = array( 'data'=> array(), 'dropdownCssClass'=> 'smSelect2Drop', // 'allowClear'=> true, 'width'=> 'resolve' ); $this->dashboard_model['columns'][$discount_type_col_index]['save_state'] = true; $this->dashboard_model['columns'][$discount_type_col_index]['search_values'] = array(); foreach ($discount_types as $key => $value) { $this->dashboard_model['columns'][$discount_type_col_index]['search_values'][] = array('key' => $key, 'value' => $value); $this->dashboard_model['columns'][$discount_type_col_index]['select2Options']['data'][] = array('id' => $key, 'text' => $value); } return $this->llms_dashboard_model(); } } } pro/classes/class-smart-manager-pro-course.php000064400000003146147600337620015463 0ustar00dashboard_key = $dashboard_key; $this->post_type = $dashboard_key; $this->req_params = (!empty($_REQUEST)) ? $_REQUEST : array(); $this->is_dashboard_class_called = true; //Flag for handling of actions in the LLMS_Base class parent::__construct($this->dashboard_key); add_filter( 'sm_dashboard_model',array( &$this,'dashboard_model' ), 10, 2 ); } public static function actions() { } //Function to override the dashboard model public function dashboard_model( $dashboard_model, $dashboard_model_saved ) { $this->dashboard_model = $dashboard_model; $this->dashboard_model_saved = $dashboard_model_saved; $this->visible_columns = array('ID', '_thumbnail_id', 'post_title', 'post_content', 'post_status', 'post_name', 'post_author', 'course_cat', 'course_tag', 'course_difficulty', '_llms_instructors', 'llms_product_visibility', 'edit_link', 'view_link'); $this->col_titles = array( 'course_cat' => __('Category', 'smart-manager-for-wp-e-commerce' ) ); return $this->llms_dashboard_model(); } } } pro/classes/class-smart-manager-pro-views.php000064400000026304147600337620015321 0ustar00req_params = (!empty($_REQUEST)) ? $_REQUEST : array(); $this->check_if_table_exists(); } /** * Get single instance of this class * * @param array $args Configuration. * @return Singleton object of this class */ public static function get_instance() { // Check if instance is already exists. if ( is_null( self::$instance ) ) { self::$instance = new self(); } return self::$instance; } /** * Function to insert custom views * * @param array $args Configuration. * @return int $inserted_id ID of the inserted view */ public function is_view_available() { global $wpdb; $response = array( 'ACK' => 'Failed', 'is_available' => false ); $name = ( ! empty( $this->req_params['name'] ) ) ? sanitize_title( wp_unslash( $this->req_params['name'] ) ) : ''; if( empty( $name ) ){ wp_send_json($response); } $row_count = $wpdb->get_var( $wpdb->prepare(" SELECT COUNT(id) FROM {$wpdb->prefix}sm_views WHERE slug = %s", $name ) ); $response = array( 'ACK' => 'Success', 'is_available' => ( empty( $row_count ) ) ? true : false ); wp_send_json($response); } /** * Function to insert custom views * * @return int $inserted_id ID of the inserted view */ public function create() { global $wpdb; $response = array( 'ACK' => 'Failed' ); $title = ( ! empty( $this->req_params['name'] ) ) ? sanitize_text_field( wp_unslash( $this->req_params['name'] ) ) : ''; $slug = sanitize_title( $title ); $view_state = ( ! empty( $this->req_params['currentView'] ) ) ? $this->req_params['currentView'] : ''; $active_module = ( ! empty( $this->req_params['active_module'] ) ) ? $this->req_params['active_module'] : ''; $is_view = ( ( ! empty( $this->req_params['is_view'] ) ) ? 1 : 0 ); if( ! empty( $is_view ) && ! empty( $active_module ) ) { $active_module = $this->get_post_type( $active_module ); } if( empty( $title ) || empty( $view_state ) || empty( $active_module ) ) { $response[ 'msg' ] = 'Required params missing.'; wp_send_json( $response ); } // Code to map view state to required structure $view_state = json_decode( stripslashes( $view_state ), true ); $view_json = sa_sm_generate_column_state( $view_state ); if( ! empty( $view_state['search_params'] ) ) { $view_json['search_params'] = $view_state['search_params']; } $wpdb->query( $wpdb->prepare( "INSERT INTO {$wpdb->prefix}sm_views(author, title, slug, params, is_public, post_type, created_date, modified_date) VALUES(%d, %s, %s, %s, %d, %s, %d, %d)", get_current_user_id(), $title, $slug, json_encode( $view_json ), ( ( ! empty( $this->req_params['isPublic'] ) && 'false' != $this->req_params['isPublic'] ) ? 1 : 0 ), $active_module, time(), time() ) ); $insert_id = $wpdb->insert_id; if( ! is_wp_error( $insert_id ) ) { $response['ACK'] = 'Success'; $response['id'] = $insert_id; $response['slug'] = $slug; } wp_send_json( $response ); } /** * Function to get view post_type based on slug * * @param string $slug view slug name for which the data is to be fetched. * @return array $post_type post_type that the view is linked to. */ public function get_post_type( $slug = '' ) { global $wpdb; $post_type = ''; if( empty( $slug ) ){ return $post_type; } $post_type = $wpdb->get_var( $wpdb->prepare( "SELECT post_type FROM {$wpdb->prefix}sm_views WHERE slug = %s", $slug ) ); return $post_type; } /** * Function to get view data based on slug or all views if slug is blank * * @param string $slug view slug name for which the data is to be fetched. * @return array $data array containing the view data or list of all views */ public function get( $slug = '' ) { global $wpdb; $data = array(); if( empty( $slug ) ){ // TODO: improve later $data = $wpdb->get_results( $wpdb->prepare( "SELECT title, slug FROM {$wpdb->prefix}sm_views WHERE 1=%d", 1 ), 'ARRAY_A' ); } else { $data = $wpdb->get_row( $wpdb->prepare( "SELECT title, params, post_type FROM {$wpdb->prefix}sm_views WHERE slug = %s", $slug ), 'ARRAY_A' ); } return $data; } /** * Function to get eligible user id for editing columns in custom view */ public function is_view_author() { global $wpdb; $slug = ( ! empty( $this->req_params['slug'] ) ) ? sanitize_title( wp_unslash( $this->req_params['slug'] ) ) : ''; if( empty( $slug ) ) { wp_send_json( false ); } $row_count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(id) FROM {$wpdb->prefix}sm_views WHERE author = %d AND slug = %s", get_current_user_id(), $slug ) ); wp_send_json( ( ! empty( $row_count ) ) ? true : false ); } /** * Function to get all accessible views based on current user * * @param array $post_types array containing the valid post_types for the current user. * @return array $accessible_views array containing the accessible views slug & title */ public function get_all_accessible_views( $post_types = array() ) { global $wpdb; $response = array( 'accessible_views' => array(), 'owned_views' => array(), 'public_views' => array(), 'view_post_types' => array() ); $results = array(); $view_results = array(); if ( ! empty( $post_types ) && is_array( $post_types ) ) { $results = $wpdb->get_results( $wpdb->prepare("SELECT title, slug, author, is_public, post_type FROM {$wpdb->prefix}sm_views WHERE ( post_type IN ('". implode("','", array_keys( $post_types ) ) ."') AND (is_public = 1 OR (is_public = 0 AND author = %d) ) ) GROUP BY slug", get_current_user_id() ), 'ARRAY_A' ); } if ( is_callable( array( 'Smart_Manager_Pro_Access_Privilege', 'get_current_user_access_privilege_settings' ) ) ) { $accessible_dashboards = Smart_Manager_Pro_Access_Privilege::get_current_user_access_privilege_settings(); if ( ! empty( $accessible_dashboards ) && is_array( $accessible_dashboards ) && isset( $accessible_dashboards['valid'] ) && ! empty( $accessible_dashboards['valid'] ) && is_array( $accessible_dashboards['valid'] ) && count( $accessible_dashboards['valid'] ) > 0 ) { $view_results = $wpdb->get_results( $wpdb->prepare("SELECT title, slug, author, is_public, post_type FROM {$wpdb->prefix}sm_views WHERE ( slug IN ('". implode( "','", $accessible_dashboards['valid'] ) ."') AND 1=%d) GROUP BY slug", 1 ), 'ARRAY_A' ); } } $current_user_role = ( is_callable( array( 'Smart_Manager', 'get_current_user_role' ) ) ) ? Smart_Manager::get_current_user_role() : ''; if ( ! empty( $current_user_role ) && 'administrator' === $current_user_role && is_array( $results ) && is_array( $view_results ) && count( $view_results ) > 0 ) { $results = array_merge( $results, $view_results ); } elseif ( ( ! empty( $current_user_role ) && 'administrator' !== $current_user_role ) ) { $results = $view_results; } if ( empty( $results ) || ! is_array( $results ) ) { return $response; } foreach ( $results as $result ) { $response['accessible_views'][ $result['slug'] ] = $result['title']; if ( ! empty( $result['author'] ) && get_current_user_id() === intval( $result['author'] ) ) { $response['owned_views'][] = $result['slug']; } if ( ! empty( $result['is_public'] ) ) { $response['public_views'][] = $result['slug']; } if ( ! empty( $result['post_type'] ) ) { $response['view_post_types'][ $result['slug'] ] = $result['post_type']; } } return $response; } /** * Function to update custom views * * @return int $inserted_id ID of the inserted view */ public function update() { global $wpdb; $response = array( 'ACK' => 'Failed' ); $title = ( ! empty( $this->req_params['name'] ) ) ? sanitize_text_field( wp_unslash( $this->req_params['name'] ) ) : ''; $slug = sanitize_title( $title ); $view_state = ( ! empty( $this->req_params['currentView'] ) ) ? $this->req_params['currentView'] : ''; $active_module = ( ! empty( $this->req_params['active_module'] ) ) ? $this->req_params['active_module'] : ''; if( empty( $title ) || empty( $view_state ) || empty( $active_module ) ) { $response[ 'msg' ] = 'Required params missing.'; wp_send_json( $response ); } // Code to map view state to required structure $view_state = json_decode( stripslashes( $view_state ), true ); $view_json = sa_sm_generate_column_state( $view_state ); if( ! empty( $view_state['search_params'] ) ) { $view_json['search_params'] = $view_state['search_params']; } $result = $wpdb->query( // phpcs:ignore $wpdb->prepare( // phpcs:ignore "UPDATE {$wpdb->prefix}sm_views SET title = %s, slug = %s, params = %s, is_public = %d WHERE slug = %s", $title, $slug, json_encode( $view_json ), ( ( ! empty( $this->req_params['isPublic'] ) && 'false' != $this->req_params['isPublic'] ) ? 1 : 0 ), $active_module ) ); if( ! is_wp_error( $result ) ) { $response['ACK'] = 'Success'; $response['slug'] = $slug; } wp_send_json( $response ); } /** * Function to insert custom views * * @return int $inserted_id ID of the inserted view */ public function delete() { global $wpdb; $response = array( 'ACK' => 'Failed' ); $active_module = ( ! empty( $this->req_params['active_module'] ) ) ? $this->req_params['active_module'] : ''; if( empty( $active_module ) ) { $response[ 'msg' ] = 'Required params missing.'; wp_send_json( $response ); } $result = $wpdb->query( // phpcs:ignore $wpdb->prepare( // phpcs:ignore "DELETE FROM {$wpdb->prefix}sm_views WHERE slug = %s", $active_module ) ); if( ! is_wp_error( $result ) ) { $response['ACK'] = 'Success'; } wp_send_json( $response ); } /** * Function to check & create table for custom views if not exists * * @return void. */ public function check_if_table_exists(){ global $wpdb; $table_nm = $wpdb->prefix. 'sm_views'; if ( $table_nm === $wpdb->get_var( $wpdb->prepare( "SHOW TABLES LIKE %s", $table_nm ) ) ) { return; } if ( ! is_callable( array( 'Smart_Manager_Install', 'create_table_for_custom_views' ) ) ) { return; } $table_created = Smart_Manager_Install::create_table_for_custom_views(); if( ! empty( $table_created ) && is_callable( array( 'Smart_Manager_Install', 'create_dummy_views' ) ) ){ Smart_Manager_Install::create_dummy_views(); } } } pro/classes/class-smart-manager-pro-taxonomy-base.php000064400000102056147600337620016751 0ustar00dashboard_key = $dashboard_key; $this->post_type = $dashboard_key; $this->req_params = ( ! empty( $_REQUEST ) ) ? $_REQUEST : array(); add_filter( 'sm_beta_load_default_store_model', function() { return false; } ); add_filter( 'sm_default_dashboard_model', array( $this, 'default_taxonomy_dashboard_model' ) ); add_filter( 'sm_beta_load_default_data_model', function() { return false; } ); add_filter( 'sm_data_model', array( $this, 'default_taxonomy_data_model' ), 10, 2 ); add_filter( 'terms_clauses', array( $this, 'handle_terms_clauses' ), 999, 3 ); // hooks for inline update add_filter( 'sm_default_inline_update', function() { return false; } ); add_action( 'sm_inline_update_post', array( $this,'taxonomy_inline_update' ), 10, 2 ); add_filter( 'sm_beta_background_entire_store_ids_query', array( $this,'get_entire_store_ids_query' ), 12, 1 ); } /** * Static function for defining background process actions. */ public static function actions() { // hooks for delete functionality add_filter( 'sm_pro_default_process_delete_records', function() { return false; } ); add_filter( 'sm_pro_default_process_delete_records_result', __CLASS__. '::process_delete_terms', 12, 3 ); // hooks for bulk edit functionality add_filter( 'sm_beta_batch_update_prev_value', __CLASS__. '::terms_batch_update_prev_value', 10, 2 ); add_filter( 'sm_default_batch_update_db_updates', function() { return false; } ); add_filter( 'sm_post_batch_update_db_updates', __CLASS__. '::terms_post_batch_update_db_updates', 10, 2 ); } /** * Function for modifying terms query clauses when using 'get_terms'. * * @param array $clauses array of query clauses. * @param array $taxonomies array of taxonomies. * @param array $args array of query args. * @return array $clauses updated array of query clauses. */ public function handle_terms_clauses( $clauses = array(), $taxonomies = array(), $args = array() ) { global $wpdb; $join = ( ! empty( $clauses['join'] ) ) ? $clauses['join'] : ''; $where = ( ! empty( $clauses['where'] ) ) ? $clauses['where'] : ''; if ( ( ! empty( $this->req_params[ 'selected_ids' ] ) && '[]' !== $this->req_params[ 'selected_ids' ] ) && empty( $this->req_params['storewide_option'] ) && ( ! empty( $this->req_params[ 'cmd' ] ) && ( 'get_export_csv' === $this->req_params[ 'cmd' ] ) ) ) { $selected_ids = json_decode( stripslashes( $this->req_params[ 'selected_ids' ] ) ); $where .= ( ! empty( $selected_ids ) ) ? " AND t.term_id IN (" . implode( ",", $selected_ids ) . ")" : $where; } // Code to add join condition for termmeta if( ( ! empty( $this->req_params['search_text'] ) ) && false === strpos( $join, 'termmeta' ) ){ $join .= ' LEFT JOIN '. $wpdb->prefix .'termmeta ON ( tt.term_id = '. $wpdb->prefix .'termmeta.term_id ) '; $clauses['distinct'] = 'DISTINCT'; } // Code for handling sorting for termmeta cols if( ! empty( $args['sort_by_meta_key'] ) && ! empty( $taxonomies ) ){ $order_by = ( ! empty( $args['orderby'] ) && 'meta_value_num' === $args['orderby'] ) ? 'tm.meta_value+0' : 'tm.meta_value'; $order = ( ! empty( $args['order'] ) ) ? $args['order'] : 'ASC'; $query = "SELECT DISTINCT tt.term_id FROM {$wpdb->prefix}term_taxonomy AS tt LEFT JOIN {$wpdb->prefix}termmeta AS tm ON (tt.term_id = tm.term_id AND tm.meta_key = '". $args['sort_by_meta_key'] ."') WHERE tt.taxonomy IN ('". implode("','", $taxonomies) ."') ORDER BY ". $order_by ." ". $order; // TODO: improve code $term_ids = $wpdb->get_col( "SELECT DISTINCT tt.term_id FROM {$wpdb->prefix}term_taxonomy AS tt LEFT JOIN {$wpdb->prefix}termmeta AS tm ON (tt.term_id = tm.term_id AND tm.meta_key = '". $args['sort_by_meta_key'] ."') WHERE tt.taxonomy IN ('". implode("','", $taxonomies) ."') ORDER BY ". $order_by ." ". $order ); $option_name = 'sm_data_model_sorted_term_ids'; update_option( $option_name, implode( ',', $term_ids ), 'no' ); $clauses['orderby'] = " ORDER BY FIND_IN_SET( t.term_id, ( SELECT option_value FROM ".$wpdb->prefix."options WHERE option_name = '".$option_name."' ) ) "; $clauses['order'] = 'ASC'; } //Code for handling simple search if( ! empty( $this->req_params['search_text'] ) ) { $matched_results = array(); $col_model = $this->get_col_model( $this->dashboard_key ); $search_text = $wpdb->_real_escape( $this->req_params['search_text'] ); $simple_search_ignored_cols = apply_filters('sm_simple_search_ignored_terms_columns', array(), $col_model); $alias = array( 'terms' => 't', 'term_taxonomy' => 'tt' ); //Code for creating search condition if( !empty( $col_model ) ) { foreach( $col_model as $col ) { if( empty( $col['src'] ) ) continue; $src_exploded = explode("/",$col['src']); if( !empty( $src_exploded[0] ) && in_array( $src_exploded[0], array( 'terms', 'term_taxonomy' ) ) && !in_array($src_exploded[1], $simple_search_ignored_cols) ) { if( !empty( $col['selectOptions'] ) ) { $matched_results = preg_grep('/'. ucfirst($search_text) .'.*/', $col['selectOptions']); } if( is_array( $matched_results ) && !empty( $matched_results ) ) { foreach( array_keys( $matched_results ) as $search ) { if( false === strpos( $where, $alias[$src_exploded[0]].".".$src_exploded[1]." LIKE '%".$search."%'" ) ) { $where_cond[] = "( ".$alias[$src_exploded[0]].".".$src_exploded[1]." LIKE '%".$search."%' )"; } } } else { if( false === strpos( $where, $alias[$src_exploded[0]].".".$src_exploded[1]." LIKE '%".$search_text."%'" ) ) { $where_cond[] = "( ".$alias[$src_exploded[0]].".".$src_exploded[1]." LIKE '%".$search_text."%' )"; } } } } } $where .= ( strpos( $where, 'meta_value LIKE' ) === false || ( !empty( $where_cond ) ) ) ? ' AND ( ' : ''; $where .= ( strpos( $where, "meta_value LIKE '%".$search_text."%" ) === false ) ? " ({$wpdb->prefix}termmeta.meta_value LIKE '%".$search_text."%') " : ''; $where .= ( ( !empty( $where_cond ) ) ? ' OR '. implode(" OR ", $where_cond) : '' ); $where .= ( strpos( $where, 'meta_value LIKE' ) === true || ( !empty( $where_cond ) ) ) ? ' ) ' : ''; } //Code for handling clauses for advanced search if( !empty( $this->req_params ) && !empty( $this->req_params['advanced_search_query'] ) && '[]' !== $this->req_params['advanced_search_query'] ) { $join .= ( false === strpos( $join, 'sm_advanced_search_temp' ) ) ? " JOIN {$wpdb->base_prefix}sm_advanced_search_temp ON ({$wpdb->base_prefix}sm_advanced_search_temp.product_id = t.term_id)" : ''; $where .= ( false === strpos( $where,'sm_advanced_search_temp.flag > 0' ) ) ? " AND {$wpdb->base_prefix}sm_advanced_search_temp.flag > 0" : ''; } $clauses['join'] = $join; $clauses['where'] = $where; return $clauses; } /** * Function for creating taxonomy dashboard model. * * @param array $dashboard_model array of default dashboard model. * @return array updated default taxonomy dashboard model. */ public function default_taxonomy_dashboard_model( $dashboard_model = array() ) { global $wpdb; $visible_taxonomy_cols = array( 'description', 'parent', 'count' ); $visible_term_cols = array( 'term_id', 'name', 'slug', 'term_group' ); $uneditable_cols = array( 'count', 'term_id' ); $numeric_cols = array( 'parent', 'count', 'term_id' ); $visible_cols = array_merge( $visible_term_cols, $visible_taxonomy_cols ); $col_model = array(); foreach( $visible_cols as $col ){ $args = array( 'table_nm' => ( in_array( $col, $visible_taxonomy_cols ) ) ? 'term_taxonomy' : 'terms', 'col' => $col, 'type' => ( in_array( $col, $numeric_cols ) ) ? 'numeric' : 'text', 'editable' => ( in_array( $col, $uneditable_cols ) ) ? false : true, ); $col_model[] = $this->get_default_column_model( $args ); } //Code to get columns from termmeta table $results = $wpdb->get_results( $wpdb->prepare( "SELECT DISTINCT {$wpdb->prefix}termmeta.meta_key, {$wpdb->prefix}termmeta.meta_value FROM {$wpdb->prefix}termmeta JOIN {$wpdb->prefix}term_taxonomy ON ({$wpdb->prefix}term_taxonomy.term_id = {$wpdb->prefix}termmeta.term_id AND {$wpdb->prefix}term_taxonomy.taxonomy = %s) WHERE {$wpdb->prefix}termmeta.meta_key != '' GROUP BY {$wpdb->prefix}termmeta.meta_key", $this->dashboard_key ), 'ARRAY_A' ); $num_rows = $wpdb->num_rows; if ($num_rows > 0) { $meta_keys = array(); $meta_cols = array(); foreach ($results as $key => $col) { if ( empty( $col['meta_value'] ) || $col['meta_value'] == '1' || $col['meta_value'] == '0.00' ) { $meta_keys [] = $col['meta_key']; //TODO: if possible store in db instead of using an array } $meta_cols[$col['meta_key']] = $col; } //not in 0 added for handling empty date columns if (!empty($meta_keys)) { $results = $wpdb->get_results ( "SELECT {$wpdb->prefix}termmeta.meta_key, {$wpdb->prefix}termmeta.meta_value FROM {$wpdb->prefix}termmeta JOIN {$wpdb->prefix}term_taxonomy ON ({$wpdb->prefix}term_taxonomy.term_id = {$wpdb->prefix}termmeta.term_id AND {$wpdb->prefix}term_taxonomy.taxonomy = '". $this->dashboard_key ."') WHERE {$wpdb->prefix}termmeta.meta_value NOT IN ('','0','0.00','1') AND {$wpdb->prefix}termmeta.meta_key IN ('".implode("','",$meta_keys)."') GROUP BY {$wpdb->prefix}termmeta.meta_key" , 'ARRAY_A'); $num_rows = $wpdb->num_rows; if( $num_rows > 0 ) { foreach( $results as $col ) { if ( isset( $meta_cols [$col['meta_key']] ) ) { $meta_cols[$col['meta_key']]['meta_value'] = $col['meta_value']; } } } } //Filter to add custom termmeta columns for custom plugins $meta_cols = apply_filters( 'sm_default_dashboard_model_termmeta_cols', $meta_cols ); $meta_count = 0; foreach ($meta_cols as $col) { $meta_key = ( !empty( $col['meta_key'] ) ) ? $col['meta_key'] : ''; $meta_value = ( !empty( $col['meta_value'] ) || $col['meta_value'] == 0 ) ? $col['meta_value'] : ''; $args = array( 'table_nm' => 'termmeta', 'col' => $meta_key, 'is_meta' => true, 'col_value' => $meta_value, 'hidden' => ( $meta_count > 5 ) ? true : false ); $col_model[] = $this->get_default_column_model( $args ); $meta_count++; } } return array( 'display_name' => __(ucwords(str_replace('_', ' ', $this->dashboard_key)), 'smart-manager-for-wp-e-commerce'), 'tables' => array( 'term_relationships' => array( 'pkey' => 'object_id', 'join_on' => 'term_relationships.object_id = posts.ID', 'where' => array() ), 'term_taxonomy' => array( 'pkey' => 'term_taxonomy_id', 'join_on' => 'term_taxonomy.term_taxonomy_id = term_relationships.term_taxonomy_id', 'where' => array() ), 'terms' => array( 'pkey' => 'term_id', 'join_on' => 'terms.term_id = term_taxonomy.term_id', 'where' => array() ), 'termmeta' => array( 'pkey' => 'term_id', 'join_on' => 'termmeta.term_id = term_taxonomy.term_id', 'where' => array() ) ), 'columns' => $col_model, 'sort_params' => array ( //WP_Query array structure 'orderby' => 'term_id', //multiple list separated by space 'order' => 'DESC', 'default' => true ), 'per_page_limit' => '', // blank, 0, -1 all values refer to infinite scroll 'treegrid' => false // flag for setting the treegrid ); } /** * Function for creating taxonomy data model. * * @param array $data_model array of default data model. * @param array $data_col_params array of dashboard column params. * @return array $data_model updated default taxonomy data model. */ public function default_taxonomy_data_model( $data_model = array(), $data_col_params = array() ){ if( ! isset( $data_col_params['limit'] ) || ! isset( $data_col_params['offset'] ) ){ return $data_model; } global $wpdb; $valid_orderby_fields = array( 'name', 'slug', 'term_group', 'term_id', 'id', 'description', 'parent', 'term_order', 'count', 'meta_value', 'meta_value_num' ); // Code for getting cols $col_model = ( ! empty( $data_col_params['col_model'] ) ) ? $data_col_params['col_model'] : array(); $required_cols = ( ! empty( $data_col_params['required_cols'] ) ) ? $data_col_params['required_cols'] : array(); $data_cols = ( ! empty( $data_col_params['data_cols'] ) ) ? $data_col_params['data_cols'] : array(); $total_pages = 0; $termmeta_cols = $taxonomy_cols = $numeric_termmeta_cols = $numeric_termmeta_cols_decimal_places = $image_termmeta_cols = array(); $search_cols_type = array(); //array for col & its type for advanced search if (!empty($col_model)) { foreach ($col_model as $col) { if( !empty( $col['hidden'] ) && !empty( $col['data'] ) && array_search($col['data'], $required_cols) === false ) { continue; } $validator = ( !empty( $col['validator'] ) ) ? $col['validator'] : ''; $type = ( !empty( $col['type'] ) ) ? $col['type'] : ''; if( ! empty( $col['table_name'] ) && ! empty( $col['col_name'] ) ){ // added $validator condition for spl cols like '_regular_price', '_sale_price', etc. $search_cols_type[ $col['table_name'] .'.'. $col['col_name'] ] = ( "customNumericTextEditor" === $validator && "text" == $type ) ? 'numeric' : $type; $search_cols_type[ $col['table_name'] .'.'. $col['col_name'] ] = ( ! empty( $col['search_type'] ) ) ? $col['search_type'] : $search_cols_type[ $col['table_name'] .'.'. $col['col_name'] ]; //Code to handle sp. search data type passed for any col } $col_exploded = (!empty($col['src'])) ? explode("/", $col['src']) : array(); if (empty($col_exploded)) continue; if ( sizeof($col_exploded) > 2) { $col_meta = explode("=",$col_exploded[1]); $col_nm = $col_meta[1]; } else { $col_nm = $col_exploded[1]; } if( !empty( $col_exploded[0] ) ) { if( 'term_taxonomy' === $col_exploded[0] ){ $taxonomy_cols[] = $col_nm; } else if( 'termmeta' === $col_exploded[0] ){ $termmeta_cols[] = $col_nm; if( ( $type == 'number' || $type == 'numeric' || $validator == 'customNumericTextEditor' ) && 'sm.image' !== $type ) { if( isset( $col['decimalPlaces'] ) ) { $numeric_termmeta_cols_decimal_places[ $col_nm ] = $col['decimalPlaces']; } $numeric_termmeta_cols[] = $col_nm; } if( 'sm.image' === $type ){ $image_termmeta_cols[] = $col_nm; } } } } } $args = array( 'hide_empty' => false, 'orderby' => 'term_id', 'order' => 'DESC', ); if( 0 < $data_col_params['limit'] ){ $args = array_merge( $args, array( 'number' => $data_col_params['limit'], 'offset' => $data_col_params['offset'] ) ); } // Code for applying sorting to query if( ! empty( $this->req_params['sort_params'] ) ){ $sort_params = $this->build_query_sort_params( array( 'sort_params' => $this->req_params['sort_params'], 'numeric_meta_cols' => $numeric_termmeta_cols, 'data_cols' => $data_cols ) ); if( ! empty( $sort_params ) ){ $col = ( ! empty( $sort_params['column_nm'] ) ) ? $sort_params['column_nm'] : ''; if( ! empty( $col ) && in_array( $col, $valid_orderby_fields ) ){ $args = array_merge( $args, array( 'orderby' => $col, 'order' => ( ! empty( $sort_params['sortOrder'] ) ) ? $sort_params['sortOrder'] : '' ) ); if( ! empty( $sort_params['sort_by_meta_key'] ) ){ $args['sort_by_meta_key'] = $sort_params['sort_by_meta_key']; } } } } //Code to clear the advanced search temp table if( empty( $this->req_params['advanced_search_query'] ) ) { $wpdb->query( "DELETE FROM {$wpdb->base_prefix}sm_advanced_search_temp" ); delete_option( 'sm_advanced_search_query' ); } //Code for handling advanced search functionality if( !empty( $this->req_params['advanced_search_query'] ) && $this->req_params['advanced_search_query'] != '[]' ) { $this->req_params['advanced_search_query'] = json_decode(stripslashes($this->req_params['advanced_search_query']), true); if (!empty($this->req_params['advanced_search_query'])) { $this->process_search_cond( array( 'taxonomy' => $this->dashboard_key, 'search_query' => (!empty($this->req_params['advanced_search_query'])) ? $this->req_params['advanced_search_query'] : array(), 'SM_IS_WOO30' => (!empty($this->req_params['SM_IS_WOO30'])) ? $this->req_params['SM_IS_WOO30'] : '', 'search_cols_type' => $search_cols_type, 'data_col_params' => $data_col_params ) ); } } $terms = get_terms( $this->dashboard_key, $args ); $total_count = 0; if( ! empty( $terms ) && ! is_wp_error( $terms ) ){ $total_pages = 1; //Code for saving the post_ids in case of search if( ( defined( 'SMPRO' ) && true === SMPRO ) && ! empty( $this->req_params['search_text'] ) || ( ! empty( $this->req_params['advanced_search_query'] ) && '[]' !== $this->req_params['advanced_search_query'] ) ) { $all_term_ids = get_terms( $this->dashboard_key, array( 'hide_empty' => false, 'fields' => 'ids' ) ); if( ! empty( $all_term_ids ) && ! is_wp_error( $all_term_ids ) ){ set_transient( 'sa_sm_search_post_ids', implode( ",", $all_term_ids ) , WEEK_IN_SECONDS ); } } $total_count = get_terms( $this->dashboard_key, array( 'hide_empty' => false, 'fields' => 'count' ) ); if ( ! is_wp_error( $terms ) && $total_count > $data_col_params['limit'] ) { $total_pages = ceil( $total_count/$data_col_params['limit'] ); } } $items = $term_id_indexes = $term_ids = array(); $index = 0; foreach( $terms as $term_obj ){ $term_arr = (array)$term_obj; $id = ( ! empty( $term_arr['term_id'] ) ) ? $term_arr['term_id'] : 0; if( empty( $id ) ){ continue; } foreach( $term_arr as $key => $value ){ if( in_array( $key, $data_cols ) ){ $terms_key = ( ( in_array( $key, $taxonomy_cols ) ) ? 'term_taxonomy_' : 'terms_').strtolower( str_replace( ' ', '_', $key ) ); $items[$index][$terms_key] = $value; } } $term_ids[] = $id; $term_id_indexes[$id] = $index; $index++; } if( ! empty( $term_ids ) && ! empty( $termmeta_cols ) ){ $termmeta_data = array(); if( count( $term_ids ) > 100 ) { $term_id_chunks = array_chunk( $term_ids, 100 ); foreach( $term_id_chunks as $id_chunk ){ $results = $wpdb->get_results( $wpdb->prepare( "SELECT term_id as term_id, meta_key AS meta_key, meta_value AS meta_value FROM {$wpdb->prefix}termmeta WHERE term_id IN (". implode(",",$id_chunk) .") AND meta_key IN ('". implode("','", $termmeta_cols) ."') AND 1=%d GROUP BY term_id, meta_key", 1 ), 'ARRAY_A' ); if( ! empty( $results ) ) { $termmeta_data = array_merge( $termmeta_data, $results ); } } } else { $termmeta_data = $wpdb->get_results( $wpdb->prepare( "SELECT term_id as term_id, meta_key AS meta_key, meta_value AS meta_value FROM {$wpdb->prefix}termmeta WHERE term_id IN (". implode(",",$term_ids) .") AND meta_key IN ('". implode("','", $termmeta_cols) ."') AND 1=%d GROUP BY term_id, meta_key", 1 ), 'ARRAY_A' ); } if( ! empty( $termmeta_data ) ){ foreach( $termmeta_data as $data ){ $index = ( isset( $term_id_indexes[$data['term_id']] ) ) ? $term_id_indexes[$data['term_id']] : ''; if( '' === $index ) { continue; } $meta_key = ( isset( $data['meta_key'] ) ) ? $data['meta_key'] : ''; if( empty( $meta_key ) ) { continue; } $meta_value = ( isset( $data['meta_value'] ) ) ? $data['meta_value'] : ''; //Code for handling image fields if( in_array( $meta_key, $image_termmeta_cols ) ) { if( ! empty( $meta_value ) ){ $attachment = wp_get_attachment_image_src($meta_value, 'full'); if ( is_array( $attachment ) && ! empty( $attachment[0] ) ) { $meta_value = $attachment[0]; } else { $meta_value = ''; } } } $meta_key = sanitize_title($meta_key); $meta_key = 'termmeta_meta_key_'.$meta_key.'_meta_value_'.$meta_key; $items [$index][$meta_key] = $meta_value; } } } $data = array( 'items' => ( !empty( $items ) ) ? $items : array(), 'start' => $data_col_params['offset'] + $data_col_params['limit'], 'page' => $data_col_params['current_page'], 'total_pages' => $total_pages, 'total_count' => $total_count ); return ( ! empty( $data_model ) && is_array( $data_model ) ) ? array_merge( $data_model, $data ) : $data; } /** * Function for modifying table types for advanced search. * * @param array $table_types array of table types. * @return array $table_types updated array of table types. */ public function search_table_types( $table_types = array() ){ $table_types['flat'] = array_merge( array( 'terms' => 'term_id', 'term_taxonomy' => 'term_id' ), ( !empty( $table_types['flat'] ) ? $table_types['flat'] : array() ) ); $table_types['meta']['termmeta'] = 'term_id'; return $table_types; } /** * Function for modifying edited data before updating. * * @param array $edited_data array of edited rows. * @param array $params array of additional params for inline edit. * @return void. */ public function taxonomy_inline_update( $edited_data = array(), $params = array() ) { if( empty( $edited_data ) ){ return $edited_data; } $term_taxonomy_update_args = array(); $term_meta_update_args = array(); foreach( $edited_data as $id => $edited_row ) { $id = intval( $id ); if( empty( $id ) && empty( $edited_row['terms/name'] ) ){ continue; } if( empty( $id ) ){ $term_meta_update_args = array(); } foreach( $edited_row as $key => $value ) { $prev_val = ''; $edited_value_exploded = explode("/", $key); if( empty( $edited_value_exploded ) ) continue; $update_table = $edited_value_exploded[0]; $update_column = $edited_value_exploded[1]; $this->field_names[ $id ][ $update_column ] = $key; if ( 'termmeta' === $update_table && sizeof( $edited_value_exploded ) > 2 ) { $update_column_exploded = explode("=",$edited_value_exploded[2]); $update_column = $update_column_exploded[1]; $prev_taxonomy_values = self:: terms_batch_update_prev_value( $prev_val, array( 'id' => $id, 'table_nm' => $update_table, 'col_nm' => $update_column, 'dashboard_key' => $this->dashboard_key ) ); if( in_array( $update_column, $params['data_cols_timestamp'] ) ) { $value = strtotime( $value ); } if( empty( $id ) ){ $term_meta_update_args[ $update_column ] = $value; continue; } $result = update_term_meta( $id, $update_column, $value ); if ( empty( $result ) || is_wp_error( $result ) || ( ! property_exists( 'Smart_Manager_Base', 'update_task_details_params' ) ) || empty( $this->task_id ) || empty( $id ) ) { continue; } Smart_Manager_Base::$update_task_details_params[] = array( 'task_id' => $this->task_id, 'action' => 'set_to', 'status' => 'completed', 'record_id' => $id, 'field' => $key, 'prev_val' => $prev_taxonomy_values, 'updated_val' => $value, ); } else if( in_array( $update_column, self::$term_taxonomy_update_cols ) ) { $term_taxonomy_update_args[ $update_column ] = $value; $this->prev_taxonomy_values[ $id ][ $update_column ] = self::terms_batch_update_prev_value( $prev_val, array( 'id' => $id, 'table_nm' => $update_table, 'col_nm' => $update_column, 'dashboard_key' => $this->dashboard_key ) ); } } if( ! empty( $term_taxonomy_update_args ) ){ // Code for newly added row if( empty( $id ) && ! empty( $term_taxonomy_update_args['name'] ) ){ $result = wp_insert_term( $term_taxonomy_update_args['name'], $this->dashboard_key, $term_taxonomy_update_args ); if( is_wp_error( $result ) || empty( $term_meta_update_args ) ){ continue; } foreach( $term_meta_update_args as $key => $value ){ update_term_meta( $id, $update_column, $value ); } continue; } $result = wp_update_term( $id, $this->dashboard_key, $term_taxonomy_update_args ); if( is_wp_error( $result ) ){ // TODO } else { if ( ( ! property_exists( 'Smart_Manager_Base', 'update_task_details_params' ) ) || empty( $this->task_id ) ) { continue; } foreach ( $term_taxonomy_update_args as $key => $value ) { if ( ( ( empty( $key ) ) ) || ! isset( $this->field_names[ $id ][ $key ] ) ) { continue; } Smart_Manager_Base::$update_task_details_params[] = array( 'task_id' => $this->task_id, 'action' => 'set_to', 'status' => 'completed', 'record_id' => $id, 'field' => $this->field_names[ $id ][ $key ], 'prev_val' => $this->prev_taxonomy_values[ $id ][ $key ], 'updated_val' => $value, ); } } } } } /** * Function for handling delete functionality. * * @param boolean $result result of the delete process. * @param int $id term_id of the record to be deleted. * @param array $params array of additional params for delete functionality. * @return boolean $result result of the delete process. */ public static function process_delete_terms( $result = false, $id = 0, $params = array() ) { $id = intval( $id ); if( empty( $id ) || empty( $params ) || ( ! empty( $params ) && empty( $params['dashboard_key'] ) ) ){ return $result; } $result = wp_delete_term( $id, $params['dashboard_key'] ); return ( is_wp_error( $result ) || ( ! is_wp_error( $result ) && empty( $result ) ) ) ? false : true; } /** * Function for modifying query for getting ids in case of 'entire store' option. * * @param string $query query for fetching the ids when entire store option is selected. * @return string updated query for fetching the ids when entire store option is selected. */ public function get_entire_store_ids_query( $query = '' ) { global $wpdb; return $wpdb->prepare( "SELECT term_id FROM {$wpdb->prefix}term_taxonomy WHERE taxonomy = %s", $this->dashboard_key ); } /** * Static function for fetching the field previous value in case of bulk edit. * * @param string $prev_val field previous value. * @param array $args bulk edit params. * @return string $prev_val updated field previous value. */ public static function terms_batch_update_prev_value( $prev_val = '', $args = array() ) { if( empty( $args ) || empty( $args['table_nm'] ) || empty( $args['id'] ) || empty( $args['col_nm'] ) ){ return $prev_val; } if( 'termmeta' === $args['table_nm'] ) { return get_term_meta( $args['id'], $args['col_nm'], true ); } else { $terms = get_term_by( 'term_id', $args['id'], $args['dashboard_key'], 'ARRAY_A' ); return ( ! empty( $terms ) && ! empty( $terms[ $args['col_nm'] ] ) ) ? $terms[ $args['col_nm'] ] : $prev_val; } return $prev_val; } /** * Static function for processing db updates for bulk edit. * * @param boolean $update_flag flag to determine if the update was successful or not. * @param array $args bulk edit params. * @return boolean $update_flag result of the db update. */ public static function terms_post_batch_update_db_updates( $update_flag = false, $args = array() ) { $id = ( !empty( $args['id'] ) ) ? $args['id'] : 0; $col_nm = ( !empty( $args['col_nm'] ) ) ? $args['col_nm'] : ''; $value = ( !empty( $args['value'] ) ) ? $args['value'] : ''; if( ! empty( $args['copy_from_operators'] ) && in_array( $args['operator'], $args['copy_from_operators'] ) ) { $value = ( is_callable( array( 'Smart_Manager_Pro_Taxonomy_Base', 'terms_batch_update_new_value' ) ) ) ? self::terms_batch_update_new_value( $args ) : $value; } if( ! empty( $col_nm ) && in_array( $col_nm, self::$term_taxonomy_update_cols ) ) { $result = wp_update_term( $id, $args['dashboard_key'], array( $col_nm => $value ) ); return ( is_wp_error( $result ) ) ? false : true; } else if ( !empty( $args['table_nm'] ) && 'termmeta' === $args['table_nm'] ) { update_term_meta( $id, $col_nm, $value ); return true; } return $update_flag; } /** * Static function to get new value for copy from operators for bulk edit. * * @param array $args bulk edit params. * @return string updated new value. */ public static function terms_batch_update_new_value( $args = array() ) { global $wpdb; if( empty( $args['selected_table_name'] ) || empty( $args['selected_column_name'] ) || empty( $args['selected_value'] ) ) { return ''; } $args['new_value'] = ''; if( 'termmeta' === $args['selected_table_name'] ) { $args['new_value'] = get_term_meta( $args['selected_value'], $args['selected_column_name'], true ); } else { $terms = get_term_by( 'term_id', $args['selected_value'], $args['dashboard_key'], 'ARRAY_A' ); $args['new_value'] = ( ! empty( $terms ) && ! empty( $terms[ $args['selected_column_name'] ] ) ) ? $terms[ $args['selected_column_name'] ] : $args['new_value']; } return ( ( 'copy_from_field' === $args['operator'] && ( ! empty ( $args['copy_field_data_type'] ) ) ) && is_callable( array( 'Smart_Manager_Pro_Base', 'handle_serialized_data' ) ) ) ? Smart_Manager_Pro_Base::handle_serialized_data( $args ) : $args['new_value']; } /** * Function to get taxonomy values for copy from operator for bulk edit. * * @param array $args bulk edit params. * @return string|array json encoded string or array of taxonomy values. */ public function get_batch_update_copy_from_record_ids( $args = array() ) { global $wpdb; $data = array(); $is_ajax = ( isset( $args['is_ajax'] ) ) ? $args['is_ajax'] : true; $search_term = ( ! empty( $this->req_params['search_term'] ) ) ? $this->req_params['search_term'] : ( ( ! empty( $args['search_term'] ) ) ? $args['search_term'] : '' ); $select = apply_filters( 'sm_batch_update_copy_from_term_ids_select', "SELECT t.term_id AS id, t.name AS title", $args ); $search_cond = ( ! empty( $search_term ) ) ? " AND ( t.term_id LIKE '%".$search_term."%' OR t.name LIKE '%".$search_term."%' ) " : ''; $search_cond_ids = ( !empty( $args['search_ids'] ) ) ? " AND t.term_id IN ( ". implode(",", $args['search_ids']) ." ) " : ''; $results = $wpdb->get_results( $select . " FROM {$wpdb->prefix}terms as t JOIN {$wpdb->prefix}term_taxonomy as tt ON (tt.term_id = t.term_id AND tt.taxonomy = '". $this->req_params['active_module'] ."') WHERE 1=1 ". $search_cond ." ". $search_cond_ids, 'ARRAY_A' ); if( count( $results ) > 0 ) { foreach( $results as $result ) { $data[ $result['id'] ] = trim($result['title']); } } $data = apply_filters( 'sm_batch_update_copy_from_term_ids', $data ); if( $is_ajax ){ wp_send_json( $data ); } else { return $data; } } } } pro/classes/class-smart-manager-pro-settings.php000064400000004021147600337620016014 0ustar00 intval( $value ), 'url' => wp_get_attachment_image_url( intval( $value ), 'full' ) ); } return $value; } } } Smart_Manager_Pro_Settings::init(); pro/classes/class-smart-manager-pro-background-updater.php000064400000101663147600337620017747 0ustar00action = self::$_action; $this->identifier = self::get_identifier(); add_action( 'storeapps_smart_manager_batch_handler', array( $this, 'storeapps_smart_manager_batch_handler' ) ); add_action( 'action_scheduler_failed_action', array( $this, 'restart_failed_action' ) ); add_action( 'admin_notices', array( $this, 'background_process_notice' ) ); add_action( 'admin_head', array( $this, 'background_heartbeat' ) ); add_filter( 'cron_schedules', array( $this, 'cron_schedules' ), 1000 ); // phpcs:ignore add_filter( 'action_scheduler_run_schedule', array( $this, 'modify_action_scheduler_run_schedule' ), 1000 ); // phpcs:ignore add_action( 'wp_ajax_sa_sm_stop_background_process', array( $this, 'stop_background_process' ) ); add_action( 'sm_schedule_tasks_cleanup', array( &$this, 'schedule_tasks_cleanup_cron' ) ); // For handling deletion of tasks those are more than x number of days. add_action( 'storeapps_smart_manager_scheduled_actions', array( &$this, 'schedule_bulk_edit_actions' ) ); } /** * Task * * Override this method to perform any actions required on each * queue item. Return the modified item for further processing * in the next pass through. Or, return false to remove the * item from the queue. * * @param array $callback Update callback function * @return mixed */ protected function task( $params ) { if ( is_callable( array( 'Smart_Manager', 'log' ) ) ) { Smart_Manager::log( 'info', _x( 'Background process task params ', 'background process task params', 'smart-manager-for-wp-e-commerce' ) . print_r( $params, true ) ); } if ( !empty($params['callback']) && !empty($params['args']) ) { try { include_once dirname( __FILE__ ) .'/class-smart-manager-pro-utils.php'; include_once( SM_PLUGIN_DIR_PATH . '/classes/class-smart-manager-base.php' ); include_once dirname( __FILE__ ) .'/class-smart-manager-pro-base.php'; include_once dirname( __FILE__ ) .'/'. $params['callback']['class_path']; if( ! class_exists( 'Smart_Manager_Task' ) && file_exists( SM_PLUGIN_DIR_PATH .'/classes/class-smart-manager-task.php' ) ){ include_once SM_PLUGIN_DIR_PATH .'/classes/class-smart-manager-task.php'; } if( ! class_exists( 'Smart_Manager_Pro_Task' ) && file_exists( dirname( __FILE__ ) .'/class-smart-manager-pro-task.php' ) ){ include_once dirname( __FILE__ ) .'/class-smart-manager-pro-task.php'; } if( !empty($params['args']) && is_array($params['args']) ) { if( !empty($params['args']['dashboard_key']) && file_exists(dirname( __FILE__ ) . '/class-smart-manager-pro-'. str_replace( '_', '-', $params['args']['dashboard_key'] ) .'.php')) { include_once dirname( __FILE__ ) . '/class-smart-manager-pro-'. str_replace( '_', '-', $params['args']['dashboard_key'] ) .'.php'; $class_name = 'Smart_Manager_Pro_'.ucfirst( str_replace( '-', '_', $params['args']['dashboard_key'] ) ); $obj = $class_name::instance($params['args']['dashboard_key']); } if( is_callable( array( $params['callback']['func'][0], 'actions' ) ) ) { call_user_func(array($params['callback']['func'][0],'actions')); } call_user_func($params['callback']['func'],$params['args']); } } catch ( Exception $e ) { if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) { trigger_error( 'Transactional email triggered fatal error for callback ' . $callback['filter'], E_USER_WARNING ); } } } return false; } public function background_heartbeat() { ?> clean_scheduled_action_data(true); } /** * Stop batch background process via AJAX */ public function stop_background_process() { check_ajax_referer( 'smart-manager-security', 'security' ); $this->stop_scheduled_actions(); wp_send_json_success(); } /** * Clean scheduled action data * * @param boolean $abort flag whether the process has been forcefully stopped or not. */ public function clean_scheduled_action_data( $abort = false ) { delete_option( $this->identifier.'_start_time' ); delete_option( $this->identifier.'_current_time' ); delete_option( $this->identifier.'_tot' ); delete_option( $this->identifier.'_remaining' ); delete_option( $this->identifier.'_initial_process' ); if( ! empty( $abort ) ) { delete_option( $this->identifier.'_ids' ); delete_option( $this->identifier.'_current_id_batch' ); delete_option( $this->identifier.'_params' ); delete_option( $this->identifier.'_is_background' ); } } /** * Function to display admin notice in case of background process * */ public function background_process_notice() { if ( ! is_admin() ) { return; } if( !( !empty( $_GET['page'] ) && 'smart-manager' === $_GET['page'] ) ) { return; } $initial_process = get_option( $this->identifier.'_initial_process', false ); if( !empty( $initial_process ) ) { if( false === get_option( '_sm_update_42191', false ) ) { delete_option( $this->identifier.'_initial_process' ); update_option( '_sm_update_42191', 1, 'no' ); } $progress = $this->calculate_background_process_progress(); $percent = ( !empty( $progress['percent_completion'] ) ) ? $progress['percent_completion'] : 0; if($percent >= 100){ return; } } if ( ! $this->is_process_running() && empty( $initial_process ) ) { return; } update_option( $this->identifier.'_is_background', 1, 'no' ); $batch_params = get_option( $this->identifier.'_params', array() ); $process_name = ( !empty( $batch_params['process_name'] ) ) ? $batch_params['process_name'] : 'Batch'; $current_dashboard = ( !empty( $batch_params['active_dashboard'] ) ) ? $batch_params['active_dashboard'] : 'Products'; $no_of_records = ( ( !empty( $batch_params['entire_store'] ) ) ? __( 'All', 'smart-manager-for-wp-e-commerce' ) : $batch_params['id_count'] ) .' '. esc_html( $current_dashboard ); $admin_email = get_option( 'admin_email', false ); $admin_email = ( empty( $admin_email ) ) ? 'admin email' : $admin_email; ?> 0, 'remaining_seconds' => 0 ); $start_time = get_option( $this->identifier.'_start_time', false ); $current_time = get_option( $this->identifier.'_current_time', false ); $all_tasks_count = get_option( $this->identifier.'_tot', false ); $remaining_tasks_count = get_option( $this->identifier.'_remaining', false ); if( empty( $start_time ) && empty( $current_time ) && empty( $all_tasks_count ) && empty( $remaining_tasks_count ) ) { $progress = array( 'percent_completion' => 100, 'remaining_seconds' => 0 ); } else { $percent_completion = floatval( 0 ); if ( false !== $all_tasks_count && false !== $remaining_tasks_count ) { $percent_completion = ( ( intval( $all_tasks_count ) - intval( $remaining_tasks_count ) ) * 100 ) / intval( $all_tasks_count ); $progress['percent_completion'] = floatval( $percent_completion ); } if ( $percent_completion > 0 && false !== $start_time && false !== $current_time ) { $time_taken_in_seconds = intval($current_time) - intval($start_time); $time_remaining_in_seconds = ( $time_taken_in_seconds / $percent_completion ) * ( 100 - $percent_completion ); $progress['remaining_seconds'] = ceil( $time_remaining_in_seconds ); } if( $progress['percent_completion'] >= 100 ) { //on process completion $this->clean_scheduled_action_data(); } } return $progress; } /** * Get background process progress via ajax */ public function get_background_progress() { $response = array(); $progress = $this->calculate_background_process_progress(); $percent = ( !empty( $progress['percent_completion'] ) ) ? $progress['percent_completion'] : 0; $remaining_seconds = ( !empty( $progress['remaining_seconds'] ) ) ? $progress['remaining_seconds'] : 0; $response = array( 'ack' => 'Success', 'per' => $percent, 'remaining_seconds' => $remaining_seconds ); wp_send_json( $response ); } /** * Initiate Batch Process * * initiate batch process and pass control to batch_handler function */ public function initiate_batch_process() { $update_ids = get_option( $this->identifier.'_ids', array() ); if( !empty( $update_ids ) ) { update_option( $this->identifier.'_tot', count( $update_ids ), 'no' ); update_option( $this->identifier.'_remaining', count( $update_ids ), 'no' ); update_option( $this->identifier.'_start_time', time(), 'no' ); update_option( $this->identifier.'_current_time', time(), 'no' ); update_option( $this->identifier.'_initial_process', 1, 'no' ); as_unschedule_action( self::$batch_handler_hook ); if( is_callable( array( $this, 'storeapps_smart_manager_batch_handler' ) ) ) { $this->storeapps_smart_manager_batch_handler(); } } } /** * Batch Handler * * Pass each queue item to the task handler, while remaining * within server memory and time limit constraints. */ public function storeapps_smart_manager_batch_handler() { $batch_params = get_option( $this->identifier.'_params', array() ); $update_ids = get_option( $this->identifier.'_ids', array() ); if ( is_callable( array( 'Smart_Manager', 'log' ) ) ) { Smart_Manager::log( 'info', _x( 'Batch handler params ', 'batch handler params', 'smart-manager-for-wp-e-commerce' ) . print_r( $batch_params, true ) ); Smart_Manager::log( 'info', _x( 'Batch handler update ids ', 'batch handler update ids', 'smart-manager-for-wp-e-commerce' ) . print_r( $update_ids, true ) ); } if( empty( $batch_params ) || empty( $update_ids ) ) { return; } $start_time = get_option( $this->identifier.'_start_time', false ); if( empty( $start_time ) ) { update_option( $this->identifier.'_start_time', time(), 'no' ); } $this->batch_start_time = time(); $batch_complete = false; // update_option( $this->identifier.'_batch_start_time', time() ); $update_remaining_count = get_option( $this->identifier.'_remaining', false ); $update_tot_count = get_option( $this->identifier.'_tot', false ); $current_batch_update_id = $current_batch_action_id = ''; $current_id_batch_action = get_option( $this->identifier.'_current_id_batch', false ); if( !empty( $current_id_batch_action ) ) { $current_params = explode( '__', $current_id_batch_action ); $current_batch_update_id = ( !empty( $current_params[0] ) ) ? $current_params[0] : ''; $current_batch_action_id = ( !empty( $current_params[1] ) ) ? $current_params[1] : ''; } foreach( $update_ids as $key => $update_id ) { $current_batch_action_id = 0; if( !empty( $current_batch_update_id ) && $current_batch_update_id == $update_id && !empty( $current_batch_action_id ) ) { $start_index = $current_batch_action_id; } if( !empty( $batch_params['actions'] ) ) { //For Batch Update for( $index = $current_batch_action_id; $index < sizeof( $batch_params['actions'] ); $index++ ) { update_option( $this->identifier.'_current_id_batch', $update_id.'__'.$index, 'no' ); $batch_params['actions'][$index]['id'] = $update_id; $this->task( array( 'callback' => $batch_params['callback'], 'args' => $batch_params['actions'][$index] ) ); update_option( $this->identifier.'_current_time', time(), 'no' ); if( $this->time_exceeded() || $this->memory_exceeded() ) { //Code for continuing the batch $initial_process = get_option( $this->identifier.'_initial_process', false ); if( !empty( $initial_process ) ) { delete_option( $this->identifier.'_initial_process' ); } $batch_complete = true; if ( is_callable( array( 'Smart_Manager', 'log' ) ) ) { if ( $this->time_exceeded() ) { Smart_Manager::log( 'notice', _x( 'Time is exceeded for Bulk Edit', 'bulk edit batch handler time exceed status', 'smart-manager-for-wp-e-commerce' ) ); } if ( $this->memory_exceeded() ) { Smart_Manager::log( 'notice', _x( 'Memory is exceeded for Bulk Edit', 'bulk edit batch handler memory exceed status', 'smart-manager-for-wp-e-commerce' ) ); } } break; } } } else { $args = array( 'dashboard_key' => $batch_params['dashboard_key'], 'id' => $update_id ); $args = ( !empty( $batch_params['callback_params'] ) && is_array( $batch_params['callback_params'] ) ) ? array_merge( $args, $batch_params['callback_params'] ) : $args; $this->task( array( 'callback' => $batch_params['callback'], 'args' => $args ) ); update_option( $this->identifier.'_current_time', time(), 'no' ); if( $this->time_exceeded() || $this->memory_exceeded() ) { //Code for continuing the batch if ( is_callable( array( 'Smart_Manager', 'log' ) ) && ! empty( $batch_params['process_name'] ) ) { if ( $this->time_exceeded() ) { /* translators: %s: process name */ Smart_Manager::log( 'notice', sprintf( _x( 'Time is exceeded for %s', 'batch handler time exceed status', 'smart-manager-for-wp-e-commerce' ), $batch_params['process_name'] ) ); } if ( $this->memory_exceeded() ) { /* translators: %s: process name */ Smart_Manager::log( 'notice', sprintf( _x( 'Memory is exceeded for %s', 'batch handler memory exceed status', 'smart-manager-for-wp-e-commerce' ), $batch_params['process_name'] ) ); } } $initial_process = get_option( $this->identifier.'_initial_process', false ); if( !empty( $initial_process ) ) { delete_option( $this->identifier.'_initial_process' ); } $batch_complete = true; } } //Code for post update $update_remaining_count = $update_remaining_count - 1; if ( is_callable( array( 'Smart_Manager', 'log' ) ) ) { if ( empty( $batch_complete ) ) { Smart_Manager::log( 'error', _x( 'Batch process not yet completed', 'batch process status', 'smart-manager-for-wp-e-commerce' ) ); } Smart_Manager::log( 'info', _x( 'Remaining count for update in batch handler ', 'remaining count for update in batch handler', 'smart-manager-for-wp-e-commerce' ) . print_r( $update_remaining_count, true ) ); } update_option( $this->identifier.'_remaining', $update_remaining_count, 'no' ); if( 0 === $update_remaining_count ) { // Code for handling when the batch has completed. do_action( 'sm_background_process_complete', $this->identifier ); // For triggering task deletion after successfully completing undo task/deleting task. delete_option( $this->identifier.'_ids' ); delete_option( $this->identifier.'_current_id_batch' ); $is_background = get_option( $this->identifier.'_is_background', false ); if( !empty( $is_background ) ) { $this->complete(); } else { delete_option( $this->identifier.'_params' ); } delete_option( $this->identifier.'_is_background' ); } else if( !empty( $batch_complete ) ) { //Code for continuing the batch $update_ids = array_slice( $update_ids, $key+1 ); update_option( $this->identifier.'_remaining', $update_remaining_count, 'no' ); update_option( $this->identifier.'_ids', $update_ids, 'no' ); if ( function_exists( 'as_schedule_single_action' ) ) { as_schedule_single_action( time(), self::$batch_handler_hook ); } break; } } } /** * Memory exceeded * * Ensures the batch process never exceeds 90% * of the maximum WordPress memory. * * @return bool */ protected function memory_exceeded() { $memory_limit = $this->get_memory_limit() * 0.9; // 90% of max memory $current_memory = memory_get_usage( true ); if ( $current_memory >= $memory_limit ) { return true; } return false; } /** * Get memory limit. * * @return int */ protected function get_memory_limit() { if ( function_exists( 'ini_get' ) ) { $memory_limit = ini_get( 'memory_limit' ); } else { // Sensible default. $memory_limit = '128M'; } if ( ! $memory_limit || -1 === intval( $memory_limit ) ) { // Unlimited, set to 32GB. $memory_limit = '32G'; } return wp_convert_hr_to_bytes( $memory_limit ); } /** * Time exceeded. * * Ensures the batch never exceeds a sensible time limit. * A timeout limit of 30s is common on shared hosting. * * @return bool */ protected function time_exceeded() { if( empty( $this->batch_start_time ) ) { $return = false; } $finish = $this->batch_start_time + apply_filters( $this->identifier . '_batch_default_time_limit', 20 ); // 20 seconds $return = false; if ( time() >= $finish ) { $return = true; } return apply_filters( $this->identifier . '_batch_time_exceeded', $return ); } public function complete() { Smart_Manager_Pro_Base::batch_process_complete(); } /** * Checks if background process is running * * @return bool $is_process_running */ public function is_process_running() { $batch_params = get_option( $this->identifier.'_params', array() ); return ( ! empty( $batch_params ) ) ? true : false; } /** * Restart scheduler after one minute if it fails * * @param array $action_id id of failed action. */ public function restart_failed_action( $action_id ) { if ( ! class_exists( 'ActionScheduler' ) || ! is_callable( array( 'ActionScheduler', 'store' ) ) || ! function_exists( 'as_schedule_single_action' ) ) { return; } $action = ActionScheduler::store()->fetch_action( $action_id ); $action_hook = $action->get_hook(); if ( self::$batch_handler_hook === $action_hook ) { as_schedule_single_action( time() + MINUTE_IN_SECONDS, self::$batch_handler_hook ); } } /** * Function to modify the action sceduler run schedule * * @param string $wp_cron_schedule schedule interval key. * @return string $wp_cron_schedule */ public function modify_action_scheduler_run_schedule( $wp_cron_schedule ) { return self::SM_WP_CRON_SCHEDULE; } /** * Function to add entry to cron_schedules * * @param array $schedules schedules with interval and display. * @return array $schedules */ public function cron_schedules( $schedules ) { $schedules[self::SM_WP_CRON_SCHEDULE] = array( 'interval' => 5, 'display' => __( 'Every 5 Seconds', 'smart-manager-for-wp-e-commerce' ), ); return $schedules; } /** * Delete tasks from tasks table those are more than x number of days * * @return void */ public function schedule_tasks_cleanup_cron() { $tasks_cleanup_interval_days = get_option( 'sa_sm_tasks_cleanup_interval_days' ); if ( empty( $tasks_cleanup_interval_days ) ) { return; } include_once( SM_PLUGIN_DIR_PATH . '/classes/class-smart-manager-base.php' ); include_once dirname( __FILE__ ) . '/class-smart-manager-pro-base.php'; include_once dirname( __FILE__ ) . '/class-smart-manager-pro-task.php'; if ( is_callable( array( 'Smart_Manager_Pro_Task', 'delete_tasks' ) ) && is_callable( array( 'Smart_Manager_Pro_Task', 'get_task_ids' ) ) ) { Smart_Manager_Pro_Task::delete_tasks( Smart_Manager_Pro_Task::get_task_ids( date( 'Y-m-d H:i:s', strtotime( "-" . $tasks_cleanup_interval_days . " Days" ) ) ) ); } if ( is_callable( array( 'Smart_Manager_Pro_Task', 'schedule_task_deletion' ) ) ) { Smart_Manager_Pro_Task::schedule_task_deletion(); } } /** * Schedule bulk edit actions * * @param array $args arguments of bulk edit action. * @return void */ public function schedule_bulk_edit_actions( $args = array() ) { if ( empty( $args ) || ! is_array( $args ) || empty( $args['callback']['class_path'] ) || empty( $args['dashboard_key'] ) ) { return; } $file_paths = array( SM_PLUGIN_DIR_PATH . '/classes/class-smart-manager-base.php', dirname( __FILE__ ) . '/class-smart-manager-pro-base.php', dirname( __FILE__ ) .'/'. $args['callback']['class_path'], SM_PLUGIN_DIR_PATH . '/classes/class-smart-manager-task.php' ); foreach ( $file_paths as $file_path ) { if ( file_exists( $file_path ) ) { include_once $file_path; } } $args['scheduled_for'] = '0000-00-00 00:00:00'; $is_process_running = ( ! empty( get_option( $this->identifier.'_params', array() ) ) ) ? true : false; $obj = ( 'Smart_Manager_Pro_' . ucfirst( str_replace( '-', '_', $args['dashboard_key'] ) ) )::instance( $args['dashboard_key'] ); if ( ! $is_process_running && is_callable( array( 'Smart_Manager_Pro_Base', 'send_to_background_process' ) ) ) { Smart_Manager_Pro_Base::send_to_background_process( $args ); } else { $rescheduled_interval = apply_filters( 'sa_sm_bulk_edit_action_rescheduled_interval', intval( get_option( 'sa_sm_bulk_edit_action_rescheduled_interval', 30 ) ) ); as_schedule_single_action( strtotime( date( 'Y-m-d H:i:s', strtotime( "+" . $rescheduled_interval . " minutes" ) ) ), 'storeapps_smart_manager_scheduled_actions' ); } } } } Smart_Manager_Pro_Background_Updater::instance(); pro/classes/class-smart-manager-pro-llms-base.php000064400000010062147600337620016035 0ustar00dashboard_key = $dashboard_key; $this->strings_to_remove_from_title = array( '_llms', 'llms_', '_courses', 'course_', 'post_' , '_' ); if( empty( $this->is_dashboard_class_called ) ){ add_filter( 'sm_dashboard_model',array( &$this,'base_dashboard_model' ), 10, 2 ); } } public static function actions() { } public function base_dashboard_model( $dashboard_model, $dashboard_model_saved ){ $this->dashboard_model = $dashboard_model; $this->dashboard_model_saved = $dashboard_model_saved; return $this->llms_dashboard_model(); } //Function to override the dashboard model public function llms_dashboard_model() { if( !empty( $this->dashboard_model['columns'] ) ) { $column_model = &$this->dashboard_model['columns']; foreach( $column_model as $key => &$column ) { if (empty($column['src'])) continue; $src_exploded = explode("/",$column['src']); if (empty($src_exploded)) { $src = $column['src']; } if ( sizeof($src_exploded) > 2) { $col_table = $src_exploded[0]; $cond = explode("=",$src_exploded[1]); if (sizeof($cond) == 2) { $src = $cond[1]; } } else { $src = $src_exploded[1]; $col_table = $src_exploded[0]; } if( empty($this->dashboard_model_saved) && ! empty( $this->visible_columns ) ) { if (!empty($column['position'])) { unset($column['position']); } $position = array_search( $src, $this->visible_columns ); if ($position !== false) { $column['position'] = $position + 1; $column['hidden'] = false; } else { $column['hidden'] = true; } } switch( $src ) { case ( ! empty( $this->datetime_columns ) && in_array( $src, $this->datetime_columns ) ): $column['type'] = $column['editor'] = 'sm.datetime'; $column['width'] = 102; break; case ( ! empty( $this->numeric_columns ) && in_array( $src, $this->numeric_columns ) ): $column['type'] = 'numeric'; $column['editor'] = 'customNumericEditor'; $column['min'] = 0; $column['width'] = 50; $column['align'] = 'right'; break; case ( ! empty( $this->checkbox_empty_one_columns ) && in_array( $src, $this->checkbox_empty_one_columns ) ): $column['type'] = $column['editor'] = 'checkbox'; $column['checkedTemplate'] = 1; $column['uncheckedTemplate'] = ''; $column['width'] = 30; break; } // Code for updating the titles $column['name'] = $column['key'] = ( ! empty( $this->col_titles ) && ! empty( $this->col_titles[$src] ) ) ? $this->col_titles[$src] : __( ucwords( trim( str_replace( $this->strings_to_remove_from_title, ' ', $src ) ) ), 'smart-manager-for-wp-e-commerce' ); } } if ( ! empty( $this->dashboard_model_saved ) ) { $col_model_diff = sm_array_recursive_diff( $this->dashboard_model_saved,$this->dashboard_model); } //clearing the transients before return if ( ! empty( $col_model_diff ) ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); } return $this->dashboard_model; } } } pro/classes/class-smart-manager-pro-shop-subscription.php000064400000042226147600337620017660 0ustar00 array( 'wc-active' ), 'red' => array( 'cancelled' ), 'orange' => array( 'wc-on-hold', 'wc-pending' ), 'blue' => array( 'wc-switched', 'wc-pending-cancel' ) ); protected static $_instance = null; public static function instance($dashboard_key) { if ( is_null( self::$_instance ) ) { self::$_instance = new self($dashboard_key); } return self::$_instance; } function __construct($dashboard_key) { if ( file_exists(SM_PLUGIN_DIR_PATH . '/classes/class-smart-manager-shop-order.php') ) { include_once SM_PLUGIN_DIR_PATH . '/classes/class-smart-manager-shop-order.php'; } if ( file_exists(SM_PLUGIN_DIR_PATH . '/pro/classes/class-smart-manager-pro-shop-order.php') ) { include_once SM_PLUGIN_DIR_PATH . '/pro/classes/class-smart-manager-pro-shop-order.php'; } // Hooks for WC v7.9 (HPOS) compat if ( ! empty( Smart_Manager::$sm_is_woo79 ) ) { add_filter( 'sm_search_table_types', array( 'Smart_Manager_Shop_Order', 'sm_order_search_table_types' ), 12, 1 ); // should be kept before calling the parent class constructor } parent::__construct($dashboard_key); self::actions(); $this->dashboard_key = $dashboard_key; $this->post_type = $dashboard_key; $this->req_params = ( ! empty( $_REQUEST ) ) ? $_REQUEST : array(); // Hooks for WC v7.9 (HPOS) compat if ( ! empty( Smart_Manager::$sm_is_woo79 ) ) { add_filter( 'sm_beta_load_default_store_model', function() { return false; } ); add_filter( 'sm_default_dashboard_model', array( &$this, 'default_dashboard_model' ), 10, 1 ); add_filter( 'sm_get_custom_cols', array( 'Smart_Manager_Shop_Order', 'get_address_cols' ), 10, 2 ); add_filter( 'sm_meta_col_model_args', array( &$this, 'update_meta_col_model' ) ); add_filter( 'sm_ignored_cols', array( 'Smart_Manager_Shop_Order', 'get_flat_table_ignored_cols' ) ); add_filter( 'sm_flat_table_col_titles', array( 'Smart_Manager_Shop_Order', 'get_flat_table_col_titles' ) ); add_filter( 'sm_beta_load_default_data_model', function() { return false; } ); // Filters for modifying advanced search query clauses add_filter( 'woocommerce_orders_table_query_clauses', array( &$this, 'modify_subscriptions_table_query_clauses' ), 99, 3 ); add_filter( 'sm_search_query_formatted', array( 'Smart_Manager_Shop_Order', 'sm_order_addresses_search_query_formatted' ), 12, 2 ); add_filter( 'sm_search_wc_orders_meta_cond', array( 'Smart_Manager_Shop_Order','search_wc_orders_meta_cond' ), 10, 2 ); // Filters for 'inline_update' functionality add_filter( 'sm_default_inline_update', function() { return false; } ); add_action( 'sm_inline_update_post', array( &$this, 'subscriptions_inline_update' ), 10, 2 ); add_filter( 'sm_beta_background_entire_store_ids_query', array( $this,'get_entire_store_ids_query' ), 12, 1 ); } else { add_filter( 'sm_dashboard_model',array( &$this,'subscriptions_dashboard_model' ), 10, 2 ); add_filter( 'posts_where',array( &$this,'sm_query_sub_where_cond' ), 100, 2 ); add_filter( 'found_posts',array( 'Smart_Manager_Shop_Order' ,'kpi_data_query'), 100, 2 ); add_filter( 'sm_batch_update_copy_from_ids_select',array( &$this,'sm_batch_update_copy_from_ids_select' ), 10, 2 ); } add_filter( 'sm_data_model', array( &$this, 'subscriptions_data_model' ), 10, 2 ); // hooks for delete functionality add_filter( 'sm_default_process_delete_records', function() { return false; } ); add_filter( 'sm_default_process_delete_records_result', array( 'Smart_Manager_Shop_Order', 'order_trash' ), 12, 2 ); } public static function actions() { if ( file_exists(SM_PLUGIN_DIR_PATH . '/classes/class-smart-manager-shop-order.php') ) { include_once SM_PLUGIN_DIR_PATH . '/classes/class-smart-manager-shop-order.php'; } if ( file_exists(SM_PLUGIN_DIR_PATH . '/pro/classes/class-smart-manager-pro-shop-order.php') ) { include_once SM_PLUGIN_DIR_PATH . '/pro/classes/class-smart-manager-pro-shop-order.php'; } add_filter( 'sm_beta_batch_update_prev_value', __CLASS__ . '::get_previous_value', 10, 2 ); add_filter( 'sm_default_batch_update_db_updates', 'Smart_Manager_Pro_Shop_Order::default_batch_update_db_updates', 10, 2 ); add_filter( 'sm_post_batch_update_db_updates', __CLASS__ . '::post_batch_update_db_updates', 10, 2 ); add_filter( 'sm_pro_default_process_delete_records', function() { return false; } ); add_filter( 'sm_pro_default_process_delete_records_result', 'Smart_Manager_Shop_Order::process_delete', 12, 3 ); } public function __call( $function_name, $arguments = array() ) { if ( ! is_callable( array( 'Smart_Manager_Shop_Order', $function_name ) ) ) { return; } if ( ! empty( $arguments ) ) { return call_user_func_array( array( 'Smart_Manager_Shop_Order', $function_name ), $arguments ); } else { return call_user_func( array( 'Smart_Manager_Shop_Order', $function_name ) ); } } //Function to generate the col model for dropdown datatype public function generate_dropdown_col_model( $colObj, $dropdownValues = array() ) { $dropdownKeys = ( !empty( $dropdownValues ) ) ? array_keys( $dropdownValues ) : array(); $colObj['defaultValue'] = ( !empty( $dropdownKeys[0] ) ) ? $dropdownKeys[0] : ''; $colObj['save_state'] = true; $colObj['values'] = $dropdownValues; $colObj['selectOptions'] = $dropdownValues; //for inline editing $colObj['search_values'] = array(); foreach( $dropdownValues as $key => $value) { $colObj['search_values'][] = array('key' => $key, 'value' => $value); } $colObj['type'] = 'dropdown'; $colObj['strict'] = true; $colObj['allowInvalid'] = false; $colObj['editor'] = 'select'; $colObj['renderer'] = 'selectValueRenderer'; return $colObj; } //Fucntion for overriding the select clause for fetching the ids for batch update 'copy from' functionality public function sm_batch_update_copy_from_ids_select( $select, $args ) { $select = " SELECT ID AS id, CONCAT('Subscription #', ID) AS title"; return $select; } public function subscriptions_dashboard_model ($dashboard_model, $dashboard_model_saved) { global $wpdb, $current_user; $dashboard_model['tables']['posts']['where']['post_type'] = 'shop_subscription'; $visible_columns = array('ID', 'post_date', 'post_status', '_billing_email', '_billing_first_name', '_billing_last_name', '_order_total', '_billing_interval', '_billing_period', '_payment_method_title', '_schedule_next_payment', '_schedule_end'); $numeric_columns = array('_billing_phone', '_cart_discount', '_cart_discount_tax', '_customer_user', '_billing_interval'); $string_columns = array('_billing_postcode', '_shipping_postcode'); $post_status_col_index = sm_multidimesional_array_search('posts_post_status', 'data', $dashboard_model['columns']); if( isset( $dashboard_model['columns'][$post_status_col_index] ) && is_callable( array( 'Smart_Manager_Shop_Order', 'generate_status_col_model' ) ) ) { $dashboard_model['columns'][$post_status_col_index] = Smart_Manager_Shop_Order::generate_status_col_model( $dashboard_model['columns'][$post_status_col_index], array( 'curr_obj' => $this, 'status_func' => 'wcs_get_subscription_statuses', 'default_status' => 'wc-pending', 'color_codes' => $this->status_color_codes ) ); } //Code to get the custom column model if( is_callable( array( 'Smart_Manager_Shop_Order', 'generate_orders_custom_column_model' ) ) ) { $dashboard_model['columns'] = self::generate_orders_custom_column_model( $dashboard_model['columns'] ); } $column_model = &$dashboard_model['columns']; //Code for unsetting the position for hidden columns foreach( $column_model as &$column ) { if (empty($column['src'])) continue; $src_exploded = explode("/",$column['src']); if (empty($src_exploded)) { $src = $column['src']; } if ( sizeof($src_exploded) > 2) { $col_table = $src_exploded[0]; $cond = explode("=",$src_exploded[1]); if (sizeof($cond) == 2) { $src = $cond[1]; } } else { $src = $src_exploded[1]; $col_table = $src_exploded[0]; } if( empty($dashboard_model_saved) ) { if (!empty($column['position'])) { unset($column['position']); } $position = array_search($src, $visible_columns); if ($position !== false) { $column['position'] = $position + 1; $column['hidden'] = false; } else { $column['hidden'] = true; } } if ($src == 'post_date') { $column ['name'] = $column ['key'] = __('Date', 'smart-manager-for-wp-e-commerce'); } else if ($src == 'post_status') { $column ['name'] = $column ['key'] = __('Status', 'smart-manager-for-wp-e-commerce'); } else if ($src == '_billing_interval') { $subscription_period_interval = ( function_exists('wcs_get_subscription_period_interval_strings') ) ? wcs_get_subscription_period_interval_strings() : array(); $column = $this->generate_dropdown_col_model( $column, $subscription_period_interval ); } else if ($src == '_billing_period') { $subscription_period = ( function_exists('wcs_get_subscription_period_strings') ) ? wcs_get_subscription_period_strings() : array(); $column = $this->generate_dropdown_col_model( $column, $subscription_period ); } else if( !empty( $numeric_columns ) && in_array( $src, $numeric_columns ) ) { $column ['type'] = 'numeric'; $column ['editor'] = ( '_billing_phone' === $src ) ? 'numeric' : 'customNumericEditor'; } else if( !empty( $string_columns ) && in_array( $src, $string_columns ) ) { $column ['type'] = $column ['editor'] = 'text'; } } if (!empty( $dashboard_model_saved )) { $col_model_diff = sm_array_recursive_diff($dashboard_model_saved,$dashboard_model); } //clearing the transients before return if (!empty($col_model_diff)) { delete_transient( 'sa_sm_'.$this->dashboard_key ); } return $dashboard_model; } //Function to process subscriptions search for custom columns public function sm_query_sub_where_cond ($where, $wp_query_obj) { if( is_callable( array( 'Smart_Manager_Shop_Order', 'process_custom_search' ) ) ) { $where = self::process_custom_search( $where, $this->req_params ); } return $where; } /** * Function for generating default dashboard model. * @param array $dashboard_model default generated dashboard model. * @return array Updated default dashboard model */ public function default_dashboard_model( $dashboard_model = array() ) { return ( is_callable( array( 'Smart_Manager_Shop_Order', 'generate_hpos_dashboard_model' ) ) ) ? Smart_Manager_Shop_Order::generate_hpos_dashboard_model( $this, array( 'dashboard_model' => $dashboard_model, 'status_col_args' => array( 'status_func' => 'wcs_get_subscription_statuses', 'default_status' => 'wc-pending', 'color_codes' => $this->status_color_codes ), 'visible_columns' => array( 'wc_orders_id', 'wc_orders_date_created_gmt', 'wc_orders_status', 'wc_orders_billing_email','wc_order_addresses_billing_first_name', 'wc_order_addresses_billing_last_name', 'wc_orders_total_amount', 'wc_orders_meta_meta_key__billing_interval_meta_value__billing_interval', 'wc_orders_meta_meta_key__billing_period_meta_value__billing_period', 'wc_orders_payment_method_title', 'wc_orders_meta_meta_key__schedule_next_payment_meta_value__schedule_next_payment', 'wc_orders_meta_meta_key__schedule_end_meta_value__schedule_end' ) ) ) : $dashboard_model; } /** * Function hooked to filter for modifying data model. * * @param array $data_model default generated data model. * @param array $data_col_params function arguments. * @return array $data_model updated data model. */ public function subscriptions_data_model( $data_model = array(), $data_col_params = array() ) { return ( is_callable( array( 'Smart_Manager_Shop_Order', 'generate_data_model' ) ) ) ? Smart_Manager_Shop_Order::generate_data_model( $data_model, array( 'col_params' => $data_col_params, 'curr_obj' => $this, 'status_func' => 'wcs_get_subscription_statuses', 'meta_date_getter_func' => 'get_date', 'curr_obj_getter_func' => 'wcs_get_subscription', 'curr_obj_class_nm' => 'WC_Subscription' ) ) : $data_model; } /** * Function hooked to filter for modifying query clauses. * * @param array $clauses query clauses. * @param object $args OrdersTableQuery object. * @param array $args Query args. * * @return array $clauses array of modified query clauses. */ public function modify_subscriptions_table_query_clauses( $clauses = array(), $query_obj = null, $args = array() ){ return ( is_callable( array( 'Smart_Manager_Shop_Order', 'modify_table_query_clauses' ) ) ) ? Smart_Manager_Shop_Order::modify_table_query_clauses( $clauses, array( 'curr_obj' => $this, 'query_obj' => $query_obj, 'query_args' => $args ) ) : $clauses; } /** * Function hooked to filter for processing inline update. * * @param array $edited_data array of edited rows. * @param array $params function arguments. * @return void. */ public function subscriptions_inline_update( $edited_data = array(), $params = array() ) { ( is_callable( array( 'Smart_Manager_Shop_Order', 'process_inline_update' ) ) ) ? Smart_Manager_Shop_Order::process_inline_update( $edited_data, array_merge( array( 'curr_obj' => $this, 'meta_date_getter_func' => 'get_date', 'meta_date_setter_func' => 'update_dates' ), $params ) ) : ''; } /** * Function for modifying query for getting ids in case of 'entire store' option. * * @param string $query query for fetching the ids when entire store option is selected. * @return string updated query for fetching the ids when entire store option is selected. */ public function get_entire_store_ids_query( $query = '' ) { global $wpdb; return $wpdb->prepare( "SELECT id FROM {$wpdb->prefix}wc_orders WHERE status != 'trash' AND type = %s", 'shop_subscription' ); } /** * AJAX handler function for copy from operator for bulk edit. * * @param array $args bulk edit params. * @return string|array json encoded string or array of values. */ public function get_batch_update_copy_from_record_ids( $args = array() ) { return ( is_callable( array( 'Smart_Manager_Pro_Shop_Order', 'get_copy_from_record_ids' ) ) ) ? Smart_Manager_Pro_Shop_Order::get_copy_from_record_ids( array_merge( array( 'curr_obj' => $this, 'type' => 'shop_subscription', 'field_title_prefix' => 'Subscription' ), $args ) ) : ''; } /** * Function to get prev_val * * @param string $prev_val received prev_val. * @param array $args array has id, table name, column name. * @return string $prev_val updated prev_val */ public static function get_previous_value( $prev_val = '', $args = array() ) { return ( is_callable( array( 'Smart_Manager_Shop_Order', 'get_previous_value' ) ) ) ? Smart_Manager_Shop_Order::get_previous_value( $prev_val, array_merge( $args, array( 'curr_obj_getter_func' => 'wcs_get_subscription', 'curr_obj_class_nm' => 'WC_Subscription', 'meta_date_getter_func' => 'get_date' ) ) ) : $prev_val; } /** * Function hooked to process bulk edits. * * @param boolean $update_flag default update flag. * @param array $args function arguments. * @return boolean $update_flag updated update flag. */ public static function post_batch_update_db_updates( $update_flag = false, $args = array() ) { return ( is_callable( array( 'Smart_Manager_Pro_Shop_Order', 'post_batch_update_db_updates' ) ) ) ? Smart_Manager_Pro_Shop_Order::post_batch_update_db_updates( $update_flag, array_merge( $args, array( 'curr_obj_getter_func' => 'wcs_get_subscription', 'curr_obj_class_nm' => 'WC_Subscription', 'meta_date_getter_func' => 'get_date', 'meta_date_setter_func' => 'update_dates' ) ) ) : $update_flag; } /** * Modifying args for meta columns. * @param array $args args to get column model. * @return array Updated args values for meta columns */ public function update_meta_col_model( $args = array()) { if ( empty( $args['table_nm'] ) || ( empty( $args['col'] ) ) ) { return $args; } switch( $args['col'] ){ case '_billing_interval': $col = ( function_exists('wcs_get_subscription_period_interval_strings') ) ? wcs_get_subscription_period_interval_strings() : array(); if( empty( $col ) ){ return $args; } return array_merge( $args, $this->generate_dropdown_col_model( $args, $col ) ); case '_billing_period': $col = ( function_exists('wcs_get_subscription_period_strings') ) ? wcs_get_subscription_period_strings() : array(); if( empty( $col ) ){ return $args; } return array_merge( $args, $this->generate_dropdown_col_model( $args, $col ) ); } return $args; } } } pro/classes/class-smart-manager-pro-post.php000064400000002430147600337620015143 0ustar00plugin_path = untrailingslashit( plugin_dir_path( __FILE__ ) ); if ( file_exists(SM_PLUGIN_DIR_PATH . '/classes/class-smart-manager-post.php') ) { include_once SM_PLUGIN_DIR_PATH . '/classes/class-smart-manager-post.php'; $this->post = new Smart_Manager_Post( $dashboard_key ); } } public static function actions() { } public function __call( $function_name, $arguments = array() ) { if( empty( $this->post ) ) { return; } if ( ! is_callable( array( $this->post, $function_name ) ) ) { return; } if ( ! empty( $arguments ) ) { return call_user_func_array( array( $this->post, $function_name ), $arguments ); } else { return call_user_func( array( $this->post, $function_name ) ); } } } }pro/classes/class-smart-manager-pro-utils.php000064400000000127147600337620015317 0ustar00plugin_path = untrailingslashit( plugin_dir_path( __FILE__ ) ); if ( file_exists(SM_PLUGIN_DIR_PATH . '/classes/class-smart-manager-shop-coupon.php') ) { include_once SM_PLUGIN_DIR_PATH . '/classes/class-smart-manager-shop-coupon.php'; $this->shop_coupon = new Smart_Manager_Shop_Coupon( $dashboard_key ); } add_filter( 'sm_dashboard_model', array( &$this, 'coupons_dashboard_model' ), 10, 2 ); add_filter( 'sm_batch_update_copy_from_ids_select', array( &$this, 'sm_batch_update_copy_from_ids_select' ), 10, 2 ); add_filter( 'sm_data_model', array( &$this, 'coupons_data_model' ), 10, 2 ); add_filter( 'sm_required_cols', array( &$this, 'sm_beta_required_cols' ), 10, 1 ); add_filter( 'sm_inline_update_pre', array( &$this, 'coupons_inline_update_pre' ), 10, 1 ); } public static function actions() { add_filter( 'sm_beta_post_batch_process_args', __CLASS__. '::coupons_post_batch_process_args', 10, 1 ); } public function __call( $function_name, $arguments = array() ) { if( empty( $this->shop_coupon ) ) { return; } if ( ! is_callable( array( $this->shop_coupon, $function_name ) ) ) { return; } if ( ! empty( $arguments ) ) { return call_user_func_array( array( $this->shop_coupon, $function_name ), $arguments ); } else { return call_user_func( array( $this->shop_coupon, $function_name ) ); } } public static function coupons_post_batch_process_args( $args ) { if( !empty( $args['col_nm'] ) && $args['col_nm'] == 'sa_cbl_locations_lookup_in' ) { $args['value'] = array( 'address' => $args['value'] ); } if ( empty( $args['table_nm'] ) || 'postmeta' !== $args['table_nm'] || ! in_array( $args['col_nm'], array( 'product_categories', 'exclude_product_categories' ) ) || in_array( $args['operator'], array( 'copy_from', 'copy_from_field' ) ) ) { return $args; } $action = ( ! empty( $args['operator'] ) ) ? $args['operator'] : ''; $value = ( ! empty( $args['value'] ) ) ? intval( $args['value'] ) : 0; $current_product_cat_ids = array(); $product_cat_ids = array( $value ); if ( ! empty( $action ) && 'set_to' !== $action ) { $current_product_cat_ids = get_post_meta( intval( $args['id'] ), $args['col_nm'] ); if ( empty( $current_product_cat_ids ) || !is_array( $current_product_cat_ids ) ) { return $args; } foreach ( $current_product_cat_ids as $current_product_cat_id ) { $product_cat_ids = $current_product_cat_id; if( $action == 'add_to' ) { if ( ! is_array( $product_cat_ids ) || in_array( $value, $product_cat_ids ) ) { continue; } $product_cat_ids[] = $value; } else if ( $action == 'remove_from' ) { $key = array_search( $value, $product_cat_ids ); if( false !== $key ) { unset( $product_cat_ids[ $key ] ); } } } } $args['value'] = $product_cat_ids; return $args; } public function sm_beta_required_cols( $cols ) { $required_cols = array( 'posts_post_title' ); return array_merge( $cols, $required_cols ); } //function for modifying edited data before updating public function coupons_inline_update_pre( $edited_data ) { if (empty($edited_data)) return $edited_data; global $wpdb; $prod_title_ids = array(); foreach ($edited_data as $key => $edited_row) { if( empty( $key ) ) { continue; } if( !empty( $edited_row['postmeta/meta_key=sa_cbl_locations_lookup_in/meta_value=sa_cbl_locations_lookup_in'] ) ) { $edited_data[$key]['postmeta/meta_key=sa_cbl_locations_lookup_in/meta_value=sa_cbl_locations_lookup_in'] = array( 'address' => $edited_data[$key]['postmeta/meta_key=sa_cbl_locations_lookup_in/meta_value=sa_cbl_locations_lookup_in'] ); } if ( ! empty( $edited_row['postmeta/meta_key=product_categories/meta_value=product_categories'] ) ) { $edited_data[ $key ]['postmeta/meta_key=product_categories/meta_value=product_categories'] = array_filter( explode( ",", $edited_data[ $key ]['postmeta/meta_key=product_categories/meta_value=product_categories'] ) ); } if ( ! empty( $edited_row['postmeta/meta_key=exclude_product_categories/meta_value=exclude_product_categories'] ) ) { $edited_data[ $key ]['postmeta/meta_key=exclude_product_categories/meta_value=exclude_product_categories'] = array_filter( explode( ",", $edited_data[ $key ]['postmeta/meta_key=exclude_product_categories/meta_value=exclude_product_categories'] ) ); } } return $edited_data; } public function generate_select2_col_model( $column, $args ) { $options = array( 'allowClear' => true, 'placeholder' => '', 'multiple' => true, 'dropdownCssClass'=> 'smSelect2Drop', 'width'=> 'resolve' ); if( empty( $args['values'] ) ) { $options ['loadDataDynamically'] = true; $options ['func_nm'] = ( ! empty( $args['func_nm'] ) ) ? $args['func_nm'] : ''; $options ['minimumInputLength'] = 3; $args['values'] = array(); } else { $options['data'] = $args['values']; } $column['type'] = 'dropdown'; $column['editor'] = 'select2'; $column['editable'] = false; $column['renderer'] = 'select2Renderer'; $column['select2Options'] = $options; $column['search_values'] = array(); foreach( $args['values'] as $option_value ) { $column['search_values'][] = array( 'key' => $option_value['id'], 'value' => $option_value['text'] ); } return $column; } public function coupons_dashboard_model ($dashboard_model, $dashboard_model_saved) { global $wp_version; $date_columns = array( 'date_expires' ); $time_columns = array( 'wc_sc_expiry_time' ); $available_shipping_methods = $available_payment_methods = $attribute_taxonomies = $taxonomy_names = $taxonomy_obj = $attribute_labels = array(); $cat_values = $editable_roles_values = $shipping_method_values = $payment_method_values = $attribute_values = $all_products = array(); if ( ( file_exists( WP_PLUGIN_DIR . '/woocommerce/woocommerce.php' ) ) && ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) ) { $available_shipping_methods = WC()->shipping->get_shipping_methods(); $available_payment_methods = WC()->payment_gateways->get_available_payment_gateways(); //Code for getting all product attributes if( is_callable( 'wc_get_attribute_taxonomies' ) ) { $attribute_taxonomies = wc_get_attribute_taxonomies(); } if( !empty( $attribute_taxonomies ) ) { foreach( $attribute_taxonomies as $attribute_taxonomy ) { if( is_callable( 'wc_attribute_taxonomy_name' ) ) { $attribute_labels [ wc_attribute_taxonomy_name( $attribute_taxonomy->attribute_name ) ] = $attribute_taxonomy->attribute_label; } } $taxonomy_names = array_keys( $attribute_labels ); } } $taxonomy_names[] = 'product_cat'; if (version_compare ( $wp_version, '4.5', '>=' )) { $taxonomy_obj = get_terms( array( 'taxonomy' => $taxonomy_names, 'get' => 'all', )); } else { $taxonomy_obj = get_terms( $taxonomy_names ); } $editable_roles = get_editable_roles(); if( !empty( $taxonomy_obj ) ) { foreach( $taxonomy_obj as $obj ) { if( $obj->taxonomy == 'product_cat' ) { $cat_values[] = array( 'id' => $obj->term_id, 'text' => esc_html( $obj->name ) ); } else { $attribute_values[] = array( 'id' => $obj->term_id, 'text' => ( !empty( $attribute_labels[ $obj->taxonomy ] ) ? $attribute_labels[ $obj->taxonomy ] : '' ).' --> '. $obj->name ); } } } if ( ! empty( $taxonomy_obj )) { $terms_val = $this->get_parent_term_values( array( 'taxonomy_obj' => $taxonomy_obj, 'include_taxonomy' => 'product_cat' // include only 'product_cat' taxonomy. ) ); } if( !empty( $editable_roles ) ) { foreach( $editable_roles as $role_id => $role ) { $role_name = translate_user_role( $role['name'] ); $editable_roles_values[] = array( 'id' => $role_id, 'text' => esc_html( $role_name ) ); } } if( !empty( $available_shipping_methods ) ) { foreach( $available_shipping_methods as $shipping_method ) { $shipping_method_values[] = array( 'id' => $shipping_method->id, 'text' => esc_html( $shipping_method->get_method_title() ) ); } } if( !empty( $available_payment_methods ) ) { foreach( $available_payment_methods as $payment_method ) { $payment_method_values[] = array( 'id' => $payment_method->id, 'text' => esc_html( $payment_method->get_title() ) ); } } $all_products = $this->get_products(); $multiselect_serialized_columns = array( 'wc_sc_user_role_ids' => array( 'title' => __( 'Allowed user roles', 'smart-manager-for-wp-e-commerce' ), 'values' => $editable_roles_values ) , 'wc_sc_shipping_method_ids' => array( 'title' => __( 'Shipping methods', 'smart-manager-for-wp-e-commerce' ), 'values' => $shipping_method_values ) , 'wc_sc_payment_method_ids' => array( 'title' => __( 'Payment Methods', 'smart-manager-for-wp-e-commerce' ), 'values' => $payment_method_values ) , ); $multiselect_non_serialized_columns = array( 'wc_sc_product_attribute_ids' => array( 'title' => __( 'Product Attributes', 'smart-manager-for-wp-e-commerce' ), 'values' => $attribute_values, 'separator' => '|' ), 'wc_sc_exclude_product_attribute_ids' => array( 'title' => __( 'Exclude Attributes', 'smart-manager-for-wp-e-commerce' ), 'values' => $attribute_values, 'separator' => '|' ), 'product_ids' => array( 'title' => __( 'Products', 'smart-manager-for-wp-e-commerce' ), 'values' => $all_products), 'exclude_product_ids' => array( 'title' => __( 'Exclude products', 'smart-manager-for-wp-e-commerce' ), 'values' => $all_products), ); $numeric_columns = array( 'wc_sc_max_discount' => __( 'Max discount', 'smart-manager-for-wp-e-commerce' ) ); $column_titles = array( 'sc_coupon_validity' => __( 'Coupon Validity', 'smart-manager-for-wp-e-commerce' ), 'validity_suffix' => __( 'Validity Suffix', 'smart-manager-for-wp-e-commerce' ), 'coupon_title_prefix' => __( 'Coupon Title Prefix', 'smart-manager-for-wp-e-commerce' ), 'coupon_title_suffix' => __( 'Coupon Title Suffix', 'smart-manager-for-wp-e-commerce' ), 'wc_coupon_message' => __( 'Display message', 'smart-manager-for-wp-e-commerce' ), ); $checkbox_yes_no_columns = array( 'sc_disable_email_restriction' => __( 'Disable Email Restriction', 'smart-manager-for-wp-e-commerce' ), 'exclude_sale_items' => __( 'Exclude sale items', 'smart-manager-for-wp-e-commerce' ), 'individual_use' => __( 'Individual use only', 'smart-manager-for-wp-e-commerce' ), 'wc_email_message' => __( 'Email message?', 'smart-manager-for-wp-e-commerce' ), 'free_shipping' => __( 'Allow free shipping', 'smart-manager-for-wp-e-commerce' ), 'auto_generate_coupon' => __( 'Auto Generate Coupon', 'smart-manager-for-wp-e-commerce' ), 'is_pick_price_of_product' => __( 'Is Pick Price of Product', 'smart-manager-for-wp-e-commerce' ), 'sc_is_visible_storewide' => __( 'Coupon Is Visible Storewide', 'smart-manager-for-wp-e-commerce' ), 'sc_restrict_to_new_user' => __( 'For new user only?', 'smart-manager-for-wp-e-commerce' ), ); $column_model = &$dashboard_model['columns']; $coupon_shareable_link_index = sm_multidimesional_array_search('custom/coupon_shareable_link', 'src', $column_model); foreach( $column_model as $key => &$column ) { if ( empty( $column['src'] ) ) continue; $src_exploded = explode("/",$column['src']); if (empty($src_exploded)) { $col_nm = $column['src']; } if ( sizeof($src_exploded) > 2 ) { $col_table = $src_exploded[0]; $cond = explode("=",$src_exploded[1]); if (sizeof($cond) == 2) { $col_nm = $cond[1]; } } else { $col_nm = $src_exploded[1]; $col_table = $src_exploded[0]; } if( empty( $col_nm ) ) { continue; } switch( $col_nm ) { case 'customer_email': $column['key'] = __( 'Allowed emails', 'smart-manager-for-wp-e-commerce' ); $column['name'] = $column['key']; $column['editor'] = 'text'; break; case ( !empty( $multiselect_serialized_columns[ $col_nm ] ) ): $column['key'] = $multiselect_serialized_columns[ $col_nm ]['title']; $column['name'] = $column['key']; $multiselect_values = $multiselect_serialized_columns[ $col_nm ]['values']; $column = $this->generate_select2_col_model( $column, array( 'values' => $multiselect_values ) ); break; case ( !empty( $multiselect_non_serialized_columns[ $col_nm ] ) ): $column['key'] = $multiselect_non_serialized_columns[ $col_nm ]['title']; $column['name'] = $column['key']; $column['separator'] = ( !empty( $multiselect_non_serialized_columns[ $col_nm ]['separator'] ) ? $multiselect_non_serialized_columns[ $col_nm ]['separator'] : ',' ); $multiselect_values = $multiselect_non_serialized_columns[ $col_nm ]['values']; $column = $this->generate_select2_col_model( $column, array( 'values' => $multiselect_values ) ); break; case ( !empty( $numeric_columns[ $col_nm ] ) ): $column['key'] = $numeric_columns[ $col_nm ]; $column['name'] = $column['key']; $column['type'] = 'numeric'; $column['editor'] = 'customNumericEditor'; break; case ( !empty( $checkbox_yes_no_columns[ $col_nm ] ) ): $column['key'] = $checkbox_yes_no_columns[ $col_nm ]; $column['name'] = $column['key']; $column['type'] = 'checkbox'; $column['editor'] = $column['type']; $column['checkedTemplate'] = 'yes'; $column['uncheckedTemplate'] = 'no'; $column['width'] = 30; break; case ( !empty( $column_titles[ $col_nm ] ) ): $column['key'] = $column['name'] = $column_titles[ $col_nm ]; break; case 'sa_cbl_locations_lookup_in': $column['key'] = $column['name'] = __( 'Address to look in', 'smart-manager-for-wp-e-commerce' ); $values = array( 'billing' => __( 'Billing', 'smart-manager-for-wp-e-commerce'), 'shipping' => __( 'Shipping', 'smart-manager-for-wp-e-commerce' ) ); $column = $this->generate_dropdown_col_model( $column, $values ); break; case 'date_expires': $column['key'] = $column['name'] = __( 'Coupon expiry date', 'smart-manager-for-wp-e-commerce' ); $column['type'] = $column['editor'] = 'sm.date'; $column['date_type'] = 'timestamp'; break; case 'wc_sc_expiry_time': $column['key'] = $column['name'] = __( 'Coupon expiry time', 'smart-manager-for-wp-e-commerce' ); $column['type'] = $column['editor'] = 'sm.time'; $column['date_type'] = 'timestamp'; break; case ( in_array( $col_nm, array( 'product_categories', 'exclude_product_categories' ) ) ): $column['values'] = ( ! empty( $this->terms_val_parent['product_cat'] ) ) ? $this->terms_val_parent['product_cat'] : $cat_values; $column['type'] = 'sm.multilist'; $column['title'] = ( 'product_categories' === $col_nm ) ? __( 'Product categories', 'smart-manager-for-wp-e-commerce' ) : __( 'Exclude categories', 'smart-manager-for-wp-e-commerce' ); break; } } if( empty( $coupon_shareable_link_index ) ) { $index = sizeof($column_model); $index++; $column_model [$index]['src'] = 'custom/coupon_shareable_link'; $column_model [$index]['data'] = sanitize_title(str_replace('/', '_', $column_model [$index]['src'])); // generate slug using the wordpress function if not given $column_model [$index]['key'] = $column_model[$index]['name'] = __( 'Coupon shareable link', 'smart-manager-for-wp-e-commerce' ); $column_model [$index]['type'] = 'text'; $column_model [$index]['renderer'] = 'html'; $column_model [$index]['hidden'] = false; $column_model [$index]['editable'] = false; $column_model [$index]['editor'] = false; $column_model [$index]['batch_editable'] = false; $column_model [$index]['sortable'] = true; $column_model [$index]['resizable'] = true; $column_model [$index]['allow_showhide'] = true; $column_model [$index]['exportable'] = true; $column_model [$index]['searchable'] = false; $column_model [$index]['width'] = 100; $column_model [$index]['save_state'] = true; $column_model [$index]['values'] = array(); $column_model [$index]['search_values'] = array(); } if (!empty($dashboard_model_saved)) { $col_model_diff = sm_array_recursive_diff($dashboard_model_saved,$dashboard_model); } //clearing the transients before return if (!empty($col_model_diff)) { delete_transient( 'sa_sm_'.$this->dashboard_key ); } return $dashboard_model; } public function get_products( $params = array() ) { $args = array_merge( $params, array( 'dashboard_key' => array('product', 'product_variation'), 'search_term' => ( !empty( $this->req_params['searchTerm'] ) ? $this->req_params['searchTerm'] : '' ), 'is_ajax' => false ) ); $data = $this->get_batch_update_copy_from_record_ids( $args ); $products = array(); if( !empty( $data ) ) { foreach( $data as $id => $title ) { $products[] = array( 'id' => $id, 'text' => esc_html( $title ) ); } } return $products; } public function coupons_data_model ($data_model, $data_col_params) { global $wpdb, $current_user; if(empty($data_model) || empty($data_model['items'])) { return $data_model; } $product_ids = array(); $include_product_ids = array(); $exclude_product_ids = array(); foreach( $data_model['items'] as $key => $item ) { if( !empty( $item['postmeta_meta_key_sa_cbl_locations_lookup_in_meta_value_sa_cbl_locations_lookup_in'] ) ) { $value_obj = maybe_unserialize( $item['postmeta_meta_key_sa_cbl_locations_lookup_in_meta_value_sa_cbl_locations_lookup_in'] ); $data_model['items'][$key]['postmeta_meta_key_sa_cbl_locations_lookup_in_meta_value_sa_cbl_locations_lookup_in'] = ( !empty( $value_obj['address'] ) ? $value_obj['address'] : 'billing' ); } if( empty( $item['custom_coupon_shareable_link'] ) && !empty( $data_model['items'][$key]['posts_post_title'] ) ) { $link = home_url( '/?coupon-code=' . $data_model['items'][$key]['posts_post_title'] ); $data_model['items'][$key]['custom_coupon_shareable_link'] = ( !empty( $this->req_params['cmd'] ) && $this->req_params['cmd'] != 'get_export_csv' && $this->req_params['cmd'] != 'get_print_invoice' ) ? "".$link."" : $link; } if ( empty( $data_col_params ) || ! is_array( $data_col_params ) || ! isset( $data_col_params['data_cols_multilist'] ) || ! is_array( $data_col_params['data_cols_multilist'] ) ) { continue; } $multilist_separator = ', '; foreach( $data_col_params['data_cols_multilist'] as $col ) { $vals = maybe_unserialize( $item[ 'postmeta_meta_key_'.$col.'_meta_value_'.$col.'' ] ); $data_model['items'][$key]['postmeta_meta_key_'.$col.'_meta_value_'.$col.''] = ''; if ( empty( $vals ) || ! is_array( $vals ) ) { continue; } foreach ( $vals as $val ) { $term = get_term( $val ); if ( empty( $term ) ) { continue; } $term_name = ucwords( $term->name ); if( empty( $data_model ['items'][$key][ 'postmeta_meta_key_'.$col.'_meta_value_'.$col.'' ] ) ) { $data_model ['items'][$key][ 'postmeta_meta_key_'.$col.'_meta_value_'.$col.'' ] = $term_name; } else { $data_model ['items'][$key][ 'postmeta_meta_key_'.$col.'_meta_value_'.$col.'' ] .= $multilist_separator . "" . $term_name; } } } } return $data_model; } //Function for overriding the select clause for fetching the ids for batch update 'copy from' functionality public function sm_batch_update_copy_from_ids_select( $select, $args ) { if( empty( $args['dashboard_key'] ) ) { return $select; } $select = " SELECT ID AS id, ( CASE WHEN (post_excerpt != '' AND post_type = 'product_variation') THEN CONCAT(post_title, ' - ( ', post_excerpt, ' ) ') ELSE post_title END ) as title "; return $select; } } } pro/classes/class-smart-manager-pro-wc-user-membership.php000064400000026722147600337620017706 0ustar00hooks(); $this->req_params = (!empty($_REQUEST)) ? $_REQUEST : array(); $this->plugin_path = untrailingslashit( plugin_dir_path( __FILE__ ) ); } public static function actions() { } public function hooks() { add_filter('sm_dashboard_model',array(&$this,'wc_user_membership_dashboard_model'),10,2); add_filter('sm_data_model',array(&$this,'wc_user_membership_data_model'),10,2); } public static function generate_members_custom_column_model( $column_model ) { $custom_columns = array( 'name', 'email', 'plan' ); $index = sizeof($column_model); foreach( $custom_columns as $col ) { $src = 'custom/'.$col; $col_index = sm_multidimesional_array_search ($src, 'src', $column_model); if( empty( $col_index ) ) { $column_model [$index] = array(); $column_model [$index]['src'] = $src; $column_model [$index]['data'] = sanitize_title(str_replace('/', '_', $column_model [$index]['src'])); // generate slug using the wordpress function if not given $column_model [$index]['name'] = __(ucwords(str_replace('_', ' ', $col)), 'smart-manager-for-wp-e-commerce'); $column_model [$index]['key'] = $column_model [$index]['name']; $column_model [$index]['type'] = 'text'; $column_model [$index]['hidden'] = false; $column_model [$index]['editable'] = false; $column_model [$index]['editor'] = false; $column_model [$index]['batch_editable'] = false; $column_model [$index]['sortable'] = true; $column_model [$index]['resizable'] = true; $column_model [$index]['allow_showhide'] = true; $column_model [$index]['exportable'] = true; $column_model [$index]['searchable'] = false; $column_model [$index]['save_state'] = true; $column_model [$index]['values'] = array(); $column_model [$index]['search_values'] = array(); $index++; } } return $column_model; } public function wc_user_membership_dashboard_model ($dashboard_model, $dashboard_model_saved) { $visible_columns = array( 'ID', 'name', 'email', 'plan', 'post_date', 'post_status', '_start_date', '_end_date', '_renewal_login_token', 'link' ); $readonly_columns = array( 'name', 'email', 'plan', 'link' ); $numeric_columns = array( 'id', 'post_author', 'post_parent', 'menu_order', 'comment_count', '_edit_last', 'post_id' ); $datetime_columns = array( 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt', '_end_date', '_start_date' ); $post_status_col_index = sm_multidimesional_array_search('posts_post_status', 'data', $dashboard_model['columns']); $user_membership_statuses = $this->get_user_membership_statuses(); $order_statuses_keys = ( !empty( $user_membership_statuses ) ) ? array_keys($user_membership_statuses) : array(); $dashboard_model['columns'][$post_status_col_index]['defaultValue'] = ( !empty( $user_membership_statuses_keys[0] ) ) ? $user_membership_statuses_keys[0] : 'wc-pending'; $dashboard_model['columns'][$post_status_col_index]['save_state'] = true; $dashboard_model['columns'][$post_status_col_index]['values'] = $user_membership_statuses; $dashboard_model['columns'][$post_status_col_index]['selectOptions'] = $user_membership_statuses; //for inline editing $color_codes = array( 'green' => array( 'wcm-active', 'wcm-free_trial', 'wcm-complimentary' ), 'red' => array( 'wcm-expired', 'wcm-cancelled' ), 'orange' => array( 'wcm-delayed', 'wcm-pending', 'wcm-paused' ) ); $dashboard_model['columns'][$post_status_col_index]['colorCodes'] = apply_filters( 'sm_'.$this->dashboard_key.'_status_color_codes', $color_codes ); $dashboard_model['columns'][$post_status_col_index]['search_values'] = array(); foreach ($user_membership_statuses as $key => $value) { $dashboard_model['columns'][$post_status_col_index]['search_values'][] = array('key' => $key, 'value' => $value); } if( is_callable( array( 'Smart_Manager_Pro_WC_User_Membership', 'generate_members_custom_column_model' ) ) ) { $dashboard_model['columns'] = self::generate_members_custom_column_model( $dashboard_model['columns'] ); } $column_model = &$dashboard_model['columns']; foreach ( $column_model as $key => &$column ) { if (empty($column['src'])) continue; $src_exploded = explode("/",$column['src']); if (empty($src_exploded)) { $src = $column['src']; } if ( sizeof($src_exploded) > 2) { $col_table = $src_exploded[0]; $cond = explode("=",$src_exploded[1]); if (sizeof($cond) == 2) { $src = $cond[1]; } } else { $src = $src_exploded[1]; $col_table = $src_exploded[0]; } if ( empty( $dashboard_model_saved ) ) { //Code for unsetting the position for hidden columns if ( ! empty( $column['position'] ) ) { unset( $column['position'] ); } $position = array_search( $src, $visible_columns ); if ( $position !== false ) { $column['position'] = $position + 1; $column['hidden'] = false; } else { $column['hidden'] = true; } } if ( ! empty( $src ) ) { if ( empty( $dashboard_model_saved ) ) { if ( in_array( $src, $numeric_columns ) ) { $column['type'] = 'numeric'; $column['editor'] = 'customNumericEditor'; } elseif ( in_array( $src, $datetime_columns ) ) { $column['type'] = 'sm.datetime'; $column['editor'] = $column['type']; } elseif ( in_array( $src, $readonly_columns ) ) { $column['editor'] = false; } switch ( $src ) { case '_start_date': $column['name'] = __( 'Member since', 'smart-manager-for-wp-e-commerce' ); $column['key'] = __( 'Member since', 'smart-manager-for-wp-e-commerce' ); break; case '_end_date': $column['name'] = __( 'Expires' , 'smart-manager-for-wp-e-commerce'); $column['key'] = __( 'Expires' , 'smart-manager-for-wp-e-commerce'); break; } } } } if (!empty($dashboard_model_saved)) { $col_model_diff = sm_array_recursive_diff( $dashboard_model_saved, $dashboard_model ); } //clearing the transients before return if (!empty($col_model_diff)) { delete_transient( 'sa_sm_'.$this->dashboard_key ); } return $dashboard_model; } public static function generate_members_custom_column_data( $data_model, $params ) { global $wpdb; $query = "SELECT ID, post_author, post_parent FROM {$wpdb->posts} WHERE 1"; $member_ids = ( ! empty( $data_model['items'] ) ) ? wp_list_pluck( $data_model['items'], 'posts_id' ) : array(); $how_many = count( $member_ids ); $placeholders = array_fill( 0, $how_many, '%d' ); $query .= $wpdb->prepare( ' AND ID IN ( ' . implode( ',', $placeholders ) . ' )', $member_ids ); // phpcs:ignore $results = $wpdb->get_results( $query, ARRAY_A ); $membership_to_user = ( ! empty( $results ) ) ? wp_list_pluck( $results, 'post_author', 'ID' ) : array(); $membership_to_plan = ( ! empty( $results ) ) ? wp_list_pluck( $results, 'post_parent', 'ID' ) : array(); $user_ids = array_unique( array_values( $membership_to_user ) ); $plan_ids = array_unique( array_values( $membership_to_plan ) ); $authors_data = self::get_authors_data( $user_ids ); $plan_data = self::get_membership_plan_data( $plan_ids ); if ( !empty( $data_model['items'] ) ) { foreach( $data_model['items'] as $key => $member_data ) { $member_id = ( ! empty( $member_data['posts_id'] ) ) ? $member_data['posts_id'] : 0; $data_model['items'][ $key ]['custom_name'] = ( ! empty( $authors_data[ $membership_to_user[ $member_id ] ]['name'] ) ) ? $authors_data[ $membership_to_user[ $member_id ] ]['name'] : ''; $data_model['items'][ $key ]['custom_email'] = ( ! empty( $authors_data[ $membership_to_user[ $member_id ] ]['email'] ) ) ? $authors_data[ $membership_to_user[ $member_id ] ]['email'] : ''; $data_model['items'][ $key ]['custom_plan'] = ( ! empty( $plan_data[ $membership_to_plan[ $member_id ] ]['plan_name'] ) ) ? $plan_data[ $membership_to_plan[ $member_id ] ]['plan_name'] : ''; } } return $data_model; } public function wc_user_membership_data_model( $data_model, $data_col_params ) { if( is_callable( array( 'Smart_Manager_Pro_WC_User_Membership', 'generate_members_custom_column_data' ) ) ) { $data_model = self::generate_members_custom_column_data( $data_model, $this->req_params ); } return $data_model; } public function get_user_membership_statuses() { $user_membership_statuses = ( function_exists( 'wc_memberships_get_user_membership_statuses' ) ) ? wc_memberships_get_user_membership_statuses() : array(); $statuses = array(); if ( ! empty( $user_membership_statuses ) ) { foreach ( $user_membership_statuses as $slug => $status ) { $statuses[ $slug ] = $status['label']; } } return $statuses; } public static function get_authors_data( $user_ids = array() ) { $authors_data = array(); if ( ! empty( $user_ids ) ) { global $wpdb; $query = "SELECT ID AS user_id, display_name AS name, user_email AS email FROM {$wpdb->users} WHERE 1"; $how_many = count( $user_ids ); $placeholders = array_fill( 0, $how_many, '%d' ); $query .= $wpdb->prepare( ' AND ID IN ( ' . implode( ',', $placeholders ) . ' )', $user_ids ); // phpcs:ignore $results = $wpdb->get_results( $query, ARRAY_A ); if ( ! empty( $results ) ) { foreach ( $results as $result ) { if ( empty( $authors_data[ $result['user_id'] ] ) || ! is_array( $authors_data[ $result['user_id'] ] ) ) { $authors_data[ $result['user_id'] ] = array(); } $authors_data[ $result['user_id'] ]['name'] = ( ! empty( $result['name'] ) ) ? $result['name'] : ''; $authors_data[ $result['user_id'] ]['email'] = ( ! empty( $result['email'] ) ) ? $result['email'] : ''; } } } return $authors_data; } public static function get_membership_plan_data( $plan_ids = array() ) { $plan_data = array(); if ( ! empty( $plan_ids ) ) { global $wpdb; $query = "SELECT ID AS plan_id, post_title AS plan_name FROM {$wpdb->posts} WHERE 1"; $how_many = count( $plan_ids ); $placeholders = array_fill( 0, $how_many, '%d' ); $query .= $wpdb->prepare( ' AND ID IN ( ' . implode( ',', $placeholders ) . ' )', $plan_ids ); // phpcs:ignore $results = $wpdb->get_results( $query, ARRAY_A ); if ( ! empty( $results ) ) { foreach ( $results as $result ) { if ( empty( $plan_data[ $result['plan_id'] ] ) || ! is_array( $plan_data[ $result['plan_id'] ] ) ) { $plan_data[ $result['plan_id'] ] = array(); } $plan_data[ $result['plan_id'] ]['plan_name'] = ( ! empty( $result['plan_name'] ) ) ? $result['plan_name'] . ' (#' . $result['plan_id'] . ')' : ''; } } } return $plan_data; } } } pro/classes/class-smart-manager-pro-shop-order.php000064400000055257147600337620016257 0ustar00plugin_path = untrailingslashit( plugin_dir_path( __FILE__ ) ); $this->custom_product_search_cols = array( 'sku' => 'postmeta/_sku', 'title' => 'posts/post_title' ); $this->custom_search_cols = array( 'coupons_used' => 'woocommerce_order_items/coupon', 'shipping_method' => 'woocommerce_order_items/shipping' ); if ( file_exists(SM_PLUGIN_DIR_PATH . '/classes/class-smart-manager-shop-order.php') ) { include_once SM_PLUGIN_DIR_PATH . '/classes/class-smart-manager-shop-order.php'; $this->shop_order = new Smart_Manager_Shop_Order( $dashboard_key ); } add_filter( 'sm_dashboard_model', array( &$this, 'orders_dashboard_model' ), 12, 2 ); add_filter( 'sm_search_query_formatted', array( &$this, 'order_itemmeta_search_query' ), 12, 2 ); // Filters for modifying advanced search query clauses add_filter( 'sm_search_query_woocommerce_order_itemmeta_select', array( &$this, 'orders_advanced_search_select' ), 12, 2 ); add_filter( 'sm_search_query_woocommerce_order_itemmeta_from', array( &$this, 'orders_advanced_search_from' ), 12, 2 ); add_filter( 'sm_search_query_woocommerce_order_itemmeta_join', array( &$this, 'orders_advanced_search_join' ), 12, 2 ); add_filter( 'sm_search_woocommerce_order_items_cond', array( &$this, 'orders_advanced_search_flat_table_cond' ), 12, 2 ); add_action( 'sm_advanced_search_processing_complete', array( &$this, 'orders_advanced_search_post_processing' ), 12, 1 ); if ( ! empty( Smart_Manager::$sm_is_woo79 ) ) { add_filter( 'sm_beta_background_entire_store_ids_query', array( $this,'get_entire_store_ids_query' ), 12, 1 ); } } public static function actions() { add_filter( 'sm_beta_batch_update_prev_value', 'Smart_Manager_Shop_Order::get_previous_value', 10, 2 ); add_filter( 'sm_default_batch_update_db_updates', __CLASS__. '::default_batch_update_db_updates', 10, 2 ); add_filter( 'sm_post_batch_update_db_updates', __CLASS__. '::post_batch_update_db_updates', 10, 2 ); add_filter( 'sm_pro_default_process_delete_records', function() { return false; } ); add_filter( 'sm_pro_default_process_delete_records_result', 'Smart_Manager_Shop_Order::process_delete', 12, 3 ); } public function __call( $function_name, $arguments = array() ) { if( empty( $this->shop_order ) ) { return; } if ( ! is_callable( array( $this->shop_order, $function_name ) ) ) { return; } if ( ! empty( $arguments ) ) { return call_user_func_array( array( $this->shop_order, $function_name ), $arguments ); } else { return call_user_func( array( $this->shop_order, $function_name ) ); } } public static function default_batch_update_db_updates( $flag = false, $args = array() ) { return ( 'posts' === $args['table_nm'] && 'post_status' === $args['col_nm'] ) ? false : $flag; } public static function post_batch_update_db_updates( $update_flag = false, $args = array() ) { if ( empty( $args ) || empty( $args['id'] ) ) return $update_flag; $args['order_obj'] = wc_get_order( $args['id'] ); if ( ! empty( Smart_Manager::$sm_is_woo79 ) ) { if( ! empty( $args['curr_obj_getter_func'] ) && ! empty( $args['curr_obj_class_nm'] ) && function_exists( $args['curr_obj_getter_func'] ) && class_exists( $args['curr_obj_class_nm'] ) ) { $args['order_obj'] = call_user_func( $args['curr_obj_getter_func'], $args['id'] ); } //Code for handling 'copy_from' and 'copy_from_field' action if( ! empty( $args ) && ! empty( $args['operator'] ) && $args['copy_from_operators'] && in_array( $args['operator'], $args['copy_from_operators'] ) && ! empty( $args['selected_table_name'] ) && ! empty( $args['selected_column_name'] ) && ! empty( $args['selected_value'] ) && is_callable( array( 'Smart_Manager_Shop_Order', 'get_previous_value') ) ) { $args['value'] = Smart_Manager_Shop_Order::get_previous_value( ( ! empty( $args['prev_val'] ) ) ? $args['prev_val'] : '', array( 'col_nm' => $args['selected_column_name'], 'table_nm' => $args['selected_table_name'], 'id' => intval( $args['selected_value'] ), 'order_obj' => wc_get_order( intval( $args['selected_value'] ) ) ) ); } return ( is_callable( array( 'Smart_Manager_Shop_Order', 'update_order_data') ) ) ? Smart_Manager_Shop_Order::update_order_data( $args ) : $update_flag; } if( 'posts' === $args['table_nm'] && 'post_status' === $args['col_nm'] && ! empty( $args['value'] ) && class_exists( 'WC_Order' ) ){ $order = new WC_Order( $args['id'] ); return $order->update_status( $args['value'], '', true ); } return $update_flag; } /** * Function for adding custom columns for Orders dashboard * * @param array $dashboard_model array of dashboard model. * @param array $dashboard_model_saved The saved dashboard model. * @return array $dashboard_model updated dashboard model. */ public function orders_dashboard_model( $dashboard_model = array(), $dashboard_model_saved = array() ){ if( empty( $this->custom_product_search_cols ) ){ return $dashboard_model; } global $wpdb; if( empty( $dashboard_model['columns'] ) ){ $dashboard_model['columns'] = array(); } $column_model = &$dashboard_model['columns']; foreach( array_keys( $this->custom_product_search_cols ) as $col ){ $col_name = $this->custom_product_search_key_prefix. '' .$col; $col_index = sm_multidimesional_array_search ( 'woocommerce_order_itemmeta/meta_key='. $col_name .'/meta_value='. $col_name, 'src', $column_model ); if( ! empty( $col_index ) ) { continue; } $index = sizeof( $column_model ); $column_model [$index] = array(); $column_model [$index]['src'] = 'woocommerce_order_itemmeta/meta_key='. $col_name .'/meta_value='. $col_name; $column_model [$index]['data'] = sanitize_title( str_replace( '/', '_', $column_model [$index]['src'] ) ); // generate slug using the wordpress function if not given $column_model [$index]['name'] = __( 'Product '. ( ( 'sku' === $col ) ? 'SKU' : ucwords( str_replace('_', ' ', $col) ) ), 'smart-manager-for-wp-e-commerce' ); $column_model [$index]['key'] = $column_model[$index]['name']; $column_model [$index]['type'] = 'text'; $column_model [$index]['hidden'] = true; $column_model [$index]['editable'] = false; $column_model [$index]['batch_editable'] = false; $column_model [$index]['sortable'] = false; $column_model [$index]['resizable'] = false; $column_model [$index]['allow_showhide'] = false; $column_model [$index]['exportable'] = false; $column_model [$index]['searchable'] = true; $column_model [$index]['wordWrap'] = false; //For disabling word-wrap $column_model [$index]['table_name'] = $wpdb->prefix.'woocommerce_order_itemmeta'; $column_model [$index]['col_name'] = $col_name; $column_model [$index]['width'] = 0; $column_model [$index]['save_state'] = false; //Code for assigning values $column_model [$index]['values'] = array(); $column_model [$index]['search_values'] = array(); } if( !empty( $dashboard_model_saved ) ) { $col_model_diff = sm_array_recursive_diff( $dashboard_model_saved,$dashboard_model ); } //clearing the transients before return if ( !empty( $col_model_diff ) ) { delete_transient( 'sa_sm_'.$this->dashboard_key ); } return $dashboard_model; } /** * Function for modifying search query for meta tables for advanced search. * * @param array $query The search query array. * @param array $params The search condition params. * @return array $query updated search query array. */ public function order_itemmeta_search_query( $query = array(), $params = array() ){ $search_string = ( ! empty( $params['search_string'] ) ) ? $params['search_string'] : array(); if( empty( $search_string ) || ( ! empty( $search_string ) && empty( $search_string['table_name'] ) ) ){ return $query; } $col = ( ! empty( $params['search_col'] ) ) ? $params['search_col'] : ''; $searched_col_table_nm = $search_string['table_name']; if( empty( $col ) || strlen( $col ) < strlen( $this->custom_product_search_key_prefix ) || ( ! empty( $col ) && strlen( $col ) > strlen( $this->custom_product_search_key_prefix ) && ! in_array( substr( $col, strlen( $this->custom_product_search_key_prefix ) ), array_keys( $this->custom_product_search_cols ) ) ) ){ return $query; } global $wpdb; $search_meta = explode( "/", $this->custom_product_search_cols[substr( $col, strlen( $this->custom_product_search_key_prefix ) )] ); $search_table = ( ! empty( $search_meta[0] ) ) ? $search_meta[0] : ''; $search_col = ( ! empty( $search_meta[1] ) ) ? $search_meta[1] : ''; if( empty( $search_table ) || empty( $search_col ) ){ return $query; } $search_val = ( ! empty( $params['search_value'] ) ) ? $params['search_value'] : ''; $search_op = ( ! empty( $params['search_operator'] ) ) ? $params['search_operator'] : ''; $searched_col_op = ( strpos( $search_op, ' not' ) || strpos( $search_op, 'not ' ) ) ? 'not' : ''; $p_ids = array(); $rule = array( 'type' => $wpdb->prefix. '' .$search_table. '.' .$search_col, 'operator' => $search_op, 'value' => $search_val, 'table_name' => $wpdb->prefix. '' .$search_table, 'col_name' => $search_col ); $params = array( 'table_nm' => $search_table, 'search_query' => array( 'cond_'.$search_table => '', 'cond_'.$search_table.'_col_name' => '', 'cond_'.$search_table.'_col_value' => '', 'cond_'.$search_table.'_operator' => '' ), 'search_params' => array( 'search_string' => $rule, 'search_col' => $search_col, 'search_operator' => $search_op, 'search_data_type' => 'text', 'search_value' => $search_val, 'selected_search_operator' => ( ! empty( $params['selected_search_operator'] ) ) ? $params['selected_search_operator'] : '', 'SM_IS_WOO30' => ( !empty( $params['SM_IS_WOO30'] ) ) ? $params['SM_IS_WOO30'] : '', 'post_type' => array( 'product', 'product_variation') ), 'rule' => $rule ); // code for postmeta cols if( 'postmeta' === $search_table ){ $meta_query = $this->create_meta_table_search_query( $params ); if( empty( $meta_query ) || ( ! empty( $meta_query ) && empty( $meta_query['cond_postmeta'] ) ) ){ return $query; } $cond = ( ! empty( $meta_query['cond_postmeta'] ) ) ? substr( $meta_query['cond_postmeta'], 0, -4 ) : ''; if( empty( $cond ) ){ return $query; } //Query to get the post_id of the products whose meta value matches with the one type in the search text box of the Orders Module $p_ids = $wpdb->get_col( "SELECT DISTINCT(post_id) FROM {$wpdb->prefix}postmeta WHERE 1=1 AND ". $cond ); //not using wpdb->prepare as its failing if the `cond` is having `%s` } else if( 'posts' === $search_table ){ $meta_query = $this->create_flat_table_search_query( $params ); if( empty( $meta_query ) || ( ! empty( $meta_query ) && empty( $meta_query['cond_posts'] ) ) ){ return $query; } $cond = ( ! empty( $meta_query['cond_posts'] ) ) ? substr( $meta_query['cond_posts'], 0, -4 ) : ''; if( empty( $cond ) ){ return $query; } //Query to get the post_id of the products whose meta value matches with the one type in the search text box of the Orders Module $p_ids = $wpdb->get_col( "SELECT DISTINCT(ID) FROM {$wpdb->prefix}posts WHERE 1=1 AND ". $cond ); //not using wpdb->prepare as its failing if the `cond` is having `%s` } if( is_wp_error( $p_ids ) || empty( $p_ids ) ) { return $query; } $ometa_cond = $searched_col_table_nm .".meta_value ". $searched_col_op ." in (". implode( ",", $p_ids ) .")"; if( count( $p_ids ) > 100 && !empty( $this->advanced_search_option_name ) ){ update_option( $this->advanced_search_option_name, implode( ",", $p_ids ), 'no' ); $ometa_cond = $searched_col_op ." FIND_IN_SET( ". $searched_col_table_nm .".meta_value, (SELECT option_value FROM ". $wpdb->prefix ."options WHERE option_name = '". $this->advanced_search_option_name ."') )"; } $query['cond_woocommerce_order_itemmeta'] = "( ( ". $searched_col_table_nm .".meta_key = '_product_id' AND ". $ometa_cond ." ) OR ( ". $searched_col_table_nm .".meta_key = '_variation_id' AND ". $ometa_cond ." ) )"; return $query; } /** * Function for modifying table types for advanced search. * * @param array $table_types array of table types. * @return array $table_types updated array of table types. */ public function orders_search_table_types( $table_types = array() ){ $table_types['flat']['woocommerce_order_items'] = 'order_id'; $table_types['meta']['woocommerce_order_itemmeta'] = 'order_id'; return $table_types; } /** * Function for modifying select clause for meta tables for advanced search. * * @param string $select The search query select clause. * @param array $params The search condition params. * @return string updated search query select clause. */ public function orders_advanced_search_select( $select = '', $params = array() ){ return str_replace( 'woocommerce_order_itemmeta.order_id', 'woocommerce_order_items.order_id', $select ); } /** * Function for modifying from clause for meta tables for advanced search. * * @param string $from The search query from clause. * @param array $params The search condition params. * @return string updated search query from clause. */ public function orders_advanced_search_from( $from = '', $params = array() ){ global $wpdb; return $from. '' .( ( false === strpos( $from, 'woocommerce_order_items' ) ) ? " JOIN {$wpdb->prefix}woocommerce_order_items ON ({$wpdb->prefix}woocommerce_order_itemmeta.order_item_id = {$wpdb->prefix}woocommerce_order_items.order_item_id)" : '' ); } /** * Function for modifying join clause for meta tables for advanced search. * * @param string $join The search query join clause. * @param array $params The search condition params. * @return string updated search query join clause. */ public function orders_advanced_search_join( $join = '', $params = array() ){ return str_replace( 'woocommerce_order_itemmeta.order_id', 'woocommerce_order_items.order_id', $join ); } /** * Function for modifying condition for flat tables for advanced search. * * @param string $cond The search condition string. * @param array $params The search condition params. * @return string updated search query condition. */ public function orders_advanced_search_flat_table_cond( $cond = '', $params = array() ){ $col = ( ! empty( $params['search_col'] ) ) ? $params['search_col'] : ''; if( empty( $col ) || ( ! empty( $col ) && !in_array( $col, array_keys( $this->custom_search_cols ) ) ) ){ return $cond; } $search_meta = explode( "/", $this->custom_search_cols[$col] ); $search_table = ( ! empty( $search_meta[0] ) ) ? $search_meta[0] : ''; $search_col = ( ! empty( $search_meta[1] ) ) ? $search_meta[1] : ''; if( empty( $search_table ) || empty( $search_col ) || 'woocommerce_order_items' !== $search_table ){ return $cond; } global $wpdb; // Handling for negation search conditions $updated_cond = "(". $wpdb->prefix ."woocommerce_order_items.order_item_type = '". $search_col ."' AND ". str_replace( $col, 'order_item_name', $cond ) ." )"; if( ! empty( $updated_cond ) && !empty( $params['search_operator'] ) && 'not like' === $params['search_operator'] ){ $o_ids = $wpdb->get_col( "SELECT DISTINCT(order_id) FROM {$wpdb->prefix}woocommerce_order_items WHERE ". str_replace( 'not like', 'like', $updated_cond ) ); if( is_wp_error( $o_ids ) || empty( $o_ids ) ) { return $updated_cond; } if( count( $o_ids ) > 100 && !empty( $this->advanced_search_option_name ) ){ update_option( $this->advanced_search_option_name, implode( ",", $o_ids ), 'no' ); return "( NOT FIND_IN_SET( ". $wpdb->prefix ."woocommerce_order_items.order_id, (SELECT option_value FROM ". $wpdb->prefix ."options WHERE option_name = '". $this->advanced_search_option_name ."') ) )"; } return "(". $wpdb->prefix ."woocommerce_order_items.order_id NOT IN (". implode( ",", $o_ids ) .") )"; } return $updated_cond; } /** * Function for things to be done post processing of advanced search. * * @return void */ public function orders_advanced_search_post_processing(){ if( !empty( $this->advanced_search_option_name ) && !empty( get_option( $this->advanced_search_option_name ) ) ){ delete_option( $this->advanced_search_option_name ); } } /** * AJAX handler function for copy from operator for bulk edit. * * @param array $args bulk edit params. * @return string|array json encoded string or array of values. */ public function get_batch_update_copy_from_record_ids( $args = array() ) { return ( is_callable( array( 'Smart_Manager_Pro_Shop_Order', 'get_copy_from_record_ids' ) ) ) ? Smart_Manager_Pro_Shop_Order::get_copy_from_record_ids( array_merge( array( 'curr_obj' => $this, 'type' => 'shop_order', 'field_title_prefix' => 'Order' ), $args ) ) : ''; } /** * Function to get values for copy from operator for bulk edit. * * @param array $args function arguments. * @return string|array json encoded string or array of values. */ public static function get_copy_from_record_ids( $args = array() ) { if ( empty( Smart_Manager::$sm_is_woo79 ) ) { parent::get_batch_update_copy_from_record_ids( $args ); return; } $curr_obj = ( ! empty( $args ) && ! empty( $args['curr_obj'] ) ) ? $args['curr_obj'] : null; if( empty( $curr_obj ) || empty( $args['type'] ) || empty( $args['field_title_prefix'] ) ){ return; } global $wpdb; $data = array(); $is_ajax = ( isset( $args['is_ajax'] ) ) ? $args['is_ajax'] : true; $search_term = ( ! empty( $curr_obj->req_params['search_term'] ) ) ? $curr_obj->req_params['search_term'] : ( ( ! empty( $args['search_term'] ) ) ? $args['search_term'] : '' ); $select = apply_filters( 'sm_batch_update_copy_from_ids_select', "SELECT id AS id, CONCAT('". $args['field_title_prefix'] ." #', id) AS title", $args ); $search_cond = ( ! empty( $search_term ) ) ? " AND ( id LIKE '%".$search_term."%' OR status LIKE '%".$search_term."%' OR billing_email LIKE '%".$search_term."%' ) " : ''; $search_cond_ids = ( !empty( $args['search_ids'] ) ) ? " AND id IN ( ". implode(",", $args['search_ids']) ." ) " : ''; $query = $select . " FROM {$wpdb->prefix}wc_orders WHERE status != 'trash' ". $search_cond ." ". $search_cond_ids ." AND type = '" . $args['type'] . "'"; $results = $wpdb->get_results( $query, 'ARRAY_A' ); if( count( $results ) > 0 ) { foreach( $results as $result ) { $data[ $result['id'] ] = trim($result['title']); } } $data = apply_filters( 'sm_batch_update_copy_from_ids', $data ); if( $is_ajax ){ wp_send_json( $data ); } else { return $data; } } /** * Function for modifying query for getting ids in case of 'entire store' option. * * @param string $query query for fetching the ids when entire store option is selected. * @return string updated query for fetching the ids when entire store option is selected. */ public function get_entire_store_ids_query( $query = '' ) { global $wpdb; return $wpdb->prepare( "SELECT id FROM {$wpdb->prefix}wc_orders WHERE status != 'trash' AND type = %s", 'shop_order' ); } /** * Function to process duplicate orders * * @param array $params params array * @return boolean */ public static function process_duplicate_record( $params = array() ) { if ( empty( $params ) || ! is_array( $params ) || empty( $params['id'] ) ) { return false; } $original_id = intval( $params['id'] ); $duplicate = wc_get_order( $original_id ); if ( empty( $duplicate ) || ! $duplicate instanceof WC_Order ) { return false; } $duplicate->set_id( 0 ); $duplicate_fields = [ 'customer_id', 'billing_first_name', 'billing_last_name', 'billing_company', 'billing_address_1', 'billing_address_2', 'billing_city', 'billing_state', 'billing_postcode', 'billing_country', 'billing_email', 'billing_phone', 'shipping_first_name', 'shipping_last_name', 'shipping_company', 'shipping_address_1', 'shipping_address_2', 'shipping_city', 'shipping_state', 'shipping_postcode', 'shipping_country', 'shipping_phone' ]; $order = wc_get_order( $original_id ); // original order. if ( empty( $order ) || ! $order instanceof WC_Order ) { return false; } foreach ( $duplicate_fields as $field ) { $setter_method = "set_{$field}"; $getter_method = "get_{$field}"; if ( ! is_callable( array( $duplicate, $setter_method ) ) || ! is_callable( array( $order, $getter_method ) ) ) { continue; } $duplicate->$setter_method(''); // need for duplicating the addresses. $duplicate->$setter_method( $order->$getter_method() ); } $line_items = ( is_callable( array( $order, 'get_items' ) ) ) ? $order->get_items() : array(); if ( empty( $line_items ) || ! is_array( $line_items ) ) { return false; } foreach ( $line_items as $item_id => $item ) { if ( empty( $item ) || ! is_callable( array( $item, 'get_product' ) ) || ! is_callable( array( $item, 'get_quantity' ) ) || ! is_callable( array( $duplicate, 'add_product' ) ) ) { continue; } $duplicate->add_product( $item->get_product(), $item->get_quantity() ); } $duplicate->save(); if ( empty( $duplicate ) || ! $duplicate instanceof WC_Order ) { return false; } return true; } } } pro/classes/class-smart-manager-pro-acf-base.php000064400000023556147600337620015633 0ustar00dashboard_key = $dashboard_key; add_filter('sm_dashboard_model',array(&$this,'get_acf_column_model'),12,2); add_filter('sm_data_model',array(&$this,'get_acf_column_data'),12,2); } public function get_data_type( $type ){ $data_types = array( 'true_false' => 'checkbox', 'select' => 'dropdown', 'date_picker' => 'sm.date', 'time_picker' => 'sm.time', 'date_time_picker' => 'sm.datetime', 'image' => 'sm.image', 'gallery' => 'sm.multipleImage', 'wysiwyg' => 'sm.longstring', 'checkbox' => 'sm.multilist' ); return ( ( ! empty( $data_types[ $type ] ) ) ? $data_types[ $type ] : 'text' ); } public function get_acf_column_model( $dashboard_model, $dashboard_model_saved ) { global $wpdb; $fields = $this->get_field_groups(); if( empty( $fields ) ){ return $dashboard_model; } $column_model = &$dashboard_model['columns']; foreach( $fields as $field ){ $name = ( ! empty( $field['name'] ) ) ? $field['name'] : ''; if( empty( $name ) ){ continue; } $src = 'postmeta/meta_key='. $name .'/meta_value='. $name; $title = ( ( ! empty( $field['label'] ) ) ? $field['label'] : $name ); $title = __( ucwords( $title ), 'smart-manager-for-wp-e-commerce' ); $type = ( ( ! empty( $field['type'] ) ) ? $this->get_data_type( $field['type'] ) : 'text' ); // Code to check if field exists in column_model. $index = sm_multidimesional_array_search( $src, 'src', $column_model ); if( $index >= 0 ){ unset( $column_model[$index] ); // Code to remove the key columns for the same fields to avoid confusion. $key_src = 'postmeta/meta_key=_'. $name .'/meta_value=_'. $name; $key_index = sm_multidimesional_array_search( $key_src, 'src', $column_model ); if( $key_index >= 0 ){ unset( $column_model[$key_index] ); } $column_model = array_values( $column_model ); //added for recalculating the indexes of the array. } // insert field in column_model $index = sizeof( $column_model ); $column_model [$index] = array( 'src' => $src, 'data' => sanitize_title( str_replace( array('/','='), '_', $src ) ), 'name' => $title, 'key' => $title, 'type' => $type, 'editor' => $type, 'hidden' => true, 'editable' => true, 'batch_editable' => true, 'sortable' => true, 'resizable' => true, 'allow_showhide' => true, 'exportable' => true, 'searchable' => true, 'wordWrap' => false, //For disabling word-wrap 'table_name' => $wpdb->prefix.'postmeta', 'col_name' => $name, 'width' => 0, 'save_state' => true, 'values' => ( ( ! empty( $field['values'] ) ) ? $field['values'] : array() ), 'search_values' => array(), ); if( !empty( $column_model [$index]['values'] ) ) { foreach( $column_model [$index]['values'] as $key => $value ) { $column_model [$index]['search_values'][] = array( 'key' => $key, 'value' => $value ); } } if( 'dropdown' === $column_model [$index]['type'] ){ $column_model [$index]['editor'] = 'select'; $column_model [$index]['selectOptions'] = $column_model [$index]['values']; } } if (!empty($dashboard_model_saved)) { $col_model_diff = sm_array_recursive_diff( $dashboard_model_saved,$dashboard_model ); } //clearing the transients before return if (!empty($col_model_diff)) { delete_transient( 'sa_sm_'.$this->dashboard_key ); } return $dashboard_model; } public function get_acf_column_data( $data_model, $data_col_params ) { global $wpdb; return $data_model; } public function get_field_groups() { if( ! is_callable( 'acf_get_field_groups' ) ){ return array(); } add_filter( 'acf/location/rule_match/user_type', '__return_true', 16 ); add_filter( 'acf/location/rule_match/page_type', '__return_true', 16 ); switch ( $this->dashboard_key ) { case 'post' : add_filter( 'acf/location/rule_match/post_format', '__return_true', 16 ); break; case 'page' : add_filter( 'acf/location/rule_match/page', '__return_true', 16 ); add_filter( 'acf/location/rule_match/page_parent', '__return_true', 16 ); add_filter( 'acf/location/rule_match/page_template', '__return_true', 16 ); break; } add_filter( 'acf/location/rule_match/post', '__return_true', 16 ); add_filter( 'acf/location/rule_match/post_category', '__return_true', 16 ); add_filter( 'acf/location/rule_match/post_status', '__return_true', 16 ); add_filter( 'acf/location/rule_match/post_taxonomy', '__return_true', 16 ); add_filter( 'acf/location/rule_match/post_template', '__return_true', 16 ); $groups = acf_get_field_groups( [ 'post_type' => $this->dashboard_key ] ); remove_filter( 'acf/location/rule_match/user_type', '__return_true', 16 ); remove_filter( 'acf/location/rule_match/page_type', '__return_true', 16 ); remove_filter( 'acf/location/rule_match/post_format', '__return_true', 16 ); remove_filter( 'acf/location/rule_match/page', '__return_true', 16 ); remove_filter( 'acf/location/rule_match/page_parent', '__return_true', 16 ); remove_filter( 'acf/location/rule_match/page_template', '__return_true', 16 ); remove_filter( 'acf/location/rule_match/post_template', '__return_true', 16 ); remove_filter( 'acf/location/rule_match/post', '__return_true', 16 ); remove_filter( 'acf/location/rule_match/post_category', '__return_true', 16 ); remove_filter( 'acf/location/rule_match/post_status', '__return_true', 16 ); remove_filter( 'acf/location/rule_match/post_taxonomy', '__return_true', 16 ); return $this->get_fields( $groups ); } protected function get_fields( $groups ) { $fields = array(); if( !is_callable( 'acf_get_fields' ) ){ return $fields; } foreach ( $groups as $group_id => $group ) { $acf_fields = acf_get_fields( $group ); foreach ( $acf_fields as $field ) { if ( in_array( $field['type'], [ 'tab', 'message' ] ) ) { continue; } // Clone is not supported if ( isset( $field['_clone'] ) ) { continue; } $name = ( ! empty( $field['name'] ) ) ? $field['name'] : ''; if( empty( $name ) ){ continue; } $fields[ $field['key'] ] = array( 'name' => $name, 'label' => ( ( ! empty( $field['label'] ) ) ? $field['label'] : $name ), 'type' => ( ( ! empty( $field['type'] ) ) ? $field['type'] : '' ), 'values' => ( ( ! empty( $field['choices'] ) ) ? $field['choices'] : array() ), 'group_title' => ( ( ! empty( $group['title'] ) ) ? $group['title'] : '' ), ); } } return $fields; } } } pro/classes/class-smart-manager-pro-access-privilege.php000064400000056603147600337620017416 0ustar00req_params = ( ! empty( $_REQUEST ) ) ? $_REQUEST : array(); add_filter( 'sm_active_dashboards', array( $this, 'get_accessible_dashboards' ) ); add_filter( 'sm_active_taxonomy_dashboards', array( $this, 'get_accessible_dashboards' ) ); } public static function get_db_key( $role = '' ) { $start = ( empty( $role ) ) ? rtrim( self::$access_privilege_option_start, '_' ) : self::$access_privilege_option_start; return $start . ( ( ! empty( $role ) ) ? trim( $role ) : '' ) . self::$access_privilege_option_end; } /** * Function to update the privilege settings data * * @return string json encoded string of results. */ public function save_access_privilege_settings() { global $wpdb; $access_privileges = ( ! empty( $this->req_params ) && ! empty( $this->req_params['access_privileges'] ) ) ? json_decode( stripslashes( $this->req_params['access_privileges'] ), true ) : array(); $results = array(); if ( empty( $access_privileges ) || ! is_array( $access_privileges ) ) { wp_send_json( array( 'msg' => $results, 'ACK' => 'failure' ) ); } foreach ( $access_privileges as $access_privilege ) { if ( empty( $access_privilege['rules'] ) || ! is_array( $access_privilege['rules'] ) ) { continue; } foreach ( $access_privilege['rules'] as $rule ) { if ( empty( $rule['type'] ) || empty( $rule['operator'] ) || empty( $rule['meta'] ) ) { continue; } if ( ! isset( $results[ $rule['type'] ] ) ) { $results[ $rule['type'] ] = array( 'valid' => array(), 'not_valid' => array() ); } if ( isset( $rule['meta']['displayTitles'] ) ) { unset( $rule['meta']['displayTitles'] ); } $operator = ( 'has_access' === $rule['operator'] ) ? 'valid' : 'not_valid'; if ( isset( $rule['meta']['user_roles'] ) && ! empty( $rule['meta']['user_roles'] ) && is_array( $rule['meta']['user_roles'] ) ) { foreach ( $rule['meta']['user_roles'] as $slug => $values ) { $results[ $rule['type'] ][ $operator ] = $this->set_selected_dashboards( array( 'slug' => $slug, 'values' => $values, 'results' => $results[ $rule['type'] ][ $operator ] )); } } if ( isset( $rule['meta']['user_emails'] ) && ! empty( $rule['meta']['user_emails'] ) && is_array( $rule['meta']['user_emails'] ) ) { foreach ( $rule['meta']['user_emails'] as $slug => $values ) { $results[ $rule['type'] ][ $operator ] = $this->set_selected_dashboards( array( 'slug' => $slug, 'values' => $values, 'results' => $results[ $rule['type'] ][ $operator ] )); } } if ( empty( $results[ $rule['type'] ]['valid'] ) && empty( $results[ $rule['type'] ]['not_valid'] ) ) { unset( $results[ $rule['type'] ] ); } } } $delete_settings_data = self::delete_access_settings_data(); if ( empty( $results ) || ! is_array( $results ) ) { wp_send_json( array( 'msg' => $results, 'ACK' => 'failure' ) ); } $update_values = array( 'usermeta' => array(), 'options' => array() ); foreach ( $results as $key => $value ) { if ( is_numeric( $key ) ) { $update_values['usermeta'][] = "( ".$key.", '".self::get_db_key()."', '".maybe_serialize( $value ) ."' )"; continue; } $update_values['options'][] = "( '". self::get_db_key( $key ) ."', '".maybe_serialize( $value ) ."', 'no' )"; } if ( ! $delete_settings_data || ( empty( $update_values['usermeta'] ) && empty( $update_values['options'] ) ) ) { wp_send_json( array( 'msg' => $results, 'ACK' => ( ! empty( $results ) ? 'success' : 'failure' ) ) ); } $query_result = false; if ( ! empty( $update_values['options'] ) ) { $query_result = $wpdb->query( "INSERT INTO {$wpdb->prefix}options ( option_name, option_value, autoload ) VALUES ". implode( ", ", $update_values['options'] ) ."" ); } if ( ! empty( $update_values['usermeta'] ) ) { $query_result = $wpdb->query( "INSERT INTO {$wpdb->usermeta} ( user_id, meta_key, meta_value ) VALUES ". implode( ", ", $update_values['usermeta'] ) ." ON DUPLICATE KEY UPDATE meta_value = VALUES ( meta_value )" ); } wp_send_json( array( 'msg' => $results, 'ACK' => ( ! empty( $query_result ) && ! is_wp_error( $query_result ) ) ? 'success' : 'failure' ) ); } public static function delete_access_settings_data() { global $wpdb; $option_result= $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}options WHERE option_name LIKE %s AND option_name LIKE %s", '%' . $wpdb->esc_like( self::$access_privilege_option_start ) . '%', '%' . $wpdb->esc_like( self::$access_privilege_option_end ) . '%' ) ); $usermeta_result= $wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->usermeta} WHERE meta_key LIKE %s ", '%' . $wpdb->esc_like( self::get_db_key() ) .'%' ) ); return ( ! is_wp_error( $option_result ) && ! is_wp_error( $usermeta_result ) ) ? true : false; } public function get_users() { $term = ( ! empty( $this->req_params['term'] ) ) ? sanitize_text_field( wp_unslash( $this->req_params['term'] ) ) : ''; // phpcs:ignore $page = ( ! empty( $this->req_params['page'] ) ) ? $this->req_params['page'] : 1; //pagination $resultCount = apply_filters( '_sm_ajax_results_per_page', get_option( '_sm_ajax_results_per_page', 50 ) ); $offset = ( ! empty( $this->req_params['offset'] ) ) ? $this->req_params['offset'] : ( $page - 1 ) * $resultCount; $all_roles = get_editable_roles(); $previous_roles = ( ! empty( $this->req_params['previous_roles'] ) ) ? array_merge( $this->req_params['previous_roles'], array( "administrator" ) ): array( "administrator" ); if ( ! empty( $previous_roles ) && ! empty( array_diff( array_keys( $all_roles ), $previous_roles ) ) ) { foreach ( $previous_roles as $previous_role ) { if ( in_array( $previous_role, array_keys( $all_roles ) ) ) { unset( $all_roles[ $previous_role ] ); } } } if ( empty( $all_roles ) || ! is_array( $all_roles ) ) { wp_send_json( array( 'data' => array( 'results' => array(), 'pagination' => array( "more" => false ) ), 'additional_params' => array( 'offset' => 0, 'previous_roles'=> array() ) ) ); } $previous_roles= array(); $optgroup = array(); $users_count = 0; $morePages = false; foreach ( $all_roles as $role => $value ) { $all_users = get_users( array( 'search' => '*' . $term . '*', 'search_columns' => array( 'ID', 'user_login', 'user_email', 'display_name' ), 'fields' => array( 'ID', 'display_name', 'user_email'), 'number' => $resultCount, 'paged' => $page, 'offset' => $offset, 'role' => $role ) ); $role_title = ( ! empty( $role ) && ! empty( $all_roles[ $role ] ) && ! empty( $all_roles[ $role ]['name'] ) ) ? $all_roles[ $role ]['name'] : $role; if ( empty( $all_users ) || ! is_array( $all_users ) ) { continue; } foreach ( $all_users as $user ) { if ( empty( $user ) || ( !empty( $user ) && ( empty( $user->ID ) || empty( $user->user_email ) ) ) ) { continue; } if ( ! isset( $optgroup[ $role ] ) ) { $optgroup[ $role ] = array( 'text' => $role_title, 'children' => array() ); } $optgroup[ $role ]['children'][] = array( 'id' => $user->ID, 'text' => ( ( ! empty( $user->display_name ) ) ? $user->display_name : '#'.$user->ID ). ' ('.$user->user_email.')' ); } $users_count = ( ! empty( $optgroup[ $role ]['children'] ) ) ? count( $optgroup[ $role ]['children'] ) : 0; $resultCount -= $users_count; if( $resultCount== 0 ){ $morePages = true; break; } $offset= 0; $page= 1; $previous_roles[] = $role; $morePages = false; } wp_send_json( array( 'data' => array( 'results' => array_values( $optgroup ), 'pagination' => array( "more" => $morePages ) ), 'additional_params' => array( 'offset' => $users_count, 'previous_roles'=> $previous_roles ) ) ); } public function get_user_roles() { $optgroup = array(); $term = ( ! empty( $this->req_params['term'] ) ) ? sanitize_text_field( wp_unslash( $this->req_params['term'] ) ) : ''; $all_roles = get_editable_roles(); if ( isset( $all_roles['administrator'] ) ) { unset( $all_roles['administrator']); } if ( empty( $all_roles ) || ! is_array( $all_roles ) ) { wp_send_json( array( 'data' => array( 'results' => array() ) ) ); } $groups = array( 'default' => array( 'title' => _x( 'Default', 'select group title', 'smart-manager-for-wp-e-commerce' ), 'roles' => array( 'editor', 'author', 'contributor', 'subscriber' ), ), 'woocommerce' => array( 'title' => _x( 'WooCommerce', 'select group title', 'smart-manager-for-wp-e-commerce' ), 'roles' => array( 'customer', 'shop_manager' ), ) ); foreach ( $all_roles as $name => $role ) { if ( ! empty( $term ) && false === strpos( $name, $term ) ) { continue; } $group_name = _x( 'Other', 'select group title' ,'smart-manager-for-wp-e-commerce' ); if ( empty( $groups ) || ! is_array( $groups ) ) { continue; } foreach ( $groups as $group ) { if ( ! empty( $group ) && ! empty( $group['roles'] ) && in_array( $name, $group['roles'] ) ) { $group_name = $group['title']; break; } } if ( ! isset( $optgroup[$group_name] ) ) { $optgroup[ $group_name ] = array( 'text' => $group_name, 'children' => array() ); } $optgroup[ $group_name ]['children'][] = array( 'id' => $name, 'text' => ( ! empty( $role['name'] ) ) ? $role['name'] : $name ); } wp_send_json( array( 'data' => array( 'results' => array_values( $optgroup ) ) ) ); } public function get_formatted_dashboard_groups( $args = array() ){ if ( empty( $args ) || ( ! empty( $args ) && ( empty( $args['slug'] ) || empty( $args['title'] ) ) ) ) { return $args['data']; } if ( ! isset( $args['data'] ) ) { $args['data'] = array(); } if ( ! isset( $args['data'][$args['slug']] ) ) { $args['data'][$args['slug']] = array( 'text' => $args['title'], 'children' => array() ); } if ( ! empty( $args['dashboards'] ) && is_array( $args['dashboards'] ) ) { foreach ( $args['dashboards'] as $key => $title ) { if ( ! empty( $args['term'] ) && false === strpos( strtolower( $title ), $args['term'] ) ) { continue; } $args['data'][ $args['slug'] ]['children'][] = array( 'id' => $key, 'text' => $title, 'optgroup' => $args['slug'] ); } } if( empty( $args['data'][$args['slug']]['children'] ) ){ unset( $args['data'][$args['slug']] ); } return $args['data']; } public function get_dashboards() { $optgroup = array(); $term = ( ! empty( $this->req_params['term'] ) ) ? sanitize_text_field( wp_unslash( $this->req_params['term'] ) ) : ''; $post_type_dashboards = ( defined( 'SM_BETA_ALL_DASHBOARDS' ) ) ? json_decode( SM_BETA_ALL_DASHBOARDS, true ) : array(); if ( ! empty( $post_type_dashboards ) ) { $optgroup = $this->get_formatted_dashboard_groups( array( 'data' => $optgroup, 'dashboards' => $post_type_dashboards, 'slug' => 'post_types', 'title' => _x( 'All Post Types', 'select group title', 'smart-manager-for-wp-e-commerce' ), 'term' => $term ) ); } $taxonomy_dashboards = ( defined( 'SM_ALL_TAXONOMY_DASHBOARDS' ) ) ? json_decode( SM_ALL_TAXONOMY_DASHBOARDS, true ) : array(); if ( ! empty( $taxonomy_dashboards ) ) { $optgroup = $this->get_formatted_dashboard_groups( array( 'data' => $optgroup, 'dashboards' => $taxonomy_dashboards, 'slug' => 'taxonomies', 'title' => _x( 'All Taxonomies', 'select group title', 'smart-manager-for-wp-e-commerce' ), 'term' => $term ) ); } if ( class_exists( 'Smart_Manager_Pro_Views' ) && ( ! empty( $post_type_dashboards ) || ! empty( $taxonomy_dashboards ) ) ) { $view_obj = Smart_Manager_Pro_Views::get_instance(); if ( is_callable( array( $view_obj, 'get_all_accessible_views' ) ) ) { $views = $view_obj->get_all_accessible_views( array_merge( $post_type_dashboards, $taxonomy_dashboards ) ); if ( ! empty( $views ) ) { $sm_accessible_views = ( ! empty( $views['accessible_views'] ) ) ? $views['accessible_views'] : array(); $sm_owned_views = ( ! empty( $views['owned_views'] ) ) ? $views['owned_views'] : array(); $sm_public_views = ( ! empty( $views['public_views'] ) ) ? $views['public_views'] : array(); $optgroup = $this->get_formatted_dashboard_groups( array( 'data' => $optgroup, 'dashboards' => $sm_accessible_views, 'slug' => 'sm_views', 'title' => _x( 'All saved views', 'select group title', 'smart-manager-for-wp-e-commerce' ), 'term' => $term ) ); } } } wp_send_json( array( 'data' => array( 'results' => array_values( $optgroup ) ) ) ); } public static function get_all_privileges() { global $wpdb; $default_rule = array( 'type' => '', 'operator' => '', 'value' => '', 'meta' => array()); $user_role_rules = array(); $user_rules = array(); // get access privilege for user role. $results = $wpdb->get_results( $wpdb->prepare( "SELECT LEFT(SUBSTR(option_name, %d), LOCATE(%s, SUBSTR(option_name, %d)) -1) as user_role, option_value as dashboards FROM {$wpdb->prefix}options WHERE option_name LIKE %s AND option_name LIKE %s", strlen( self::$access_privilege_option_start ) + 1, self::$access_privilege_option_end, strlen( self::$access_privilege_option_start ) + 1, $wpdb->esc_like( self::$access_privilege_option_start ) . '%', '%' . $wpdb->esc_like( self::$access_privilege_option_end ) ), 'ARRAY_A' ); // get access privileges for user. $um_results = $wpdb->get_results( $wpdb->prepare( "SELECT user_id, meta_value as dashboards FROM {$wpdb->usermeta} WHERE meta_key = %s ", self::get_db_key() ), 'ARRAY_A' ); $post_type_dashboards = ( class_exists( 'Smart_Manager' ) && is_callable( array( 'Smart_Manager', 'get_dashboards' ) ) ) ? Smart_Manager::get_dashboards() : array(); $taxonomy_dashboards = ( class_exists( 'Smart_Manager' ) && is_callable( array( 'Smart_Manager', 'get_taxonomies' ) ) ) ? Smart_Manager::get_taxonomies() : array(); $all_dashboards = array_merge( $post_type_dashboards, $taxonomy_dashboards ); if ( ! empty( $results ) ) { $user_roles = get_editable_roles(); foreach ( $results as $result ) { $field_values = array(); $role = ( ! empty( $result['user_role'] ) ) ? $result['user_role'] : ''; $role_title = ( ! empty( $role ) && ! empty( $user_roles[ $role ] ) && ! empty( $user_roles[ $role ]['name'] ) ) ? $user_roles[ $role ]['name'] : $role; if ( empty( $role ) ){ continue; } $dashboards = ( ! empty( $result['dashboards'] ) ) ? maybe_unserialize( $result['dashboards'] ) : array(); if ( empty( $dashboards ) || ! is_array( $dashboards ) ) { continue; } $field_values = self::get_field_values( array( 'dashboards' => $dashboards, 'all_dashboards' => $all_dashboards ) ); if ( empty( $field_values ) || ! is_array( $field_values ) ) { continue; } foreach ( $field_values as $key => $field_value ) { $user_role_rules[] = array( 'type'=> $role, 'operator'=> ( 'valid' === $key ) ? 'has_access' : 'no_access', 'value'=> $field_value, 'meta' => array( 'displayTitles' => array( 'field' => $role_title ), 'user_roles' => $field_value ) ); } } } else { $user_role_rules = array( $default_rule ); } if ( ! empty( $um_results ) ) { foreach ( $um_results as $um_result ) { $operators= array(); $field_values = array(); $user_id = ( ! empty( $um_result['user_id'] ) ) ? intval( $um_result['user_id'] ) : ''; $result_dashboards = ( ! empty( $um_result['dashboards'] ) ) ? $um_result['dashboards'] : ''; $dashboards = ( ! empty( $result_dashboards ) ) ? maybe_unserialize( $um_result['dashboards'] ) : $result_dashboards; if ( empty( $dashboards ) || ! is_array( $dashboards ) ) { continue; } $field_values = self::get_field_values( array( 'dashboards' => $dashboards, 'all_dashboards' => $all_dashboards ) ); if ( empty( $field_values ) || ! is_array( $field_values ) ) { continue; } foreach( $field_values as $key => $field_value ) { $the_user = get_user_by( 'id', $user_id ); $user_rules[] = array( 'type'=> $user_id, 'operator'=> ( 'valid' === $key ) ? 'has_access' : 'no_access', 'value'=> $field_value, 'meta' => array( 'displayTitles' => array( 'field' => $the_user->display_name.' ('.$the_user->user_email.')' ), 'user_emails' => $field_value ) ); } } } else { $user_rules = array( $default_rule ); } $user_role_dashboard_privileges = array( array( 'condition'=>'AND', 'rules'=> ( ! empty( $user_rules ) ) ? $user_rules : $default_rule ), array('condition'=>'AND', 'rules'=> ( ! empty( $user_role_rules ) ) ? $user_role_rules : $default_rule ) ); wp_send_json( $user_role_dashboard_privileges ); } /** * Function to get current user accessible dashboards. * * return array $final_dashboards final dashboards array */ public static function get_current_user_access_privilege_settings() { global $current_user; $accessible_dashboards = array(); $final_dashboards = array(); $final_result = array(); $current_user_role = ( is_callable( array( 'Smart_Manager', 'get_current_user_role' ) ) ) ? Smart_Manager::get_current_user_role() : ''; $current_user_id = get_current_user_id(); if ( ! ( ( ! empty( $current_user_role ) && 'administrator' === $current_user_role ) ) ) { // query for get current user role's accessible dashboards. $get_user_role_accessible_dashboards = maybe_unserialize( get_option( self::get_db_key( $current_user_role ), '' ) ); $user_role_accessible_dashboards = ( ! empty( $get_user_role_accessible_dashboards ) ) ? $get_user_role_accessible_dashboards : array(); // query for get current user's accessible dashboards. $get_user_accessible_dashboards = maybe_unserialize( get_user_meta( $current_user_id, self::get_db_key(), true ) ); $user_accessible_dashboards = ( ! empty( $get_user_accessible_dashboards ) ) ? $get_user_accessible_dashboards : array(); if ( ! empty( $user_role_accessible_dashboards ) && ( ! empty( $user_accessible_dashboards ) ) ) { $final_result['valid'] = array_merge_recursive( $user_role_accessible_dashboards['valid'], $user_accessible_dashboards['valid'] ); if ( ! empty ( $user_accessible_dashboards['not_valid'] ) ) { foreach ( $user_accessible_dashboards['not_valid'] as $key => $values ) { $result = false; foreach ( $values as $value ) { if ( empty( $value ) || empty( $user_role_accessible_dashboards['valid'][ $key ] ) || ! is_array( $user_role_accessible_dashboards['valid'][ $key ] ) ) { continue; } $result = array_search( $value, $user_role_accessible_dashboards['valid'][ $key ] ); if ( isset( $result ) ) { unset( $final_result['valid'][$key][$result] ); } } } } } else { $final_result['valid'] = ( ! empty( $user_role_accessible_dashboards['valid'] ) ) ? $user_role_accessible_dashboards['valid'] : array(); } foreach ( $final_result['valid'] as $value ) { foreach( $value as $result ) { $final_dashboards['valid'][] = $result; } } if ( empty( $final_dashboards )) { $final_dashboards['valid'][] = ""; } } return $final_dashboards; } /** * Function to get accessible dashboards. * * @param array $dashboards dashboards array. * * @return array $dashboards updated dashboards array. */ public function get_accessible_dashboards( $dashboards = array() ) { if ( empty( $dashboards ) || ! is_array( $dashboards ) ) { return $dashboards; } $accessible_dashboards = self::get_current_user_access_privilege_settings(); if ( empty( $accessible_dashboards ) || !is_array( $accessible_dashboards ) ) { return $dashboards; } foreach ( $accessible_dashboards as $accessible_dashboard ) { foreach ( $dashboards as $key => $dashboard ) { if ( empty( $key ) || ! isset( $accessible_dashboards['valid'] ) || empty( $accessible_dashboards['valid'] ) || ! is_array( $accessible_dashboards['valid'] ) ) { continue; } if ( ! in_array( $key, $accessible_dashboards['valid'] ) ) { unset( $dashboards[ $key ] ); } } } if ( empty( $dashboards ) && ! defined( 'SM_BETA_ACCESS' ) ) { define( 'SM_BETA_ACCESS', false ); } else if ( ! empty( $dashboards ) && ! defined( 'SM_BETA_ACCESS' ) ) { define( 'SM_BETA_ACCESS', true ); } return $dashboards; } /** * Function to get field values for getting all privileges. * * @param array $args dashboard related array. * * @return array $field_values field values array. */ public static function get_field_values( $args = array() ) { if ( empty( $args['dashboards'] ) ) { return array(); } $field_values = array(); foreach ( $args['dashboards'] as $key => $values ) { if ( empty( $values ) || ! is_array( $values ) ) { continue; } foreach ( $values as $post_type => $post_type_values ) { if ( empty( $post_type_values ) || ! is_array( $post_type_values ) ) { continue; } foreach ( $post_type_values as $id => $value ) { if ( empty( $value ) ) { continue; } $field_values[ $key ][ $post_type ][ $value ] = ( isset( $args['all_dashboards'] ) && ! empty( $args['all_dashboards'] ) && is_array( $args['all_dashboards'] ) && array_key_exists( $value, $args['all_dashboards'] ) ) ? $args['all_dashboards'][ $value ] : $value; } } } return $field_values; } /** * Function to set selected dashboards for saving access privilege settings. * * @param array $args dashboard related array. * * @return array $results results array. */ public function set_selected_dashboards( $args = array() ) { if ( empty( $args['slug'] ) || empty( $args['values'] ) || ! is_array( $args['values'] ) && isset( $args['results'] ) ) { return $args['results']; } $dashboard_slug = array_keys( $args['values'] ); if ( empty( $dashboard_slug ) ) { return $args['results']; } return array_merge_recursive( $args['results'], array( $args['slug'] => $dashboard_slug ) ); } } } $GLOBALS['smart_manager_pro_access_privilege'] = Smart_Manager_Pro_Access_Privilege::instance(); pro/classes/class-smart-manager-pro-wc-membership-plan.php000064400000006544147600337620017662 0ustar00hooks(); $this->plugin_path = untrailingslashit( plugin_dir_path( __FILE__ ) ); } public static function actions() { } public function hooks() { add_filter('sm_dashboard_model',array(&$this,'wc_membership_plan_dashboard_model'),10,2); } public function wc_membership_plan_dashboard_model ($dashboard_model, $dashboard_model_saved) { $visible_columns = array( 'ID', 'post_title', 'post_name', 'post_status', '_access_method', '_access_length', '_access_start_date', '_access_end_date', 'link' ); $readonly_columns = array( '_access_method','_access_length','link','post_author','_members_area_sections','_product_ids' ); $numeric_columns = array( 'id', 'post_author', 'post_parent', 'menu_order', 'comment_count', '_edit_last', 'post_id' ); $datetime_columns = array( 'post_date', 'post_date_gmt', 'post_modified', 'post_modified_gmt', '_access_start_date', '_access_end_date' ); $column_model = &$dashboard_model['columns']; foreach ( $column_model as $key => &$column ) { if (empty($column['src'])) continue; $src_exploded = explode("/",$column['src']); if (empty($src_exploded)) { $src = $column['src']; } if ( sizeof($src_exploded) > 2) { $col_table = $src_exploded[0]; $cond = explode("=",$src_exploded[1]); if (sizeof($cond) == 2) { $src = $cond[1]; } } else { $src = $src_exploded[1]; $col_table = $src_exploded[0]; } if ( empty( $dashboard_model_saved ) ) { //Code for unsetting the position for hidden columns if ( ! empty( $column['position'] ) ) { unset( $column['position'] ); } $position = array_search( $src, $visible_columns ); if ( $position !== false ) { $column['position'] = $position + 1; $column['hidden'] = false; } else { $column['hidden'] = true; } } if ( ! empty( $src ) ) { if ( empty( $dashboard_model_saved ) ) { if ( in_array( $src, $numeric_columns ) ) { $column['type'] = 'numeric'; $column['editor'] = 'customNumericEditor'; } elseif ( in_array( $src, $datetime_columns ) ) { $column['type'] = 'sm.datetime'; $column['editor'] = $column['type']; } elseif ( in_array( $src, $readonly_columns ) ) { $column['editor'] = false; } switch ( $src ) { case 'post_name': $column['name'] = __( 'Slug', 'smart-manager-for-wp-e-commerce' ); $column['key'] = __( 'Slug', 'smart-manager-for-wp-e-commerce' ); break; } } } } if (!empty($dashboard_model_saved)) { $col_model_diff = sm_array_recursive_diff( $dashboard_model_saved, $dashboard_model ); } //clearing the transients before return if (!empty($col_model_diff)) { delete_transient( 'sa_sm_'.$this->dashboard_key ); } return $dashboard_model; } } } pro/libraries/action-scheduler/classes/WP_CLI/Migration_Command.php000064400000011304147600337620021332 0ustar00 'Migrates actions to the DB tables store', 'synopsis' => [ [ 'type' => 'assoc', 'name' => 'batch-size', 'optional' => true, 'default' => 100, 'description' => 'The number of actions to process in each batch', ], [ 'type' => 'assoc', 'name' => 'free-memory-on', 'optional' => true, 'default' => 50, 'description' => 'The number of actions to process between freeing memory. 0 disables freeing memory', ], [ 'type' => 'assoc', 'name' => 'pause', 'optional' => true, 'default' => 0, 'description' => 'The number of seconds to pause when freeing memory', ], [ 'type' => 'flag', 'name' => 'dry-run', 'optional' => true, 'description' => 'Reports on the actions that would have been migrated, but does not change any data', ], ], ] ); } /** * Process the data migration. * * @param array $positional_args Required for WP CLI. Not used in migration. * @param array $assoc_args Optional arguments. * * @return void */ public function migrate( $positional_args, $assoc_args ) { $this->init_logging(); $config = $this->get_migration_config( $assoc_args ); $runner = new Runner( $config ); $runner->init_destination(); $batch_size = isset( $assoc_args[ 'batch-size' ] ) ? (int) $assoc_args[ 'batch-size' ] : 100; $free_on = isset( $assoc_args[ 'free-memory-on' ] ) ? (int) $assoc_args[ 'free-memory-on' ] : 50; $sleep = isset( $assoc_args[ 'pause' ] ) ? (int) $assoc_args[ 'pause' ] : 0; \ActionScheduler_DataController::set_free_ticks( $free_on ); \ActionScheduler_DataController::set_sleep_time( $sleep ); do { $actions_processed = $runner->run( $batch_size ); $this->total_processed += $actions_processed; } while ( $actions_processed > 0 ); if ( ! $config->get_dry_run() ) { // let the scheduler know that there's nothing left to do $scheduler = new Scheduler(); $scheduler->mark_complete(); } WP_CLI::success( sprintf( '%s complete. %d actions processed.', $config->get_dry_run() ? 'Dry run' : 'Migration', $this->total_processed ) ); } /** * Build the config object used to create the Runner * * @param array $args Optional arguments. * * @return ActionScheduler\Migration\Config */ private function get_migration_config( $args ) { $args = wp_parse_args( $args, [ 'dry-run' => false, ] ); $config = Controller::instance()->get_migration_config_object(); $config->set_dry_run( ! empty( $args[ 'dry-run' ] ) ); return $config; } /** * Hook command line logging into migration actions. */ private function init_logging() { add_action( 'action_scheduler/migrate_action_dry_run', function ( $action_id ) { WP_CLI::debug( sprintf( 'Dry-run: migrated action %d', $action_id ) ); }, 10, 1 ); add_action( 'action_scheduler/no_action_to_migrate', function ( $action_id ) { WP_CLI::debug( sprintf( 'No action found to migrate for ID %d', $action_id ) ); }, 10, 1 ); add_action( 'action_scheduler/migrate_action_failed', function ( $action_id ) { WP_CLI::warning( sprintf( 'Failed migrating action with ID %d', $action_id ) ); }, 10, 1 ); add_action( 'action_scheduler/migrate_action_incomplete', function ( $source_id, $destination_id ) { WP_CLI::warning( sprintf( 'Unable to remove source action with ID %d after migrating to new ID %d', $source_id, $destination_id ) ); }, 10, 2 ); add_action( 'action_scheduler/migrated_action', function ( $source_id, $destination_id ) { WP_CLI::debug( sprintf( 'Migrated source action with ID %d to new store with ID %d', $source_id, $destination_id ) ); }, 10, 2 ); add_action( 'action_scheduler/migration_batch_starting', function ( $batch ) { WP_CLI::debug( 'Beginning migration of batch: ' . print_r( $batch, true ) ); }, 10, 1 ); add_action( 'action_scheduler/migration_batch_complete', function ( $batch ) { WP_CLI::log( sprintf( 'Completed migration of %d actions', count( $batch ) ) ); }, 10, 1 ); } } pro/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Clean_Command.php000064400000007311147600337620024520 0ustar00] * : The maximum number of actions to delete per batch. Defaults to 20. * * [--batches=] * : Limit execution to a number of batches. Defaults to 0, meaning batches will continue all eligible actions are deleted. * * [--status=] * : Only clean actions with the specified status. Defaults to Canceled, Completed. Define multiple statuses as a comma separated string (without spaces), e.g. `--status=complete,failed,canceled` * * [--before=] * : Only delete actions with scheduled date older than this. Defaults to 31 days. e.g `--before='7 days ago'`, `--before='02-Feb-2020 20:20:20'` * * [--pause=] * : The number of seconds to pause between batches. Default no pause. * * @param array $args Positional arguments. * @param array $assoc_args Keyed arguments. * @throws \WP_CLI\ExitException When an error occurs. * * @subcommand clean */ public function clean( $args, $assoc_args ) { // Handle passed arguments. $batch = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'batch-size', 20 ) ); $batches = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'batches', 0 ) ); $status = explode( ',', WP_CLI\Utils\get_flag_value( $assoc_args, 'status', '' ) ); $status = array_filter( array_map( 'trim', $status ) ); $before = \WP_CLI\Utils\get_flag_value( $assoc_args, 'before', '' ); $sleep = \WP_CLI\Utils\get_flag_value( $assoc_args, 'pause', 0 ); $batches_completed = 0; $actions_deleted = 0; $unlimited = $batches === 0; try { $lifespan = as_get_datetime_object( $before ); } catch ( Exception $e ) { $lifespan = null; } try { // Custom queue cleaner instance. $cleaner = new ActionScheduler_QueueCleaner( null, $batch ); // Clean actions for as long as possible. while ( $unlimited || $batches_completed < $batches ) { if ( $sleep && $batches_completed > 0 ) { sleep( $sleep ); } $deleted = count( $cleaner->clean_actions( $status, $lifespan, null,'CLI' ) ); if ( $deleted <= 0 ) { break; } $actions_deleted += $deleted; $batches_completed++; $this->print_success( $deleted ); } } catch ( Exception $e ) { $this->print_error( $e ); } $this->print_total_batches( $batches_completed ); if ( $batches_completed > 1 ) { $this->print_success( $actions_deleted ); } } /** * Print WP CLI message about how many batches of actions were processed. * * @param int $batches_processed */ protected function print_total_batches( $batches_processed ) { WP_CLI::log( sprintf( /* translators: %d refers to the total number of batches processed */ _n( '%d batch processed.', '%d batches processed.', $batches_processed, 'woocommerce' ), $batches_processed ) ); } /** * Convert an exception into a WP CLI error. * * @param Exception $e The error object. * * @throws \WP_CLI\ExitException */ protected function print_error( Exception $e ) { WP_CLI::error( sprintf( /* translators: %s refers to the exception error message */ __( 'There was an error deleting an action: %s', 'woocommerce' ), $e->getMessage() ) ); } /** * Print a success message with the number of completed actions. * * @param int $actions_deleted */ protected function print_success( $actions_deleted ) { WP_CLI::success( sprintf( /* translators: %d refers to the total number of actions deleted */ _n( '%d action deleted.', '%d actions deleted.', $actions_deleted, 'woocommerce' ), $actions_deleted ) ); } } pro/libraries/action-scheduler/classes/WP_CLI/ProgressBar.php000064400000004713147600337620020202 0ustar00total_ticks = 0; $this->message = $message; $this->count = $count; $this->interval = $interval; } /** * Increment the progress bar ticks. */ public function tick() { if ( null === $this->progress_bar ) { $this->setup_progress_bar(); } $this->progress_bar->tick(); $this->total_ticks++; do_action( 'action_scheduler/progress_tick', $this->total_ticks ); } /** * Get the progress bar tick count. * * @return int */ public function current() { return $this->progress_bar ? $this->progress_bar->current() : 0; } /** * Finish the current progress bar. */ public function finish() { if ( null !== $this->progress_bar ) { $this->progress_bar->finish(); } $this->progress_bar = null; } /** * Set the message used when creating the progress bar. * * @param string $message The message to be used when the next progress bar is created. */ public function set_message( $message ) { $this->message = $message; } /** * Set the count for a new progress bar. * * @param integer $count The total number of ticks expected to complete. */ public function set_count( $count ) { $this->count = $count; $this->finish(); } /** * Set up the progress bar. */ protected function setup_progress_bar() { $this->progress_bar = \WP_CLI\Utils\make_progress_bar( $this->message, $this->count, $this->interval ); } } pro/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_Scheduler_command.php000064400000015211147600337620025452 0ustar00init(); $obj->register_tables( true ); WP_CLI::success( sprintf( /* translators: %s refers to the schema name*/ __( 'Registered schema for %s', 'woocommerce' ), $classname ) ); } } } /** * Run the Action Scheduler * * ## OPTIONS * * [--batch-size=] * : The maximum number of actions to run. Defaults to 100. * * [--batches=] * : Limit execution to a number of batches. Defaults to 0, meaning batches will continue being executed until all actions are complete. * * [--cleanup-batch-size=] * : The maximum number of actions to clean up. Defaults to the value of --batch-size. * * [--hooks=] * : Only run actions with the specified hook. Omitting this option runs actions with any hook. Define multiple hooks as a comma separated string (without spaces), e.g. `--hooks=hook_one,hook_two,hook_three` * * [--group=] * : Only run actions from the specified group. Omitting this option runs actions from all groups. * * [--exclude-groups=] * : Run actions from all groups except the specified group(s). Define multiple groups as a comma separated string (without spaces), e.g. '--group_a,group_b'. This option is ignored when `--group` is used. * * [--free-memory-on=] * : The number of actions to process between freeing memory. 0 disables freeing memory. Default 50. * * [--pause=] * : The number of seconds to pause when freeing memory. Default no pause. * * [--force] * : Whether to force execution despite the maximum number of concurrent processes being exceeded. * * @param array $args Positional arguments. * @param array $assoc_args Keyed arguments. * @throws \WP_CLI\ExitException When an error occurs. * * @subcommand run */ public function run( $args, $assoc_args ) { // Handle passed arguments. $batch = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'batch-size', 100 ) ); $batches = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'batches', 0 ) ); $clean = absint( \WP_CLI\Utils\get_flag_value( $assoc_args, 'cleanup-batch-size', $batch ) ); $hooks = explode( ',', WP_CLI\Utils\get_flag_value( $assoc_args, 'hooks', '' ) ); $hooks = array_filter( array_map( 'trim', $hooks ) ); $group = \WP_CLI\Utils\get_flag_value( $assoc_args, 'group', '' ); $exclude_groups = \WP_CLI\Utils\get_flag_value( $assoc_args, 'exclude-groups', '' ); $free_on = \WP_CLI\Utils\get_flag_value( $assoc_args, 'free-memory-on', 50 ); $sleep = \WP_CLI\Utils\get_flag_value( $assoc_args, 'pause', 0 ); $force = \WP_CLI\Utils\get_flag_value( $assoc_args, 'force', false ); ActionScheduler_DataController::set_free_ticks( $free_on ); ActionScheduler_DataController::set_sleep_time( $sleep ); $batches_completed = 0; $actions_completed = 0; $unlimited = $batches === 0; if ( is_callable( array( ActionScheduler::store(), 'set_claim_filter' ) ) ) { $exclude_groups = $this->parse_comma_separated_string( $exclude_groups ); if ( ! empty( $exclude_groups ) ) { ActionScheduler::store()->set_claim_filter('exclude-groups', $exclude_groups ); } } try { // Custom queue cleaner instance. $cleaner = new ActionScheduler_QueueCleaner( null, $clean ); // Get the queue runner instance $runner = new ActionScheduler_WPCLI_QueueRunner( null, null, $cleaner ); // Determine how many tasks will be run in the first batch. $total = $runner->setup( $batch, $hooks, $group, $force ); // Run actions for as long as possible. while ( $total > 0 ) { $this->print_total_actions( $total ); $actions_completed += $runner->run(); $batches_completed++; // Maybe set up tasks for the next batch. $total = ( $unlimited || $batches_completed < $batches ) ? $runner->setup( $batch, $hooks, $group, $force ) : 0; } } catch ( Exception $e ) { $this->print_error( $e ); } $this->print_total_batches( $batches_completed ); $this->print_success( $actions_completed ); } /** * Converts a string of comma-separated values into an array of those same values. * * @param string $string The string of one or more comma separated values. * * @return array */ private function parse_comma_separated_string( $string ) { return array_filter( str_getcsv( $string ) ); } /** * Print WP CLI message about how many actions are about to be processed. * * @author Jeremy Pry * * @param int $total */ protected function print_total_actions( $total ) { WP_CLI::log( sprintf( /* translators: %d refers to how many scheduled tasks were found to run */ _n( 'Found %d scheduled task', 'Found %d scheduled tasks', $total, 'woocommerce' ), $total ) ); } /** * Print WP CLI message about how many batches of actions were processed. * * @author Jeremy Pry * * @param int $batches_completed */ protected function print_total_batches( $batches_completed ) { WP_CLI::log( sprintf( /* translators: %d refers to the total number of batches executed */ _n( '%d batch executed.', '%d batches executed.', $batches_completed, 'woocommerce' ), $batches_completed ) ); } /** * Convert an exception into a WP CLI error. * * @author Jeremy Pry * * @param Exception $e The error object. * * @throws \WP_CLI\ExitException */ protected function print_error( Exception $e ) { WP_CLI::error( sprintf( /* translators: %s refers to the exception error message */ __( 'There was an error running the action scheduler: %s', 'woocommerce' ), $e->getMessage() ) ); } /** * Print a success message with the number of completed actions. * * @author Jeremy Pry * * @param int $actions_completed */ protected function print_success( $actions_completed ) { WP_CLI::success( sprintf( /* translators: %d refers to the total number of tasks completed */ _n( '%d scheduled task completed.', '%d scheduled tasks completed.', $actions_completed, 'woocommerce' ), $actions_completed ) ); } } pro/libraries/action-scheduler/classes/WP_CLI/ActionScheduler_WPCLI_QueueRunner.php000064400000014147147600337620024323 0ustar00run_cleanup(); $this->add_hooks(); // Check to make sure there aren't too many concurrent processes running. if ( $this->has_maximum_concurrent_batches() ) { if ( $force ) { WP_CLI::warning( __( 'There are too many concurrent batches, but the run is forced to continue.', 'woocommerce' ) ); } else { WP_CLI::error( __( 'There are too many concurrent batches.', 'woocommerce' ) ); } } // Stake a claim and store it. $this->claim = $this->store->stake_claim( $batch_size, null, $hooks, $group ); $this->monitor->attach( $this->claim ); $this->actions = $this->claim->get_actions(); return count( $this->actions ); } /** * Add our hooks to the appropriate actions. * * @author Jeremy Pry */ protected function add_hooks() { add_action( 'action_scheduler_before_execute', array( $this, 'before_execute' ) ); add_action( 'action_scheduler_after_execute', array( $this, 'after_execute' ), 10, 2 ); add_action( 'action_scheduler_failed_execution', array( $this, 'action_failed' ), 10, 2 ); } /** * Set up the WP CLI progress bar. * * @author Jeremy Pry */ protected function setup_progress_bar() { $count = count( $this->actions ); $this->progress_bar = new ProgressBar( /* translators: %d: amount of actions */ sprintf( _n( 'Running %d action', 'Running %d actions', $count, 'woocommerce' ), $count ), $count ); } /** * Process actions in the queue. * * @author Jeremy Pry * * @param string $context Optional runner context. Default 'WP CLI'. * * @return int The number of actions processed. */ public function run( $context = 'WP CLI' ) { do_action( 'action_scheduler_before_process_queue' ); $this->setup_progress_bar(); foreach ( $this->actions as $action_id ) { // Error if we lost the claim. if ( ! in_array( $action_id, $this->store->find_actions_by_claim_id( $this->claim->get_id() ) ) ) { WP_CLI::warning( __( 'The claim has been lost. Aborting current batch.', 'woocommerce' ) ); break; } $this->process_action( $action_id, $context ); $this->progress_bar->tick(); } $completed = $this->progress_bar->current(); $this->progress_bar->finish(); $this->store->release_claim( $this->claim ); do_action( 'action_scheduler_after_process_queue' ); return $completed; } /** * Handle WP CLI message when the action is starting. * * @author Jeremy Pry * * @param $action_id */ public function before_execute( $action_id ) { /* translators: %s refers to the action ID */ WP_CLI::log( sprintf( __( 'Started processing action %s', 'woocommerce' ), $action_id ) ); } /** * Handle WP CLI message when the action has completed. * * @author Jeremy Pry * * @param int $action_id * @param null|ActionScheduler_Action $action The instance of the action. Default to null for backward compatibility. */ public function after_execute( $action_id, $action = null ) { // backward compatibility if ( null === $action ) { $action = $this->store->fetch_action( $action_id ); } /* translators: 1: action ID 2: hook name */ WP_CLI::log( sprintf( __( 'Completed processing action %1$s with hook: %2$s', 'woocommerce' ), $action_id, $action->get_hook() ) ); } /** * Handle WP CLI message when the action has failed. * * @author Jeremy Pry * * @param int $action_id * @param Exception $exception * @throws \WP_CLI\ExitException With failure message. */ public function action_failed( $action_id, $exception ) { WP_CLI::error( /* translators: 1: action ID 2: exception message */ sprintf( __( 'Error processing action %1$s: %2$s', 'woocommerce' ), $action_id, $exception->getMessage() ), false ); } /** * Sleep and help avoid hitting memory limit * * @param int $sleep_time Amount of seconds to sleep * @deprecated 3.0.0 */ protected function stop_the_insanity( $sleep_time = 0 ) { _deprecated_function( 'ActionScheduler_WPCLI_QueueRunner::stop_the_insanity', '3.0.0', 'ActionScheduler_DataController::free_memory' ); ActionScheduler_DataController::free_memory(); } /** * Maybe trigger the stop_the_insanity() method to free up memory. */ protected function maybe_stop_the_insanity() { // The value returned by progress_bar->current() might be padded. Remove padding, and convert to int. $current_iteration = intval( trim( $this->progress_bar->current() ) ); if ( 0 === $current_iteration % 50 ) { $this->stop_the_insanity(); } } } pro/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_RecurringSchedule.php000064400000006146147600337620027320 0ustar00start - and logic to calculate the next run date after * that - @see $this->calculate_next(). The $first_date property also keeps a record of when the very * first instance of this chain of schedules ran. * * @var DateTime */ private $first_date = NULL; /** * Timestamp equivalent of @see $this->first_date * * @var int */ protected $first_timestamp = NULL; /** * The recurrance between each time an action is run using this schedule. * Used to calculate the start date & time. Can be a number of seconds, in the * case of ActionScheduler_IntervalSchedule, or a cron expression, as in the * case of ActionScheduler_CronSchedule. Or something else. * * @var mixed */ protected $recurrence; /** * @param DateTime $date The date & time to run the action. * @param mixed $recurrence The data used to determine the schedule's recurrance. * @param DateTime|null $first (Optional) The date & time the first instance of this interval schedule ran. Default null, meaning this is the first instance. */ public function __construct( DateTime $date, $recurrence, DateTime $first = null ) { parent::__construct( $date ); $this->first_date = empty( $first ) ? $date : $first; $this->recurrence = $recurrence; } /** * @return bool */ public function is_recurring() { return true; } /** * Get the date & time of the first schedule in this recurring series. * * @return DateTime|null */ public function get_first_date() { return clone $this->first_date; } /** * @return string */ public function get_recurrence() { return $this->recurrence; } /** * For PHP 5.2 compat, since DateTime objects can't be serialized * @return array */ public function __sleep() { $sleep_params = parent::__sleep(); $this->first_timestamp = $this->first_date->getTimestamp(); return array_merge( $sleep_params, array( 'first_timestamp', 'recurrence' ) ); } /** * Unserialize recurring schedules serialized/stored prior to AS 3.0.0 * * Prior to Action Scheduler 3.0.0, schedules used different property names to refer * to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp * was the same as ActionScheduler_SimpleSchedule::timestamp. This was addressed in * Action Scheduler 3.0.0, where properties and property names were aligned for better * inheritance. To maintain backward compatibility with scheduled serialized and stored * prior to 3.0, we need to correctly map the old property names. */ public function __wakeup() { parent::__wakeup(); if ( $this->first_timestamp > 0 ) { $this->first_date = as_get_datetime_object( $this->first_timestamp ); } else { $this->first_date = $this->get_date(); } } } pro/libraries/action-scheduler/classes/abstracts/ActionScheduler_Store.php000064400000031717147600337620023156 0ustar00 null, 'status' => self::STATUS_PENDING, 'group' => '', ) ); // These params are fixed for this method. $params['hook'] = $hook; $params['orderby'] = 'date'; $params['per_page'] = 1; if ( ! empty( $params['status'] ) ) { if ( self::STATUS_PENDING === $params['status'] ) { $params['order'] = 'ASC'; // Find the next action that matches. } else { $params['order'] = 'DESC'; // Find the most recent action that matches. } } $results = $this->query_actions( $params ); return empty( $results ) ? null : $results[0]; } /** * Query for action count or list of action IDs. * * @since 3.3.0 $query['status'] accepts array of statuses instead of a single status. * * @param array $query { * Query filtering options. * * @type string $hook The name of the actions. Optional. * @type string|array $status The status or statuses of the actions. Optional. * @type array $args The args array of the actions. Optional. * @type DateTime $date The scheduled date of the action. Used in UTC timezone. Optional. * @type string $date_compare Operator for selecting by $date param. Accepted values are '!=', '>', '>=', '<', '<=', '='. Defaults to '<='. * @type DateTime $modified The last modified date of the action. Used in UTC timezone. Optional. * @type string $modified_compare Operator for comparing $modified param. Accepted values are '!=', '>', '>=', '<', '<=', '='. Defaults to '<='. * @type string $group The group the action belongs to. Optional. * @type bool|int $claimed TRUE to find claimed actions, FALSE to find unclaimed actions, an int to find a specific claim ID. Optional. * @type int $per_page Number of results to return. Defaults to 5. * @type int $offset The query pagination offset. Defaults to 0. * @type int $orderby Accepted values are 'hook', 'group', 'modified', 'date' or 'none'. Defaults to 'date'. * @type string $order Accepted values are 'ASC' or 'DESC'. Defaults to 'ASC'. * } * @param string $query_type Whether to select or count the results. Default, select. * * @return string|array|null The IDs of actions matching the query. Null on failure. */ abstract public function query_actions( $query = array(), $query_type = 'select' ); /** * Run query to get a single action ID. * * @since 3.3.0 * * @see ActionScheduler_Store::query_actions for $query arg usage but 'per_page' and 'offset' can't be used. * * @param array $query Query parameters. * * @return int|null */ public function query_action( $query ) { $query['per_page'] = 1; $query['offset'] = 0; $results = $this->query_actions( $query ); if ( empty( $results ) ) { return null; } else { return (int) $results[0]; } } /** * Get a count of all actions in the store, grouped by status * * @return array */ abstract public function action_counts(); /** * Get additional action counts. * * - add past-due actions * * @return array */ public function extra_action_counts() { $extra_actions = array(); $pastdue_action_counts = ( int ) $this->query_actions( array( 'status' => self::STATUS_PENDING, 'date' => as_get_datetime_object(), ), 'count' ); if ( $pastdue_action_counts ) { $extra_actions['past-due'] = $pastdue_action_counts; } /** * Allows 3rd party code to add extra action counts (used in filters in the list table). * * @since 3.5.0 * @param $extra_actions array Array with format action_count_identifier => action count. */ return apply_filters( 'action_scheduler_extra_action_counts', $extra_actions ); } /** * @param string $action_id */ abstract public function cancel_action( $action_id ); /** * @param string $action_id */ abstract public function delete_action( $action_id ); /** * @param string $action_id * * @return DateTime The date the action is schedule to run, or the date that it ran. */ abstract public function get_date( $action_id ); /** * @param int $max_actions * @param DateTime $before_date Claim only actions schedule before the given date. Defaults to now. * @param array $hooks Claim only actions with a hook or hooks. * @param string $group Claim only actions in the given group. * * @return ActionScheduler_ActionClaim */ abstract public function stake_claim( $max_actions = 10, DateTime $before_date = null, $hooks = array(), $group = '' ); /** * @return int */ abstract public function get_claim_count(); /** * @param ActionScheduler_ActionClaim $claim */ abstract public function release_claim( ActionScheduler_ActionClaim $claim ); /** * @param string $action_id */ abstract public function unclaim_action( $action_id ); /** * @param string $action_id */ abstract public function mark_failure( $action_id ); /** * @param string $action_id */ abstract public function log_execution( $action_id ); /** * @param string $action_id */ abstract public function mark_complete( $action_id ); /** * @param string $action_id * * @return string */ abstract public function get_status( $action_id ); /** * @param string $action_id * @return mixed */ abstract public function get_claim_id( $action_id ); /** * @param string $claim_id * @return array */ abstract public function find_actions_by_claim_id( $claim_id ); /** * @param string $comparison_operator * @return string */ protected function validate_sql_comparator( $comparison_operator ) { if ( in_array( $comparison_operator, array('!=', '>', '>=', '<', '<=', '=') ) ) { return $comparison_operator; } return '='; } /** * Get the time MySQL formated date/time string for an action's (next) scheduled date. * * @param ActionScheduler_Action $action * @param DateTime $scheduled_date (optional) * @return string */ protected function get_scheduled_date_string( ActionScheduler_Action $action, DateTime $scheduled_date = NULL ) { $next = null === $scheduled_date ? $action->get_schedule()->get_date() : $scheduled_date; if ( ! $next ) { $next = date_create(); } $next->setTimezone( new DateTimeZone( 'UTC' ) ); return $next->format( 'Y-m-d H:i:s' ); } /** * Get the time MySQL formated date/time string for an action's (next) scheduled date. * * @param ActionScheduler_Action $action * @param DateTime $scheduled_date (optional) * @return string */ protected function get_scheduled_date_string_local( ActionScheduler_Action $action, DateTime $scheduled_date = NULL ) { $next = null === $scheduled_date ? $action->get_schedule()->get_date() : $scheduled_date; if ( ! $next ) { $next = date_create(); } ActionScheduler_TimezoneHelper::set_local_timezone( $next ); return $next->format( 'Y-m-d H:i:s' ); } /** * Validate that we could decode action arguments. * * @param mixed $args The decoded arguments. * @param int $action_id The action ID. * * @throws ActionScheduler_InvalidActionException When the decoded arguments are invalid. */ protected function validate_args( $args, $action_id ) { // Ensure we have an array of args. if ( ! is_array( $args ) ) { throw ActionScheduler_InvalidActionException::from_decoding_args( $action_id ); } // Validate JSON decoding if possible. if ( function_exists( 'json_last_error' ) && JSON_ERROR_NONE !== json_last_error() ) { throw ActionScheduler_InvalidActionException::from_decoding_args( $action_id, $args ); } } /** * Validate a ActionScheduler_Schedule object. * * @param mixed $schedule The unserialized ActionScheduler_Schedule object. * @param int $action_id The action ID. * * @throws ActionScheduler_InvalidActionException When the schedule is invalid. */ protected function validate_schedule( $schedule, $action_id ) { if ( empty( $schedule ) || ! is_a( $schedule, 'ActionScheduler_Schedule' ) ) { throw ActionScheduler_InvalidActionException::from_schedule( $action_id, $schedule ); } } /** * InnoDB indexes have a maximum size of 767 bytes by default, which is only 191 characters with utf8mb4. * * Previously, AS wasn't concerned about args length, as we used the (unindex) post_content column. However, * with custom tables, we use an indexed VARCHAR column instead. * * @param ActionScheduler_Action $action Action to be validated. * @throws InvalidArgumentException When json encoded args is too long. */ protected function validate_action( ActionScheduler_Action $action ) { if ( strlen( json_encode( $action->get_args() ) ) > static::$max_args_length ) { throw new InvalidArgumentException( sprintf( __( 'ActionScheduler_Action::$args too long. To ensure the args column can be indexed, action args should not be more than %d characters when encoded as JSON.', 'woocommerce' ), static::$max_args_length ) ); } } /** * Cancel pending actions by hook. * * @since 3.0.0 * * @param string $hook Hook name. * * @return void */ public function cancel_actions_by_hook( $hook ) { $action_ids = true; while ( ! empty( $action_ids ) ) { $action_ids = $this->query_actions( array( 'hook' => $hook, 'status' => self::STATUS_PENDING, 'per_page' => 1000, 'orderby' => 'action_id', ) ); $this->bulk_cancel_actions( $action_ids ); } } /** * Cancel pending actions by group. * * @since 3.0.0 * * @param string $group Group slug. * * @return void */ public function cancel_actions_by_group( $group ) { $action_ids = true; while ( ! empty( $action_ids ) ) { $action_ids = $this->query_actions( array( 'group' => $group, 'status' => self::STATUS_PENDING, 'per_page' => 1000, 'orderby' => 'action_id', ) ); $this->bulk_cancel_actions( $action_ids ); } } /** * Cancel a set of action IDs. * * @since 3.0.0 * * @param array $action_ids List of action IDs. * * @return void */ private function bulk_cancel_actions( $action_ids ) { foreach ( $action_ids as $action_id ) { $this->cancel_action( $action_id ); } do_action( 'action_scheduler_bulk_cancel_actions', $action_ids ); } /** * @return array */ public function get_status_labels() { return array( self::STATUS_COMPLETE => __( 'Complete', 'woocommerce' ), self::STATUS_PENDING => __( 'Pending', 'woocommerce' ), self::STATUS_RUNNING => __( 'In-progress', 'woocommerce' ), self::STATUS_FAILED => __( 'Failed', 'woocommerce' ), self::STATUS_CANCELED => __( 'Canceled', 'woocommerce' ), ); } /** * Check if there are any pending scheduled actions due to run. * * @param ActionScheduler_Action $action * @param DateTime $scheduled_date (optional) * @return string */ public function has_pending_actions_due() { $pending_actions = $this->query_actions( array( 'date' => as_get_datetime_object(), 'status' => ActionScheduler_Store::STATUS_PENDING, 'orderby' => 'none', ) ); return ! empty( $pending_actions ); } /** * Callable initialization function optionally overridden in derived classes. */ public function init() {} /** * Callable function to mark an action as migrated optionally overridden in derived classes. */ public function mark_migrated( $action_id ) {} /** * @return ActionScheduler_Store */ public static function instance() { if ( empty( self::$store ) ) { $class = apply_filters( 'action_scheduler_store_class', self::DEFAULT_CLASS ); self::$store = new $class(); } return self::$store; } } pro/libraries/action-scheduler/classes/abstracts/ActionScheduler.php000064400000022776147600337620022007 0ustar00init() (or it's parent method) set this itself, * once it has initialized, however that would cause problems in cases where a custom data store is in * use and it has not yet been updated to follow that same logic. */ function () { self::$data_store_initialized = true; /** * Fires when Action Scheduler is ready: it is safe to use the procedural API after this point. * * @since 3.5.5 */ do_action( 'action_scheduler_init' ); }, 1 ); } else { $admin_view->init(); $store->init(); $logger->init(); $runner->init(); self::$data_store_initialized = true; /** * Fires when Action Scheduler is ready: it is safe to use the procedural API after this point. * * @since 3.5.5 */ do_action( 'action_scheduler_init' ); } if ( apply_filters( 'action_scheduler_load_deprecated_functions', true ) ) { require_once( self::plugin_path( 'deprecated/functions.php' ) ); } if ( defined( 'WP_CLI' ) && WP_CLI ) { WP_CLI::add_command( 'action-scheduler', 'ActionScheduler_WPCLI_Scheduler_command' ); WP_CLI::add_command( 'action-scheduler', 'ActionScheduler_WPCLI_Clean_Command' ); if ( ! ActionScheduler_DataController::is_migration_complete() && Controller::instance()->allow_migration() ) { $command = new Migration_Command(); $command->register(); } } /** * Handle WP comment cleanup after migration. */ if ( is_a( $logger, 'ActionScheduler_DBLogger' ) && ActionScheduler_DataController::is_migration_complete() && ActionScheduler_WPCommentCleaner::has_logs() ) { ActionScheduler_WPCommentCleaner::init(); } add_action( 'action_scheduler/migration_complete', 'ActionScheduler_WPCommentCleaner::maybe_schedule_cleanup' ); } /** * Check whether the AS data store has been initialized. * * @param string $function_name The name of the function being called. Optional. Default `null`. * @return bool */ public static function is_initialized( $function_name = null ) { if ( ! self::$data_store_initialized && ! empty( $function_name ) ) { $message = sprintf( /* translators: %s function name. */ __( '%s() was called before the Action Scheduler data store was initialized', 'woocommerce' ), esc_attr( $function_name ) ); error_log( $message ); } return self::$data_store_initialized; } /** * Determine if the class is one of our abstract classes. * * @since 3.0.0 * * @param string $class The class name. * * @return bool */ protected static function is_class_abstract( $class ) { static $abstracts = array( 'ActionScheduler' => true, 'ActionScheduler_Abstract_ListTable' => true, 'ActionScheduler_Abstract_QueueRunner' => true, 'ActionScheduler_Abstract_Schedule' => true, 'ActionScheduler_Abstract_RecurringSchedule' => true, 'ActionScheduler_Lock' => true, 'ActionScheduler_Logger' => true, 'ActionScheduler_Abstract_Schema' => true, 'ActionScheduler_Store' => true, 'ActionScheduler_TimezoneHelper' => true, ); return isset( $abstracts[ $class ] ) && $abstracts[ $class ]; } /** * Determine if the class is one of our migration classes. * * @since 3.0.0 * * @param string $class The class name. * * @return bool */ protected static function is_class_migration( $class ) { static $migration_segments = array( 'ActionMigrator' => true, 'BatchFetcher' => true, 'DBStoreMigrator' => true, 'DryRun' => true, 'LogMigrator' => true, 'Config' => true, 'Controller' => true, 'Runner' => true, 'Scheduler' => true, ); $segments = explode( '_', $class ); $segment = isset( $segments[ 1 ] ) ? $segments[ 1 ] : $class; return isset( $migration_segments[ $segment ] ) && $migration_segments[ $segment ]; } /** * Determine if the class is one of our WP CLI classes. * * @since 3.0.0 * * @param string $class The class name. * * @return bool */ protected static function is_class_cli( $class ) { static $cli_segments = array( 'QueueRunner' => true, 'Command' => true, 'ProgressBar' => true, ); $segments = explode( '_', $class ); $segment = isset( $segments[ 1 ] ) ? $segments[ 1 ] : $class; return isset( $cli_segments[ $segment ] ) && $cli_segments[ $segment ]; } final public function __clone() { trigger_error("Singleton. No cloning allowed!", E_USER_ERROR); } final public function __wakeup() { trigger_error("Singleton. No serialization allowed!", E_USER_ERROR); } final private function __construct() {} /** Deprecated **/ public static function get_datetime_object( $when = null, $timezone = 'UTC' ) { _deprecated_function( __METHOD__, '2.0', 'wcs_add_months()' ); return as_get_datetime_object( $when, $timezone ); } /** * Issue deprecated warning if an Action Scheduler function is called in the shutdown hook. * * @param string $function_name The name of the function being called. * @deprecated 3.1.6. */ public static function check_shutdown_hook( $function_name ) { _deprecated_function( __FUNCTION__, '3.1.6' ); } } pro/libraries/action-scheduler/classes/abstracts/ActionScheduler_TimezoneHelper.php000064400000010476147600337620025013 0ustar00format( 'U' ) ); } if ( get_option( 'timezone_string' ) ) { $date->setTimezone( new DateTimeZone( self::get_local_timezone_string() ) ); } else { $date->setUtcOffset( self::get_local_timezone_offset() ); } return $date; } /** * Helper to retrieve the timezone string for a site until a WP core method exists * (see https://core.trac.wordpress.org/ticket/24730). * * Adapted from wc_timezone_string() and https://secure.php.net/manual/en/function.timezone-name-from-abbr.php#89155. * * If no timezone string is set, and its not possible to match the UTC offset set for the site to a timezone * string, then an empty string will be returned, and the UTC offset should be used to set a DateTime's * timezone. * * @since 2.1.0 * @return string PHP timezone string for the site or empty if no timezone string is available. */ protected static function get_local_timezone_string( $reset = false ) { // If site timezone string exists, return it. $timezone = get_option( 'timezone_string' ); if ( $timezone ) { return $timezone; } // Get UTC offset, if it isn't set then return UTC. $utc_offset = intval( get_option( 'gmt_offset', 0 ) ); if ( 0 === $utc_offset ) { return 'UTC'; } // Adjust UTC offset from hours to seconds. $utc_offset *= 3600; // Attempt to guess the timezone string from the UTC offset. $timezone = timezone_name_from_abbr( '', $utc_offset ); if ( $timezone ) { return $timezone; } // Last try, guess timezone string manually. foreach ( timezone_abbreviations_list() as $abbr ) { foreach ( $abbr as $city ) { if ( (bool) date( 'I' ) === (bool) $city['dst'] && $city['timezone_id'] && intval( $city['offset'] ) === $utc_offset ) { return $city['timezone_id']; } } } // No timezone string return ''; } /** * Get timezone offset in seconds. * * @since 2.1.0 * @return float */ protected static function get_local_timezone_offset() { $timezone = get_option( 'timezone_string' ); if ( $timezone ) { $timezone_object = new DateTimeZone( $timezone ); return $timezone_object->getOffset( new DateTime( 'now' ) ); } else { return floatval( get_option( 'gmt_offset', 0 ) ) * HOUR_IN_SECONDS; } } /** * @deprecated 2.1.0 */ public static function get_local_timezone( $reset = FALSE ) { _deprecated_function( __FUNCTION__, '2.1.0', 'ActionScheduler_TimezoneHelper::set_local_timezone()' ); if ( $reset ) { self::$local_timezone = NULL; } if ( !isset(self::$local_timezone) ) { $tzstring = get_option('timezone_string'); if ( empty($tzstring) ) { $gmt_offset = get_option('gmt_offset'); if ( $gmt_offset == 0 ) { $tzstring = 'UTC'; } else { $gmt_offset *= HOUR_IN_SECONDS; $tzstring = timezone_name_from_abbr( '', $gmt_offset, 1 ); // If there's no timezone string, try again with no DST. if ( false === $tzstring ) { $tzstring = timezone_name_from_abbr( '', $gmt_offset, 0 ); } // Try mapping to the first abbreviation we can find. if ( false === $tzstring ) { $is_dst = date( 'I' ); foreach ( timezone_abbreviations_list() as $abbr ) { foreach ( $abbr as $city ) { if ( $city['dst'] == $is_dst && $city['offset'] == $gmt_offset ) { // If there's no valid timezone ID, keep looking. if ( null === $city['timezone_id'] ) { continue; } $tzstring = $city['timezone_id']; break 2; } } } } // If we still have no valid string, then fall back to UTC. if ( false === $tzstring ) { $tzstring = 'UTC'; } } } self::$local_timezone = new DateTimeZone($tzstring); } return self::$local_timezone; } } pro/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_Schema.php000064400000011165147600337620025100 0ustar00tables as $table ) { $wpdb->tables[] = $table; $name = $this->get_full_table_name( $table ); $wpdb->$table = $name; } // create the tables if ( $this->schema_update_required() || $force_update ) { foreach ( $this->tables as $table ) { /** * Allow custom processing before updating a table schema. * * @param string $table Name of table being updated. * @param string $db_version Existing version of the table being updated. */ do_action( 'action_scheduler_before_schema_update', $table, $this->db_version ); $this->update_table( $table ); } $this->mark_schema_update_complete(); } } /** * @param string $table The name of the table * * @return string The CREATE TABLE statement, suitable for passing to dbDelta */ abstract protected function get_table_definition( $table ); /** * Determine if the database schema is out of date * by comparing the integer found in $this->schema_version * with the option set in the WordPress options table * * @return bool */ private function schema_update_required() { $option_name = 'schema-' . static::class; $this->db_version = get_option( $option_name, 0 ); // Check for schema option stored by the Action Scheduler Custom Tables plugin in case site has migrated from that plugin with an older schema if ( 0 === $this->db_version ) { $plugin_option_name = 'schema-'; switch ( static::class ) { case 'ActionScheduler_StoreSchema': $plugin_option_name .= 'Action_Scheduler\Custom_Tables\DB_Store_Table_Maker'; break; case 'ActionScheduler_LoggerSchema': $plugin_option_name .= 'Action_Scheduler\Custom_Tables\DB_Logger_Table_Maker'; break; } $this->db_version = get_option( $plugin_option_name, 0 ); delete_option( $plugin_option_name ); } return version_compare( $this->db_version, $this->schema_version, '<' ); } /** * Update the option in WordPress to indicate that * our schema is now up to date * * @return void */ private function mark_schema_update_complete() { $option_name = 'schema-' . static::class; // work around race conditions and ensure that our option updates $value_to_save = (string) $this->schema_version . '.0.' . time(); update_option( $option_name, $value_to_save ); } /** * Update the schema for the given table * * @param string $table The name of the table to update * * @return void */ private function update_table( $table ) { require_once ABSPATH . 'wp-admin/includes/upgrade.php'; $definition = $this->get_table_definition( $table ); if ( $definition ) { $updated = dbDelta( $definition ); foreach ( $updated as $updated_table => $update_description ) { if ( strpos( $update_description, 'Created table' ) === 0 ) { do_action( 'action_scheduler/created_table', $updated_table, $table ); } } } } /** * @param string $table * * @return string The full name of the table, including the * table prefix for the current blog */ protected function get_full_table_name( $table ) { return $GLOBALS['wpdb']->prefix . $table; } /** * Confirms that all of the tables registered by this schema class have been created. * * @return bool */ public function tables_exist() { global $wpdb; $tables_exist = true; foreach ( $this->tables as $table_name ) { $table_name = $wpdb->prefix . $table_name; $pattern = str_replace( '_', '\\_', $table_name ); $existing_table = $wpdb->get_var( $wpdb->prepare( 'SHOW TABLES LIKE %s', $pattern ) ); if ( $existing_table !== $table_name ) { $tables_exist = false; break; } } return $tables_exist; } } pro/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_QueueRunner.php000064400000032143147600337620026155 0ustar00created_time = microtime( true ); $this->store = $store ? $store : ActionScheduler_Store::instance(); $this->monitor = $monitor ? $monitor : new ActionScheduler_FatalErrorMonitor( $this->store ); $this->cleaner = $cleaner ? $cleaner : new ActionScheduler_QueueCleaner( $this->store ); } /** * Process an individual action. * * @param int $action_id The action ID to process. * @param string $context Optional identifer for the context in which this action is being processed, e.g. 'WP CLI' or 'WP Cron' * Generally, this should be capitalised and not localised as it's a proper noun. */ public function process_action( $action_id, $context = '' ) { // Temporarily override the error handler while we process the current action. set_error_handler( /** * Temporary error handler which can catch errors and convert them into exceptions. This faciliates more * robust error handling across all supported PHP versions. * * @throws Exception * * @param int $type Error level expressed as an integer. * @param string $message Error message. */ function ( $type, $message ) { throw new Exception( $message ); }, E_USER_ERROR | E_RECOVERABLE_ERROR ); /* * The nested try/catch structure is required because we potentially need to convert thrown errors into * exceptions (and an exception thrown from a catch block cannot be caught by a later catch block in the *same* * structure). */ try { try { $valid_action = false; do_action( 'action_scheduler_before_execute', $action_id, $context ); if ( ActionScheduler_Store::STATUS_PENDING !== $this->store->get_status( $action_id ) ) { do_action( 'action_scheduler_execution_ignored', $action_id, $context ); return; } $valid_action = true; do_action( 'action_scheduler_begin_execute', $action_id, $context ); $action = $this->store->fetch_action( $action_id ); $this->store->log_execution( $action_id ); $action->execute(); do_action( 'action_scheduler_after_execute', $action_id, $action, $context ); $this->store->mark_complete( $action_id ); } catch ( Throwable $e ) { // Throwable is defined when executing under PHP 7.0 and up. We convert it to an exception, for // compatibility with ActionScheduler_Logger. throw new Exception( $e->getMessage(), $e->getCode(), $e->getPrevious() ); } } catch ( Exception $e ) { // This catch block exists for compatibility with PHP 5.6. $this->handle_action_error( $action_id, $e, $context, $valid_action ); } finally { restore_error_handler(); } if ( isset( $action ) && is_a( $action, 'ActionScheduler_Action' ) && $action->get_schedule()->is_recurring() ) { $this->schedule_next_instance( $action, $action_id ); } } /** * Marks actions as either having failed execution or failed validation, as appropriate. * * @param int $action_id Action ID. * @param Exception $e Exception instance. * @param string $context Execution context. * @param bool $valid_action If the action is valid. * * @return void */ private function handle_action_error( $action_id, $e, $context, $valid_action ) { if ( $valid_action ) { $this->store->mark_failure( $action_id ); /** * Runs when action execution fails. * * @param int $action_id Action ID. * @param Exception $e Exception instance. * @param string $context Execution context. */ do_action( 'action_scheduler_failed_execution', $action_id, $e, $context ); } else { /** * Runs when action validation fails. * * @param int $action_id Action ID. * @param Exception $e Exception instance. * @param string $context Execution context. */ do_action( 'action_scheduler_failed_validation', $action_id, $e, $context ); } } /** * Schedule the next instance of the action if necessary. * * @param ActionScheduler_Action $action * @param int $action_id */ protected function schedule_next_instance( ActionScheduler_Action $action, $action_id ) { // If a recurring action has been consistently failing, we may wish to stop rescheduling it. if ( ActionScheduler_Store::STATUS_FAILED === $this->store->get_status( $action_id ) && $this->recurring_action_is_consistently_failing( $action, $action_id ) ) { ActionScheduler_Logger::instance()->log( $action_id, __( 'This action appears to be consistently failing. A new instance will not be scheduled.', 'woocommerce' ) ); return; } try { ActionScheduler::factory()->repeat( $action ); } catch ( Exception $e ) { do_action( 'action_scheduler_failed_to_schedule_next_instance', $action_id, $e, $action ); } } /** * Determine if the specified recurring action has been consistently failing. * * @param ActionScheduler_Action $action The recurring action to be rescheduled. * @param int $action_id The ID of the recurring action. * * @return bool */ private function recurring_action_is_consistently_failing( ActionScheduler_Action $action, $action_id ) { /** * Controls the failure threshold for recurring actions. * * Before rescheduling a recurring action, we look at its status. If it failed, we then check if all of the most * recent actions (upto the threshold set by this filter) sharing the same hook have also failed: if they have, * that is considered consistent failure and a new instance of the action will not be scheduled. * * @param int $failure_threshold Number of actions of the same hook to examine for failure. Defaults to 5. */ $consistent_failure_threshold = (int) apply_filters( 'action_scheduler_recurring_action_failure_threshold', 5 ); // This query should find the earliest *failing* action (for the hook we are interested in) within our threshold. $query_args = array( 'hook' => $action->get_hook(), 'status' => ActionScheduler_Store::STATUS_FAILED, 'date' => date_create( 'now', timezone_open( 'UTC' ) )->format( 'Y-m-d H:i:s' ), 'date_compare' => '<', 'per_page' => 1, 'offset' => $consistent_failure_threshold - 1 ); $first_failing_action_id = $this->store->query_actions( $query_args ); // If we didn't retrieve an action ID, then there haven't been enough failures for us to worry about. if ( empty( $first_failing_action_id ) ) { return false; } // Now let's fetch the first action (having the same hook) of *any status* within the same window. unset( $query_args['status'] ); $first_action_id_with_the_same_hook = $this->store->query_actions( $query_args ); /** * If a recurring action is assessed as consistently failing, it will not be rescheduled. This hook provides a * way to observe and optionally override that assessment. * * @param bool $is_consistently_failing If the action is considered to be consistently failing. * @param ActionScheduler_Action $action The action being assessed. */ return (bool) apply_filters( 'action_scheduler_recurring_action_is_consistently_failing', $first_action_id_with_the_same_hook === $first_failing_action_id, $action ); } /** * Run the queue cleaner. * * @author Jeremy Pry */ protected function run_cleanup() { $this->cleaner->clean( 10 * $this->get_time_limit() ); } /** * Get the number of concurrent batches a runner allows. * * @return int */ public function get_allowed_concurrent_batches() { return apply_filters( 'action_scheduler_queue_runner_concurrent_batches', 1 ); } /** * Check if the number of allowed concurrent batches is met or exceeded. * * @return bool */ public function has_maximum_concurrent_batches() { return $this->store->get_claim_count() >= $this->get_allowed_concurrent_batches(); } /** * Get the maximum number of seconds a batch can run for. * * @return int The number of seconds. */ protected function get_time_limit() { $time_limit = 30; // Apply deprecated filter from deprecated get_maximum_execution_time() method if ( has_filter( 'action_scheduler_maximum_execution_time' ) ) { _deprecated_function( 'action_scheduler_maximum_execution_time', '2.1.1', 'action_scheduler_queue_runner_time_limit' ); $time_limit = apply_filters( 'action_scheduler_maximum_execution_time', $time_limit ); } return absint( apply_filters( 'action_scheduler_queue_runner_time_limit', $time_limit ) ); } /** * Get the number of seconds the process has been running. * * @return int The number of seconds. */ protected function get_execution_time() { $execution_time = microtime( true ) - $this->created_time; // Get the CPU time if the hosting environment uses it rather than wall-clock time to calculate a process's execution time. if ( function_exists( 'getrusage' ) && apply_filters( 'action_scheduler_use_cpu_execution_time', defined( 'PANTHEON_ENVIRONMENT' ) ) ) { $resource_usages = getrusage(); if ( isset( $resource_usages['ru_stime.tv_usec'], $resource_usages['ru_stime.tv_usec'] ) ) { $execution_time = $resource_usages['ru_stime.tv_sec'] + ( $resource_usages['ru_stime.tv_usec'] / 1000000 ); } } return $execution_time; } /** * Check if the host's max execution time is (likely) to be exceeded if processing more actions. * * @param int $processed_actions The number of actions processed so far - used to determine the likelihood of exceeding the time limit if processing another action * @return bool */ protected function time_likely_to_be_exceeded( $processed_actions ) { $execution_time = $this->get_execution_time(); $max_execution_time = $this->get_time_limit(); // Safety against division by zero errors. if ( 0 === $processed_actions ) { return $execution_time >= $max_execution_time; } $time_per_action = $execution_time / $processed_actions; $estimated_time = $execution_time + ( $time_per_action * 3 ); $likely_to_be_exceeded = $estimated_time > $max_execution_time; return apply_filters( 'action_scheduler_maximum_execution_time_likely_to_be_exceeded', $likely_to_be_exceeded, $this, $processed_actions, $execution_time, $max_execution_time ); } /** * Get memory limit * * Based on WP_Background_Process::get_memory_limit() * * @return int */ protected function get_memory_limit() { if ( function_exists( 'ini_get' ) ) { $memory_limit = ini_get( 'memory_limit' ); } else { $memory_limit = '128M'; // Sensible default, and minimum required by WooCommerce } if ( ! $memory_limit || -1 === $memory_limit || '-1' === $memory_limit ) { // Unlimited, set to 32GB. $memory_limit = '32G'; } return ActionScheduler_Compatibility::convert_hr_to_bytes( $memory_limit ); } /** * Memory exceeded * * Ensures the batch process never exceeds 90% of the maximum WordPress memory. * * Based on WP_Background_Process::memory_exceeded() * * @return bool */ protected function memory_exceeded() { $memory_limit = $this->get_memory_limit() * 0.90; $current_memory = memory_get_usage( true ); $memory_exceeded = $current_memory >= $memory_limit; return apply_filters( 'action_scheduler_memory_exceeded', $memory_exceeded, $this ); } /** * See if the batch limits have been exceeded, which is when memory usage is almost at * the maximum limit, or the time to process more actions will exceed the max time limit. * * Based on WC_Background_Process::batch_limits_exceeded() * * @param int $processed_actions The number of actions processed so far - used to determine the likelihood of exceeding the time limit if processing another action * @return bool */ protected function batch_limits_exceeded( $processed_actions ) { return $this->memory_exceeded() || $this->time_likely_to_be_exceeded( $processed_actions ); } /** * Process actions in the queue. * * @author Jeremy Pry * @param string $context Optional identifer for the context in which this action is being processed, e.g. 'WP CLI' or 'WP Cron' * Generally, this should be capitalised and not localised as it's a proper noun. * @return int The number of actions processed. */ abstract public function run( $context = '' ); } pro/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_ListTable.php000064400000060220147600337620025557 0ustar00 value pair. The * key must much the table column name and the value is the label, which is * automatically translated. * * @var array */ protected $columns = array(); /** * Defines the row-actions. It expects an array where the key * is the column name and the value is an array of actions. * * The array of actions are key => value, where key is the method name * (with the prefix row_action_) and the value is the label * and title. * * @var array */ protected $row_actions = array(); /** * The Primary key of our table * * @var string */ protected $ID = 'ID'; /** * Enables sorting, it expects an array * of columns (the column names are the values) * * @var array */ protected $sort_by = array(); /** * The default sort order * * @var string */ protected $filter_by = array(); /** * The status name => count combinations for this table's items. Used to display status filters. * * @var array */ protected $status_counts = array(); /** * Notices to display when loading the table. Array of arrays of form array( 'class' => {updated|error}, 'message' => 'This is the notice text display.' ). * * @var array */ protected $admin_notices = array(); /** * Localised string displayed in the

            element above the able. * * @var string */ protected $table_header; /** * Enables bulk actions. It must be an array where the key is the action name * and the value is the label (which is translated automatically). It is important * to notice that it will check that the method exists (`bulk_$name`) and will throw * an exception if it does not exists. * * This class will automatically check if the current request has a bulk action, will do the * validations and afterwards will execute the bulk method, with two arguments. The first argument * is the array with primary keys, the second argument is a string with a list of the primary keys, * escaped and ready to use (with `IN`). * * @var array */ protected $bulk_actions = array(); /** * Makes translation easier, it basically just wraps * `_x` with some default (the package name). * * @param string $text The new text to translate. * @param string $context The context of the text. * @return string|void The translated text. * * @deprecated 3.0.0 Use `_x()` instead. */ protected function translate( $text, $context = '' ) { return $text; } /** * Reads `$this->bulk_actions` and returns an array that WP_List_Table understands. It * also validates that the bulk method handler exists. It throws an exception because * this is a library meant for developers and missing a bulk method is a development-time error. * * @return array * * @throws RuntimeException Throws RuntimeException when the bulk action does not have a callback method. */ protected function get_bulk_actions() { $actions = array(); foreach ( $this->bulk_actions as $action => $label ) { if ( ! is_callable( array( $this, 'bulk_' . $action ) ) ) { throw new RuntimeException( "The bulk action $action does not have a callback method" ); } $actions[ $action ] = $label; } return $actions; } /** * Checks if the current request has a bulk action. If that is the case it will validate and will * execute the bulk method handler. Regardless if the action is valid or not it will redirect to * the previous page removing the current arguments that makes this request a bulk action. */ protected function process_bulk_action() { global $wpdb; // Detect when a bulk action is being triggered. $action = $this->current_action(); if ( ! $action ) { return; } check_admin_referer( 'bulk-' . $this->_args['plural'] ); $method = 'bulk_' . $action; if ( array_key_exists( $action, $this->bulk_actions ) && is_callable( array( $this, $method ) ) && ! empty( $_GET['ID'] ) && is_array( $_GET['ID'] ) ) { $ids_sql = '(' . implode( ',', array_fill( 0, count( $_GET['ID'] ), '%s' ) ) . ')'; $id = array_map( 'absint', $_GET['ID'] ); $this->$method( $id, $wpdb->prepare( $ids_sql, $id ) ); //phpcs:ignore WordPress.DB.PreparedSQL } if ( isset( $_SERVER['REQUEST_URI'] ) ) { wp_safe_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce', 'ID', 'action', 'action2' ), esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) ); exit; } } /** * Default code for deleting entries. * validated already by process_bulk_action() * * @param array $ids ids of the items to delete. * @param string $ids_sql the sql for the ids. * @return void */ protected function bulk_delete( array $ids, $ids_sql ) { $store = ActionScheduler::store(); foreach ( $ids as $action_id ) { $store->delete( $action_id ); } } /** * Prepares the _column_headers property which is used by WP_Table_List at rendering. * It merges the columns and the sortable columns. */ protected function prepare_column_headers() { $this->_column_headers = array( $this->get_columns(), get_hidden_columns( $this->screen ), $this->get_sortable_columns(), ); } /** * Reads $this->sort_by and returns the columns name in a format that WP_Table_List * expects */ public function get_sortable_columns() { $sort_by = array(); foreach ( $this->sort_by as $column ) { $sort_by[ $column ] = array( $column, true ); } return $sort_by; } /** * Returns the columns names for rendering. It adds a checkbox for selecting everything * as the first column */ public function get_columns() { $columns = array_merge( array( 'cb' => '' ), $this->columns ); return $columns; } /** * Get prepared LIMIT clause for items query * * @global wpdb $wpdb * * @return string Prepared LIMIT clause for items query. */ protected function get_items_query_limit() { global $wpdb; $per_page = $this->get_items_per_page( $this->get_per_page_option_name(), $this->items_per_page ); return $wpdb->prepare( 'LIMIT %d', $per_page ); } /** * Returns the number of items to offset/skip for this current view. * * @return int */ protected function get_items_offset() { $per_page = $this->get_items_per_page( $this->get_per_page_option_name(), $this->items_per_page ); $current_page = $this->get_pagenum(); if ( 1 < $current_page ) { $offset = $per_page * ( $current_page - 1 ); } else { $offset = 0; } return $offset; } /** * Get prepared OFFSET clause for items query * * @global wpdb $wpdb * * @return string Prepared OFFSET clause for items query. */ protected function get_items_query_offset() { global $wpdb; return $wpdb->prepare( 'OFFSET %d', $this->get_items_offset() ); } /** * Prepares the ORDER BY sql statement. It uses `$this->sort_by` to know which * columns are sortable. This requests validates the orderby $_GET parameter is a valid * column and sortable. It will also use order (ASC|DESC) using DESC by default. */ protected function get_items_query_order() { if ( empty( $this->sort_by ) ) { return ''; } $orderby = esc_sql( $this->get_request_orderby() ); $order = esc_sql( $this->get_request_order() ); return "ORDER BY {$orderby} {$order}"; } /** * Return the sortable column specified for this request to order the results by, if any. * * @return string */ protected function get_request_orderby() { $valid_sortable_columns = array_values( $this->sort_by ); if ( ! empty( $_GET['orderby'] ) && in_array( $_GET['orderby'], $valid_sortable_columns, true ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended $orderby = sanitize_text_field( wp_unslash( $_GET['orderby'] ) ); //phpcs:ignore WordPress.Security.NonceVerification.Recommended } else { $orderby = $valid_sortable_columns[0]; } return $orderby; } /** * Return the sortable column order specified for this request. * * @return string */ protected function get_request_order() { if ( ! empty( $_GET['order'] ) && 'desc' === strtolower( sanitize_text_field( wp_unslash( $_GET['order'] ) ) ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended $order = 'DESC'; } else { $order = 'ASC'; } return $order; } /** * Return the status filter for this request, if any. * * @return string */ protected function get_request_status() { $status = ( ! empty( $_GET['status'] ) ) ? sanitize_text_field( wp_unslash( $_GET['status'] ) ) : ''; //phpcs:ignore WordPress.Security.NonceVerification.Recommended return $status; } /** * Return the search filter for this request, if any. * * @return string */ protected function get_request_search_query() { $search_query = ( ! empty( $_GET['s'] ) ) ? sanitize_text_field( wp_unslash( $_GET['s'] ) ) : ''; //phpcs:ignore WordPress.Security.NonceVerification.Recommended return $search_query; } /** * Process and return the columns name. This is meant for using with SQL, this means it * always includes the primary key. * * @return array */ protected function get_table_columns() { $columns = array_keys( $this->columns ); if ( ! in_array( $this->ID, $columns, true ) ) { $columns[] = $this->ID; } return $columns; } /** * Check if the current request is doing a "full text" search. If that is the case * prepares the SQL to search texts using LIKE. * * If the current request does not have any search or if this list table does not support * that feature it will return an empty string. * * @return string */ protected function get_items_query_search() { global $wpdb; if ( empty( $_GET['s'] ) || empty( $this->search_by ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended return ''; } $search_string = sanitize_text_field( wp_unslash( $_GET['s'] ) ); //phpcs:ignore WordPress.Security.NonceVerification.Recommended $filter = array(); foreach ( $this->search_by as $column ) { $wild = '%'; $sql_like = $wild . $wpdb->esc_like( $search_string ) . $wild; $filter[] = $wpdb->prepare( '`' . $column . '` LIKE %s', $sql_like ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.DB.PreparedSQL.NotPrepared } return implode( ' OR ', $filter ); } /** * Prepares the SQL to filter rows by the options defined at `$this->filter_by`. Before trusting * any data sent by the user it validates that it is a valid option. */ protected function get_items_query_filters() { global $wpdb; if ( ! $this->filter_by || empty( $_GET['filter_by'] ) || ! is_array( $_GET['filter_by'] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended return ''; } $filter = array(); foreach ( $this->filter_by as $column => $options ) { if ( empty( $_GET['filter_by'][ $column ] ) || empty( $options[ $_GET['filter_by'][ $column ] ] ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended continue; } $filter[] = $wpdb->prepare( "`$column` = %s", sanitize_text_field( wp_unslash( $_GET['filter_by'][ $column ] ) ) ); //phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.DB.PreparedSQL.InterpolatedNotPrepared } return implode( ' AND ', $filter ); } /** * Prepares the data to feed WP_Table_List. * * This has the core for selecting, sorting and filting data. To keep the code simple * its logic is split among many methods (get_items_query_*). * * Beside populating the items this function will also count all the records that matches * the filtering criteria and will do fill the pagination variables. */ public function prepare_items() { global $wpdb; $this->process_bulk_action(); $this->process_row_actions(); if ( ! empty( $_REQUEST['_wp_http_referer'] && ! empty( $_SERVER['REQUEST_URI'] ) ) ) { //phpcs:ignore WordPress.Security.NonceVerification.Recommended // _wp_http_referer is used only on bulk actions, we remove it to keep the $_GET shorter wp_safe_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) ); exit; } $this->prepare_column_headers(); $limit = $this->get_items_query_limit(); $offset = $this->get_items_query_offset(); $order = $this->get_items_query_order(); $where = array_filter( array( $this->get_items_query_search(), $this->get_items_query_filters(), ) ); $columns = '`' . implode( '`, `', $this->get_table_columns() ) . '`'; if ( ! empty( $where ) ) { $where = 'WHERE (' . implode( ') AND (', $where ) . ')'; } else { $where = ''; } $sql = "SELECT $columns FROM {$this->table_name} {$where} {$order} {$limit} {$offset}"; $this->set_items( $wpdb->get_results( $sql, ARRAY_A ) ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared $query_count = "SELECT COUNT({$this->ID}) FROM {$this->table_name} {$where}"; $total_items = $wpdb->get_var( $query_count ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared $per_page = $this->get_items_per_page( $this->get_per_page_option_name(), $this->items_per_page ); $this->set_pagination_args( array( 'total_items' => $total_items, 'per_page' => $per_page, 'total_pages' => ceil( $total_items / $per_page ), ) ); } /** * Display the table. * * @param string $which The name of the table. */ public function extra_tablenav( $which ) { if ( ! $this->filter_by || 'top' !== $which ) { return; } echo '
            '; foreach ( $this->filter_by as $id => $options ) { $default = ! empty( $_GET['filter_by'][ $id ] ) ? sanitize_text_field( wp_unslash( $_GET['filter_by'][ $id ] ) ) : ''; //phpcs:ignore WordPress.Security.NonceVerification.Recommended if ( empty( $options[ $default ] ) ) { $default = ''; } echo ''; } submit_button( esc_html__( 'Filter', 'woocommerce' ), '', 'filter_action', false, array( 'id' => 'post-query-submit' ) ); echo '
            '; } /** * Set the data for displaying. It will attempt to unserialize (There is a chance that some columns * are serialized). This can be override in child classes for futher data transformation. * * @param array $items Items array. */ protected function set_items( array $items ) { $this->items = array(); foreach ( $items as $item ) { $this->items[ $item[ $this->ID ] ] = array_map( 'maybe_unserialize', $item ); } } /** * Renders the checkbox for each row, this is the first column and it is named ID regardless * of how the primary key is named (to keep the code simpler). The bulk actions will do the proper * name transformation though using `$this->ID`. * * @param array $row The row to render. */ public function column_cb( $row ) { return ''; } /** * Renders the row-actions. * * This method renders the action menu, it reads the definition from the $row_actions property, * and it checks that the row action method exists before rendering it. * * @param array $row Row to be rendered. * @param string $column_name Column name. * @return string */ protected function maybe_render_actions( $row, $column_name ) { if ( empty( $this->row_actions[ $column_name ] ) ) { return; } $row_id = $row[ $this->ID ]; $actions = '
            '; $action_count = 0; foreach ( $this->row_actions[ $column_name ] as $action_key => $action ) { $action_count++; if ( ! method_exists( $this, 'row_action_' . $action_key ) ) { continue; } $action_link = ! empty( $action['link'] ) ? $action['link'] : add_query_arg( array( 'row_action' => $action_key, 'row_id' => $row_id, 'nonce' => wp_create_nonce( $action_key . '::' . $row_id ), ) ); $span_class = ! empty( $action['class'] ) ? $action['class'] : $action_key; $separator = ( $action_count < count( $this->row_actions[ $column_name ] ) ) ? ' | ' : ''; $actions .= sprintf( '', esc_attr( $span_class ) ); $actions .= sprintf( '%3$s', esc_url( $action_link ), esc_attr( $action['desc'] ), esc_html( $action['name'] ) ); $actions .= sprintf( '%s', $separator ); } $actions .= '
            '; return $actions; } /** * Process the bulk actions. * * @return void */ protected function process_row_actions() { $parameters = array( 'row_action', 'row_id', 'nonce' ); foreach ( $parameters as $parameter ) { if ( empty( $_REQUEST[ $parameter ] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended return; } } $action = sanitize_text_field( wp_unslash( $_REQUEST['row_action'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotValidated $row_id = sanitize_text_field( wp_unslash( $_REQUEST['row_id'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotValidated $nonce = sanitize_text_field( wp_unslash( $_REQUEST['nonce'] ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended, WordPress.Security.ValidatedSanitizedInput.InputNotValidated $method = 'row_action_' . $action; // phpcs:ignore WordPress.Security.NonceVerification.Recommended if ( wp_verify_nonce( $nonce, $action . '::' . $row_id ) && method_exists( $this, $method ) ) { $this->$method( sanitize_text_field( wp_unslash( $row_id ) ) ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended } if ( isset( $_SERVER['REQUEST_URI'] ) ) { wp_safe_redirect( remove_query_arg( array( 'row_id', 'row_action', 'nonce' ), esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) ); exit; } } /** * Default column formatting, it will escape everythig for security. * * @param array $item The item array. * @param string $column_name Column name to display. * * @return string */ public function column_default( $item, $column_name ) { $column_html = esc_html( $item[ $column_name ] ); $column_html .= $this->maybe_render_actions( $item, $column_name ); return $column_html; } /** * Display the table heading and search query, if any */ protected function display_header() { echo '

            ' . esc_attr( $this->table_header ) . '

            '; if ( $this->get_request_search_query() ) { /* translators: %s: search query */ echo '' . esc_attr( sprintf( __( 'Search results for "%s"', 'woocommerce' ), $this->get_request_search_query() ) ) . ''; } echo '
            '; } /** * Display the table heading and search query, if any */ protected function display_admin_notices() { foreach ( $this->admin_notices as $notice ) { echo '
            '; echo '

            ' . wp_kses_post( $notice['message'] ) . '

            '; echo '
            '; } } /** * Prints the available statuses so the user can click to filter. */ protected function display_filter_by_status() { $status_list_items = array(); $request_status = $this->get_request_status(); // Helper to set 'all' filter when not set on status counts passed in. if ( ! isset( $this->status_counts['all'] ) ) { $all_count = array_sum( $this->status_counts ); if ( isset( $this->status_counts['past-due'] ) ) { $all_count -= $this->status_counts['past-due']; } $this->status_counts = array( 'all' => $all_count ) + $this->status_counts; } // Translated status labels. $status_labels = ActionScheduler_Store::instance()->get_status_labels(); $status_labels['all'] = _x( 'All', 'status labels', 'woocommerce' ); $status_labels['past-due'] = _x( 'Past-due', 'status labels', 'woocommerce' ); foreach ( $this->status_counts as $status_slug => $count ) { if ( 0 === $count ) { continue; } if ( $status_slug === $request_status || ( empty( $request_status ) && 'all' === $status_slug ) ) { $status_list_item = '
          • %3$s (%4$d)
          • '; } else { $status_list_item = '
          • %3$s (%4$d)
          • '; } $status_name = isset( $status_labels[ $status_slug ] ) ? $status_labels[ $status_slug ] : ucfirst( $status_slug ); $status_filter_url = ( 'all' === $status_slug ) ? remove_query_arg( 'status' ) : add_query_arg( 'status', $status_slug ); $status_filter_url = remove_query_arg( array( 'paged', 's' ), $status_filter_url ); $status_list_items[] = sprintf( $status_list_item, esc_attr( $status_slug ), esc_url( $status_filter_url ), esc_html( $status_name ), absint( $count ) ); } if ( $status_list_items ) { echo '
              '; echo implode( " | \n", $status_list_items ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo '
            '; } } /** * Renders the table list, we override the original class to render the table inside a form * and to render any needed HTML (like the search box). By doing so the callee of a function can simple * forget about any extra HTML. */ protected function display_table() { echo '
            '; foreach ( $_GET as $key => $value ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended if ( '_' === $key[0] || 'paged' === $key || 'ID' === $key ) { continue; } echo ''; } if ( ! empty( $this->search_by ) ) { echo $this->search_box( $this->get_search_box_button_text(), 'plugin' ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped } parent::display(); echo '
            '; } /** * Process any pending actions. */ public function process_actions() { $this->process_bulk_action(); $this->process_row_actions(); if ( ! empty( $_REQUEST['_wp_http_referer'] ) && ! empty( $_SERVER['REQUEST_URI'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification.Recommended // _wp_http_referer is used only on bulk actions, we remove it to keep the $_GET shorter wp_safe_redirect( remove_query_arg( array( '_wp_http_referer', '_wpnonce' ), esc_url_raw( wp_unslash( $_SERVER['REQUEST_URI'] ) ) ) ); exit; } } /** * Render the list table page, including header, notices, status filters and table. */ public function display_page() { $this->prepare_items(); echo '
            '; $this->display_header(); $this->display_admin_notices(); $this->display_filter_by_status(); $this->display_table(); echo '
            '; } /** * Get the text to display in the search box on the list table. */ protected function get_search_box_placeholder() { return esc_html__( 'Search', 'woocommerce' ); } /** * Gets the screen per_page option name. * * @return string */ protected function get_per_page_option_name() { return $this->package . '_items_per_page'; } } pro/libraries/action-scheduler/classes/abstracts/ActionScheduler_Abstract_Schedule.php000064400000003426147600337620025435 0ustar00scheduled_date * * @var int */ protected $scheduled_timestamp = NULL; /** * @param DateTime $date The date & time to run the action. */ public function __construct( DateTime $date ) { $this->scheduled_date = $date; } /** * Check if a schedule should recur. * * @return bool */ abstract public function is_recurring(); /** * Calculate when the next instance of this schedule would run based on a given date & time. * * @param DateTime $after * @return DateTime */ abstract protected function calculate_next( DateTime $after ); /** * Get the next date & time when this schedule should run after a given date & time. * * @param DateTime $after * @return DateTime|null */ public function get_next( DateTime $after ) { $after = clone $after; if ( $after > $this->scheduled_date ) { $after = $this->calculate_next( $after ); return $after; } return clone $this->scheduled_date; } /** * Get the date & time the schedule is set to run. * * @return DateTime|null */ public function get_date() { return $this->scheduled_date; } /** * For PHP 5.2 compat, since DateTime objects can't be serialized * @return array */ public function __sleep() { $this->scheduled_timestamp = $this->scheduled_date->getTimestamp(); return array( 'scheduled_timestamp', ); } public function __wakeup() { $this->scheduled_date = as_get_datetime_object( $this->scheduled_timestamp ); unset( $this->scheduled_timestamp ); } } pro/libraries/action-scheduler/classes/abstracts/ActionScheduler_Lock.php000064400000003312147600337620022740 0ustar00get_expiration( $lock_type ) >= time() ); } /** * Set a lock. * * To prevent race conditions, implementations should avoid setting the lock if the lock is already held. * * @param string $lock_type A string to identify different lock types. * @return bool */ abstract public function set( $lock_type ); /** * If a lock is set, return the timestamp it was set to expiry. * * @param string $lock_type A string to identify different lock types. * @return bool|int False if no lock is set, otherwise the timestamp for when the lock is set to expire. */ abstract public function get_expiration( $lock_type ); /** * Get the amount of time to set for a given lock. 60 seconds by default. * * @param string $lock_type A string to identify different lock types. * @return int */ protected function get_duration( $lock_type ) { return apply_filters( 'action_scheduler_lock_duration', self::$lock_duration, $lock_type ); } /** * @return ActionScheduler_Lock */ public static function instance() { if ( empty( self::$locker ) ) { $class = apply_filters( 'action_scheduler_lock_class', 'ActionScheduler_OptionLock' ); self::$locker = new $class(); } return self::$locker; } } pro/libraries/action-scheduler/classes/abstracts/ActionScheduler_Logger.php000064400000014137147600337620023276 0ustar00hook_stored_action(); add_action( 'action_scheduler_canceled_action', array( $this, 'log_canceled_action' ), 10, 1 ); add_action( 'action_scheduler_begin_execute', array( $this, 'log_started_action' ), 10, 2 ); add_action( 'action_scheduler_after_execute', array( $this, 'log_completed_action' ), 10, 3 ); add_action( 'action_scheduler_failed_execution', array( $this, 'log_failed_action' ), 10, 3 ); add_action( 'action_scheduler_failed_action', array( $this, 'log_timed_out_action' ), 10, 2 ); add_action( 'action_scheduler_unexpected_shutdown', array( $this, 'log_unexpected_shutdown' ), 10, 2 ); add_action( 'action_scheduler_reset_action', array( $this, 'log_reset_action' ), 10, 1 ); add_action( 'action_scheduler_execution_ignored', array( $this, 'log_ignored_action' ), 10, 2 ); add_action( 'action_scheduler_failed_fetch_action', array( $this, 'log_failed_fetch_action' ), 10, 2 ); add_action( 'action_scheduler_failed_to_schedule_next_instance', array( $this, 'log_failed_schedule_next_instance' ), 10, 2 ); add_action( 'action_scheduler_bulk_cancel_actions', array( $this, 'bulk_log_cancel_actions' ), 10, 1 ); } public function hook_stored_action() { add_action( 'action_scheduler_stored_action', array( $this, 'log_stored_action' ) ); } public function unhook_stored_action() { remove_action( 'action_scheduler_stored_action', array( $this, 'log_stored_action' ) ); } public function log_stored_action( $action_id ) { $this->log( $action_id, __( 'action created', 'woocommerce' ) ); } public function log_canceled_action( $action_id ) { $this->log( $action_id, __( 'action canceled', 'woocommerce' ) ); } public function log_started_action( $action_id, $context = '' ) { if ( ! empty( $context ) ) { /* translators: %s: context */ $message = sprintf( __( 'action started via %s', 'woocommerce' ), $context ); } else { $message = __( 'action started', 'woocommerce' ); } $this->log( $action_id, $message ); } public function log_completed_action( $action_id, $action = NULL, $context = '' ) { if ( ! empty( $context ) ) { /* translators: %s: context */ $message = sprintf( __( 'action complete via %s', 'woocommerce' ), $context ); } else { $message = __( 'action complete', 'woocommerce' ); } $this->log( $action_id, $message ); } public function log_failed_action( $action_id, Exception $exception, $context = '' ) { if ( ! empty( $context ) ) { /* translators: 1: context 2: exception message */ $message = sprintf( __( 'action failed via %1$s: %2$s', 'woocommerce' ), $context, $exception->getMessage() ); } else { /* translators: %s: exception message */ $message = sprintf( __( 'action failed: %s', 'woocommerce' ), $exception->getMessage() ); } $this->log( $action_id, $message ); } public function log_timed_out_action( $action_id, $timeout ) { /* translators: %s: amount of time */ $this->log( $action_id, sprintf( __( 'action marked as failed after %s seconds. Unknown error occurred. Check server, PHP and database error logs to diagnose cause.', 'woocommerce' ), $timeout ) ); } public function log_unexpected_shutdown( $action_id, $error ) { if ( ! empty( $error ) ) { /* translators: 1: error message 2: filename 3: line */ $this->log( $action_id, sprintf( __( 'unexpected shutdown: PHP Fatal error %1$s in %2$s on line %3$s', 'woocommerce' ), $error['message'], $error['file'], $error['line'] ) ); } } public function log_reset_action( $action_id ) { $this->log( $action_id, __( 'action reset', 'woocommerce' ) ); } public function log_ignored_action( $action_id, $context = '' ) { if ( ! empty( $context ) ) { /* translators: %s: context */ $message = sprintf( __( 'action ignored via %s', 'woocommerce' ), $context ); } else { $message = __( 'action ignored', 'woocommerce' ); } $this->log( $action_id, $message ); } /** * @param string $action_id * @param Exception|NULL $exception The exception which occured when fetching the action. NULL by default for backward compatibility. * * @return ActionScheduler_LogEntry[] */ public function log_failed_fetch_action( $action_id, Exception $exception = NULL ) { if ( ! is_null( $exception ) ) { /* translators: %s: exception message */ $log_message = sprintf( __( 'There was a failure fetching this action: %s', 'woocommerce' ), $exception->getMessage() ); } else { $log_message = __( 'There was a failure fetching this action', 'woocommerce' ); } $this->log( $action_id, $log_message ); } public function log_failed_schedule_next_instance( $action_id, Exception $exception ) { /* translators: %s: exception message */ $this->log( $action_id, sprintf( __( 'There was a failure scheduling the next instance of this action: %s', 'woocommerce' ), $exception->getMessage() ) ); } /** * Bulk add cancel action log entries. * * Implemented here for backward compatibility. Should be implemented in parent loggers * for more performant bulk logging. * * @param array $action_ids List of action ID. */ public function bulk_log_cancel_actions( $action_ids ) { if ( empty( $action_ids ) ) { return; } foreach ( $action_ids as $action_id ) { $this->log_canceled_action( $action_id ); } } } pro/libraries/action-scheduler/classes/actions/ActionScheduler_CanceledAction.php000064400000001316147600337620024360 0ustar00set_schedule( new ActionScheduler_NullSchedule() ); } } } pro/libraries/action-scheduler/classes/actions/ActionScheduler_NullAction.php000064400000000534147600337620023575 0ustar00set_schedule( new ActionScheduler_NullSchedule() ); } public function execute() { // don't execute } } pro/libraries/action-scheduler/classes/actions/ActionScheduler_FinishedAction.php000064400000000350147600337620024410 0ustar00set_hook($hook); $this->set_schedule($schedule); $this->set_args($args); $this->set_group($group); } /** * Executes the action. * * If no callbacks are registered, an exception will be thrown and the action will not be * fired. This is useful to help detect cases where the code responsible for setting up * a scheduled action no longer exists. * * @throws Exception If no callbacks are registered for this action. */ public function execute() { $hook = $this->get_hook(); if ( ! has_action( $hook ) ) { throw new Exception( sprintf( /* translators: 1: action hook. */ __( 'Scheduled action for %1$s will not be executed as no callbacks are registered.', 'woocommerce' ), $hook ) ); } do_action_ref_array( $hook, array_values( $this->get_args() ) ); } /** * @param string $hook */ protected function set_hook( $hook ) { $this->hook = $hook; } public function get_hook() { return $this->hook; } protected function set_schedule( ActionScheduler_Schedule $schedule ) { $this->schedule = $schedule; } /** * @return ActionScheduler_Schedule */ public function get_schedule() { return $this->schedule; } protected function set_args( array $args ) { $this->args = $args; } public function get_args() { return $this->args; } /** * @param string $group */ protected function set_group( $group ) { $this->group = $group; } /** * @return string */ public function get_group() { return $this->group; } /** * @return bool If the action has been finished */ public function is_finished() { return FALSE; } /** * Sets the priority of the action. * * @param int $priority Priority level (lower is higher priority). Should be in the range 0-255. * * @return void */ public function set_priority( $priority ) { if ( $priority < 0 ) { $priority = 0; } elseif ( $priority > 255 ) { $priority = 255; } $this->priority = (int) $priority; } /** * Gets the action priority. * * @return int */ public function get_priority() { return $this->priority; } } pro/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBLogger.php000064400000010577147600337620023750 0ustar00format( 'Y-m-d H:i:s' ); ActionScheduler_TimezoneHelper::set_local_timezone( $date ); $date_local = $date->format( 'Y-m-d H:i:s' ); /** @var \wpdb $wpdb */ //phpcs:ignore Generic.Commenting.DocComment.MissingShort global $wpdb; $wpdb->insert( $wpdb->actionscheduler_logs, array( 'action_id' => $action_id, 'message' => $message, 'log_date_gmt' => $date_gmt, 'log_date_local' => $date_local, ), array( '%d', '%s', '%s', '%s' ) ); return $wpdb->insert_id; } /** * Retrieve an action log entry. * * @param int $entry_id Log entry ID. * * @return ActionScheduler_LogEntry */ public function get_entry( $entry_id ) { /** @var \wpdb $wpdb */ //phpcs:ignore Generic.Commenting.DocComment.MissingShort global $wpdb; $entry = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->actionscheduler_logs} WHERE log_id=%d", $entry_id ) ); return $this->create_entry_from_db_record( $entry ); } /** * Create an action log entry from a database record. * * @param object $record Log entry database record object. * * @return ActionScheduler_LogEntry */ private function create_entry_from_db_record( $record ) { if ( empty( $record ) ) { return new ActionScheduler_NullLogEntry(); } if ( is_null( $record->log_date_gmt ) ) { $date = as_get_datetime_object( ActionScheduler_StoreSchema::DEFAULT_DATE ); } else { $date = as_get_datetime_object( $record->log_date_gmt ); } return new ActionScheduler_LogEntry( $record->action_id, $record->message, $date ); } /** * Retrieve the an action's log entries from the database. * * @param int $action_id Action ID. * * @return ActionScheduler_LogEntry[] */ public function get_logs( $action_id ) { /** @var \wpdb $wpdb */ //phpcs:ignore Generic.Commenting.DocComment.MissingShort global $wpdb; $records = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->actionscheduler_logs} WHERE action_id=%d", $action_id ) ); return array_map( array( $this, 'create_entry_from_db_record' ), $records ); } /** * Initialize the data store. * * @codeCoverageIgnore */ public function init() { $table_maker = new ActionScheduler_LoggerSchema(); $table_maker->init(); $table_maker->register_tables(); parent::init(); add_action( 'action_scheduler_deleted_action', array( $this, 'clear_deleted_action_logs' ), 10, 1 ); } /** * Delete the action logs for an action. * * @param int $action_id Action ID. */ public function clear_deleted_action_logs( $action_id ) { /** @var \wpdb $wpdb */ //phpcs:ignore Generic.Commenting.DocComment.MissingShort global $wpdb; $wpdb->delete( $wpdb->actionscheduler_logs, array( 'action_id' => $action_id ), array( '%d' ) ); } /** * Bulk add cancel action log entries. * * @param array $action_ids List of action ID. */ public function bulk_log_cancel_actions( $action_ids ) { if ( empty( $action_ids ) ) { return; } /** @var \wpdb $wpdb */ //phpcs:ignore Generic.Commenting.DocComment.MissingShort global $wpdb; $date = as_get_datetime_object(); $date_gmt = $date->format( 'Y-m-d H:i:s' ); ActionScheduler_TimezoneHelper::set_local_timezone( $date ); $date_local = $date->format( 'Y-m-d H:i:s' ); $message = __( 'action canceled', 'woocommerce' ); $format = '(%d, ' . $wpdb->prepare( '%s, %s, %s', $message, $date_gmt, $date_local ) . ')'; $sql_query = "INSERT {$wpdb->actionscheduler_logs} (action_id, message, log_date_gmt, log_date_local) VALUES "; $value_rows = array(); foreach ( $action_ids as $action_id ) { $value_rows[] = $wpdb->prepare( $format, $action_id ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared } $sql_query .= implode( ',', $value_rows ); $wpdb->query( $sql_query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared } } libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostStatusRegistrar.php000064400000003421147600337620030637 0ustar00propost_status_args(), $this->post_status_running_labels() ) ); register_post_status( ActionScheduler_Store::STATUS_FAILED, array_merge( $this->post_status_args(), $this->post_status_failed_labels() ) ); } /** * Build the args array for the post type definition * * @return array */ protected function post_status_args() { $args = array( 'public' => false, 'exclude_from_search' => false, 'show_in_admin_all_list' => true, 'show_in_admin_status_list' => true, ); return apply_filters( 'action_scheduler_post_status_args', $args ); } /** * Build the args array for the post type definition * * @return array */ protected function post_status_failed_labels() { $labels = array( 'label' => _x( 'Failed', 'post', 'woocommerce' ), /* translators: %s: count */ 'label_count' => _n_noop( 'Failed (%s)', 'Failed (%s)', 'woocommerce' ), ); return apply_filters( 'action_scheduler_post_status_failed_labels', $labels ); } /** * Build the args array for the post type definition * * @return array */ protected function post_status_running_labels() { $labels = array( 'label' => _x( 'In-Progress', 'post', 'woocommerce' ), /* translators: %s: count */ 'label_count' => _n_noop( 'In-Progress (%s)', 'In-Progress (%s)', 'woocommerce' ), ); return apply_filters( 'action_scheduler_post_status_running_labels', $labels ); } } pro/libraries/action-scheduler/classes/data-stores/ActionScheduler_HybridStore.php000064400000027366147600337620024565 0ustar00demarkation_id = (int) get_option( self::DEMARKATION_OPTION, 0 ); if ( empty( $config ) ) { $config = Controller::instance()->get_migration_config_object(); } $this->primary_store = $config->get_destination_store(); $this->secondary_store = $config->get_source_store(); $this->migration_runner = new Runner( $config ); } /** * Initialize the table data store tables. * * @codeCoverageIgnore */ public function init() { add_action( 'action_scheduler/created_table', [ $this, 'set_autoincrement' ], 10, 2 ); $this->primary_store->init(); $this->secondary_store->init(); remove_action( 'action_scheduler/created_table', [ $this, 'set_autoincrement' ], 10 ); } /** * When the actions table is created, set its autoincrement * value to be one higher than the posts table to ensure that * there are no ID collisions. * * @param string $table_name * @param string $table_suffix * * @return void * @codeCoverageIgnore */ public function set_autoincrement( $table_name, $table_suffix ) { if ( ActionScheduler_StoreSchema::ACTIONS_TABLE === $table_suffix ) { if ( empty( $this->demarkation_id ) ) { $this->demarkation_id = $this->set_demarkation_id(); } /** @var \wpdb $wpdb */ global $wpdb; /** * A default date of '0000-00-00 00:00:00' is invalid in MySQL 5.7 when configured with * sql_mode including both STRICT_TRANS_TABLES and NO_ZERO_DATE. */ $default_date = new DateTime( 'tomorrow' ); $null_action = new ActionScheduler_NullAction(); $date_gmt = $this->get_scheduled_date_string( $null_action, $default_date ); $date_local = $this->get_scheduled_date_string_local( $null_action, $default_date ); $row_count = $wpdb->insert( $wpdb->{ActionScheduler_StoreSchema::ACTIONS_TABLE}, [ 'action_id' => $this->demarkation_id, 'hook' => '', 'status' => '', 'scheduled_date_gmt' => $date_gmt, 'scheduled_date_local' => $date_local, 'last_attempt_gmt' => $date_gmt, 'last_attempt_local' => $date_local, ] ); if ( $row_count > 0 ) { $wpdb->delete( $wpdb->{ActionScheduler_StoreSchema::ACTIONS_TABLE}, [ 'action_id' => $this->demarkation_id ] ); } } } /** * Store the demarkation id in WP options. * * @param int $id The ID to set as the demarkation point between the two stores * Leave null to use the next ID from the WP posts table. * * @return int The new ID. * * @codeCoverageIgnore */ private function set_demarkation_id( $id = null ) { if ( empty( $id ) ) { /** @var \wpdb $wpdb */ global $wpdb; $id = (int) $wpdb->get_var( "SELECT MAX(ID) FROM $wpdb->posts" ); $id ++; } update_option( self::DEMARKATION_OPTION, $id ); return $id; } /** * Find the first matching action from the secondary store. * If it exists, migrate it to the primary store immediately. * After it migrates, the secondary store will logically contain * the next matching action, so return the result thence. * * @param string $hook * @param array $params * * @return string */ public function find_action( $hook, $params = [] ) { $found_unmigrated_action = $this->secondary_store->find_action( $hook, $params ); if ( ! empty( $found_unmigrated_action ) ) { $this->migrate( [ $found_unmigrated_action ] ); } return $this->primary_store->find_action( $hook, $params ); } /** * Find actions matching the query in the secondary source first. * If any are found, migrate them immediately. Then the secondary * store will contain the canonical results. * * @param array $query * @param string $query_type Whether to select or count the results. Default, select. * * @return int[] */ public function query_actions( $query = [], $query_type = 'select' ) { $found_unmigrated_actions = $this->secondary_store->query_actions( $query, 'select' ); if ( ! empty( $found_unmigrated_actions ) ) { $this->migrate( $found_unmigrated_actions ); } return $this->primary_store->query_actions( $query, $query_type ); } /** * Get a count of all actions in the store, grouped by status * * @return array Set of 'status' => int $count pairs for statuses with 1 or more actions of that status. */ public function action_counts() { $unmigrated_actions_count = $this->secondary_store->action_counts(); $migrated_actions_count = $this->primary_store->action_counts(); $actions_count_by_status = array(); foreach ( $this->get_status_labels() as $status_key => $status_label ) { $count = 0; if ( isset( $unmigrated_actions_count[ $status_key ] ) ) { $count += $unmigrated_actions_count[ $status_key ]; } if ( isset( $migrated_actions_count[ $status_key ] ) ) { $count += $migrated_actions_count[ $status_key ]; } $actions_count_by_status[ $status_key ] = $count; } $actions_count_by_status = array_filter( $actions_count_by_status ); return $actions_count_by_status; } /** * If any actions would have been claimed by the secondary store, * migrate them immediately, then ask the primary store for the * canonical claim. * * @param int $max_actions * @param DateTime|null $before_date * * @return ActionScheduler_ActionClaim */ public function stake_claim( $max_actions = 10, DateTime $before_date = null, $hooks = array(), $group = '' ) { $claim = $this->secondary_store->stake_claim( $max_actions, $before_date, $hooks, $group ); $claimed_actions = $claim->get_actions(); if ( ! empty( $claimed_actions ) ) { $this->migrate( $claimed_actions ); } $this->secondary_store->release_claim( $claim ); return $this->primary_store->stake_claim( $max_actions, $before_date, $hooks, $group ); } /** * Migrate a list of actions to the table data store. * * @param array $action_ids List of action IDs. */ private function migrate( $action_ids ) { $this->migration_runner->migrate_actions( $action_ids ); } /** * Save an action to the primary store. * * @param ActionScheduler_Action $action Action object to be saved. * @param DateTime $date Optional. Schedule date. Default null. * * @return int The action ID */ public function save_action( ActionScheduler_Action $action, DateTime $date = null ) { return $this->primary_store->save_action( $action, $date ); } /** * Retrieve an existing action whether migrated or not. * * @param int $action_id Action ID. */ public function fetch_action( $action_id ) { $store = $this->get_store_from_action_id( $action_id, true ); if ( $store ) { return $store->fetch_action( $action_id ); } else { return new ActionScheduler_NullAction(); } } /** * Cancel an existing action whether migrated or not. * * @param int $action_id Action ID. */ public function cancel_action( $action_id ) { $store = $this->get_store_from_action_id( $action_id ); if ( $store ) { $store->cancel_action( $action_id ); } } /** * Delete an existing action whether migrated or not. * * @param int $action_id Action ID. */ public function delete_action( $action_id ) { $store = $this->get_store_from_action_id( $action_id ); if ( $store ) { $store->delete_action( $action_id ); } } /** * Get the schedule date an existing action whether migrated or not. * * @param int $action_id Action ID. */ public function get_date( $action_id ) { $store = $this->get_store_from_action_id( $action_id ); if ( $store ) { return $store->get_date( $action_id ); } else { return null; } } /** * Mark an existing action as failed whether migrated or not. * * @param int $action_id Action ID. */ public function mark_failure( $action_id ) { $store = $this->get_store_from_action_id( $action_id ); if ( $store ) { $store->mark_failure( $action_id ); } } /** * Log the execution of an existing action whether migrated or not. * * @param int $action_id Action ID. */ public function log_execution( $action_id ) { $store = $this->get_store_from_action_id( $action_id ); if ( $store ) { $store->log_execution( $action_id ); } } /** * Mark an existing action complete whether migrated or not. * * @param int $action_id Action ID. */ public function mark_complete( $action_id ) { $store = $this->get_store_from_action_id( $action_id ); if ( $store ) { $store->mark_complete( $action_id ); } } /** * Get an existing action status whether migrated or not. * * @param int $action_id Action ID. */ public function get_status( $action_id ) { $store = $this->get_store_from_action_id( $action_id ); if ( $store ) { return $store->get_status( $action_id ); } return null; } /** * Return which store an action is stored in. * * @param int $action_id ID of the action. * @param bool $primary_first Optional flag indicating search the primary store first. * @return ActionScheduler_Store */ protected function get_store_from_action_id( $action_id, $primary_first = false ) { if ( $primary_first ) { $stores = [ $this->primary_store, $this->secondary_store, ]; } elseif ( $action_id < $this->demarkation_id ) { $stores = [ $this->secondary_store, $this->primary_store, ]; } else { $stores = [ $this->primary_store, ]; } foreach ( $stores as $store ) { $action = $store->fetch_action( $action_id ); if ( ! is_a( $action, 'ActionScheduler_NullAction' ) ) { return $store; } } return null; } /* * * * * * * * * * * * * * * * * * * * * * * * * * * * All claim-related functions should operate solely * on the primary store. * * * * * * * * * * * * * * * * * * * * * * * * * * */ /** * Get the claim count from the table data store. */ public function get_claim_count() { return $this->primary_store->get_claim_count(); } /** * Retrieve the claim ID for an action from the table data store. * * @param int $action_id Action ID. */ public function get_claim_id( $action_id ) { return $this->primary_store->get_claim_id( $action_id ); } /** * Release a claim in the table data store. * * @param ActionScheduler_ActionClaim $claim Claim object. */ public function release_claim( ActionScheduler_ActionClaim $claim ) { $this->primary_store->release_claim( $claim ); } /** * Release claims on an action in the table data store. * * @param int $action_id Action ID. */ public function unclaim_action( $action_id ) { $this->primary_store->unclaim_action( $action_id ); } /** * Retrieve a list of action IDs by claim. * * @param int $claim_id Claim ID. */ public function find_actions_by_claim_id( $claim_id ) { return $this->primary_store->find_actions_by_claim_id( $claim_id ); } } pro/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_PostTypeRegistrar.php000064400000003302147600337620030352 0ustar00post_type_args() ); } /** * Build the args array for the post type definition * * @return array */ protected function post_type_args() { $args = array( 'label' => __( 'Scheduled Actions', 'woocommerce' ), 'description' => __( 'Scheduled actions are hooks triggered on a cetain date and time.', 'woocommerce' ), 'public' => false, 'map_meta_cap' => true, 'hierarchical' => false, 'supports' => array('title', 'editor','comments'), 'rewrite' => false, 'query_var' => false, 'can_export' => true, 'ep_mask' => EP_NONE, 'labels' => array( 'name' => __( 'Scheduled Actions', 'woocommerce' ), 'singular_name' => __( 'Scheduled Action', 'woocommerce' ), 'menu_name' => _x( 'Scheduled Actions', 'Admin menu name', 'woocommerce' ), 'add_new' => __( 'Add', 'woocommerce' ), 'add_new_item' => __( 'Add New Scheduled Action', 'woocommerce' ), 'edit' => __( 'Edit', 'woocommerce' ), 'edit_item' => __( 'Edit Scheduled Action', 'woocommerce' ), 'new_item' => __( 'New Scheduled Action', 'woocommerce' ), 'view' => __( 'View Action', 'woocommerce' ), 'view_item' => __( 'View Action', 'woocommerce' ), 'search_items' => __( 'Search Scheduled Actions', 'woocommerce' ), 'not_found' => __( 'No actions found', 'woocommerce' ), 'not_found_in_trash' => __( 'No actions found in trash', 'woocommerce' ), ), ); $args = apply_filters('action_scheduler_post_type_args', $args); return $args; } } pro/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpCommentLogger.php000064400000015233147600337620025426 0ustar00create_wp_comment( $action_id, $message, $date ); return $comment_id; } protected function create_wp_comment( $action_id, $message, DateTime $date ) { $comment_date_gmt = $date->format('Y-m-d H:i:s'); ActionScheduler_TimezoneHelper::set_local_timezone( $date ); $comment_data = array( 'comment_post_ID' => $action_id, 'comment_date' => $date->format('Y-m-d H:i:s'), 'comment_date_gmt' => $comment_date_gmt, 'comment_author' => self::AGENT, 'comment_content' => $message, 'comment_agent' => self::AGENT, 'comment_type' => self::TYPE, ); return wp_insert_comment($comment_data); } /** * @param string $entry_id * * @return ActionScheduler_LogEntry */ public function get_entry( $entry_id ) { $comment = $this->get_comment( $entry_id ); if ( empty($comment) || $comment->comment_type != self::TYPE ) { return new ActionScheduler_NullLogEntry(); } $date = as_get_datetime_object( $comment->comment_date_gmt ); ActionScheduler_TimezoneHelper::set_local_timezone( $date ); return new ActionScheduler_LogEntry( $comment->comment_post_ID, $comment->comment_content, $date ); } /** * @param string $action_id * * @return ActionScheduler_LogEntry[] */ public function get_logs( $action_id ) { $status = 'all'; if ( get_post_status($action_id) == 'trash' ) { $status = 'post-trashed'; } $comments = get_comments(array( 'post_id' => $action_id, 'orderby' => 'comment_date_gmt', 'order' => 'ASC', 'type' => self::TYPE, 'status' => $status, )); $logs = array(); foreach ( $comments as $c ) { $entry = $this->get_entry( $c ); if ( !empty($entry) ) { $logs[] = $entry; } } return $logs; } protected function get_comment( $comment_id ) { return get_comment( $comment_id ); } /** * @param WP_Comment_Query $query */ public function filter_comment_queries( $query ) { foreach ( array('ID', 'parent', 'post_author', 'post_name', 'post_parent', 'type', 'post_type', 'post_id', 'post_ID') as $key ) { if ( !empty($query->query_vars[$key]) ) { return; // don't slow down queries that wouldn't include action_log comments anyway } } $query->query_vars['action_log_filter'] = TRUE; add_filter( 'comments_clauses', array( $this, 'filter_comment_query_clauses' ), 10, 2 ); } /** * @param array $clauses * @param WP_Comment_Query $query * * @return array */ public function filter_comment_query_clauses( $clauses, $query ) { if ( !empty($query->query_vars['action_log_filter']) ) { $clauses['where'] .= $this->get_where_clause(); } return $clauses; } /** * Make sure Action Scheduler logs are excluded from comment feeds, which use WP_Query, not * the WP_Comment_Query class handled by @see self::filter_comment_queries(). * * @param string $where * @param WP_Query $query * * @return string */ public function filter_comment_feed( $where, $query ) { if ( is_comment_feed() ) { $where .= $this->get_where_clause(); } return $where; } /** * Return a SQL clause to exclude Action Scheduler comments. * * @return string */ protected function get_where_clause() { global $wpdb; return sprintf( " AND {$wpdb->comments}.comment_type != '%s'", self::TYPE ); } /** * Remove action log entries from wp_count_comments() * * @param array $stats * @param int $post_id * * @return object */ public function filter_comment_count( $stats, $post_id ) { global $wpdb; if ( 0 === $post_id ) { $stats = $this->get_comment_count(); } return $stats; } /** * Retrieve the comment counts from our cache, or the database if the cached version isn't set. * * @return object */ protected function get_comment_count() { global $wpdb; $stats = get_transient( 'as_comment_count' ); if ( ! $stats ) { $stats = array(); $count = $wpdb->get_results( "SELECT comment_approved, COUNT( * ) AS num_comments FROM {$wpdb->comments} WHERE comment_type NOT IN('order_note','action_log') GROUP BY comment_approved", ARRAY_A ); $total = 0; $stats = array(); $approved = array( '0' => 'moderated', '1' => 'approved', 'spam' => 'spam', 'trash' => 'trash', 'post-trashed' => 'post-trashed' ); foreach ( (array) $count as $row ) { // Don't count post-trashed toward totals if ( 'post-trashed' != $row['comment_approved'] && 'trash' != $row['comment_approved'] ) { $total += $row['num_comments']; } if ( isset( $approved[ $row['comment_approved'] ] ) ) { $stats[ $approved[ $row['comment_approved'] ] ] = $row['num_comments']; } } $stats['total_comments'] = $total; $stats['all'] = $total; foreach ( $approved as $key ) { if ( empty( $stats[ $key ] ) ) { $stats[ $key ] = 0; } } $stats = (object) $stats; set_transient( 'as_comment_count', $stats ); } return $stats; } /** * Delete comment count cache whenever there is new comment or the status of a comment changes. Cache * will be regenerated next time ActionScheduler_wpCommentLogger::filter_comment_count() is called. */ public function delete_comment_count_cache() { delete_transient( 'as_comment_count' ); } /** * @codeCoverageIgnore */ public function init() { add_action( 'action_scheduler_before_process_queue', array( $this, 'disable_comment_counting' ), 10, 0 ); add_action( 'action_scheduler_after_process_queue', array( $this, 'enable_comment_counting' ), 10, 0 ); parent::init(); add_action( 'pre_get_comments', array( $this, 'filter_comment_queries' ), 10, 1 ); add_action( 'wp_count_comments', array( $this, 'filter_comment_count' ), 20, 2 ); // run after WC_Comments::wp_count_comments() to make sure we exclude order notes and action logs add_action( 'comment_feed_where', array( $this, 'filter_comment_feed' ), 10, 2 ); // Delete comments count cache whenever there is a new comment or a comment status changes add_action( 'wp_insert_comment', array( $this, 'delete_comment_count_cache' ) ); add_action( 'wp_set_comment_status', array( $this, 'delete_comment_count_cache' ) ); } public function disable_comment_counting() { wp_defer_comment_counting(true); } public function enable_comment_counting() { wp_defer_comment_counting(false); } } pro/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore_TaxonomyRegistrar.php000064400000001205147600337620030401 0ustar00taxonomy_args() ); } protected function taxonomy_args() { $args = array( 'label' => __( 'Action Group', 'woocommerce' ), 'public' => false, 'hierarchical' => false, 'show_admin_column' => true, 'query_var' => false, 'rewrite' => false, ); $args = apply_filters( 'action_scheduler_taxonomy_args', $args ); return $args; } } pro/libraries/action-scheduler/classes/data-stores/ActionScheduler_wpPostStore.php000064400000105142147600337620024625 0ustar00validate_action( $action ); $post_array = $this->create_post_array( $action, $scheduled_date ); $post_id = $this->save_post_array( $post_array ); $this->save_post_schedule( $post_id, $action->get_schedule() ); $this->save_action_group( $post_id, $action->get_group() ); do_action( 'action_scheduler_stored_action', $post_id ); return $post_id; } catch ( Exception $e ) { /* translators: %s: action error message */ throw new RuntimeException( sprintf( __( 'Error saving action: %s', 'woocommerce' ), $e->getMessage() ), 0 ); } } /** * Create post array. * * @param ActionScheduler_Action $action Scheduled Action. * @param DateTime $scheduled_date Scheduled Date. * * @return array Returns an array of post data. */ protected function create_post_array( ActionScheduler_Action $action, DateTime $scheduled_date = null ) { $post = array( 'post_type' => self::POST_TYPE, 'post_title' => $action->get_hook(), 'post_content' => wp_json_encode( $action->get_args() ), 'post_status' => ( $action->is_finished() ? 'publish' : 'pending' ), 'post_date_gmt' => $this->get_scheduled_date_string( $action, $scheduled_date ), 'post_date' => $this->get_scheduled_date_string_local( $action, $scheduled_date ), ); return $post; } /** * Save post array. * * @param array $post_array Post array. * @return int Returns the post ID. * @throws RuntimeException Throws an exception if the action could not be saved. */ protected function save_post_array( $post_array ) { add_filter( 'wp_insert_post_data', array( $this, 'filter_insert_post_data' ), 10, 1 ); add_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10, 5 ); $has_kses = false !== has_filter( 'content_save_pre', 'wp_filter_post_kses' ); if ( $has_kses ) { // Prevent KSES from corrupting JSON in post_content. kses_remove_filters(); } $post_id = wp_insert_post( $post_array ); if ( $has_kses ) { kses_init_filters(); } remove_filter( 'wp_insert_post_data', array( $this, 'filter_insert_post_data' ), 10 ); remove_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10 ); if ( is_wp_error( $post_id ) || empty( $post_id ) ) { throw new RuntimeException( __( 'Unable to save action.', 'woocommerce' ) ); } return $post_id; } /** * Filter insert post data. * * @param array $postdata Post data to filter. * * @return array */ public function filter_insert_post_data( $postdata ) { if ( self::POST_TYPE === $postdata['post_type'] ) { $postdata['post_author'] = 0; if ( 'future' === $postdata['post_status'] ) { $postdata['post_status'] = 'publish'; } } return $postdata; } /** * Create a (probably unique) post name for scheduled actions in a more performant manner than wp_unique_post_slug(). * * When an action's post status is transitioned to something other than 'draft', 'pending' or 'auto-draft, like 'publish' * or 'failed' or 'trash', WordPress will find a unique slug (stored in post_name column) using the wp_unique_post_slug() * function. This is done to ensure URL uniqueness. The approach taken by wp_unique_post_slug() is to iterate over existing * post_name values that match, and append a number 1 greater than the largest. This makes sense when manually creating a * post from the Edit Post screen. It becomes a bottleneck when automatically processing thousands of actions, with a * database containing thousands of related post_name values. * * WordPress 5.1 introduces the 'pre_wp_unique_post_slug' filter for plugins to address this issue. * * We can short-circuit WordPress's wp_unique_post_slug() approach using the 'pre_wp_unique_post_slug' filter. This * method is available to be used as a callback on that filter. It provides a more scalable approach to generating a * post_name/slug that is probably unique. Because Action Scheduler never actually uses the post_name field, or an * action's slug, being probably unique is good enough. * * For more backstory on this issue, see: * - https://github.com/woocommerce/action-scheduler/issues/44 and * - https://core.trac.wordpress.org/ticket/21112 * * @param string $override_slug Short-circuit return value. * @param string $slug The desired slug (post_name). * @param int $post_ID Post ID. * @param string $post_status The post status. * @param string $post_type Post type. * @return string */ public function set_unique_post_slug( $override_slug, $slug, $post_ID, $post_status, $post_type ) { if ( self::POST_TYPE === $post_type ) { $override_slug = uniqid( self::POST_TYPE . '-', true ) . '-' . wp_generate_password( 32, false ); } return $override_slug; } /** * Save post schedule. * * @param int $post_id Post ID of the scheduled action. * @param string $schedule Schedule to save. * * @return void */ protected function save_post_schedule( $post_id, $schedule ) { update_post_meta( $post_id, self::SCHEDULE_META_KEY, $schedule ); } /** * Save action group. * * @param int $post_id Post ID. * @param string $group Group to save. * @return void */ protected function save_action_group( $post_id, $group ) { if ( empty( $group ) ) { wp_set_object_terms( $post_id, array(), self::GROUP_TAXONOMY, false ); } else { wp_set_object_terms( $post_id, array( $group ), self::GROUP_TAXONOMY, false ); } } /** * Fetch actions. * * @param int $action_id Action ID. * @return object */ public function fetch_action( $action_id ) { $post = $this->get_post( $action_id ); if ( empty( $post ) || self::POST_TYPE !== $post->post_type ) { return $this->get_null_action(); } try { $action = $this->make_action_from_post( $post ); } catch ( ActionScheduler_InvalidActionException $exception ) { do_action( 'action_scheduler_failed_fetch_action', $post->ID, $exception ); return $this->get_null_action(); } return $action; } /** * Get post. * * @param string $action_id - Action ID. * @return WP_Post|null */ protected function get_post( $action_id ) { if ( empty( $action_id ) ) { return null; } return get_post( $action_id ); } /** * Get NULL action. * * @return ActionScheduler_NullAction */ protected function get_null_action() { return new ActionScheduler_NullAction(); } /** * Make action from post. * * @param WP_Post $post Post object. * @return WP_Post */ protected function make_action_from_post( $post ) { $hook = $post->post_title; $args = json_decode( $post->post_content, true ); $this->validate_args( $args, $post->ID ); $schedule = get_post_meta( $post->ID, self::SCHEDULE_META_KEY, true ); $this->validate_schedule( $schedule, $post->ID ); $group = wp_get_object_terms( $post->ID, self::GROUP_TAXONOMY, array( 'fields' => 'names' ) ); $group = empty( $group ) ? '' : reset( $group ); return ActionScheduler::factory()->get_stored_action( $this->get_action_status_by_post_status( $post->post_status ), $hook, $args, $schedule, $group ); } /** * Get action status by post status. * * @param string $post_status Post status. * * @throws InvalidArgumentException Throw InvalidArgumentException if $post_status not in known status fields returned by $this->get_status_labels(). * @return string */ protected function get_action_status_by_post_status( $post_status ) { switch ( $post_status ) { case 'publish': $action_status = self::STATUS_COMPLETE; break; case 'trash': $action_status = self::STATUS_CANCELED; break; default: if ( ! array_key_exists( $post_status, $this->get_status_labels() ) ) { throw new InvalidArgumentException( sprintf( 'Invalid post status: "%s". No matching action status available.', $post_status ) ); } $action_status = $post_status; break; } return $action_status; } /** * Get post status by action status. * * @param string $action_status Action status. * * @throws InvalidArgumentException Throws InvalidArgumentException if $post_status not in known status fields returned by $this->get_status_labels(). * @return string */ protected function get_post_status_by_action_status( $action_status ) { switch ( $action_status ) { case self::STATUS_COMPLETE: $post_status = 'publish'; break; case self::STATUS_CANCELED: $post_status = 'trash'; break; default: if ( ! array_key_exists( $action_status, $this->get_status_labels() ) ) { throw new InvalidArgumentException( sprintf( 'Invalid action status: "%s".', $action_status ) ); } $post_status = $action_status; break; } return $post_status; } /** * Returns the SQL statement to query (or count) actions. * * @param array $query - Filtering options. * @param string $select_or_count - Whether the SQL should select and return the IDs or just the row count. * * @throws InvalidArgumentException - Throw InvalidArgumentException if $select_or_count not count or select. * @return string SQL statement. The returned SQL is already properly escaped. */ protected function get_query_actions_sql( array $query, $select_or_count = 'select' ) { if ( ! in_array( $select_or_count, array( 'select', 'count' ), true ) ) { throw new InvalidArgumentException( __( 'Invalid schedule. Cannot save action.', 'woocommerce' ) ); } $query = wp_parse_args( $query, array( 'hook' => '', 'args' => null, 'date' => null, 'date_compare' => '<=', 'modified' => null, 'modified_compare' => '<=', 'group' => '', 'status' => '', 'claimed' => null, 'per_page' => 5, 'offset' => 0, 'orderby' => 'date', 'order' => 'ASC', 'search' => '', ) ); /** * Global wpdb object. * * @var wpdb $wpdb */ global $wpdb; $sql = ( 'count' === $select_or_count ) ? 'SELECT count(p.ID)' : 'SELECT p.ID '; $sql .= "FROM {$wpdb->posts} p"; $sql_params = array(); if ( empty( $query['group'] ) && 'group' === $query['orderby'] ) { $sql .= " LEFT JOIN {$wpdb->term_relationships} tr ON tr.object_id=p.ID"; $sql .= " LEFT JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id=tt.term_taxonomy_id"; $sql .= " LEFT JOIN {$wpdb->terms} t ON tt.term_id=t.term_id"; } elseif ( ! empty( $query['group'] ) ) { $sql .= " INNER JOIN {$wpdb->term_relationships} tr ON tr.object_id=p.ID"; $sql .= " INNER JOIN {$wpdb->term_taxonomy} tt ON tr.term_taxonomy_id=tt.term_taxonomy_id"; $sql .= " INNER JOIN {$wpdb->terms} t ON tt.term_id=t.term_id"; $sql .= ' AND t.slug=%s'; $sql_params[] = $query['group']; } $sql .= ' WHERE post_type=%s'; $sql_params[] = self::POST_TYPE; if ( $query['hook'] ) { $sql .= ' AND p.post_title=%s'; $sql_params[] = $query['hook']; } if ( ! is_null( $query['args'] ) ) { $sql .= ' AND p.post_content=%s'; $sql_params[] = wp_json_encode( $query['args'] ); } if ( $query['status'] ) { $post_statuses = array_map( array( $this, 'get_post_status_by_action_status' ), (array) $query['status'] ); $placeholders = array_fill( 0, count( $post_statuses ), '%s' ); $sql .= ' AND p.post_status IN (' . join( ', ', $placeholders ) . ')'; $sql_params = array_merge( $sql_params, array_values( $post_statuses ) ); } if ( $query['date'] instanceof DateTime ) { $date = clone $query['date']; $date->setTimezone( new DateTimeZone( 'UTC' ) ); $date_string = $date->format( 'Y-m-d H:i:s' ); $comparator = $this->validate_sql_comparator( $query['date_compare'] ); $sql .= " AND p.post_date_gmt $comparator %s"; $sql_params[] = $date_string; } if ( $query['modified'] instanceof DateTime ) { $modified = clone $query['modified']; $modified->setTimezone( new DateTimeZone( 'UTC' ) ); $date_string = $modified->format( 'Y-m-d H:i:s' ); $comparator = $this->validate_sql_comparator( $query['modified_compare'] ); $sql .= " AND p.post_modified_gmt $comparator %s"; $sql_params[] = $date_string; } if ( true === $query['claimed'] ) { $sql .= " AND p.post_password != ''"; } elseif ( false === $query['claimed'] ) { $sql .= " AND p.post_password = ''"; } elseif ( ! is_null( $query['claimed'] ) ) { $sql .= ' AND p.post_password = %s'; $sql_params[] = $query['claimed']; } if ( ! empty( $query['search'] ) ) { $sql .= ' AND (p.post_title LIKE %s OR p.post_content LIKE %s OR p.post_password LIKE %s)'; for ( $i = 0; $i < 3; $i++ ) { $sql_params[] = sprintf( '%%%s%%', $query['search'] ); } } if ( 'select' === $select_or_count ) { switch ( $query['orderby'] ) { case 'hook': $orderby = 'p.post_title'; break; case 'group': $orderby = 't.name'; break; case 'status': $orderby = 'p.post_status'; break; case 'modified': $orderby = 'p.post_modified'; break; case 'claim_id': $orderby = 'p.post_password'; break; case 'schedule': case 'date': default: $orderby = 'p.post_date_gmt'; break; } if ( 'ASC' === strtoupper( $query['order'] ) ) { $order = 'ASC'; } else { $order = 'DESC'; } $sql .= " ORDER BY $orderby $order"; if ( $query['per_page'] > 0 ) { $sql .= ' LIMIT %d, %d'; $sql_params[] = $query['offset']; $sql_params[] = $query['per_page']; } } return $wpdb->prepare( $sql, $sql_params ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared } /** * Query for action count or list of action IDs. * * @since 3.3.0 $query['status'] accepts array of statuses instead of a single status. * * @see ActionScheduler_Store::query_actions for $query arg usage. * * @param array $query Query filtering options. * @param string $query_type Whether to select or count the results. Defaults to select. * * @return string|array|null The IDs of actions matching the query. Null on failure. */ public function query_actions( $query = array(), $query_type = 'select' ) { /** * Global $wpdb object. * * @var wpdb $wpdb */ global $wpdb; $sql = $this->get_query_actions_sql( $query, $query_type ); return ( 'count' === $query_type ) ? $wpdb->get_var( $sql ) : $wpdb->get_col( $sql ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching,WordPress.DB.PreparedSQL.NotPrepared } /** * Get a count of all actions in the store, grouped by status * * @return array */ public function action_counts() { $action_counts_by_status = array(); $action_stati_and_labels = $this->get_status_labels(); $posts_count_by_status = (array) wp_count_posts( self::POST_TYPE, 'readable' ); foreach ( $posts_count_by_status as $post_status_name => $count ) { try { $action_status_name = $this->get_action_status_by_post_status( $post_status_name ); } catch ( Exception $e ) { // Ignore any post statuses that aren't for actions. continue; } if ( array_key_exists( $action_status_name, $action_stati_and_labels ) ) { $action_counts_by_status[ $action_status_name ] = $count; } } return $action_counts_by_status; } /** * Cancel action. * * @param int $action_id Action ID. * * @throws InvalidArgumentException If $action_id is not identified. */ public function cancel_action( $action_id ) { $post = get_post( $action_id ); if ( empty( $post ) || ( self::POST_TYPE !== $post->post_type ) ) { /* translators: %s is the action ID */ throw new InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'woocommerce' ), $action_id ) ); } do_action( 'action_scheduler_canceled_action', $action_id ); add_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10, 5 ); wp_trash_post( $action_id ); remove_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10 ); } /** * Delete action. * * @param int $action_id Action ID. * @return void * @throws InvalidArgumentException If action is not identified. */ public function delete_action( $action_id ) { $post = get_post( $action_id ); if ( empty( $post ) || ( self::POST_TYPE !== $post->post_type ) ) { /* translators: %s is the action ID */ throw new InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'woocommerce' ), $action_id ) ); } do_action( 'action_scheduler_deleted_action', $action_id ); wp_delete_post( $action_id, true ); } /** * Get date for claim id. * * @param int $action_id Action ID. * @return ActionScheduler_DateTime The date the action is schedule to run, or the date that it ran. */ public function get_date( $action_id ) { $next = $this->get_date_gmt( $action_id ); return ActionScheduler_TimezoneHelper::set_local_timezone( $next ); } /** * Get Date GMT. * * @param int $action_id Action ID. * * @throws InvalidArgumentException If $action_id is not identified. * @return ActionScheduler_DateTime The date the action is schedule to run, or the date that it ran. */ public function get_date_gmt( $action_id ) { $post = get_post( $action_id ); if ( empty( $post ) || ( self::POST_TYPE !== $post->post_type ) ) { /* translators: %s is the action ID */ throw new InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'woocommerce' ), $action_id ) ); } if ( 'publish' === $post->post_status ) { return as_get_datetime_object( $post->post_modified_gmt ); } else { return as_get_datetime_object( $post->post_date_gmt ); } } /** * Stake claim. * * @param int $max_actions Maximum number of actions. * @param DateTime $before_date Jobs must be schedule before this date. Defaults to now. * @param array $hooks Claim only actions with a hook or hooks. * @param string $group Claim only actions in the given group. * * @return ActionScheduler_ActionClaim * @throws RuntimeException When there is an error staking a claim. * @throws InvalidArgumentException When the given group is not valid. */ public function stake_claim( $max_actions = 10, DateTime $before_date = null, $hooks = array(), $group = '' ) { $this->claim_before_date = $before_date; $claim_id = $this->generate_claim_id(); $this->claim_actions( $claim_id, $max_actions, $before_date, $hooks, $group ); $action_ids = $this->find_actions_by_claim_id( $claim_id ); $this->claim_before_date = null; return new ActionScheduler_ActionClaim( $claim_id, $action_ids ); } /** * Get claim count. * * @return int */ public function get_claim_count() { global $wpdb; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery,WordPress.DB.DirectDatabaseQuery.NoCaching return $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(DISTINCT post_password) FROM {$wpdb->posts} WHERE post_password != '' AND post_type = %s AND post_status IN ('in-progress','pending')", array( self::POST_TYPE ) ) ); } /** * Generate claim id. * * @return string */ protected function generate_claim_id() { $claim_id = md5( microtime( true ) . wp_rand( 0, 1000 ) ); return substr( $claim_id, 0, 20 ); // to fit in db field with 20 char limit. } /** * Claim actions. * * @param string $claim_id Claim ID. * @param int $limit Limit. * @param DateTime $before_date Should use UTC timezone. * @param array $hooks Claim only actions with a hook or hooks. * @param string $group Claim only actions in the given group. * * @return int The number of actions that were claimed. * @throws RuntimeException When there is a database error. */ protected function claim_actions( $claim_id, $limit, DateTime $before_date = null, $hooks = array(), $group = '' ) { // Set up initial variables. $date = null === $before_date ? as_get_datetime_object() : clone $before_date; $limit_ids = ! empty( $group ); $ids = $limit_ids ? $this->get_actions_by_group( $group, $limit, $date ) : array(); // If limiting by IDs and no posts found, then return early since we have nothing to update. if ( $limit_ids && 0 === count( $ids ) ) { return 0; } /** * Global wpdb object. * * @var wpdb $wpdb */ global $wpdb; /* * Build up custom query to update the affected posts. Parameters are built as a separate array * to make it easier to identify where they are in the query. * * We can't use $wpdb->update() here because of the "ID IN ..." clause. */ $update = "UPDATE {$wpdb->posts} SET post_password = %s, post_modified_gmt = %s, post_modified = %s"; $params = array( $claim_id, current_time( 'mysql', true ), current_time( 'mysql' ), ); // Build initial WHERE clause. $where = "WHERE post_type = %s AND post_status = %s AND post_password = ''"; $params[] = self::POST_TYPE; $params[] = ActionScheduler_Store::STATUS_PENDING; if ( ! empty( $hooks ) ) { $placeholders = array_fill( 0, count( $hooks ), '%s' ); $where .= ' AND post_title IN (' . join( ', ', $placeholders ) . ')'; $params = array_merge( $params, array_values( $hooks ) ); } /* * Add the IDs to the WHERE clause. IDs not escaped because they came directly from a prior DB query. * * If we're not limiting by IDs, then include the post_date_gmt clause. */ if ( $limit_ids ) { $where .= ' AND ID IN (' . join( ',', $ids ) . ')'; } else { $where .= ' AND post_date_gmt <= %s'; $params[] = $date->format( 'Y-m-d H:i:s' ); } // Add the ORDER BY clause and,ms limit. $order = 'ORDER BY menu_order ASC, post_date_gmt ASC, ID ASC LIMIT %d'; $params[] = $limit; // Run the query and gather results. $rows_affected = $wpdb->query( $wpdb->prepare( "{$update} {$where} {$order}", $params ) ); // phpcs:ignore // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders.UnfinishedPrepare if ( false === $rows_affected ) { throw new RuntimeException( __( 'Unable to claim actions. Database error.', 'woocommerce' ) ); } return (int) $rows_affected; } /** * Get IDs of actions within a certain group and up to a certain date/time. * * @param string $group The group to use in finding actions. * @param int $limit The number of actions to retrieve. * @param DateTime $date DateTime object representing cutoff time for actions. Actions retrieved will be * up to and including this DateTime. * * @return array IDs of actions in the appropriate group and before the appropriate time. * @throws InvalidArgumentException When the group does not exist. */ protected function get_actions_by_group( $group, $limit, DateTime $date ) { // Ensure the group exists before continuing. if ( ! term_exists( $group, self::GROUP_TAXONOMY ) ) { /* translators: %s is the group name */ throw new InvalidArgumentException( sprintf( __( 'The group "%s" does not exist.', 'woocommerce' ), $group ) ); } // Set up a query for post IDs to use later. $query = new WP_Query(); $query_args = array( 'fields' => 'ids', 'post_type' => self::POST_TYPE, 'post_status' => ActionScheduler_Store::STATUS_PENDING, 'has_password' => false, 'posts_per_page' => $limit * 3, 'suppress_filters' => true, 'no_found_rows' => true, 'orderby' => array( 'menu_order' => 'ASC', 'date' => 'ASC', 'ID' => 'ASC', ), 'date_query' => array( 'column' => 'post_date_gmt', 'before' => $date->format( 'Y-m-d H:i' ), 'inclusive' => true, ), 'tax_query' => array( // phpcs:ignore WordPress.DB.SlowDBQuery array( 'taxonomy' => self::GROUP_TAXONOMY, 'field' => 'slug', 'terms' => $group, 'include_children' => false, ), ), ); return $query->query( $query_args ); } /** * Find actions by claim ID. * * @param string $claim_id Claim ID. * @return array */ public function find_actions_by_claim_id( $claim_id ) { /** * Global wpdb object. * * @var wpdb $wpdb */ global $wpdb; $action_ids = array(); $before_date = isset( $this->claim_before_date ) ? $this->claim_before_date : as_get_datetime_object(); $cut_off = $before_date->format( 'Y-m-d H:i:s' ); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $results = $wpdb->get_results( $wpdb->prepare( "SELECT ID, post_date_gmt FROM {$wpdb->posts} WHERE post_type = %s AND post_password = %s", array( self::POST_TYPE, $claim_id, ) ) ); // Verify that the scheduled date for each action is within the expected bounds (in some unusual // cases, we cannot depend on MySQL to honor all of the WHERE conditions we specify). foreach ( $results as $claimed_action ) { if ( $claimed_action->post_date_gmt <= $cut_off ) { $action_ids[] = absint( $claimed_action->ID ); } } return $action_ids; } /** * Release claim. * * @param ActionScheduler_ActionClaim $claim Claim object to release. * @return void * @throws RuntimeException When the claim is not unlocked. */ public function release_claim( ActionScheduler_ActionClaim $claim ) { $action_ids = $this->find_actions_by_claim_id( $claim->get_id() ); if ( empty( $action_ids ) ) { return; // nothing to do. } $action_id_string = implode( ',', array_map( 'intval', $action_ids ) ); /** * Global wpdb object. * * @var wpdb $wpdb */ global $wpdb; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $result = $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->posts} SET post_password = '' WHERE ID IN ($action_id_string) AND post_password = %s", //phpcs:ignore array( $claim->get_id(), ) ) ); if ( false === $result ) { /* translators: %s: claim ID */ throw new RuntimeException( sprintf( __( 'Unable to unlock claim %s. Database error.', 'woocommerce' ), $claim->get_id() ) ); } } /** * Unclaim action. * * @param string $action_id Action ID. * @throws RuntimeException When unable to unlock claim on action ID. */ public function unclaim_action( $action_id ) { /** * Global wpdb object. * * @var wpdb $wpdb */ global $wpdb; //phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $result = $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->posts} SET post_password = '' WHERE ID = %d AND post_type = %s", $action_id, self::POST_TYPE ) ); if ( false === $result ) { /* translators: %s: action ID */ throw new RuntimeException( sprintf( __( 'Unable to unlock claim on action %s. Database error.', 'woocommerce' ), $action_id ) ); } } /** * Mark failure on action. * * @param int $action_id Action ID. * * @return void * @throws RuntimeException When unable to mark failure on action ID. */ public function mark_failure( $action_id ) { /** * Global wpdb object. * * @var wpdb $wpdb */ global $wpdb; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $result = $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->posts} SET post_status = %s WHERE ID = %d AND post_type = %s", self::STATUS_FAILED, $action_id, self::POST_TYPE ) ); if ( false === $result ) { /* translators: %s: action ID */ throw new RuntimeException( sprintf( __( 'Unable to mark failure on action %s. Database error.', 'woocommerce' ), $action_id ) ); } } /** * Return an action's claim ID, as stored in the post password column * * @param int $action_id Action ID. * @return mixed */ public function get_claim_id( $action_id ) { return $this->get_post_column( $action_id, 'post_password' ); } /** * Return an action's status, as stored in the post status column * * @param int $action_id Action ID. * * @return mixed * @throws InvalidArgumentException When the action ID is invalid. */ public function get_status( $action_id ) { $status = $this->get_post_column( $action_id, 'post_status' ); if ( null === $status ) { throw new InvalidArgumentException( __( 'Invalid action ID. No status found.', 'woocommerce' ) ); } return $this->get_action_status_by_post_status( $status ); } /** * Get post column * * @param string $action_id Action ID. * @param string $column_name Column Name. * * @return string|null */ private function get_post_column( $action_id, $column_name ) { /** * Global wpdb object. * * @var wpdb $wpdb */ global $wpdb; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching return $wpdb->get_var( $wpdb->prepare( "SELECT {$column_name} FROM {$wpdb->posts} WHERE ID=%d AND post_type=%s", // phpcs:ignore $action_id, self::POST_TYPE ) ); } /** * Log Execution. * * @throws Exception If the action status cannot be updated to self::STATUS_RUNNING ('in-progress'). * * @param string $action_id Action ID. */ public function log_execution( $action_id ) { /** * Global wpdb object. * * @var wpdb $wpdb */ global $wpdb; // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $status_updated = $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->posts} SET menu_order = menu_order+1, post_status=%s, post_modified_gmt = %s, post_modified = %s WHERE ID = %d AND post_type = %s", self::STATUS_RUNNING, current_time( 'mysql', true ), current_time( 'mysql' ), $action_id, self::POST_TYPE ) ); if ( ! $status_updated ) { throw new Exception( sprintf( /* translators: 1: action ID. 2: status slug. */ __( 'Unable to update the status of action %1$d to %2$s.', 'woocommerce' ), $action_id, self::STATUS_RUNNING ) ); } } /** * Record that an action was completed. * * @param string $action_id ID of the completed action. * * @throws InvalidArgumentException When the action ID is invalid. * @throws RuntimeException When there was an error executing the action. */ public function mark_complete( $action_id ) { $post = get_post( $action_id ); if ( empty( $post ) || ( self::POST_TYPE !== $post->post_type ) ) { /* translators: %s is the action ID */ throw new InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'woocommerce' ), $action_id ) ); } add_filter( 'wp_insert_post_data', array( $this, 'filter_insert_post_data' ), 10, 1 ); add_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10, 5 ); $result = wp_update_post( array( 'ID' => $action_id, 'post_status' => 'publish', ), true ); remove_filter( 'wp_insert_post_data', array( $this, 'filter_insert_post_data' ), 10 ); remove_filter( 'pre_wp_unique_post_slug', array( $this, 'set_unique_post_slug' ), 10 ); if ( is_wp_error( $result ) ) { throw new RuntimeException( $result->get_error_message() ); } /** * Fires after a scheduled action has been completed. * * @since 3.4.2 * * @param int $action_id Action ID. */ do_action( 'action_scheduler_completed_action', $action_id ); } /** * Mark action as migrated when there is an error deleting the action. * * @param int $action_id Action ID. */ public function mark_migrated( $action_id ) { wp_update_post( array( 'ID' => $action_id, 'post_status' => 'migrated', ) ); } /** * Determine whether the post store can be migrated. * * @param [type] $setting - Setting value. * @return bool */ public function migration_dependencies_met( $setting ) { global $wpdb; $dependencies_met = get_transient( self::DEPENDENCIES_MET ); if ( empty( $dependencies_met ) ) { $maximum_args_length = apply_filters( 'action_scheduler_maximum_args_length', 191 ); $found_action = $wpdb->get_var( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_type = %s AND CHAR_LENGTH(post_content) > %d LIMIT 1", $maximum_args_length, self::POST_TYPE ) ); $dependencies_met = $found_action ? 'no' : 'yes'; set_transient( self::DEPENDENCIES_MET, $dependencies_met, DAY_IN_SECONDS ); } return 'yes' === $dependencies_met ? $setting : false; } /** * InnoDB indexes have a maximum size of 767 bytes by default, which is only 191 characters with utf8mb4. * * Previously, AS wasn't concerned about args length, as we used the (unindex) post_content column. However, * as we prepare to move to custom tables, and can use an indexed VARCHAR column instead, we want to warn * developers of this impending requirement. * * @param ActionScheduler_Action $action Action object. */ protected function validate_action( ActionScheduler_Action $action ) { try { parent::validate_action( $action ); } catch ( Exception $e ) { /* translators: %s is the error message */ $message = sprintf( __( '%s Support for strings longer than this will be removed in a future version.', 'woocommerce' ), $e->getMessage() ); _doing_it_wrong( 'ActionScheduler_Action::$args', esc_html( $message ), '2.1.0' ); } } /** * (@codeCoverageIgnore) */ public function init() { add_filter( 'action_scheduler_migration_dependencies_met', array( $this, 'migration_dependencies_met' ) ); $post_type_registrar = new ActionScheduler_wpPostStore_PostTypeRegistrar(); $post_type_registrar->register(); $post_status_registrar = new ActionScheduler_wpPostStore_PostStatusRegistrar(); $post_status_registrar->register(); $taxonomy_registrar = new ActionScheduler_wpPostStore_TaxonomyRegistrar(); $taxonomy_registrar->register(); } } pro/libraries/action-scheduler/classes/data-stores/ActionScheduler_DBStore.php000064400000111556147600337620023624 0ustar00 '', 'hooks' => '', 'exclude-groups' => '', ]; /** * Initialize the data store * * @codeCoverageIgnore */ public function init() { $table_maker = new ActionScheduler_StoreSchema(); $table_maker->init(); $table_maker->register_tables(); } /** * Save an action, checks if this is a unique action before actually saving. * * @param ActionScheduler_Action $action Action object. * @param \DateTime $scheduled_date Optional schedule date. Default null. * * @return int Action ID. * @throws RuntimeException Throws exception when saving the action fails. */ public function save_unique_action( ActionScheduler_Action $action, \DateTime $scheduled_date = null ) { return $this->save_action_to_db( $action, $scheduled_date, true ); } /** * Save an action. Can save duplicate action as well, prefer using `save_unique_action` instead. * * @param ActionScheduler_Action $action Action object. * @param \DateTime $scheduled_date Optional schedule date. Default null. * * @return int Action ID. * @throws RuntimeException Throws exception when saving the action fails. */ public function save_action( ActionScheduler_Action $action, \DateTime $scheduled_date = null ) { return $this->save_action_to_db( $action, $scheduled_date, false ); } /** * Save an action. * * @param ActionScheduler_Action $action Action object. * @param ?DateTime $date Optional schedule date. Default null. * @param bool $unique Whether the action should be unique. * * @return int Action ID. * @throws RuntimeException Throws exception when saving the action fails. */ private function save_action_to_db( ActionScheduler_Action $action, DateTime $date = null, $unique = false ) { global $wpdb; try { $this->validate_action( $action ); $data = array( 'hook' => $action->get_hook(), 'status' => ( $action->is_finished() ? self::STATUS_COMPLETE : self::STATUS_PENDING ), 'scheduled_date_gmt' => $this->get_scheduled_date_string( $action, $date ), 'scheduled_date_local' => $this->get_scheduled_date_string_local( $action, $date ), 'schedule' => serialize( $action->get_schedule() ), // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_serialize 'group_id' => current( $this->get_group_ids( $action->get_group() ) ), 'priority' => $action->get_priority(), ); $args = wp_json_encode( $action->get_args() ); if ( strlen( $args ) <= static::$max_index_length ) { $data['args'] = $args; } else { $data['args'] = $this->hash_args( $args ); $data['extended_args'] = $args; } $insert_sql = $this->build_insert_sql( $data, $unique ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- $insert_sql should be already prepared. $wpdb->query( $insert_sql ); $action_id = $wpdb->insert_id; if ( is_wp_error( $action_id ) ) { throw new \RuntimeException( $action_id->get_error_message() ); } elseif ( empty( $action_id ) ) { if ( $unique ) { return 0; } throw new \RuntimeException( $wpdb->last_error ? $wpdb->last_error : __( 'Database error.', 'woocommerce' ) ); } do_action( 'action_scheduler_stored_action', $action_id ); return $action_id; } catch ( \Exception $e ) { /* translators: %s: error message */ throw new \RuntimeException( sprintf( __( 'Error saving action: %s', 'woocommerce' ), $e->getMessage() ), 0 ); } } /** * Helper function to build insert query. * * @param array $data Row data for action. * @param bool $unique Whether the action should be unique. * * @return string Insert query. */ private function build_insert_sql( array $data, $unique ) { global $wpdb; $columns = array_keys( $data ); $values = array_values( $data ); $placeholders = array_map( array( $this, 'get_placeholder_for_column' ), $columns ); $table_name = ! empty( $wpdb->actionscheduler_actions ) ? $wpdb->actionscheduler_actions : $wpdb->prefix . 'actionscheduler_actions'; $column_sql = '`' . implode( '`, `', $columns ) . '`'; $placeholder_sql = implode( ', ', $placeholders ); $where_clause = $this->build_where_clause_for_insert( $data, $table_name, $unique ); // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $column_sql and $where_clause are already prepared. $placeholder_sql is hardcoded. $insert_query = $wpdb->prepare( " INSERT INTO $table_name ( $column_sql ) SELECT $placeholder_sql FROM DUAL WHERE ( $where_clause ) IS NULL", $values ); // phpcs:enable return $insert_query; } /** * Helper method to build where clause for action insert statement. * * @param array $data Row data for action. * @param string $table_name Action table name. * @param bool $unique Where action should be unique. * * @return string Where clause to be used with insert. */ private function build_where_clause_for_insert( $data, $table_name, $unique ) { global $wpdb; if ( ! $unique ) { return 'SELECT NULL FROM DUAL'; } $pending_statuses = array( ActionScheduler_Store::STATUS_PENDING, ActionScheduler_Store::STATUS_RUNNING, ); $pending_status_placeholders = implode( ', ', array_fill( 0, count( $pending_statuses ), '%s' ) ); // phpcs:disable WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.PreparedSQL.InterpolatedNotPrepared -- $pending_status_placeholders is hardcoded. $where_clause = $wpdb->prepare( " SELECT action_id FROM $table_name WHERE status IN ( $pending_status_placeholders ) AND hook = %s AND `group_id` = %d ", array_merge( $pending_statuses, array( $data['hook'], $data['group_id'], ) ) ); // phpcs:enable return "$where_clause" . ' LIMIT 1'; } /** * Helper method to get $wpdb->prepare placeholder for a given column name. * * @param string $column_name Name of column in actions table. * * @return string Placeholder to use for given column. */ private function get_placeholder_for_column( $column_name ) { $string_columns = array( 'hook', 'status', 'scheduled_date_gmt', 'scheduled_date_local', 'args', 'schedule', 'last_attempt_gmt', 'last_attempt_local', 'extended_args', ); return in_array( $column_name, $string_columns ) ? '%s' : '%d'; } /** * Generate a hash from json_encoded $args using MD5 as this isn't for security. * * @param string $args JSON encoded action args. * @return string */ protected function hash_args( $args ) { return md5( $args ); } /** * Get action args query param value from action args. * * @param array $args Action args. * @return string */ protected function get_args_for_query( $args ) { $encoded = wp_json_encode( $args ); if ( strlen( $encoded ) <= static::$max_index_length ) { return $encoded; } return $this->hash_args( $encoded ); } /** * Get a group's ID based on its name/slug. * * @param string|array $slugs The string name of a group, or names for several groups. * @param bool $create_if_not_exists Whether to create the group if it does not already exist. Default, true - create the group. * * @return array The group IDs, if they exist or were successfully created. May be empty. */ protected function get_group_ids( $slugs, $create_if_not_exists = true ) { $slugs = (array) $slugs; $group_ids = array(); if ( empty( $slugs ) ) { return array(); } /** @var \wpdb $wpdb */ global $wpdb; foreach ( $slugs as $slug ) { $group_id = (int) $wpdb->get_var( $wpdb->prepare( "SELECT group_id FROM {$wpdb->actionscheduler_groups} WHERE slug=%s", $slug ) ); if ( empty( $group_id ) && $create_if_not_exists ) { $group_id = $this->create_group( $slug ); } if ( $group_id ) { $group_ids[] = $group_id; } } return $group_ids; } /** * Create an action group. * * @param string $slug Group slug. * * @return int Group ID. */ protected function create_group( $slug ) { /** @var \wpdb $wpdb */ global $wpdb; $wpdb->insert( $wpdb->actionscheduler_groups, array( 'slug' => $slug ) ); return (int) $wpdb->insert_id; } /** * Retrieve an action. * * @param int $action_id Action ID. * * @return ActionScheduler_Action */ public function fetch_action( $action_id ) { /** @var \wpdb $wpdb */ global $wpdb; $data = $wpdb->get_row( $wpdb->prepare( "SELECT a.*, g.slug AS `group` FROM {$wpdb->actionscheduler_actions} a LEFT JOIN {$wpdb->actionscheduler_groups} g ON a.group_id=g.group_id WHERE a.action_id=%d", $action_id ) ); if ( empty( $data ) ) { return $this->get_null_action(); } if ( ! empty( $data->extended_args ) ) { $data->args = $data->extended_args; unset( $data->extended_args ); } // Convert NULL dates to zero dates. $date_fields = array( 'scheduled_date_gmt', 'scheduled_date_local', 'last_attempt_gmt', 'last_attempt_gmt', ); foreach ( $date_fields as $date_field ) { if ( is_null( $data->$date_field ) ) { $data->$date_field = ActionScheduler_StoreSchema::DEFAULT_DATE; } } try { $action = $this->make_action_from_db_record( $data ); } catch ( ActionScheduler_InvalidActionException $exception ) { do_action( 'action_scheduler_failed_fetch_action', $action_id, $exception ); return $this->get_null_action(); } return $action; } /** * Create a null action. * * @return ActionScheduler_NullAction */ protected function get_null_action() { return new ActionScheduler_NullAction(); } /** * Create an action from a database record. * * @param object $data Action database record. * * @return ActionScheduler_Action|ActionScheduler_CanceledAction|ActionScheduler_FinishedAction */ protected function make_action_from_db_record( $data ) { $hook = $data->hook; $args = json_decode( $data->args, true ); $schedule = unserialize( $data->schedule ); // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.serialize_unserialize $this->validate_args( $args, $data->action_id ); $this->validate_schedule( $schedule, $data->action_id ); if ( empty( $schedule ) ) { $schedule = new ActionScheduler_NullSchedule(); } $group = $data->group ? $data->group : ''; return ActionScheduler::factory()->get_stored_action( $data->status, $data->hook, $args, $schedule, $group, $data->priority ); } /** * Returns the SQL statement to query (or count) actions. * * @since 3.3.0 $query['status'] accepts array of statuses instead of a single status. * * @param array $query Filtering options. * @param string $select_or_count Whether the SQL should select and return the IDs or just the row count. * * @return string SQL statement already properly escaped. * @throws InvalidArgumentException If the query is invalid. */ protected function get_query_actions_sql( array $query, $select_or_count = 'select' ) { if ( ! in_array( $select_or_count, array( 'select', 'count' ), true ) ) { throw new InvalidArgumentException( __( 'Invalid value for select or count parameter. Cannot query actions.', 'woocommerce' ) ); } $query = wp_parse_args( $query, array( 'hook' => '', 'args' => null, 'partial_args_matching' => 'off', // can be 'like' or 'json' 'date' => null, 'date_compare' => '<=', 'modified' => null, 'modified_compare' => '<=', 'group' => '', 'status' => '', 'claimed' => null, 'per_page' => 5, 'offset' => 0, 'orderby' => 'date', 'order' => 'ASC', ) ); /** @var \wpdb $wpdb */ global $wpdb; $db_server_info = is_callable( array( $wpdb, 'db_server_info' ) ) ? $wpdb->db_server_info() : $wpdb->db_version(); if ( false !== strpos( $db_server_info, 'MariaDB' ) ) { $supports_json = version_compare( PHP_VERSION_ID >= 80016 ? $wpdb->db_version() : preg_replace( '/[^0-9.].*/', '', str_replace( '5.5.5-', '', $db_server_info ) ), '10.2', '>=' ); } else { $supports_json = version_compare( $wpdb->db_version(), '5.7', '>=' ); } $sql = ( 'count' === $select_or_count ) ? 'SELECT count(a.action_id)' : 'SELECT a.action_id'; $sql .= " FROM {$wpdb->actionscheduler_actions} a"; $sql_params = array(); if ( ! empty( $query['group'] ) || 'group' === $query['orderby'] ) { $sql .= " LEFT JOIN {$wpdb->actionscheduler_groups} g ON g.group_id=a.group_id"; } $sql .= " WHERE 1=1"; if ( ! empty( $query['group'] ) ) { $sql .= " AND g.slug=%s"; $sql_params[] = $query['group']; } if ( ! empty( $query['hook'] ) ) { $sql .= " AND a.hook=%s"; $sql_params[] = $query['hook']; } if ( ! is_null( $query['args'] ) ) { switch ( $query['partial_args_matching'] ) { case 'json': if ( ! $supports_json ) { throw new \RuntimeException( __( 'JSON partial matching not supported in your environment. Please check your MySQL/MariaDB version.', 'woocommerce' ) ); } $supported_types = array( 'integer' => '%d', 'boolean' => '%s', 'double' => '%f', 'string' => '%s', ); foreach ( $query['args'] as $key => $value ) { $value_type = gettype( $value ); if ( 'boolean' === $value_type ) { $value = $value ? 'true' : 'false'; } $placeholder = isset( $supported_types[ $value_type ] ) ? $supported_types[ $value_type ] : false; if ( ! $placeholder ) { throw new \RuntimeException( sprintf( /* translators: %s: provided value type */ __( 'The value type for the JSON partial matching is not supported. Must be either integer, boolean, double or string. %s type provided.', 'woocommerce' ), $value_type ) ); } $sql .= ' AND JSON_EXTRACT(a.args, %s)='.$placeholder; $sql_params[] = '$.'.$key; $sql_params[] = $value; } break; case 'like': foreach ( $query['args'] as $key => $value ) { $sql .= ' AND a.args LIKE %s'; $json_partial = $wpdb->esc_like( trim( json_encode( array( $key => $value ) ), '{}' ) ); $sql_params[] = "%{$json_partial}%"; } break; case 'off': $sql .= " AND a.args=%s"; $sql_params[] = $this->get_args_for_query( $query['args'] ); break; default: throw new \RuntimeException( __( 'Unknown partial args matching value.', 'woocommerce' ) ); } } if ( $query['status'] ) { $statuses = (array) $query['status']; $placeholders = array_fill( 0, count( $statuses ), '%s' ); $sql .= ' AND a.status IN (' . join( ', ', $placeholders ) . ')'; $sql_params = array_merge( $sql_params, array_values( $statuses ) ); } if ( $query['date'] instanceof \DateTime ) { $date = clone $query['date']; $date->setTimezone( new \DateTimeZone( 'UTC' ) ); $date_string = $date->format( 'Y-m-d H:i:s' ); $comparator = $this->validate_sql_comparator( $query['date_compare'] ); $sql .= " AND a.scheduled_date_gmt $comparator %s"; $sql_params[] = $date_string; } if ( $query['modified'] instanceof \DateTime ) { $modified = clone $query['modified']; $modified->setTimezone( new \DateTimeZone( 'UTC' ) ); $date_string = $modified->format( 'Y-m-d H:i:s' ); $comparator = $this->validate_sql_comparator( $query['modified_compare'] ); $sql .= " AND a.last_attempt_gmt $comparator %s"; $sql_params[] = $date_string; } if ( true === $query['claimed'] ) { $sql .= ' AND a.claim_id != 0'; } elseif ( false === $query['claimed'] ) { $sql .= ' AND a.claim_id = 0'; } elseif ( ! is_null( $query['claimed'] ) ) { $sql .= ' AND a.claim_id = %d'; $sql_params[] = $query['claimed']; } if ( ! empty( $query['search'] ) ) { $sql .= ' AND (a.hook LIKE %s OR (a.extended_args IS NULL AND a.args LIKE %s) OR a.extended_args LIKE %s'; for ( $i = 0; $i < 3; $i++ ) { $sql_params[] = sprintf( '%%%s%%', $query['search'] ); } $search_claim_id = (int) $query['search']; if ( $search_claim_id ) { $sql .= ' OR a.claim_id = %d'; $sql_params[] = $search_claim_id; } $sql .= ')'; } if ( 'select' === $select_or_count ) { if ( 'ASC' === strtoupper( $query['order'] ) ) { $order = 'ASC'; } else { $order = 'DESC'; } switch ( $query['orderby'] ) { case 'hook': $sql .= " ORDER BY a.hook $order"; break; case 'group': $sql .= " ORDER BY g.slug $order"; break; case 'modified': $sql .= " ORDER BY a.last_attempt_gmt $order"; break; case 'none': break; case 'action_id': $sql .= " ORDER BY a.action_id $order"; break; case 'date': default: $sql .= " ORDER BY a.scheduled_date_gmt $order"; break; } if ( $query['per_page'] > 0 ) { $sql .= ' LIMIT %d, %d'; $sql_params[] = $query['offset']; $sql_params[] = $query['per_page']; } } if ( ! empty( $sql_params ) ) { $sql = $wpdb->prepare( $sql, $sql_params ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared } return $sql; } /** * Query for action count or list of action IDs. * * @since 3.3.0 $query['status'] accepts array of statuses instead of a single status. * * @see ActionScheduler_Store::query_actions for $query arg usage. * * @param array $query Query filtering options. * @param string $query_type Whether to select or count the results. Defaults to select. * * @return string|array|null The IDs of actions matching the query. Null on failure. */ public function query_actions( $query = array(), $query_type = 'select' ) { /** @var wpdb $wpdb */ global $wpdb; $sql = $this->get_query_actions_sql( $query, $query_type ); return ( 'count' === $query_type ) ? $wpdb->get_var( $sql ) : $wpdb->get_col( $sql ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.NoSql, WordPress.DB.DirectDatabaseQuery.NoCaching } /** * Get a count of all actions in the store, grouped by status. * * @return array Set of 'status' => int $count pairs for statuses with 1 or more actions of that status. */ public function action_counts() { global $wpdb; $sql = "SELECT a.status, count(a.status) as 'count'"; $sql .= " FROM {$wpdb->actionscheduler_actions} a"; $sql .= ' GROUP BY a.status'; $actions_count_by_status = array(); $action_stati_and_labels = $this->get_status_labels(); foreach ( $wpdb->get_results( $sql ) as $action_data ) { // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared // Ignore any actions with invalid status. if ( array_key_exists( $action_data->status, $action_stati_and_labels ) ) { $actions_count_by_status[ $action_data->status ] = $action_data->count; } } return $actions_count_by_status; } /** * Cancel an action. * * @param int $action_id Action ID. * * @return void * @throws \InvalidArgumentException If the action update failed. */ public function cancel_action( $action_id ) { /** @var \wpdb $wpdb */ global $wpdb; $updated = $wpdb->update( $wpdb->actionscheduler_actions, array( 'status' => self::STATUS_CANCELED ), array( 'action_id' => $action_id ), array( '%s' ), array( '%d' ) ); if ( false === $updated ) { /* translators: %s: action ID */ throw new \InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'woocommerce' ), $action_id ) ); } do_action( 'action_scheduler_canceled_action', $action_id ); } /** * Cancel pending actions by hook. * * @since 3.0.0 * * @param string $hook Hook name. * * @return void */ public function cancel_actions_by_hook( $hook ) { $this->bulk_cancel_actions( array( 'hook' => $hook ) ); } /** * Cancel pending actions by group. * * @param string $group Group slug. * * @return void */ public function cancel_actions_by_group( $group ) { $this->bulk_cancel_actions( array( 'group' => $group ) ); } /** * Bulk cancel actions. * * @since 3.0.0 * * @param array $query_args Query parameters. */ protected function bulk_cancel_actions( $query_args ) { /** @var \wpdb $wpdb */ global $wpdb; if ( ! is_array( $query_args ) ) { return; } // Don't cancel actions that are already canceled. if ( isset( $query_args['status'] ) && self::STATUS_CANCELED === $query_args['status'] ) { return; } $action_ids = true; $query_args = wp_parse_args( $query_args, array( 'per_page' => 1000, 'status' => self::STATUS_PENDING, 'orderby' => 'action_id', ) ); while ( $action_ids ) { $action_ids = $this->query_actions( $query_args ); if ( empty( $action_ids ) ) { break; } $format = array_fill( 0, count( $action_ids ), '%d' ); $query_in = '(' . implode( ',', $format ) . ')'; $parameters = $action_ids; array_unshift( $parameters, self::STATUS_CANCELED ); $wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->actionscheduler_actions} SET status = %s WHERE action_id IN {$query_in}", // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared $parameters ) ); do_action( 'action_scheduler_bulk_cancel_actions', $action_ids ); } } /** * Delete an action. * * @param int $action_id Action ID. * @throws \InvalidArgumentException If the action deletion failed. */ public function delete_action( $action_id ) { /** @var \wpdb $wpdb */ global $wpdb; $deleted = $wpdb->delete( $wpdb->actionscheduler_actions, array( 'action_id' => $action_id ), array( '%d' ) ); if ( empty( $deleted ) ) { throw new \InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'woocommerce' ), $action_id ) ); //phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment } do_action( 'action_scheduler_deleted_action', $action_id ); } /** * Get the schedule date for an action. * * @param string $action_id Action ID. * * @return \DateTime The local date the action is scheduled to run, or the date that it ran. */ public function get_date( $action_id ) { $date = $this->get_date_gmt( $action_id ); ActionScheduler_TimezoneHelper::set_local_timezone( $date ); return $date; } /** * Get the GMT schedule date for an action. * * @param int $action_id Action ID. * * @throws \InvalidArgumentException If action cannot be identified. * @return \DateTime The GMT date the action is scheduled to run, or the date that it ran. */ protected function get_date_gmt( $action_id ) { /** @var \wpdb $wpdb */ global $wpdb; $record = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->actionscheduler_actions} WHERE action_id=%d", $action_id ) ); if ( empty( $record ) ) { throw new \InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'woocommerce' ), $action_id ) ); //phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment } if ( self::STATUS_PENDING === $record->status ) { return as_get_datetime_object( $record->scheduled_date_gmt ); } else { return as_get_datetime_object( $record->last_attempt_gmt ); } } /** * Stake a claim on actions. * * @param int $max_actions Maximum number of action to include in claim. * @param \DateTime $before_date Jobs must be schedule before this date. Defaults to now. * @param array $hooks Hooks to filter for. * @param string $group Group to filter for. * * @return ActionScheduler_ActionClaim */ public function stake_claim( $max_actions = 10, \DateTime $before_date = null, $hooks = array(), $group = '' ) { $claim_id = $this->generate_claim_id(); $this->claim_before_date = $before_date; $this->claim_actions( $claim_id, $max_actions, $before_date, $hooks, $group ); $action_ids = $this->find_actions_by_claim_id( $claim_id ); $this->claim_before_date = null; return new ActionScheduler_ActionClaim( $claim_id, $action_ids ); } /** * Generate a new action claim. * * @return int Claim ID. */ protected function generate_claim_id() { /** @var \wpdb $wpdb */ global $wpdb; $now = as_get_datetime_object(); $wpdb->insert( $wpdb->actionscheduler_claims, array( 'date_created_gmt' => $now->format( 'Y-m-d H:i:s' ) ) ); return $wpdb->insert_id; } /** * Set a claim filter. * * @param string $filter_name Claim filter name. * @param mixed $filter_values Values to filter. * @return void */ public function set_claim_filter( $filter_name, $filter_values ) { if ( isset( $this->claim_filters[ $filter_name ] ) ) { $this->claim_filters[ $filter_name ] = $filter_values; } } /** * Get the claim filter value. * * @param string $filter_name Claim filter name. * @return mixed */ public function get_claim_filter( $filter_name ) { if ( isset( $this->claim_filters[ $filter_name ] ) ) { return $this->claim_filters[ $filter_name ]; } return ''; } /** * Mark actions claimed. * * @param string $claim_id Claim Id. * @param int $limit Number of action to include in claim. * @param \DateTime $before_date Should use UTC timezone. * @param array $hooks Hooks to filter for. * @param string $group Group to filter for. * * @return int The number of actions that were claimed. * @throws \InvalidArgumentException Throws InvalidArgumentException if group doesn't exist. * @throws \RuntimeException Throws RuntimeException if unable to claim action. */ protected function claim_actions( $claim_id, $limit, \DateTime $before_date = null, $hooks = array(), $group = '' ) { /** @var \wpdb $wpdb */ global $wpdb; $now = as_get_datetime_object(); $date = is_null( $before_date ) ? $now : clone $before_date; // can't use $wpdb->update() because of the <= condition. $update = "UPDATE {$wpdb->actionscheduler_actions} SET claim_id=%d, last_attempt_gmt=%s, last_attempt_local=%s"; $params = array( $claim_id, $now->format( 'Y-m-d H:i:s' ), current_time( 'mysql' ), ); // Set claim filters. if ( ! empty( $hooks ) ) { $this->set_claim_filter( 'hooks', $hooks ); } else { $hooks = $this->get_claim_filter( 'hooks' ); } if ( ! empty( $group ) ) { $this->set_claim_filter( 'group', $group ); } else { $group = $this->get_claim_filter( 'group' ); } $where = 'WHERE claim_id = 0 AND scheduled_date_gmt <= %s AND status=%s'; $params[] = $date->format( 'Y-m-d H:i:s' ); $params[] = self::STATUS_PENDING; if ( ! empty( $hooks ) ) { $placeholders = array_fill( 0, count( $hooks ), '%s' ); $where .= ' AND hook IN (' . join( ', ', $placeholders ) . ')'; $params = array_merge( $params, array_values( $hooks ) ); } $group_operator = 'IN'; if ( empty( $group ) ) { $group = $this->get_claim_filter( 'exclude-groups' ); $group_operator = 'NOT IN'; } if ( ! empty( $group ) ) { $group_ids = $this->get_group_ids( $group, false ); // throw exception if no matching group(s) found, this matches ActionScheduler_wpPostStore's behaviour. if ( empty( $group_ids ) ) { throw new InvalidArgumentException( sprintf( /* translators: %s: group name(s) */ _n( 'The group "%s" does not exist.', 'The groups "%s" do not exist.', is_array( $group ) ? count( $group ) : 1, 'woocommerce' ), $group ) ); } $id_list = implode( ',', array_map( 'intval', $group_ids ) ); $where .= " AND group_id {$group_operator} ( $id_list )"; } /** * Sets the order-by clause used in the action claim query. * * @since 3.4.0 * * @param string $order_by_sql */ $order = apply_filters( 'action_scheduler_claim_actions_order_by', 'ORDER BY priority ASC, attempts ASC, scheduled_date_gmt ASC, action_id ASC' ); $params[] = $limit; $sql = $wpdb->prepare( "{$update} {$where} {$order} LIMIT %d", $params ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQLPlaceholders $rows_affected = $wpdb->query( $sql ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching if ( false === $rows_affected ) { $error = empty( $wpdb->last_error ) ? _x( 'unknown', 'database error', 'woocommerce' ) : $wpdb->last_error; throw new \RuntimeException( sprintf( /* translators: %s database error. */ __( 'Unable to claim actions. Database error: %s.', 'woocommerce' ), $error ) ); } return (int) $rows_affected; } /** * Get the number of active claims. * * @return int */ public function get_claim_count() { global $wpdb; $sql = "SELECT COUNT(DISTINCT claim_id) FROM {$wpdb->actionscheduler_actions} WHERE claim_id != 0 AND status IN ( %s, %s)"; $sql = $wpdb->prepare( $sql, array( self::STATUS_PENDING, self::STATUS_RUNNING ) ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared return (int) $wpdb->get_var( $sql ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared } /** * Return an action's claim ID, as stored in the claim_id column. * * @param string $action_id Action ID. * @return mixed */ public function get_claim_id( $action_id ) { /** @var \wpdb $wpdb */ global $wpdb; $sql = "SELECT claim_id FROM {$wpdb->actionscheduler_actions} WHERE action_id=%d"; $sql = $wpdb->prepare( $sql, $action_id ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared return (int) $wpdb->get_var( $sql ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared } /** * Retrieve the action IDs of action in a claim. * * @param int $claim_id Claim ID. * @return int[] */ public function find_actions_by_claim_id( $claim_id ) { /** @var \wpdb $wpdb */ global $wpdb; $action_ids = array(); $before_date = isset( $this->claim_before_date ) ? $this->claim_before_date : as_get_datetime_object(); $cut_off = $before_date->format( 'Y-m-d H:i:s' ); $sql = $wpdb->prepare( "SELECT action_id, scheduled_date_gmt FROM {$wpdb->actionscheduler_actions} WHERE claim_id = %d ORDER BY priority ASC, attempts ASC, scheduled_date_gmt ASC, action_id ASC", $claim_id ); // Verify that the scheduled date for each action is within the expected bounds (in some unusual // cases, we cannot depend on MySQL to honor all of the WHERE conditions we specify). foreach ( $wpdb->get_results( $sql ) as $claimed_action ) { // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared if ( $claimed_action->scheduled_date_gmt <= $cut_off ) { $action_ids[] = absint( $claimed_action->action_id ); } } return $action_ids; } /** * Release actions from a claim and delete the claim. * * @param ActionScheduler_ActionClaim $claim Claim object. */ public function release_claim( ActionScheduler_ActionClaim $claim ) { /** @var \wpdb $wpdb */ global $wpdb; /** * Deadlock warning: This function modifies actions to release them from claims that have been processed. Earlier, we used to it in a atomic query, i.e. we would update all actions belonging to a particular claim_id with claim_id = 0. * While this was functionally correct, it would cause deadlock, since this update query will hold a lock on the claim_id_.. index on the action table. * This allowed the possibility of a race condition, where the claimer query is also running at the same time, then the claimer query will also try to acquire a lock on the claim_id_.. index, and in this case if claim release query has already progressed to the point of acquiring the lock, but have not updated yet, it would cause a deadlock. * * We resolve this by getting all the actions_id that we want to release claim from in a separate query, and then releasing the claim on each of them. This way, our lock is acquired on the action_id index instead of the claim_id index. Note that the lock on claim_id will still be acquired, but it will only when we actually make the update, rather than when we select the actions. */ $action_ids = $wpdb->get_col( $wpdb->prepare( "SELECT action_id FROM {$wpdb->actionscheduler_actions} WHERE claim_id = %d", $claim->get_id() ) ); $row_updates = 0; if ( count( $action_ids ) > 0 ) { $action_id_string = implode( ',', array_map( 'absint', $action_ids ) ); $row_updates = $wpdb->query( "UPDATE {$wpdb->actionscheduler_actions} SET claim_id = 0 WHERE action_id IN ({$action_id_string})" ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared } $wpdb->delete( $wpdb->actionscheduler_claims, array( 'claim_id' => $claim->get_id() ), array( '%d' ) ); if ( $row_updates < count( $action_ids ) ) { throw new RuntimeException( sprintf( __( 'Unable to release actions from claim id %d.', 'woocommerce' ), $claim->get_id() ) ); } } /** * Remove the claim from an action. * * @param int $action_id Action ID. * * @return void */ public function unclaim_action( $action_id ) { /** @var \wpdb $wpdb */ global $wpdb; $wpdb->update( $wpdb->actionscheduler_actions, array( 'claim_id' => 0 ), array( 'action_id' => $action_id ), array( '%s' ), array( '%d' ) ); } /** * Mark an action as failed. * * @param int $action_id Action ID. * @throws \InvalidArgumentException Throw an exception if action was not updated. */ public function mark_failure( $action_id ) { /** @var \wpdb $wpdb */ global $wpdb; $updated = $wpdb->update( $wpdb->actionscheduler_actions, array( 'status' => self::STATUS_FAILED ), array( 'action_id' => $action_id ), array( '%s' ), array( '%d' ) ); if ( empty( $updated ) ) { throw new \InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'woocommerce' ), $action_id ) ); //phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment } } /** * Add execution message to action log. * * @throws Exception If the action status cannot be updated to self::STATUS_RUNNING ('in-progress'). * * @param int $action_id Action ID. * * @return void */ public function log_execution( $action_id ) { /** @var \wpdb $wpdb */ global $wpdb; $sql = "UPDATE {$wpdb->actionscheduler_actions} SET attempts = attempts+1, status=%s, last_attempt_gmt = %s, last_attempt_local = %s WHERE action_id = %d"; $sql = $wpdb->prepare( $sql, self::STATUS_RUNNING, current_time( 'mysql', true ), current_time( 'mysql' ), $action_id ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared $status_updated = $wpdb->query( $sql ); if ( ! $status_updated ) { throw new Exception( sprintf( /* translators: 1: action ID. 2: status slug. */ __( 'Unable to update the status of action %1$d to %2$s.', 'woocommerce' ), $action_id, self::STATUS_RUNNING ) ); } } /** * Mark an action as complete. * * @param int $action_id Action ID. * * @return void * @throws \InvalidArgumentException Throw an exception if action was not updated. */ public function mark_complete( $action_id ) { /** @var \wpdb $wpdb */ global $wpdb; $updated = $wpdb->update( $wpdb->actionscheduler_actions, array( 'status' => self::STATUS_COMPLETE, 'last_attempt_gmt' => current_time( 'mysql', true ), 'last_attempt_local' => current_time( 'mysql' ), ), array( 'action_id' => $action_id ), array( '%s' ), array( '%d' ) ); if ( empty( $updated ) ) { throw new \InvalidArgumentException( sprintf( __( 'Unidentified action %s', 'woocommerce' ), $action_id ) ); //phpcs:ignore WordPress.WP.I18n.MissingTranslatorsComment } /** * Fires after a scheduled action has been completed. * * @since 3.4.2 * * @param int $action_id Action ID. */ do_action( 'action_scheduler_completed_action', $action_id ); } /** * Get an action's status. * * @param int $action_id Action ID. * * @return string * @throws \InvalidArgumentException Throw an exception if not status was found for action_id. * @throws \RuntimeException Throw an exception if action status could not be retrieved. */ public function get_status( $action_id ) { /** @var \wpdb $wpdb */ global $wpdb; $sql = "SELECT status FROM {$wpdb->actionscheduler_actions} WHERE action_id=%d"; $sql = $wpdb->prepare( $sql, $action_id ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared $status = $wpdb->get_var( $sql ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared if ( null === $status ) { throw new \InvalidArgumentException( __( 'Invalid action ID. No status found.', 'woocommerce' ) ); } elseif ( empty( $status ) ) { throw new \RuntimeException( __( 'Unknown status found for action.', 'woocommerce' ) ); } else { return $status; } } } pro/libraries/action-scheduler/classes/migration/BatchFetcher.php000064400000003222147600337620021241 0ustar00store = $source_store; } /** * Retrieve a list of actions. * * @param int $count The number of actions to retrieve * * @return int[] A list of action IDs */ public function fetch( $count = 10 ) { foreach ( $this->get_query_strategies( $count ) as $query ) { $action_ids = $this->store->query_actions( $query ); if ( ! empty( $action_ids ) ) { return $action_ids; } } return []; } /** * Generate a list of prioritized of action search parameters. * * @param int $count Number of actions to find. * * @return array */ private function get_query_strategies( $count ) { $now = as_get_datetime_object(); $args = [ 'date' => $now, 'per_page' => $count, 'offset' => 0, 'orderby' => 'date', 'order' => 'ASC', ]; $priorities = [ Store::STATUS_PENDING, Store::STATUS_FAILED, Store::STATUS_CANCELED, Store::STATUS_COMPLETE, Store::STATUS_RUNNING, '', // any other unanticipated status ]; foreach ( $priorities as $status ) { yield wp_parse_args( [ 'status' => $status, 'date_compare' => '<=', ], $args ); yield wp_parse_args( [ 'status' => $status, 'date_compare' => '>=', ], $args ); } } }pro/libraries/action-scheduler/classes/migration/DryRun_ActionMigrator.php000064400000000741147600337620023147 0ustar00 $this->get_scheduled_date_string( $action, $last_attempt_date ), 'last_attempt_local' => $this->get_scheduled_date_string_local( $action, $last_attempt_date ), ]; $wpdb->update( $wpdb->actionscheduler_actions, $data, array( 'action_id' => $action_id ), array( '%s', '%s' ), array( '%d' ) ); } return $action_id; } catch ( \Exception $e ) { throw new \RuntimeException( sprintf( __( 'Error saving action: %s', 'woocommerce' ), $e->getMessage() ), 0 ); } } } pro/libraries/action-scheduler/classes/migration/Config.php000064400000006747147600337620020143 0ustar00source_store ) ) { throw new \RuntimeException( __( 'Source store must be configured before running a migration', 'woocommerce' ) ); } return $this->source_store; } /** * Set the configured source store. * * @param ActionScheduler_Store $store Source store object. */ public function set_source_store( Store $store ) { $this->source_store = $store; } /** * Get the configured source loger. * * @return ActionScheduler_Logger */ public function get_source_logger() { if ( empty( $this->source_logger ) ) { throw new \RuntimeException( __( 'Source logger must be configured before running a migration', 'woocommerce' ) ); } return $this->source_logger; } /** * Set the configured source logger. * * @param ActionScheduler_Logger $logger */ public function set_source_logger( Logger $logger ) { $this->source_logger = $logger; } /** * Get the configured destination store. * * @return ActionScheduler_Store */ public function get_destination_store() { if ( empty( $this->destination_store ) ) { throw new \RuntimeException( __( 'Destination store must be configured before running a migration', 'woocommerce' ) ); } return $this->destination_store; } /** * Set the configured destination store. * * @param ActionScheduler_Store $store */ public function set_destination_store( Store $store ) { $this->destination_store = $store; } /** * Get the configured destination logger. * * @return ActionScheduler_Logger */ public function get_destination_logger() { if ( empty( $this->destination_logger ) ) { throw new \RuntimeException( __( 'Destination logger must be configured before running a migration', 'woocommerce' ) ); } return $this->destination_logger; } /** * Set the configured destination logger. * * @param ActionScheduler_Logger $logger */ public function set_destination_logger( Logger $logger ) { $this->destination_logger = $logger; } /** * Get flag indicating whether it's a dry run. * * @return bool */ public function get_dry_run() { return $this->dry_run; } /** * Set flag indicating whether it's a dry run. * * @param bool $dry_run */ public function set_dry_run( $dry_run ) { $this->dry_run = (bool) $dry_run; } /** * Get progress bar object. * * @return ActionScheduler\WPCLI\ProgressBar */ public function get_progress_bar() { return $this->progress_bar; } /** * Set progress bar object. * * @param ActionScheduler\WPCLI\ProgressBar $progress_bar */ public function set_progress_bar( ProgressBar $progress_bar ) { $this->progress_bar = $progress_bar; } } pro/libraries/action-scheduler/classes/migration/LogMigrator.php000064400000002272147600337620021151 0ustar00source = $source_logger; $this->destination = $destination_Logger; } /** * Migrate an action log. * * @param int $source_action_id Source logger object. * @param int $destination_action_id Destination logger object. */ public function migrate( $source_action_id, $destination_action_id ) { $logs = $this->source->get_logs( $source_action_id ); foreach ( $logs as $log ) { if ( $log->get_action_id() == $source_action_id ) { $this->destination->log( $destination_action_id, $log->get_message(), $log->get_date() ); } } } } pro/libraries/action-scheduler/classes/migration/ActionMigrator.php000064400000007060147600337620021645 0ustar00source = $source_store; $this->destination = $destination_store; $this->log_migrator = $log_migrator; } /** * Migrate an action. * * @param int $source_action_id Action ID. * * @return int 0|new action ID */ public function migrate( $source_action_id ) { try { $action = $this->source->fetch_action( $source_action_id ); $status = $this->source->get_status( $source_action_id ); } catch ( \Exception $e ) { $action = null; $status = ''; } if ( is_null( $action ) || empty( $status ) || ! $action->get_schedule()->get_date() ) { // null action or empty status means the fetch operation failed or the action didn't exist // null schedule means it's missing vital data // delete it and move on try { $this->source->delete_action( $source_action_id ); } catch ( \Exception $e ) { // nothing to do, it didn't exist in the first place } do_action( 'action_scheduler/no_action_to_migrate', $source_action_id, $this->source, $this->destination ); return 0; } try { // Make sure the last attempt date is set correctly for completed and failed actions $last_attempt_date = ( $status !== \ActionScheduler_Store::STATUS_PENDING ) ? $this->source->get_date( $source_action_id ) : null; $destination_action_id = $this->destination->save_action( $action, null, $last_attempt_date ); } catch ( \Exception $e ) { do_action( 'action_scheduler/migrate_action_failed', $source_action_id, $this->source, $this->destination ); return 0; // could not save the action in the new store } try { switch ( $status ) { case \ActionScheduler_Store::STATUS_FAILED : $this->destination->mark_failure( $destination_action_id ); break; case \ActionScheduler_Store::STATUS_CANCELED : $this->destination->cancel_action( $destination_action_id ); break; } $this->log_migrator->migrate( $source_action_id, $destination_action_id ); $this->source->delete_action( $source_action_id ); $test_action = $this->source->fetch_action( $source_action_id ); if ( ! is_a( $test_action, 'ActionScheduler_NullAction' ) ) { throw new \RuntimeException( sprintf( __( 'Unable to remove source migrated action %s', 'woocommerce' ), $source_action_id ) ); } do_action( 'action_scheduler/migrated_action', $source_action_id, $destination_action_id, $this->source, $this->destination ); return $destination_action_id; } catch ( \Exception $e ) { // could not delete from the old store $this->source->mark_migrated( $source_action_id ); do_action( 'action_scheduler/migrate_action_incomplete', $source_action_id, $destination_action_id, $this->source, $this->destination ); do_action( 'action_scheduler/migrated_action', $source_action_id, $destination_action_id, $this->source, $this->destination ); return $destination_action_id; } } } pro/libraries/action-scheduler/classes/migration/Scheduler.php000064400000005542147600337620020644 0ustar00get_migration_runner(); $count = $migration_runner->run( $this->get_batch_size() ); if ( $count === 0 ) { $this->mark_complete(); } else { $this->schedule_migration( time() + $this->get_schedule_interval() ); } } /** * Mark the migration complete. */ public function mark_complete() { $this->unschedule_migration(); \ActionScheduler_DataController::mark_migration_complete(); do_action( 'action_scheduler/migration_complete' ); } /** * Get a flag indicating whether the migration is scheduled. * * @return bool Whether there is a pending action in the store to handle the migration */ public function is_migration_scheduled() { $next = as_next_scheduled_action( self::HOOK ); return ! empty( $next ); } /** * Schedule the migration. * * @param int $when Optional timestamp to run the next migration batch. Defaults to now. * * @return string The action ID */ public function schedule_migration( $when = 0 ) { $next = as_next_scheduled_action( self::HOOK ); if ( ! empty( $next ) ) { return $next; } if ( empty( $when ) ) { $when = time() + MINUTE_IN_SECONDS; } return as_schedule_single_action( $when, self::HOOK, array(), self::GROUP ); } /** * Remove the scheduled migration action. */ public function unschedule_migration() { as_unschedule_action( self::HOOK, null, self::GROUP ); } /** * Get migration batch schedule interval. * * @return int Seconds between migration runs. Defaults to 0 seconds to allow chaining migration via Async Runners. */ private function get_schedule_interval() { return (int) apply_filters( 'action_scheduler/migration_interval', 0 ); } /** * Get migration batch size. * * @return int Number of actions to migrate in each batch. Defaults to 250. */ private function get_batch_size() { return (int) apply_filters( 'action_scheduler/migration_batch_size', 250 ); } /** * Get migration runner object. * * @return Runner */ private function get_migration_runner() { $config = Controller::instance()->get_migration_config_object(); return new Runner( $config ); } } pro/libraries/action-scheduler/classes/migration/DryRun_LogMigrator.php000064400000000711147600337620022450 0ustar00migration_scheduler = $migration_scheduler; $this->store_classname = ''; } /** * Set the action store class name. * * @param string $class Classname of the store class. * * @return string */ public function get_store_class( $class ) { if ( \ActionScheduler_DataController::is_migration_complete() ) { return \ActionScheduler_DataController::DATASTORE_CLASS; } elseif ( \ActionScheduler_Store::DEFAULT_CLASS !== $class ) { $this->store_classname = $class; return $class; } else { return 'ActionScheduler_HybridStore'; } } /** * Set the action logger class name. * * @param string $class Classname of the logger class. * * @return string */ public function get_logger_class( $class ) { \ActionScheduler_Store::instance(); if ( $this->has_custom_datastore() ) { $this->logger_classname = $class; return $class; } else { return \ActionScheduler_DataController::LOGGER_CLASS; } } /** * Get flag indicating whether a custom datastore is in use. * * @return bool */ public function has_custom_datastore() { return (bool) $this->store_classname; } /** * Set up the background migration process. * * @return void */ public function schedule_migration() { $logging_tables = new ActionScheduler_LoggerSchema(); $store_tables = new ActionScheduler_StoreSchema(); /* * In some unusual cases, the expected tables may not have been created. In such cases * we do not schedule a migration as doing so will lead to fatal error conditions. * * In such cases the user will likely visit the Tools > Scheduled Actions screen to * investigate, and will see appropriate messaging (this step also triggers an attempt * to rebuild any missing tables). * * @see https://github.com/woocommerce/action-scheduler/issues/653 */ if ( ActionScheduler_DataController::is_migration_complete() || $this->migration_scheduler->is_migration_scheduled() || ! $store_tables->tables_exist() || ! $logging_tables->tables_exist() ) { return; } $this->migration_scheduler->schedule_migration(); } /** * Get the default migration config object * * @return ActionScheduler\Migration\Config */ public function get_migration_config_object() { static $config = null; if ( ! $config ) { $source_store = $this->store_classname ? new $this->store_classname() : new \ActionScheduler_wpPostStore(); $source_logger = $this->logger_classname ? new $this->logger_classname() : new \ActionScheduler_wpCommentLogger(); $config = new Config(); $config->set_source_store( $source_store ); $config->set_source_logger( $source_logger ); $config->set_destination_store( new \ActionScheduler_DBStoreMigrator() ); $config->set_destination_logger( new \ActionScheduler_DBLogger() ); if ( defined( 'WP_CLI' ) && WP_CLI ) { $config->set_progress_bar( new ProgressBar( '', 0 ) ); } } return apply_filters( 'action_scheduler/migration_config', $config ); } /** * Hook dashboard migration notice. */ public function hook_admin_notices() { if ( ! $this->allow_migration() || \ActionScheduler_DataController::is_migration_complete() ) { return; } add_action( 'admin_notices', array( $this, 'display_migration_notice' ), 10, 0 ); } /** * Show a dashboard notice that migration is in progress. */ public function display_migration_notice() { printf( '

            %s

            ', esc_html__( 'Action Scheduler migration in progress. The list of scheduled actions may be incomplete.', 'woocommerce' ) ); } /** * Add store classes. Hook migration. */ private function hook() { add_filter( 'action_scheduler_store_class', array( $this, 'get_store_class' ), 100, 1 ); add_filter( 'action_scheduler_logger_class', array( $this, 'get_logger_class' ), 100, 1 ); add_action( 'init', array( $this, 'maybe_hook_migration' ) ); add_action( 'wp_loaded', array( $this, 'schedule_migration' ) ); // Action Scheduler may be displayed as a Tools screen or WooCommerce > Status administration screen add_action( 'load-tools_page_action-scheduler', array( $this, 'hook_admin_notices' ), 10, 0 ); add_action( 'load-woocommerce_page_wc-status', array( $this, 'hook_admin_notices' ), 10, 0 ); } /** * Possibly hook the migration scheduler action. * * @author Jeremy Pry */ public function maybe_hook_migration() { if ( ! $this->allow_migration() || \ActionScheduler_DataController::is_migration_complete() ) { return; } $this->migration_scheduler->hook(); } /** * Allow datastores to enable migration to AS tables. */ public function allow_migration() { if ( ! \ActionScheduler_DataController::dependencies_met() ) { return false; } if ( null === $this->migrate_custom_store ) { $this->migrate_custom_store = apply_filters( 'action_scheduler_migrate_data_store', false ); } return ( ! $this->has_custom_datastore() ) || $this->migrate_custom_store; } /** * Proceed with the migration if the dependencies have been met. */ public static function init() { if ( \ActionScheduler_DataController::dependencies_met() ) { self::instance()->hook(); } } /** * Singleton factory. */ public static function instance() { if ( ! isset( self::$instance ) ) { self::$instance = new static( new Scheduler() ); } return self::$instance; } } pro/libraries/action-scheduler/classes/migration/Runner.php000064400000007216147600337620020177 0ustar00source_store = $config->get_source_store(); $this->destination_store = $config->get_destination_store(); $this->source_logger = $config->get_source_logger(); $this->destination_logger = $config->get_destination_logger(); $this->batch_fetcher = new BatchFetcher( $this->source_store ); if ( $config->get_dry_run() ) { $this->log_migrator = new DryRun_LogMigrator( $this->source_logger, $this->destination_logger ); $this->action_migrator = new DryRun_ActionMigrator( $this->source_store, $this->destination_store, $this->log_migrator ); } else { $this->log_migrator = new LogMigrator( $this->source_logger, $this->destination_logger ); $this->action_migrator = new ActionMigrator( $this->source_store, $this->destination_store, $this->log_migrator ); } if ( defined( 'WP_CLI' ) && WP_CLI ) { $this->progress_bar = $config->get_progress_bar(); } } /** * Run migration batch. * * @param int $batch_size Optional batch size. Default 10. * * @return int Size of batch processed. */ public function run( $batch_size = 10 ) { $batch = $this->batch_fetcher->fetch( $batch_size ); $batch_size = count( $batch ); if ( ! $batch_size ) { return 0; } if ( $this->progress_bar ) { /* translators: %d: amount of actions */ $this->progress_bar->set_message( sprintf( _n( 'Migrating %d action', 'Migrating %d actions', $batch_size, 'woocommerce' ), $batch_size ) ); $this->progress_bar->set_count( $batch_size ); } $this->migrate_actions( $batch ); return $batch_size; } /** * Migration a batch of actions. * * @param array $action_ids List of action IDs to migrate. */ public function migrate_actions( array $action_ids ) { do_action( 'action_scheduler/migration_batch_starting', $action_ids ); \ActionScheduler::logger()->unhook_stored_action(); $this->destination_logger->unhook_stored_action(); foreach ( $action_ids as $source_action_id ) { $destination_action_id = $this->action_migrator->migrate( $source_action_id ); if ( $destination_action_id ) { $this->destination_logger->log( $destination_action_id, sprintf( /* translators: 1: source action ID 2: source store class 3: destination action ID 4: destination store class */ __( 'Migrated action with ID %1$d in %2$s to ID %3$d in %4$s', 'woocommerce' ), $source_action_id, get_class( $this->source_store ), $destination_action_id, get_class( $this->destination_store ) ) ); } if ( $this->progress_bar ) { $this->progress_bar->tick(); } } if ( $this->progress_bar ) { $this->progress_bar->finish(); } \ActionScheduler::logger()->hook_stored_action(); do_action( 'action_scheduler/migration_batch_complete', $action_ids ); } /** * Initialize destination store and logger. */ public function init_destination() { $this->destination_store->init(); $this->destination_logger->init(); } } pro/libraries/action-scheduler/classes/schedules/ActionScheduler_NullSchedule.php000064400000001177147600337620024437 0ustar00scheduled_date = null; } /** * This schedule has no scheduled DateTime, so we need to override the parent __sleep() * @return array */ public function __sleep() { return array(); } public function __wakeup() { $this->scheduled_date = null; } } pro/libraries/action-scheduler/classes/schedules/ActionScheduler_IntervalSchedule.php000064400000004752147600337620025313 0ustar00__wakeup() for details. **/ private $start_timestamp = NULL; /** * Deprecated property @see $this->__wakeup() for details. **/ private $interval_in_seconds = NULL; /** * Calculate when this schedule should start after a given date & time using * the number of seconds between recurrences. * * @param DateTime $after * @return DateTime */ protected function calculate_next( DateTime $after ) { $after->modify( '+' . (int) $this->get_recurrence() . ' seconds' ); return $after; } /** * @return int */ public function interval_in_seconds() { _deprecated_function( __METHOD__, '3.0.0', '(int)ActionScheduler_Abstract_RecurringSchedule::get_recurrence()' ); return (int) $this->get_recurrence(); } /** * Serialize interval schedules with data required prior to AS 3.0.0 * * Prior to Action Scheduler 3.0.0, reccuring schedules used different property names to * refer to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 * aligned properties and property names for better inheritance. To guard against the * possibility of infinite loops if downgrading to Action Scheduler < 3.0.0, we need to * also store the data with the old property names so if it's unserialized in AS < 3.0, * the schedule doesn't end up with a null/false/0 recurrence. * * @return array */ public function __sleep() { $sleep_params = parent::__sleep(); $this->start_timestamp = $this->scheduled_timestamp; $this->interval_in_seconds = $this->recurrence; return array_merge( $sleep_params, array( 'start_timestamp', 'interval_in_seconds' ) ); } /** * Unserialize interval schedules serialized/stored prior to AS 3.0.0 * * For more background, @see ActionScheduler_Abstract_RecurringSchedule::__wakeup(). */ public function __wakeup() { if ( is_null( $this->scheduled_timestamp ) && ! is_null( $this->start_timestamp ) ) { $this->scheduled_timestamp = $this->start_timestamp; unset( $this->start_timestamp ); } if ( is_null( $this->recurrence ) && ! is_null( $this->interval_in_seconds ) ) { $this->recurrence = $this->interval_in_seconds; unset( $this->interval_in_seconds ); } parent::__wakeup(); } } pro/libraries/action-scheduler/classes/schedules/ActionScheduler_CronSchedule.php000064400000007201147600337620024420 0ustar00__wakeup() for details. **/ private $start_timestamp = NULL; /** * Deprecated property @see $this->__wakeup() for details. **/ private $cron = NULL; /** * Wrapper for parent constructor to accept a cron expression string and map it to a CronExpression for this * objects $recurrence property. * * @param DateTime $start The date & time to run the action at or after. If $start aligns with the CronSchedule passed via $recurrence, it will be used. If it does not align, the first matching date after it will be used. * @param CronExpression|string $recurrence The CronExpression used to calculate the schedule's next instance. * @param DateTime|null $first (Optional) The date & time the first instance of this interval schedule ran. Default null, meaning this is the first instance. */ public function __construct( DateTime $start, $recurrence, DateTime $first = null ) { if ( ! is_a( $recurrence, 'CronExpression' ) ) { $recurrence = CronExpression::factory( $recurrence ); } // For backward compatibility, we need to make sure the date is set to the first matching cron date, not whatever date is passed in. Importantly, by passing true as the 3rd param, if $start matches the cron expression, then it will be used. This was previously handled in the now deprecated next() method. $date = $recurrence->getNextRunDate( $start, 0, true ); // parent::__construct() will set this to $date by default, but that may be different to $start now. $first = empty( $first ) ? $start : $first; parent::__construct( $date, $recurrence, $first ); } /** * Calculate when an instance of this schedule would start based on a given * date & time using its the CronExpression. * * @param DateTime $after * @return DateTime */ protected function calculate_next( DateTime $after ) { return $this->recurrence->getNextRunDate( $after, 0, false ); } /** * @return string */ public function get_recurrence() { return strval( $this->recurrence ); } /** * Serialize cron schedules with data required prior to AS 3.0.0 * * Prior to Action Scheduler 3.0.0, reccuring schedules used different property names to * refer to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 * aligned properties and property names for better inheritance. To guard against the * possibility of infinite loops if downgrading to Action Scheduler < 3.0.0, we need to * also store the data with the old property names so if it's unserialized in AS < 3.0, * the schedule doesn't end up with a null recurrence. * * @return array */ public function __sleep() { $sleep_params = parent::__sleep(); $this->start_timestamp = $this->scheduled_timestamp; $this->cron = $this->recurrence; return array_merge( $sleep_params, array( 'start_timestamp', 'cron' ) ); } /** * Unserialize cron schedules serialized/stored prior to AS 3.0.0 * * For more background, @see ActionScheduler_Abstract_RecurringSchedule::__wakeup(). */ public function __wakeup() { if ( is_null( $this->scheduled_timestamp ) && ! is_null( $this->start_timestamp ) ) { $this->scheduled_timestamp = $this->start_timestamp; unset( $this->start_timestamp ); } if ( is_null( $this->recurrence ) && ! is_null( $this->cron ) ) { $this->recurrence = $this->cron; unset( $this->cron ); } parent::__wakeup(); } } pro/libraries/action-scheduler/classes/schedules/ActionScheduler_SimpleSchedule.php000064400000004154147600337620024754 0ustar00__wakeup() for details. **/ private $timestamp = NULL; /** * @param DateTime $after * * @return DateTime|null */ public function calculate_next( DateTime $after ) { return null; } /** * @return bool */ public function is_recurring() { return false; } /** * Serialize schedule with data required prior to AS 3.0.0 * * Prior to Action Scheduler 3.0.0, schedules used different property names to refer * to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 * aligned properties and property names for better inheritance. To guard against the * scheduled date for single actions always being seen as "now" if downgrading to * Action Scheduler < 3.0.0, we need to also store the data with the old property names * so if it's unserialized in AS < 3.0, the schedule doesn't end up with a null recurrence. * * @return array */ public function __sleep() { $sleep_params = parent::__sleep(); $this->timestamp = $this->scheduled_timestamp; return array_merge( $sleep_params, array( 'timestamp', ) ); } /** * Unserialize recurring schedules serialized/stored prior to AS 3.0.0 * * Prior to Action Scheduler 3.0.0, schedules used different property names to refer * to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 * aligned properties and property names for better inheritance. To maintain backward * compatibility with schedules serialized and stored prior to 3.0, we need to correctly * map the old property names with matching visibility. */ public function __wakeup() { if ( is_null( $this->scheduled_timestamp ) && ! is_null( $this->timestamp ) ) { $this->scheduled_timestamp = $this->timestamp; unset( $this->timestamp ); } parent::__wakeup(); } } pro/libraries/action-scheduler/classes/schedules/ActionScheduler_CanceledSchedule.php000064400000002705147600337620025221 0ustar00__wakeup() for details. **/ private $timestamp = NULL; /** * @param DateTime $after * * @return DateTime|null */ public function calculate_next( DateTime $after ) { return null; } /** * Cancelled actions should never have a next schedule, even if get_next() * is called with $after < $this->scheduled_date. * * @param DateTime $after * @return DateTime|null */ public function get_next( DateTime $after ) { return null; } /** * @return bool */ public function is_recurring() { return false; } /** * Unserialize recurring schedules serialized/stored prior to AS 3.0.0 * * Prior to Action Scheduler 3.0.0, schedules used different property names to refer * to equivalent data. For example, ActionScheduler_IntervalSchedule::start_timestamp * was the same as ActionScheduler_SimpleSchedule::timestamp. Action Scheduler 3.0.0 * aligned properties and property names for better inheritance. To maintain backward * compatibility with schedules serialized and stored prior to 3.0, we need to correctly * map the old property names with matching visibility. */ public function __wakeup() { if ( ! is_null( $this->timestamp ) ) { $this->scheduled_timestamp = $this->timestamp; unset( $this->timestamp ); } parent::__wakeup(); } } pro/libraries/action-scheduler/classes/schedules/ActionScheduler_Schedule.php000064400000000406147600337620023576 0ustar00tables = [ self::ACTIONS_TABLE, self::CLAIMS_TABLE, self::GROUPS_TABLE, ]; } /** * Performs additional setup work required to support this schema. */ public function init() { add_action( 'action_scheduler_before_schema_update', array( $this, 'update_schema_5_0' ), 10, 2 ); } protected function get_table_definition( $table ) { global $wpdb; $table_name = $wpdb->$table; $charset_collate = $wpdb->get_charset_collate(); $max_index_length = 191; // @see wp_get_db_schema() $default_date = self::DEFAULT_DATE; switch ( $table ) { case self::ACTIONS_TABLE: return "CREATE TABLE {$table_name} ( action_id bigint(20) unsigned NOT NULL auto_increment, hook varchar(191) NOT NULL, status varchar(20) NOT NULL, scheduled_date_gmt datetime NULL default '{$default_date}', scheduled_date_local datetime NULL default '{$default_date}', priority tinyint unsigned NOT NULL default '10', args varchar($max_index_length), schedule longtext, group_id bigint(20) unsigned NOT NULL default '0', attempts int(11) NOT NULL default '0', last_attempt_gmt datetime NULL default '{$default_date}', last_attempt_local datetime NULL default '{$default_date}', claim_id bigint(20) unsigned NOT NULL default '0', extended_args varchar(8000) DEFAULT NULL, PRIMARY KEY (action_id), KEY hook (hook($max_index_length)), KEY status (status), KEY scheduled_date_gmt (scheduled_date_gmt), KEY args (args($max_index_length)), KEY group_id (group_id), KEY last_attempt_gmt (last_attempt_gmt), KEY `claim_id_status_scheduled_date_gmt` (`claim_id`, `status`, `scheduled_date_gmt`) ) $charset_collate"; case self::CLAIMS_TABLE: return "CREATE TABLE {$table_name} ( claim_id bigint(20) unsigned NOT NULL auto_increment, date_created_gmt datetime NULL default '{$default_date}', PRIMARY KEY (claim_id), KEY date_created_gmt (date_created_gmt) ) $charset_collate"; case self::GROUPS_TABLE: return "CREATE TABLE {$table_name} ( group_id bigint(20) unsigned NOT NULL auto_increment, slug varchar(255) NOT NULL, PRIMARY KEY (group_id), KEY slug (slug($max_index_length)) ) $charset_collate"; default: return ''; } } /** * Update the actions table schema, allowing datetime fields to be NULL. * * This is needed because the NOT NULL constraint causes a conflict with some versions of MySQL * configured with sql_mode=NO_ZERO_DATE, which can for instance lead to tables not being created. * * Most other schema updates happen via ActionScheduler_Abstract_Schema::update_table(), however * that method relies on dbDelta() and this change is not possible when using that function. * * @param string $table Name of table being updated. * @param string $db_version The existing schema version of the table. */ public function update_schema_5_0( $table, $db_version ) { global $wpdb; if ( 'actionscheduler_actions' !== $table || version_compare( $db_version, '5', '>=' ) ) { return; } // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared $table_name = $wpdb->prefix . 'actionscheduler_actions'; $table_list = $wpdb->get_col( "SHOW TABLES LIKE '{$table_name}'" ); $default_date = self::DEFAULT_DATE; if ( ! empty( $table_list ) ) { $query = " ALTER TABLE {$table_name} MODIFY COLUMN scheduled_date_gmt datetime NULL default '{$default_date}', MODIFY COLUMN scheduled_date_local datetime NULL default '{$default_date}', MODIFY COLUMN last_attempt_gmt datetime NULL default '{$default_date}', MODIFY COLUMN last_attempt_local datetime NULL default '{$default_date}' "; $wpdb->query( $query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared } // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared } } pro/libraries/action-scheduler/classes/schema/ActionScheduler_LoggerSchema.php000064400000005462147600337620023672 0ustar00tables = [ self::LOG_TABLE, ]; } /** * Performs additional setup work required to support this schema. */ public function init() { add_action( 'action_scheduler_before_schema_update', array( $this, 'update_schema_3_0' ), 10, 2 ); } protected function get_table_definition( $table ) { global $wpdb; $table_name = $wpdb->$table; $charset_collate = $wpdb->get_charset_collate(); switch ( $table ) { case self::LOG_TABLE: $default_date = ActionScheduler_StoreSchema::DEFAULT_DATE; return "CREATE TABLE $table_name ( log_id bigint(20) unsigned NOT NULL auto_increment, action_id bigint(20) unsigned NOT NULL, message text NOT NULL, log_date_gmt datetime NULL default '{$default_date}', log_date_local datetime NULL default '{$default_date}', PRIMARY KEY (log_id), KEY action_id (action_id), KEY log_date_gmt (log_date_gmt) ) $charset_collate"; default: return ''; } } /** * Update the logs table schema, allowing datetime fields to be NULL. * * This is needed because the NOT NULL constraint causes a conflict with some versions of MySQL * configured with sql_mode=NO_ZERO_DATE, which can for instance lead to tables not being created. * * Most other schema updates happen via ActionScheduler_Abstract_Schema::update_table(), however * that method relies on dbDelta() and this change is not possible when using that function. * * @param string $table Name of table being updated. * @param string $db_version The existing schema version of the table. */ public function update_schema_3_0( $table, $db_version ) { global $wpdb; if ( 'actionscheduler_logs' !== $table || version_compare( $db_version, '3', '>=' ) ) { return; } // phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared $table_name = $wpdb->prefix . 'actionscheduler_logs'; $table_list = $wpdb->get_col( "SHOW TABLES LIKE '{$table_name}'" ); $default_date = ActionScheduler_StoreSchema::DEFAULT_DATE; if ( ! empty( $table_list ) ) { $query = " ALTER TABLE {$table_name} MODIFY COLUMN log_date_gmt datetime NULL default '{$default_date}', MODIFY COLUMN log_date_local datetime NULL default '{$default_date}' "; $wpdb->query( $query ); // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared } // phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared } } pro/libraries/action-scheduler/classes/ActionScheduler_WPCommentCleaner.php000064400000010456147600337620023234 0ustar00 Status administration screen add_action( 'load-tools_page_action-scheduler', array( __CLASS__, 'register_admin_notice' ) ); add_action( 'load-woocommerce_page_wc-status', array( __CLASS__, 'register_admin_notice' ) ); } /** * Determines if there are log entries in the wp comments table. * * Uses the flag set on migration completion set by @see self::maybe_schedule_cleanup(). * * @return boolean Whether there are scheduled action comments in the comments table. */ public static function has_logs() { return 'yes' === get_option( self::$has_logs_option_key ); } /** * Schedules the WP Post comment table cleanup to run in 6 months if it's not already scheduled. * Attached to the migration complete hook 'action_scheduler/migration_complete'. */ public static function maybe_schedule_cleanup() { if ( (bool) get_comments( array( 'type' => ActionScheduler_wpCommentLogger::TYPE, 'number' => 1, 'fields' => 'ids' ) ) ) { update_option( self::$has_logs_option_key, 'yes' ); if ( ! as_next_scheduled_action( self::$cleanup_hook ) ) { as_schedule_single_action( gmdate( 'U' ) + ( 6 * MONTH_IN_SECONDS ), self::$cleanup_hook ); } } } /** * Delete all action comments from the WP Comments table. */ public static function delete_all_action_comments() { global $wpdb; $wpdb->delete( $wpdb->comments, array( 'comment_type' => ActionScheduler_wpCommentLogger::TYPE, 'comment_agent' => ActionScheduler_wpCommentLogger::AGENT ) ); delete_option( self::$has_logs_option_key ); } /** * Registers admin notices about the orphaned action logs. */ public static function register_admin_notice() { add_action( 'admin_notices', array( __CLASS__, 'print_admin_notice' ) ); } /** * Prints details about the orphaned action logs and includes information on where to learn more. */ public static function print_admin_notice() { $next_cleanup_message = ''; $next_scheduled_cleanup_hook = as_next_scheduled_action( self::$cleanup_hook ); if ( $next_scheduled_cleanup_hook ) { /* translators: %s: date interval */ $next_cleanup_message = sprintf( __( 'This data will be deleted in %s.', 'woocommerce' ), human_time_diff( gmdate( 'U' ), $next_scheduled_cleanup_hook ) ); } $notice = sprintf( /* translators: 1: next cleanup message 2: github issue URL */ __( 'Action Scheduler has migrated data to custom tables; however, orphaned log entries exist in the WordPress Comments table. %1$s Learn more »', 'woocommerce' ), $next_cleanup_message, 'https://github.com/woocommerce/action-scheduler/issues/368' ); echo '

            ' . wp_kses_post( $notice ) . '

            '; } } pro/libraries/action-scheduler/classes/ActionScheduler_Compatibility.php000064400000007144147600337620022702 0ustar00 $wp_max_limit_int && $filtered_limit_int > $current_limit_int ) ) { if ( false !== @ini_set( 'memory_limit', $filtered_limit ) ) { return $filtered_limit; } else { return false; } } elseif ( -1 === $wp_max_limit_int || $wp_max_limit_int > $current_limit_int ) { if ( false !== @ini_set( 'memory_limit', $wp_max_limit ) ) { return $wp_max_limit; } else { return false; } } return false; } /** * Attempts to raise the PHP timeout for time intensive processes. * * Only allows raising the existing limit and prevents lowering it. Wrapper for wc_set_time_limit(), when available. * * @param int $limit The time limit in seconds. */ public static function raise_time_limit( $limit = 0 ) { $limit = (int) $limit; $max_execution_time = (int) ini_get( 'max_execution_time' ); // If the max execution time is already set to zero (unlimited), there is no reason to make a further change. if ( 0 === $max_execution_time ) { return; } // Whichever of $max_execution_time or $limit is higher is the amount by which we raise the time limit. $raise_by = 0 === $limit || $limit > $max_execution_time ? $limit : $max_execution_time; if ( function_exists( 'wc_set_time_limit' ) ) { wc_set_time_limit( $raise_by ); } elseif ( function_exists( 'set_time_limit' ) && false === strpos( ini_get( 'disable_functions' ), 'set_time_limit' ) && ! ini_get( 'safe_mode' ) ) { // phpcs:ignore PHPCompatibility.IniDirectives.RemovedIniDirectives.safe_modeDeprecatedRemoved @set_time_limit( $raise_by ); // phpcs:ignore WordPress.PHP.NoSilencedErrors.Discouraged } } } pro/libraries/action-scheduler/classes/ActionScheduler_QueueCleaner.php000064400000017327147600337620022453 0ustar00store = $store ? $store : ActionScheduler_Store::instance(); $this->batch_size = $batch_size; } /** * Default queue cleaner process used by queue runner. * * @return array */ public function delete_old_actions() { /** * Filter the minimum scheduled date age for action deletion. * * @param int $retention_period Minimum scheduled age in seconds of the actions to be deleted. */ $lifespan = apply_filters( 'action_scheduler_retention_period', $this->month_in_seconds ); try { $cutoff = as_get_datetime_object( $lifespan . ' seconds ago' ); } catch ( Exception $e ) { _doing_it_wrong( __METHOD__, sprintf( /* Translators: %s is the exception message. */ esc_html__( 'It was not possible to determine a valid cut-off time: %s.', 'woocommerce' ), esc_html( $e->getMessage() ) ), '3.5.5' ); return array(); } /** * Filter the statuses when cleaning the queue. * * @param string[] $default_statuses_to_purge Action statuses to clean. */ $statuses_to_purge = (array) apply_filters( 'action_scheduler_default_cleaner_statuses', $this->default_statuses_to_purge ); return $this->clean_actions( $statuses_to_purge, $cutoff, $this->get_batch_size() ); } /** * Delete selected actions limited by status and date. * * @param string[] $statuses_to_purge List of action statuses to purge. Defaults to canceled, complete. * @param DateTime $cutoff_date Date limit for selecting actions. Defaults to 31 days ago. * @param int|null $batch_size Maximum number of actions per status to delete. Defaults to 20. * @param string $context Calling process context. Defaults to `old`. * @return array Actions deleted. */ public function clean_actions( array $statuses_to_purge, DateTime $cutoff_date, $batch_size = null, $context = 'old' ) { $batch_size = $batch_size !== null ? $batch_size : $this->batch_size; $cutoff = $cutoff_date !== null ? $cutoff_date : as_get_datetime_object( $this->month_in_seconds . ' seconds ago' ); $lifespan = time() - $cutoff->getTimestamp(); if ( empty( $statuses_to_purge ) ) { $statuses_to_purge = $this->default_statuses_to_purge; } $deleted_actions = []; foreach ( $statuses_to_purge as $status ) { $actions_to_delete = $this->store->query_actions( array( 'status' => $status, 'modified' => $cutoff, 'modified_compare' => '<=', 'per_page' => $batch_size, 'orderby' => 'none', ) ); $deleted_actions = array_merge( $deleted_actions, $this->delete_actions( $actions_to_delete, $lifespan, $context ) ); } return $deleted_actions; } /** * @param int[] $actions_to_delete List of action IDs to delete. * @param int $lifespan Minimum scheduled age in seconds of the actions being deleted. * @param string $context Context of the delete request. * @return array Deleted action IDs. */ private function delete_actions( array $actions_to_delete, $lifespan = null, $context = 'old' ) { $deleted_actions = []; if ( $lifespan === null ) { $lifespan = $this->month_in_seconds; } foreach ( $actions_to_delete as $action_id ) { try { $this->store->delete_action( $action_id ); $deleted_actions[] = $action_id; } catch ( Exception $e ) { /** * Notify 3rd party code of exceptions when deleting a completed action older than the retention period * * This hook provides a way for 3rd party code to log or otherwise handle exceptions relating to their * actions. * * @param int $action_id The scheduled actions ID in the data store * @param Exception $e The exception thrown when attempting to delete the action from the data store * @param int $lifespan The retention period, in seconds, for old actions * @param int $count_of_actions_to_delete The number of old actions being deleted in this batch * @since 2.0.0 * */ do_action( "action_scheduler_failed_{$context}_action_deletion", $action_id, $e, $lifespan, count( $actions_to_delete ) ); } } return $deleted_actions; } /** * Unclaim pending actions that have not been run within a given time limit. * * When called by ActionScheduler_Abstract_QueueRunner::run_cleanup(), the time limit passed * as a parameter is 10x the time limit used for queue processing. * * @param int $time_limit The number of seconds to allow a queue to run before unclaiming its pending actions. Default 300 (5 minutes). */ public function reset_timeouts( $time_limit = 300 ) { $timeout = apply_filters( 'action_scheduler_timeout_period', $time_limit ); if ( $timeout < 0 ) { return; } $cutoff = as_get_datetime_object($timeout.' seconds ago'); $actions_to_reset = $this->store->query_actions( array( 'status' => ActionScheduler_Store::STATUS_PENDING, 'modified' => $cutoff, 'modified_compare' => '<=', 'claimed' => true, 'per_page' => $this->get_batch_size(), 'orderby' => 'none', ) ); foreach ( $actions_to_reset as $action_id ) { $this->store->unclaim_action( $action_id ); do_action( 'action_scheduler_reset_action', $action_id ); } } /** * Mark actions that have been running for more than a given time limit as failed, based on * the assumption some uncatachable and unloggable fatal error occurred during processing. * * When called by ActionScheduler_Abstract_QueueRunner::run_cleanup(), the time limit passed * as a parameter is 10x the time limit used for queue processing. * * @param int $time_limit The number of seconds to allow an action to run before it is considered to have failed. Default 300 (5 minutes). */ public function mark_failures( $time_limit = 300 ) { $timeout = apply_filters( 'action_scheduler_failure_period', $time_limit ); if ( $timeout < 0 ) { return; } $cutoff = as_get_datetime_object($timeout.' seconds ago'); $actions_to_reset = $this->store->query_actions( array( 'status' => ActionScheduler_Store::STATUS_RUNNING, 'modified' => $cutoff, 'modified_compare' => '<=', 'per_page' => $this->get_batch_size(), 'orderby' => 'none', ) ); foreach ( $actions_to_reset as $action_id ) { $this->store->mark_failure( $action_id ); do_action( 'action_scheduler_failed_action', $action_id, $timeout ); } } /** * Do all of the cleaning actions. * * @param int $time_limit The number of seconds to use as the timeout and failure period. Default 300 (5 minutes). * @author Jeremy Pry */ public function clean( $time_limit = 300 ) { $this->delete_old_actions(); $this->reset_timeouts( $time_limit ); $this->mark_failures( $time_limit ); } /** * Get the batch size for cleaning the queue. * * @author Jeremy Pry * @return int */ protected function get_batch_size() { /** * Filter the batch size when cleaning the queue. * * @param int $batch_size The number of actions to clean in one batch. */ return absint( apply_filters( 'action_scheduler_cleanup_batch_size', $this->batch_size ) ); } } pro/libraries/action-scheduler/classes/ActionScheduler_ActionFactory.php000064400000035404147600337620022636 0ustar00= 6 ? (int) func_get_arg( 5 ) : 10; switch ( $status ) { case ActionScheduler_Store::STATUS_PENDING: $action_class = 'ActionScheduler_Action'; break; case ActionScheduler_Store::STATUS_CANCELED: $action_class = 'ActionScheduler_CanceledAction'; if ( ! is_null( $schedule ) && ! is_a( $schedule, 'ActionScheduler_CanceledSchedule' ) && ! is_a( $schedule, 'ActionScheduler_NullSchedule' ) ) { $schedule = new ActionScheduler_CanceledSchedule( $schedule->get_date() ); } break; default: $action_class = 'ActionScheduler_FinishedAction'; break; } $action_class = apply_filters( 'action_scheduler_stored_action_class', $action_class, $status, $hook, $args, $schedule, $group ); $action = new $action_class( $hook, $args, $schedule, $group ); $action->set_priority( $priority ); /** * Allow 3rd party code to change the instantiated action for a given hook, args, schedule and group. * * @param ActionScheduler_Action $action The instantiated action. * @param string $hook The instantiated action's hook. * @param array $args The instantiated action's args. * @param ActionScheduler_Schedule $schedule The instantiated action's schedule. * @param string $group The instantiated action's group. * @param int $priority The action priority. */ return apply_filters( 'action_scheduler_stored_action_instance', $action, $hook, $args, $schedule, $group, $priority ); } /** * Enqueue an action to run one time, as soon as possible (rather a specific scheduled time). * * This method creates a new action using the NullSchedule. In practice, this results in an action scheduled to * execute "now". Therefore, it will generally run as soon as possible but is not prioritized ahead of other actions * that are already past-due. * * @param string $hook The hook to trigger when this action runs. * @param array $args Args to pass when the hook is triggered. * @param string $group A group to put the action in. * * @return int The ID of the stored action. */ public function async( $hook, $args = array(), $group = '' ) { return $this->async_unique( $hook, $args, $group, false ); } /** * Same as async, but also supports $unique param. * * @param string $hook The hook to trigger when this action runs. * @param array $args Args to pass when the hook is triggered. * @param string $group A group to put the action in. * @param bool $unique Whether to ensure the action is unique. * * @return int The ID of the stored action. */ public function async_unique( $hook, $args = array(), $group = '', $unique = true ) { $schedule = new ActionScheduler_NullSchedule(); $action = new ActionScheduler_Action( $hook, $args, $schedule, $group ); return $unique ? $this->store_unique_action( $action, $unique ) : $this->store( $action ); } /** * Create single action. * * @param string $hook The hook to trigger when this action runs. * @param array $args Args to pass when the hook is triggered. * @param int $when Unix timestamp when the action will run. * @param string $group A group to put the action in. * * @return int The ID of the stored action. */ public function single( $hook, $args = array(), $when = null, $group = '' ) { return $this->single_unique( $hook, $args, $when, $group, false ); } /** * Create single action only if there is no pending or running action with same name and params. * * @param string $hook The hook to trigger when this action runs. * @param array $args Args to pass when the hook is triggered. * @param int $when Unix timestamp when the action will run. * @param string $group A group to put the action in. * @param bool $unique Whether action scheduled should be unique. * * @return int The ID of the stored action. */ public function single_unique( $hook, $args = array(), $when = null, $group = '', $unique = true ) { $date = as_get_datetime_object( $when ); $schedule = new ActionScheduler_SimpleSchedule( $date ); $action = new ActionScheduler_Action( $hook, $args, $schedule, $group ); return $unique ? $this->store_unique_action( $action ) : $this->store( $action ); } /** * Create the first instance of an action recurring on a given interval. * * @param string $hook The hook to trigger when this action runs. * @param array $args Args to pass when the hook is triggered. * @param int $first Unix timestamp for the first run. * @param int $interval Seconds between runs. * @param string $group A group to put the action in. * * @return int The ID of the stored action. */ public function recurring( $hook, $args = array(), $first = null, $interval = null, $group = '' ) { return $this->recurring_unique( $hook, $args, $first, $interval, $group, false ); } /** * Create the first instance of an action recurring on a given interval only if there is no pending or running action with same name and params. * * @param string $hook The hook to trigger when this action runs. * @param array $args Args to pass when the hook is triggered. * @param int $first Unix timestamp for the first run. * @param int $interval Seconds between runs. * @param string $group A group to put the action in. * @param bool $unique Whether action scheduled should be unique. * * @return int The ID of the stored action. */ public function recurring_unique( $hook, $args = array(), $first = null, $interval = null, $group = '', $unique = true ) { if ( empty( $interval ) ) { return $this->single_unique( $hook, $args, $first, $group, $unique ); } $date = as_get_datetime_object( $first ); $schedule = new ActionScheduler_IntervalSchedule( $date, $interval ); $action = new ActionScheduler_Action( $hook, $args, $schedule, $group ); return $unique ? $this->store_unique_action( $action ) : $this->store( $action ); } /** * Create the first instance of an action recurring on a Cron schedule. * * @param string $hook The hook to trigger when this action runs. * @param array $args Args to pass when the hook is triggered. * @param int $base_timestamp The first instance of the action will be scheduled * to run at a time calculated after this timestamp matching the cron * expression. This can be used to delay the first instance of the action. * @param int $schedule A cron definition string. * @param string $group A group to put the action in. * * @return int The ID of the stored action. */ public function cron( $hook, $args = array(), $base_timestamp = null, $schedule = null, $group = '' ) { return $this->cron_unique( $hook, $args, $base_timestamp, $schedule, $group, false ); } /** * Create the first instance of an action recurring on a Cron schedule only if there is no pending or running action with same name and params. * * @param string $hook The hook to trigger when this action runs. * @param array $args Args to pass when the hook is triggered. * @param int $base_timestamp The first instance of the action will be scheduled * to run at a time calculated after this timestamp matching the cron * expression. This can be used to delay the first instance of the action. * @param int $schedule A cron definition string. * @param string $group A group to put the action in. * @param bool $unique Whether action scheduled should be unique. * * @return int The ID of the stored action. **/ public function cron_unique( $hook, $args = array(), $base_timestamp = null, $schedule = null, $group = '', $unique = true ) { if ( empty( $schedule ) ) { return $this->single_unique( $hook, $args, $base_timestamp, $group, $unique ); } $date = as_get_datetime_object( $base_timestamp ); $cron = CronExpression::factory( $schedule ); $schedule = new ActionScheduler_CronSchedule( $date, $cron ); $action = new ActionScheduler_Action( $hook, $args, $schedule, $group ); return $unique ? $this->store_unique_action( $action ) : $this->store( $action ); } /** * Create a successive instance of a recurring or cron action. * * Importantly, the action will be rescheduled to run based on the current date/time. * That means when the action is scheduled to run in the past, the next scheduled date * will be pushed forward. For example, if a recurring action set to run every hour * was scheduled to run 5 seconds ago, it will be next scheduled for 1 hour in the * future, which is 1 hour and 5 seconds from when it was last scheduled to run. * * Alternatively, if the action is scheduled to run in the future, and is run early, * likely via manual intervention, then its schedule will change based on the time now. * For example, if a recurring action set to run every day, and is run 12 hours early, * it will run again in 24 hours, not 36 hours. * * This slippage is less of an issue with Cron actions, as the specific run time can * be set for them to run, e.g. 1am each day. In those cases, and entire period would * need to be missed before there was any change is scheduled, e.g. in the case of an * action scheduled for 1am each day, the action would need to run an entire day late. * * @param ActionScheduler_Action $action The existing action. * * @return string The ID of the stored action * @throws InvalidArgumentException If $action is not a recurring action. */ public function repeat( $action ) { $schedule = $action->get_schedule(); $next = $schedule->get_next( as_get_datetime_object() ); if ( is_null( $next ) || ! $schedule->is_recurring() ) { throw new InvalidArgumentException( __( 'Invalid action - must be a recurring action.', 'woocommerce' ) ); } $schedule_class = get_class( $schedule ); $new_schedule = new $schedule( $next, $schedule->get_recurrence(), $schedule->get_first_date() ); $new_action = new ActionScheduler_Action( $action->get_hook(), $action->get_args(), $new_schedule, $action->get_group() ); $new_action->set_priority( $action->get_priority() ); return $this->store( $new_action ); } /** * Creates a scheduled action. * * This general purpose method can be used in place of specific methods such as async(), * async_unique(), single() or single_unique(), etc. * * @internal Not intended for public use, should not be overriden by subclasses. * @throws Exception May be thrown if invalid options are passed. * * @param array $options { * Describes the action we wish to schedule. * * @type string $type Must be one of 'async', 'cron', 'recurring', or 'single'. * @type string $hook The hook to be executed. * @type array $arguments Arguments to be passed to the callback. * @type string $group The action group. * @type bool $unique If the action should be unique. * @type int $when Timestamp. Indicates when the action, or first instance of the action in the case * of recurring or cron actions, becomes due. * @type int|string $pattern Recurrence pattern. This is either an interval in seconds for recurring actions * or a cron expression for cron actions. * @type int $priority Lower values means higher priority. Should be in the range 0-255. * } * * @return int */ public function create( array $options = array() ) { $defaults = array( 'type' => 'single', 'hook' => '', 'arguments' => array(), 'group' => '', 'unique' => false, 'when' => time(), 'pattern' => null, 'priority' => 10, ); $options = array_merge( $defaults, $options ); // Cron/recurring actions without a pattern are treated as single actions (this gives calling code the ability // to use functions like as_schedule_recurring_action() to schedule recurring as well as single actions). if ( ( 'cron' === $options['type'] || 'recurring' === $options['type'] ) && empty( $options['pattern'] ) ) { $options['type'] = 'single'; } switch ( $options['type'] ) { case 'async': $schedule = new ActionScheduler_NullSchedule(); break; case 'cron': $date = as_get_datetime_object( $options['when'] ); $cron = CronExpression::factory( $options['pattern'] ); $schedule = new ActionScheduler_CronSchedule( $date, $cron ); break; case 'recurring': $date = as_get_datetime_object( $options['when'] ); $schedule = new ActionScheduler_IntervalSchedule( $date, $options['pattern'] ); break; case 'single': $date = as_get_datetime_object( $options['when'] ); $schedule = new ActionScheduler_SimpleSchedule( $date ); break; default: throw new Exception( "Unknown action type '{$options['type']}' specified when trying to create an action for '{$options['hook']}'." ); } $action = new ActionScheduler_Action( $options['hook'], $options['arguments'], $schedule, $options['group'] ); $action->set_priority( $options['priority'] ); return $options['unique'] ? $this->store_unique_action( $action ) : $this->store( $action ); } /** * Save action to database. * * @param ActionScheduler_Action $action Action object to save. * * @return int The ID of the stored action */ protected function store( ActionScheduler_Action $action ) { $store = ActionScheduler_Store::instance(); return $store->save_action( $action ); } /** * Store action if it's unique. * * @param ActionScheduler_Action $action Action object to store. * * @return int ID of the created action. Will be 0 if action was not created. */ protected function store_unique_action( ActionScheduler_Action $action ) { $store = ActionScheduler_Store::instance(); return method_exists( $store, 'save_unique_action' ) ? $store->save_unique_action( $action ) : $store->save_action( $action ); } } pro/libraries/action-scheduler/classes/ActionScheduler_DataController.php000064400000012233147600337620023001 0ustar00=' ); return $php_support && apply_filters( 'action_scheduler_migration_dependencies_met', true ); } /** * Get a flag indicating whether the migration is complete. * * @return bool Whether the flag has been set marking the migration as complete */ public static function is_migration_complete() { return get_option( self::STATUS_FLAG ) === self::STATUS_COMPLETE; } /** * Mark the migration as complete. */ public static function mark_migration_complete() { update_option( self::STATUS_FLAG, self::STATUS_COMPLETE ); } /** * Unmark migration when a plugin is de-activated. Will not work in case of silent activation, for example in an update. * We do this to mitigate the bug of lost actions which happens if there was an AS 2.x to AS 3.x migration in the past, but that plugin is now * deactivated and the site was running on AS 2.x again. */ public static function mark_migration_incomplete() { delete_option( self::STATUS_FLAG ); } /** * Set the action store class name. * * @param string $class Classname of the store class. * * @return string */ public static function set_store_class( $class ) { return self::DATASTORE_CLASS; } /** * Set the action logger class name. * * @param string $class Classname of the logger class. * * @return string */ public static function set_logger_class( $class ) { return self::LOGGER_CLASS; } /** * Set the sleep time in seconds. * * @param integer $sleep_time The number of seconds to pause before resuming operation. */ public static function set_sleep_time( $sleep_time ) { self::$sleep_time = (int) $sleep_time; } /** * Set the tick count required for freeing memory. * * @param integer $free_ticks The number of ticks to free memory on. */ public static function set_free_ticks( $free_ticks ) { self::$free_ticks = (int) $free_ticks; } /** * Free memory if conditions are met. * * @param int $ticks Current tick count. */ public static function maybe_free_memory( $ticks ) { if ( self::$free_ticks && 0 === $ticks % self::$free_ticks ) { self::free_memory(); } } /** * Reduce memory footprint by clearing the database query and object caches. */ public static function free_memory() { if ( 0 < self::$sleep_time ) { /* translators: %d: amount of time */ \WP_CLI::warning( sprintf( _n( 'Stopped the insanity for %d second', 'Stopped the insanity for %d seconds', self::$sleep_time, 'woocommerce' ), self::$sleep_time ) ); sleep( self::$sleep_time ); } \WP_CLI::warning( __( 'Attempting to reduce used memory...', 'woocommerce' ) ); /** * @var $wpdb \wpdb * @var $wp_object_cache \WP_Object_Cache */ global $wpdb, $wp_object_cache; $wpdb->queries = array(); if ( ! is_a( $wp_object_cache, 'WP_Object_Cache' ) ) { return; } $wp_object_cache->group_ops = array(); $wp_object_cache->stats = array(); $wp_object_cache->memcache_debug = array(); $wp_object_cache->cache = array(); if ( is_callable( array( $wp_object_cache, '__remoteset' ) ) ) { call_user_func( array( $wp_object_cache, '__remoteset' ) ); // important } } /** * Connect to table datastores if migration is complete. * Otherwise, proceed with the migration if the dependencies have been met. */ public static function init() { if ( self::is_migration_complete() ) { add_filter( 'action_scheduler_store_class', array( 'ActionScheduler_DataController', 'set_store_class' ), 100 ); add_filter( 'action_scheduler_logger_class', array( 'ActionScheduler_DataController', 'set_logger_class' ), 100 ); add_action( 'deactivate_plugin', array( 'ActionScheduler_DataController', 'mark_migration_incomplete' ) ); } elseif ( self::dependencies_met() ) { Controller::init(); } add_action( 'action_scheduler/progress_tick', array( 'ActionScheduler_DataController', 'maybe_free_memory' ) ); } /** * Singleton factory. */ public static function instance() { if ( ! isset( self::$instance ) ) { self::$instance = new static(); } return self::$instance; } } pro/libraries/action-scheduler/classes/ActionScheduler_OptionLock.php000064400000007751147600337620022156 0ustar00maybe_dispatch_async_request() uses a lock to avoid * calling ActionScheduler_QueueRunner->has_maximum_concurrent_batches() every time the 'shutdown', * hook is triggered, because that method calls ActionScheduler_QueueRunner->store->get_claim_count() * to find the current number of claims in the database. * * @param string $lock_type A string to identify different lock types. * @bool True if lock value has changed, false if not or if set failed. */ public function set( $lock_type ) { global $wpdb; $lock_key = $this->get_key( $lock_type ); $existing_lock_value = $this->get_existing_lock( $lock_type ); $new_lock_value = $this->new_lock_value( $lock_type ); // The lock may not exist yet, or may have been deleted. if ( empty( $existing_lock_value ) ) { return (bool) $wpdb->insert( $wpdb->options, array( 'option_name' => $lock_key, 'option_value' => $new_lock_value, 'autoload' => 'no', ) ); } if ( $this->get_expiration_from( $existing_lock_value ) >= time() ) { return false; } // Otherwise, try to obtain the lock. return (bool) $wpdb->update( $wpdb->options, array( 'option_value' => $new_lock_value ), array( 'option_name' => $lock_key, 'option_value' => $existing_lock_value, ) ); } /** * If a lock is set, return the timestamp it was set to expiry. * * @param string $lock_type A string to identify different lock types. * @return bool|int False if no lock is set, otherwise the timestamp for when the lock is set to expire. */ public function get_expiration( $lock_type ) { return $this->get_expiration_from( $this->get_existing_lock( $lock_type ) ); } /** * Given the lock string, derives the lock expiration timestamp (or false if it cannot be determined). * * @param string $lock_value String containing a timestamp, or pipe-separated combination of unique value and timestamp. * * @return false|int */ private function get_expiration_from( $lock_value ) { $lock_string = explode( '|', $lock_value ); // Old style lock? if ( count( $lock_string ) === 1 && is_numeric( $lock_string[0] ) ) { return (int) $lock_string[0]; } // New style lock? if ( count( $lock_string ) === 2 && is_numeric( $lock_string[1] ) ) { return (int) $lock_string[1]; } return false; } /** * Get the key to use for storing the lock in the transient * * @param string $lock_type A string to identify different lock types. * @return string */ protected function get_key( $lock_type ) { return sprintf( 'action_scheduler_lock_%s', $lock_type ); } /** * Supplies the existing lock value, or an empty string if not set. * * @param string $lock_type A string to identify different lock types. * * @return string */ private function get_existing_lock( $lock_type ) { global $wpdb; // Now grab the existing lock value, if there is one. return (string) $wpdb->get_var( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s", $this->get_key( $lock_type ) ) ); } /** * Supplies a lock value consisting of a unique value and the current timestamp, which are separated by a pipe * character. * * Example: (string) "649de012e6b262.09774912|1688068114" * * @param string $lock_type A string to identify different lock types. * * @return string */ private function new_lock_value( $lock_type ) { return uniqid( '', true ) . '|' . ( time() + $this->get_duration( $lock_type ) ); } } pro/libraries/action-scheduler/classes/ActionScheduler_Exception.php000064400000000317147600337620022022 0ustar00id = $id; $this->action_ids = $action_ids; } public function get_id() { return $this->id; } public function get_actions() { return $this->action_ids; } } pro/libraries/action-scheduler/classes/ActionScheduler_NullLogEntry.php000064400000000333147600337620022460 0ustar00store = $store; } public function attach( ActionScheduler_ActionClaim $claim ) { $this->claim = $claim; add_action( 'shutdown', array( $this, 'handle_unexpected_shutdown' ) ); add_action( 'action_scheduler_before_execute', array( $this, 'track_current_action' ), 0, 1 ); add_action( 'action_scheduler_after_execute', array( $this, 'untrack_action' ), 0, 0 ); add_action( 'action_scheduler_execution_ignored', array( $this, 'untrack_action' ), 0, 0 ); add_action( 'action_scheduler_failed_execution', array( $this, 'untrack_action' ), 0, 0 ); } public function detach() { $this->claim = NULL; $this->untrack_action(); remove_action( 'shutdown', array( $this, 'handle_unexpected_shutdown' ) ); remove_action( 'action_scheduler_before_execute', array( $this, 'track_current_action' ), 0 ); remove_action( 'action_scheduler_after_execute', array( $this, 'untrack_action' ), 0 ); remove_action( 'action_scheduler_execution_ignored', array( $this, 'untrack_action' ), 0 ); remove_action( 'action_scheduler_failed_execution', array( $this, 'untrack_action' ), 0 ); } public function track_current_action( $action_id ) { $this->action_id = $action_id; } public function untrack_action() { $this->action_id = 0; } public function handle_unexpected_shutdown() { if ( $error = error_get_last() ) { if ( in_array( $error['type'], array( E_ERROR, E_PARSE, E_COMPILE_ERROR, E_USER_ERROR, E_RECOVERABLE_ERROR ) ) ) { if ( !empty($this->action_id) ) { $this->store->mark_failure( $this->action_id ); do_action( 'action_scheduler_unexpected_shutdown', $this->action_id, $error ); } } $this->store->release_claim( $this->claim ); } } } pro/libraries/action-scheduler/classes/ActionScheduler_ListTable.php000064400000051044147600337620021752 0ustar00 label). * * @var array */ protected $columns = array(); /** * Actions (name => label). * * @var array */ protected $row_actions = array(); /** * The active data stores * * @var ActionScheduler_Store */ protected $store; /** * A logger to use for getting action logs to display * * @var ActionScheduler_Logger */ protected $logger; /** * A ActionScheduler_QueueRunner runner instance (or child class) * * @var ActionScheduler_QueueRunner */ protected $runner; /** * Bulk actions. The key of the array is the method name of the implementation: * * bulk_(array $ids, string $sql_in). * * See the comments in the parent class for further details * * @var array */ protected $bulk_actions = array(); /** * Flag variable to render our notifications, if any, once. * * @var bool */ protected static $did_notification = false; /** * Array of seconds for common time periods, like week or month, alongside an internationalised string representation, i.e. "Day" or "Days" * * @var array */ private static $time_periods; /** * Sets the current data store object into `store->action` and initialises the object. * * @param ActionScheduler_Store $store * @param ActionScheduler_Logger $logger * @param ActionScheduler_QueueRunner $runner */ public function __construct( ActionScheduler_Store $store, ActionScheduler_Logger $logger, ActionScheduler_QueueRunner $runner ) { $this->store = $store; $this->logger = $logger; $this->runner = $runner; $this->table_header = __( 'Scheduled Actions', 'woocommerce' ); $this->bulk_actions = array( 'delete' => __( 'Delete', 'woocommerce' ), ); $this->columns = array( 'hook' => __( 'Hook', 'woocommerce' ), 'status' => __( 'Status', 'woocommerce' ), 'args' => __( 'Arguments', 'woocommerce' ), 'group' => __( 'Group', 'woocommerce' ), 'recurrence' => __( 'Recurrence', 'woocommerce' ), 'schedule' => __( 'Scheduled Date', 'woocommerce' ), 'log_entries' => __( 'Log', 'woocommerce' ), ); $this->sort_by = array( 'schedule', 'hook', 'group', ); $this->search_by = array( 'hook', 'args', 'claim_id', ); $request_status = $this->get_request_status(); if ( empty( $request_status ) ) { $this->sort_by[] = 'status'; } elseif ( in_array( $request_status, array( 'in-progress', 'failed' ) ) ) { $this->columns += array( 'claim_id' => __( 'Claim ID', 'woocommerce' ) ); $this->sort_by[] = 'claim_id'; } $this->row_actions = array( 'hook' => array( 'run' => array( 'name' => __( 'Run', 'woocommerce' ), 'desc' => __( 'Process the action now as if it were run as part of a queue', 'woocommerce' ), ), 'cancel' => array( 'name' => __( 'Cancel', 'woocommerce' ), 'desc' => __( 'Cancel the action now to avoid it being run in future', 'woocommerce' ), 'class' => 'cancel trash', ), ), ); self::$time_periods = array( array( 'seconds' => YEAR_IN_SECONDS, /* translators: %s: amount of time */ 'names' => _n_noop( '%s year', '%s years', 'woocommerce' ), ), array( 'seconds' => MONTH_IN_SECONDS, /* translators: %s: amount of time */ 'names' => _n_noop( '%s month', '%s months', 'woocommerce' ), ), array( 'seconds' => WEEK_IN_SECONDS, /* translators: %s: amount of time */ 'names' => _n_noop( '%s week', '%s weeks', 'woocommerce' ), ), array( 'seconds' => DAY_IN_SECONDS, /* translators: %s: amount of time */ 'names' => _n_noop( '%s day', '%s days', 'woocommerce' ), ), array( 'seconds' => HOUR_IN_SECONDS, /* translators: %s: amount of time */ 'names' => _n_noop( '%s hour', '%s hours', 'woocommerce' ), ), array( 'seconds' => MINUTE_IN_SECONDS, /* translators: %s: amount of time */ 'names' => _n_noop( '%s minute', '%s minutes', 'woocommerce' ), ), array( 'seconds' => 1, /* translators: %s: amount of time */ 'names' => _n_noop( '%s second', '%s seconds', 'woocommerce' ), ), ); parent::__construct( array( 'singular' => 'action-scheduler', 'plural' => 'action-scheduler', 'ajax' => false, ) ); add_screen_option( 'per_page', array( 'default' => $this->items_per_page, ) ); add_filter( 'set_screen_option_' . $this->get_per_page_option_name(), array( $this, 'set_items_per_page_option' ), 10, 3 ); set_screen_options(); } /** * Handles setting the items_per_page option for this screen. * * @param mixed $status Default false (to skip saving the current option). * @param string $option Screen option name. * @param int $value Screen option value. * @return int */ public function set_items_per_page_option( $status, $option, $value ) { return $value; } /** * Convert an interval of seconds into a two part human friendly string. * * The WordPress human_time_diff() function only calculates the time difference to one degree, meaning * even if an action is 1 day and 11 hours away, it will display "1 day". This function goes one step * further to display two degrees of accuracy. * * Inspired by the Crontrol::interval() function by Edward Dale: https://wordpress.org/plugins/wp-crontrol/ * * @param int $interval A interval in seconds. * @param int $periods_to_include Depth of time periods to include, e.g. for an interval of 70, and $periods_to_include of 2, both minutes and seconds would be included. With a value of 1, only minutes would be included. * @return string A human friendly string representation of the interval. */ private static function human_interval( $interval, $periods_to_include = 2 ) { if ( $interval <= 0 ) { return __( 'Now!', 'woocommerce' ); } $output = ''; for ( $time_period_index = 0, $periods_included = 0, $seconds_remaining = $interval; $time_period_index < count( self::$time_periods ) && $seconds_remaining > 0 && $periods_included < $periods_to_include; $time_period_index++ ) { $periods_in_interval = floor( $seconds_remaining / self::$time_periods[ $time_period_index ]['seconds'] ); if ( $periods_in_interval > 0 ) { if ( ! empty( $output ) ) { $output .= ' '; } $output .= sprintf( _n( self::$time_periods[ $time_period_index ]['names'][0], self::$time_periods[ $time_period_index ]['names'][1], $periods_in_interval, 'woocommerce' ), $periods_in_interval ); $seconds_remaining -= $periods_in_interval * self::$time_periods[ $time_period_index ]['seconds']; $periods_included++; } } return $output; } /** * Returns the recurrence of an action or 'Non-repeating'. The output is human readable. * * @param ActionScheduler_Action $action * * @return string */ protected function get_recurrence( $action ) { $schedule = $action->get_schedule(); if ( $schedule->is_recurring() && method_exists( $schedule, 'get_recurrence' ) ) { $recurrence = $schedule->get_recurrence(); if ( is_numeric( $recurrence ) ) { /* translators: %s: time interval */ return sprintf( __( 'Every %s', 'woocommerce' ), self::human_interval( $recurrence ) ); } else { return $recurrence; } } return __( 'Non-repeating', 'woocommerce' ); } /** * Serializes the argument of an action to render it in a human friendly format. * * @param array $row The array representation of the current row of the table * * @return string */ public function column_args( array $row ) { if ( empty( $row['args'] ) ) { return apply_filters( 'action_scheduler_list_table_column_args', '', $row ); } $row_html = '
              '; foreach ( $row['args'] as $key => $value ) { $row_html .= sprintf( '
            • %s => %s
            • ', esc_html( var_export( $key, true ) ), esc_html( var_export( $value, true ) ) ); } $row_html .= '
            '; return apply_filters( 'action_scheduler_list_table_column_args', $row_html, $row ); } /** * Prints the logs entries inline. We do so to avoid loading Javascript and other hacks to show it in a modal. * * @param array $row Action array. * @return string */ public function column_log_entries( array $row ) { $log_entries_html = '
              '; $timezone = new DateTimezone( 'UTC' ); foreach ( $row['log_entries'] as $log_entry ) { $log_entries_html .= $this->get_log_entry_html( $log_entry, $timezone ); } $log_entries_html .= '
            '; return $log_entries_html; } /** * Prints the logs entries inline. We do so to avoid loading Javascript and other hacks to show it in a modal. * * @param ActionScheduler_LogEntry $log_entry * @param DateTimezone $timezone * @return string */ protected function get_log_entry_html( ActionScheduler_LogEntry $log_entry, DateTimezone $timezone ) { $date = $log_entry->get_date(); $date->setTimezone( $timezone ); return sprintf( '
          • %s
            %s
          • ', esc_html( $date->format( 'Y-m-d H:i:s O' ) ), esc_html( $log_entry->get_message() ) ); } /** * Only display row actions for pending actions. * * @param array $row Row to render * @param string $column_name Current row * * @return string */ protected function maybe_render_actions( $row, $column_name ) { if ( 'pending' === strtolower( $row[ 'status_name' ] ) ) { return parent::maybe_render_actions( $row, $column_name ); } return ''; } /** * Renders admin notifications * * Notifications: * 1. When the maximum number of tasks are being executed simultaneously. * 2. Notifications when a task is manually executed. * 3. Tables are missing. */ public function display_admin_notices() { global $wpdb; if ( ( is_a( $this->store, 'ActionScheduler_HybridStore' ) || is_a( $this->store, 'ActionScheduler_DBStore' ) ) && apply_filters( 'action_scheduler_enable_recreate_data_store', true ) ) { $table_list = array( 'actionscheduler_actions', 'actionscheduler_logs', 'actionscheduler_groups', 'actionscheduler_claims', ); $found_tables = $wpdb->get_col( "SHOW TABLES LIKE '{$wpdb->prefix}actionscheduler%'" ); // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared foreach ( $table_list as $table_name ) { if ( ! in_array( $wpdb->prefix . $table_name, $found_tables ) ) { $this->admin_notices[] = array( 'class' => 'error', 'message' => __( 'It appears one or more database tables were missing. Attempting to re-create the missing table(s).' , 'woocommerce' ), ); $this->recreate_tables(); parent::display_admin_notices(); return; } } } if ( $this->runner->has_maximum_concurrent_batches() ) { $claim_count = $this->store->get_claim_count(); $this->admin_notices[] = array( 'class' => 'updated', 'message' => sprintf( /* translators: %s: amount of claims */ _n( 'Maximum simultaneous queues already in progress (%s queue). No additional queues will begin processing until the current queues are complete.', 'Maximum simultaneous queues already in progress (%s queues). No additional queues will begin processing until the current queues are complete.', $claim_count, 'woocommerce' ), $claim_count ), ); } elseif ( $this->store->has_pending_actions_due() ) { $async_request_lock_expiration = ActionScheduler::lock()->get_expiration( 'async-request-runner' ); // No lock set or lock expired if ( false === $async_request_lock_expiration || $async_request_lock_expiration < time() ) { $in_progress_url = add_query_arg( 'status', 'in-progress', remove_query_arg( 'status' ) ); /* translators: %s: process URL */ $async_request_message = sprintf( __( 'A new queue has begun processing. View actions in-progress »', 'woocommerce' ), esc_url( $in_progress_url ) ); } else { /* translators: %d: seconds */ $async_request_message = sprintf( __( 'The next queue will begin processing in approximately %d seconds.', 'woocommerce' ), $async_request_lock_expiration - time() ); } $this->admin_notices[] = array( 'class' => 'notice notice-info', 'message' => $async_request_message, ); } $notification = get_transient( 'action_scheduler_admin_notice' ); if ( is_array( $notification ) ) { delete_transient( 'action_scheduler_admin_notice' ); $action = $this->store->fetch_action( $notification['action_id'] ); $action_hook_html = '' . $action->get_hook() . ''; if ( 1 == $notification['success'] ) { $class = 'updated'; switch ( $notification['row_action_type'] ) { case 'run' : /* translators: %s: action HTML */ $action_message_html = sprintf( __( 'Successfully executed action: %s', 'woocommerce' ), $action_hook_html ); break; case 'cancel' : /* translators: %s: action HTML */ $action_message_html = sprintf( __( 'Successfully canceled action: %s', 'woocommerce' ), $action_hook_html ); break; default : /* translators: %s: action HTML */ $action_message_html = sprintf( __( 'Successfully processed change for action: %s', 'woocommerce' ), $action_hook_html ); break; } } else { $class = 'error'; /* translators: 1: action HTML 2: action ID 3: error message */ $action_message_html = sprintf( __( 'Could not process change for action: "%1$s" (ID: %2$d). Error: %3$s', 'woocommerce' ), $action_hook_html, esc_html( $notification['action_id'] ), esc_html( $notification['error_message'] ) ); } $action_message_html = apply_filters( 'action_scheduler_admin_notice_html', $action_message_html, $action, $notification ); $this->admin_notices[] = array( 'class' => $class, 'message' => $action_message_html, ); } parent::display_admin_notices(); } /** * Prints the scheduled date in a human friendly format. * * @param array $row The array representation of the current row of the table * * @return string */ public function column_schedule( $row ) { return $this->get_schedule_display_string( $row['schedule'] ); } /** * Get the scheduled date in a human friendly format. * * @param ActionScheduler_Schedule $schedule * @return string */ protected function get_schedule_display_string( ActionScheduler_Schedule $schedule ) { $schedule_display_string = ''; if ( is_a( $schedule, 'ActionScheduler_NullSchedule' ) ) { return __( 'async', 'woocommerce' ); } if ( ! method_exists( $schedule, 'get_date' ) || ! $schedule->get_date() ) { return '0000-00-00 00:00:00'; } $next_timestamp = $schedule->get_date()->getTimestamp(); $schedule_display_string .= $schedule->get_date()->format( 'Y-m-d H:i:s O' ); $schedule_display_string .= '
            '; if ( gmdate( 'U' ) > $next_timestamp ) { /* translators: %s: date interval */ $schedule_display_string .= sprintf( __( ' (%s ago)', 'woocommerce' ), self::human_interval( gmdate( 'U' ) - $next_timestamp ) ); } else { /* translators: %s: date interval */ $schedule_display_string .= sprintf( __( ' (%s)', 'woocommerce' ), self::human_interval( $next_timestamp - gmdate( 'U' ) ) ); } return $schedule_display_string; } /** * Bulk delete * * Deletes actions based on their ID. This is the handler for the bulk delete. It assumes the data * properly validated by the callee and it will delete the actions without any extra validation. * * @param array $ids * @param string $ids_sql Inherited and unused */ protected function bulk_delete( array $ids, $ids_sql ) { foreach ( $ids as $id ) { try { $this->store->delete_action( $id ); } catch ( Exception $e ) { // A possible reason for an exception would include a scenario where the same action is deleted by a // concurrent request. error_log( sprintf( /* translators: 1: action ID 2: exception message. */ __( 'Action Scheduler was unable to delete action %1$d. Reason: %2$s', 'woocommerce' ), $id, $e->getMessage() ) ); } } } /** * Implements the logic behind running an action. ActionScheduler_Abstract_ListTable validates the request and their * parameters are valid. * * @param int $action_id */ protected function row_action_cancel( $action_id ) { $this->process_row_action( $action_id, 'cancel' ); } /** * Implements the logic behind running an action. ActionScheduler_Abstract_ListTable validates the request and their * parameters are valid. * * @param int $action_id */ protected function row_action_run( $action_id ) { $this->process_row_action( $action_id, 'run' ); } /** * Force the data store schema updates. */ protected function recreate_tables() { if ( is_a( $this->store, 'ActionScheduler_HybridStore' ) ) { $store = $this->store; } else { $store = new ActionScheduler_HybridStore(); } add_action( 'action_scheduler/created_table', array( $store, 'set_autoincrement' ), 10, 2 ); $store_schema = new ActionScheduler_StoreSchema(); $logger_schema = new ActionScheduler_LoggerSchema(); $store_schema->register_tables( true ); $logger_schema->register_tables( true ); remove_action( 'action_scheduler/created_table', array( $store, 'set_autoincrement' ), 10 ); } /** * Implements the logic behind processing an action once an action link is clicked on the list table. * * @param int $action_id * @param string $row_action_type The type of action to perform on the action. */ protected function process_row_action( $action_id, $row_action_type ) { try { switch ( $row_action_type ) { case 'run' : $this->runner->process_action( $action_id, 'Admin List Table' ); break; case 'cancel' : $this->store->cancel_action( $action_id ); break; } $success = 1; $error_message = ''; } catch ( Exception $e ) { $success = 0; $error_message = $e->getMessage(); } set_transient( 'action_scheduler_admin_notice', compact( 'action_id', 'success', 'error_message', 'row_action_type' ), 30 ); } /** * {@inheritDoc} */ public function prepare_items() { $this->prepare_column_headers(); $per_page = $this->get_items_per_page( $this->get_per_page_option_name(), $this->items_per_page ); $query = array( 'per_page' => $per_page, 'offset' => $this->get_items_offset(), 'status' => $this->get_request_status(), 'orderby' => $this->get_request_orderby(), 'order' => $this->get_request_order(), 'search' => $this->get_request_search_query(), ); /** * Change query arguments to query for past-due actions. * Past-due actions have the 'pending' status and are in the past. * This is needed because registering 'past-due' as a status is overkill. */ if ( 'past-due' === $this->get_request_status() ) { $query['status'] = ActionScheduler_Store::STATUS_PENDING; $query['date'] = as_get_datetime_object(); } $this->items = array(); $total_items = $this->store->query_actions( $query, 'count' ); $status_labels = $this->store->get_status_labels(); foreach ( $this->store->query_actions( $query ) as $action_id ) { try { $action = $this->store->fetch_action( $action_id ); } catch ( Exception $e ) { continue; } if ( is_a( $action, 'ActionScheduler_NullAction' ) ) { continue; } $this->items[ $action_id ] = array( 'ID' => $action_id, 'hook' => $action->get_hook(), 'status_name' => $this->store->get_status( $action_id ), 'status' => $status_labels[ $this->store->get_status( $action_id ) ], 'args' => $action->get_args(), 'group' => $action->get_group(), 'log_entries' => $this->logger->get_logs( $action_id ), 'claim_id' => $this->store->get_claim_id( $action_id ), 'recurrence' => $this->get_recurrence( $action ), 'schedule' => $action->get_schedule(), ); } $this->set_pagination_args( array( 'total_items' => $total_items, 'per_page' => $per_page, 'total_pages' => ceil( $total_items / $per_page ), ) ); } /** * Prints the available statuses so the user can click to filter. */ protected function display_filter_by_status() { $this->status_counts = $this->store->action_counts() + $this->store->extra_action_counts(); parent::display_filter_by_status(); } /** * Get the text to display in the search box on the list table. */ protected function get_search_box_button_text() { return __( 'Search hook, args and claim ID', 'woocommerce' ); } /** * {@inheritDoc} */ protected function get_per_page_option_name() { return str_replace( '-', '_', $this->screen->id ) . '_per_page'; } } pro/libraries/action-scheduler/classes/ActionScheduler_DateTime.php000064400000003206147600337620021560 0ustar00format( 'U' ); } /** * Set the UTC offset. * * This represents a fixed offset instead of a timezone setting. * * @param $offset */ public function setUtcOffset( $offset ) { $this->utcOffset = intval( $offset ); } /** * Returns the timezone offset. * * @return int * @link http://php.net/manual/en/datetime.getoffset.php */ #[\ReturnTypeWillChange] public function getOffset() { return $this->utcOffset ? $this->utcOffset : parent::getOffset(); } /** * Set the TimeZone associated with the DateTime * * @param DateTimeZone $timezone * * @return static * @link http://php.net/manual/en/datetime.settimezone.php */ #[\ReturnTypeWillChange] public function setTimezone( $timezone ) { $this->utcOffset = 0; parent::setTimezone( $timezone ); return $this; } /** * Get the timestamp with the WordPress timezone offset added or subtracted. * * @since 3.0.0 * @return int */ public function getOffsetTimestamp() { return $this->getTimestamp() + $this->getOffset(); } } pro/libraries/action-scheduler/classes/ActionScheduler_wcSystemStatus.php000064400000012220147600337620023102 0ustar00store = $store; } /** * Display action data, including number of actions grouped by status and the oldest & newest action in each status. * * Helpful to identify issues, like a clogged queue. */ public function render() { $action_counts = $this->store->action_counts(); $status_labels = $this->store->get_status_labels(); $oldest_and_newest = $this->get_oldest_and_newest( array_keys( $status_labels ) ); $this->get_template( $status_labels, $action_counts, $oldest_and_newest ); } /** * Get oldest and newest scheduled dates for a given set of statuses. * * @param array $status_keys Set of statuses to find oldest & newest action for. * @return array */ protected function get_oldest_and_newest( $status_keys ) { $oldest_and_newest = array(); foreach ( $status_keys as $status ) { $oldest_and_newest[ $status ] = array( 'oldest' => '–', 'newest' => '–', ); if ( 'in-progress' === $status ) { continue; } $oldest_and_newest[ $status ]['oldest'] = $this->get_action_status_date( $status, 'oldest' ); $oldest_and_newest[ $status ]['newest'] = $this->get_action_status_date( $status, 'newest' ); } return $oldest_and_newest; } /** * Get oldest or newest scheduled date for a given status. * * @param string $status Action status label/name string. * @param string $date_type Oldest or Newest. * @return DateTime */ protected function get_action_status_date( $status, $date_type = 'oldest' ) { $order = 'oldest' === $date_type ? 'ASC' : 'DESC'; $action = $this->store->query_actions( array( 'claimed' => false, 'status' => $status, 'per_page' => 1, 'order' => $order, ) ); if ( ! empty( $action ) ) { $date_object = $this->store->get_date( $action[0] ); $action_date = $date_object->format( 'Y-m-d H:i:s O' ); } else { $action_date = '–'; } return $action_date; } /** * Get oldest or newest scheduled date for a given status. * * @param array $status_labels Set of statuses to find oldest & newest action for. * @param array $action_counts Number of actions grouped by status. * @param array $oldest_and_newest Date of the oldest and newest action with each status. */ protected function get_template( $status_labels, $action_counts, $oldest_and_newest ) { $as_version = ActionScheduler_Versions::instance()->latest_version(); $as_datastore = get_class( ActionScheduler_Store::instance() ); ?> $count ) { // WC uses the 3rd column for export, so we need to display more data in that (hidden when viewed as part of the table) and add an empty 2nd column. printf( '', esc_html( $status_labels[ $status ] ), esc_html( number_format_i18n( $count ) ), esc_html( $oldest_and_newest[ $status ]['oldest'] ), esc_html( $oldest_and_newest[ $status ]['newest'] ) ); } ?>

             
            %1$s %2$s, Oldest: %3$s, Newest: %4$s%3$s%4$s
            store ); } $this->async_request = $async_request; } /** * @codeCoverageIgnore */ public function init() { add_filter( 'cron_schedules', array( self::instance(), 'add_wp_cron_schedule' ) ); // Check for and remove any WP Cron hook scheduled by Action Scheduler < 3.0.0, which didn't include the $context param $next_timestamp = wp_next_scheduled( self::WP_CRON_HOOK ); if ( $next_timestamp ) { wp_unschedule_event( $next_timestamp, self::WP_CRON_HOOK ); } $cron_context = array( 'WP Cron' ); if ( ! wp_next_scheduled( self::WP_CRON_HOOK, $cron_context ) ) { $schedule = apply_filters( 'action_scheduler_run_schedule', self::WP_CRON_SCHEDULE ); wp_schedule_event( time(), $schedule, self::WP_CRON_HOOK, $cron_context ); } add_action( self::WP_CRON_HOOK, array( self::instance(), 'run' ) ); $this->hook_dispatch_async_request(); } /** * Hook check for dispatching an async request. */ public function hook_dispatch_async_request() { add_action( 'shutdown', array( $this, 'maybe_dispatch_async_request' ) ); } /** * Unhook check for dispatching an async request. */ public function unhook_dispatch_async_request() { remove_action( 'shutdown', array( $this, 'maybe_dispatch_async_request' ) ); } /** * Check if we should dispatch an async request to process actions. * * This method is attached to 'shutdown', so is called frequently. To avoid slowing down * the site, it mitigates the work performed in each request by: * 1. checking if it's in the admin context and then * 2. haven't run on the 'shutdown' hook within the lock time (60 seconds by default) * 3. haven't exceeded the number of allowed batches. * * The order of these checks is important, because they run from a check on a value: * 1. in memory - is_admin() maps to $GLOBALS or the WP_ADMIN constant * 2. in memory - transients use autoloaded options by default * 3. from a database query - has_maximum_concurrent_batches() run the query * $this->store->get_claim_count() to find the current number of claims in the DB. * * If all of these conditions are met, then we request an async runner check whether it * should dispatch a request to process pending actions. */ public function maybe_dispatch_async_request() { // Only start an async queue at most once every 60 seconds. if ( is_admin() && ! ActionScheduler::lock()->is_locked( 'async-request-runner' ) && ActionScheduler::lock()->set( 'async-request-runner' ) ) { $this->async_request->maybe_dispatch(); } } /** * Process actions in the queue. Attached to self::WP_CRON_HOOK i.e. 'action_scheduler_run_queue' * * The $context param of this method defaults to 'WP Cron', because prior to Action Scheduler 3.0.0 * that was the only context in which this method was run, and the self::WP_CRON_HOOK hook had no context * passed along with it. New code calling this method directly, or by triggering the self::WP_CRON_HOOK, * should set a context as the first parameter. For an example of this, refer to the code seen in * @see ActionScheduler_AsyncRequest_QueueRunner::handle() * * @param string $context Optional identifer for the context in which this action is being processed, e.g. 'WP CLI' or 'WP Cron' * Generally, this should be capitalised and not localised as it's a proper noun. * @return int The number of actions processed. */ public function run( $context = 'WP Cron' ) { ActionScheduler_Compatibility::raise_memory_limit(); ActionScheduler_Compatibility::raise_time_limit( $this->get_time_limit() ); do_action( 'action_scheduler_before_process_queue' ); $this->run_cleanup(); $this->processed_actions_count = 0; if ( false === $this->has_maximum_concurrent_batches() ) { $batch_size = apply_filters( 'action_scheduler_queue_runner_batch_size', 25 ); do { $processed_actions_in_batch = $this->do_batch( $batch_size, $context ); $this->processed_actions_count += $processed_actions_in_batch; } while ( $processed_actions_in_batch > 0 && ! $this->batch_limits_exceeded( $this->processed_actions_count ) ); // keep going until we run out of actions, time, or memory } do_action( 'action_scheduler_after_process_queue' ); return $this->processed_actions_count; } /** * Process a batch of actions pending in the queue. * * Actions are processed by claiming a set of pending actions then processing each one until either the batch * size is completed, or memory or time limits are reached, defined by @see $this->batch_limits_exceeded(). * * @param int $size The maximum number of actions to process in the batch. * @param string $context Optional identifer for the context in which this action is being processed, e.g. 'WP CLI' or 'WP Cron' * Generally, this should be capitalised and not localised as it's a proper noun. * @return int The number of actions processed. */ protected function do_batch( $size = 100, $context = '' ) { $claim = $this->store->stake_claim($size); $this->monitor->attach($claim); $processed_actions = 0; foreach ( $claim->get_actions() as $action_id ) { // bail if we lost the claim if ( ! in_array( $action_id, $this->store->find_actions_by_claim_id( $claim->get_id() ) ) ) { break; } $this->process_action( $action_id, $context ); $processed_actions++; if ( $this->batch_limits_exceeded( $processed_actions + $this->processed_actions_count ) ) { break; } } $this->store->release_claim($claim); $this->monitor->detach(); $this->clear_caches(); return $processed_actions; } /** * Flush the cache if possible (intended for use after a batch of actions has been processed). * * This is useful because running large batches can eat up memory and because invalid data can accrue in the * runtime cache, which may lead to unexpected results. */ protected function clear_caches() { /* * Calling wp_cache_flush_runtime() lets us clear the runtime cache without invalidating the external object * cache, so we will always prefer this method (as compared to calling wp_cache_flush()) when it is available. * * However, this function was only introduced in WordPress 6.0. Additionally, the preferred way of detecting if * it is supported changed in WordPress 6.1 so we use two different methods to decide if we should utilize it. */ $flushing_runtime_cache_explicitly_supported = function_exists( 'wp_cache_supports' ) && wp_cache_supports( 'flush_runtime' ); $flushing_runtime_cache_implicitly_supported = ! function_exists( 'wp_cache_supports' ) && function_exists( 'wp_cache_flush_runtime' ); if ( $flushing_runtime_cache_explicitly_supported || $flushing_runtime_cache_implicitly_supported ) { wp_cache_flush_runtime(); } elseif ( ! wp_using_ext_object_cache() /** * When an external object cache is in use, and when wp_cache_flush_runtime() is not available, then * normally the cache will not be flushed after processing a batch of actions (to avoid a performance * penalty for other processes). * * This filter makes it possible to override this behavior and always flush the cache, even if an external * object cache is in use. * * @since 1.0 * * @param bool $flush_cache If the cache should be flushed. */ || apply_filters( 'action_scheduler_queue_runner_flush_cache', false ) ) { wp_cache_flush(); } } public function add_wp_cron_schedule( $schedules ) { $schedules['every_minute'] = array( 'interval' => 60, // in seconds 'display' => __( 'Every minute', 'woocommerce' ), ); return $schedules; } } pro/libraries/action-scheduler/classes/ActionScheduler_Versions.php000064400000002357147600337620021702 0ustar00versions[$version_string]) ) { return FALSE; } $this->versions[$version_string] = $initialization_callback; return TRUE; } public function get_versions() { return $this->versions; } public function latest_version() { $keys = array_keys($this->versions); if ( empty($keys) ) { return false; } uasort( $keys, 'version_compare' ); return end($keys); } public function latest_version_callback() { $latest = $this->latest_version(); if ( empty($latest) || !isset($this->versions[$latest]) ) { return '__return_null'; } return $this->versions[$latest]; } /** * @return ActionScheduler_Versions * @codeCoverageIgnore */ public static function instance() { if ( empty(self::$instance) ) { self::$instance = new self(); } return self::$instance; } /** * @codeCoverageIgnore */ public static function initialize_latest_version() { $self = self::instance(); call_user_func($self->latest_version_callback()); } } pro/libraries/action-scheduler/classes/ActionScheduler_AdminView.php000064400000021433147600337620021751 0ustar00render(); } /** * Registers action-scheduler into WooCommerce > System status. * * @param array $tabs An associative array of tab key => label. * @return array $tabs An associative array of tab key => label, including Action Scheduler's tabs */ public function register_system_status_tab( array $tabs ) { $tabs['action-scheduler'] = __( 'Scheduled Actions', 'woocommerce' ); return $tabs; } /** * Include Action Scheduler's administration under the Tools menu. * * A menu under the Tools menu is important for backward compatibility (as that's * where it started), and also provides more convenient access than the WooCommerce * System Status page, and for sites where WooCommerce isn't active. */ public function register_menu() { $hook_suffix = add_submenu_page( 'tools.php', __( 'Scheduled Actions', 'woocommerce' ), __( 'Scheduled Actions', 'woocommerce' ), 'manage_options', 'action-scheduler', array( $this, 'render_admin_ui' ) ); add_action( 'load-' . $hook_suffix , array( $this, 'process_admin_ui' ) ); } /** * Triggers processing of any pending actions. */ public function process_admin_ui() { $this->get_list_table(); } /** * Renders the Admin UI */ public function render_admin_ui() { $table = $this->get_list_table(); $table->display_page(); } /** * Get the admin UI object and process any requested actions. * * @return ActionScheduler_ListTable */ protected function get_list_table() { if ( null === $this->list_table ) { $this->list_table = new ActionScheduler_ListTable( ActionScheduler::store(), ActionScheduler::logger(), ActionScheduler::runner() ); $this->list_table->process_actions(); } return $this->list_table; } /** * Action: admin_notices * * Maybe check past-due actions, and print notice. * * @uses $this->check_pastdue_actions() */ public function maybe_check_pastdue_actions() { # Filter to prevent checking actions (ex: inappropriate user). if ( ! apply_filters( 'action_scheduler_check_pastdue_actions', current_user_can( 'manage_options' ) ) ) { return; } # Get last check transient. $last_check = get_transient( 'action_scheduler_last_pastdue_actions_check' ); # If transient exists, we're within interval, so bail. if ( ! empty( $last_check ) ) { return; } # Perform the check. $this->check_pastdue_actions(); } /** * Check past-due actions, and print notice. * * @todo update $link_url to "Past-due" filter when released (see issue #510, PR #511) */ protected function check_pastdue_actions() { # Set thresholds. $threshold_seconds = ( int ) apply_filters( 'action_scheduler_pastdue_actions_seconds', DAY_IN_SECONDS ); $threshhold_min = ( int ) apply_filters( 'action_scheduler_pastdue_actions_min', 1 ); // Set fallback value for past-due actions count. $num_pastdue_actions = 0; // Allow third-parties to preempt the default check logic. $check = apply_filters( 'action_scheduler_pastdue_actions_check_pre', null ); // If no third-party preempted and there are no past-due actions, return early. if ( ! is_null( $check ) ) { return; } # Scheduled actions query arguments. $query_args = array( 'date' => as_get_datetime_object( time() - $threshold_seconds ), 'status' => ActionScheduler_Store::STATUS_PENDING, 'per_page' => $threshhold_min, ); # If no third-party preempted, run default check. if ( is_null( $check ) ) { $store = ActionScheduler_Store::instance(); $num_pastdue_actions = ( int ) $store->query_actions( $query_args, 'count' ); # Check if past-due actions count is greater than or equal to threshold. $check = ( $num_pastdue_actions >= $threshhold_min ); $check = ( bool ) apply_filters( 'action_scheduler_pastdue_actions_check', $check, $num_pastdue_actions, $threshold_seconds, $threshhold_min ); } # If check failed, set transient and abort. if ( ! boolval( $check ) ) { $interval = apply_filters( 'action_scheduler_pastdue_actions_check_interval', round( $threshold_seconds / 4 ), $threshold_seconds ); set_transient( 'action_scheduler_last_pastdue_actions_check', time(), $interval ); return; } $actions_url = add_query_arg( array( 'page' => 'action-scheduler', 'status' => 'past-due', 'order' => 'asc', ), admin_url( 'tools.php' ) ); # Print notice. echo '

            '; printf( _n( // translators: 1) is the number of affected actions, 2) is a link to an admin screen. 'Action Scheduler: %1$d past-due action found; something may be wrong. Read documentation »', 'Action Scheduler: %1$d past-due actions found; something may be wrong. Read documentation »', $num_pastdue_actions, 'woocommerce' ), $num_pastdue_actions, esc_attr( esc_url( $actions_url ) ) ); echo '

            '; # Facilitate third-parties to evaluate and print notices. do_action( 'action_scheduler_pastdue_actions_extra_notices', $query_args ); } /** * Provide more information about the screen and its data in the help tab. */ public function add_help_tabs() { $screen = get_current_screen(); if ( ! $screen || self::$screen_id != $screen->id ) { return; } $as_version = ActionScheduler_Versions::instance()->latest_version(); $screen->add_help_tab( array( 'id' => 'action_scheduler_about', 'title' => __( 'About', 'woocommerce' ), 'content' => '

            ' . sprintf( __( 'About Action Scheduler %s', 'woocommerce' ), $as_version ) . '

            ' . '

            ' . __( 'Action Scheduler is a scalable, traceable job queue for background processing large sets of actions. Action Scheduler works by triggering an action hook to run at some time in the future. Scheduled actions can also be scheduled to run on a recurring schedule.', 'woocommerce' ) . '

            ', ) ); $screen->add_help_tab( array( 'id' => 'action_scheduler_columns', 'title' => __( 'Columns', 'woocommerce' ), 'content' => '

            ' . __( 'Scheduled Action Columns', 'woocommerce' ) . '

            ' . '
              ' . sprintf( '
            • %1$s: %2$s
            • ', __( 'Hook', 'woocommerce' ), __( 'Name of the action hook that will be triggered.', 'woocommerce' ) ) . sprintf( '
            • %1$s: %2$s
            • ', __( 'Status', 'woocommerce' ), __( 'Action statuses are Pending, Complete, Canceled, Failed', 'woocommerce' ) ) . sprintf( '
            • %1$s: %2$s
            • ', __( 'Arguments', 'woocommerce' ), __( 'Optional data array passed to the action hook.', 'woocommerce' ) ) . sprintf( '
            • %1$s: %2$s
            • ', __( 'Group', 'woocommerce' ), __( 'Optional action group.', 'woocommerce' ) ) . sprintf( '
            • %1$s: %2$s
            • ', __( 'Recurrence', 'woocommerce' ), __( 'The action\'s schedule frequency.', 'woocommerce' ) ) . sprintf( '
            • %1$s: %2$s
            • ', __( 'Scheduled', 'woocommerce' ), __( 'The date/time the action is/was scheduled to run.', 'woocommerce' ) ) . sprintf( '
            • %1$s: %2$s
            • ', __( 'Log', 'woocommerce' ), __( 'Activity log for the action.', 'woocommerce' ) ) . '
            ', ) ); } } pro/libraries/action-scheduler/classes/ActionScheduler_AsyncRequest_QueueRunner.php000064400000004255147600337620025055 0ustar00store = $store; } /** * Handle async requests * * Run a queue, and maybe dispatch another async request to run another queue * if there are still pending actions after completing a queue in this request. */ protected function handle() { do_action( 'action_scheduler_run_queue', 'Async Request' ); // run a queue in the same way as WP Cron, but declare the Async Request context $sleep_seconds = $this->get_sleep_seconds(); if ( $sleep_seconds ) { sleep( $sleep_seconds ); } $this->maybe_dispatch(); } /** * If the async request runner is needed and allowed to run, dispatch a request. */ public function maybe_dispatch() { if ( ! $this->allow() ) { return; } $this->dispatch(); ActionScheduler_QueueRunner::instance()->unhook_dispatch_async_request(); } /** * Only allow async requests when needed. * * Also allow 3rd party code to disable running actions via async requests. */ protected function allow() { if ( ! has_action( 'action_scheduler_run_queue' ) || ActionScheduler::runner()->has_maximum_concurrent_batches() || ! $this->store->has_pending_actions_due() ) { $allow = false; } else { $allow = true; } return apply_filters( 'action_scheduler_allow_async_request_runner', $allow ); } /** * Chaining async requests can crash MySQL. A brief sleep call in PHP prevents that. */ protected function get_sleep_seconds() { return apply_filters( 'action_scheduler_async_request_sleep_seconds', 5, $this ); } } pro/libraries/action-scheduler/classes/ActionScheduler_LogEntry.php000064400000003344147600337620021632 0ustar00comment_type * to ActionScheduler_LogEntry::__construct(), goodness knows why, and the Follow-up Emails plugin * hard-codes loading its own version of ActionScheduler_wpCommentLogger with that out-dated method, * goodness knows why, so we need to guard against that here instead of using a DateTime type declaration * for the constructor's 3rd param of $date and causing a fatal error with older versions of FUE. */ if ( null !== $date && ! is_a( $date, 'DateTime' ) ) { _doing_it_wrong( __METHOD__, 'The third parameter must be a valid DateTime instance, or null.', '2.0.0' ); $date = null; } $this->action_id = $action_id; $this->message = $message; $this->date = $date ? $date : new Datetime; } /** * Returns the date when this log entry was created * * @return Datetime */ public function get_date() { return $this->date; } public function get_action_id() { return $this->action_id; } public function get_message() { return $this->message; } } pro/libraries/action-scheduler/deprecated/ActionScheduler_Store_Deprecated.php000064400000002040147600337620023736 0ustar00mark_failure( $action_id ); } /** * Add base hooks * * @since 2.2.6 */ protected static function hook() { _deprecated_function( __METHOD__, '3.0.0' ); } /** * Remove base hooks * * @since 2.2.6 */ protected static function unhook() { _deprecated_function( __METHOD__, '3.0.0' ); } /** * Get the site's local time. * * @deprecated 2.1.0 * @return DateTimeZone */ protected function get_local_timezone() { _deprecated_function( __FUNCTION__, '2.1.0', 'ActionScheduler_TimezoneHelper::set_local_timezone()' ); return ActionScheduler_TimezoneHelper::get_local_timezone(); } } pro/libraries/action-scheduler/deprecated/ActionScheduler_Abstract_QueueRunner_Deprecated.php000064400000001523147600337620026750 0ustar00 '' - the name of the action that will be triggered * 'args' => NULL - the args array that will be passed with the action * 'date' => NULL - the scheduled date of the action. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). Used in UTC timezone. * 'date_compare' => '<=' - operator for testing "date". accepted values are '!=', '>', '>=', '<', '<=', '=' * 'modified' => NULL - the date the action was last updated. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). Used in UTC timezone. * 'modified_compare' => '<=' - operator for testing "modified". accepted values are '!=', '>', '>=', '<', '<=', '=' * 'group' => '' - the group the action belongs to * 'status' => '' - ActionScheduler_Store::STATUS_COMPLETE or ActionScheduler_Store::STATUS_PENDING * 'claimed' => NULL - TRUE to find claimed actions, FALSE to find unclaimed actions, a string to find a specific claim ID * 'per_page' => 5 - Number of results to return * 'offset' => 0 * 'orderby' => 'date' - accepted values are 'hook', 'group', 'modified', or 'date' * 'order' => 'ASC' * @param string $return_format OBJECT, ARRAY_A, or ids * * @deprecated 2.1.0 * * @return array */ function wc_get_scheduled_actions( $args = array(), $return_format = OBJECT ) { _deprecated_function( __FUNCTION__, '2.1.0', 'as_get_scheduled_actions()' ); return as_get_scheduled_actions( $args, $return_format ); } pro/libraries/action-scheduler/deprecated/ActionScheduler_Schedule_Deprecated.php000064400000001477147600337620024413 0ustar00get_date(); $replacement_method = 'get_date()'; } else { $return_value = $this->get_next( $after ); $replacement_method = 'get_next( $after )'; } _deprecated_function( __METHOD__, '3.0.0', __CLASS__ . '::' . $replacement_method ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped return $return_value; } } pro/libraries/action-scheduler/deprecated/ActionScheduler_AdminView_Deprecated.php000064400000012507147600337620024536 0ustar00 * @link http://en.wikipedia.org/wiki/Cron */ class CronExpression { const MINUTE = 0; const HOUR = 1; const DAY = 2; const MONTH = 3; const WEEKDAY = 4; const YEAR = 5; /** * @var array CRON expression parts */ private $cronParts; /** * @var CronExpression_FieldFactory CRON field factory */ private $fieldFactory; /** * @var array Order in which to test of cron parts */ private static $order = array(self::YEAR, self::MONTH, self::DAY, self::WEEKDAY, self::HOUR, self::MINUTE); /** * Factory method to create a new CronExpression. * * @param string $expression The CRON expression to create. There are * several special predefined values which can be used to substitute the * CRON expression: * * @yearly, @annually) - Run once a year, midnight, Jan. 1 - 0 0 1 1 * * @monthly - Run once a month, midnight, first of month - 0 0 1 * * * @weekly - Run once a week, midnight on Sun - 0 0 * * 0 * @daily - Run once a day, midnight - 0 0 * * * * @hourly - Run once an hour, first minute - 0 * * * * * *@param CronExpression_FieldFactory $fieldFactory (optional) Field factory to use * * @return CronExpression */ public static function factory($expression, CronExpression_FieldFactory $fieldFactory = null) { $mappings = array( '@yearly' => '0 0 1 1 *', '@annually' => '0 0 1 1 *', '@monthly' => '0 0 1 * *', '@weekly' => '0 0 * * 0', '@daily' => '0 0 * * *', '@hourly' => '0 * * * *' ); if (isset($mappings[$expression])) { $expression = $mappings[$expression]; } return new self($expression, $fieldFactory ? $fieldFactory : new CronExpression_FieldFactory()); } /** * Parse a CRON expression * * @param string $expression CRON expression (e.g. '8 * * * *') * @param CronExpression_FieldFactory $fieldFactory Factory to create cron fields */ public function __construct($expression, CronExpression_FieldFactory $fieldFactory) { $this->fieldFactory = $fieldFactory; $this->setExpression($expression); } /** * Set or change the CRON expression * * @param string $value CRON expression (e.g. 8 * * * *) * * @return CronExpression * @throws InvalidArgumentException if not a valid CRON expression */ public function setExpression($value) { $this->cronParts = preg_split('/\s/', $value, -1, PREG_SPLIT_NO_EMPTY); if (count($this->cronParts) < 5) { throw new InvalidArgumentException( $value . ' is not a valid CRON expression' ); } foreach ($this->cronParts as $position => $part) { $this->setPart($position, $part); } return $this; } /** * Set part of the CRON expression * * @param int $position The position of the CRON expression to set * @param string $value The value to set * * @return CronExpression * @throws InvalidArgumentException if the value is not valid for the part */ public function setPart($position, $value) { if (!$this->fieldFactory->getField($position)->validate($value)) { throw new InvalidArgumentException( 'Invalid CRON field value ' . $value . ' as position ' . $position ); } $this->cronParts[$position] = $value; return $this; } /** * Get a next run date relative to the current date or a specific date * * @param string|DateTime $currentTime (optional) Relative calculation date * @param int $nth (optional) Number of matches to skip before returning a * matching next run date. 0, the default, will return the current * date and time if the next run date falls on the current date and * time. Setting this value to 1 will skip the first match and go to * the second match. Setting this value to 2 will skip the first 2 * matches and so on. * @param bool $allowCurrentDate (optional) Set to TRUE to return the * current date if it matches the cron expression * * @return DateTime * @throws RuntimeException on too many iterations */ public function getNextRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false) { return $this->getRunDate($currentTime, $nth, false, $allowCurrentDate); } /** * Get a previous run date relative to the current date or a specific date * * @param string|DateTime $currentTime (optional) Relative calculation date * @param int $nth (optional) Number of matches to skip before returning * @param bool $allowCurrentDate (optional) Set to TRUE to return the * current date if it matches the cron expression * * @return DateTime * @throws RuntimeException on too many iterations * @see CronExpression::getNextRunDate */ public function getPreviousRunDate($currentTime = 'now', $nth = 0, $allowCurrentDate = false) { return $this->getRunDate($currentTime, $nth, true, $allowCurrentDate); } /** * Get multiple run dates starting at the current date or a specific date * * @param int $total Set the total number of dates to calculate * @param string|DateTime $currentTime (optional) Relative calculation date * @param bool $invert (optional) Set to TRUE to retrieve previous dates * @param bool $allowCurrentDate (optional) Set to TRUE to return the * current date if it matches the cron expression * * @return array Returns an array of run dates */ public function getMultipleRunDates($total, $currentTime = 'now', $invert = false, $allowCurrentDate = false) { $matches = array(); for ($i = 0; $i < max(0, $total); $i++) { $matches[] = $this->getRunDate($currentTime, $i, $invert, $allowCurrentDate); } return $matches; } /** * Get all or part of the CRON expression * * @param string $part (optional) Specify the part to retrieve or NULL to * get the full cron schedule string. * * @return string|null Returns the CRON expression, a part of the * CRON expression, or NULL if the part was specified but not found */ public function getExpression($part = null) { if (null === $part) { return implode(' ', $this->cronParts); } elseif (array_key_exists($part, $this->cronParts)) { return $this->cronParts[$part]; } return null; } /** * Helper method to output the full expression. * * @return string Full CRON expression */ public function __toString() { return $this->getExpression(); } /** * Determine if the cron is due to run based on the current date or a * specific date. This method assumes that the current number of * seconds are irrelevant, and should be called once per minute. * * @param string|DateTime $currentTime (optional) Relative calculation date * * @return bool Returns TRUE if the cron is due to run or FALSE if not */ public function isDue($currentTime = 'now') { if ('now' === $currentTime) { $currentDate = date('Y-m-d H:i'); $currentTime = strtotime($currentDate); } elseif ($currentTime instanceof DateTime) { $currentDate = $currentTime->format('Y-m-d H:i'); $currentTime = strtotime($currentDate); } else { $currentTime = new DateTime($currentTime); $currentTime->setTime($currentTime->format('H'), $currentTime->format('i'), 0); $currentDate = $currentTime->format('Y-m-d H:i'); $currentTime = (int)($currentTime->getTimestamp()); } return $this->getNextRunDate($currentDate, 0, true)->getTimestamp() == $currentTime; } /** * Get the next or previous run date of the expression relative to a date * * @param string|DateTime $currentTime (optional) Relative calculation date * @param int $nth (optional) Number of matches to skip before returning * @param bool $invert (optional) Set to TRUE to go backwards in time * @param bool $allowCurrentDate (optional) Set to TRUE to return the * current date if it matches the cron expression * * @return DateTime * @throws RuntimeException on too many iterations */ protected function getRunDate($currentTime = null, $nth = 0, $invert = false, $allowCurrentDate = false) { if ($currentTime instanceof DateTime) { $currentDate = $currentTime; } else { $currentDate = new DateTime($currentTime ? $currentTime : 'now'); $currentDate->setTimezone(new DateTimeZone(date_default_timezone_get())); } $currentDate->setTime($currentDate->format('H'), $currentDate->format('i'), 0); $nextRun = clone $currentDate; $nth = (int) $nth; // Set a hard limit to bail on an impossible date for ($i = 0; $i < 1000; $i++) { foreach (self::$order as $position) { $part = $this->getExpression($position); if (null === $part) { continue; } $satisfied = false; // Get the field object used to validate this part $field = $this->fieldFactory->getField($position); // Check if this is singular or a list if (strpos($part, ',') === false) { $satisfied = $field->isSatisfiedBy($nextRun, $part); } else { foreach (array_map('trim', explode(',', $part)) as $listPart) { if ($field->isSatisfiedBy($nextRun, $listPart)) { $satisfied = true; break; } } } // If the field is not satisfied, then start over if (!$satisfied) { $field->increment($nextRun, $invert); continue 2; } } // Skip this match if needed if ((!$allowCurrentDate && $nextRun == $currentDate) || --$nth > -1) { $this->fieldFactory->getField(0)->increment($nextRun, $invert); continue; } return $nextRun; } // @codeCoverageIgnoreStart throw new RuntimeException('Impossible CRON expression'); // @codeCoverageIgnoreEnd } } pro/libraries/action-scheduler/lib/cron-expression/CronExpression_FieldFactory.php000064400000003321147600337620024611 0ustar00 * @link http://en.wikipedia.org/wiki/Cron */ class CronExpression_FieldFactory { /** * @var array Cache of instantiated fields */ private $fields = array(); /** * Get an instance of a field object for a cron expression position * * @param int $position CRON expression position value to retrieve * * @return CronExpression_FieldInterface * @throws InvalidArgumentException if a position is not valid */ public function getField($position) { if (!isset($this->fields[$position])) { switch ($position) { case 0: $this->fields[$position] = new CronExpression_MinutesField(); break; case 1: $this->fields[$position] = new CronExpression_HoursField(); break; case 2: $this->fields[$position] = new CronExpression_DayOfMonthField(); break; case 3: $this->fields[$position] = new CronExpression_MonthField(); break; case 4: $this->fields[$position] = new CronExpression_DayOfWeekField(); break; case 5: $this->fields[$position] = new CronExpression_YearField(); break; default: throw new InvalidArgumentException( $position . ' is not a valid position' ); } } return $this->fields[$position]; } } pro/libraries/action-scheduler/lib/cron-expression/CronExpression_YearField.php000064400000001651147600337620024106 0ustar00 */ class CronExpression_YearField extends CronExpression_AbstractField { /** * {@inheritdoc} */ public function isSatisfiedBy(DateTime $date, $value) { return $this->isSatisfied($date->format('Y'), $value); } /** * {@inheritdoc} */ public function increment(DateTime $date, $invert = false) { if ($invert) { $date->modify('-1 year'); $date->setDate($date->format('Y'), 12, 31); $date->setTime(23, 59, 0); } else { $date->modify('+1 year'); $date->setDate($date->format('Y'), 1, 1); $date->setTime(0, 0, 0); } return $this; } /** * {@inheritdoc} */ public function validate($value) { return (bool) preg_match('/[\*,\/\-0-9]+/', $value); } } pro/libraries/action-scheduler/lib/cron-expression/LICENSE000064400000002112147600337620017466 0ustar00Copyright (c) 2011 Michael Dowling and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. pro/libraries/action-scheduler/lib/cron-expression/CronExpression_DayOfWeekField.php000064400000007521147600337620025026 0ustar00 */ class CronExpression_DayOfWeekField extends CronExpression_AbstractField { /** * {@inheritdoc} */ public function isSatisfiedBy(DateTime $date, $value) { if ($value == '?') { return true; } // Convert text day of the week values to integers $value = str_ireplace( array('SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'), range(0, 6), $value ); $currentYear = $date->format('Y'); $currentMonth = $date->format('m'); $lastDayOfMonth = $date->format('t'); // Find out if this is the last specific weekday of the month if (strpos($value, 'L')) { $weekday = str_replace('7', '0', substr($value, 0, strpos($value, 'L'))); $tdate = clone $date; $tdate->setDate($currentYear, $currentMonth, $lastDayOfMonth); while ($tdate->format('w') != $weekday) { $tdate->setDate($currentYear, $currentMonth, --$lastDayOfMonth); } return $date->format('j') == $lastDayOfMonth; } // Handle # hash tokens if (strpos($value, '#')) { list($weekday, $nth) = explode('#', $value); // Validate the hash fields if ($weekday < 1 || $weekday > 5) { throw new InvalidArgumentException("Weekday must be a value between 1 and 5. {$weekday} given"); } if ($nth > 5) { throw new InvalidArgumentException('There are never more than 5 of a given weekday in a month'); } // The current weekday must match the targeted weekday to proceed if ($date->format('N') != $weekday) { return false; } $tdate = clone $date; $tdate->setDate($currentYear, $currentMonth, 1); $dayCount = 0; $currentDay = 1; while ($currentDay < $lastDayOfMonth + 1) { if ($tdate->format('N') == $weekday) { if (++$dayCount >= $nth) { break; } } $tdate->setDate($currentYear, $currentMonth, ++$currentDay); } return $date->format('j') == $currentDay; } // Handle day of the week values if (strpos($value, '-')) { $parts = explode('-', $value); if ($parts[0] == '7') { $parts[0] = '0'; } elseif ($parts[1] == '0') { $parts[1] = '7'; } $value = implode('-', $parts); } // Test to see which Sunday to use -- 0 == 7 == Sunday $format = in_array(7, str_split($value)) ? 'N' : 'w'; $fieldValue = $date->format($format); return $this->isSatisfied($fieldValue, $value); } /** * {@inheritdoc} */ public function increment(DateTime $date, $invert = false) { if ($invert) { $date->modify('-1 day'); $date->setTime(23, 59, 0); } else { $date->modify('+1 day'); $date->setTime(0, 0, 0); } return $this; } /** * {@inheritdoc} */ public function validate($value) { return (bool) preg_match('/[\*,\/\-0-9A-Z]+/', $value); } } pro/libraries/action-scheduler/lib/cron-expression/CronExpression_FieldInterface.php000064400000002162147600337620025104 0ustar00 */ interface CronExpression_FieldInterface { /** * Check if the respective value of a DateTime field satisfies a CRON exp * * @param DateTime $date DateTime object to check * @param string $value CRON expression to test against * * @return bool Returns TRUE if satisfied, FALSE otherwise */ public function isSatisfiedBy(DateTime $date, $value); /** * When a CRON expression is not satisfied, this method is used to increment * or decrement a DateTime object by the unit of the cron field * * @param DateTime $date DateTime object to change * @param bool $invert (optional) Set to TRUE to decrement * * @return CronExpression_FieldInterface */ public function increment(DateTime $date, $invert = false); /** * Validates a CRON expression for a given field * * @param string $value CRON expression value to validate * * @return bool Returns TRUE if valid, FALSE otherwise */ public function validate($value); } pro/libraries/action-scheduler/lib/cron-expression/CronExpression_MinutesField.php000064400000001371147600337620024631 0ustar00 */ class CronExpression_MinutesField extends CronExpression_AbstractField { /** * {@inheritdoc} */ public function isSatisfiedBy(DateTime $date, $value) { return $this->isSatisfied($date->format('i'), $value); } /** * {@inheritdoc} */ public function increment(DateTime $date, $invert = false) { if ($invert) { $date->modify('-1 minute'); } else { $date->modify('+1 minute'); } return $this; } /** * {@inheritdoc} */ public function validate($value) { return (bool) preg_match('/[\*,\/\-0-9]+/', $value); } } pro/libraries/action-scheduler/lib/cron-expression/CronExpression_HoursField.php000064400000002205147600337620024302 0ustar00 */ class CronExpression_HoursField extends CronExpression_AbstractField { /** * {@inheritdoc} */ public function isSatisfiedBy(DateTime $date, $value) { return $this->isSatisfied($date->format('H'), $value); } /** * {@inheritdoc} */ public function increment(DateTime $date, $invert = false) { // Change timezone to UTC temporarily. This will // allow us to go back or forwards and hour even // if DST will be changed between the hours. $timezone = $date->getTimezone(); $date->setTimezone(new DateTimeZone('UTC')); if ($invert) { $date->modify('-1 hour'); $date->setTime($date->format('H'), 59); } else { $date->modify('+1 hour'); $date->setTime($date->format('H'), 0); } $date->setTimezone($timezone); return $this; } /** * {@inheritdoc} */ public function validate($value) { return (bool) preg_match('/[\*,\/\-0-9]+/', $value); } } pro/libraries/action-scheduler/lib/cron-expression/CronExpression_MonthField.php000064400000002567147600337620024302 0ustar00 */ class CronExpression_MonthField extends CronExpression_AbstractField { /** * {@inheritdoc} */ public function isSatisfiedBy(DateTime $date, $value) { // Convert text month values to integers $value = str_ireplace( array( 'JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC' ), range(1, 12), $value ); return $this->isSatisfied($date->format('m'), $value); } /** * {@inheritdoc} */ public function increment(DateTime $date, $invert = false) { if ($invert) { // $date->modify('last day of previous month'); // remove for php 5.2 compat $date->modify('previous month'); $date->modify($date->format('Y-m-t')); $date->setTime(23, 59); } else { //$date->modify('first day of next month'); // remove for php 5.2 compat $date->modify('next month'); $date->modify($date->format('Y-m-01')); $date->setTime(0, 0); } return $this; } /** * {@inheritdoc} */ public function validate($value) { return (bool) preg_match('/[\*,\/\-0-9A-Z]+/', $value); } } pro/libraries/action-scheduler/lib/cron-expression/CronExpression_DayOfMonthField.php000064400000007014147600337620025215 0ustar00 */ class CronExpression_DayOfMonthField extends CronExpression_AbstractField { /** * Get the nearest day of the week for a given day in a month * * @param int $currentYear Current year * @param int $currentMonth Current month * @param int $targetDay Target day of the month * * @return DateTime Returns the nearest date */ private static function getNearestWeekday($currentYear, $currentMonth, $targetDay) { $tday = str_pad($targetDay, 2, '0', STR_PAD_LEFT); $target = new DateTime("$currentYear-$currentMonth-$tday"); $currentWeekday = (int) $target->format('N'); if ($currentWeekday < 6) { return $target; } $lastDayOfMonth = $target->format('t'); foreach (array(-1, 1, -2, 2) as $i) { $adjusted = $targetDay + $i; if ($adjusted > 0 && $adjusted <= $lastDayOfMonth) { $target->setDate($currentYear, $currentMonth, $adjusted); if ($target->format('N') < 6 && $target->format('m') == $currentMonth) { return $target; } } } } /** * {@inheritdoc} */ public function isSatisfiedBy(DateTime $date, $value) { // ? states that the field value is to be skipped if ($value == '?') { return true; } $fieldValue = $date->format('d'); // Check to see if this is the last day of the month if ($value == 'L') { return $fieldValue == $date->format('t'); } // Check to see if this is the nearest weekday to a particular value if (strpos($value, 'W')) { // Parse the target day $targetDay = substr($value, 0, strpos($value, 'W')); // Find out if the current day is the nearest day of the week return $date->format('j') == self::getNearestWeekday( $date->format('Y'), $date->format('m'), $targetDay )->format('j'); } return $this->isSatisfied($date->format('d'), $value); } /** * {@inheritdoc} */ public function increment(DateTime $date, $invert = false) { if ($invert) { $date->modify('previous day'); $date->setTime(23, 59); } else { $date->modify('next day'); $date->setTime(0, 0); } return $this; } /** * {@inheritdoc} */ public function validate($value) { return (bool) preg_match('/[\*,\/\-\?LW0-9A-Za-z]+/', $value); } } pro/libraries/action-scheduler/lib/cron-expression/CronExpression_AbstractField.php000064400000005020147600337620024743 0ustar00 */ abstract class CronExpression_AbstractField implements CronExpression_FieldInterface { /** * Check to see if a field is satisfied by a value * * @param string $dateValue Date value to check * @param string $value Value to test * * @return bool */ public function isSatisfied($dateValue, $value) { if ($this->isIncrementsOfRanges($value)) { return $this->isInIncrementsOfRanges($dateValue, $value); } elseif ($this->isRange($value)) { return $this->isInRange($dateValue, $value); } return $value == '*' || $dateValue == $value; } /** * Check if a value is a range * * @param string $value Value to test * * @return bool */ public function isRange($value) { return strpos($value, '-') !== false; } /** * Check if a value is an increments of ranges * * @param string $value Value to test * * @return bool */ public function isIncrementsOfRanges($value) { return strpos($value, '/') !== false; } /** * Test if a value is within a range * * @param string $dateValue Set date value * @param string $value Value to test * * @return bool */ public function isInRange($dateValue, $value) { $parts = array_map('trim', explode('-', $value, 2)); return $dateValue >= $parts[0] && $dateValue <= $parts[1]; } /** * Test if a value is within an increments of ranges (offset[-to]/step size) * * @param string $dateValue Set date value * @param string $value Value to test * * @return bool */ public function isInIncrementsOfRanges($dateValue, $value) { $parts = array_map('trim', explode('/', $value, 2)); $stepSize = isset($parts[1]) ? $parts[1] : 0; if ($parts[0] == '*' || $parts[0] === '0') { return (int) $dateValue % $stepSize == 0; } $range = explode('-', $parts[0], 2); $offset = $range[0]; $to = isset($range[1]) ? $range[1] : $dateValue; // Ensure that the date value is within the range if ($dateValue < $offset || $dateValue > $to) { return false; } for ($i = $offset; $i <= $to; $i+= $stepSize) { if ($i == $dateValue) { return true; } } return false; } } pro/libraries/action-scheduler/lib/WP_Async_Request.php000064400000007340147600337620017237 0ustar00identifier = $this->prefix . '_' . $this->action; add_action( 'wp_ajax_' . $this->identifier, array( $this, 'maybe_handle' ) ); add_action( 'wp_ajax_nopriv_' . $this->identifier, array( $this, 'maybe_handle' ) ); } /** * Set data used during the request * * @param array $data Data. * * @return $this */ public function data( $data ) { $this->data = $data; return $this; } /** * Dispatch the async request * * @return array|WP_Error */ public function dispatch() { $url = add_query_arg( $this->get_query_args(), $this->get_query_url() ); $args = $this->get_post_args(); return wp_remote_post( esc_url_raw( $url ), $args ); } /** * Get query args * * @return array */ protected function get_query_args() { if ( property_exists( $this, 'query_args' ) ) { return $this->query_args; } $args = array( 'action' => $this->identifier, 'nonce' => wp_create_nonce( $this->identifier ), ); /** * Filters the post arguments used during an async request. * * @param array $url */ return apply_filters( $this->identifier . '_query_args', $args ); } /** * Get query URL * * @return string */ protected function get_query_url() { if ( property_exists( $this, 'query_url' ) ) { return $this->query_url; } $url = admin_url( 'admin-ajax.php' ); /** * Filters the post arguments used during an async request. * * @param string $url */ return apply_filters( $this->identifier . '_query_url', $url ); } /** * Get post args * * @return array */ protected function get_post_args() { if ( property_exists( $this, 'post_args' ) ) { return $this->post_args; } $args = array( 'timeout' => 0.01, 'blocking' => false, 'body' => $this->data, 'cookies' => $_COOKIE, 'sslverify' => apply_filters( 'https_local_ssl_verify', false ), ); /** * Filters the post arguments used during an async request. * * @param array $args */ return apply_filters( $this->identifier . '_post_args', $args ); } /** * Maybe handle * * Check for correct nonce and pass to handler. */ public function maybe_handle() { // Don't lock up other requests while processing session_write_close(); check_ajax_referer( $this->identifier, 'nonce' ); $this->handle(); wp_die(); } /** * Handle * * Override this method to perform any actions required * during the async request. */ abstract protected function handle(); } } pro/libraries/action-scheduler/functions.php000064400000043640147600337620015311 0ustar00create( array( 'type' => 'async', 'hook' => $hook, 'arguments' => $args, 'group' => $group, 'unique' => $unique, 'priority' => $priority, ) ); } /** * Schedule an action to run one time * * @param int $timestamp When the job will run. * @param string $hook The hook to trigger. * @param array $args Arguments to pass when the hook triggers. * @param string $group The group to assign this job to. * @param bool $unique Whether the action should be unique. * @param int $priority Lower values take precedence over higher values. Defaults to 10, with acceptable values falling in the range 0-255. * * @return int The action ID. */ function as_schedule_single_action( $timestamp, $hook, $args = array(), $group = '', $unique = false, $priority = 10 ) { if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { return 0; } /** * Provides an opportunity to short-circuit the default process for enqueuing single * actions. * * Returning a value other than null from the filter will short-circuit the normal * process. The expectation in such a scenario is that callbacks will return an integer * representing the scheduled action ID (scheduled using some alternative process) or else * zero. * * @param int|null $pre_option The value to return instead of the option value. * @param int $timestamp When the action will run. * @param string $hook Action hook. * @param array $args Action arguments. * @param string $group Action group. * @param int $priorities Action priority. */ $pre = apply_filters( 'pre_as_schedule_single_action', null, $timestamp, $hook, $args, $group, $priority ); if ( null !== $pre ) { return is_int( $pre ) ? $pre : 0; } return ActionScheduler::factory()->create( array( 'type' => 'single', 'hook' => $hook, 'arguments' => $args, 'when' => $timestamp, 'group' => $group, 'unique' => $unique, 'priority' => $priority, ) ); } /** * Schedule a recurring action * * @param int $timestamp When the first instance of the job will run. * @param int $interval_in_seconds How long to wait between runs. * @param string $hook The hook to trigger. * @param array $args Arguments to pass when the hook triggers. * @param string $group The group to assign this job to. * @param bool $unique Whether the action should be unique. * @param int $priority Lower values take precedence over higher values. Defaults to 10, with acceptable values falling in the range 0-255. * * @return int The action ID. */ function as_schedule_recurring_action( $timestamp, $interval_in_seconds, $hook, $args = array(), $group = '', $unique = false, $priority = 10 ) { if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { return 0; } $interval = (int) $interval_in_seconds; // We expect an integer and allow it to be passed using float and string types, but otherwise // should reject unexpected values. if ( ! is_numeric( $interval_in_seconds ) || $interval_in_seconds != $interval ) { _doing_it_wrong( __METHOD__, sprintf( /* translators: 1: provided value 2: provided type. */ esc_html__( 'An integer was expected but "%1$s" (%2$s) was received.', 'woocommerce' ), esc_html( $interval_in_seconds ), esc_html( gettype( $interval_in_seconds ) ) ), '3.6.0' ); return 0; } /** * Provides an opportunity to short-circuit the default process for enqueuing recurring * actions. * * Returning a value other than null from the filter will short-circuit the normal * process. The expectation in such a scenario is that callbacks will return an integer * representing the scheduled action ID (scheduled using some alternative process) or else * zero. * * @param int|null $pre_option The value to return instead of the option value. * @param int $timestamp When the action will run. * @param int $interval_in_seconds How long to wait between runs. * @param string $hook Action hook. * @param array $args Action arguments. * @param string $group Action group. * @param int $priority Action priority. */ $pre = apply_filters( 'pre_as_schedule_recurring_action', null, $timestamp, $interval_in_seconds, $hook, $args, $group, $priority ); if ( null !== $pre ) { return is_int( $pre ) ? $pre : 0; } return ActionScheduler::factory()->create( array( 'type' => 'recurring', 'hook' => $hook, 'arguments' => $args, 'when' => $timestamp, 'pattern' => $interval_in_seconds, 'group' => $group, 'unique' => $unique, 'priority' => $priority, ) ); } /** * Schedule an action that recurs on a cron-like schedule. * * @param int $timestamp The first instance of the action will be scheduled * to run at a time calculated after this timestamp matching the cron * expression. This can be used to delay the first instance of the action. * @param string $schedule A cron-link schedule string. * @see http://en.wikipedia.org/wiki/Cron * * * * * * * * ┬ ┬ ┬ ┬ ┬ ┬ * | | | | | | * | | | | | + year [optional] * | | | | +----- day of week (0 - 7) (Sunday=0 or 7) * | | | +---------- month (1 - 12) * | | +--------------- day of month (1 - 31) * | +-------------------- hour (0 - 23) * +------------------------- min (0 - 59) * @param string $hook The hook to trigger. * @param array $args Arguments to pass when the hook triggers. * @param string $group The group to assign this job to. * @param bool $unique Whether the action should be unique. * @param int $priority Lower values take precedence over higher values. Defaults to 10, with acceptable values falling in the range 0-255. * * @return int The action ID. */ function as_schedule_cron_action( $timestamp, $schedule, $hook, $args = array(), $group = '', $unique = false, $priority = 10 ) { if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { return 0; } /** * Provides an opportunity to short-circuit the default process for enqueuing cron * actions. * * Returning a value other than null from the filter will short-circuit the normal * process. The expectation in such a scenario is that callbacks will return an integer * representing the scheduled action ID (scheduled using some alternative process) or else * zero. * * @param int|null $pre_option The value to return instead of the option value. * @param int $timestamp When the action will run. * @param string $schedule Cron-like schedule string. * @param string $hook Action hook. * @param array $args Action arguments. * @param string $group Action group. * @param int $priority Action priority. */ $pre = apply_filters( 'pre_as_schedule_cron_action', null, $timestamp, $schedule, $hook, $args, $group, $priority ); if ( null !== $pre ) { return is_int( $pre ) ? $pre : 0; } return ActionScheduler::factory()->create( array( 'type' => 'cron', 'hook' => $hook, 'arguments' => $args, 'when' => $timestamp, 'pattern' => $schedule, 'group' => $group, 'unique' => $unique, 'priority' => $priority, ) ); } /** * Cancel the next occurrence of a scheduled action. * * While only the next instance of a recurring or cron action is unscheduled by this method, that will also prevent * all future instances of that recurring or cron action from being run. Recurring and cron actions are scheduled in * a sequence instead of all being scheduled at once. Each successive occurrence of a recurring action is scheduled * only after the former action is run. If the next instance is never run, because it's unscheduled by this function, * then the following instance will never be scheduled (or exist), which is effectively the same as being unscheduled * by this method also. * * @param string $hook The hook that the job will trigger. * @param array $args Args that would have been passed to the job. * @param string $group The group the job is assigned to. * * @return int|null The scheduled action ID if a scheduled action was found, or null if no matching action found. */ function as_unschedule_action( $hook, $args = array(), $group = '' ) { if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { return 0; } $params = array( 'hook' => $hook, 'status' => ActionScheduler_Store::STATUS_PENDING, 'orderby' => 'date', 'order' => 'ASC', 'group' => $group, ); if ( is_array( $args ) ) { $params['args'] = $args; } $action_id = ActionScheduler::store()->query_action( $params ); if ( $action_id ) { try { ActionScheduler::store()->cancel_action( $action_id ); } catch ( Exception $exception ) { ActionScheduler::logger()->log( $action_id, sprintf( /* translators: %s is the name of the hook to be cancelled. */ __( 'Caught exception while cancelling action: %s', 'woocommerce' ), esc_attr( $hook ) ) ); $action_id = null; } } return $action_id; } /** * Cancel all occurrences of a scheduled action. * * @param string $hook The hook that the job will trigger. * @param array $args Args that would have been passed to the job. * @param string $group The group the job is assigned to. */ function as_unschedule_all_actions( $hook, $args = array(), $group = '' ) { if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { return; } if ( empty( $args ) ) { if ( ! empty( $hook ) && empty( $group ) ) { ActionScheduler_Store::instance()->cancel_actions_by_hook( $hook ); return; } if ( ! empty( $group ) && empty( $hook ) ) { ActionScheduler_Store::instance()->cancel_actions_by_group( $group ); return; } } do { $unscheduled_action = as_unschedule_action( $hook, $args, $group ); } while ( ! empty( $unscheduled_action ) ); } /** * Check if there is an existing action in the queue with a given hook, args and group combination. * * An action in the queue could be pending, in-progress or async. If the is pending for a time in * future, its scheduled date will be returned as a timestamp. If it is currently being run, or an * async action sitting in the queue waiting to be processed, in which case boolean true will be * returned. Or there may be no async, in-progress or pending action for this hook, in which case, * boolean false will be the return value. * * @param string $hook Name of the hook to search for. * @param array $args Arguments of the action to be searched. * @param string $group Group of the action to be searched. * * @return int|bool The timestamp for the next occurrence of a pending scheduled action, true for an async or in-progress action or false if there is no matching action. */ function as_next_scheduled_action( $hook, $args = null, $group = '' ) { if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { return false; } $params = array( 'hook' => $hook, 'orderby' => 'date', 'order' => 'ASC', 'group' => $group, ); if ( is_array( $args ) ) { $params['args'] = $args; } $params['status'] = ActionScheduler_Store::STATUS_RUNNING; $action_id = ActionScheduler::store()->query_action( $params ); if ( $action_id ) { return true; } $params['status'] = ActionScheduler_Store::STATUS_PENDING; $action_id = ActionScheduler::store()->query_action( $params ); if ( null === $action_id ) { return false; } $action = ActionScheduler::store()->fetch_action( $action_id ); $scheduled_date = $action->get_schedule()->get_date(); if ( $scheduled_date ) { return (int) $scheduled_date->format( 'U' ); } elseif ( null === $scheduled_date ) { // pending async action with NullSchedule. return true; } return false; } /** * Check if there is a scheduled action in the queue but more efficiently than as_next_scheduled_action(). * * It's recommended to use this function when you need to know whether a specific action is currently scheduled * (pending or in-progress). * * @since 3.3.0 * * @param string $hook The hook of the action. * @param array $args Args that have been passed to the action. Null will matches any args. * @param string $group The group the job is assigned to. * * @return bool True if a matching action is pending or in-progress, false otherwise. */ function as_has_scheduled_action( $hook, $args = null, $group = '' ) { if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { return false; } $query_args = array( 'hook' => $hook, 'status' => array( ActionScheduler_Store::STATUS_RUNNING, ActionScheduler_Store::STATUS_PENDING ), 'group' => $group, 'orderby' => 'none', ); if ( null !== $args ) { $query_args['args'] = $args; } $action_id = ActionScheduler::store()->query_action( $query_args ); return null !== $action_id; } /** * Find scheduled actions * * @param array $args Possible arguments, with their default values. * 'hook' => '' - the name of the action that will be triggered. * 'args' => NULL - the args array that will be passed with the action. * 'date' => NULL - the scheduled date of the action. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). Used in UTC timezone. * 'date_compare' => '<=' - operator for testing "date". accepted values are '!=', '>', '>=', '<', '<=', '='. * 'modified' => NULL - the date the action was last updated. Expects a DateTime object, a unix timestamp, or a string that can parsed with strtotime(). Used in UTC timezone. * 'modified_compare' => '<=' - operator for testing "modified". accepted values are '!=', '>', '>=', '<', '<=', '='. * 'group' => '' - the group the action belongs to. * 'status' => '' - ActionScheduler_Store::STATUS_COMPLETE or ActionScheduler_Store::STATUS_PENDING. * 'claimed' => NULL - TRUE to find claimed actions, FALSE to find unclaimed actions, a string to find a specific claim ID. * 'per_page' => 5 - Number of results to return. * 'offset' => 0. * 'orderby' => 'date' - accepted values are 'hook', 'group', 'modified', 'date' or 'none'. * 'order' => 'ASC'. * * @param string $return_format OBJECT, ARRAY_A, or ids. * * @return array */ function as_get_scheduled_actions( $args = array(), $return_format = OBJECT ) { if ( ! ActionScheduler::is_initialized( __FUNCTION__ ) ) { return array(); } $store = ActionScheduler::store(); foreach ( array( 'date', 'modified' ) as $key ) { if ( isset( $args[ $key ] ) ) { $args[ $key ] = as_get_datetime_object( $args[ $key ] ); } } $ids = $store->query_actions( $args ); if ( 'ids' === $return_format || 'int' === $return_format ) { return $ids; } $actions = array(); foreach ( $ids as $action_id ) { $actions[ $action_id ] = $store->fetch_action( $action_id ); } if ( ARRAY_A == $return_format ) { foreach ( $actions as $action_id => $action_object ) { $actions[ $action_id ] = get_object_vars( $action_object ); } } return $actions; } /** * Helper function to create an instance of DateTime based on a given * string and timezone. By default, will return the current date/time * in the UTC timezone. * * Needed because new DateTime() called without an explicit timezone * will create a date/time in PHP's timezone, but we need to have * assurance that a date/time uses the right timezone (which we almost * always want to be UTC), which means we need to always include the * timezone when instantiating datetimes rather than leaving it up to * the PHP default. * * @param mixed $date_string A date/time string. Valid formats are explained in http://php.net/manual/en/datetime.formats.php. * @param string $timezone A timezone identifier, like UTC or Europe/Lisbon. The list of valid identifiers is available http://php.net/manual/en/timezones.php. * * @return ActionScheduler_DateTime */ function as_get_datetime_object( $date_string = null, $timezone = 'UTC' ) { if ( is_object( $date_string ) && $date_string instanceof DateTime ) { $date = new ActionScheduler_DateTime( $date_string->format( 'Y-m-d H:i:s' ), new DateTimeZone( $timezone ) ); } elseif ( is_numeric( $date_string ) ) { $date = new ActionScheduler_DateTime( '@' . $date_string, new DateTimeZone( $timezone ) ); } else { $date = new ActionScheduler_DateTime( null === $date_string ? 'now' : $date_string, new DateTimeZone( $timezone ) ); } return $date; } pro/libraries/action-scheduler/license.txt000064400000104515147600337620014752 0ustar00 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . pro/libraries/action-scheduler/action-scheduler.php000064400000005431147600337620016526 0ustar00. * * @package ActionScheduler */ if ( ! function_exists( 'action_scheduler_register_3_dot_6_dot_2' ) && function_exists( 'add_action' ) ) { // WRCS: DEFINED_VERSION. if ( ! class_exists( 'ActionScheduler_Versions', false ) ) { require_once __DIR__ . '/classes/ActionScheduler_Versions.php'; add_action( 'plugins_loaded', array( 'ActionScheduler_Versions', 'initialize_latest_version' ), 1, 0 ); } add_action( 'plugins_loaded', 'action_scheduler_register_3_dot_6_dot_2', 0, 0 ); // WRCS: DEFINED_VERSION. /** * Registers this version of Action Scheduler. */ function action_scheduler_register_3_dot_6_dot_2() { // WRCS: DEFINED_VERSION. $versions = ActionScheduler_Versions::instance(); $versions->register( '3.6.2', 'action_scheduler_initialize_3_dot_6_dot_2' ); // WRCS: DEFINED_VERSION. } /** * Initializes this version of Action Scheduler. */ function action_scheduler_initialize_3_dot_6_dot_2() { // WRCS: DEFINED_VERSION. // A final safety check is required even here, because historic versions of Action Scheduler // followed a different pattern (in some unusual cases, we could reach this point and the // ActionScheduler class is already defined—so we need to guard against that). if ( ! class_exists( 'ActionScheduler', false ) ) { require_once __DIR__ . '/classes/abstracts/ActionScheduler.php'; ActionScheduler::init( __FILE__ ); } } // Support usage in themes - load this version if no plugin has loaded a version yet. if ( did_action( 'plugins_loaded' ) && ! doing_action( 'plugins_loaded' ) && ! class_exists( 'ActionScheduler', false ) ) { action_scheduler_initialize_3_dot_6_dot_2(); // WRCS: DEFINED_VERSION. do_action( 'action_scheduler_pre_theme_init' ); ActionScheduler_Versions::initialize_latest_version(); } } pro/libraries/action-scheduler/readme.txt000064400000020471147600337620014563 0ustar00=== Action Scheduler === Contributors: Automattic, wpmuguru, claudiosanches, peterfabian1000, vedjain, jamosova, obliviousharmony, konamiman, sadowski, royho, barryhughes-1 Tags: scheduler, cron Stable tag: 3.6.2 License: GPLv3 Tested up to: 6.3 Action Scheduler - Job Queue for WordPress == Description == Action Scheduler is a scalable, traceable job queue for background processing large sets of actions in WordPress. It's specially designed to be distributed in WordPress plugins. Action Scheduler works by triggering an action hook to run at some time in the future. Each hook can be scheduled with unique data, to allow callbacks to perform operations on that data. The hook can also be scheduled to run on one or more occassions. Think of it like an extension to `do_action()` which adds the ability to delay and repeat a hook. ## Battle-Tested Background Processing Every month, Action Scheduler processes millions of payments for [Subscriptions](https://woocommerce.com/products/woocommerce-subscriptions/), webhooks for [WooCommerce](https://wordpress.org/plugins/woocommerce/), as well as emails and other events for a range of other plugins. It's been seen on live sites processing queues in excess of 50,000 jobs and doing resource intensive operations, like processing payments and creating orders, at a sustained rate of over 10,000 / hour without negatively impacting normal site operations. This is all on infrastructure and WordPress sites outside the control of the plugin author. If your plugin needs background processing, especially of large sets of tasks, Action Scheduler can help. ## Learn More To learn more about how to Action Scheduler works, and how to use it in your plugin, check out the docs on [ActionScheduler.org](https://actionscheduler.org). There you will find: * [Usage guide](https://actionscheduler.org/usage/): instructions on installing and using Action Scheduler * [WP CLI guide](https://actionscheduler.org/wp-cli/): instructions on running Action Scheduler at scale via WP CLI * [API Reference](https://actionscheduler.org/api/): complete reference guide for all API functions * [Administration Guide](https://actionscheduler.org/admin/): guide to managing scheduled actions via the administration screen * [Guide to Background Processing at Scale](https://actionscheduler.org/perf/): instructions for running Action Scheduler at scale via the default WP Cron queue runner ## Credits Action Scheduler is developed and maintained by [Automattic](http://automattic.com/) with significant early development completed by [Flightless](https://flightless.us/). Collaboration is cool. We'd love to work with you to improve Action Scheduler. [Pull Requests](https://github.com/woocommerce/action-scheduler/pulls) welcome. == Changelog == = 3.6.2 - 2023-08-09 = * Add guidance about passing arguments. * Atomic option locking. * Improve bulk delete handling. * Include database error in the exception message. * Tweak - WP 6.3 compatibility. = 3.6.1 - 2023-06-14 = * Document new optional `$priority` arg for various API functions. * Document the new `--exclude-groups` WP CLI option. * Document the new `action_scheduler_init` hook. * Ensure actions within each claim are executed in the expected order. * Fix incorrect text domain. * Remove SHOW TABLES usage when checking if tables exist. = 3.6.0 - 2023-05-10 = * Add $unique parameter to function signatures. * Add a cast-to-int for extra safety before forming new DateTime object. * Add a hook allowing exceptions for consistently failing recurring actions. * Add action priorities. * Add init hook. * Always raise the time limit. * Bump minimatch from 3.0.4 to 3.0.8. * Bump yaml from 2.2.1 to 2.2.2. * Defensive coding relating to gaps in declared schedule types. * Do not process an action if it cannot be set to `in-progress`. * Filter view labels (status names) should be translatable | #919. * Fix WPCLI progress messages. * Improve data-store initialization flow. * Improve error handling across all supported PHP versions. * Improve logic for flushing the runtime cache. * Support exclusion of multiple groups. * Update lint-staged and Node/NPM requirements. * add CLI clean command. * add CLI exclude-group filter. * exclude past-due from list table all filter count. * throwing an exception if as_schedule_recurring_action interval param is not of type integer. = 3.5.4 - 2023-01-17 = * Add pre filters during action registration. * Async scheduling. * Calculate timeouts based on total actions. * Correctly order the parameters for `ActionScheduler_ActionFactory`'s calls to `single_unique`. * Fetch action in memory first before releasing claim to avoid deadlock. * PHP 8.2: declare property to fix creation of dynamic property warning. * PHP 8.2: fix "Using ${var} in strings is deprecated, use {$var} instead". * Prevent `undefined variable` warning for `$num_pastdue_actions`. = 3.5.3 - 2022-11-09 = * Query actions with partial match. = 3.5.2 - 2022-09-16 = * Fix - erroneous 3.5.1 release. = 3.5.1 - 2022-09-13 = * Maintenance on A/S docs. * fix: PHP 8.2 deprecated notice. = 3.5.0 - 2022-08-25 = * Add - The active view link within the "Tools > Scheduled Actions" screen is now clickable. * Add - A warning when there are past-due actions. * Enhancement - Added the ability to schedule unique actions via an atomic operation. * Enhancement - Improvements to cache invalidation when processing batches (when running on WordPress 6.0+). * Enhancement - If a recurring action is found to be consistently failing, it will stop being rescheduled. * Enhancement - Adds a new "Past Due" view to the scheduled actions list table. = 3.4.2 - 2022-06-08 = * Fix - Change the include for better linting. * Fix - update: Added Action scheduler completed action hook. = 3.4.1 - 2022-05-24 = * Fix - Change the include for better linting. * Fix - Fix the documented return type. = 3.4.0 - 2021-10-29 = * Enhancement - Number of items per page can now be set for the Scheduled Actions view (props @ovidiul). #771 * Fix - Do not lower the max_execution_time if it is already set to 0 (unlimited) (props @barryhughes). #755 * Fix - Avoid triggering autoloaders during the version resolution process (props @olegabr). #731 & #776 * Dev - ActionScheduler_wcSystemStatus PHPCS fixes (props @ovidiul). #761 * Dev - ActionScheduler_DBLogger.php PHPCS fixes (props @ovidiul). #768 * Dev - Fixed phpcs for ActionScheduler_Schedule_Deprecated (props @ovidiul). #762 * Dev - Improve actions table indicies (props @glagonikas). #774 & #777 * Dev - PHPCS fixes for ActionScheduler_DBStore.php (props @ovidiul). #769 & #778 * Dev - PHPCS Fixes for ActionScheduler_Abstract_ListTable (props @ovidiul). #763 & #779 * Dev - Adds new filter action_scheduler_claim_actions_order_by to allow tuning of the claim query (props @glagonikas). #773 * Dev - PHPCS fixes for ActionScheduler_WpPostStore class (props @ovidiul). #780 = 3.3.0 - 2021-09-15 = * Enhancement - Adds as_has_scheduled_action() to provide a performant way to test for existing actions. #645 * Fix - Improves compatibility with environments where NO_ZERO_DATE is enabled. #519 * Fix - Adds safety checks to guard against errors when our database tables cannot be created. #645 * Dev - Now supports queries that use multiple statuses. #649 * Dev - Minimum requirements for WordPress and PHP bumped (to 5.2 and 5.6 respectively). #723 = 3.2.1 - 2021-06-21 = * Fix - Add extra safety/account for different versions of AS and different loading patterns. #714 * Fix - Handle hidden columns (Tools → Scheduled Actions) | #600. = 3.2.0 - 2021-06-03 = * Fix - Add "no ordering" option to as_next_scheduled_action(). * Fix - Add secondary scheduled date checks when claiming actions (DBStore) | #634. * Fix - Add secondary scheduled date checks when claiming actions (wpPostStore) | #634. * Fix - Adds a new index to the action table, reducing the potential for deadlocks (props: @glagonikas). * Fix - Fix unit tests infrastructure and adapt tests to PHP 8. * Fix - Identify in-use data store. * Fix - Improve test_migration_is_scheduled. * Fix - PHP notice on list table. * Fix - Speed up clean up and batch selects. * Fix - Update pending dependencies. * Fix - [PHP 8.0] Only pass action arg values through to do_action_ref_array(). * Fix - [PHP 8] Set the PHP version to 7.1 in composer.json for PHP 8 compatibility. * Fix - add is_initialized() to docs. * Fix - fix file permissions. * Fix - fixes #664 by replacing __ with esc_html__. pro/sa-includes/css/wc-setup.min.css000064400000073560147600337620013431 0ustar00// phpcs:ignoreFile @charset "UTF-8";body{margin:65px auto 24px;box-shadow:none;background:#f1f1f1;padding:0}#wc-logo{border:0;margin:0 0 24px;padding:0;text-align:center}#wc-logo img{max-width:30%}.wc-setup{text-align:center}.wc-setup .select2-container{text-align:left;width:auto}.wc-setup .hidden{display:none}.wc-setup-content{box-shadow:0 1px 3px rgba(0,0,0,.13);padding:2em;margin:0 0 20px;background:#fff;overflow:hidden;zoom:1;text-align:left}.wc-setup-content h1,.wc-setup-content h2,.wc-setup-content h3,.wc-setup-content table{margin:0 0 20px;border:0;padding:0;color:#666;clear:none;font-weight:500}.wc-setup-content p{margin:20px 0;font-size:1em;line-height:1.75em;color:#666}.wc-setup-content table{font-size:1em;line-height:1.75em;color:#666}.wc-setup-content a{color:#a16696}.wc-setup-content a:focus,.wc-setup-content a:hover{color:#111}.wc-setup-content .form-table th{width:35%;vertical-align:top;font-weight:400}.wc-setup-content .form-table td{vertical-align:top}.wc-setup-content .form-table td input,.wc-setup-content .form-table td select{width:100%;box-sizing:border-box}.wc-setup-content .form-table td input[size]{width:auto}.wc-setup-content .form-table td .description{line-height:1.5em;display:block;margin-top:.25em;color:#999;font-style:italic}.wc-setup-content .form-table td .input-checkbox,.wc-setup-content .form-table td .input-radio{width:auto;box-sizing:inherit;padding:inherit;margin:0 .5em 0 0;box-shadow:none}.wc-setup-content .form-table .section_title td{padding:0}.wc-setup-content .form-table .section_title td h2,.wc-setup-content .form-table .section_title td p{margin:12px 0 0}.wc-setup-content .form-table td,.wc-setup-content .form-table th{padding:12px 0;margin:0;border:0}.wc-setup-content .form-table td:first-child,.wc-setup-content .form-table th:first-child{padding-right:1em}.wc-setup-content table.tax-rates{width:100%;font-size:.92em}.wc-setup-content table.tax-rates th{padding:0;text-align:center;width:auto;vertical-align:middle}.wc-setup-content table.tax-rates td{border:1px solid #f5f5f5;padding:6px;text-align:center;vertical-align:middle}.wc-setup-content table.tax-rates td input{outline:0;border:0;padding:0;box-shadow:none;text-align:center;width:100%}.wc-setup-content table.tax-rates td.sort{cursor:move;color:#ccc}.wc-setup-content table.tax-rates td.sort::before{content:"\f333";font-family:dashicons}.wc-setup-content table.tax-rates td.readonly{background:#f5f5f5}.wc-setup-content table.tax-rates .add{padding:1em 0 0 1em;line-height:1em;font-size:1em;width:0;margin:6px 0 0;height:0;overflow:hidden;position:relative;display:inline-block}.wc-setup-content table.tax-rates .add::before{content:"\f502";font-family:dashicons;position:absolute;left:0;top:0}.wc-setup-content table.tax-rates .remove{padding:1em 0 0 1em;line-height:1em;font-size:1em;width:0;margin:0;height:0;overflow:hidden;position:relative;display:inline-block}.wc-setup-content table.tax-rates .remove::before{content:"\f182";font-family:dashicons;position:absolute;left:0;top:0}.wc-setup-content .wc-setup-pages{width:100%;border-top:1px solid #eee}.wc-setup-content .wc-setup-pages thead th{display:none}.wc-setup-content .wc-setup-pages .page-name{width:30%;font-weight:700}.wc-setup-content .wc-setup-pages td,.wc-setup-content .wc-setup-pages th{padding:14px 0;border-bottom:1px solid #eee}.wc-setup-content .wc-setup-pages td:first-child,.wc-setup-content .wc-setup-pages th:first-child{padding-right:9px}.wc-setup-content .wc-setup-pages th{padding-top:0}.wc-setup-content .wc-setup-pages .page-options p{color:#777;margin:6px 0 0 24px;line-height:1.75em}.wc-setup-content .wc-setup-pages .page-options p input{vertical-align:middle;margin:1px 0 0;height:1.75em;width:1.75em;line-height:1.75em}.wc-setup-content .wc-setup-pages .page-options p label{line-height:1}@media screen and (max-width:782px){.wc-setup-content .form-table tbody th{width:auto}}.wc-setup-content .twitter-share-button{float:right}.wc-setup-content .wc-setup-next-steps{overflow:hidden;margin:0 0 24px;padding-bottom:2px}.wc-setup-content .wc-setup-next-steps h2{margin-bottom:12px}.wc-setup-content .wc-setup-next-steps .wc-setup-next-steps-first{float:left;width:50%;box-sizing:border-box}.wc-setup-content .wc-setup-next-steps .wc-setup-next-steps-last{float:right;width:50%;box-sizing:border-box}.wc-setup-content .wc-setup-next-steps ul{padding:0 2em 0 0;list-style:none outside;margin:0}.wc-setup-content .wc-setup-next-steps ul li a{display:block;padding:0 0 .75em}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button{background-color:#f7f7f7;border-color:#ccc;color:#23282d;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #ccc;text-shadow:1px 0 1px #eee,0 1px 1px #eee;font-size:1em;height:auto;line-height:1.75em;margin:0 0 .75em;opacity:1;padding:1em;text-align:center}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:active,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:focus,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:hover{background:#f5f5f5;border-color:#aaa}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary{color:#fff;background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597}.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:active,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:focus,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:hover{color:#fff;background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.wc-setup-content .wc-setup-next-steps ul li a::before{color:#82878c;font:normal 20px/1 dashicons;speak:none;display:inline-block;padding:0 10px 0 0;top:1px;position:relative;text-decoration:none !important;vertical-align:top}.wc-setup-content .wc-setup-next-steps ul .learn-more a::before{content:"\f105"}.wc-setup-content .wc-setup-next-steps ul .video-walkthrough a::before{content:"\f126"}.wc-setup-content .wc-setup-next-steps ul .newsletter a::before{content:"\f465"}.wc-setup-content .updated,.wc-setup-content .woocommerce-newsletter{padding:24px 24px 0;margin:0 0 24px;overflow:hidden;background:#f5f5f5}.wc-setup-content .updated p,.wc-setup-content .woocommerce-newsletter p{padding:0;margin:0 0 12px}.wc-setup-content .updated form,.wc-setup-content .updated p:last-child,.wc-setup-content .woocommerce-newsletter form,.wc-setup-content .woocommerce-newsletter p:last-child{margin:0 0 24px}.wc-setup-content .woocommerce-tracker{margin:24px 0;border:1px solid #eee;padding:20px;border-radius:4px;overflow:hidden}.wc-setup-content .woocommerce-tracker p{font-size:14px;line-height:1.5em}.wc-setup-content .woocommerce-tracker .checkbox{line-height:24px;font-weight:500;font-size:1em;margin-top:0;margin-bottom:20px}.wc-setup-content .checkbox input[type=checkbox]{opacity:0;position:absolute;left:-9999px}.wc-setup-content .checkbox label{position:relative;display:inline-block;padding-left:28px}.wc-setup-content .checkbox label::after,.wc-setup-content .checkbox label::before{position:absolute;content:"";display:inline-block}.wc-setup-content .checkbox label::before{height:16px;width:16px;left:0;top:3px;border:1px solid #aaa;background-color:#fff;border-radius:3px}.wc-setup-content .checkbox label::after{height:5px;width:9px;border-left:2px solid;border-bottom:2px solid;-webkit-transform:rotate(-45deg);-ms-transform:rotate(-45deg);transform:rotate(-45deg);left:4px;top:7px;color:#fff}.wc-setup-content .checkbox input[type=checkbox]+label::after{content:none}.wc-setup-content .checkbox input[type=checkbox]:checked+label::after{content:""}.wc-setup-content .checkbox input[type=checkbox]:focus+label::before{outline:#3b99fc auto 5px}.wc-setup-content .checkbox input[type=checkbox]:checked+label::before{background:#935687;border-color:#935687}.wc-setup-steps{padding:0 0 24px;margin:0;list-style:none outside;overflow:hidden;color:#ccc;width:100%;display:-webkit-inline-box;display:-webkit-inline-flex;display:inline-flex}.wc-setup-steps li{width:100%;float:left;padding:0 0 .8em;margin:0;text-align:center;position:relative;border-bottom:4px solid #ccc;line-height:1.4em}.wc-setup-steps li a{color:#a16696;text-decoration:none;padding:1.5em;margin:-1.5em;position:relative;z-index:1}.wc-setup-steps li a:focus,.wc-setup-steps li a:hover{color:#111;text-decoration:underline}.wc-setup-steps li::before{content:"";border:4px solid #ccc;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;left:50%;margin-left:-6px;margin-bottom:-8px;background:#fff}.wc-setup-steps li.active{border-color:#a16696;color:#a16696;font-weight:700}.wc-setup-steps li.active::before{border-color:#a16696}.wc-setup-steps li.done{border-color:#a16696;color:#a16696}.wc-setup-steps li.done::before{border-color:#a16696;background:#a16696}.wc-setup .wc-setup-actions{overflow:hidden;margin:20px 0 0;position:relative}.wc-setup .wc-setup-actions .button{font-size:1.25em;padding:.5em 1em;line-height:1em;margin-right:.5em;margin-bottom:2px;height:auto;border-radius:4px}.wc-setup .wc-setup-actions .button-primary{background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597;margin:0;opacity:1}.wc-setup .wc-setup-actions .button-primary:active,.wc-setup .wc-setup-actions .button-primary:focus,.wc-setup .wc-setup-actions .button-primary:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.wc-setup-content p:last-child{margin-bottom:0}.wc-setup-content p.store-setup{margin-top:0}.wc-setup-footer-links{font-size:.85em;color:#7b7b7b;margin:1.18em auto;display:inline-block;text-align:center}.wc-wizard-storefront .wc-wizard-storefront-intro{padding:40px 40px 0;background:#f5f5f5;text-align:center}.wc-wizard-storefront .wc-wizard-storefront-intro img{margin:40px 0 0 0;width:100%;display:block}.wc-wizard-storefront .wc-wizard-storefront-features{list-style:none outside;margin:0 0 20px;padding:0 0 0 30px;overflow:hidden}.wc-wizard-storefront .wc-wizard-storefront-feature{margin:0;padding:20px 30px 20px 2em;width:50%;box-sizing:border-box}.wc-wizard-storefront .wc-wizard-storefront-feature::before{margin-left:-2em;position:absolute}.wc-wizard-storefront .wc-wizard-storefront-feature.first{clear:both;float:left}.wc-wizard-storefront .wc-wizard-storefront-feature.last{float:right}.wc-wizard-storefront .wc-wizard-storefront-feature__bulletproof::before{content:"🔒"}.wc-wizard-storefront .wc-wizard-storefront-feature__mobile::before{content:"📱"}.wc-wizard-storefront .wc-wizard-storefront-feature__accessibility::before{content:"👓"}.wc-wizard-storefront .wc-wizard-storefront-feature__search::before{content:"ðŸ”"}.wc-wizard-storefront .wc-wizard-storefront-feature__compatibility::before{content:"🔧"}.wc-wizard-storefront .wc-wizard-storefront-feature__extendable::before{content:"🎨"}.wc-wizard-services{border:1px solid #eee;padding:0;margin:0 0 1em;list-style:none outside;border-radius:4px;overflow:hidden}.wc-wizard-services p{margin:0 0 1em 0;padding:0;font-size:1em;line-height:1.5em}.wc-wizard-service-item,.wc-wizard-services-list-toggle{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;padding:0;border-bottom:1px solid #eee;color:#666;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.wc-wizard-service-item:last-child,.wc-wizard-services-list-toggle:last-child{border-bottom:0}.wc-wizard-service-item .payment-gateway-fee,.wc-wizard-services-list-toggle .payment-gateway-fee{color:#a6a6a6}.wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-services-list-toggle .wc-wizard-service-name{-webkit-flex-basis:0;flex-basis:0;min-width:160px;text-align:center;font-weight:700;padding:2em 0;-webkit-align-self:stretch;align-self:stretch;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:baseline;-webkit-align-items:baseline;align-items:baseline}.wc-wizard-payment-gateway-form .wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-payment-gateway-form .wc-wizard-services-list-toggle .wc-wizard-service-name{-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.wc-wizard-service-item .wc-wizard-service-name img,.wc-wizard-services-list-toggle .wc-wizard-service-name img{max-width:75px}.wc-wizard-service-item.stripe-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.stripe-logo .wc-wizard-service-name img{padding:8px 0}.wc-wizard-service-item.paypal-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.paypal-logo .wc-wizard-service-name img{max-width:87px;padding:2px 0}.wc-wizard-service-item.klarna-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.klarna-logo .wc-wizard-service-name img{max-width:87px;padding:12px 0}.wc-wizard-service-item.square-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.square-logo .wc-wizard-service-name img{max-width:95px;padding:12px 0}.wc-wizard-service-item.eway-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.eway-logo .wc-wizard-service-name img{max-width:87px}.wc-wizard-service-item.payfast-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.payfast-logo .wc-wizard-service-name img{max-width:140px}.wc-wizard-service-item .wc-wizard-service-description,.wc-wizard-services-list-toggle .wc-wizard-service-description{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;padding:20px}.wc-wizard-service-item .wc-wizard-service-description p,.wc-wizard-services-list-toggle .wc-wizard-service-description p{margin-bottom:1em}.wc-wizard-service-item .wc-wizard-service-description p:last-child,.wc-wizard-services-list-toggle .wc-wizard-service-description p:last-child{margin-bottom:0}.wc-wizard-service-item .wc-wizard-service-description .wc-wizard-service-settings-description,.wc-wizard-services-list-toggle .wc-wizard-service-description .wc-wizard-service-settings-description{display:block;font-style:italic;color:#999}.wc-wizard-service-item .wc-wizard-service-enable,.wc-wizard-services-list-toggle .wc-wizard-service-enable{-webkit-flex-basis:0;flex-basis:0;min-width:75px;text-align:center;cursor:pointer;padding:2em 0;position:relative;max-height:1.5em;-webkit-align-self:flex-start;align-self:flex-start;-webkit-box-ordinal-group:4;-webkit-order:3;order:3}.wc-wizard-service-item .wc-wizard-service-toggle,.wc-wizard-services-list-toggle .wc-wizard-service-toggle{height:16px;width:32px;border:2px solid #935687;background-color:#935687;display:inline-block;text-indent:-9999px;border-radius:10em;position:relative}.wc-wizard-service-item .wc-wizard-service-toggle input[type=checkbox],.wc-wizard-services-list-toggle .wc-wizard-service-toggle input[type=checkbox]{display:none}.wc-wizard-service-item .wc-wizard-service-toggle::before,.wc-wizard-services-list-toggle .wc-wizard-service-toggle::before{content:"";display:block;width:16px;height:16px;background:#fff;position:absolute;top:0;right:0;border-radius:100%}.wc-wizard-service-item .wc-wizard-service-toggle.disabled,.wc-wizard-services-list-toggle .wc-wizard-service-toggle.disabled{border-color:#999;background-color:#999}.wc-wizard-service-item .wc-wizard-service-toggle.disabled::before,.wc-wizard-services-list-toggle .wc-wizard-service-toggle.disabled::before{right:auto;left:0}.wc-wizard-service-item .wc-wizard-service-settings,.wc-wizard-services-list-toggle .wc-wizard-service-settings{display:none;margin-top:.75em;margin-bottom:0;cursor:default}.wc-wizard-service-item .wc-wizard-service-settings.hide,.wc-wizard-services-list-toggle .wc-wizard-service-settings.hide{display:none}.wc-wizard-service-item.checked .wc-wizard-service-settings,.wc-wizard-services-list-toggle.checked .wc-wizard-service-settings{display:inline-block}.wc-wizard-service-item.checked .wc-wizard-service-settings.hide,.wc-wizard-services-list-toggle.checked .wc-wizard-service-settings.hide{display:none}.wc-wizard-service-item.closed,.wc-wizard-services-list-toggle.closed{border-bottom:0}.wc-wizard-services-list-toggle{cursor:pointer}.wc-wizard-services-list-toggle .wc-wizard-service-enable::before{content:"\f343";font-family:dashicons;visibility:initial;color:#666;font-size:25px;margin-top:-7px;margin-left:-5px;position:absolute;visibility:visible}.wc-wizard-services-list-toggle.closed .wc-wizard-service-enable::before{content:"\f347"}.wc-wizard-services-list-toggle .wc-wizard-service-enable input{visibility:hidden;position:relative}.wc-wizard-services.manual .wc-wizard-service-item{display:none}.wc-wizard-services.shipping{margin:0}.wc-wizard-services.shipping .wc-wizard-service-name{font-weight:400;text-align:left;-webkit-box-align:center;-webkit-align-items:center;align-items:center;max-height:5em;padding:0}.wc-wizard-services.shipping .wc-wizard-service-item{padding-left:2em;padding-top:.67em}.wc-wizard-services.shipping .wc-wizard-service-item:first-child{border-bottom:0;padding-bottom:0;font-weight:700}.wc-wizard-services.shipping .wc-wizard-service-item:first-child .wc-wizard-service-name{font-weight:700}.wc-wizard-services.shipping .shipping-method-setting,.wc-wizard-services.shipping .wc-wizard-shipping-method-select{display:-webkit-box;display:-webkit-flex;display:flex}.wc-wizard-services.shipping .shipping-method-setting.hide,.wc-wizard-services.shipping .wc-wizard-shipping-method-select.hide{display:none}.wc-wizard-services.shipping .shipping-method-setting input,.wc-wizard-services.shipping .wc-wizard-shipping-method-dropdown{margin-right:2em;margin-bottom:1em}.wc-wizard-services.shipping .shipping-method-setting input .select2,.wc-wizard-services.shipping .wc-wizard-shipping-method-dropdown .select2{min-width:130px}.wc-wizard-services.shipping .wc-wizard-service-description{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;color:#a6a6a6}.wc-wizard-services.shipping .wc-wizard-service-item:not(:first-child) .wc-wizard-service-description{font-size:.92em;padding-bottom:10px}.wc-wizard-services.shipping .shipping-method-setting input{width:95px;border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:28px;padding-left:8px;padding-right:24px;font-size:14px;color:#444;background-color:#fff;display:inline-block}.wc-wizard-services.shipping .shipping-method-description,.wc-wizard-services.shipping .shipping-method-setting .description{color:#7e7e7e;font-size:.9em}.wc-wizard-services.shipping .shipping-method-setting input::-webkit-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::-moz-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input:-ms-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::-ms-input-placeholder{color:#e1e1e1}.wc-wizard-services.shipping .shipping-method-setting input::placeholder{color:#e1e1e1}.wc-setup-shipping-units p{line-height:1.5em;font-size:13px;margin-bottom:.25em;text-align:center}.wc-setup-shipping-units .wc-setup-shipping-unit{margin-bottom:1.75em}.wc-setup-shipping-units .wc-setup-shipping-unit .select2{min-width:125px;top:-5px}.hide{display:none}.wc-wizard-features{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;list-style:none;padding:0}.wc-wizard-features .wc-wizard-feature-item{-webkit-flex-basis:calc(50% - 4em - 3px);flex-basis:calc(50% - 4em - 3px);border:1px solid #eee;padding:2em}.wc-wizard-features .wc-wizard-feature-item:nth-child(1){border-radius:4px 0 0 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(2){border-left:0;border-radius:0 4px 0 0}.wc-wizard-features .wc-wizard-feature-item:nth-child(3){border-top:0;border-radius:0 0 0 4px}.wc-wizard-features .wc-wizard-feature-item:nth-child(4){border-top:0;border-left:0;border-radius:0 0 4px 0}.wc-wizard-features p.wc-wizard-feature-description,.wc-wizard-features p.wc-wizard-feature-name{margin:0;line-height:1.5em}h3.jetpack-reasons{text-align:center;margin:3em 0 1em 0;font-size:14px}.jetpack-logo,.wcs-notice{display:block;margin:1.75em auto 2em auto;max-height:175px}.activate-splash .jetpack-logo{width:170px;margin-bottom:0}.activate-splash .wcs-notice{margin-top:1em;padding-left:57px}.step{text-align:center}.wc-setup .wc-setup-actions .button{font-weight:300;font-size:16px;padding:1em 2em;box-shadow:none;min-width:12em;min-width:auto;margin-top:10px}.wc-setup .wc-setup-actions .button:active,.wc-setup .wc-setup-actions .button:focus,.wc-setup .wc-setup-actions .button:hover{box-shadow:none}.wc-setup .wc-setup-actions .plugin-install-info{display:block;font-style:italic;color:#999;font-size:14px;line-height:1.5em;margin:5px 0}.wc-setup .wc-setup-actions .plugin-install-info>*{display:block}.wc-setup .wc-setup-actions .plugin-install-info .plugin-install-info-list-item::after{content:", "}.wc-setup .wc-setup-actions .plugin-install-info .plugin-install-info-list-item:last-of-type::after{content:". "}.wc-setup .wc-setup-actions .plugin-install-info a{white-space:nowrap}.wc-setup .wc-setup-actions .plugin-install-info a:not(:hover):not(:focus){color:inherit}.plugin-install-source{background:rgba(187,119,174,.15)}.plugin-install-source:not(.wc-wizard-service-item){box-shadow:0 0 0 10px rgba(187,119,174,.15)}.location-prompt{color:#666;font-size:13px;font-weight:500;margin-bottom:.5em;margin-top:.85em;display:inline-block}.location-input{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:30px;width:calc(100% - 8px - 24px - 2px);padding-left:8px;padding-right:24px;font-size:16px;color:#444;background-color:#fff;display:inline-block}.location-input.dropdown{width:100%}.address-step .select2{min-width:100%}.store-address-container .city-and-postcode{display:-webkit-box;display:-webkit-flex;display:flex}.store-address-container .city-and-postcode div{-webkit-flex-basis:50%;flex-basis:50%;margin-right:1em}.store-address-container .city-and-postcode div:last-of-type{margin-right:0}.store-address-container .select2-container,.store-address-container input[type=text],.store-address-container select{margin-bottom:10px}.product-type-container{margin-top:14px;margin-bottom:1px}#woocommerce_sell_in_person{margin-left:0}.wc-wizard-service-settings .payment-email-input{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:30px;padding:0 8px;font-size:14px;color:#444;background-color:#fff;display:inline-block}.wc-wizard-service-settings .payment-email-input[disabled]{color:#aaa}.newsletter-form-container{display:-webkit-box;display:-webkit-flex;display:flex}.newsletter-form-container .newsletter-form-email{border:1px solid #aaa;border-color:#ddd;border-radius:4px;height:42px;padding:0 8px;font-size:16px;color:#666;background-color:#fff;display:inline-block;margin-right:6px;-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1}.newsletter-form-container .newsletter-form-button-container{-webkit-box-flex:0;-webkit-flex-grow:0;flex-grow:0}.wc-setup .wc-setup-actions .button.newsletter-form-button{height:42px;padding:0 1em;margin:0}.wc-wizard-next-steps{border:1px solid #eee;border-radius:4px;list-style:none;padding:0}.wc-wizard-next-steps li{padding:0}.wc-wizard-next-steps .wc-wizard-next-step-item{display:-webkit-box;display:-webkit-flex;display:flex;border-top:1px solid #eee}.wc-wizard-next-steps .wc-wizard-next-step-item:first-child{border-top:0}.wc-wizard-next-steps .wc-wizard-next-step-description{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;margin:1.5em}.wc-wizard-next-steps .wc-wizard-next-step-action{-webkit-box-flex:0;-webkit-flex-grow:0;flex-grow:0;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.wc-wizard-next-steps .wc-wizard-next-step-action .button{margin:1em 1.5em}.wc-wizard-next-steps p.next-step-heading{margin:0;font-size:.95em;font-weight:400;font-variant:all-petite-caps}.wc-wizard-next-steps p.next-step-extra-info{margin:0}.wc-wizard-next-steps h3.next-step-description{margin:0;font-size:16px;font-weight:600}.wc-wizard-next-steps .wc-wizard-additional-steps{border-top:1px solid #eee}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-wizard-next-step-description{margin-bottom:0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions{margin:0 0 1.5em 0}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions .button{font-size:15px;margin:1em 0 1em 1.5em}.wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions .button::last-child{margin-right:1.5em}p.next-steps-help-text{color:#9f9f9f;padding:0 2em;text-align:center;font-size:.9em}p.jetpack-terms{font-size:.8em;text-align:center;max-width:480px;margin:0 auto;line-height:1.5em}.woocommerce-error{background:#ffe6e5;border-color:#ffc5c2;padding:1em;margin-bottom:1em}.woocommerce-error p{margin-top:0;margin-bottom:.5em;color:#444}.woocommerce-error a{color:#ff645c}.woocommerce-error .reconnect-reminder{font-size:.85em}.woocommerce-error .wc-setup-actions .button{font-size:14px}.wc-wizard-service-setting-ppec_paypal_reroute_requests,.wc-wizard-service-setting-stripe_create_account{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:start;-webkit-align-items:flex-start;align-items:flex-start}.wc-wizard-service-setting-ppec_paypal_reroute_requests .payment-checkbox-input,.wc-wizard-service-setting-stripe_create_account .payment-checkbox-input{-webkit-box-ordinal-group:2;-webkit-order:1;order:1;margin-top:5px;margin-left:0;margin-right:0;width:1.5em}.wc-wizard-service-setting-ppec_paypal_reroute_requests .ppec_paypal_reroute_requests,.wc-wizard-service-setting-ppec_paypal_reroute_requests .stripe_create_account,.wc-wizard-service-setting-stripe_create_account .ppec_paypal_reroute_requests,.wc-wizard-service-setting-stripe_create_account .stripe_create_account{-webkit-box-ordinal-group:3;-webkit-order:2;order:2;margin-left:.3em}.wc-wizard-service-setting-ppec_paypal_email,.wc-wizard-service-setting-stripe_email{margin-top:.75em;margin-left:1.5em}.wc-wizard-service-setting-ppec_paypal_email label.ppec_paypal_email,.wc-wizard-service-setting-ppec_paypal_email label.stripe_email,.wc-wizard-service-setting-stripe_email label.ppec_paypal_email,.wc-wizard-service-setting-stripe_email label.stripe_email{position:absolute;margin:-1px;padding:0;height:1px;width:1px;overflow:hidden;clip:rect(0 0 0 0);border:0}.wc-wizard-service-setting-ppec_paypal_email input.payment-email-input,.wc-wizard-service-setting-stripe_email input.payment-email-input{box-sizing:border-box;margin-bottom:.5em;width:100%;height:32px}.wc-setup-content .recommended-step{border:1px solid #ebebeb;border-radius:4px;padding:2.5em}.wc-setup-content .recommended-item{list-style:none}.wc-setup-content .recommended-item:last-child label{margin-bottom:0}.wc-setup-content .recommended-item label{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;margin-bottom:1.5em}.wc-setup-content .recommended-item label::after,.wc-setup-content .recommended-item label::before{top:auto}.wc-setup-content .recommended-item label::after{margin-top:-1.5px}.wc-setup-content .recommended-item .recommended-item-icon{border:1px solid #fff;border-radius:7px;height:3.5em;margin-right:1em;margin-left:4px}.wc-setup-content .recommended-item .recommended-item-icon.recommended-item-icon-storefront_theme{background-color:#f4a224;max-height:3em;max-width:3em;padding:.25em}.wc-setup-content .recommended-item .recommended-item-icon.recommended-item-icon-automated_taxes{background-color:#d0011b;max-height:1.75em;padding:.875em}.wc-setup-content .recommended-item .recommended-item-icon.recommended-item-icon-mailchimp{background-color:#ffe01b;height:2em;padding:.75em}.wc-setup-content .recommended-item .recommended-item-icon.recommended-item-icon-woocommerce_services{background-color:#f0f0f0;max-height:1.5em;padding:1.3em .7em}.wc-setup-content .recommended-item .recommended-item-icon.recommended-item-icon-shipstation{background-color:#f0f0f0;padding:.3em}.wc-setup-content .recommended-item .recommended-item-description-container h3{font-size:15px;font-weight:700;letter-spacing:.5px;margin-bottom:0}.wc-setup-content .recommended-item .recommended-item-description-container p{margin-top:0;line-height:1.5em}.wc-wizard-service-info{padding:1em 2em;background-color:#fafafa}.help_tip{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.wc-setup #tiptip_content{background:#5f6973}.wc-setup #tiptip_holder.tip_top #tiptip_arrow_inner{border-top-color:#5f6973}.wc-setup-shipping-recommended{border-bottom:1px solid #eee;margin-top:0;padding:30px 0}@media only screen and (max-width:400px){#wc-logo img{max-width:80%}.wc-setup-steps{display:none}.store-address-container .city-and-postcode{display:block}.store-address-container .city-and-postcode div{margin-right:0}.wc-wizard-service-item,.wc-wizard-services-list-toggle{-webkit-flex-wrap:wrap;flex-wrap:wrap}.wc-wizard-service-item .wc-wizard-service-enable,.wc-wizard-services-list-toggle .wc-wizard-service-enable{-webkit-box-ordinal-group:3;-webkit-order:2;order:2;padding:20px 0 0}.wc-wizard-service-item .wc-wizard-service-description,.wc-wizard-services-list-toggle .wc-wizard-service-description{-webkit-box-ordinal-group:4;-webkit-order:3;order:3}.wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-services-list-toggle .wc-wizard-service-name{padding:20px 20px 0;text-align:left;-webkit-box-pack:justify !important;-webkit-justify-content:space-between !important;justify-content:space-between !important}.wc-wizard-service-item .wc-wizard-service-name img,.wc-wizard-services-list-toggle .wc-wizard-service-name img{margin:0}.newsletter-form-container{display:block}.newsletter-form-container .newsletter-form-email{display:block;box-sizing:border-box;width:100%;margin-bottom:10px}.newsletter-form-container .button.newsletter-form-button{float:left}.wc-wizard-next-steps .wc-wizard-next-step-item{-webkit-flex-wrap:wrap;flex-wrap:wrap}.wc-wizard-next-steps .wc-wizard-next-step-item .wc-wizard-next-step-description{margin-bottom:0}.wc-wizard-next-steps .wc-wizard-next-step-item .wc-wizard-next-step-action p{margin:0}} pro/sa-includes/css/wc-setup.css000064400000102340147600337620012634 0ustar00/** * Credit: WooCommerce; */ @charset "UTF-8";body { margin: 65px auto 24px; box-shadow: none; background: #f1f1f1; padding: 0 } #wc-logo { border: 0; margin: 0 0 24px; padding: 0; text-align: center } #wc-logo img { max-width: 30% } .wc-setup { text-align: center } .wc-setup .select2-container { text-align: left; width: auto } .wc-setup .hidden { display: none } .wc-setup-content { box-shadow: 0 1px 3px rgba(0,0,0,.13); padding: 2em; margin: 0 0 20px; background: #fff; overflow: hidden; zoom:1;text-align: left } .wc-setup-content h1,.wc-setup-content h2,.wc-setup-content h3,.wc-setup-content table { margin: 0 0 20px; border: 0; padding: 0; color: #666; clear: none; font-weight: 500 } .wc-setup-content p { margin: 20px 0; font-size: 1em; line-height: 1.75em; color: #666 } .wc-setup-content table { font-size: 1em; line-height: 1.75em; color: #666 } .wc-setup-content a { color: #a16696 } .wc-setup-content a:focus,.wc-setup-content a:hover { color: #111 } .wc-setup-content .form-table th { width: 35%; vertical-align: top; font-weight: 400 } .wc-setup-content .form-table td { vertical-align: top } .wc-setup-content .form-table td input,.wc-setup-content .form-table td select { width: 100%; box-sizing: border-box } .wc-setup-content .form-table td input[size] { width: auto } .wc-setup-content .form-table td .description { line-height: 1.5em; display: block; margin-top: .25em; color: #999; font-style: italic } .wc-setup-content .form-table td .input-checkbox,.wc-setup-content .form-table td .input-radio { width: auto; box-sizing: inherit; padding: inherit; margin: 0 .5em 0 0; box-shadow: none } .wc-setup-content .form-table .section_title td { padding: 0 } .wc-setup-content .form-table .section_title td h2,.wc-setup-content .form-table .section_title td p { margin: 12px 0 0 } .wc-setup-content .form-table td,.wc-setup-content .form-table th { padding: 12px 0; margin: 0; border: 0 } .wc-setup-content .form-table td:first-child,.wc-setup-content .form-table th:first-child { padding-right: 1em } .wc-setup-content table.tax-rates { width: 100%; font-size: .92em } .wc-setup-content table.tax-rates th { padding: 0; text-align: center; width: auto; vertical-align: middle } .wc-setup-content table.tax-rates td { border: 1px solid #f5f5f5; padding: 6px; text-align: center; vertical-align: middle } .wc-setup-content table.tax-rates td input { outline: 0; border: 0; padding: 0; box-shadow: none; text-align: center; width: 100% } .wc-setup-content table.tax-rates td.sort { cursor: move; color: #ccc } .wc-setup-content table.tax-rates td.sort::before { content: "\f333"; font-family: dashicons } .wc-setup-content table.tax-rates td.readonly { background: #f5f5f5 } .wc-setup-content table.tax-rates .add { padding: 1em 0 0 1em; line-height: 1em; font-size: 1em; width: 0; margin: 6px 0 0; height: 0; overflow: hidden; position: relative; display: inline-block } .wc-setup-content table.tax-rates .add::before { content: "\f502"; font-family: dashicons; position: absolute; left: 0; top: 0 } .wc-setup-content table.tax-rates .remove { padding: 1em 0 0 1em; line-height: 1em; font-size: 1em; width: 0; margin: 0; height: 0; overflow: hidden; position: relative; display: inline-block } .wc-setup-content table.tax-rates .remove::before { content: "\f182"; font-family: dashicons; position: absolute; left: 0; top: 0 } .wc-setup-content .wc-setup-pages { width: 100%; border-top: 1px solid #eee } .wc-setup-content .wc-setup-pages thead th { display: none } .wc-setup-content .wc-setup-pages .page-name { width: 30%; font-weight: 700 } .wc-setup-content .wc-setup-pages td,.wc-setup-content .wc-setup-pages th { padding: 14px 0; border-bottom: 1px solid #eee } .wc-setup-content .wc-setup-pages td:first-child,.wc-setup-content .wc-setup-pages th:first-child { padding-right: 9px } .wc-setup-content .wc-setup-pages th { padding-top: 0 } .wc-setup-content .wc-setup-pages .page-options p { color: #777; margin: 6px 0 0 24px; line-height: 1.75em } .wc-setup-content .wc-setup-pages .page-options p input { vertical-align: middle; margin: 1px 0 0; height: 1.75em; width: 1.75em; line-height: 1.75em } .wc-setup-content .wc-setup-pages .page-options p label { line-height: 1 } @media screen and (max-width: 782px) { .wc-setup-content .form-table tbody th { width:auto } } .wc-setup-content .twitter-share-button { float: right } .wc-setup-content .wc-setup-next-steps { overflow: hidden; margin: 0 0 24px; padding-bottom: 2px } .wc-setup-content .wc-setup-next-steps h2 { margin-bottom: 12px } .wc-setup-content .wc-setup-next-steps .wc-setup-next-steps-first { float: left; width: 50%; box-sizing: border-box } .wc-setup-content .wc-setup-next-steps .wc-setup-next-steps-last { float: right; width: 50%; box-sizing: border-box } .wc-setup-content .wc-setup-next-steps ul { padding: 0 2em 0 0; list-style: none outside; margin: 0 } .wc-setup-content .wc-setup-next-steps ul li a { display: block; padding: 0 0 .75em } .wc-setup-content .wc-setup-next-steps ul .setup-product a.button { background-color: #f7f7f7; border-color: #ccc; color: #23282d; box-shadow: inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #ccc; text-shadow: 1px 0 1px #eee,0 1px 1px #eee; font-size: 1em; height: auto; line-height: 1.75em; margin: 0 0 .75em; opacity: 1; padding: 1em; text-align: center } .wc-setup-content .wc-setup-next-steps ul .setup-product a.button:active,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:focus,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button:hover { background: #f5f5f5; border-color: #aaa } .wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary { color: #fff; background-color: #bb77ae; border-color: #a36597; box-shadow: inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597; text-shadow: 0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597 } .wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:active,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:focus,.wc-setup-content .wc-setup-next-steps ul .setup-product a.button-primary:hover { color: #fff; background: #a36597; border-color: #a36597; box-shadow: inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597 } .wc-setup-content .wc-setup-next-steps ul li a::before { color: #82878c; font: normal 20px/1 dashicons; speak: none; display: inline-block; padding: 0 10px 0 0; top: 1px; position: relative; text-decoration: none!important; vertical-align: top } .wc-setup-content .wc-setup-next-steps ul .learn-more a::before { content: "\f105" } .wc-setup-content .wc-setup-next-steps ul .video-walkthrough a::before { content: "\f126" } .wc-setup-content .wc-setup-next-steps ul .newsletter a::before { content: "\f465" } .wc-setup-content .updated,.wc-setup-content .woocommerce-newsletter { padding: 24px 24px 0; margin: 0 0 24px; overflow: hidden; background: #f5f5f5 } .wc-setup-content .updated p,.wc-setup-content .woocommerce-newsletter p { padding: 0; margin: 0 0 12px } .wc-setup-content .updated form,.wc-setup-content .updated p:last-child,.wc-setup-content .woocommerce-newsletter form,.wc-setup-content .woocommerce-newsletter p:last-child { margin: 0 0 24px } .wc-setup-content .woocommerce-tracker { margin: 24px 0; border: 1px solid #eee; padding: 20px; border-radius: 4px; overflow: hidden } .wc-setup-content .woocommerce-tracker p { font-size: 14px; line-height: 1.5em } .wc-setup-content .woocommerce-tracker .checkbox { line-height: 24px; font-weight: 500; font-size: 1em; margin-top: 0; margin-bottom: 20px } .wc-setup-content .checkbox input[type=checkbox] { opacity: 0; position: absolute; left: -9999px } .wc-setup-content .checkbox label { position: relative; display: inline-block; padding-left: 28px } .wc-setup-content .checkbox label::after,.wc-setup-content .checkbox label::before { position: absolute; content: ""; display: inline-block } .wc-setup-content .checkbox label::before { height: 16px; width: 16px; left: 0; top: 3px; border: 1px solid #aaa; background-color: #fff; border-radius: 3px } .wc-setup-content .checkbox label::after { height: 5px; width: 9px; border-left: 2px solid; border-bottom: 2px solid; -webkit-transform: rotate(-45deg); -ms-transform: rotate(-45deg); transform: rotate(-45deg); left: 4px; top: 7px; color: #fff } .wc-setup-content .checkbox input[type=checkbox]+label::after { content: none } .wc-setup-content .checkbox input[type=checkbox]:checked+label::after { content: "" } .wc-setup-content .checkbox input[type=checkbox]:focus+label::before { outline: #3b99fc auto 5px } .wc-setup-content .checkbox input[type=checkbox]:checked+label::before { background: #935687; border-color: #935687 } .wc-setup-steps { padding: 0 0 24px; margin: 0; list-style: none outside; overflow: hidden; color: #ccc; width: 100%; display: -webkit-inline-box; display: -webkit-inline-flex; display: inline-flex } .wc-setup-steps li { width: 100%; float: left; padding: 0 0 .8em; margin: 0; text-align: center; position: relative; border-bottom: 4px solid #ccc; line-height: 1.4em } .wc-setup-steps li a { color: #a16696; text-decoration: none; padding: 1.5em; margin: -1.5em; position: relative; z-index: 1 } .wc-setup-steps li a:focus,.wc-setup-steps li a:hover { color: #111; text-decoration: underline } .wc-setup-steps li::before { content: ""; border: 4px solid #ccc; border-radius: 100%; width: 4px; height: 4px; position: absolute; bottom: 0; left: 50%; margin-left: -6px; margin-bottom: -8px; background: #fff } .wc-setup-steps li.active { border-color: #a16696; color: #a16696; font-weight: 700 } .wc-setup-steps li.active::before { border-color: #a16696 } .wc-setup-steps li.done { border-color: #a16696; color: #a16696 } .wc-setup-steps li.done::before { border-color: #a16696; background: #a16696 } .wc-setup .wc-setup-actions { overflow: hidden; margin: 20px 0 0; position: relative } .wc-setup .wc-setup-actions .button { font-size: 1.25em; padding: .5em 1em; line-height: 1em; margin-right: .5em; margin-bottom: 2px; height: auto; border-radius: 4px } .wc-setup .wc-setup-actions .button-primary { background-color: #bb77ae; border-color: #a36597; box-shadow: inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597; text-shadow: 0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597; margin: 0; opacity: 1 } .wc-setup .wc-setup-actions .button-primary:active,.wc-setup .wc-setup-actions .button-primary:focus,.wc-setup .wc-setup-actions .button-primary:hover { background: #a36597; border-color: #a36597; box-shadow: inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597 } .wc-setup-content p:last-child { margin-bottom: 0 } .wc-setup-content p.store-setup { margin-top: 0 } .wc-setup-footer-links { font-size: .85em; color: #7b7b7b; margin: 1.18em auto; display: inline-block; text-align: center } .wc-wizard-storefront .wc-wizard-storefront-intro { padding: 40px 40px 0; background: #f5f5f5; text-align: center } .wc-wizard-storefront .wc-wizard-storefront-intro img { margin: 40px 0 0 0; width: 100%; display: block } .wc-wizard-storefront .wc-wizard-storefront-features { list-style: none outside; margin: 0 0 20px; padding: 0 0 0 30px; overflow: hidden } .wc-wizard-storefront .wc-wizard-storefront-feature { margin: 0; padding: 20px 30px 20px 2em; width: 50%; box-sizing: border-box } .wc-wizard-storefront .wc-wizard-storefront-feature::before { margin-left: -2em; position: absolute } .wc-wizard-storefront .wc-wizard-storefront-feature.first { clear: both; float: left } .wc-wizard-storefront .wc-wizard-storefront-feature.last { float: right } .wc-wizard-storefront .wc-wizard-storefront-feature__bulletproof::before { content: "🔒" } .wc-wizard-storefront .wc-wizard-storefront-feature__mobile::before { content: "📱" } .wc-wizard-storefront .wc-wizard-storefront-feature__accessibility::before { content: "👓" } .wc-wizard-storefront .wc-wizard-storefront-feature__search::before { content: "ðŸ”" } .wc-wizard-storefront .wc-wizard-storefront-feature__compatibility::before { content: "🔧" } .wc-wizard-storefront .wc-wizard-storefront-feature__extendable::before { content: "🎨" } .wc-wizard-services { border: 1px solid #eee; padding: 0; margin: 0 0 1em; list-style: none outside; border-radius: 4px; overflow: hidden } .wc-wizard-services p { margin: 0 0 1em 0; padding: 0; font-size: 1em; line-height: 1.5em } .wc-wizard-service-item,.wc-wizard-services-list-toggle { display: -webkit-box; display: -webkit-flex; display: flex; -webkit-flex-wrap: nowrap; flex-wrap: nowrap; -webkit-box-pack: justify; -webkit-justify-content: space-between; justify-content: space-between; padding: 0; border-bottom: 1px solid #eee; color: #666; -webkit-box-align: center; -webkit-align-items: center; align-items: center } .wc-wizard-service-item:last-child,.wc-wizard-services-list-toggle:last-child { border-bottom: 0 } .wc-wizard-service-item .payment-gateway-fee,.wc-wizard-services-list-toggle .payment-gateway-fee { color: #a6a6a6 } .wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-services-list-toggle .wc-wizard-service-name { -webkit-flex-basis: 0; flex-basis: 0; min-width: 160px; text-align: center; font-weight: 700; padding: 2em 0; -webkit-align-self: stretch; align-self: stretch; display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-align: baseline; -webkit-align-items: baseline; align-items: baseline } .wc-wizard-payment-gateway-form .wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-payment-gateway-form .wc-wizard-services-list-toggle .wc-wizard-service-name { -webkit-box-pack: center; -webkit-justify-content: center; justify-content: center } .wc-wizard-service-item .wc-wizard-service-name img,.wc-wizard-services-list-toggle .wc-wizard-service-name img { max-width: 75px } .wc-wizard-service-item.stripe-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.stripe-logo .wc-wizard-service-name img { padding: 8px 0 } .wc-wizard-service-item.paypal-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.paypal-logo .wc-wizard-service-name img { max-width: 87px; padding: 2px 0 } .wc-wizard-service-item.klarna-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.klarna-logo .wc-wizard-service-name img { max-width: 87px; padding: 12px 0 } .wc-wizard-service-item.square-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.square-logo .wc-wizard-service-name img { max-width: 95px; padding: 12px 0 } .wc-wizard-service-item.eway-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.eway-logo .wc-wizard-service-name img { max-width: 87px } .wc-wizard-service-item.payfast-logo .wc-wizard-service-name img,.wc-wizard-services-list-toggle.payfast-logo .wc-wizard-service-name img { max-width: 140px } .wc-wizard-service-item .wc-wizard-service-description,.wc-wizard-services-list-toggle .wc-wizard-service-description { -webkit-box-flex: 1; -webkit-flex-grow: 1; flex-grow: 1; padding: 20px } .wc-wizard-service-item .wc-wizard-service-description p,.wc-wizard-services-list-toggle .wc-wizard-service-description p { margin-bottom: 1em } .wc-wizard-service-item .wc-wizard-service-description p:last-child,.wc-wizard-services-list-toggle .wc-wizard-service-description p:last-child { margin-bottom: 0 } .wc-wizard-service-item .wc-wizard-service-description .wc-wizard-service-settings-description,.wc-wizard-services-list-toggle .wc-wizard-service-description .wc-wizard-service-settings-description { display: block; font-style: italic; color: #999 } .wc-wizard-service-item .wc-wizard-service-enable,.wc-wizard-services-list-toggle .wc-wizard-service-enable { -webkit-flex-basis: 0; flex-basis: 0; min-width: 75px; text-align: center; cursor: pointer; padding: 2em 0; position: relative; max-height: 1.5em; -webkit-align-self: flex-start; align-self: flex-start; -webkit-box-ordinal-group: 4; -webkit-order: 3; order: 3 } .wc-wizard-service-item .wc-wizard-service-toggle,.wc-wizard-services-list-toggle .wc-wizard-service-toggle { height: 16px; width: 32px; border: 2px solid #935687; background-color: #935687; display: inline-block; text-indent: -9999px; border-radius: 10em; position: relative } .wc-wizard-service-item .wc-wizard-service-toggle input[type=checkbox],.wc-wizard-services-list-toggle .wc-wizard-service-toggle input[type=checkbox] { display: none } .wc-wizard-service-item .wc-wizard-service-toggle::before,.wc-wizard-services-list-toggle .wc-wizard-service-toggle::before { content: ""; display: block; width: 16px; height: 16px; background: #fff; position: absolute; top: 0; right: 0; border-radius: 100% } .wc-wizard-service-item .wc-wizard-service-toggle.disabled,.wc-wizard-services-list-toggle .wc-wizard-service-toggle.disabled { border-color: #999; background-color: #999 } .wc-wizard-service-item .wc-wizard-service-toggle.disabled::before,.wc-wizard-services-list-toggle .wc-wizard-service-toggle.disabled::before { right: auto; left: 0 } .wc-wizard-service-item .wc-wizard-service-settings,.wc-wizard-services-list-toggle .wc-wizard-service-settings { display: none; margin-top: .75em; margin-bottom: 0; cursor: default } .wc-wizard-service-item .wc-wizard-service-settings.hide,.wc-wizard-services-list-toggle .wc-wizard-service-settings.hide { display: none } .wc-wizard-service-item.checked .wc-wizard-service-settings,.wc-wizard-services-list-toggle.checked .wc-wizard-service-settings { display: inline-block } .wc-wizard-service-item.checked .wc-wizard-service-settings.hide,.wc-wizard-services-list-toggle.checked .wc-wizard-service-settings.hide { display: none } .wc-wizard-service-item.closed,.wc-wizard-services-list-toggle.closed { border-bottom: 0 } .wc-wizard-services-list-toggle { cursor: pointer } .wc-wizard-services-list-toggle .wc-wizard-service-enable::before { content: "\f343"; font-family: dashicons; visibility: initial; color: #666; font-size: 25px; margin-top: -7px; margin-left: -5px; position: absolute; visibility: visible } .wc-wizard-services-list-toggle.closed .wc-wizard-service-enable::before { content: "\f347" } .wc-wizard-services-list-toggle .wc-wizard-service-enable input { visibility: hidden; position: relative } .wc-wizard-services.manual .wc-wizard-service-item { display: none } .wc-wizard-services.shipping { margin: 0 } .wc-wizard-services.shipping .wc-wizard-service-name { font-weight: 400; text-align: left; -webkit-box-align: center; -webkit-align-items: center; align-items: center; max-height: 5em; padding: 0 } .wc-wizard-services.shipping .wc-wizard-service-item { padding-left: 2em; padding-top: .67em } .wc-wizard-services.shipping .wc-wizard-service-item:first-child { border-bottom: 0; padding-bottom: 0; font-weight: 700 } .wc-wizard-services.shipping .wc-wizard-service-item:first-child .wc-wizard-service-name { font-weight: 700 } .wc-wizard-services.shipping .shipping-method-setting,.wc-wizard-services.shipping .wc-wizard-shipping-method-select { display: -webkit-box; display: -webkit-flex; display: flex } .wc-wizard-services.shipping .shipping-method-setting.hide,.wc-wizard-services.shipping .wc-wizard-shipping-method-select.hide { display: none } .wc-wizard-services.shipping .shipping-method-setting input,.wc-wizard-services.shipping .wc-wizard-shipping-method-dropdown { margin-right: 2em; margin-bottom: 1em } .wc-wizard-services.shipping .shipping-method-setting input .select2,.wc-wizard-services.shipping .wc-wizard-shipping-method-dropdown .select2 { min-width: 130px } .wc-wizard-services.shipping .wc-wizard-service-description { display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -webkit-flex-direction: column; flex-direction: column; color: #a6a6a6 } .wc-wizard-services.shipping .wc-wizard-service-item:not(:first-child) .wc-wizard-service-description { font-size: .92em; padding-bottom: 10px } .wc-wizard-services.shipping .shipping-method-setting input { width: 95px; border: 1px solid #aaa; border-color: #ddd; border-radius: 4px; height: 28px; padding-left: 8px; padding-right: 24px; font-size: 14px; color: #444; background-color: #fff; display: inline-block } .wc-wizard-services.shipping .shipping-method-description,.wc-wizard-services.shipping .shipping-method-setting .description { color: #7e7e7e; font-size: .9em } .wc-wizard-services.shipping .shipping-method-setting input::-webkit-input-placeholder { color: #e1e1e1 } .wc-wizard-services.shipping .shipping-method-setting input::-moz-placeholder { color: #e1e1e1 } .wc-wizard-services.shipping .shipping-method-setting input:-ms-input-placeholder { color: #e1e1e1 } .wc-wizard-services.shipping .shipping-method-setting input::-ms-input-placeholder { color: #e1e1e1 } .wc-wizard-services.shipping .shipping-method-setting input::placeholder { color: #e1e1e1 } .wc-setup-shipping-units p { line-height: 1.5em; font-size: 13px; margin-bottom: .25em; text-align: center } .wc-setup-shipping-units .wc-setup-shipping-unit { margin-bottom: 1.75em } .wc-setup-shipping-units .wc-setup-shipping-unit .select2 { min-width: 125px; top: -5px } .hide { display: none } .wc-wizard-features { display: -webkit-box; display: -webkit-flex; display: flex; -webkit-flex-wrap: wrap; flex-wrap: wrap; list-style: none; padding: 0 } .wc-wizard-features .wc-wizard-feature-item { -webkit-flex-basis: calc(50% - 4em - 3px); flex-basis: calc(50% - 4em - 3px); border: 1px solid #eee; padding: 2em } .wc-wizard-features .wc-wizard-feature-item:nth-child(1) { border-radius: 4px 0 0 0 } .wc-wizard-features .wc-wizard-feature-item:nth-child(2) { border-left: 0; border-radius: 0 4px 0 0 } .wc-wizard-features .wc-wizard-feature-item:nth-child(3) { border-top: 0; border-radius: 0 0 0 4px } .wc-wizard-features .wc-wizard-feature-item:nth-child(4) { border-top: 0; border-left: 0; border-radius: 0 0 4px 0 } .wc-wizard-features p.wc-wizard-feature-description,.wc-wizard-features p.wc-wizard-feature-name { margin: 0; line-height: 1.5em } h3.jetpack-reasons { text-align: center; margin: 3em 0 1em 0; font-size: 14px } .jetpack-logo,.wcs-notice { display: block; margin: 1.75em auto 2em auto; max-height: 175px } .activate-splash .jetpack-logo { width: 170px; margin-bottom: 0 } .activate-splash .wcs-notice { margin-top: 1em; padding-left: 57px } .step { text-align: center } .wc-setup .wc-setup-actions .button { font-weight: 300; font-size: 16px; padding: 1em 2em; box-shadow: none; min-width: 12em; min-width: auto; margin-top: 10px } .wc-setup .wc-setup-actions .button:active,.wc-setup .wc-setup-actions .button:focus,.wc-setup .wc-setup-actions .button:hover { box-shadow: none } .wc-setup .wc-setup-actions .plugin-install-info { display: block; font-style: italic; color: #999; font-size: 14px; line-height: 1.5em; margin: 5px 0 } .wc-setup .wc-setup-actions .plugin-install-info>* { display: block } .wc-setup .wc-setup-actions .plugin-install-info .plugin-install-info-list-item::after { content: ", " } .wc-setup .wc-setup-actions .plugin-install-info .plugin-install-info-list-item:last-of-type::after { content: ". " } .wc-setup .wc-setup-actions .plugin-install-info a { white-space: nowrap } .wc-setup .wc-setup-actions .plugin-install-info a:not(:hover):not(:focus) { color: inherit } .plugin-install-source { background: rgba(187,119,174,.15) } .plugin-install-source:not(.wc-wizard-service-item) { box-shadow: 0 0 0 10px rgba(187,119,174,.15) } .location-prompt { color: #666; font-size: 13px; font-weight: 500; margin-bottom: .5em; margin-top: .85em; display: inline-block } .location-input { border: 1px solid #aaa; border-color: #ddd; border-radius: 4px; height: 30px; width: calc(100% - 8px - 24px - 2px); padding-left: 8px; padding-right: 24px; font-size: 16px; color: #444; background-color: #fff; display: inline-block } .location-input.dropdown { width: 100% } .address-step .select2 { min-width: 100% } .store-address-container .city-and-postcode { display: -webkit-box; display: -webkit-flex; display: flex } .store-address-container .city-and-postcode div { -webkit-flex-basis: 50%; flex-basis: 50%; margin-right: 1em } .store-address-container .city-and-postcode div:last-of-type { margin-right: 0 } .store-address-container .select2-container,.store-address-container input[type=text],.store-address-container select { margin-bottom: 10px } .product-type-container { margin-top: 14px; margin-bottom: 1px } #woocommerce_sell_in_person { margin-left: 0 } .wc-wizard-service-settings .payment-email-input { border: 1px solid #aaa; border-color: #ddd; border-radius: 4px; height: 30px; padding: 0 8px; font-size: 14px; color: #444; background-color: #fff; display: inline-block } .wc-wizard-service-settings .payment-email-input[disabled] { color: #aaa } .newsletter-form-container { display: -webkit-box; display: -webkit-flex; display: flex } .newsletter-form-container .newsletter-form-email { border: 1px solid #aaa; border-color: #ddd; border-radius: 4px; height: 42px; padding: 0 8px; font-size: 16px; color: #666; background-color: #fff; display: inline-block; margin-right: 6px; -webkit-box-flex: 1; -webkit-flex-grow: 1; flex-grow: 1 } .newsletter-form-container .newsletter-form-button-container { -webkit-box-flex: 0; -webkit-flex-grow: 0; flex-grow: 0 } .wc-setup .wc-setup-actions .button.newsletter-form-button { height: 42px; padding: 0 1em; margin: 0 } .wc-wizard-next-steps { border: 1px solid #eee; border-radius: 4px; list-style: none; padding: 0 } .wc-wizard-next-steps li { padding: 0 } .wc-wizard-next-steps .wc-wizard-next-step-item { display: -webkit-box; display: -webkit-flex; display: flex; border-top: 1px solid #eee } .wc-wizard-next-steps .wc-wizard-next-step-item:first-child { border-top: 0 } .wc-wizard-next-steps .wc-wizard-next-step-description { -webkit-box-flex: 1; -webkit-flex-grow: 1; flex-grow: 1; margin: 1.5em } .wc-wizard-next-steps .wc-wizard-next-step-action { -webkit-box-flex: 0; -webkit-flex-grow: 0; flex-grow: 0; display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-align: center; -webkit-align-items: center; align-items: center } .wc-wizard-next-steps .wc-wizard-next-step-action .button { margin: 1em 1.5em } .wc-wizard-next-steps p.next-step-heading { margin: 0; font-size: .95em; font-weight: 400; font-variant: all-petite-caps } .wc-wizard-next-steps p.next-step-extra-info { margin: 0 } .wc-wizard-next-steps h3.next-step-description { margin: 0; font-size: 16px; font-weight: 600 } .wc-wizard-next-steps .wc-wizard-additional-steps { border-top: 1px solid #eee } .wc-wizard-next-steps .wc-wizard-additional-steps .wc-wizard-next-step-description { margin-bottom: 0 } .wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions { margin: 0 0 1.5em 0 } .wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions .button { font-size: 15px; margin: 1em 0 1em 1.5em } .wc-wizard-next-steps .wc-wizard-additional-steps .wc-setup-actions .button::last-child { margin-right: 1.5em } p.next-steps-help-text { color: #9f9f9f; padding: 0 2em; text-align: center; font-size: .9em } p.jetpack-terms { font-size: .8em; text-align: center; max-width: 480px; margin: 0 auto; line-height: 1.5em } .woocommerce-error { background: #ffe6e5; border-color: #ffc5c2; padding: 1em; margin-bottom: 1em } .woocommerce-error p { margin-top: 0; margin-bottom: .5em; color: #444 } .woocommerce-error a { color: #ff645c } .woocommerce-error .reconnect-reminder { font-size: .85em } .woocommerce-error .wc-setup-actions .button { font-size: 14px } .wc-wizard-service-setting-ppec_paypal_reroute_requests,.wc-wizard-service-setting-stripe_create_account { display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-align: start; -webkit-align-items: flex-start; align-items: flex-start } .wc-wizard-service-setting-ppec_paypal_reroute_requests .payment-checkbox-input,.wc-wizard-service-setting-stripe_create_account .payment-checkbox-input { -webkit-box-ordinal-group: 2; -webkit-order: 1; order: 1; margin-top: 5px; margin-left: 0; margin-right: 0; width: 1.5em } .wc-wizard-service-setting-ppec_paypal_reroute_requests .ppec_paypal_reroute_requests,.wc-wizard-service-setting-ppec_paypal_reroute_requests .stripe_create_account,.wc-wizard-service-setting-stripe_create_account .ppec_paypal_reroute_requests,.wc-wizard-service-setting-stripe_create_account .stripe_create_account { -webkit-box-ordinal-group: 3; -webkit-order: 2; order: 2; margin-left: .3em } .wc-wizard-service-setting-ppec_paypal_email,.wc-wizard-service-setting-stripe_email { margin-top: .75em; margin-left: 1.5em } .wc-wizard-service-setting-ppec_paypal_email label.ppec_paypal_email,.wc-wizard-service-setting-ppec_paypal_email label.stripe_email,.wc-wizard-service-setting-stripe_email label.ppec_paypal_email,.wc-wizard-service-setting-stripe_email label.stripe_email { position: absolute; margin: -1px; padding: 0; height: 1px; width: 1px; overflow: hidden; clip: rect(0 0 0 0); border: 0 } .wc-wizard-service-setting-ppec_paypal_email input.payment-email-input,.wc-wizard-service-setting-stripe_email input.payment-email-input { box-sizing: border-box; margin-bottom: .5em; width: 100%; height: 32px } .wc-setup-content .recommended-step { border: 1px solid #ebebeb; border-radius: 4px; padding: 2.5em } .wc-setup-content .recommended-item { list-style: none } .wc-setup-content .recommended-item:last-child label { margin-bottom: 0 } .wc-setup-content .recommended-item label { display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-align: center; -webkit-align-items: center; align-items: center; margin-bottom: 1.5em } .wc-setup-content .recommended-item label::after,.wc-setup-content .recommended-item label::before { top: auto } .wc-setup-content .recommended-item label::after { margin-top: -1.5px } .wc-setup-content .recommended-item .recommended-item-icon { border: 1px solid #fff; border-radius: 7px; height: 3.5em; margin-right: 1em; margin-left: 4px } .wc-setup-content .recommended-item .recommended-item-icon.recommended-item-icon-storefront_theme { background-color: #f4a224; max-height: 3em; max-width: 3em; padding: .25em } .wc-setup-content .recommended-item .recommended-item-icon.recommended-item-icon-automated_taxes { background-color: #d0011b; max-height: 1.75em; padding: .875em } .wc-setup-content .recommended-item .recommended-item-icon.recommended-item-icon-mailchimp { background-color: #ffe01b; height: 2em; padding: .75em } .wc-setup-content .recommended-item .recommended-item-icon.recommended-item-icon-woocommerce_services { background-color: #f0f0f0; max-height: 1.5em; padding: 1.3em .7em } .wc-setup-content .recommended-item .recommended-item-icon.recommended-item-icon-shipstation { background-color: #f0f0f0; padding: .3em } .wc-setup-content .recommended-item .recommended-item-description-container h3 { font-size: 15px; font-weight: 700; letter-spacing: .5px; margin-bottom: 0 } .wc-setup-content .recommended-item .recommended-item-description-container p { margin-top: 0; line-height: 1.5em } .wc-wizard-service-info { padding: 1em 2em; background-color: #fafafa } .help_tip { -webkit-text-decoration: underline dotted; text-decoration: underline dotted } .wc-setup #tiptip_content { background: #5f6973 } .wc-setup #tiptip_holder.tip_top #tiptip_arrow_inner { border-top-color: #5f6973 } .wc-setup-shipping-recommended { border-bottom: 1px solid #eee; margin-top: 0; padding: 30px 0 } @media only screen and (max-width: 400px) { #wc-logo img { max-width:80% } .wc-setup-steps { display: none } .store-address-container .city-and-postcode { display: block } .store-address-container .city-and-postcode div { margin-right: 0 } .wc-wizard-service-item,.wc-wizard-services-list-toggle { -webkit-flex-wrap: wrap; flex-wrap: wrap } .wc-wizard-service-item .wc-wizard-service-enable,.wc-wizard-services-list-toggle .wc-wizard-service-enable { -webkit-box-ordinal-group: 3; -webkit-order: 2; order: 2; padding: 20px 0 0 } .wc-wizard-service-item .wc-wizard-service-description,.wc-wizard-services-list-toggle .wc-wizard-service-description { -webkit-box-ordinal-group: 4; -webkit-order: 3; order: 3 } .wc-wizard-service-item .wc-wizard-service-name,.wc-wizard-services-list-toggle .wc-wizard-service-name { padding: 20px 20px 0; text-align: left; -webkit-box-pack: justify!important; -webkit-justify-content: space-between!important; justify-content: space-between!important } .wc-wizard-service-item .wc-wizard-service-name img,.wc-wizard-services-list-toggle .wc-wizard-service-name img { margin: 0 } .newsletter-form-container { display: block } .newsletter-form-container .newsletter-form-email { display: block; box-sizing: border-box; width: 100%; margin-bottom: 10px } .newsletter-form-container .button.newsletter-form-button { float: left } .wc-wizard-next-steps .wc-wizard-next-step-item { -webkit-flex-wrap: wrap; flex-wrap: wrap } .wc-wizard-next-steps .wc-wizard-next-step-item .wc-wizard-next-step-description { margin-bottom: 0 } .wc-wizard-next-steps .wc-wizard-next-step-item .wc-wizard-next-step-action p { margin: 0 } } pro/sa-includes/css/admin.min.css000064400001045625147600337620012754 0ustar00// phpcs:ignoreFile @charset "UTF-8";.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;margin:0 0 -4px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left;padding:0}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:0;font-size:100%;margin:0;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:#fff;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected],.select2-results__option[data-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:0;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;height:1px !important;margin:-1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none;margin:5px 5px 0 0}.select2-container--default .select2-selection--multiple .select2-selection__rendered li:before{content:'';display:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder{float:right}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid #000 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:0;border:0;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[data-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected],.select2-container--default .select2-results__option--highlighted[data-selected]{background-color:#0073aa;color:#fff}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#fff),to(#eee));background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single:focus{border:1px solid #0073aa}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:700;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:0;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#eee),to(#ccc));background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow{border:0;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #0073aa}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:0;border:0}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:0;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-gradient(linear,left top,left bottom,from(white),color-stop(50%,#eee));background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-gradient(linear,left top,left bottom,color-stop(50%,#eee),to(white));background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x}.select2-container--classic .select2-selection--multiple{background-color:#fff;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #0073aa}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:700;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #0073aa}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:0;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:0}.select2-container--classic .select2-dropdown--below{border-top:0}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected],.select2-container--classic .select2-results__option--highlighted[data-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#0073aa}@-webkit-keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@font-face{font-family:star;src:url(../fonts/star.eot);src:url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg");font-weight:400;font-style:normal}@font-face{font-family:WooCommerce;src:url(../fonts/WooCommerce.eot);src:url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg");font-weight:400;font-style:normal}.blockUI.blockOverlay::before{height:1em;width:1em;display:block;position:absolute;top:50%;left:50%;margin-left:-.5em;margin-top:-.5em;content:'';-webkit-animation:spin 1s ease-in-out infinite;animation:spin 1s ease-in-out infinite;background:url(../images/icons/loader.svg) center center;background-size:cover;line-height:1;text-align:center;font-size:2em;color:rgba(0,0,0,.75)}.wc_addons_wrap{max-width:1200px}.wc_addons_wrap h1.search-form-title{clear:left;padding:0}.wc_addons_wrap form.search-form{clear:both;display:block;position:relative;margin-top:1em;margin-bottom:1em}.wc_addons_wrap form.search-form input{border:1px solid #ddd;box-shadow:none;height:53px;padding-left:50px;width:100%;margin:0}.wc_addons_wrap form.search-form button{background:0;border:0;cursor:pointer;height:53px;position:absolute;width:53px}.wc_addons_wrap .update-plugins .update-count{background-color:#d54e21;border-radius:10px;color:#fff;display:inline-block;font-size:9px;font-weight:600;line-height:17px;margin:1px 0 0 2px;padding:0 6px;vertical-align:text-top}.wc_addons_wrap .addons-featured{margin:0}.wc_addons_wrap ul.subsubsub.subsubsub{margin:-2px 0 12px}.wc_addons_wrap .subsubsub li::after{content:"|"}.wc_addons_wrap .subsubsub li:last-child::after{content:""}.wc_addons_wrap .addons-banner-block-item-icon,.wc_addons_wrap .addons-column-block-item-icon{-webkit-box-align:center;-webkit-align-items:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center}.wc_addons_wrap .addons-banner-block,.wc_addons_wrap .addons-wcs-banner-block{background:#fff;border:1px solid #ddd;margin:0 0 1em 0;padding:2em 2em 1em}.wc_addons_wrap .addons-banner-block img{height:62px}.wc_addons_wrap .addons-banner-block p{margin:0 0 20px}.wc_addons_wrap .addons-banner-block-items{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-around;justify-content:space-around;margin:0 -10px 0 -10px}.wc_addons_wrap .addons-banner-block-item{border:1px solid #e6e6e6;border-radius:3px;-webkit-box-flex:1;-webkit-flex:1;flex:1;margin:1em;min-width:200px;width:30%}.wc_addons_wrap .addons-banner-block-item-icon{background:#f7f7f7;height:143px}.wc_addons_wrap .addons-banner-block-item-content{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;height:184px;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;padding:24px}.wc_addons_wrap .addons-banner-block-item-content h3{margin-top:0}.wc_addons_wrap .addons-banner-block-item-content p{margin:0 0 auto}.wc_addons_wrap .addons-wcs-banner-block{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center}.wc_addons_wrap .addons-wcs-banner-block-image{background:#f7f7f7;border:1px solid #e6e6e6;margin-right:2em;padding:4em}.wc_addons_wrap .addons-wcs-banner-block-image .addons-img{max-height:86px;max-width:97px}.wc_addons_wrap .addons-shipping-methods .addons-wcs-banner-block{margin-left:0;margin-right:0;margin-top:1em}.wc_addons_wrap .addons-wcs-banner-block-content{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;-webkit-justify-content:space-around;justify-content:space-around;-webkit-align-self:stretch;align-self:stretch;padding:1em 0}.wc_addons_wrap .addons-wcs-banner-block-content h1{padding-bottom:0}.wc_addons_wrap .addons-wcs-banner-block-content p{margin-bottom:0}.wc_addons_wrap .addons-wcs-banner-block-content .wcs-service-logo{max-width:40px}.wc_addons_wrap .addons-column-section{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-around;justify-content:space-around}.wc_addons_wrap .addons-column{-webkit-box-flex:1;-webkit-flex:1;flex:1;width:50%;padding:0 .5em}.wc_addons_wrap .addons-column:nth-child(2){margin-right:0}.wc_addons_wrap .addons-column-block,.wc_addons_wrap .addons-small-dark-block,.wc_addons_wrap .addons-small-light-block{box-sizing:border-box;border:1px solid #ddd;margin:0 0 1em;padding:20px}.wc_addons_wrap .addons-column-block img{max-height:50px;max-width:50px}.wc_addons_wrap .addons-column-block,.wc_addons_wrap .addons-small-light-block{background:#fff}.wc_addons_wrap .addons-column-block-left{float:left}.wc_addons_wrap .addons-column-block-right{float:right}.wc_addons_wrap .addons-column-block-item{border-top:2px solid #f9f9f9;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;margin:0 -20px;padding:20px}.wc_addons_wrap .addons-column-block-item-icon{background:#f7f7f7;border:1px solid #e6e6e6;height:100px;margin:0 10px 10px 0;width:100px}.wc_addons_wrap .addons-column-block-item-content{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-flex:1;-webkit-flex:1;flex:1;-webkit-flex-wrap:wrap;flex-wrap:wrap;height:20%;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between;min-width:200px}.wc_addons_wrap .addons-column-block-item-content h2{float:left;margin-top:8px}.wc_addons_wrap .addons-column-block-item-content a{float:right}.wc_addons_wrap .addons-column-block-item-content p{float:left}.wc_addons_wrap .addons-banner-block-item,.wc_addons_wrap .addons-column-block-item{display:none}.wc_addons_wrap .addons-banner-block-item:nth-child(-n+3){display:block}.wc_addons_wrap .addons-column-block-item:nth-of-type(-n+3){display:-webkit-box;display:-webkit-flex;display:flex}.wc_addons_wrap .addons-small-dark-block{background-color:#54687d;text-align:center}.wc_addons_wrap .addons-small-dark-items{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap;-webkit-justify-content:space-around;justify-content:space-around}.wc_addons_wrap .addons-small-dark-item{margin:0 0 20px}.wc_addons_wrap .addons-small-dark-block h1{color:#fff}.wc_addons_wrap .addons-small-dark-block p{color:#fafafa}.wc_addons_wrap .addons-small-dark-item-icon img{height:30px}.wc_addons_wrap .addons-small-dark-item a{margin:28px auto 0}.wc_addons_wrap .addons-small-light-block{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-flex-wrap:wrap;flex-wrap:wrap}.wc_addons_wrap .addons-small-light-block h1{margin-top:-12px}.wc_addons_wrap .addons-small-light-block p{margin-top:0}.wc_addons_wrap .addons-small-light-block img{height:225px;margin:0 0 0 -20px}.wc_addons_wrap .addons-small-light-block-content{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-flex:1;-webkit-flex:1 1 100px;flex:1 1 100px;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column;-webkit-justify-content:space-around;justify-content:space-around}.wc_addons_wrap .addons-small-light-block-buttons{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;justify-content:space-between}.wc_addons_wrap .addons-small-light-block-content a{width:48%}.wc_addons_wrap .addons-button{border-radius:3px;cursor:pointer;display:block;height:37px;line-height:37px;text-align:center;text-decoration:none;width:124px}.wc_addons_wrap .addons-button-solid{background-color:#955a89;color:#fff}.wc_addons_wrap .addons-button-solid:hover{color:#fff;opacity:.8}.wc_addons_wrap .addons-button-outline-green{border:1px solid #73ae39;color:#73ae39}.wc_addons_wrap .addons-button-outline-green:hover{color:#73ae39;opacity:.8}.wc_addons_wrap .addons-button-outline-white{border:1px solid #fff;color:#fff}.wc_addons_wrap .addons-button-outline-white:hover{color:#fff;opacity:.8}.wc_addons_wrap .addons-button-installed{background:#e6e6e6;color:#3c3c3c}.wc_addons_wrap .addons-button-installed:hover{color:#3c3c3c;opacity:.8}@media only screen and (max-width:400px){.wc_addons_wrap .addons-featured{margin:-1% -5%}.wc_addons_wrap .addons-button{width:100%}.wc_addons_wrap .addons-small-dark-item{width:100%}.wc_addons_wrap .addons-column-block-item-icon{background:0;border:0;height:75px;margin:0 10px 10px 0;width:75px}}.wc_addons_wrap .products{overflow:hidden;display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row;flex-flow:row;-webkit-flex-wrap:wrap;flex-wrap:wrap;margin:0 -.5em}.wc_addons_wrap .products li{float:left;border:1px solid #ddd;margin:0 .5em 1em !important;padding:0;vertical-align:top;width:25%;min-width:280px;min-height:220px;-webkit-box-flex:1;-webkit-flex:1;flex:1;overflow:hidden;background:#f5f5f5;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),inset 0 -1px 0 rgba(0,0,0,.1)}.wc_addons_wrap .products li a{text-decoration:none;color:inherit;display:block;height:100%}.wc_addons_wrap .products li a .product-img-wrap{background:#fff;display:block}.wc_addons_wrap .products li a img{max-width:258px;max-height:24px;padding:17px 20px;display:block;margin:0;background:#fff;border-right:260px solid #fff}.wc_addons_wrap .products li a img.extension-thumb+h3{display:none}.wc_addons_wrap .products li a .price{display:none}.wc_addons_wrap .products li a h2,.wc_addons_wrap .products li a h3{margin:0 !important;padding:20px !important;background:#fff}.wc_addons_wrap .products li a p{padding:20px !important;margin:0 !important;border-top:1px solid #f1f1f1}.wc_addons_wrap .products li a:focus,.wc_addons_wrap .products li a:hover{background-color:#fff}.wc_addons_wrap .storefront{background:url(../images/storefront-bg.jpg) bottom right #f6f6f6;border:1px solid #ddd;margin-top:1em;padding:20px;overflow:hidden;zoom:1}.wc_addons_wrap .storefront img{width:278px;height:auto;float:left;margin:0 20px 0 0;box-shadow:0 1px 6px rgba(0,0,0,.1)}.wc_addons_wrap .storefront p{max-width:750px}.woocommerce-BlankState a.button-primary,.woocommerce-BlankState button.button-primary,.woocommerce-message a.button-primary,.woocommerce-message button.button-primary{background:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;color:#fff;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597;display:inline-block}.woocommerce-BlankState a.button-primary:active,.woocommerce-BlankState a.button-primary:focus,.woocommerce-BlankState a.button-primary:hover,.woocommerce-BlankState button.button-primary:active,.woocommerce-BlankState button.button-primary:focus,.woocommerce-BlankState button.button-primary:hover,.woocommerce-message a.button-primary:active,.woocommerce-message a.button-primary:focus,.woocommerce-message a.button-primary:hover,.woocommerce-message button.button-primary:active,.woocommerce-message button.button-primary:focus,.woocommerce-message button.button-primary:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-message{position:relative;border-left-color:#cc99c2 !important;overflow:hidden}.woocommerce-message a.docs,.woocommerce-message a.skip{text-decoration:none !important}.woocommerce-message a.woocommerce-message-close{position:static;float:right;padding:0 15px 10px 28px;margin-top:-10px;font-size:13px;line-height:1.23076923;text-decoration:none}.woocommerce-message a.woocommerce-message-close::before{position:relative;top:18px;left:-20px;-webkit-transition:all .1s ease-in-out;transition:all .1s ease-in-out}.woocommerce-message .twitter-share-button{margin-top:-3px;margin-left:3px;vertical-align:middle}#variable_product_options #message,#variable_product_options .notice{margin:10px}.clear{clear:both}.wrap.woocommerce div.error,.wrap.woocommerce div.updated{margin-top:10px}mark.amount{background:transparent none;color:inherit}.woocommerce-help-tip{color:#666;display:inline-block;font-size:1.1em;font-style:normal;height:16px;line-height:16px;position:relative;vertical-align:middle;width:16px}.woocommerce-help-tip::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";cursor:help}h2 .woocommerce-help-tip{margin-top:-5px;margin-left:.25em}table.wc_status_table{margin-bottom:1em}table.wc_status_table h2{font-size:14px;margin:0}table.wc_status_table tr:nth-child(2n) td,table.wc_status_table tr:nth-child(2n) th{background:#fcfcfc}table.wc_status_table th{font-weight:700;padding:9px}table.wc_status_table td:first-child{width:33%}table.wc_status_table td.help{width:1em}table.wc_status_table td,table.wc_status_table th{font-size:1.1em;font-weight:400}table.wc_status_table td.run-tool,table.wc_status_table th.run-tool{text-align:right}table.wc_status_table td strong.name,table.wc_status_table th strong.name{display:block;margin-bottom:.5em}table.wc_status_table td mark,table.wc_status_table th mark{background:transparent none}table.wc_status_table td mark.yes,table.wc_status_table th mark.yes{color:#7ad03a}table.wc_status_table td mark.no,table.wc_status_table th mark.no{color:#999}table.wc_status_table td .red,table.wc_status_table td mark.error,table.wc_status_table th .red,table.wc_status_table th mark.error{color:#a00}table.wc_status_table td ul,table.wc_status_table th ul{margin:0}table.wc_status_table .help_tip{cursor:help}table.wc_status_table--tools td,table.wc_status_table--tools th{padding:2em}.taxonomy-product_cat .check-column .woocommerce-help-tip{font-size:1.5em;margin:-3px 0 0 5px;display:block;position:absolute}#debug-report{display:none;margin:10px 0;padding:0;position:relative}#debug-report textarea{font-family:monospace;width:100%;margin:0;height:300px;padding:20px;border-radius:0;resize:none;font-size:12px;line-height:20px;outline:0}.wp-list-table.logs .log-level{display:inline;padding:.2em .6em .3em;font-size:80%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.2em}.wp-list-table.logs .log-level:empty{display:none}.wp-list-table.logs .log-level--alert,.wp-list-table.logs .log-level--emergency{background-color:#ff4136}.wp-list-table.logs .log-level--critical,.wp-list-table.logs .log-level--error{background-color:#ff851b}.wp-list-table.logs .log-level--notice,.wp-list-table.logs .log-level--warning{color:#222;background-color:#ffdc00}.wp-list-table.logs .log-level--info{background-color:#0074d9}.wp-list-table.logs .log-level--debug{background-color:#3d9970}@media screen and (min-width:783px){.wp-list-table.logs .column-timestamp{width:18%}.wp-list-table.logs .column-level{width:14%}.wp-list-table.logs .column-source{width:15%}}#log-viewer-select{padding:10px 0 8px;line-height:28px}#log-viewer-select h2 a{vertical-align:middle}#log-viewer{background:#fff;border:1px solid #e5e5e5;box-shadow:0 1px 1px rgba(0,0,0,.04);padding:5px 20px}#log-viewer pre{font-family:monospace;white-space:pre-wrap;word-wrap:break-word}.inline-edit-product.quick-edit-row .inline-edit-col-center,.inline-edit-product.quick-edit-row .inline-edit-col-right{float:right !important}#woocommerce-fields.inline-edit-col{clear:left}#woocommerce-fields.inline-edit-col label.featured,#woocommerce-fields.inline-edit-col label.manage_stock{margin-left:10px}#woocommerce-fields.inline-edit-col label.stock_status_field{clear:both;float:left}#woocommerce-fields.inline-edit-col .dimensions div{display:block;margin:.2em 0}#woocommerce-fields.inline-edit-col .dimensions div span.title{display:block;float:left;width:5em}#woocommerce-fields.inline-edit-col .dimensions div span.input-text-wrap{display:block;margin-left:5em}#woocommerce-fields.inline-edit-col .text{box-sizing:border-box;width:99%;float:left;margin:1px 1% 1px 1px}#woocommerce-fields.inline-edit-col .height,#woocommerce-fields.inline-edit-col .length,#woocommerce-fields.inline-edit-col .width{width:32.33%}#woocommerce-fields.inline-edit-col .height{margin-right:0}#woocommerce-fields-bulk.inline-edit-col label{clear:left}#woocommerce-fields-bulk.inline-edit-col .inline-edit-group label{clear:none;width:49%;margin:.2em 0}#woocommerce-fields-bulk.inline-edit-col .inline-edit-group.dimensions label{width:75%;max-width:75%}#woocommerce-fields-bulk.inline-edit-col .length,#woocommerce-fields-bulk.inline-edit-col .regular_price,#woocommerce-fields-bulk.inline-edit-col .sale_price,#woocommerce-fields-bulk.inline-edit-col .stock,#woocommerce-fields-bulk.inline-edit-col .weight{box-sizing:border-box;width:100%;margin-left:4.4em}#woocommerce-fields-bulk.inline-edit-col .height,#woocommerce-fields-bulk.inline-edit-col .length,#woocommerce-fields-bulk.inline-edit-col .width{box-sizing:border-box;width:25%}.column-coupon_code{line-height:2.25em}.column-coupon_code,ul.wc_coupon_list{margin:0;overflow:hidden;zoom:1;clear:both}ul.wc_coupon_list{padding-bottom:5px}ul.wc_coupon_list li{margin:0}ul.wc_coupon_list li.code{display:inline-block;position:relative;padding:0 .5em;background-color:#fff;border:1px solid #aaa;box-shadow:0 1px 0 #dfdfdf;border-radius:4px;margin-right:5px;margin-top:5px}ul.wc_coupon_list li.code.editable{padding-right:2em}ul.wc_coupon_list li.code .tips{cursor:pointer}ul.wc_coupon_list li.code .tips span{color:#888}ul.wc_coupon_list li.code .tips span:hover{color:#000}ul.wc_coupon_list li.code .remove-coupon{text-decoration:none;color:#888;position:absolute;top:7px;right:20px}ul.wc_coupon_list li.code .remove-coupon::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"ï…˜"}ul.wc_coupon_list li.code .remove-coupon:hover::before{color:#a00}ul.wc_coupon_list_block{margin:0;padding-bottom:2px}ul.wc_coupon_list_block li{border-top:1px solid #fff;border-bottom:1px solid #ccc;line-height:2.5em;margin:0;padding:.5em 0}ul.wc_coupon_list_block li:first-child{border-top:0;padding-top:0}ul.wc_coupon_list_block li:last-child{border-bottom:0;padding-bottom:0}.button.wc-reload{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;padding:0;height:28px;width:28px !important;display:inline-block}.button.wc-reload::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"ï…";line-height:28px}#woocommerce-order-data .handlediv,#woocommerce-order-data .hndle{display:none}#woocommerce-order-data .inside{display:block !important}#order_data{padding:23px 24px 12px}#order_data h2{margin:0;font-family:HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",sans-serif;font-size:21px;font-weight:400;line-height:1.2;text-shadow:1px 1px 1px #fff;padding:0}#order_data h3{font-size:14px}#order_data h3,#order_data h4{color:#333;margin:1.33em 0 0}#order_data p{color:#777}#order_data p.order_number{margin:0;font-family:HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",sans-serif;font-weight:400;line-height:1.6em;font-size:16px}#order_data .order_data_column_container{clear:both}#order_data .order_data_column{width:32%;padding:0 2% 0 0;float:left}#order_data .order_data_column>h3 span{display:block}#order_data .order_data_column:last-child{padding-right:0}#order_data .order_data_column p{padding:0 !important}#order_data .order_data_column .address strong{display:block}#order_data .order_data_column .form-field{float:left;clear:left;width:48%;padding:0;margin:9px 0 0}#order_data .order_data_column .form-field label{display:block;padding:0 0 3px}#order_data .order_data_column .form-field input,#order_data .order_data_column .form-field textarea{width:100%}#order_data .order_data_column .form-field select{width:100%}#order_data .order_data_column .form-field .select2-container{width:100% !important}#order_data .order_data_column .form-field .date-picker{width:50%}#order_data .order_data_column .form-field .hour,#order_data .order_data_column .form-field .minute{width:3.5em}#order_data .order_data_column .form-field small{display:block;margin:5px 0 0;color:#999}#order_data .order_data_column ._billing_address_2_field,#order_data .order_data_column ._billing_last_name_field,#order_data .order_data_column ._billing_phone_field,#order_data .order_data_column ._billing_postcode_field,#order_data .order_data_column ._billing_state_field,#order_data .order_data_column ._shipping_address_2_field,#order_data .order_data_column ._shipping_last_name_field,#order_data .order_data_column ._shipping_postcode_field,#order_data .order_data_column ._shipping_state_field,#order_data .order_data_column .form-field.last{float:right;clear:right}#order_data .order_data_column ._billing_company_field,#order_data .order_data_column ._shipping_company_field,#order_data .order_data_column ._transaction_id_field,#order_data .order_data_column .form-field-wide{width:100%;clear:both}#order_data .order_data_column ._billing_company_field .wc-category-search,#order_data .order_data_column ._billing_company_field .wc-customer-search,#order_data .order_data_column ._billing_company_field .wc-enhanced-select,#order_data .order_data_column ._billing_company_field input,#order_data .order_data_column ._billing_company_field select,#order_data .order_data_column ._billing_company_field textarea,#order_data .order_data_column ._shipping_company_field .wc-category-search,#order_data .order_data_column ._shipping_company_field .wc-customer-search,#order_data .order_data_column ._shipping_company_field .wc-enhanced-select,#order_data .order_data_column ._shipping_company_field input,#order_data .order_data_column ._shipping_company_field select,#order_data .order_data_column ._shipping_company_field textarea,#order_data .order_data_column ._transaction_id_field .wc-category-search,#order_data .order_data_column ._transaction_id_field .wc-customer-search,#order_data .order_data_column ._transaction_id_field .wc-enhanced-select,#order_data .order_data_column ._transaction_id_field input,#order_data .order_data_column ._transaction_id_field select,#order_data .order_data_column ._transaction_id_field textarea,#order_data .order_data_column .form-field-wide .wc-category-search,#order_data .order_data_column .form-field-wide .wc-customer-search,#order_data .order_data_column .form-field-wide .wc-enhanced-select,#order_data .order_data_column .form-field-wide input,#order_data .order_data_column .form-field-wide select,#order_data .order_data_column .form-field-wide textarea{width:100%}#order_data .order_data_column p.none_set{color:#999}#order_data .order_data_column div.edit_address{display:none;zoom:1;padding-right:1px}#order_data .order_data_column .wc-customer-user label a,#order_data .order_data_column .wc-order-status label a{float:right;margin-left:8px}#order_data .order_data_column a.edit_address{width:14px;height:0;padding:14px 0 0;margin:0 0 0 6px;overflow:hidden;position:relative;color:#999;border:0;float:right}#order_data .order_data_column a.edit_address:focus,#order_data .order_data_column a.edit_address:hover{color:#000}#order_data .order_data_column a.edit_address::after{font-family:WooCommerce;position:absolute;top:0;left:0;text-align:center;vertical-align:top;line-height:14px;font-size:14px;font-weight:400}#order_data .order_data_column a.edit_address::after{font-family:Dashicons;content:"\f464"}#order_data .order_data_column .billing-same-as-shipping,#order_data .order_data_column .load_customer_billing,#order_data .order_data_column .load_customer_shipping{font-size:13px;display:inline-block;font-weight:400}#order_data .order_data_column .load_customer_shipping{margin-right:.3em}.order_actions{margin:0;overflow:hidden;zoom:1}.order_actions li{border-top:1px solid #fff;border-bottom:1px solid #ddd;padding:6px 0;margin:0;line-height:1.6em;float:left;width:50%;text-align:center}.order_actions li a{float:none;text-align:center;text-decoration:underline}.order_actions li.wide{width:auto;float:none;clear:both;padding:6px;text-align:left;overflow:hidden}.order_actions li #delete-action{line-height:25px;vertical-align:middle;text-align:left;float:left}.order_actions li .save_order{float:right}.order_actions li#actions{overflow:hidden}.order_actions li#actions .button{width:24px;box-sizing:border-box;float:right}.order_actions li#actions select{width:225px;box-sizing:border-box;float:left}#woocommerce-order-items .inside{margin:0;padding:0;background:#fefefe}#woocommerce-order-items .wc-order-data-row{border-bottom:1px solid #dfdfdf;padding:1.5em 2em;background:#f8f8f8;line-height:2em;text-align:right}#woocommerce-order-items .wc-order-data-row::after,#woocommerce-order-items .wc-order-data-row::before{content:' ';display:table}#woocommerce-order-items .wc-order-data-row::after{clear:both}#woocommerce-order-items .wc-order-data-row p{margin:0;line-height:2em}#woocommerce-order-items .wc-order-data-row .wc-used-coupons{text-align:left}#woocommerce-order-items .wc-order-data-row .wc-used-coupons .tips{display:inline-block}#woocommerce-order-items .wc-used-coupons{float:left;width:50%}#woocommerce-order-items .wc-order-totals{float:right;width:50%;margin:0;padding:0;text-align:right}#woocommerce-order-items .wc-order-totals .amount{font-weight:700}#woocommerce-order-items .wc-order-totals .label{vertical-align:top}#woocommerce-order-items .wc-order-totals .total{font-size:1em !important;width:10em;margin:0 0 0 .5em;box-sizing:border-box}#woocommerce-order-items .wc-order-totals .total input[type=text]{width:96%;float:right}#woocommerce-order-items .wc-order-totals .refunded-total{color:#a00}#woocommerce-order-items .refund-actions{margin-top:5px;padding-top:12px;border-top:1px solid #dfdfdf}#woocommerce-order-items .refund-actions .button{float:right;margin-left:4px}#woocommerce-order-items .refund-actions .cancel-action{float:left;margin-left:0}#woocommerce-order-items .add_meta{margin-left:0 !important}#woocommerce-order-items h3 small{color:#999}#woocommerce-order-items .amount{white-space:nowrap}#woocommerce-order-items .add-items .description{margin-right:10px}#woocommerce-order-items .add-items .button{float:left;margin-right:.25em}#woocommerce-order-items .add-items .button-primary{float:none;margin-right:0}#woocommerce-order-items .inside{display:block !important}#woocommerce-order-items .handlediv,#woocommerce-order-items .hndle{display:none}#woocommerce-order-items .woocommerce_order_items_wrapper{margin:0;overflow-x:auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items{width:100%;background:#fff}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th{text-align:left;padding:1em;font-weight:400;color:#999;background:#f8f8f8;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th.sortable{cursor:pointer}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th:last-child{padding-right:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th:first-child{padding-left:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th .wc-arrow{float:right;position:relative;margin-right:-1em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td{padding:1.5em 1em 1em;text-align:left;line-height:1.5em;vertical-align:top;border-bottom:1px solid #f8f8f8}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td textarea{width:100%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td select{width:50%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td textarea{font-size:14px;padding:4px;color:#555}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th:last-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td:last-child{padding-right:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td:first-child{padding-left:2em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr:last-child td{border-bottom:1px solid #dfdfdf}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr:first-child td{border-top:8px solid #f8f8f8}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody#order_line_items tr:first-child td{border-top:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb{text-align:left;width:38px;padding-bottom:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail{width:38px;height:38px;border:2px solid #e8e8e8;background:#f8f8f8;color:#ccc;position:relative;font-size:21px;display:block;text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";width:38px;line-height:38px;display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail img{width:100%;height:100%;margin:0;padding:0;position:relative}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.name .wc-order-item-sku,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.name .wc-order-item-variation{display:block;margin-top:.5em;font-size:.92em !important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item{min-width:200px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .center,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .variation-id{text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class{text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class label{white-space:nowrap;color:#999;font-size:.833em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class label input{display:inline}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class input{width:70px;vertical-align:middle;text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class select{width:85px;height:26px;vertical-align:middle;font-size:1em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input{display:inline-block;background:#fff;border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);margin:1px 0;min-width:80px;overflow:hidden;line-height:1em;text-align:right}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input{width:100%;box-sizing:border-box}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input label{font-size:.75em;padding:4px 6px 0;color:#555;display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input input{width:100%;box-sizing:border-box;border:0;box-shadow:none;margin:0;padding:0 6px 4px;color:#555;background:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input input::-webkit-input-placeholder{color:#ddd}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child{border-bottom:1px dashed #ddd;background:#fff}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child label{color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child input{color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .view{white-space:nowrap}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .edit{text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class small.times{font-size:.92em !important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes{margin:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes label{display:block}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-discount{display:block;margin-top:.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class small.times{margin-right:.25em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity{text-align:center}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity input{text-align:center;width:50px}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items span.subtotal{opacity:.5}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.tax_class,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.tax_class{text-align:left}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .calculated{border-color:#ae8ca2;border-style:dotted}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta{width:100%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta{margin:.5em 0 0;font-size:.92em !important;color:#888}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr th,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr th{border:0;padding:0 4px .5em 0;line-height:1.5em;width:20%}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td{padding:0 4px .5em 0;border:0;line-height:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td input{width:100%;margin:0;position:relative;border-bottom:0;box-shadow:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td textarea{width:100%;height:4em;margin:0;box-shadow:none}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td input:focus+textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td input:focus+textarea{border-top-color:#999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td p,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td p{margin:0 0 .5em;line-height:1.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td p:last-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td p:last-child{margin:0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .refund_by{border-bottom:1px dotted #999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.fee .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.fee .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.refund .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.refund .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .thumb div{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.5em;line-height:1em;vertical-align:middle;margin:0 auto}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .thumb div::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .shipping_method,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .shipping_method_name{width:100%;margin:0 0 .5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax{white-space:nowrap}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;float:right;font-size:14px;visibility:hidden;margin:3px -18px 0 0}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax::before,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"ï…“";color:#999}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax:hover::before,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax:hover::before{color:#a00}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax:hover .delete-order-tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax:hover .delete-order-tax{visibility:visible}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items small.refunded{display:block;color:#a00;white-space:nowrap;margin-top:.5em}#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items small.refunded::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"ï…±";position:relative;top:auto;left:auto;margin:-1px 4px 0 0;vertical-align:middle;line-height:1em}#woocommerce-order-items .wc-order-edit-line-item{padding-left:0}#woocommerce-order-items .wc-order-edit-line-item-actions{width:44px;text-align:right;padding-left:0;vertical-align:middle}#woocommerce-order-items .wc-order-edit-line-item-actions a{color:#ccc;display:inline-block;cursor:pointer;padding:0 0 .5em;margin:0 0 0 12px;vertical-align:middle;text-decoration:none;line-height:16px;width:16px;overflow:hidden}#woocommerce-order-items .wc-order-edit-line-item-actions a::before{margin:0;padding:0;font-size:16px;width:16px;height:16px}#woocommerce-order-items .wc-order-edit-line-item-actions a:hover::before{color:#999}#woocommerce-order-items .wc-order-edit-line-item-actions a:first-child{margin-left:0}#woocommerce-order-items .wc-order-edit-line-item-actions .edit-order-item::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";position:relative}#woocommerce-order-items .wc-order-edit-line-item-actions .delete-order-item::before,#woocommerce-order-items .wc-order-edit-line-item-actions .delete_refund::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"ï…˜";position:relative}#woocommerce-order-items .wc-order-edit-line-item-actions .delete-order-item:hover::before,#woocommerce-order-items .wc-order-edit-line-item-actions .delete_refund:hover::before{color:#a00}#woocommerce-order-items tbody tr .wc-order-edit-line-item-actions{visibility:hidden}#woocommerce-order-items tbody tr:hover .wc-order-edit-line-item-actions{visibility:visible}#woocommerce-order-items .wc-order-totals .wc-order-edit-line-item-actions{width:1.5em;visibility:visible !important}#woocommerce-order-items .wc-order-totals .wc-order-edit-line-item-actions a{padding:0}#woocommerce-order-downloads .buttons{float:left;padding:0;margin:0;vertical-align:top}#woocommerce-order-downloads .buttons .add_item_id,#woocommerce-order-downloads .buttons .select2-container{width:400px !important;margin-right:9px;vertical-align:top;float:left}#woocommerce-order-downloads .buttons button{margin:2px 0 0}#woocommerce-order-downloads h3 small{color:#999}#poststuff #woocommerce-order-actions .inside{margin:0;padding:0}#poststuff #woocommerce-order-actions .inside ul.order_actions li{padding:6px 10px;box-sizing:border-box}#poststuff #woocommerce-order-actions .inside ul.order_actions li:last-child{border-bottom:0}#poststuff #woocommerce-order-notes .inside{margin:0;padding:0}#poststuff #woocommerce-order-notes .inside ul.order_notes li{padding:0 10px}#woocommerce_customers p.search-box{margin:6px 0 4px;float:left}#woocommerce_customers .tablenav{float:right;clear:none}.widefat.customers td{vertical-align:middle;padding:4px 7px}.widefat .column-order_title{width:15%}.widefat .column-order_title time{display:block;color:#999;margin:3px 0}.widefat .column-orders,.widefat .column-paying,.widefat .column-spent{text-align:center;width:8%}.widefat .column-last_order{width:11%}.widefat .column-wc_actions{width:110px}.widefat .column-wc_actions a.button{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;display:inline-block;margin:2px 4px 2px 0;padding:0 !important;height:2em !important;width:2em;overflow:hidden;vertical-align:middle}.widefat .column-wc_actions a.button::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;line-height:1.85}.widefat .column-wc_actions a.button img{display:block;width:12px;height:auto}.widefat .column-wc_actions a.edit::after{content:"\f464"}.widefat .column-wc_actions a.link::after{font-family:WooCommerce;content:"\e00d"}.widefat .column-wc_actions a.view::after{content:"\f177"}.widefat .column-wc_actions a.refresh::after{font-family:WooCommerce;content:"\e031"}.widefat .column-wc_actions a.processing::after{font-family:WooCommerce;content:"\e00f"}.widefat .column-wc_actions a.complete::after{content:"\f147"}.widefat small.meta{display:block;color:#999;font-size:inherit;margin:3px 0}.post-type-shop_order .tablenav .one-page .displaying-num{display:none}.post-type-shop_order .wp-list-table{margin-top:1em}.post-type-shop_order .wp-list-table tfoot th,.post-type-shop_order .wp-list-table thead th{padding:.75em 1em}.post-type-shop_order .wp-list-table tfoot th.sortable a,.post-type-shop_order .wp-list-table tfoot th.sorted a,.post-type-shop_order .wp-list-table thead th.sortable a,.post-type-shop_order .wp-list-table thead th.sorted a{padding:0}.post-type-shop_order .wp-list-table tfoot th:first-child,.post-type-shop_order .wp-list-table thead th:first-child{padding-left:2em}.post-type-shop_order .wp-list-table tfoot th:last-child,.post-type-shop_order .wp-list-table thead th:last-child{padding-right:2em}.post-type-shop_order .wp-list-table tbody td,.post-type-shop_order .wp-list-table tbody th{padding:1em;line-height:26px}.post-type-shop_order .wp-list-table tbody td:first-child{padding-left:2em}.post-type-shop_order .wp-list-table tbody td:last-child{padding-right:2em}.post-type-shop_order .wp-list-table tbody tr{border-top:1px solid #f5f5f5}.post-type-shop_order .wp-list-table tbody tr:hover:not(.status-trash):not(.no-link) td{cursor:pointer}.post-type-shop_order .wp-list-table .no-link{cursor:default !important}.post-type-shop_order .wp-list-table td,.post-type-shop_order .wp-list-table th{width:12ch;vertical-align:middle}.post-type-shop_order .wp-list-table td p,.post-type-shop_order .wp-list-table th p{margin:0}.post-type-shop_order .wp-list-table .check-column{width:1px;white-space:nowrap;padding:1em 1em 1em 1em !important;vertical-align:middle}.post-type-shop_order .wp-list-table .check-column input{vertical-align:text-top;margin:1px 0}.post-type-shop_order .wp-list-table .column-order_number{width:20ch}.post-type-shop_order .wp-list-table .column-order_total{width:8ch;text-align:right}.post-type-shop_order .wp-list-table .column-order_total a span{float:right}.post-type-shop_order .wp-list-table .column-order_date,.post-type-shop_order .wp-list-table .column-order_status{width:10ch}.post-type-shop_order .wp-list-table .column-order_status{width:14ch}.post-type-shop_order .wp-list-table .column-billing_address,.post-type-shop_order .wp-list-table .column-shipping_address{width:20ch;line-height:1.5em}.post-type-shop_order .wp-list-table .column-billing_address .description,.post-type-shop_order .wp-list-table .column-shipping_address .description{display:block;color:#999}.post-type-shop_order .wp-list-table .column-wc_actions{text-align:right}.post-type-shop_order .wp-list-table .column-wc_actions a.button{text-indent:9999px;margin:2px 0 2px 4px}.post-type-shop_order .wp-list-table .order-preview{float:right;width:16px;padding:20px 4px 4px 4px;height:0;overflow:hidden;position:relative;border:2px solid transparent;border-radius:4px}.post-type-shop_order .wp-list-table .order-preview::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"î€";line-height:16px;font-size:14px;vertical-align:middle;top:4px}.post-type-shop_order .wp-list-table .order-preview:hover{border:2px solid #00a0d2}.post-type-shop_order .wp-list-table .order-preview.disabled::before{content:"";background:url(../images/wpspin.gif) no-repeat center top}.order-status{display:-webkit-inline-box;display:-webkit-inline-flex;display:inline-flex;line-height:2.5em;color:#777;background:#e5e5e5;border-radius:4px;border-bottom:1px solid rgba(0,0,0,.05);margin:-.25em 0;cursor:inherit !important;white-space:nowrap;max-width:100%}.order-status.status-completed{background:#c8d7e1;color:#2e4453}.order-status.status-on-hold{background:#f8dda7;color:#94660c}.order-status.status-failed{background:#eba3a3;color:#761919}.order-status.status-processing{background:#c6e1c6;color:#5b841b}.order-status.status-trash{background:#eba3a3;color:#761919}.order-status>span{margin:0 1em;overflow:hidden;text-overflow:ellipsis}.wc-order-preview .order-status{float:right;margin-right:54px}.wc-order-preview article{padding:0 !important}.wc-order-preview .modal-close{border-radius:0}.wc-order-preview .wc-order-preview-table{width:100%;margin:0}.wc-order-preview .wc-order-preview-table td,.wc-order-preview .wc-order-preview-table th{padding:1em 1.5em;text-align:left;border:0;border-bottom:1px solid #eee;margin:0;background:0;box-shadow:none;text-align:right;vertical-align:top}.wc-order-preview .wc-order-preview-table td:first-child,.wc-order-preview .wc-order-preview-table th:first-child{text-align:left}.wc-order-preview .wc-order-preview-table th{border-color:#ccc}.wc-order-preview .wc-order-preview-table tr:last-child td{border:0}.wc-order-preview .wc-order-preview-table .wc-order-item-sku{margin-top:.5em}.wc-order-preview .wc-order-preview-table .wc-order-item-meta{margin-top:.5em}.wc-order-preview .wc-order-preview-table .wc-order-item-meta td,.wc-order-preview .wc-order-preview-table .wc-order-item-meta th{padding:0;border:0;text-align:left;vertical-align:top}.wc-order-preview .wc-order-preview-table .wc-order-item-meta td:last-child{padding-left:.5em}.wc-order-preview .wc-order-preview-addresses{overflow:hidden;padding-bottom:1.5em}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note{width:50%;float:left;padding:1.5em 1.5em 0;box-sizing:border-box;word-wrap:break-word}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address h2,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note h2{margin-top:0}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address strong,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note strong{display:block;margin-top:1.5em}.wc-order-preview .wc-order-preview-addresses .wc-order-preview-address strong:first-child,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note strong:first-child{margin-top:0}.wc-order-preview footer .wc-action-button-group{display:inline-block;float:left}.wc-order-preview footer .button.button-large{margin-left:10px;padding:0 10px !important;line-height:28px;height:auto;display:inline-block}.wc-order-preview .wc-action-button-group label{display:none}.wc-action-button-group{vertical-align:middle;line-height:26px;text-align:left}.wc-action-button-group label{margin-right:6px;cursor:default;font-weight:700;line-height:28px}.wc-action-button-group .wc-action-button-group__items{display:-webkit-inline-box;display:-webkit-inline-flex;display:inline-flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;flex-flow:row wrap;-webkit-align-content:flex-start;align-content:flex-start;-webkit-box-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.wc-action-button-group .wc-action-button{margin:0 0 0 -1px !important;border:1px solid #ccc;padding:0 10px !important;border-radius:0 !important;float:none;line-height:28px;height:auto;z-index:1;position:relative;overflow:hidden;text-overflow:ellipsis;-webkit-box-flex:1;-webkit-flex:1 0 auto;flex:1 0 auto;box-sizing:border-box;text-align:center;white-space:nowrap}.wc-action-button-group .wc-action-button:focus,.wc-action-button-group .wc-action-button:hover{border:1px solid #999;z-index:2}.wc-action-button-group .wc-action-button:first-child{margin-left:0 !important;border-top-left-radius:3px !important;border-bottom-left-radius:3px !important}.wc-action-button-group .wc-action-button:last-child{border-top-right-radius:3px !important;border-bottom-right-radius:3px !important}@media screen and (max-width:782px){.wc-order-preview footer .wc-action-button-group .wc-action-button-group__items{display:-webkit-box;display:-webkit-flex;display:flex}.wc-order-preview footer .wc-action-button-group{float:none;display:block;margin-bottom:4px}.wc-order-preview footer .button.button-large{width:100%;float:none;text-align:center;margin:0;display:block}.post-type-shop_order .wp-list-table td.check-column{width:1em}.post-type-shop_order .wp-list-table td.column-order_number{padding-left:0;padding-bottom:.5em}.post-type-shop_order .wp-list-table td.column-order_date,.post-type-shop_order .wp-list-table td.column-order_status{display:inline-block !important;padding:0 1em 1em 1em !important}.post-type-shop_order .wp-list-table td.column-order_date::before,.post-type-shop_order .wp-list-table td.column-order_status::before{display:none !important}.post-type-shop_order .wp-list-table td.column-order_date{padding-left:0 !important}.post-type-shop_order .wp-list-table td.column-order_status{float:right}}.column-customer_message .note-on{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto;color:#999}.column-customer_message .note-on::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";line-height:16px}.column-order_notes .note-on{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto;color:#999}.column-order_notes .note-on::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";line-height:16px}.attributes-table td,.attributes-table th{width:15%;vertical-align:top}.attributes-table .attribute-terms{width:32%}.attributes-table .attribute-actions{width:2em}.attributes-table .attribute-actions .configure-terms{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;padding:0 !important;height:2em !important;width:2em}.attributes-table .attribute-actions .configure-terms::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"ï„‘";font-family:Dashicons;line-height:1.85}ul.order_notes{padding:2px 0 0}ul.order_notes li .note_content{padding:10px;background:#efefef;position:relative}ul.order_notes li .note_content p{margin:0;padding:0;word-wrap:break-word}ul.order_notes li p.meta{padding:10px;color:#999;margin:0;font-size:11px}ul.order_notes li p.meta .exact-date{border-bottom:1px dotted #999}ul.order_notes li a.delete_note{color:#a00}ul.order_notes li .note_content::after{content:"";display:block;position:absolute;bottom:-10px;left:20px;width:0;height:0;border-width:10px 10px 0 0;border-style:solid;border-color:#efefef transparent}ul.order_notes li.system-note .note_content{background:#d7cad2}ul.order_notes li.system-note .note_content::after{border-color:#d7cad2 transparent}ul.order_notes li.customer-note .note_content{background:#a7cedc}ul.order_notes li.customer-note .note_content::after{border-color:#a7cedc transparent}.add_note{border-top:1px solid #ddd;padding:10px 10px 0}.add_note h4{margin-top:5px !important}.add_note #add_order_note{width:100%;height:50px}table.wp-list-table .column-thumb{width:52px;text-align:center;white-space:nowrap}table.wp-list-table .column-handle{width:17px;display:none}table.wp-list-table tbody td.column-handle{cursor:move;width:17px;text-align:center;vertical-align:text-top}table.wp-list-table tbody td.column-handle::before{content:"\f333";font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;height:100%;margin:4px 0 0 0}table.wp-list-table .column-name{width:22%}table.wp-list-table .column-product_cat,table.wp-list-table .column-product_tag{width:11% !important}table.wp-list-table .column-featured,table.wp-list-table .column-product_type{width:48px;text-align:left !important}table.wp-list-table .column-customer_message,table.wp-list-table .column-order_notes{width:48px;text-align:center}table.wp-list-table .column-customer_message img,table.wp-list-table .column-order_notes img{margin:0 auto;padding-top:0 !important}table.wp-list-table .manage-column.column-featured img,table.wp-list-table .manage-column.column-product_type img{padding-left:2px}table.wp-list-table .column-price .woocommerce-price-suffix{display:none}table.wp-list-table img{margin:1px 2px}table.wp-list-table .row-actions{color:#999}table.wp-list-table td.column-thumb img{margin:0;width:auto;height:auto;max-width:40px;max-height:40px;vertical-align:middle}table.wp-list-table span.na{color:#999}table.wp-list-table .column-sku{width:10%}table.wp-list-table .column-price{width:10ch}table.wp-list-table .column-is_in_stock{text-align:left !important;width:12ch}table.wp-list-table span.wc-featured,table.wp-list-table span.wc-image{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto}table.wp-list-table span.wc-featured::before,table.wp-list-table span.wc-image::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}table.wp-list-table span.wc-featured::before{content:"\f155"}table.wp-list-table span.wc-featured.not-featured::before{content:"\f154"}table.wp-list-table td.column-featured span.wc-featured{font-size:1.6em;cursor:pointer}table.wp-list-table mark.instock,table.wp-list-table mark.onbackorder,table.wp-list-table mark.outofstock{font-weight:700;background:transparent none;line-height:1}table.wp-list-table mark.instock{color:#7ad03a}table.wp-list-table mark.outofstock{color:#a44}table.wp-list-table mark.onbackorder{color:#eaa600}table.wp-list-table .notes_head,table.wp-list-table .order-notes_head,table.wp-list-table .status_head{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;margin:0 auto}table.wp-list-table .notes_head::after,table.wp-list-table .order-notes_head::after,table.wp-list-table .status_head::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"î€"}table.wp-list-table .order-notes_head::after{content:"\e028"}table.wp-list-table .notes_head::after{content:"\e026"}table.wp-list-table .status_head::after{content:"\e011"}table.wp-list-table .column-order_items{width:12%}table.wp-list-table .column-order_items table.order_items{width:100%;margin:3px 0 0;padding:0;display:none}table.wp-list-table .column-order_items table.order_items td{border:0;margin:0;padding:0 0 3px}table.wp-list-table .column-order_items table.order_items td.qty{color:#999;padding-right:6px;text-align:left}mark.notice{background:#fff;color:#a00;margin:0 0 0 10px}a.export_rates,a.import_rates{float:right;margin-left:9px;margin-top:-2px;margin-bottom:0}#rates-search{float:right}#rates-search input.wc-tax-rates-search-field{padding:4px 8px;font-size:1.2em}#rates-pagination{float:right;margin-right:.5em}#rates-pagination .tablenav{margin:0}.wc_input_table_wrapper{overflow-x:auto;display:block}table.wc_input_table,table.wc_tax_rates{width:100%}table.wc_input_table td,table.wc_input_table th,table.wc_tax_rates td,table.wc_tax_rates th{display:table-cell !important}table.wc_input_table span.tips,table.wc_tax_rates span.tips{color:#2ea2cc}table.wc_input_table th,table.wc_tax_rates th{white-space:nowrap;padding:10px}table.wc_input_table td,table.wc_tax_rates td{padding:0;border-right:1px solid #dfdfdf;border-bottom:1px solid #dfdfdf;border-top:0;background:#fff;cursor:default}table.wc_input_table td input[type=number],table.wc_input_table td input[type=text],table.wc_tax_rates td input[type=number],table.wc_tax_rates td input[type=text]{width:100% !important;min-width:100px;padding:8px 10px;margin:0;border:0;outline:0;background:transparent none}table.wc_input_table td input[type=number]:focus,table.wc_input_table td input[type=text]:focus,table.wc_tax_rates td input[type=number]:focus,table.wc_tax_rates td input[type=text]:focus{outline:0;box-shadow:none}table.wc_input_table td.apply_to_shipping,table.wc_input_table td.compound,table.wc_tax_rates td.apply_to_shipping,table.wc_tax_rates td.compound{padding:5px 7px;vertical-align:middle}table.wc_input_table td.apply_to_shipping input,table.wc_input_table td.compound input,table.wc_tax_rates td.apply_to_shipping input,table.wc_tax_rates td.compound input{width:auto;padding:0}table.wc_input_table td:last-child,table.wc_tax_rates td:last-child{border-right:0}table.wc_input_table tr.current td,table.wc_tax_rates tr.current td{background-color:#fefbcc}table.wc_input_table .cost,table.wc_input_table .item_cost,table.wc_tax_rates .cost,table.wc_tax_rates .item_cost{text-align:right}table.wc_input_table .cost input,table.wc_input_table .item_cost input,table.wc_tax_rates .cost input,table.wc_tax_rates .item_cost input{text-align:right}table.wc_input_table th.sort,table.wc_tax_rates th.sort{width:17px;padding:0 4px}table.wc_input_table td.sort,table.wc_tax_rates td.sort{padding:0 4px}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort{cursor:move;font-size:15px;background:#f9f9f9;text-align:center;vertical-align:middle}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort::before,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort::before{content:"\f333";font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:left;height:100%}table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort:hover::before,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort:hover::before{color:#333}table.wc_input_table .button,table.wc_tax_rates .button{float:left;margin-right:5px}table.wc_input_table .export,table.wc_input_table .import,table.wc_tax_rates .export,table.wc_tax_rates .import{float:right;margin-right:0;margin-left:5px}table.wc_input_table span.tips,table.wc_tax_rates span.tips{padding:0 3px}table.wc_input_table .pagination,table.wc_tax_rates .pagination{float:right}table.wc_input_table .pagination .button,table.wc_tax_rates .pagination .button{margin-left:5px;margin-right:0}table.wc_input_table .pagination .current,table.wc_tax_rates .pagination .current{background:#bbb;text-shadow:none}table.wc_input_table tr:last-child td,table.wc_tax_rates tr:last-child td{border-bottom:0}table.wc_emails,table.wc_gateways,table.wc_shipping{position:relative}table.wc_emails td,table.wc_emails th,table.wc_gateways td,table.wc_gateways th,table.wc_shipping td,table.wc_shipping th{display:table-cell !important;padding:1em !important;vertical-align:top;line-height:1.75em}table.wc_emails.wc_emails td,table.wc_gateways.wc_emails td,table.wc_shipping.wc_emails td{vertical-align:middle}table.wc_emails tr:nth-child(odd) td,table.wc_gateways tr:nth-child(odd) td,table.wc_shipping tr:nth-child(odd) td{background:#f9f9f9}table.wc_emails td.name,table.wc_gateways td.name,table.wc_shipping td.name{font-weight:700}table.wc_emails .settings,table.wc_gateways .settings,table.wc_shipping .settings{text-align:right}table.wc_emails .default,table.wc_emails .radio,table.wc_emails .status,table.wc_gateways .default,table.wc_gateways .radio,table.wc_gateways .status,table.wc_shipping .default,table.wc_shipping .radio,table.wc_shipping .status{text-align:center}table.wc_emails .default .tips,table.wc_emails .radio .tips,table.wc_emails .status .tips,table.wc_gateways .default .tips,table.wc_gateways .radio .tips,table.wc_gateways .status .tips,table.wc_shipping .default .tips,table.wc_shipping .radio .tips,table.wc_shipping .status .tips{margin:0 auto}table.wc_emails .default input,table.wc_emails .radio input,table.wc_emails .status input,table.wc_gateways .default input,table.wc_gateways .radio input,table.wc_gateways .status input,table.wc_shipping .default input,table.wc_shipping .radio input,table.wc_shipping .status input{margin:0}table.wc_emails td.sort,table.wc_gateways td.sort,table.wc_shipping td.sort{font-size:15px;text-align:center}table.wc_emails td.sort .wc-item-reorder-nav,table.wc_gateways td.sort .wc-item-reorder-nav,table.wc_shipping td.sort .wc-item-reorder-nav{white-space:nowrap;width:72px}table.wc_emails td.sort .wc-item-reorder-nav::before,table.wc_gateways td.sort .wc-item-reorder-nav::before,table.wc_shipping td.sort .wc-item-reorder-nav::before{content:"\f333";font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:24px;float:left;height:100%;line-height:24px;cursor:move}table.wc_emails td.sort .wc-item-reorder-nav button,table.wc_gateways td.sort .wc-item-reorder-nav button,table.wc_shipping td.sort .wc-item-reorder-nav button{position:relative;overflow:hidden;float:left;display:block;width:24px;height:24px;margin:0;background:0;border:0;box-shadow:none;color:#82878c;text-indent:-9999px;cursor:pointer;outline:0}table.wc_emails td.sort .wc-item-reorder-nav button::before,table.wc_gateways td.sort .wc-item-reorder-nav button::before,table.wc_shipping td.sort .wc-item-reorder-nav button::before{display:inline-block;position:absolute;top:0;right:0;width:100%;height:100%;font:normal 20px/23px dashicons;text-align:center;text-indent:0;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}table.wc_emails td.sort .wc-item-reorder-nav button:focus,table.wc_emails td.sort .wc-item-reorder-nav button:hover,table.wc_gateways td.sort .wc-item-reorder-nav button:focus,table.wc_gateways td.sort .wc-item-reorder-nav button:hover,table.wc_shipping td.sort .wc-item-reorder-nav button:focus,table.wc_shipping td.sort .wc-item-reorder-nav button:hover{color:#191e23}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-down::before,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-down::before,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-down::before{content:"\f347"}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-up::before,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-up::before,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-up::before{content:"\f343"}table.wc_emails td.sort .wc-item-reorder-nav .wc-move-disabled,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-disabled,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-disabled{color:#d5d5d5 !important;cursor:default;pointer-events:none}table.wc_emails .wc-payment-gateway-method-name,table.wc_gateways .wc-payment-gateway-method-name,table.wc_shipping .wc-payment-gateway-method-name{font-weight:400}table.wc_emails .wc-email-settings-table-name,table.wc_gateways .wc-email-settings-table-name,table.wc_shipping .wc-email-settings-table-name{font-weight:700}table.wc_emails .wc-email-settings-table-name span,table.wc_gateways .wc-email-settings-table-name span,table.wc_shipping .wc-email-settings-table-name span{font-weight:400;color:#999;margin:0 0 0 4px !important}table.wc_emails .wc-payment-gateway-method-toggle-disabled,table.wc_emails .wc-payment-gateway-method-toggle-enabled,table.wc_gateways .wc-payment-gateway-method-toggle-disabled,table.wc_gateways .wc-payment-gateway-method-toggle-enabled,table.wc_shipping .wc-payment-gateway-method-toggle-disabled,table.wc_shipping .wc-payment-gateway-method-toggle-enabled{padding-top:1px;display:block;outline:0;box-shadow:none}table.wc_emails .wc-email-settings-table-status,table.wc_gateways .wc-email-settings-table-status,table.wc_shipping .wc-email-settings-table-status{text-align:center;width:1em}table.wc_emails .wc-email-settings-table-status .tips,table.wc_gateways .wc-email-settings-table-status .tips,table.wc_shipping .wc-email-settings-table-status .tips{margin:0 auto}.wc-shipping-zone-settings th{padding:24px 24px 24px 0}.wc-shipping-zone-settings td.forminp input,.wc-shipping-zone-settings td.forminp textarea{padding:8px;max-width:100% !important}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select{width:448px;max-width:100% !important}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices{padding:8px 8px 4px;border-color:#ddd;min-height:0;line-height:1}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices input{padding:0}.wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices li{margin:0 4px 4px 0}.wc-shipping-zone-settings .wc-shipping-zone-postcodes-toggle{margin:.5em 0 0;font-size:.9em;text-decoration:underline;display:block}.wc-shipping-zone-settings .wc-shipping-zone-postcodes-toggle+.wc-shipping-zone-postcodes{display:none}.wc-shipping-zone-settings .wc-shipping-zone-postcodes textarea{margin:10px 0}.wc-shipping-zone-settings .wc-shipping-zone-postcodes .description{font-size:.9em;color:#999}.wc-shipping-zone-settings+p.submit{margin-top:0}.wc-shipping-zone-settings tbody{display:inherit}table tr table.wc-shipping-zone-methods tr .row-actions,table tr:hover table.wc-shipping-zone-methods tr .row-actions{position:relative}table tr table.wc-shipping-zone-methods tr:hover .row-actions,table tr:hover table.wc-shipping-zone-methods tr:hover .row-actions{position:static}.wc-shipping-zones-heading .page-title-action{display:inline-block}table.wc-shipping-classes td,table.wc-shipping-classes th,table.wc-shipping-zone-methods td,table.wc-shipping-zone-methods th,table.wc-shipping-zones td,table.wc-shipping-zones th{vertical-align:top;line-height:24px;padding:1em !important;font-size:14px;background:#fff;display:table-cell !important}table.wc-shipping-classes td li,table.wc-shipping-classes th li,table.wc-shipping-zone-methods td li,table.wc-shipping-zone-methods th li,table.wc-shipping-zones td li,table.wc-shipping-zones th li{line-height:24px;font-size:14px}table.wc-shipping-classes td .woocommerce-help-tip,table.wc-shipping-classes th .woocommerce-help-tip,table.wc-shipping-zone-methods td .woocommerce-help-tip,table.wc-shipping-zone-methods th .woocommerce-help-tip,table.wc-shipping-zones td .woocommerce-help-tip,table.wc-shipping-zones th .woocommerce-help-tip{margin:0 !important}table.wc-shipping-classes thead th,table.wc-shipping-zone-methods thead th,table.wc-shipping-zones thead th{vertical-align:middle}table.wc-shipping-classes thead .wc-shipping-zone-sort,table.wc-shipping-zone-methods thead .wc-shipping-zone-sort,table.wc-shipping-zones thead .wc-shipping-zone-sort{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state,table.wc-shipping-classes td.wc-shipping-zones-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zones-blank-state{background:#f7f1f6 !important;overflow:hidden;position:relative;padding:7.5em 7.5% !important;border-bottom:2px solid #eee2ec}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-classes td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state{padding:2em !important}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-classes td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p{margin-bottom:0}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li,table.wc-shipping-classes td.wc-shipping-zone-method-blank-state p,table.wc-shipping-classes td.wc-shipping-zones-blank-state li,table.wc-shipping-classes td.wc-shipping-zones-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state p,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zones-blank-state li,table.wc-shipping-zones td.wc-shipping-zones-blank-state p{color:#a46497;font-size:1.5em;line-height:1.5em;margin:0 0 1em;position:relative;z-index:1;text-shadow:1px 1px 1px #fff}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-classes td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-classes td.wc-shipping-zones-blank-state li.main,table.wc-shipping-classes td.wc-shipping-zones-blank-state p.main,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li.main,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state p.main,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-zones td.wc-shipping-zones-blank-state li.main,table.wc-shipping-zones td.wc-shipping-zones-blank-state p.main{font-size:2em}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li,table.wc-shipping-classes td.wc-shipping-zones-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zones td.wc-shipping-zones-blank-state li{margin-left:1em;list-style:circle inside}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-classes td.wc-shipping-zones-blank-state::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state::before,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-zones td.wc-shipping-zones-blank-state::before{content:"\e01b";font-family:WooCommerce;text-align:center;line-height:1;color:#eee2ec;display:block;width:1em;font-size:40em;top:50%;right:-3.75%;margin-top:-.1875em;position:absolute}table.wc-shipping-classes td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-classes td.wc-shipping-zones-blank-state .button-primary,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state .button-primary,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-zones td.wc-shipping-zones-blank-state .button-primary{background-color:#804877;border-color:#804877;box-shadow:inset 0 1px 0 rgba(255,255,255,.2),0 1px 0 rgba(0,0,0,.15);margin:0;opacity:1;text-shadow:0 -1px 1px #8a4f7f,1px 0 1px #8a4f7f,0 1px 1px #8a4f7f,-1px 0 1px #8a4f7f;font-size:1.5em;padding:.75em 1em;height:auto;position:relative;z-index:1}table.wc-shipping-classes .wc-shipping-zone-method-rows tr:nth-child(even) td,table.wc-shipping-zone-methods .wc-shipping-zone-method-rows tr:nth-child(even) td,table.wc-shipping-zones .wc-shipping-zone-method-rows tr:nth-child(even) td{background:#f9f9f9}table.wc-shipping-classes .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-classes tr.odd td,table.wc-shipping-zone-methods .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-zone-methods tr.odd td,table.wc-shipping-zones .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-zones tr.odd td{background:#f9f9f9}table.wc-shipping-classes tbody.wc-shipping-zone-rows td,table.wc-shipping-zone-methods tbody.wc-shipping-zone-rows td,table.wc-shipping-zones tbody.wc-shipping-zone-rows td{border-top:2px solid #f9f9f9}table.wc-shipping-classes tbody.wc-shipping-zone-rows tr:first-child td,table.wc-shipping-zone-methods tbody.wc-shipping-zone-rows tr:first-child td,table.wc-shipping-zones tbody.wc-shipping-zone-rows tr:first-child td{border-top:0}table.wc-shipping-classes tr.wc-shipping-zone-worldwide td,table.wc-shipping-zone-methods tr.wc-shipping-zone-worldwide td,table.wc-shipping-zones tr.wc-shipping-zone-worldwide td{background:#f9f9f9;border-top:2px solid #e1e1e1}table.wc-shipping-classes p,table.wc-shipping-classes ul,table.wc-shipping-zone-methods p,table.wc-shipping-zone-methods ul,table.wc-shipping-zones p,table.wc-shipping-zones ul{margin:0}table.wc-shipping-classes td.wc-shipping-zone-method-sort,table.wc-shipping-classes td.wc-shipping-zone-sort,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort,table.wc-shipping-zone-methods td.wc-shipping-zone-sort,table.wc-shipping-zones td.wc-shipping-zone-method-sort,table.wc-shipping-zones td.wc-shipping-zone-sort{cursor:move;font-size:15px;text-align:center}table.wc-shipping-classes td.wc-shipping-zone-method-sort::before,table.wc-shipping-classes td.wc-shipping-zone-sort::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort::before,table.wc-shipping-zone-methods td.wc-shipping-zone-sort::before,table.wc-shipping-zones td.wc-shipping-zone-method-sort::before,table.wc-shipping-zones td.wc-shipping-zone-sort::before{content:"\f333";font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:left;height:100%;line-height:24px}table.wc-shipping-classes td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-classes td.wc-shipping-zone-sort:hover::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-zone-methods td.wc-shipping-zone-sort:hover::before,table.wc-shipping-zones td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-zones td.wc-shipping-zone-sort:hover::before{color:#333}table.wc-shipping-classes td.wc-shipping-zone-worldwide,table.wc-shipping-zone-methods td.wc-shipping-zone-worldwide,table.wc-shipping-zones td.wc-shipping-zone-worldwide{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-worldwide::before,table.wc-shipping-zone-methods td.wc-shipping-zone-worldwide::before,table.wc-shipping-zones td.wc-shipping-zone-worldwide::before{content:"\f319";font-family:dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:left;height:100%;line-height:24px}table.wc-shipping-classes .wc-shipping-zone-methods,table.wc-shipping-classes .wc-shipping-zone-name,table.wc-shipping-zone-methods .wc-shipping-zone-methods,table.wc-shipping-zone-methods .wc-shipping-zone-name,table.wc-shipping-zones .wc-shipping-zone-methods,table.wc-shipping-zones .wc-shipping-zone-name{width:25%}table.wc-shipping-classes .wc-shipping-class-description input,table.wc-shipping-classes .wc-shipping-class-description select,table.wc-shipping-classes .wc-shipping-class-description textarea,table.wc-shipping-classes .wc-shipping-class-name input,table.wc-shipping-classes .wc-shipping-class-name select,table.wc-shipping-classes .wc-shipping-class-name textarea,table.wc-shipping-classes .wc-shipping-class-slug input,table.wc-shipping-classes .wc-shipping-class-slug select,table.wc-shipping-classes .wc-shipping-class-slug textarea,table.wc-shipping-classes .wc-shipping-zone-name input,table.wc-shipping-classes .wc-shipping-zone-name select,table.wc-shipping-classes .wc-shipping-zone-name textarea,table.wc-shipping-classes .wc-shipping-zone-region input,table.wc-shipping-classes .wc-shipping-zone-region select,table.wc-shipping-classes .wc-shipping-zone-region textarea,table.wc-shipping-zone-methods .wc-shipping-class-description input,table.wc-shipping-zone-methods .wc-shipping-class-description select,table.wc-shipping-zone-methods .wc-shipping-class-description textarea,table.wc-shipping-zone-methods .wc-shipping-class-name input,table.wc-shipping-zone-methods .wc-shipping-class-name select,table.wc-shipping-zone-methods .wc-shipping-class-name textarea,table.wc-shipping-zone-methods .wc-shipping-class-slug input,table.wc-shipping-zone-methods .wc-shipping-class-slug select,table.wc-shipping-zone-methods .wc-shipping-class-slug textarea,table.wc-shipping-zone-methods .wc-shipping-zone-name input,table.wc-shipping-zone-methods .wc-shipping-zone-name select,table.wc-shipping-zone-methods .wc-shipping-zone-name textarea,table.wc-shipping-zone-methods .wc-shipping-zone-region input,table.wc-shipping-zone-methods .wc-shipping-zone-region select,table.wc-shipping-zone-methods .wc-shipping-zone-region textarea,table.wc-shipping-zones .wc-shipping-class-description input,table.wc-shipping-zones .wc-shipping-class-description select,table.wc-shipping-zones .wc-shipping-class-description textarea,table.wc-shipping-zones .wc-shipping-class-name input,table.wc-shipping-zones .wc-shipping-class-name select,table.wc-shipping-zones .wc-shipping-class-name textarea,table.wc-shipping-zones .wc-shipping-class-slug input,table.wc-shipping-zones .wc-shipping-class-slug select,table.wc-shipping-zones .wc-shipping-class-slug textarea,table.wc-shipping-zones .wc-shipping-zone-name input,table.wc-shipping-zones .wc-shipping-zone-name select,table.wc-shipping-zones .wc-shipping-zone-name textarea,table.wc-shipping-zones .wc-shipping-zone-region input,table.wc-shipping-zones .wc-shipping-zone-region select,table.wc-shipping-zones .wc-shipping-zone-region textarea{width:100%}table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-zone-delete{color:#a00}table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-zone-delete:hover{color:red}table.wc-shipping-classes .wc-shipping-class-count,table.wc-shipping-zone-methods .wc-shipping-class-count,table.wc-shipping-zones .wc-shipping-class-count{text-align:center}table.wc-shipping-classes td.wc-shipping-zone-methods,table.wc-shipping-zone-methods td.wc-shipping-zone-methods,table.wc-shipping-zones td.wc-shipping-zone-methods{color:#555}table.wc-shipping-classes td.wc-shipping-zone-methods .method_disabled,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .method_disabled,table.wc-shipping-zones td.wc-shipping-zone-methods .method_disabled{text-decoration:line-through}table.wc-shipping-classes td.wc-shipping-zone-methods ul,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul,table.wc-shipping-zones td.wc-shipping-zone-methods ul{position:relative;padding-right:32px}table.wc-shipping-classes td.wc-shipping-zone-methods ul li,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li,table.wc-shipping-zones td.wc-shipping-zone-methods ul li{color:#555;display:inline;margin:0}table.wc-shipping-classes td.wc-shipping-zone-methods ul li::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li::before,table.wc-shipping-zones td.wc-shipping-zone-methods ul li::before{content:", "}table.wc-shipping-classes td.wc-shipping-zone-methods ul li:first-child::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li:first-child::before,table.wc-shipping-zones td.wc-shipping-zone-methods ul li:first-child::before{content:""}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method{display:block;width:24px;padding:24px 0 0;height:0;overflow:hidden;cursor:pointer}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method::before,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"î€";font-family:Dashicons;content:"\f502";color:#999;vertical-align:middle;line-height:24px;font-size:16px;margin:0}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method.disabled,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method.disabled,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method.disabled{cursor:not-allowed}table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method.disabled::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method.disabled::before,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method.disabled::before{color:#ccc}table.wc-shipping-classes .wc-shipping-zone-method-title,table.wc-shipping-zone-methods .wc-shipping-zone-method-title,table.wc-shipping-zones .wc-shipping-zone-method-title{width:25%}table.wc-shipping-classes .wc-shipping-zone-method-title .wc-shipping-zone-method-delete,table.wc-shipping-zone-methods .wc-shipping-zone-method-title .wc-shipping-zone-method-delete,table.wc-shipping-zones .wc-shipping-zone-method-title .wc-shipping-zone-method-delete{color:red}table.wc-shipping-classes .wc-shipping-zone-method-enabled,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled,table.wc-shipping-zones .wc-shipping-zone-method-enabled{text-align:center}table.wc-shipping-classes .wc-shipping-zone-method-enabled a,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled a,table.wc-shipping-zones .wc-shipping-zone-method-enabled a{display:inline-block}table.wc-shipping-classes .wc-shipping-zone-method-enabled .woocommerce-input-toggle,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled .woocommerce-input-toggle,table.wc-shipping-zones .wc-shipping-zone-method-enabled .woocommerce-input-toggle{margin-top:3px}table.wc-shipping-classes .wc-shipping-zone-method-type,table.wc-shipping-zone-methods .wc-shipping-zone-method-type,table.wc-shipping-zones .wc-shipping-zone-method-type{display:block}table.wc-shipping-classes tfoot input,table.wc-shipping-classes tfoot select,table.wc-shipping-zone-methods tfoot input,table.wc-shipping-zone-methods tfoot select,table.wc-shipping-zones tfoot input,table.wc-shipping-zones tfoot select{vertical-align:middle !important}table.wc-shipping-classes tfoot .button-secondary,table.wc-shipping-zone-methods tfoot .button-secondary,table.wc-shipping-zones tfoot .button-secondary{float:right}table.wc-shipping-classes .editing .wc-shipping-zone-edit,table.wc-shipping-classes .editing .wc-shipping-zone-view,table.wc-shipping-zone-methods .editing .wc-shipping-zone-edit,table.wc-shipping-zone-methods .editing .wc-shipping-zone-view,table.wc-shipping-zones .editing .wc-shipping-zone-edit,table.wc-shipping-zones .editing .wc-shipping-zone-view{display:none}.woocommerce-input-toggle{height:16px;width:32px;border:2px solid #935687;background-color:#935687;display:inline-block;text-indent:-9999px;border-radius:10em;position:relative;margin-top:-1px;vertical-align:text-top}.woocommerce-input-toggle::before{content:"";display:block;width:16px;height:16px;background:#fff;position:absolute;top:0;right:0;border-radius:100%}.woocommerce-input-toggle.woocommerce-input-toggle--disabled{border-color:#999;background-color:#999}.woocommerce-input-toggle.woocommerce-input-toggle--disabled::before{right:auto;left:0}.woocommerce-input-toggle.woocommerce-input-toggle--loading{opacity:.5}.wc-modal-shipping-method-settings{background:#f8f8f8;padding:1em !important}.wc-modal-shipping-method-settings form .form-table{width:100%;background:#fff;margin:0 0 1.5em}.wc-modal-shipping-method-settings form .form-table tr th{width:30%;position:relative}.wc-modal-shipping-method-settings form .form-table tr th .woocommerce-help-tip{float:right;margin:-8px -.5em 0 0;vertical-align:middle;right:0;top:50%;position:absolute}.wc-modal-shipping-method-settings form .form-table tr td input,.wc-modal-shipping-method-settings form .form-table tr td select,.wc-modal-shipping-method-settings form .form-table tr td textarea{width:50%;min-width:250px}.wc-modal-shipping-method-settings form .form-table tr td input[type=checkbox]{width:auto;min-width:16px}.wc-modal-shipping-method-settings form .form-table tr td,.wc-modal-shipping-method-settings form .form-table tr th{vertical-align:middle;margin:0;line-height:24px;padding:1em;border-bottom:1px solid #f8f8f8}.wc-modal-shipping-method-settings form .form-table:last-of-type{margin-bottom:0}.wc-backbone-modal .wc-shipping-zone-method-selector p{margin-top:0}.wc-backbone-modal .wc-shipping-zone-method-selector .wc-shipping-zone-method-description{margin:.75em 1px 0;line-height:1.5em;color:#999;font-style:italic}.wc-backbone-modal .wc-shipping-zone-method-selector select{width:100%;cursor:pointer}img.help_tip{margin:0 0 0 9px;vertical-align:middle}.postbox img.help_tip{margin-top:0}.postbox .woocommerce-help-tip{margin:0 0 0 9px}.status-disabled,.status-enabled,.status-manual{font-size:1.4em;display:block;text-indent:-9999px;position:relative;height:1em;width:1em}.status-manual::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#999}.status-enabled::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#a46497}.status-disabled::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#ccc}.woocommerce h2.woo-nav-tab-wrapper{margin-bottom:1em}.woocommerce nav.woo-nav-tab-wrapper{margin:1.5em 0 1em}.woocommerce .subsubsub{margin:-8px 0 0}.woocommerce .wc-admin-breadcrumb{margin-left:.5em}.woocommerce .wc-admin-breadcrumb a{color:#a46497}.woocommerce #template div{margin:0}.woocommerce #template div p .button{float:right;margin-left:10px;margin-top:-4px}.woocommerce #template div .editor textarea{margin-bottom:8px}.woocommerce textarea[disabled=disabled]{background:#dfdfdf !important}.woocommerce table.form-table{margin:0;position:relative;table-layout:fixed}.woocommerce table.form-table .forminp-radio ul{margin:0}.woocommerce table.form-table .forminp-radio ul li{line-height:1.4em}.woocommerce table.form-table input[type=email],.woocommerce table.form-table input[type=number],.woocommerce table.form-table input[type=text]{height:auto}.woocommerce table.form-table textarea.input-text{height:100%;min-width:150px;display:block}.woocommerce table.form-table input.regular-input,.woocommerce table.form-table input[type=date],.woocommerce table.form-table input[type=datetime-local],.woocommerce table.form-table input[type=datetime],.woocommerce table.form-table input[type=email],.woocommerce table.form-table input[type=number],.woocommerce table.form-table input[type=password],.woocommerce table.form-table input[type=tel],.woocommerce table.form-table input[type=text],.woocommerce table.form-table input[type=time],.woocommerce table.form-table input[type=url],.woocommerce table.form-table input[type=week],.woocommerce table.form-table textarea{width:400px;margin:0;padding:6px;box-sizing:border-box;vertical-align:top}.woocommerce table.form-table input[type=date],.woocommerce table.form-table input[type=datetime-local],.woocommerce table.form-table input[type=tel],.woocommerce table.form-table input[type=time],.woocommerce table.form-table input[type=week]{width:200px}.woocommerce table.form-table select{width:400px;margin:0;box-sizing:border-box;height:32px;line-height:32px;vertical-align:top}.woocommerce table.form-table input[size]{width:auto !important}.woocommerce table.form-table table input.regular-input,.woocommerce table.form-table table input[type=email],.woocommerce table.form-table table input[type=number],.woocommerce table.form-table table input[type=text],.woocommerce table.form-table table select,.woocommerce table.form-table table textarea{width:auto}.woocommerce table.form-table textarea.wide-input{width:100%}.woocommerce table.form-table .woocommerce-help-tip,.woocommerce table.form-table img.help_tip{padding:0;margin:-4px 0 0 5px;vertical-align:middle;cursor:help;line-height:1}.woocommerce table.form-table span.help_tip{cursor:help;color:#2ea2cc}.woocommerce table.form-table th{position:relative;padding-right:24px}.woocommerce table.form-table th label{position:relative;display:block}.woocommerce table.form-table th label .woocommerce-help-tip,.woocommerce table.form-table th label img.help_tip{margin:-8px -24px 0 0;position:absolute;right:0;top:50%}.woocommerce table.form-table th label+.woocommerce-help-tip{margin:0;position:absolute;right:0;top:20px}.woocommerce table.form-table woocommerce-help-tip .select2-container{vertical-align:top;margin-bottom:3px}.woocommerce table.form-table .select2-container+span.description{display:block;margin-top:8px}.woocommerce table.form-table table.widefat th{padding-right:inherit}.woocommerce table.form-table .wp-list-table .woocommerce-help-tip{float:none}.woocommerce table.form-table fieldset{margin-top:4px}.woocommerce table.form-table fieldset .woocommerce-help-tip,.woocommerce table.form-table fieldset img.help_tip{margin:-3px 0 0 5px}.woocommerce table.form-table fieldset p.description{margin-bottom:8px}.woocommerce table.form-table fieldset:first-child{margin-top:0}.woocommerce table.form-table .iris-picker{z-index:100;display:none;position:absolute;border:1px solid #ccc;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.2)}.woocommerce table.form-table .iris-picker .ui-slider{border:0 !important;margin:0 !important;width:auto !important;height:auto !important;background:none transparent !important}.woocommerce table.form-table .iris-picker .ui-slider .ui-slider-handle{margin-bottom:0 !important}.woocommerce table.form-table .iris-error{background-color:#ffafaf}.woocommerce table.form-table .colorpickpreview{padding:7px 0;line-height:1em;display:inline-block;width:26px;border:1px solid #ddd;font-size:14px}.woocommerce table.form-table .image_width_settings{vertical-align:middle}.woocommerce table.form-table .image_width_settings label{margin-left:10px}.woocommerce table.form-table .image_width_settings input{width:auto}.woocommerce table.form-table .wc_emails_wrapper,.woocommerce table.form-table .wc_payment_gateways_wrapper{padding:0 15px 10px 0}.woocommerce .wc-shipping-zone-settings td.forminp input,.woocommerce .wc-shipping-zone-settings td.forminp textarea{width:448px;padding:6px 11px}.woocommerce .wc-shipping-zone-settings td.forminp .select2-search input{padding:6px}.woocommerce #tabs-wrap table a.remove{margin-left:4px}.woocommerce #tabs-wrap table p{margin:0 0 4px !important;overflow:hidden;zoom:1}.woocommerce #tabs-wrap table p a.add{float:left}#wp-excerpt-editor-container{background:#fff}#product_variation-parent #parent_id{width:100%}#postimagediv img{border:1px solid #d5d5d5;max-width:100%}#woocommerce-product-images .inside{margin:0;padding:0}#woocommerce-product-images .inside .add_product_images{padding:0 12px 12px}#woocommerce-product-images .inside #product_images_container{padding:0 0 0 9px}#woocommerce-product-images .inside #product_images_container ul{margin:0;padding:0}#woocommerce-product-images .inside #product_images_container ul::after,#woocommerce-product-images .inside #product_images_container ul::before{content:' ';display:table}#woocommerce-product-images .inside #product_images_container ul::after{clear:both}#woocommerce-product-images .inside #product_images_container ul li.add,#woocommerce-product-images .inside #product_images_container ul li.image,#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder{width:80px;float:left;cursor:move;border:1px solid #d5d5d5;margin:9px 9px 0 0;background:#f7f7f7;border-radius:2px;position:relative;box-sizing:border-box}#woocommerce-product-images .inside #product_images_container ul li.add img,#woocommerce-product-images .inside #product_images_container ul li.image img,#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder img{width:100%;height:auto;display:block}#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder{border:3px dashed #ddd;position:relative}#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder::after{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"ï…¡";font-size:2.618em;line-height:72px;color:#ddd}#woocommerce-product-images .inside #product_images_container ul ul.actions{position:absolute;top:-8px;right:-8px;padding:2px;display:none}#woocommerce-product-images .inside #product_images_container ul ul.actions li{float:right;margin:0 0 0 2px}#woocommerce-product-images .inside #product_images_container ul ul.actions li a{width:1em;height:1em;margin:0;height:0;display:block;overflow:hidden}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.tips{cursor:pointer}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.4em}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"ï…“";color:#999;background:#fff;border-radius:50%;height:1em;width:1em;line-height:1em}#woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete:hover::before{color:#a00}#woocommerce-product-images .inside #product_images_container ul li:hover ul.actions{display:block}#woocommerce-product-data .hndle{padding:10px}#woocommerce-product-data .hndle span{display:block;vertical-align:middle;line-height:24px}#woocommerce-product-data .hndle span span{display:inline;line-height:inherit;vertical-align:baseline}#woocommerce-product-data .hndle select{margin:0}#woocommerce-product-data .hndle label{padding-right:1em;font-size:12px;vertical-align:baseline}#woocommerce-product-data .hndle label:first-child{margin-right:1em;border-right:1px solid #dfdfdf}#woocommerce-product-data .hndle input,#woocommerce-product-data .hndle select{margin-top:-3px 0 0;vertical-align:middle}#woocommerce-product-data .hndle select{margin-left:.5em}#woocommerce-product-data>.handlediv{margin-top:4px}#woocommerce-product-data .wrap{margin:0}#woocommerce-coupon-description{padding:3px 8px;font-size:1.7em;line-height:1.42em;height:auto;width:100%;outline:0;margin:10px 0;display:block}#woocommerce-coupon-description::-webkit-input-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description::-moz-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description:-ms-input-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-description:-moz-placeholder{line-height:1.42em;color:#bbb}#woocommerce-coupon-data .panel-wrap,#woocommerce-product-data .panel-wrap{background:#fff}#woocommerce-coupon-data .wc-metaboxes-wrapper,#woocommerce-coupon-data .woocommerce_options_panel,#woocommerce-product-data .wc-metaboxes-wrapper,#woocommerce-product-data .woocommerce_options_panel{float:left;width:80%}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios,#woocommerce-product-data .woocommerce_options_panel .wc-radios{display:block;float:left;margin:0}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios li,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios li,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios li,#woocommerce-product-data .woocommerce_options_panel .wc-radios li{display:block;padding:0 0 10px}#woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios li input,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios li input,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios li input,#woocommerce-product-data .woocommerce_options_panel .wc-radios li input{width:auto}#woocommerce-coupon-data .panel-wrap,#woocommerce-product-data .panel-wrap,.woocommerce .panel-wrap{overflow:hidden}#woocommerce-coupon-data ul.wc-tabs,#woocommerce-product-data ul.wc-tabs,.woocommerce ul.wc-tabs{margin:0;width:20%;float:left;line-height:1em;padding:0 0 10px;position:relative;background-color:#fafafa;border-right:1px solid #eee;box-sizing:border-box}#woocommerce-coupon-data ul.wc-tabs::after,#woocommerce-product-data ul.wc-tabs::after,.woocommerce ul.wc-tabs::after{content:"";display:block;width:100%;height:9999em;position:absolute;bottom:-9999em;left:0;background-color:#fafafa;border-right:1px solid #eee}#woocommerce-coupon-data ul.wc-tabs li,#woocommerce-product-data ul.wc-tabs li,.woocommerce ul.wc-tabs li{margin:0;padding:0;display:block;position:relative}#woocommerce-coupon-data ul.wc-tabs li a,#woocommerce-product-data ul.wc-tabs li a,.woocommerce ul.wc-tabs li a{margin:0;padding:10px;display:block;box-shadow:none;text-decoration:none;line-height:20px !important;border-bottom:1px solid #eee}#woocommerce-coupon-data ul.wc-tabs li a span,#woocommerce-product-data ul.wc-tabs li a span,.woocommerce ul.wc-tabs li a span{margin-left:.618em;margin-right:.618em}#woocommerce-coupon-data ul.wc-tabs li a::before,#woocommerce-product-data ul.wc-tabs li a::before,.woocommerce ul.wc-tabs li a::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;content:"";text-decoration:none}#woocommerce-coupon-data ul.wc-tabs li.general_options a::before,#woocommerce-product-data ul.wc-tabs li.general_options a::before,.woocommerce ul.wc-tabs li.general_options a::before{content:"\f107"}#woocommerce-coupon-data ul.wc-tabs li.inventory_options a::before,#woocommerce-product-data ul.wc-tabs li.inventory_options a::before,.woocommerce ul.wc-tabs li.inventory_options a::before{content:"\f481"}#woocommerce-coupon-data ul.wc-tabs li.shipping_options a::before,#woocommerce-product-data ul.wc-tabs li.shipping_options a::before,.woocommerce ul.wc-tabs li.shipping_options a::before{font-family:WooCommerce;content:"\e01a"}#woocommerce-coupon-data ul.wc-tabs li.linked_product_options a::before,#woocommerce-product-data ul.wc-tabs li.linked_product_options a::before,.woocommerce ul.wc-tabs li.linked_product_options a::before{content:"\f103"}#woocommerce-coupon-data ul.wc-tabs li.attribute_options a::before,#woocommerce-product-data ul.wc-tabs li.attribute_options a::before,.woocommerce ul.wc-tabs li.attribute_options a::before{content:"\f175"}#woocommerce-coupon-data ul.wc-tabs li.advanced_options a::before,#woocommerce-product-data ul.wc-tabs li.advanced_options a::before,.woocommerce ul.wc-tabs li.advanced_options a::before{font-family:Dashicons;content:"\f111"}#woocommerce-coupon-data ul.wc-tabs li.marketplace-suggestions_options a::before,#woocommerce-product-data ul.wc-tabs li.marketplace-suggestions_options a::before,.woocommerce ul.wc-tabs li.marketplace-suggestions_options a::before{content:none}#woocommerce-coupon-data ul.wc-tabs li.variations_options a::before,#woocommerce-product-data ul.wc-tabs li.variations_options a::before,.woocommerce ul.wc-tabs li.variations_options a::before{content:"\f509"}#woocommerce-coupon-data ul.wc-tabs li.usage_restriction_options a::before,#woocommerce-product-data ul.wc-tabs li.usage_restriction_options a::before,.woocommerce ul.wc-tabs li.usage_restriction_options a::before{font-family:WooCommerce;content:"\e602"}#woocommerce-coupon-data ul.wc-tabs li.usage_limit_options a::before,#woocommerce-product-data ul.wc-tabs li.usage_limit_options a::before,.woocommerce ul.wc-tabs li.usage_limit_options a::before{font-family:WooCommerce;content:"\e601"}#woocommerce-coupon-data ul.wc-tabs li.general_coupon_data a::before,#woocommerce-product-data ul.wc-tabs li.general_coupon_data a::before,.woocommerce ul.wc-tabs li.general_coupon_data a::before{font-family:WooCommerce;content:"\e600"}#woocommerce-coupon-data ul.wc-tabs li.active a,#woocommerce-product-data ul.wc-tabs li.active a,.woocommerce ul.wc-tabs li.active a{color:#555;position:relative;background-color:#eee}.woocommerce_page_wc-settings input[type=email],.woocommerce_page_wc-settings input[type=url]{direction:ltr}.woocommerce_page_wc-settings .shippingrows th.check-column{padding-top:20px}.woocommerce_page_wc-settings .shippingrows tfoot th{padding-left:10px}.woocommerce_page_wc-settings .shippingrows .add.button::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-right:.618em;content:"";text-decoration:none}.woocommerce_page_wc-settings h3.wc-settings-sub-title{font-size:1.2em}#woocommerce-coupon-data .inside,#woocommerce-order-data .inside,#woocommerce-order-downloads .inside,#woocommerce-product-data .inside,#woocommerce-product-type-options .inside{margin:0;padding:0}.panel,.woocommerce_options_panel{padding:9px;color:#555}.panel .form-field .woocommerce-help-tip,.woocommerce_options_panel .form-field .woocommerce-help-tip{font-size:1.4em}.panel,.woocommerce_page_settings .woocommerce_options_panel{padding:0}#woocommerce-product-specs .inside,#woocommerce-product-type-options .panel{margin:0;padding:9px}#woocommerce-product-type-options .panel p,.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p{margin:0 0 9px;font-size:12px;padding:5px 9px;line-height:24px}#woocommerce-product-type-options .panel p::after,.woocommerce_options_panel fieldset.form-field::after,.woocommerce_options_panel p::after{content:".";display:block;height:0;clear:both;visibility:hidden}.woocommerce_options_panel .checkbox,.woocommerce_variable_attributes .checkbox{width:auto;margin:4px 0 !important;vertical-align:middle;float:left}.woocommerce_options_panel .downloadable_files table,.woocommerce_variations .downloadable_files table{width:100%;padding:0 !important}.woocommerce_options_panel .downloadable_files table th,.woocommerce_variations .downloadable_files table th{padding:7px 0 7px 7px !important}.woocommerce_options_panel .downloadable_files table th.sort,.woocommerce_variations .downloadable_files table th.sort{width:17px;padding:7px !important}.woocommerce_options_panel .downloadable_files table th .woocommerce-help-tip,.woocommerce_variations .downloadable_files table th .woocommerce-help-tip{font-size:1.1em;margin-left:0}.woocommerce_options_panel .downloadable_files table td,.woocommerce_variations .downloadable_files table td{vertical-align:middle !important;padding:4px 0 4px 7px !important;position:relative}.woocommerce_options_panel .downloadable_files table td:last-child,.woocommerce_variations .downloadable_files table td:last-child{padding-right:7px !important}.woocommerce_options_panel .downloadable_files table td input.input_text,.woocommerce_variations .downloadable_files table td input.input_text{width:100%;float:none;min-width:0;margin:1px 0}.woocommerce_options_panel .downloadable_files table td .upload_file_button,.woocommerce_variations .downloadable_files table td .upload_file_button{width:auto;float:right;cursor:pointer}.woocommerce_options_panel .downloadable_files table td .delete,.woocommerce_variations .downloadable_files table td .delete{display:block;text-indent:-9999px;position:relative;height:1em;width:1em;font-size:1.2em}.woocommerce_options_panel .downloadable_files table td .delete::before,.woocommerce_variations .downloadable_files table td .delete::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"ï…“";color:#999}.woocommerce_options_panel .downloadable_files table td .delete:hover::before,.woocommerce_variations .downloadable_files table td .delete:hover::before{color:#a00}.woocommerce_options_panel .downloadable_files table td.sort,.woocommerce_variations .downloadable_files table td.sort{width:17px;cursor:move;font-size:15px;text-align:center;background:#f9f9f9;padding-right:7px !important}.woocommerce_options_panel .downloadable_files table td.sort::before,.woocommerce_variations .downloadable_files table td.sort::before{content:"\f333";font-family:Dashicons;text-align:center;line-height:1;color:#999;display:block;width:17px;float:left;height:100%}.woocommerce_options_panel .downloadable_files table td.sort:hover::before,.woocommerce_variations .downloadable_files table td.sort:hover::before{color:#333}.woocommerce_variation h3 .sort{width:17px;height:26px;cursor:move;float:right;font-size:15px;font-weight:400;margin-right:.5em;visibility:hidden;text-align:center;vertical-align:middle}.woocommerce_variation h3 .sort::before{content:"\f333";font-family:Dashicons;text-align:center;line-height:28px;color:#999;display:block;width:17px;float:left;height:100%}.woocommerce_variation h3 .sort:hover::before{color:#777}.woocommerce_variation h3:hover .sort,.woocommerce_variation.ui-sortable-helper .sort{visibility:visible}.woocommerce_options_panel{min-height:175px;box-sizing:border-box}.woocommerce_options_panel .downloadable_files{padding:0 9px 0 162px;position:relative;margin:9px 0}.woocommerce_options_panel .downloadable_files label{position:absolute;left:0;margin:0 0 0 12px;line-height:24px}.woocommerce_options_panel p{margin:9px 0}.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p.form-field{padding:5px 20px 5px 162px !important}.woocommerce_options_panel .sale_price_dates_fields .short:first-of-type{margin-bottom:1em}.woocommerce_options_panel .sale_price_dates_fields .short:nth-of-type(2){clear:left}.woocommerce_options_panel label,.woocommerce_options_panel legend{float:left;width:150px;padding:0;margin:0 0 0 -150px}.woocommerce_options_panel label .req,.woocommerce_options_panel legend .req{font-weight:700;font-style:normal;color:#a00}.woocommerce_options_panel .description{padding:0;margin:0 0 0 7px;clear:none;display:inline}.woocommerce_options_panel .description-block{margin-left:0;display:block}.woocommerce_options_panel input,.woocommerce_options_panel select,.woocommerce_options_panel textarea{margin:0}.woocommerce_options_panel textarea{float:left;height:3.5em;line-height:1.5em;vertical-align:top}.woocommerce_options_panel input[type=email],.woocommerce_options_panel input[type=number],.woocommerce_options_panel input[type=password],.woocommerce_options_panel input[type=text]{width:50%;float:left}.woocommerce_options_panel input.button{width:auto;margin-left:8px}.woocommerce_options_panel select{float:left}.woocommerce_options_panel .short,.woocommerce_options_panel input[type=email].short,.woocommerce_options_panel input[type=number].short,.woocommerce_options_panel input[type=password].short,.woocommerce_options_panel input[type=text].short{width:50%}.woocommerce_options_panel .sized{width:auto !important;margin-right:6px}.woocommerce_options_panel .options_group{border-top:1px solid #fff;border-bottom:1px solid #eee}.woocommerce_options_panel .options_group:first-child{border-top:0}.woocommerce_options_panel .options_group:last-child{border-bottom:0}.woocommerce_options_panel .options_group fieldset{margin:9px 0;font-size:12px;padding:5px 9px;line-height:24px}.woocommerce_options_panel .options_group fieldset label{width:auto;float:none}.woocommerce_options_panel .options_group fieldset ul{float:left;width:50%;margin:0;padding:0}.woocommerce_options_panel .options_group fieldset ul li{margin:0;width:auto}.woocommerce_options_panel .options_group fieldset ul li input{width:auto;float:none;margin-right:4px}.woocommerce_options_panel .options_group fieldset ul.wc-radios label{margin-left:0}.woocommerce_options_panel .dimensions_field .wrap{display:block;width:50%}.woocommerce_options_panel .dimensions_field .wrap input{width:30.75%;margin-right:3.8%}.woocommerce_options_panel .dimensions_field .wrap .last{margin-right:0}.woocommerce_options_panel.padded{padding:1em}.woocommerce_options_panel .select2-container{float:left}#woocommerce-product-data input.dp-applied{float:left}#grouped_product_options,#simple_product_options,#virtual_product_options{padding:12px;font-style:italic;color:#666}.wc-metaboxes-wrapper .toolbar{margin:0 !important;border-top:1px solid #fff;border-bottom:1px solid #eee;padding:9px 12px !important}.wc-metaboxes-wrapper .toolbar:first-child{border-top:0}.wc-metaboxes-wrapper .toolbar:last-child{border-bottom:0}.wc-metaboxes-wrapper .toolbar .add_variation{float:right;margin-left:5px}.wc-metaboxes-wrapper .toolbar .cancel-variation-changes,.wc-metaboxes-wrapper .toolbar .save-variation-changes{float:left;margin-right:5px}.wc-metaboxes-wrapper p.toolbar{overflow:hidden;zoom:1}.wc-metaboxes-wrapper .expand-close{margin-right:2px;color:#777;font-size:12px;font-style:italic}.wc-metaboxes-wrapper .expand-close a{background:0;padding:0;font-size:12px;text-decoration:none}.wc-metaboxes-wrapper#product_attributes .expand-close{float:right;line-height:28px}.wc-metaboxes-wrapper .fr,.wc-metaboxes-wrapper button.add_variable_attribute{float:right;margin:0 0 0 6px}.wc-metaboxes-wrapper .wc-metaboxes{border-bottom:1px solid #eee}.wc-metaboxes-wrapper .wc-metabox-sortable-placeholder{border-color:#bbb;background-color:#f5f5f5;margin-bottom:9px;border-width:1px;border-style:dashed}.wc-metaboxes-wrapper .wc-metabox{background:#fff;border-bottom:1px solid #eee;margin:0 !important}.wc-metaboxes-wrapper .wc-metabox select{font-weight:400}.wc-metaboxes-wrapper .wc-metabox:last-of-type{border-bottom:0}.wc-metaboxes-wrapper .wc-metabox .handlediv{width:27px}.wc-metaboxes-wrapper .wc-metabox .handlediv::before{content:"\f142" !important;cursor:pointer;display:inline-block;font:400 20px/1 Dashicons;line-height:.5 !important;padding:8px 10px;position:relative;right:12px;top:0}.wc-metaboxes-wrapper .wc-metabox.closed{border-radius:3px}.wc-metaboxes-wrapper .wc-metabox.closed .handlediv::before{content:"\f140" !important}.wc-metaboxes-wrapper .wc-metabox.closed h3{border:0}.wc-metaboxes-wrapper .wc-metabox h3{margin:0 !important;padding:.75em .75em .75em 1em !important;font-size:1em !important;overflow:hidden;zoom:1;cursor:move}.wc-metaboxes-wrapper .wc-metabox h3 a.delete,.wc-metaboxes-wrapper .wc-metabox h3 button{float:right}.wc-metaboxes-wrapper .wc-metabox h3 a.delete{color:red;font-weight:400;line-height:26px;text-decoration:none;position:relative;visibility:hidden}.wc-metaboxes-wrapper .wc-metabox h3 strong{font-weight:400;line-height:26px;font-weight:700}.wc-metaboxes-wrapper .wc-metabox h3 select{font-family:sans-serif;max-width:20%;margin:.25em .25em .25em 0}.wc-metaboxes-wrapper .wc-metabox h3 .handlediv{background-position:6px 5px !important;visibility:hidden;height:26px}.wc-metaboxes-wrapper .wc-metabox h3.fixed{cursor:pointer !important}.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3{cursor:pointer;padding:.5em .75em .5em 1em !important}.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 .handlediv,.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 .sort,.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 a.delete{margin-top:.25em}.wc-metaboxes-wrapper .wc-metabox h3:hover .handlediv,.wc-metaboxes-wrapper .wc-metabox h3:hover a.delete,.wc-metaboxes-wrapper .wc-metabox.ui-sortable-helper .handlediv,.wc-metaboxes-wrapper .wc-metabox.ui-sortable-helper a.delete{visibility:visible}.wc-metaboxes-wrapper .wc-metabox table{width:100%;position:relative;background-color:#fdfdfd;padding:1em;border-top:1px solid #eee}.wc-metaboxes-wrapper .wc-metabox table td{text-align:left;padding:0 6px 1em 0;vertical-align:top;border:0}.wc-metaboxes-wrapper .wc-metabox table td label{text-align:left;display:block;line-height:21px}.wc-metaboxes-wrapper .wc-metabox table td input{float:left;min-width:200px}.wc-metaboxes-wrapper .wc-metabox table td input,.wc-metaboxes-wrapper .wc-metabox table td textarea{width:100%;margin:0;display:block;font-size:14px;padding:4px;color:#555}.wc-metaboxes-wrapper .wc-metabox table td .select2-container,.wc-metaboxes-wrapper .wc-metabox table td select{width:100% !important}.wc-metaboxes-wrapper .wc-metabox table td input.short{width:200px}.wc-metaboxes-wrapper .wc-metabox table td input.checkbox{width:16px;min-width:inherit;vertical-align:text-bottom;display:inline-block;float:none}.wc-metaboxes-wrapper .wc-metabox table td.attribute_name{width:200px}.wc-metaboxes-wrapper .wc-metabox table .minus,.wc-metaboxes-wrapper .wc-metabox table .plus{margin-top:6px}.wc-metaboxes-wrapper .wc-metabox table .fl{float:left}.wc-metaboxes-wrapper .wc-metabox table .fr{float:right}.variations-pagenav{float:right;line-height:24px}.variations-pagenav .displaying-num{color:#777;font-size:12px;font-style:italic}.variations-pagenav a{padding:0 10px 3px;background:rgba(0,0,0,.05);font-size:16px;font-weight:400;text-decoration:none}.variations-pagenav a.disabled,.variations-pagenav a.disabled:active,.variations-pagenav a.disabled:focus,.variations-pagenav a.disabled:hover{color:#a0a5aa;background:rgba(0,0,0,.05)}.variations-defaults{float:left}.variations-defaults select{margin:.25em .25em .25em 0}.woocommerce_variable_attributes{background-color:#fdfdfd;border-top:1px solid #eee}.woocommerce_variable_attributes .data{padding:1em 2em}.woocommerce_variable_attributes .data::after,.woocommerce_variable_attributes .data::before{content:' ';display:table}.woocommerce_variable_attributes .data::after{clear:both}.woocommerce_variable_attributes .upload_image_button{display:block;width:64px;height:64px;float:left;margin-right:20px;position:relative;cursor:pointer}.woocommerce_variable_attributes .upload_image_button img{width:100%;height:auto;display:none}.woocommerce_variable_attributes .upload_image_button::before{content:"\f128";font-family:Dashicons;position:absolute;top:0;left:0;right:0;bottom:0;text-align:center;line-height:64px;font-size:64px;font-weight:400;-webkit-font-smoothing:antialiased}.woocommerce_variable_attributes .upload_image_button.remove img{display:block}.woocommerce_variable_attributes .upload_image_button.remove::before{content:"\f335";display:none}.woocommerce_variable_attributes .upload_image_button.remove:hover::before{display:block}.woocommerce_variable_attributes .options{border:1px solid #eee;border-width:1px 0;padding:.25em 0}.woocommerce_variable_attributes .options label{display:inline-block;padding:4px 1em 2px 0}.woocommerce_variable_attributes .options input[type=checkbox]{margin:0 5px 0 .5em !important;vertical-align:middle}.form-row label{display:inline-block}.form-row .woocommerce-help-tip{float:right}.form-row input[type=color],.form-row input[type=date],.form-row input[type=datetime-local],.form-row input[type=datetime],.form-row input[type=email],.form-row input[type=month],.form-row input[type=number],.form-row input[type=password],.form-row input[type=search],.form-row input[type=tel],.form-row input[type=text],.form-row input[type=time],.form-row input[type=url],.form-row input[type=week],.form-row select,.form-row textarea{width:100%;vertical-align:middle;margin:2px 0 0;padding:5px}.form-row select{height:30px;line-height:30px}.form-row.dimensions_field .wrap{clear:left;display:block}.form-row.dimensions_field input{width:33%;float:left;vertical-align:middle}.form-row.dimensions_field input:last-of-type{margin-right:0;width:34%}.form-row.form-row-first,.form-row.form-row-last{width:48%;float:right}.form-row.form-row-first{clear:both;float:left}.form-row.form-row-full{clear:both}.tips{cursor:help;text-decoration:none}img.tips{padding:5px 0 0}#tiptip_holder{display:none;z-index:8675309;position:absolute;top:0;left:0}#tiptip_holder.tip_top{padding-bottom:5px}#tiptip_holder.tip_top #tiptip_arrow_inner{margin-top:-7px;margin-left:-6px;border-top-color:#333}#tiptip_holder.tip_bottom{padding-top:5px}#tiptip_holder.tip_bottom #tiptip_arrow_inner{margin-top:-5px;margin-left:-6px;border-bottom-color:#333}#tiptip_holder.tip_right{padding-left:5px}#tiptip_holder.tip_right #tiptip_arrow_inner{margin-top:-6px;margin-left:-5px;border-right-color:#333}#tiptip_holder.tip_left{padding-right:5px}#tiptip_holder.tip_left #tiptip_arrow_inner{margin-top:-6px;margin-left:-7px;border-left-color:#333}#tiptip_content,.chart-tooltip,.wc_error_tip{color:#fff;font-size:.8em;max-width:150px;background:#333;text-align:center;border-radius:3px;padding:.618em 1em;box-shadow:0 1px 3px rgba(0,0,0,.2)}#tiptip_content code,.chart-tooltip code,.wc_error_tip code{padding:1px;background:#888}#tiptip_arrow,#tiptip_arrow_inner{position:absolute;border-color:transparent;border-style:solid;border-width:6px;height:0;width:0}.wc_error_tip{max-width:20em;line-height:1.8em;position:absolute;white-space:normal;background:#d82223;margin:1.5em 1px 0 -1em;z-index:9999999}.wc_error_tip::after{content:"";display:block;border:8px solid #d82223;border-right-color:transparent;border-left-color:transparent;border-top-color:transparent;position:absolute;top:-3px;left:50%;margin:-1em 0 0 -3px}img.ui-datepicker-trigger{vertical-align:middle;margin-top:-1px;cursor:pointer}.wc-metabox-content img.ui-datepicker-trigger,.woocommerce_options_panel img.ui-datepicker-trigger{float:left;margin-right:8px;margin-top:4px;margin-left:4px}#ui-datepicker-div{display:none}.woocommerce-reports-remove-filter{color:red;text-decoration:none}.woocommerce-reports-wide.woocommerce-reports-wrap,.woocommerce-reports-wrap.woocommerce-reports-wrap{margin-left:300px;padding-top:18px}.woocommerce-reports-wide.halved,.woocommerce-reports-wrap.halved{margin:0;overflow:hidden;zoom:1}.woocommerce-reports-wide .widefat th,.woocommerce-reports-wrap .widefat th{padding:7px}.woocommerce-reports-wide .widefat td,.woocommerce-reports-wrap .widefat td{vertical-align:top;padding:7px}.woocommerce-reports-wide .widefat td .description,.woocommerce-reports-wrap .widefat td .description{margin:4px 0 0}.woocommerce-reports-wide .postbox::after,.woocommerce-reports-wrap .postbox::after{content:".";display:block;height:0;clear:both;visibility:hidden}.woocommerce-reports-wide .postbox h3,.woocommerce-reports-wrap .postbox h3{cursor:default !important}.woocommerce-reports-wide .postbox .inside,.woocommerce-reports-wrap .postbox .inside{padding:10px;margin:0 !important}.woocommerce-reports-wide .postbox div.stats_range,.woocommerce-reports-wide .postbox h3.stats_range,.woocommerce-reports-wrap .postbox div.stats_range,.woocommerce-reports-wrap .postbox h3.stats_range{border-bottom-color:#dfdfdf;margin:0;padding:0 !important}.woocommerce-reports-wide .postbox div.stats_range .export_csv,.woocommerce-reports-wide .postbox h3.stats_range .export_csv,.woocommerce-reports-wrap .postbox div.stats_range .export_csv,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv{float:right;line-height:26px;border-left:1px solid #dfdfdf;padding:10px;display:block;text-decoration:none}.woocommerce-reports-wide .postbox div.stats_range .export_csv::before,.woocommerce-reports-wide .postbox h3.stats_range .export_csv::before,.woocommerce-reports-wrap .postbox div.stats_range .export_csv::before,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv::before{font-family:Dashicons;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;content:"ï†";text-decoration:none;margin-right:4px}.woocommerce-reports-wide .postbox div.stats_range ul,.woocommerce-reports-wide .postbox h3.stats_range ul,.woocommerce-reports-wrap .postbox div.stats_range ul,.woocommerce-reports-wrap .postbox h3.stats_range ul{list-style:none outside;margin:0;padding:0;zoom:1;background:#f5f5f5;border-bottom:1px solid #ccc}.woocommerce-reports-wide .postbox div.stats_range ul::after,.woocommerce-reports-wide .postbox div.stats_range ul::before,.woocommerce-reports-wide .postbox h3.stats_range ul::after,.woocommerce-reports-wide .postbox h3.stats_range ul::before,.woocommerce-reports-wrap .postbox div.stats_range ul::after,.woocommerce-reports-wrap .postbox div.stats_range ul::before,.woocommerce-reports-wrap .postbox h3.stats_range ul::after,.woocommerce-reports-wrap .postbox h3.stats_range ul::before{content:" ";display:table}.woocommerce-reports-wide .postbox div.stats_range ul::after,.woocommerce-reports-wide .postbox h3.stats_range ul::after,.woocommerce-reports-wrap .postbox div.stats_range ul::after,.woocommerce-reports-wrap .postbox h3.stats_range ul::after{clear:both}.woocommerce-reports-wide .postbox div.stats_range ul li,.woocommerce-reports-wide .postbox h3.stats_range ul li,.woocommerce-reports-wrap .postbox div.stats_range ul li,.woocommerce-reports-wrap .postbox h3.stats_range ul li{float:left;margin:0;padding:0;line-height:26px;font-weight:700;font-size:14px}.woocommerce-reports-wide .postbox div.stats_range ul li a,.woocommerce-reports-wide .postbox h3.stats_range ul li a,.woocommerce-reports-wrap .postbox div.stats_range ul li a,.woocommerce-reports-wrap .postbox h3.stats_range ul li a{border-right:1px solid #dfdfdf;padding:10px;display:block;text-decoration:none}.woocommerce-reports-wide .postbox div.stats_range ul li.active,.woocommerce-reports-wide .postbox h3.stats_range ul li.active,.woocommerce-reports-wrap .postbox div.stats_range ul li.active,.woocommerce-reports-wrap .postbox h3.stats_range ul li.active{background:#fff;box-shadow:0 4px 0 0 #fff}.woocommerce-reports-wide .postbox div.stats_range ul li.active a,.woocommerce-reports-wide .postbox h3.stats_range ul li.active a,.woocommerce-reports-wrap .postbox div.stats_range ul li.active a,.woocommerce-reports-wrap .postbox h3.stats_range ul li.active a{color:#777}.woocommerce-reports-wide .postbox div.stats_range ul li.custom,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom{padding:9px 10px;vertical-align:middle}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form{display:inline;margin:0}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form input.range_datepicker{padding:0;margin:0 10px 0 0;background:0;border:0;color:#777;text-align:center;box-shadow:none}.woocommerce-reports-wide .postbox div.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form input.range_datepicker.from{margin-right:0}.woocommerce-reports-wide .postbox .chart-with-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar{padding:12px 12px 12px 249px;margin:0 !important}.woocommerce-reports-wide .postbox .chart-with-sidebar .chart-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar .chart-sidebar{width:225px;margin-left:-237px;float:left}.woocommerce-reports-wide .postbox .chart-widgets,.woocommerce-reports-wrap .postbox .chart-widgets{margin:0;padding:0}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget{margin:0 0 1em;background:#fafafa;border:1px solid #dfdfdf}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget::after{content:".";display:block;height:0;clear:both;visibility:hidden}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget h4,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget h4{background:#fff;border:1px solid #dfdfdf;border-left-width:0;border-right-width:0;padding:10px;margin:0;color:#2ea2cc;border-top-width:0;background-image:-webkit-gradient(linear,left bottom,left top,from(#ececec),to(#f9f9f9));background-image:-webkit-linear-gradient(bottom,#ececec,#f9f9f9);background-image:linear-gradient(to top,#ececec,#f9f9f9)}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget h4.section_title:hover,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget h4.section_title:hover{color:#a00}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title{cursor:pointer}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title span,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title span{display:block}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title span::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title span::after{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;margin-left:.618em;content:"";text-decoration:none;float:right;font-size:.9em;line-height:1.618}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title.open,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title.open{color:#333}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title.open span::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title.open span::after{display:none}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section{border-bottom:1px solid #dfdfdf}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section .select2-container,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section .select2-container{width:100% !important}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section:last-of-type,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section:last-of-type{border-radius:0 0 3px 3px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table{width:100%}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td{padding:7px 10px;vertical-align:top;border-top:1px solid #e5e5e5;line-height:1.4em}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table tr:first-child td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table tr:first-child td{border-top:0}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.count,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.count{background:#f5f5f5}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.name,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.name{max-width:175px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.name a,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.name a{word-wrap:break-word}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.sparkline,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.sparkline{vertical-align:middle}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table .wc_sparkline,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table .wc_sparkline{width:32px;height:1em;display:block;float:right}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table tr.active td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table tr.active td{background:#f5f5f5}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget form,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget p,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget form,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget p{margin:0;padding:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget form .submit,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget p .submit,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget form .submit,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget p .submit{margin-top:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget #product_ids,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget #product_ids{width:100%}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .select_all,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .select_none,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .select_all,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .select_none{float:right;color:#999;margin-left:4px;margin-top:10px}.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .description,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .description{margin-left:.5em;font-weight:400;opacity:.8}.woocommerce-reports-wide .postbox .chart-legend,.woocommerce-reports-wrap .postbox .chart-legend{list-style:none outside;margin:0 0 1em;padding:0;border:1px solid #dfdfdf;border-right-width:0;border-bottom-width:0;background:#fff}.woocommerce-reports-wide .postbox .chart-legend li,.woocommerce-reports-wrap .postbox .chart-legend li{border-right:5px solid #aaa;color:#aaa;padding:1em;display:block;margin:0;-webkit-transition:all ease .5s;transition:all ease .5s;box-shadow:inset 0 -1px 0 0 #dfdfdf}.woocommerce-reports-wide .postbox .chart-legend li strong,.woocommerce-reports-wrap .postbox .chart-legend li strong{font-size:1.618em;line-height:1.2em;color:#464646;font-weight:400;display:block;font-family:HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",sans-serif}.woocommerce-reports-wide .postbox .chart-legend li strong del,.woocommerce-reports-wrap .postbox .chart-legend li strong del{color:#e74c3c;font-weight:400}.woocommerce-reports-wide .postbox .chart-legend li:hover,.woocommerce-reports-wrap .postbox .chart-legend li:hover{box-shadow:inset 0 -1px 0 0 #dfdfdf,inset 300px 0 0 rgba(156,93,144,.1);border-right:5px solid #9c5d90 !important;padding-left:1.5em;color:#9c5d90}.woocommerce-reports-wide .postbox .pie-chart-legend,.woocommerce-reports-wrap .postbox .pie-chart-legend{margin:12px 0 0;overflow:hidden}.woocommerce-reports-wide .postbox .pie-chart-legend li,.woocommerce-reports-wrap .postbox .pie-chart-legend li{float:left;margin:0;padding:6px 0 0;border-top:4px solid #999;text-align:center;box-sizing:border-box;width:50%}.woocommerce-reports-wide .postbox .stat,.woocommerce-reports-wrap .postbox .stat{font-size:1.5em !important;font-weight:700;text-align:center}.woocommerce-reports-wide .postbox .chart-placeholder,.woocommerce-reports-wrap .postbox .chart-placeholder{width:100%;height:650px;overflow:hidden;position:relative}.woocommerce-reports-wide .postbox .chart-prompt,.woocommerce-reports-wrap .postbox .chart-prompt{line-height:650px;margin:0;color:#999;font-size:1.2em;font-style:italic;text-align:center}.woocommerce-reports-wide .postbox .chart-container,.woocommerce-reports-wrap .postbox .chart-container{background:#fff;padding:12px;position:relative;border:1px solid #dfdfdf;border-radius:3px}.woocommerce-reports-wide .postbox .main .chart-legend,.woocommerce-reports-wrap .postbox .main .chart-legend{margin-top:12px}.woocommerce-reports-wide .postbox .main .chart-legend li,.woocommerce-reports-wrap .postbox .main .chart-legend li{border-right:0;margin:0 8px 0 0;float:left;border-top:4px solid #aaa}.woocommerce-reports-wide .woocommerce-reports-main,.woocommerce-reports-wrap .woocommerce-reports-main{float:left;min-width:100%}.woocommerce-reports-wide .woocommerce-reports-main table td,.woocommerce-reports-wrap .woocommerce-reports-main table td{padding:9px}.woocommerce-reports-wide .woocommerce-reports-sidebar,.woocommerce-reports-wrap .woocommerce-reports-sidebar{display:inline;width:281px;margin-left:-300px;clear:both;float:left}.woocommerce-reports-wide .woocommerce-reports-left,.woocommerce-reports-wrap .woocommerce-reports-left{width:49.5%;float:left}.woocommerce-reports-wide .woocommerce-reports-right,.woocommerce-reports-wrap .woocommerce-reports-right{width:49.5%;float:right}.woocommerce-wide-reports-wrap{padding-bottom:11px}.woocommerce-wide-reports-wrap .widefat .export-data{float:right}.woocommerce-wide-reports-wrap .widefat td,.woocommerce-wide-reports-wrap .widefat th{vertical-align:middle;padding:7px}form.report_filters p{vertical-align:middle}form.report_filters div,form.report_filters input,form.report_filters label{vertical-align:middle}.chart-tooltip{position:absolute;display:none;line-height:1}table.bar_chart{width:100%}table.bar_chart thead th{text-align:left;color:#ccc;padding:6px 0}table.bar_chart tbody th{padding:6px 0;width:25%;text-align:left !important;font-weight:400 !important;border-bottom:1px solid #fee}table.bar_chart tbody td{text-align:right;line-height:24px;padding:6px 6px 6px 0;border-bottom:1px solid #fee}table.bar_chart tbody td span{color:#8a4b75;display:block}table.bar_chart tbody td span.alt{color:#47a03e;margin-top:6px}table.bar_chart tbody td.bars{position:relative;text-align:left;padding:6px 6px 6px 0;border-bottom:1px solid #fee}table.bar_chart tbody td.bars a,table.bar_chart tbody td.bars span{text-decoration:none;clear:both;background:#8a4b75;float:left;display:block;line-height:24px;height:24px;border-radius:3px}table.bar_chart tbody td.bars span.alt{clear:both;background:#47a03e}table.bar_chart tbody td.bars span.alt span{margin:0;color:#c5dec2 !important;text-shadow:0 1px 0 #47a03e;background:0}.post-type-shop_order .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"î€"}.post-type-shop_coupon .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.post-type-product .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState--api .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState--webhooks .woocommerce-BlankState-message::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:""}.woocommerce-BlankState{text-align:center;padding:5em 0 0}.woocommerce-BlankState .woocommerce-BlankState-message{color:#aaa;margin:0 auto 1.5em;line-height:1.5em;font-size:1.2em;max-width:500px}.woocommerce-BlankState .woocommerce-BlankState-message::before{color:#ddd;text-shadow:0 -1px 1px rgba(0,0,0,.2),0 1px 0 rgba(255,255,255,.8);font-size:8em;display:block;position:relative !important;top:auto;left:auto;line-height:1em;margin:0 0 .1875em}.woocommerce-BlankState .woocommerce-BlankState-cta{font-size:1.2em;padding:.75em 1.5em;margin:0 .25em;height:auto;display:inline-block !important}.post-type-product .woocommerce-BlankState,.post-type-shop_order .woocommerce-BlankState{max-width:764px;text-align:center;margin:auto}.post-type-product .woocommerce-BlankState .woocommerce-BlankState-message,.post-type-shop_order .woocommerce-BlankState .woocommerce-BlankState-message{color:#444;font-size:1.5em;margin:0 auto 1em}.post-type-product .woocommerce-BlankState .woocommerce-BlankState-message::before,.post-type-shop_order .woocommerce-BlankState .woocommerce-BlankState-message::before{font-size:120px}.post-type-product .woocommerce-BlankState .woocommerce-BlankState-buttons,.post-type-shop_order .woocommerce-BlankState .woocommerce-BlankState-buttons{margin-bottom:4em}@media only screen and (max-width:1280px){#order_data .order_data_column{width:48%}#order_data .order_data_column:first-child{width:100%}.woocommerce_options_panel .description{display:block;clear:both;margin-left:0}.woocommerce_options_panel .dimensions_field .wrap,.woocommerce_options_panel .short,.woocommerce_options_panel input[type=email].short,.woocommerce_options_panel input[type=number].short,.woocommerce_options_panel input[type=password].short,.woocommerce_options_panel input[type=text].short{width:80%}.woocommerce_options_panel .downloadable_files,.woocommerce_variations .downloadable_files{padding:0;clear:both}.woocommerce_options_panel .downloadable_files label,.woocommerce_variations .downloadable_files label{position:static}.woocommerce_options_panel .downloadable_files table,.woocommerce_variations .downloadable_files table{margin:0 12px 24px;width:94%}.woocommerce_options_panel .downloadable_files table .sort,.woocommerce_variations .downloadable_files table .sort{visibility:hidden}.woocommerce_options_panel .woocommerce_variable_attributes .downloadable_files table,.woocommerce_variations .woocommerce_variable_attributes .downloadable_files table{margin:0 0 1em;width:100%}}@media only screen and (max-width:900px){#woocommerce-coupon-data ul.coupon_data_tabs,#woocommerce-product-data .wc-tabs-back,#woocommerce-product-data ul.product_data_tabs{width:10%}#woocommerce-coupon-data .wc-metaboxes-wrapper,#woocommerce-coupon-data .woocommerce_options_panel,#woocommerce-product-data .wc-metaboxes-wrapper,#woocommerce-product-data .woocommerce_options_panel{width:90%}#woocommerce-coupon-data ul.coupon_data_tabs li a,#woocommerce-product-data ul.product_data_tabs li a{position:relative;text-indent:-999px;padding:10px}#woocommerce-coupon-data ul.coupon_data_tabs li a::before,#woocommerce-product-data ul.product_data_tabs li a::before{position:absolute;top:0;right:0;bottom:0;left:0;text-indent:0;text-align:center;line-height:40px;width:100%;height:40px}}@media only screen and (max-width:782px){#wp-excerpt-media-buttons a{font-size:16px;line-height:37px;height:39px;padding:0 20px 0 15px}#wp-excerpt-editor-tools{padding-top:20px;padding-right:15px;overflow:hidden;margin-bottom:-1px}#woocommerce-product-data .checkbox{width:25px}.variations-pagenav{float:none;text-align:center;font-size:18px}.variations-pagenav .displaying-num{font-size:16px}.variations-pagenav a{padding:8px 20px 11px;font-size:18px}.variations-pagenav select{padding:0 20px}.variations-defaults{float:none;text-align:center;margin-top:10px}.post-type-product .wp-list-table .column-thumb{display:none;text-align:left;padding-bottom:0}.post-type-product .wp-list-table .column-thumb::before{display:none !important}.post-type-product .wp-list-table .column-thumb img{max-width:32px}.post-type-product .wp-list-table .is-expanded td:not(.hidden){overflow:visible}.post-type-product .wp-list-table .toggle-row{top:-28px}.post-type-shop_order .wp-list-table .column-customer_message,.post-type-shop_order .wp-list-table .column-order_notes{text-align:inherit}.post-type-shop_order .wp-list-table .column-order_notes .note-on{font-size:1.3em;margin:0}.post-type-shop_order .wp-list-table .is-expanded td:not(.hidden){overflow:visible}.post-type-shop_order .wp-list-table .toggle-row{top:-15px}}@media only screen and (max-width:500px){.woocommerce_options_panel label,.woocommerce_options_panel legend{float:none;width:auto;display:block;margin:0}.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p.form-field{padding:5px 20px !important}.addons-wcs-banner-block{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;flex-direction:column}.wc_addons_wrap .addons-wcs-banner-block{padding:40px}.wc_addons_wrap .addons-wcs-banner-block-image{padding:1em;text-align:center;width:100%;padding:2em 0;margin:0}.wc_addons_wrap .addons-wcs-banner-block-image .addons-img{margin:0}}.wc-backbone-modal *{box-sizing:border-box}.wc-backbone-modal .wc-backbone-modal-content{position:fixed;background:#fff;z-index:100000;left:50%;top:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%);max-width:100%;min-width:500px}.wc-backbone-modal .wc-backbone-modal-content article{overflow:auto}.wc-backbone-modal.wc-backbone-modal-shipping-method-settings .wc-backbone-modal-content{width:75%;min-width:500px}.wc-backbone-modal .select2-container{width:100% !important}@media screen and (max-width:782px){.wc-backbone-modal .wc-backbone-modal-content{width:100%;height:100%;min-width:100%}}.wc-backbone-modal-backdrop{position:fixed;top:0;left:0;right:0;bottom:0;min-height:360px;background:#000;opacity:.7;z-index:99900}.wc-backbone-modal-main{padding-bottom:55px}.wc-backbone-modal-main article,.wc-backbone-modal-main header{display:block;position:relative}.wc-backbone-modal-main .wc-backbone-modal-header{height:auto;background:#fcfcfc;padding:1em 1.5em;border-bottom:1px solid #ddd}.wc-backbone-modal-main .wc-backbone-modal-header h1{margin:0;font-size:18px;font-weight:700;line-height:1.5em}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link{cursor:pointer;color:#777;height:54px;width:54px;padding:0;position:absolute;top:0;right:0;text-align:center;border:0;border-left:1px solid #ddd;background-color:transparent;-webkit-transition:color .1s ease-in-out,background .1s ease-in-out;transition:color .1s ease-in-out,background .1s ease-in-out}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link::before{font:normal 22px/50px dashicons !important;color:#666;display:block;content:"\f335";font-weight:300}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:focus,.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:hover{background:#ddd;border-color:#ccc;color:#000}.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:focus{outline:0}.wc-backbone-modal-main article{padding:1.5em}.wc-backbone-modal-main article p{margin:1.5em 0}.wc-backbone-modal-main article p:first-child{margin-top:0}.wc-backbone-modal-main article p:last-child{margin-bottom:0}.wc-backbone-modal-main article .pagination{padding:10px 0 0;text-align:center}.wc-backbone-modal-main article table.widefat{margin:0;width:100%;border:0;box-shadow:none}.wc-backbone-modal-main article table.widefat thead th{padding:0 1em 1em 1em;text-align:left}.wc-backbone-modal-main article table.widefat thead th:first-child{padding-left:0}.wc-backbone-modal-main article table.widefat thead th:last-child{padding-right:0;text-align:right}.wc-backbone-modal-main article table.widefat tbody td,.wc-backbone-modal-main article table.widefat tbody th{padding:1em;text-align:left;vertical-align:middle}.wc-backbone-modal-main article table.widefat tbody td:first-child,.wc-backbone-modal-main article table.widefat tbody th:first-child{padding-left:0}.wc-backbone-modal-main article table.widefat tbody td:last-child,.wc-backbone-modal-main article table.widefat tbody th:last-child{padding-right:0;text-align:right}.wc-backbone-modal-main article table.widefat tbody td .select2-container,.wc-backbone-modal-main article table.widefat tbody td select,.wc-backbone-modal-main article table.widefat tbody th .select2-container,.wc-backbone-modal-main article table.widefat tbody th select{width:100%}.wc-backbone-modal-main footer{position:absolute;left:0;right:0;bottom:0;z-index:100;padding:1em 1.5em;background:#fcfcfc;border-top:1px solid #dfdfdf;box-shadow:0 -4px 4px -4px rgba(0,0,0,.1)}.wc-backbone-modal-main footer .inner{text-align:right;line-height:23px}.wc-backbone-modal-main footer .inner .button{margin-bottom:0}.select2-drop,.select2-dropdown{z-index:999999 !important}.select2-results{line-height:1.5em}.select2-results .select2-results__group,.select2-results .select2-results__option{margin:0;padding:8px}.select2-results .description{display:block;color:#999;padding-top:4px}.select2-dropdown{border-color:#ddd}.select2-dropdown--below{box-shadow:0 1px 1px rgba(0,0,0,.1)}.select2-dropdown--above{box-shadow:0 -1px 1px rgba(0,0,0,.1)}.select2-container .select2-selection__rendered.ui-sortable li{cursor:move}.select2-container .select2-selection{border-color:#ddd}.select2-container .select2-search__field{min-width:150px}.select2-container .select2-selection--single{height:32px}.select2-container .select2-selection--single .select2-selection__rendered{line-height:32px;padding-right:24px}.select2-container .select2-selection--single .select2-selection__arrow{right:3px;height:30px}.select2-container .select2-selection--multiple{min-height:28px;border-radius:0;line-height:1.5}.select2-container .select2-selection--multiple li{margin:0}.select2-container .select2-selection--multiple .select2-selection__choice{padding:2px 6px}.select2-container .select2-selection--multiple .select2-selection__choice .description{display:none}.select2-container .select2-selection__clear{color:#999;margin-top:-1px}.select2-container .select2-search--inline .select2-search__field{font-family:inherit;font-size:inherit;font-weight:inherit;padding:3px 0}.woocommerce table.form-table .select2-container{min-width:400px !important}.post-type-product .tablenav .actions,.post-type-shop_order .tablenav .actions{overflow:visible}.post-type-product .tablenav input,.post-type-product .tablenav select,.post-type-shop_order .tablenav input,.post-type-shop_order .tablenav select{line-height:1;height:32px}.post-type-product .tablenav .select2-container,.post-type-shop_order .tablenav .select2-container{float:left;width:240px !important;font-size:14px;vertical-align:middle;margin:1px 6px 4px 1px}.woocommerce-exporter-wrapper,.woocommerce-importer-wrapper,.woocommerce-progress-form-wrapper{text-align:center;max-width:700px;margin:40px auto}.woocommerce-exporter-wrapper .error,.woocommerce-importer-wrapper .error,.woocommerce-progress-form-wrapper .error{text-align:left}.woocommerce-exporter-wrapper .wc-progress-steps,.woocommerce-importer-wrapper .wc-progress-steps,.woocommerce-progress-form-wrapper .wc-progress-steps{padding:0 0 24px;margin:0;list-style:none outside;overflow:hidden;color:#ccc;width:100%;display:-webkit-inline-flex;display:-webkit-inline-box;display:inline-flex}.woocommerce-exporter-wrapper .wc-progress-steps li,.woocommerce-importer-wrapper .wc-progress-steps li,.woocommerce-progress-form-wrapper .wc-progress-steps li{width:25%;float:left;padding:0 0 .8em;margin:0;text-align:center;position:relative;border-bottom:4px solid #ccc;line-height:1.4em}.woocommerce-exporter-wrapper .wc-progress-steps li::before,.woocommerce-importer-wrapper .wc-progress-steps li::before,.woocommerce-progress-form-wrapper .wc-progress-steps li::before{content:"";border:4px solid #ccc;border-radius:100%;width:4px;height:4px;position:absolute;bottom:0;left:50%;margin-left:-6px;margin-bottom:-8px;background:#fff}.woocommerce-exporter-wrapper .wc-progress-steps li.active,.woocommerce-importer-wrapper .wc-progress-steps li.active,.woocommerce-progress-form-wrapper .wc-progress-steps li.active{border-color:#a16696;color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.active::before,.woocommerce-importer-wrapper .wc-progress-steps li.active::before,.woocommerce-progress-form-wrapper .wc-progress-steps li.active::before{border-color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.done,.woocommerce-importer-wrapper .wc-progress-steps li.done,.woocommerce-progress-form-wrapper .wc-progress-steps li.done{border-color:#a16696;color:#a16696}.woocommerce-exporter-wrapper .wc-progress-steps li.done::before,.woocommerce-importer-wrapper .wc-progress-steps li.done::before,.woocommerce-progress-form-wrapper .wc-progress-steps li.done::before{border-color:#a16696;background:#a16696}.woocommerce-exporter-wrapper .button,.woocommerce-importer-wrapper .button,.woocommerce-progress-form-wrapper .button{font-size:1.25em;padding:.5em 1em !important;line-height:1.5em !important;margin-right:.5em;margin-bottom:2px;height:auto !important;border-radius:4px;background-color:#bb77ae;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597;text-shadow:0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597;margin:0;opacity:1}.woocommerce-exporter-wrapper .button:active,.woocommerce-exporter-wrapper .button:focus,.woocommerce-exporter-wrapper .button:hover,.woocommerce-importer-wrapper .button:active,.woocommerce-importer-wrapper .button:focus,.woocommerce-importer-wrapper .button:hover,.woocommerce-progress-form-wrapper .button:active,.woocommerce-progress-form-wrapper .button:focus,.woocommerce-progress-form-wrapper .button:hover{background:#a36597;border-color:#a36597;box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597}.woocommerce-exporter-wrapper .error .button,.woocommerce-importer-wrapper .error .button,.woocommerce-progress-form-wrapper .error .button{font-size:1em}.woocommerce-exporter-wrapper .wc-actions,.woocommerce-importer-wrapper .wc-actions,.woocommerce-progress-form-wrapper .wc-actions{overflow:hidden;border-top:1px solid #eee;margin:0;padding:23px 24px 24px;line-height:3em}.woocommerce-exporter-wrapper .wc-actions .button,.woocommerce-importer-wrapper .wc-actions .button,.woocommerce-progress-form-wrapper .wc-actions .button{float:right}.woocommerce-exporter-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options,.woocommerce-importer-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options,.woocommerce-progress-form-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options{color:#999}.woocommerce-exporter-wrapper .wc-progress-form-content,.woocommerce-exporter-wrapper .woocommerce-exporter,.woocommerce-exporter-wrapper .woocommerce-importer,.woocommerce-importer-wrapper .wc-progress-form-content,.woocommerce-importer-wrapper .woocommerce-exporter,.woocommerce-importer-wrapper .woocommerce-importer,.woocommerce-progress-form-wrapper .wc-progress-form-content,.woocommerce-progress-form-wrapper .woocommerce-exporter,.woocommerce-progress-form-wrapper .woocommerce-importer{background:#fff;overflow:hidden;padding:0;margin:0 0 16px;box-shadow:0 1px 3px rgba(0,0,0,.13);color:#555;text-align:left}.woocommerce-exporter-wrapper .wc-progress-form-content header,.woocommerce-exporter-wrapper .woocommerce-exporter header,.woocommerce-exporter-wrapper .woocommerce-importer header,.woocommerce-importer-wrapper .wc-progress-form-content header,.woocommerce-importer-wrapper .woocommerce-exporter header,.woocommerce-importer-wrapper .woocommerce-importer header,.woocommerce-progress-form-wrapper .wc-progress-form-content header,.woocommerce-progress-form-wrapper .woocommerce-exporter header,.woocommerce-progress-form-wrapper .woocommerce-importer header{border-bottom:1px solid #eee;margin:0;padding:24px 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content section,.woocommerce-exporter-wrapper .woocommerce-exporter section,.woocommerce-exporter-wrapper .woocommerce-importer section,.woocommerce-importer-wrapper .wc-progress-form-content section,.woocommerce-importer-wrapper .woocommerce-exporter section,.woocommerce-importer-wrapper .woocommerce-importer section,.woocommerce-progress-form-wrapper .wc-progress-form-content section,.woocommerce-progress-form-wrapper .woocommerce-exporter section,.woocommerce-progress-form-wrapper .woocommerce-importer section{padding:24px 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content h2,.woocommerce-exporter-wrapper .woocommerce-exporter h2,.woocommerce-exporter-wrapper .woocommerce-importer h2,.woocommerce-importer-wrapper .wc-progress-form-content h2,.woocommerce-importer-wrapper .woocommerce-exporter h2,.woocommerce-importer-wrapper .woocommerce-importer h2,.woocommerce-progress-form-wrapper .wc-progress-form-content h2,.woocommerce-progress-form-wrapper .woocommerce-exporter h2,.woocommerce-progress-form-wrapper .woocommerce-importer h2{margin:0 0 24px;color:#555;font-size:24px;font-weight:400;line-height:1em}.woocommerce-exporter-wrapper .wc-progress-form-content p,.woocommerce-exporter-wrapper .woocommerce-exporter p,.woocommerce-exporter-wrapper .woocommerce-importer p,.woocommerce-importer-wrapper .wc-progress-form-content p,.woocommerce-importer-wrapper .woocommerce-exporter p,.woocommerce-importer-wrapper .woocommerce-importer p,.woocommerce-progress-form-wrapper .wc-progress-form-content p,.woocommerce-progress-form-wrapper .woocommerce-exporter p,.woocommerce-progress-form-wrapper .woocommerce-importer p{font-size:1em;line-height:1.75em;font-size:16px;color:#555;margin:0 0 24px}.woocommerce-exporter-wrapper .wc-progress-form-content .form-row,.woocommerce-exporter-wrapper .woocommerce-exporter .form-row,.woocommerce-exporter-wrapper .woocommerce-importer .form-row,.woocommerce-importer-wrapper .wc-progress-form-content .form-row,.woocommerce-importer-wrapper .woocommerce-exporter .form-row,.woocommerce-importer-wrapper .woocommerce-importer .form-row,.woocommerce-progress-form-wrapper .wc-progress-form-content .form-row,.woocommerce-progress-form-wrapper .woocommerce-exporter .form-row,.woocommerce-progress-form-wrapper .woocommerce-importer .form-row{margin-top:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter .spinner,.woocommerce-exporter-wrapper .woocommerce-importer .spinner,.woocommerce-importer-wrapper .wc-progress-form-content .spinner,.woocommerce-importer-wrapper .woocommerce-exporter .spinner,.woocommerce-importer-wrapper .woocommerce-importer .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer .spinner{display:none}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th{vertical-align:top;line-height:1.75em;padding:0 0 24px 0}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th label{color:#555;font-weight:400}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox]{margin:0 4px 0 0;padding:7px}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text]{padding:7px;height:auto;margin:0}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper{border:1px solid #ddd;box-shadow:inset 0 1px 2px rgba(0,0,0,.07);background-color:#fff;color:#32373c;outline:0;line-height:1;display:block}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code{background:0;font-size:smaller;padding:0;margin:0;color:#999;padding:7px 0 0 7px;display:inline-block}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input{font-family:Consolas,Monaco,monospace;border:0;margin:0;outline:0;box-shadow:none;display:inline-block;min-width:100%}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th{width:35%;padding-right:20px}.woocommerce-exporter-wrapper .wc-progress-form-content progress,.woocommerce-exporter-wrapper .woocommerce-exporter progress,.woocommerce-exporter-wrapper .woocommerce-importer progress,.woocommerce-importer-wrapper .wc-progress-form-content progress,.woocommerce-importer-wrapper .woocommerce-exporter progress,.woocommerce-importer-wrapper .woocommerce-importer progress,.woocommerce-progress-form-wrapper .wc-progress-form-content progress,.woocommerce-progress-form-wrapper .woocommerce-exporter progress,.woocommerce-progress-form-wrapper .woocommerce-importer progress{width:100%;height:42px;margin:0 auto 24px;display:block;-webkit-appearance:none;border:0;display:none;background:#f5f5f5;border:2px solid #eee;border-radius:4px;padding:0;box-shadow:0 1px 0 0 rgba(255,255,255,.2)}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-exporter-wrapper .woocommerce-importer progress::-webkit-progress-bar,.woocommerce-importer-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-importer-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-importer-wrapper .woocommerce-importer progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-webkit-progress-bar{background:transparent none;border:0;border-radius:4px;padding:0;box-shadow:none}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-exporter-wrapper .woocommerce-importer progress::-webkit-progress-value,.woocommerce-importer-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-importer-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-importer-wrapper .woocommerce-importer progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-webkit-progress-value{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:-webkit-gradient(linear,left top,left bottom,from(#a46497),to(#66405f)),#a46497;background:-webkit-linear-gradient(top,#a46497,#66405f),#a46497;background:linear-gradient(to bottom,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-exporter-wrapper .woocommerce-importer progress::-moz-progress-bar,.woocommerce-importer-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-importer-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-importer-wrapper .woocommerce-importer progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-moz-progress-bar{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:linear-gradient(to bottom,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-exporter-wrapper .woocommerce-importer progress::-ms-fill,.woocommerce-importer-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-importer-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-importer-wrapper .woocommerce-importer progress::-ms-fill,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-ms-fill{border-radius:3px;box-shadow:inset 0 1px 1px 0 rgba(255,255,255,.4);background:#a46497;background:linear-gradient(to bottom,#a46497,#66405f),#a46497;-webkit-transition:width 1s ease;transition:width 1s ease}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner{display:block}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing progress{display:block}.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options{display:none}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper{padding:0}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table{margin:0;border:0;box-shadow:none;width:100%;table-layout:fixed}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th{border:0;padding:12px;vertical-align:middle;word-wrap:break-word}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th select{width:100%}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th{background:#fbfbfb}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th{font-weight:700}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child{padding-left:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child{padding-right:24px}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name{width:50%}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description{color:#999;margin-top:4px;display:block}.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code{background:0;padding:0;white-space:pre-line;word-wrap:break-word;word-break:break-all}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-done,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-done,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-done{text-align:center;padding:48px 24px;font-size:1.5em;line-height:1.75em}.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-done::before,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-done::before{font-family:WooCommerce;speak:none;font-weight:400;font-variant:normal;text-transform:none;line-height:1;margin:0;text-indent:0;position:absolute;top:0;left:0;width:100%;height:100%;text-align:center;content:"";color:#a16696;position:static;font-size:100px;display:block;float:none;margin:0 0 24px}.wc-pointer .wc-pointer-buttons .close{float:left;margin:6px 0 0 15px} pro/sa-includes/css/admin.css000064400001106132147600337620012161 0ustar00/** * Credit: WooCommerce; */ .select2-container { box-sizing: border-box; display: inline-block; margin: 0; position: relative; vertical-align: middle } .select2-container .select2-selection--single { box-sizing: border-box; cursor: pointer; display: block; height: 28px; margin: 0 0 -4px; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-user-select: none } .select2-container .select2-selection--single .select2-selection__rendered { display: block; padding-left: 8px; padding-right: 20px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap } .select2-container .select2-selection--single .select2-selection__clear { position: relative } .select2-container[dir=rtl] .select2-selection--single .select2-selection__rendered { padding-right: 8px; padding-left: 20px } .select2-container .select2-selection--multiple { box-sizing: border-box; cursor: pointer; display: block; min-height: 32px; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-user-select: none } .select2-container .select2-selection--multiple .select2-selection__rendered { display: inline-block; overflow: hidden; padding-left: 8px; text-overflow: ellipsis; white-space: nowrap } .select2-container .select2-search--inline { float: left; padding: 0 } .select2-container .select2-search--inline .select2-search__field { box-sizing: border-box; border: none; font-size: 100%; margin: 0; padding: 0 } .select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button { -webkit-appearance: none } .select2-dropdown { background-color: #fff; border: 1px solid #aaa; border-radius: 4px; box-sizing: border-box; display: block; position: absolute; left: -100000px; width: 100%; z-index: 1051 } .select2-results { display: block } .select2-results__options { list-style: none; margin: 0; padding: 0 } .select2-results__option { padding: 6px; -moz-user-select: none; -ms-user-select: none; user-select: none; -webkit-user-select: none } .select2-results__option[aria-selected],.select2-results__option[data-selected] { cursor: pointer } .select2-container--open .select2-dropdown { left: 0 } .select2-container--open .select2-dropdown--above { border-bottom: none; border-bottom-left-radius: 0; border-bottom-right-radius: 0 } .select2-container--open .select2-dropdown--below { border-top: none; border-top-left-radius: 0; border-top-right-radius: 0 } .select2-search--dropdown { display: block; padding: 4px } .select2-search--dropdown .select2-search__field { padding: 4px; width: 100%; box-sizing: border-box } .select2-search--dropdown .select2-search__field::-webkit-search-cancel-button { -webkit-appearance: none } .select2-search--dropdown.select2-search--hide { display: none } .select2-close-mask { border: 0; margin: 0; padding: 0; display: block; position: fixed; left: 0; top: 0; min-height: 100%; min-width: 100%; height: auto; width: auto; opacity: 0; z-index: 99; background-color: #fff } .select2-hidden-accessible { border: 0!important; clip: rect(0 0 0 0)!important; height: 1px!important; margin: -1px!important; overflow: hidden!important; padding: 0!important; position: absolute!important; width: 1px!important } .select2-container--default .select2-selection--single { background-color: #fff; border: 1px solid #aaa; border-radius: 4px } .select2-container--default .select2-selection--single .select2-selection__rendered { color: #444; line-height: 28px } .select2-container--default .select2-selection--single .select2-selection__clear { cursor: pointer; float: right; font-weight: 700 } .select2-container--default .select2-selection--single .select2-selection__placeholder { color: #999 } .select2-container--default .select2-selection--single .select2-selection__arrow { height: 26px; position: absolute; top: 1px; right: 1px; width: 20px } .select2-container--default .select2-selection--single .select2-selection__arrow b { border-color: #888 transparent transparent transparent; border-style: solid; border-width: 5px 4px 0 4px; height: 0; left: 50%; margin-left: -4px; margin-top: -2px; position: absolute; top: 50%; width: 0 } .select2-container--default[dir=rtl] .select2-selection--single .select2-selection__clear { float: left } .select2-container--default[dir=rtl] .select2-selection--single .select2-selection__arrow { left: 1px; right: auto } .select2-container--default.select2-container--disabled .select2-selection--single { background-color: #eee; cursor: default } .select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear { display: none } .select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b { border-color: transparent transparent #888 transparent; border-width: 0 4px 5px 4px } .select2-container--default .select2-selection--multiple { background-color: #fff; border: 1px solid #aaa; border-radius: 4px; cursor: text } .select2-container--default .select2-selection--multiple .select2-selection__rendered { box-sizing: border-box; list-style: none; margin: 0; padding: 0 5px; width: 100% } .select2-container--default .select2-selection--multiple .select2-selection__rendered li { list-style: none; margin: 5px 5px 0 0 } .select2-container--default .select2-selection--multiple .select2-selection__rendered li:before { content: ''; display: none } .select2-container--default .select2-selection--multiple .select2-selection__placeholder { color: #999; margin-top: 5px; float: left } .select2-container--default .select2-selection--multiple .select2-selection__clear { cursor: pointer; float: right; font-weight: 700; margin-top: 5px; margin-right: 10px } .select2-container--default .select2-selection--multiple .select2-selection__choice { background-color: #e4e4e4; border: 1px solid #aaa; border-radius: 4px; cursor: default; float: left; margin-right: 5px; margin-top: 5px; padding: 0 5px } .select2-container--default .select2-selection--multiple .select2-selection__choice__remove { color: #999; cursor: pointer; display: inline-block; font-weight: 700; margin-right: 2px } .select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover { color: #333 } .select2-container--default[dir=rtl] .select2-selection--multiple .select2-search--inline,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__placeholder { float: right } .select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice { margin-left: 5px; margin-right: auto } .select2-container--default[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove { margin-left: 2px; margin-right: auto } .select2-container--default.select2-container--focus .select2-selection--multiple { border: solid #000 1px; outline: 0 } .select2-container--default.select2-container--disabled .select2-selection--multiple { background-color: #eee; cursor: default } .select2-container--default.select2-container--disabled .select2-selection__choice__remove { display: none } .select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--above .select2-selection--single { border-top-left-radius: 0; border-top-right-radius: 0 } .select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple,.select2-container--default.select2-container--open.select2-container--below .select2-selection--single { border-bottom-left-radius: 0; border-bottom-right-radius: 0 } .select2-container--default .select2-search--dropdown .select2-search__field { border: 1px solid #aaa } .select2-container--default .select2-search--inline .select2-search__field { background: 0 0; border: none; outline: 0; box-shadow: none; -webkit-appearance: textfield } .select2-container--default .select2-results>.select2-results__options { max-height: 200px; overflow-y: auto } .select2-container--default .select2-results__option[role=group] { padding: 0 } .select2-container--default .select2-results__option[aria-disabled=true] { color: #999 } .select2-container--default .select2-results__option[aria-selected=true],.select2-container--default .select2-results__option[data-selected=true] { background-color: #ddd } .select2-container--default .select2-results__option .select2-results__option { padding-left: 1em } .select2-container--default .select2-results__option .select2-results__option .select2-results__group { padding-left: 0 } .select2-container--default .select2-results__option .select2-results__option .select2-results__option { margin-left: -1em; padding-left: 2em } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -2em; padding-left: 3em } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -3em; padding-left: 4em } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -4em; padding-left: 5em } .select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option { margin-left: -5em; padding-left: 6em } .select2-container--default .select2-results__option--highlighted[aria-selected],.select2-container--default .select2-results__option--highlighted[data-selected] { background-color: #0073aa; color: #fff } .select2-container--default .select2-results__group { cursor: default; display: block; padding: 6px } .select2-container--classic .select2-selection--single { background-color: #f7f7f7; border: 1px solid #aaa; border-radius: 4px; outline: 0; background-image: -webkit-gradient(linear,left top,left bottom,color-stop(50%,#fff),to(#eee)); background-image: -webkit-linear-gradient(top,#fff 50%,#eee 100%); background-image: linear-gradient(to bottom,#fff 50%,#eee 100%); background-repeat: repeat-x } .select2-container--classic .select2-selection--single:focus { border: 1px solid #0073aa } .select2-container--classic .select2-selection--single .select2-selection__rendered { color: #444; line-height: 28px } .select2-container--classic .select2-selection--single .select2-selection__clear { cursor: pointer; float: right; font-weight: 700; margin-right: 10px } .select2-container--classic .select2-selection--single .select2-selection__placeholder { color: #999 } .select2-container--classic .select2-selection--single .select2-selection__arrow { background-color: #ddd; border: none; border-left: 1px solid #aaa; border-top-right-radius: 4px; border-bottom-right-radius: 4px; height: 26px; position: absolute; top: 1px; right: 1px; width: 20px; background-image: -webkit-gradient(linear,left top,left bottom,color-stop(50%,#eee),to(#ccc)); background-image: -webkit-linear-gradient(top,#eee 50%,#ccc 100%); background-image: linear-gradient(to bottom,#eee 50%,#ccc 100%); background-repeat: repeat-x } .select2-container--classic .select2-selection--single .select2-selection__arrow b { border-color: #888 transparent transparent transparent; border-style: solid; border-width: 5px 4px 0 4px; height: 0; left: 50%; margin-left: -4px; margin-top: -2px; position: absolute; top: 50%; width: 0 } .select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__clear { float: left } .select2-container--classic[dir=rtl] .select2-selection--single .select2-selection__arrow { border: none; border-right: 1px solid #aaa; border-radius: 0; border-top-left-radius: 4px; border-bottom-left-radius: 4px; left: 1px; right: auto } .select2-container--classic.select2-container--open .select2-selection--single { border: 1px solid #0073aa } .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow { background: 0 0; border: none } .select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b { border-color: transparent transparent #888 transparent; border-width: 0 4px 5px 4px } .select2-container--classic.select2-container--open.select2-container--above .select2-selection--single { border-top: none; border-top-left-radius: 0; border-top-right-radius: 0; background-image: -webkit-gradient(linear,left top,left bottom,from(white),color-stop(50%,#eee)); background-image: -webkit-linear-gradient(top,#fff 0,#eee 50%); background-image: linear-gradient(to bottom,#fff 0,#eee 50%); background-repeat: repeat-x } .select2-container--classic.select2-container--open.select2-container--below .select2-selection--single { border-bottom: none; border-bottom-left-radius: 0; border-bottom-right-radius: 0; background-image: -webkit-gradient(linear,left top,left bottom,color-stop(50%,#eee),to(white)); background-image: -webkit-linear-gradient(top,#eee 50%,#fff 100%); background-image: linear-gradient(to bottom,#eee 50%,#fff 100%); background-repeat: repeat-x } .select2-container--classic .select2-selection--multiple { background-color: #fff; border: 1px solid #aaa; border-radius: 4px; cursor: text; outline: 0 } .select2-container--classic .select2-selection--multiple:focus { border: 1px solid #0073aa } .select2-container--classic .select2-selection--multiple .select2-selection__rendered { list-style: none; margin: 0; padding: 0 5px } .select2-container--classic .select2-selection--multiple .select2-selection__clear { display: none } .select2-container--classic .select2-selection--multiple .select2-selection__choice { background-color: #e4e4e4; border: 1px solid #aaa; border-radius: 4px; cursor: default; float: left; margin-right: 5px; margin-top: 5px; padding: 0 5px } .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove { color: #888; cursor: pointer; display: inline-block; font-weight: 700; margin-right: 2px } .select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover { color: #555 } .select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice { float: right } .select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice { margin-left: 5px; margin-right: auto } .select2-container--classic[dir=rtl] .select2-selection--multiple .select2-selection__choice__remove { margin-left: 2px; margin-right: auto } .select2-container--classic.select2-container--open .select2-selection--multiple { border: 1px solid #0073aa } .select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple { border-top: none; border-top-left-radius: 0; border-top-right-radius: 0 } .select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple { border-bottom: none; border-bottom-left-radius: 0; border-bottom-right-radius: 0 } .select2-container--classic .select2-search--dropdown .select2-search__field { border: 1px solid #aaa; outline: 0 } .select2-container--classic .select2-search--inline .select2-search__field { outline: 0; box-shadow: none } .select2-container--classic .select2-dropdown { background-color: #fff; border: 1px solid transparent } .select2-container--classic .select2-dropdown--above { border-bottom: none } .select2-container--classic .select2-dropdown--below { border-top: none } .select2-container--classic .select2-results>.select2-results__options { max-height: 200px; overflow-y: auto } .select2-container--classic .select2-results__option[role=group] { padding: 0 } .select2-container--classic .select2-results__option[aria-disabled=true] { color: grey } .select2-container--classic .select2-results__option--highlighted[aria-selected],.select2-container--classic .select2-results__option--highlighted[data-selected] { background-color: #3875d7; color: #fff } .select2-container--classic .select2-results__group { cursor: default; display: block; padding: 6px } .select2-container--classic.select2-container--open .select2-dropdown { border-color: #0073aa } @charset "UTF-8";@-webkit-keyframes spin { 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg) } } @keyframes spin { 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg) } } @font-face { font-family: star; src: url(../fonts/star.eot); src: url(../fonts/star.eot?#iefix) format("embedded-opentype"),url(../fonts/star.woff) format("woff"),url(../fonts/star.ttf) format("truetype"),url(../fonts/star.svg#star) format("svg"); font-weight: 400; font-style: normal } @font-face { font-family: WooCommerce; src: url(../fonts/WooCommerce.eot); src: url(../fonts/WooCommerce.eot?#iefix) format("embedded-opentype"),url(../fonts/WooCommerce.woff) format("woff"),url(../fonts/WooCommerce.ttf) format("truetype"),url(../fonts/WooCommerce.svg#WooCommerce) format("svg"); font-weight: 400; font-style: normal } .blockUI.blockOverlay::before { height: 1em; width: 1em; display: block; position: absolute; top: 50%; left: 50%; margin-left: -.5em; margin-top: -.5em; content: ''; -webkit-animation: spin 1s ease-in-out infinite; animation: spin 1s ease-in-out infinite; background: url(../images/icons/loader.svg) center center; background-size: cover; line-height: 1; text-align: center; font-size: 2em; color: rgba(0,0,0,.75) } .wc_addons_wrap { max-width: 1200px } .wc_addons_wrap h1.search-form-title { clear: left; padding: 0 } .wc_addons_wrap form.search-form { clear: both; display: block; position: relative; margin-top: 1em; margin-bottom: 1em } .wc_addons_wrap form.search-form input { border: 1px solid #ddd; box-shadow: none; height: 53px; padding-left: 50px; width: 100%; margin: 0 } .wc_addons_wrap form.search-form button { background: 0 0; border: none; cursor: pointer; height: 53px; position: absolute; width: 53px } .wc_addons_wrap .update-plugins .update-count { background-color: #d54e21; border-radius: 10px; color: #fff; display: inline-block; font-size: 9px; font-weight: 600; line-height: 17px; margin: 1px 0 0 2px; padding: 0 6px; vertical-align: text-top } .wc_addons_wrap .addons-featured { margin: 0 } .wc_addons_wrap ul.subsubsub.subsubsub { margin: -2px 0 12px } .wc_addons_wrap .subsubsub li::after { content: "|" } .wc_addons_wrap .subsubsub li:last-child::after { content: "" } .wc_addons_wrap .addons-banner-block-item-icon,.wc_addons_wrap .addons-column-block-item-icon { -webkit-box-align: center; -webkit-align-items: center; align-items: center; display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-pack: center; -webkit-justify-content: center; justify-content: center } .wc_addons_wrap .addons-banner-block,.wc_addons_wrap .addons-wcs-banner-block { background: #fff; border: 1px solid #ddd; margin: 0 0 1em 0; padding: 2em 2em 1em } .wc_addons_wrap .addons-banner-block img { height: 62px } .wc_addons_wrap .addons-banner-block p { margin: 0 0 20px } .wc_addons_wrap .addons-banner-block-items { display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -webkit-flex-direction: row; flex-direction: row; -webkit-flex-wrap: wrap; flex-wrap: wrap; -webkit-justify-content: space-around; justify-content: space-around; margin: 0 -10px 0 -10px } .wc_addons_wrap .addons-banner-block-item { border: 1px solid #e6e6e6; border-radius: 3px; -webkit-box-flex: 1; -webkit-flex: 1; flex: 1; margin: 1em; min-width: 200px; width: 30% } .wc_addons_wrap .addons-banner-block-item-icon { background: #f7f7f7; height: 143px } .wc_addons_wrap .addons-banner-block-item-content { display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -webkit-flex-direction: column; flex-direction: column; height: 184px; -webkit-box-pack: justify; -webkit-justify-content: space-between; justify-content: space-between; padding: 24px } .wc_addons_wrap .addons-banner-block-item-content h3 { margin-top: 0 } .wc_addons_wrap .addons-banner-block-item-content p { margin: 0 0 auto } .wc_addons_wrap .addons-wcs-banner-block { display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-align: center; -webkit-align-items: center; align-items: center } .wc_addons_wrap .addons-wcs-banner-block-image { background: #f7f7f7; border: 1px solid #e6e6e6; margin-right: 2em; padding: 4em } .wc_addons_wrap .addons-wcs-banner-block-image .addons-img { max-height: 86px; max-width: 97px } .wc_addons_wrap .addons-shipping-methods .addons-wcs-banner-block { margin-left: 0; margin-right: 0; margin-top: 1em } .wc_addons_wrap .addons-wcs-banner-block-content { display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-orient: vertical; -webkit-box-direction: normal; -webkit-flex-direction: column; flex-direction: column; -webkit-justify-content: space-around; justify-content: space-around; -webkit-align-self: stretch; align-self: stretch; padding: 1em 0 } .wc_addons_wrap .addons-wcs-banner-block-content h1 { padding-bottom: 0 } .wc_addons_wrap .addons-wcs-banner-block-content p { margin-bottom: 0 } .wc_addons_wrap .addons-wcs-banner-block-content .wcs-service-logo { max-width: 40px } .wc_addons_wrap .addons-column-section { display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -webkit-flex-direction: row; flex-direction: row; -webkit-flex-wrap: wrap; flex-wrap: wrap; -webkit-justify-content: space-around; justify-content: space-around } .wc_addons_wrap .addons-column { -webkit-box-flex: 1; -webkit-flex: 1; flex: 1; width: 50%; padding: 0 .5em } .wc_addons_wrap .addons-column:nth-child(2) { margin-right: 0 } .wc_addons_wrap .addons-column-block,.wc_addons_wrap .addons-small-dark-block,.wc_addons_wrap .addons-small-light-block { box-sizing: border-box; border: 1px solid #ddd; margin: 0 0 1em; padding: 20px } .wc_addons_wrap .addons-column-block img { max-height: 50px; max-width: 50px } .wc_addons_wrap .addons-column-block,.wc_addons_wrap .addons-small-light-block { background: #fff } .wc_addons_wrap .addons-column-block-left { float: left } .wc_addons_wrap .addons-column-block-right { float: right } .wc_addons_wrap .addons-column-block-item { border-top: 2px solid #f9f9f9; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -webkit-flex-direction: row; flex-direction: row; -webkit-flex-wrap: wrap; flex-wrap: wrap; -webkit-box-pack: justify; -webkit-justify-content: space-between; justify-content: space-between; margin: 0 -20px; padding: 20px } .wc_addons_wrap .addons-column-block-item-icon { background: #f7f7f7; border: 1px solid #e6e6e6; height: 100px; margin: 0 10px 10px 0; width: 100px } .wc_addons_wrap .addons-column-block-item-content { display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-flex: 1; -webkit-flex: 1; flex: 1; -webkit-flex-wrap: wrap; flex-wrap: wrap; height: 20%; -webkit-box-pack: justify; -webkit-justify-content: space-between; justify-content: space-between; min-width: 200px } .wc_addons_wrap .addons-column-block-item-content h2 { float: left; margin-top: 8px } .wc_addons_wrap .addons-column-block-item-content a { float: right } .wc_addons_wrap .addons-column-block-item-content p { float: left } .wc_addons_wrap .addons-banner-block-item,.wc_addons_wrap .addons-column-block-item { display: none } .wc_addons_wrap .addons-banner-block-item:nth-child(-n+3) { display: block } .wc_addons_wrap .addons-column-block-item:nth-of-type(-n+3) { display: -webkit-box; display: -webkit-flex; display: flex } .wc_addons_wrap .addons-small-dark-block { background-color: #54687d; text-align: center } .wc_addons_wrap .addons-small-dark-items { display: -webkit-box; display: -webkit-flex; display: flex; -webkit-flex-wrap: wrap; flex-wrap: wrap; -webkit-justify-content: space-around; justify-content: space-around } .wc_addons_wrap .addons-small-dark-item { margin: 0 0 20px } .wc_addons_wrap .addons-small-dark-block h1 { color: #fff } .wc_addons_wrap .addons-small-dark-block p { color: #fafafa } .wc_addons_wrap .addons-small-dark-item-icon img { height: 30px } .wc_addons_wrap .addons-small-dark-item a { margin: 28px auto 0 } .wc_addons_wrap .addons-small-light-block { display: -webkit-box; display: -webkit-flex; display: flex; -webkit-flex-wrap: wrap; flex-wrap: wrap } .wc_addons_wrap .addons-small-light-block h1 { margin-top: -12px } .wc_addons_wrap .addons-small-light-block p { margin-top: 0 } .wc_addons_wrap .addons-small-light-block img { height: 225px; margin: 0 0 0 -20px } .wc_addons_wrap .addons-small-light-block-content { display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-flex: 1; -webkit-flex: 1 1 100px; flex: 1 1 100px; -webkit-box-orient: vertical; -webkit-box-direction: normal; -webkit-flex-direction: column; flex-direction: column; -webkit-justify-content: space-around; justify-content: space-around } .wc_addons_wrap .addons-small-light-block-buttons { display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-pack: justify; -webkit-justify-content: space-between; justify-content: space-between } .wc_addons_wrap .addons-small-light-block-content a { width: 48% } .wc_addons_wrap .addons-button { border-radius: 3px; cursor: pointer; display: block; height: 37px; line-height: 37px; text-align: center; text-decoration: none; width: 124px } .wc_addons_wrap .addons-button-solid { background-color: #955a89; color: #fff } .wc_addons_wrap .addons-button-solid:hover { color: #fff; opacity: .8 } .wc_addons_wrap .addons-button-outline-green { border: 1px solid #73ae39; color: #73ae39 } .wc_addons_wrap .addons-button-outline-green:hover { color: #73ae39; opacity: .8 } .wc_addons_wrap .addons-button-outline-white { border: 1px solid #fff; color: #fff } .wc_addons_wrap .addons-button-outline-white:hover { color: #fff; opacity: .8 } .wc_addons_wrap .addons-button-installed { background: #e6e6e6; color: #3c3c3c } .wc_addons_wrap .addons-button-installed:hover { color: #3c3c3c; opacity: .8 } @media only screen and (max-width: 400px) { .wc_addons_wrap .addons-featured { margin:-1% -5% } .wc_addons_wrap .addons-button { width: 100% } .wc_addons_wrap .addons-small-dark-item { width: 100% } .wc_addons_wrap .addons-column-block-item-icon { background: 0 0; border: none; height: 75px; margin: 0 10px 10px 0; width: 75px } } .wc_addons_wrap .products { overflow: hidden; display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -webkit-flex-flow: row; flex-flow: row; -webkit-flex-wrap: wrap; flex-wrap: wrap; margin: 0 -.5em } .wc_addons_wrap .products li { float: left; border: 1px solid #ddd; margin: 0 .5em 1em!important; padding: 0; vertical-align: top; width: 25%; min-width: 280px; min-height: 220px; -webkit-box-flex: 1; -webkit-flex: 1; flex: 1; overflow: hidden; background: #f5f5f5; box-shadow: inset 0 1px 0 rgba(255,255,255,.2),inset 0 -1px 0 rgba(0,0,0,.1) } .wc_addons_wrap .products li a { text-decoration: none; color: inherit; display: block; height: 100% } .wc_addons_wrap .products li a .product-img-wrap { background: #fff; display: block } .wc_addons_wrap .products li a img { max-width: 258px; max-height: 24px; padding: 17px 20px; display: block; margin: 0; background: #fff; border-right: 260px solid #fff } .wc_addons_wrap .products li a img.extension-thumb+h3 { display: none } .wc_addons_wrap .products li a .price { display: none } .wc_addons_wrap .products li a h2,.wc_addons_wrap .products li a h3 { margin: 0!important; padding: 20px!important; background: #fff } .wc_addons_wrap .products li a p { padding: 20px!important; margin: 0!important; border-top: 1px solid #f1f1f1 } .wc_addons_wrap .products li a:focus,.wc_addons_wrap .products li a:hover { background-color: #fff } .wc_addons_wrap .storefront { background: url(../images/storefront-bg.jpg) bottom right #f6f6f6; border: 1px solid #ddd; margin-top: 1em; padding: 20px; overflow: hidden; zoom:1} .wc_addons_wrap .storefront img { width: 278px; height: auto; float: left; margin: 0 20px 0 0; box-shadow: 0 1px 6px rgba(0,0,0,.1) } .wc_addons_wrap .storefront p { max-width: 750px } .woocommerce-BlankState a.button-primary,.woocommerce-BlankState button.button-primary,.woocommerce-message a.button-primary,.woocommerce-message button.button-primary { background: #bb77ae; border-color: #a36597; box-shadow: inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597; color: #fff; text-shadow: 0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597; display: inline-block } .woocommerce-BlankState a.button-primary:active,.woocommerce-BlankState a.button-primary:focus,.woocommerce-BlankState a.button-primary:hover,.woocommerce-BlankState button.button-primary:active,.woocommerce-BlankState button.button-primary:focus,.woocommerce-BlankState button.button-primary:hover,.woocommerce-message a.button-primary:active,.woocommerce-message a.button-primary:focus,.woocommerce-message a.button-primary:hover,.woocommerce-message button.button-primary:active,.woocommerce-message button.button-primary:focus,.woocommerce-message button.button-primary:hover { background: #a36597; border-color: #a36597; box-shadow: inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597 } .woocommerce-message { position: relative; border-left-color: #cc99c2!important; overflow: hidden } .woocommerce-message a.docs,.woocommerce-message a.skip { text-decoration: none!important } .woocommerce-message a.woocommerce-message-close { position: static; float: right; padding: 0 15px 10px 28px; margin-top: -10px; font-size: 13px; line-height: 1.23076923; text-decoration: none } .woocommerce-message a.woocommerce-message-close::before { position: relative; top: 18px; left: -20px; -webkit-transition: all .1s ease-in-out; transition: all .1s ease-in-out } .woocommerce-message .twitter-share-button { margin-top: -3px; margin-left: 3px; vertical-align: middle } #variable_product_options #message,#variable_product_options .notice { margin: 10px } .clear { clear: both } .wrap.woocommerce div.error,.wrap.woocommerce div.updated { margin-top: 10px } mark.amount { background: transparent none; color: inherit } .woocommerce-help-tip { color: #666; display: inline-block; font-size: 1.1em; font-style: normal; height: 16px; line-height: 16px; position: relative; vertical-align: middle; width: 16px } .woocommerce-help-tip::after { font-family: Dashicons; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; -webkit-font-smoothing: antialiased; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: ""; cursor: help } h2 .woocommerce-help-tip { margin-top: -5px; margin-left: .25em } table.wc_status_table { margin-bottom: 1em } table.wc_status_table h2 { font-size: 14px; margin: 0 } table.wc_status_table tr:nth-child(2n) td,table.wc_status_table tr:nth-child(2n) th { background: #fcfcfc } table.wc_status_table th { font-weight: 700; padding: 9px } table.wc_status_table td:first-child { width: 33% } table.wc_status_table td.help { width: 1em } table.wc_status_table td,table.wc_status_table th { font-size: 1.1em; font-weight: 400 } table.wc_status_table td.run-tool,table.wc_status_table th.run-tool { text-align: right } table.wc_status_table td strong.name,table.wc_status_table th strong.name { display: block; margin-bottom: .5em } table.wc_status_table td mark,table.wc_status_table th mark { background: transparent none } table.wc_status_table td mark.yes,table.wc_status_table th mark.yes { color: #7ad03a } table.wc_status_table td mark.no,table.wc_status_table th mark.no { color: #999 } table.wc_status_table td .red,table.wc_status_table td mark.error,table.wc_status_table th .red,table.wc_status_table th mark.error { color: #a00 } table.wc_status_table td ul,table.wc_status_table th ul { margin: 0 } table.wc_status_table .help_tip { cursor: help } table.wc_status_table--tools td,table.wc_status_table--tools th { padding: 2em } .taxonomy-product_cat .check-column .woocommerce-help-tip { font-size: 1.5em; margin: -3px 0 0 5px; display: block; position: absolute } #debug-report { display: none; margin: 10px 0; padding: 0; position: relative } #debug-report textarea { font-family: monospace; width: 100%; margin: 0; height: 300px; padding: 20px; border-radius: 0; resize: none; font-size: 12px; line-height: 20px; outline: 0 } .wp-list-table.logs .log-level { display: inline; padding: .2em .6em .3em; font-size: 80%; font-weight: 700; line-height: 1; color: #fff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: .2em } .wp-list-table.logs .log-level:empty { display: none } .wp-list-table.logs .log-level--alert,.wp-list-table.logs .log-level--emergency { background-color: #ff4136 } .wp-list-table.logs .log-level--critical,.wp-list-table.logs .log-level--error { background-color: #ff851b } .wp-list-table.logs .log-level--notice,.wp-list-table.logs .log-level--warning { color: #222; background-color: #ffdc00 } .wp-list-table.logs .log-level--info { background-color: #0074d9 } .wp-list-table.logs .log-level--debug { background-color: #3d9970 } @media screen and (min-width: 783px) { .wp-list-table.logs .column-timestamp { width:18% } .wp-list-table.logs .column-level { width: 14% } .wp-list-table.logs .column-source { width: 15% } } #log-viewer-select { padding: 10px 0 8px; line-height: 28px } #log-viewer-select h2 a { vertical-align: middle } #log-viewer { background: #fff; border: 1px solid #e5e5e5; box-shadow: 0 1px 1px rgba(0,0,0,.04); padding: 5px 20px } #log-viewer pre { font-family: monospace; white-space: pre-wrap; word-wrap: break-word } .inline-edit-product.quick-edit-row .inline-edit-col-center,.inline-edit-product.quick-edit-row .inline-edit-col-right { float: right!important } #woocommerce-fields.inline-edit-col { clear: left } #woocommerce-fields.inline-edit-col label.featured,#woocommerce-fields.inline-edit-col label.manage_stock { margin-left: 10px } #woocommerce-fields.inline-edit-col label.stock_status_field { clear: both; float: left } #woocommerce-fields.inline-edit-col .dimensions div { display: block; margin: .2em 0 } #woocommerce-fields.inline-edit-col .dimensions div span.title { display: block; float: left; width: 5em } #woocommerce-fields.inline-edit-col .dimensions div span.input-text-wrap { display: block; margin-left: 5em } #woocommerce-fields.inline-edit-col .text { box-sizing: border-box; width: 99%; float: left; margin: 1px 1% 1px 1px } #woocommerce-fields.inline-edit-col .height,#woocommerce-fields.inline-edit-col .length,#woocommerce-fields.inline-edit-col .width { width: 32.33% } #woocommerce-fields.inline-edit-col .height { margin-right: 0 } #woocommerce-fields-bulk.inline-edit-col label { clear: left } #woocommerce-fields-bulk.inline-edit-col .inline-edit-group label { clear: none; width: 49%; margin: .2em 0 } #woocommerce-fields-bulk.inline-edit-col .inline-edit-group.dimensions label { width: 75%; max-width: 75% } #woocommerce-fields-bulk.inline-edit-col .length,#woocommerce-fields-bulk.inline-edit-col .regular_price,#woocommerce-fields-bulk.inline-edit-col .sale_price,#woocommerce-fields-bulk.inline-edit-col .stock,#woocommerce-fields-bulk.inline-edit-col .weight { box-sizing: border-box; width: 100%; margin-left: 4.4em } #woocommerce-fields-bulk.inline-edit-col .height,#woocommerce-fields-bulk.inline-edit-col .length,#woocommerce-fields-bulk.inline-edit-col .width { box-sizing: border-box; width: 25% } .column-coupon_code { line-height: 2.25em } .column-coupon_code,ul.wc_coupon_list { margin: 0; overflow: hidden; zoom:1;clear: both } ul.wc_coupon_list { padding-bottom: 5px } ul.wc_coupon_list li { margin: 0 } ul.wc_coupon_list li.code { display: inline-block; position: relative; padding: 0 .5em; background-color: #fff; border: 1px solid #aaa; box-shadow: 0 1px 0 #dfdfdf; border-radius: 4px; margin-right: 5px; margin-top: 5px } ul.wc_coupon_list li.code.editable { padding-right: 2em } ul.wc_coupon_list li.code .tips { cursor: pointer } ul.wc_coupon_list li.code .tips span { color: #888 } ul.wc_coupon_list li.code .tips span:hover { color: #000 } ul.wc_coupon_list li.code .remove-coupon { text-decoration: none; color: #888; position: absolute; top: 7px; right: 20px } ul.wc_coupon_list li.code .remove-coupon::before { font-family: Dashicons; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; -webkit-font-smoothing: antialiased; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: "ï…˜" } ul.wc_coupon_list li.code .remove-coupon:hover::before { color: #a00 } ul.wc_coupon_list_block { margin: 0; padding-bottom: 2px } ul.wc_coupon_list_block li { border-top: 1px solid #fff; border-bottom: 1px solid #ccc; line-height: 2.5em; margin: 0; padding: .5em 0 } ul.wc_coupon_list_block li:first-child { border-top: 0; padding-top: 0 } ul.wc_coupon_list_block li:last-child { border-bottom: 0; padding-bottom: 0 } .button.wc-reload { display: block; text-indent: -9999px; position: relative; height: 1em; width: 1em; padding: 0; height: 28px; width: 28px!important; display: inline-block } .button.wc-reload::after { font-family: Dashicons; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; -webkit-font-smoothing: antialiased; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: "ï…"; line-height: 28px } #woocommerce-order-data .handlediv,#woocommerce-order-data .hndle { display: none } #woocommerce-order-data .inside { display: block!important } #order_data { padding: 23px 24px 12px } #order_data h2 { margin: 0; font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",sans-serif; font-size: 21px; font-weight: 400; line-height: 1.2; text-shadow: 1px 1px 1px #fff; padding: 0 } #order_data h3 { font-size: 14px } #order_data h3,#order_data h4 { color: #333; margin: 1.33em 0 0 } #order_data p { color: #777 } #order_data p.order_number { margin: 0; font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",sans-serif; font-weight: 400; line-height: 1.6em; font-size: 16px } #order_data .order_data_column_container { clear: both } #order_data .order_data_column { width: 32%; padding: 0 2% 0 0; float: left } #order_data .order_data_column>h3 span { display: block } #order_data .order_data_column:last-child { padding-right: 0 } #order_data .order_data_column p { padding: 0!important } #order_data .order_data_column .address strong { display: block } #order_data .order_data_column .form-field { float: left; clear: left; width: 48%; padding: 0; margin: 9px 0 0 } #order_data .order_data_column .form-field label { display: block; padding: 0 0 3px } #order_data .order_data_column .form-field input,#order_data .order_data_column .form-field textarea { width: 100% } #order_data .order_data_column .form-field select { width: 100% } #order_data .order_data_column .form-field .select2-container { width: 100%!important } #order_data .order_data_column .form-field .date-picker { width: 50% } #order_data .order_data_column .form-field .hour,#order_data .order_data_column .form-field .minute { width: 3.5em } #order_data .order_data_column .form-field small { display: block; margin: 5px 0 0; color: #999 } #order_data .order_data_column ._billing_address_2_field,#order_data .order_data_column ._billing_last_name_field,#order_data .order_data_column ._billing_phone_field,#order_data .order_data_column ._billing_postcode_field,#order_data .order_data_column ._billing_state_field,#order_data .order_data_column ._shipping_address_2_field,#order_data .order_data_column ._shipping_last_name_field,#order_data .order_data_column ._shipping_postcode_field,#order_data .order_data_column ._shipping_state_field,#order_data .order_data_column .form-field.last { float: right; clear: right } #order_data .order_data_column ._billing_company_field,#order_data .order_data_column ._shipping_company_field,#order_data .order_data_column ._transaction_id_field,#order_data .order_data_column .form-field-wide { width: 100%; clear: both } #order_data .order_data_column ._billing_company_field .wc-category-search,#order_data .order_data_column ._billing_company_field .wc-customer-search,#order_data .order_data_column ._billing_company_field .wc-enhanced-select,#order_data .order_data_column ._billing_company_field input,#order_data .order_data_column ._billing_company_field select,#order_data .order_data_column ._billing_company_field textarea,#order_data .order_data_column ._shipping_company_field .wc-category-search,#order_data .order_data_column ._shipping_company_field .wc-customer-search,#order_data .order_data_column ._shipping_company_field .wc-enhanced-select,#order_data .order_data_column ._shipping_company_field input,#order_data .order_data_column ._shipping_company_field select,#order_data .order_data_column ._shipping_company_field textarea,#order_data .order_data_column ._transaction_id_field .wc-category-search,#order_data .order_data_column ._transaction_id_field .wc-customer-search,#order_data .order_data_column ._transaction_id_field .wc-enhanced-select,#order_data .order_data_column ._transaction_id_field input,#order_data .order_data_column ._transaction_id_field select,#order_data .order_data_column ._transaction_id_field textarea,#order_data .order_data_column .form-field-wide .wc-category-search,#order_data .order_data_column .form-field-wide .wc-customer-search,#order_data .order_data_column .form-field-wide .wc-enhanced-select,#order_data .order_data_column .form-field-wide input,#order_data .order_data_column .form-field-wide select,#order_data .order_data_column .form-field-wide textarea { width: 100% } #order_data .order_data_column p.none_set { color: #999 } #order_data .order_data_column div.edit_address { display: none; zoom:1;padding-right: 1px } #order_data .order_data_column .wc-customer-user label a,#order_data .order_data_column .wc-order-status label a { float: right; margin-left: 8px } #order_data .order_data_column a.edit_address { width: 14px; height: 0; padding: 14px 0 0; margin: 0 0 0 6px; overflow: hidden; position: relative; color: #999; border: 0; float: right } #order_data .order_data_column a.edit_address:focus,#order_data .order_data_column a.edit_address:hover { color: #000 } #order_data .order_data_column a.edit_address::after { font-family: WooCommerce; position: absolute; top: 0; left: 0; text-align: center; vertical-align: top; line-height: 14px; font-size: 14px; font-weight: 400 } #order_data .order_data_column a.edit_address::after { font-family: Dashicons; content: "\f464" } #order_data .order_data_column .billing-same-as-shipping,#order_data .order_data_column .load_customer_billing,#order_data .order_data_column .load_customer_shipping { font-size: 13px; display: inline-block; font-weight: 400 } #order_data .order_data_column .load_customer_shipping { margin-right: .3em } .order_actions { margin: 0; overflow: hidden; zoom:1} .order_actions li { border-top: 1px solid #fff; border-bottom: 1px solid #ddd; padding: 6px 0; margin: 0; line-height: 1.6em; float: left; width: 50%; text-align: center } .order_actions li a { float: none; text-align: center; text-decoration: underline } .order_actions li.wide { width: auto; float: none; clear: both; padding: 6px; text-align: left; overflow: hidden } .order_actions li #delete-action { line-height: 25px; vertical-align: middle; text-align: left; float: left } .order_actions li .save_order { float: right } .order_actions li#actions { overflow: hidden } .order_actions li#actions .button { width: 24px; box-sizing: border-box; float: right } .order_actions li#actions select { width: 225px; box-sizing: border-box; float: left } #woocommerce-order-items .inside { margin: 0; padding: 0; background: #fefefe } #woocommerce-order-items .wc-order-data-row { border-bottom: 1px solid #dfdfdf; padding: 1.5em 2em; background: #f8f8f8; line-height: 2em; text-align: right } #woocommerce-order-items .wc-order-data-row::after,#woocommerce-order-items .wc-order-data-row::before { content: ' '; display: table } #woocommerce-order-items .wc-order-data-row::after { clear: both } #woocommerce-order-items .wc-order-data-row p { margin: 0; line-height: 2em } #woocommerce-order-items .wc-order-data-row .wc-used-coupons { text-align: left } #woocommerce-order-items .wc-order-data-row .wc-used-coupons .tips { display: inline-block } #woocommerce-order-items .wc-used-coupons { float: left; width: 50% } #woocommerce-order-items .wc-order-totals { float: right; width: 50%; margin: 0; padding: 0; text-align: right } #woocommerce-order-items .wc-order-totals .amount { font-weight: 700 } #woocommerce-order-items .wc-order-totals .label { vertical-align: top } #woocommerce-order-items .wc-order-totals .total { font-size: 1em!important; width: 10em; margin: 0 0 0 .5em; box-sizing: border-box } #woocommerce-order-items .wc-order-totals .total input[type=text] { width: 96%; float: right } #woocommerce-order-items .wc-order-totals .refunded-total { color: #a00 } #woocommerce-order-items .refund-actions { margin-top: 5px; padding-top: 12px; border-top: 1px solid #dfdfdf } #woocommerce-order-items .refund-actions .button { float: right; margin-left: 4px } #woocommerce-order-items .refund-actions .cancel-action { float: left; margin-left: 0 } #woocommerce-order-items .add_meta { margin-left: 0!important } #woocommerce-order-items h3 small { color: #999 } #woocommerce-order-items .amount { white-space: nowrap } #woocommerce-order-items .add-items .description { margin-right: 10px } #woocommerce-order-items .add-items .button { float: left; margin-right: .25em } #woocommerce-order-items .add-items .button-primary { float: none; margin-right: 0 } #woocommerce-order-items .inside { display: block!important } #woocommerce-order-items .handlediv,#woocommerce-order-items .hndle { display: none } #woocommerce-order-items .woocommerce_order_items_wrapper { margin: 0; overflow-x: auto } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items { width: 100%; background: #fff } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th { text-align: left; padding: 1em; font-weight: 400; color: #999; background: #f8f8f8; -webkit-touch-callout: none; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th.sortable { cursor: pointer } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th:last-child { padding-right: 2em } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th:first-child { padding-left: 2em } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items thead th .wc-arrow { float: right; position: relative; margin-right: -1em } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td { padding: 1.5em 1em 1em; text-align: left; line-height: 1.5em; vertical-align: top; border-bottom: 1px solid #f8f8f8 } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td textarea { width: 100% } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td select { width: 50% } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td textarea { font-size: 14px; padding: 4px; color: #555 } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th:last-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td:last-child { padding-right: 2em } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody th:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td:first-child { padding-left: 2em } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr:last-child td { border-bottom: 1px solid #dfdfdf } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody tr:first-child td { border-top: 8px solid #f8f8f8 } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tbody#order_line_items tr:first-child td { border-top: none } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb { text-align: left; width: 38px; padding-bottom: 1.5em } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail { width: 38px; height: 38px; border: 2px solid #e8e8e8; background: #f8f8f8; color: #ccc; position: relative; font-size: 21px; display: block; text-align: center } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail::before { font-family: Dashicons; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; -webkit-font-smoothing: antialiased; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: ""; width: 38px; line-height: 38px; display: block } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.thumb .wc-order-item-thumbnail img { width: 100%; height: 100%; margin: 0; padding: 0; position: relative } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.name .wc-order-item-sku,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.name .wc-order-item-variation { display: block; margin-top: .5em; font-size: .92em!important; color: #888 } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item { min-width: 200px } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .center,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .variation-id { text-align: center } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class { text-align: right } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class label { white-space: nowrap; color: #999; font-size: .833em } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax label input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class label input { display: inline } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class input { width: 70px; vertical-align: middle; text-align: right } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax select,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class select { width: 85px; height: 26px; vertical-align: middle; font-size: 1em } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input { display: inline-block; background: #fff; border: 1px solid #ddd; box-shadow: inset 0 1px 2px rgba(0,0,0,.07); margin: 1px 0; min-width: 80px; overflow: hidden; line-height: 1em; text-align: right } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input { width: 100%; box-sizing: border-box } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input label { font-size: .75em; padding: 4px 6px 0; color: #555; display: block } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input input { width: 100%; box-sizing: border-box; border: 0; box-shadow: none; margin: 0; padding: 0 6px 4px; color: #555; background: 0 0 } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input input::-webkit-input-placeholder,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input input::-webkit-input-placeholder { color: #ddd } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child { border-bottom: 1px dashed #ddd; background: #fff } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child label { color: #ccc } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .split-input div.input:first-child input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .split-input div.input:first-child input { color: #ccc } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .view,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .view { white-space: nowrap } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .edit,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .edit { text-align: left } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class del,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class small.times { font-size: .92em!important; color: #888 } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes { margin: 0 } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-taxes label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-refund-fields label,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-taxes label { display: block } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax .wc-order-item-discount,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class .wc-order-item-discount { display: block; margin-top: .5em } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .item_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_cost small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .line_tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax small.times,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .tax_class small.times { margin-right: .25em } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity { text-align: center } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .quantity input { text-align: center; width: 50px } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items span.subtotal { opacity: .5 } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.tax_class,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.tax_class { text-align: left } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .calculated { border-color: #ae8ca2; border-style: dotted } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta { width: 100% } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta { margin: .5em 0 0; font-size: .92em!important; color: #888 } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr th,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr th { border: 0; padding: 0 4px .5em 0; line-height: 1.5em; width: 20% } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td { padding: 0 4px .5em 0; border: 0; line-height: 1.5em } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td input,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td input { width: 100%; margin: 0; position: relative; border-bottom: 0; box-shadow: none } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td textarea { width: 100%; height: 4em; margin: 0; box-shadow: none } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td input:focus+textarea,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td input:focus+textarea { border-top-color: #999 } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td p,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td p { margin: 0 0 .5em; line-height: 1.5em } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.display_meta tr td p:last-child,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items table.meta tr td p:last-child { margin: 0 } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items .refund_by { border-bottom: 1px dotted #999 } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.fee .thumb div { display: block; text-indent: -9999px; position: relative; height: 1em; width: 1em; font-size: 1.5em; line-height: 1em; vertical-align: middle; margin: 0 auto } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.fee .thumb div::before { font-family: WooCommerce; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: ""; color: #ccc } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.refund .thumb div { display: block; text-indent: -9999px; position: relative; height: 1em; width: 1em; font-size: 1.5em; line-height: 1em; vertical-align: middle; margin: 0 auto } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.refund .thumb div::before { font-family: WooCommerce; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: ""; color: #ccc } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .thumb div { display: block; text-indent: -9999px; position: relative; height: 1em; width: 1em; font-size: 1.5em; line-height: 1em; vertical-align: middle; margin: 0 auto } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .thumb div::before { font-family: WooCommerce; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: ""; color: #ccc } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .shipping_method,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items tr.shipping .shipping_method_name { width: 100%; margin: 0 0 .5em } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax { white-space: nowrap } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax { display: block; text-indent: -9999px; position: relative; height: 1em; width: 1em; float: right; font-size: 14px; visibility: hidden; margin: 3px -18px 0 0 } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax::before,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax::before { font-family: Dashicons; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; -webkit-font-smoothing: antialiased; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: "ï…“"; color: #999 } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax .delete-order-tax:hover::before,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax .delete-order-tax:hover::before { color: #a00 } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items td.line_tax:hover .delete-order-tax,#woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items th.line_tax:hover .delete-order-tax { visibility: visible } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items small.refunded { display: block; color: #a00; white-space: nowrap; margin-top: .5em } #woocommerce-order-items .woocommerce_order_items_wrapper table.woocommerce_order_items small.refunded::before { font-family: Dashicons; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; -webkit-font-smoothing: antialiased; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: "ï…±"; position: relative; top: auto; left: auto; margin: -1px 4px 0 0; vertical-align: middle; line-height: 1em } #woocommerce-order-items .wc-order-edit-line-item { padding-left: 0 } #woocommerce-order-items .wc-order-edit-line-item-actions { width: 44px; text-align: right; padding-left: 0; vertical-align: middle } #woocommerce-order-items .wc-order-edit-line-item-actions a { color: #ccc; display: inline-block; cursor: pointer; padding: 0 0 .5em; margin: 0 0 0 12px; vertical-align: middle; text-decoration: none; line-height: 16px; width: 16px; overflow: hidden } #woocommerce-order-items .wc-order-edit-line-item-actions a::before { margin: 0; padding: 0; font-size: 16px; width: 16px; height: 16px } #woocommerce-order-items .wc-order-edit-line-item-actions a:hover::before { color: #999 } #woocommerce-order-items .wc-order-edit-line-item-actions a:first-child { margin-left: 0 } #woocommerce-order-items .wc-order-edit-line-item-actions .edit-order-item::before { font-family: Dashicons; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; -webkit-font-smoothing: antialiased; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: ""; position: relative } #woocommerce-order-items .wc-order-edit-line-item-actions .delete-order-item::before,#woocommerce-order-items .wc-order-edit-line-item-actions .delete_refund::before { font-family: Dashicons; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; -webkit-font-smoothing: antialiased; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: "ï…˜"; position: relative } #woocommerce-order-items .wc-order-edit-line-item-actions .delete-order-item:hover::before,#woocommerce-order-items .wc-order-edit-line-item-actions .delete_refund:hover::before { color: #a00 } #woocommerce-order-items tbody tr .wc-order-edit-line-item-actions { visibility: hidden } #woocommerce-order-items tbody tr:hover .wc-order-edit-line-item-actions { visibility: visible } #woocommerce-order-items .wc-order-totals .wc-order-edit-line-item-actions { width: 1.5em; visibility: visible!important } #woocommerce-order-items .wc-order-totals .wc-order-edit-line-item-actions a { padding: 0 } #woocommerce-order-downloads .buttons { float: left; padding: 0; margin: 0; vertical-align: top } #woocommerce-order-downloads .buttons .add_item_id,#woocommerce-order-downloads .buttons .select2-container { width: 400px!important; margin-right: 9px; vertical-align: top; float: left } #woocommerce-order-downloads .buttons button { margin: 2px 0 0 } #woocommerce-order-downloads h3 small { color: #999 } #poststuff #woocommerce-order-actions .inside { margin: 0; padding: 0 } #poststuff #woocommerce-order-actions .inside ul.order_actions li { padding: 6px 10px; box-sizing: border-box } #poststuff #woocommerce-order-actions .inside ul.order_actions li:last-child { border-bottom: 0 } #poststuff #woocommerce-order-notes .inside { margin: 0; padding: 0 } #poststuff #woocommerce-order-notes .inside ul.order_notes li { padding: 0 10px } #woocommerce_customers p.search-box { margin: 6px 0 4px; float: left } #woocommerce_customers .tablenav { float: right; clear: none } .widefat.customers td { vertical-align: middle; padding: 4px 7px } .widefat .column-order_title { width: 15% } .widefat .column-order_title time { display: block; color: #999; margin: 3px 0 } .widefat .column-orders,.widefat .column-paying,.widefat .column-spent { text-align: center; width: 8% } .widefat .column-last_order { width: 11% } .widefat .column-wc_actions { width: 110px } .widefat .column-wc_actions a.button { display: block; text-indent: -9999px; position: relative; height: 1em; width: 1em; display: inline-block; margin: 2px 4px 2px 0; padding: 0!important; height: 2em!important; width: 2em; overflow: hidden; vertical-align: middle } .widefat .column-wc_actions a.button::after { font-family: Dashicons; speak: none; font-weight: 400; font-variant: normal; text-transform: none; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; line-height: 1.85 } .widefat .column-wc_actions a.button img { display: block; width: 12px; height: auto } .widefat .column-wc_actions a.edit::after { content: "\f464" } .widefat .column-wc_actions a.link::after { font-family: WooCommerce; content: "\e00d" } .widefat .column-wc_actions a.view::after { content: "\f177" } .widefat .column-wc_actions a.refresh::after { font-family: WooCommerce; content: "\e031" } .widefat .column-wc_actions a.processing::after { font-family: WooCommerce; content: "\e00f" } .widefat .column-wc_actions a.complete::after { content: "\f147" } .widefat small.meta { display: block; color: #999; font-size: inherit; margin: 3px 0 } .post-type-shop_order .tablenav .one-page .displaying-num { display: none } .post-type-shop_order .wp-list-table { margin-top: 1em } .post-type-shop_order .wp-list-table tfoot th,.post-type-shop_order .wp-list-table thead th { padding: .75em 1em } .post-type-shop_order .wp-list-table tfoot th.sortable a,.post-type-shop_order .wp-list-table tfoot th.sorted a,.post-type-shop_order .wp-list-table thead th.sortable a,.post-type-shop_order .wp-list-table thead th.sorted a { padding: 0 } .post-type-shop_order .wp-list-table tfoot th:first-child,.post-type-shop_order .wp-list-table thead th:first-child { padding-left: 2em } .post-type-shop_order .wp-list-table tfoot th:last-child,.post-type-shop_order .wp-list-table thead th:last-child { padding-right: 2em } .post-type-shop_order .wp-list-table tbody td,.post-type-shop_order .wp-list-table tbody th { padding: 1em; line-height: 26px } .post-type-shop_order .wp-list-table tbody td:first-child { padding-left: 2em } .post-type-shop_order .wp-list-table tbody td:last-child { padding-right: 2em } .post-type-shop_order .wp-list-table tbody tr { border-top: 1px solid #f5f5f5 } .post-type-shop_order .wp-list-table tbody tr:hover:not(.status-trash):not(.no-link) td { cursor: pointer } .post-type-shop_order .wp-list-table .no-link { cursor: default!important } .post-type-shop_order .wp-list-table td,.post-type-shop_order .wp-list-table th { width: 12ch; vertical-align: middle } .post-type-shop_order .wp-list-table td p,.post-type-shop_order .wp-list-table th p { margin: 0 } .post-type-shop_order .wp-list-table .check-column { width: 1px; white-space: nowrap; padding: 1em 1em 1em 1em!important; vertical-align: middle } .post-type-shop_order .wp-list-table .check-column input { vertical-align: text-top; margin: 1px 0 } .post-type-shop_order .wp-list-table .column-order_number { width: 20ch } .post-type-shop_order .wp-list-table .column-order_total { width: 8ch; text-align: right } .post-type-shop_order .wp-list-table .column-order_total a span { float: right } .post-type-shop_order .wp-list-table .column-order_date,.post-type-shop_order .wp-list-table .column-order_status { width: 10ch } .post-type-shop_order .wp-list-table .column-order_status { width: 14ch } .post-type-shop_order .wp-list-table .column-billing_address,.post-type-shop_order .wp-list-table .column-shipping_address { width: 20ch; line-height: 1.5em } .post-type-shop_order .wp-list-table .column-billing_address .description,.post-type-shop_order .wp-list-table .column-shipping_address .description { display: block; color: #999 } .post-type-shop_order .wp-list-table .column-wc_actions { text-align: right } .post-type-shop_order .wp-list-table .column-wc_actions a.button { text-indent: 9999px; margin: 2px 0 2px 4px } .post-type-shop_order .wp-list-table .order-preview { float: right; width: 16px; padding: 20px 4px 4px 4px; height: 0; overflow: hidden; position: relative; border: 2px solid transparent; border-radius: 4px } .post-type-shop_order .wp-list-table .order-preview::before { font-family: WooCommerce; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: "î€"; line-height: 16px; font-size: 14px; vertical-align: middle; top: 4px } .post-type-shop_order .wp-list-table .order-preview:hover { border: 2px solid #00a0d2 } .post-type-shop_order .wp-list-table .order-preview.disabled::before { content: ""; background: url(../images/wpspin.gif) no-repeat center top } .order-status { display: -webkit-inline-box; display: -webkit-inline-flex; display: inline-flex; line-height: 2.5em; color: #777; background: #e5e5e5; border-radius: 4px; border-bottom: 1px solid rgba(0,0,0,.05); margin: -.25em 0; cursor: inherit!important; white-space: nowrap; max-width: 100% } .order-status.status-completed { background: #c8d7e1; color: #2e4453 } .order-status.status-on-hold { background: #f8dda7; color: #94660c } .order-status.status-failed { background: #eba3a3; color: #761919 } .order-status.status-processing { background: #c6e1c6; color: #5b841b } .order-status.status-trash { background: #eba3a3; color: #761919 } .order-status>span { margin: 0 1em; overflow: hidden; text-overflow: ellipsis } .wc-order-preview .order-status { float: right; margin-right: 54px } .wc-order-preview article { padding: 0!important } .wc-order-preview .modal-close { border-radius: 0 } .wc-order-preview .wc-order-preview-table { width: 100%; margin: 0 } .wc-order-preview .wc-order-preview-table td,.wc-order-preview .wc-order-preview-table th { padding: 1em 1.5em; text-align: left; border: 0; border-bottom: 1px solid #eee; margin: 0; background: 0 0; box-shadow: none; text-align: right; vertical-align: top } .wc-order-preview .wc-order-preview-table td:first-child,.wc-order-preview .wc-order-preview-table th:first-child { text-align: left } .wc-order-preview .wc-order-preview-table th { border-color: #ccc } .wc-order-preview .wc-order-preview-table tr:last-child td { border: 0 } .wc-order-preview .wc-order-preview-table .wc-order-item-sku { margin-top: .5em } .wc-order-preview .wc-order-preview-table .wc-order-item-meta { margin-top: .5em } .wc-order-preview .wc-order-preview-table .wc-order-item-meta td,.wc-order-preview .wc-order-preview-table .wc-order-item-meta th { padding: 0; border: 0; text-align: left; vertical-align: top } .wc-order-preview .wc-order-preview-table .wc-order-item-meta td:last-child { padding-left: .5em } .wc-order-preview .wc-order-preview-addresses { overflow: hidden; padding-bottom: 1.5em } .wc-order-preview .wc-order-preview-addresses .wc-order-preview-address,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note { width: 50%; float: left; padding: 1.5em 1.5em 0; box-sizing: border-box; word-wrap: break-word } .wc-order-preview .wc-order-preview-addresses .wc-order-preview-address h2,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note h2 { margin-top: 0 } .wc-order-preview .wc-order-preview-addresses .wc-order-preview-address strong,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note strong { display: block; margin-top: 1.5em } .wc-order-preview .wc-order-preview-addresses .wc-order-preview-address strong:first-child,.wc-order-preview .wc-order-preview-addresses .wc-order-preview-note strong:first-child { margin-top: 0 } .wc-order-preview footer .wc-action-button-group { display: inline-block; float: left } .wc-order-preview footer .button.button-large { margin-left: 10px; padding: 0 10px!important; line-height: 28px; height: auto; display: inline-block } .wc-order-preview .wc-action-button-group label { display: none } .wc-action-button-group { vertical-align: middle; line-height: 26px; text-align: left } .wc-action-button-group label { margin-right: 6px; cursor: default; font-weight: 700; line-height: 28px } .wc-action-button-group .wc-action-button-group__items { display: -webkit-inline-box; display: -webkit-inline-flex; display: inline-flex; -webkit-box-orient: horizontal; -webkit-box-direction: normal; -webkit-flex-flow: row wrap; flex-flow: row wrap; -webkit-align-content: flex-start; align-content: flex-start; -webkit-box-pack: start; -webkit-justify-content: flex-start; justify-content: flex-start } .wc-action-button-group .wc-action-button { margin: 0 0 0 -1px!important; border: 1px solid #ccc; padding: 0 10px!important; border-radius: 0!important; float: none; line-height: 28px; height: auto; z-index: 1; position: relative; overflow: hidden; text-overflow: ellipsis; -webkit-box-flex: 1; -webkit-flex: 1 0 auto; flex: 1 0 auto; box-sizing: border-box; text-align: center; white-space: nowrap } .wc-action-button-group .wc-action-button:focus,.wc-action-button-group .wc-action-button:hover { border: 1px solid #999; z-index: 2 } .wc-action-button-group .wc-action-button:first-child { margin-left: 0!important; border-top-left-radius: 3px!important; border-bottom-left-radius: 3px!important } .wc-action-button-group .wc-action-button:last-child { border-top-right-radius: 3px!important; border-bottom-right-radius: 3px!important } @media screen and (max-width: 782px) { .wc-order-preview footer .wc-action-button-group .wc-action-button-group__items { display:-webkit-box; display: -webkit-flex; display: flex } .wc-order-preview footer .wc-action-button-group { float: none; display: block; margin-bottom: 4px } .wc-order-preview footer .button.button-large { width: 100%; float: none; text-align: center; margin: 0; display: block } .post-type-shop_order .wp-list-table td.check-column { width: 1em } .post-type-shop_order .wp-list-table td.column-order_number { padding-left: 0; padding-bottom: .5em } .post-type-shop_order .wp-list-table td.column-order_date,.post-type-shop_order .wp-list-table td.column-order_status { display: inline-block!important; padding: 0 1em 1em 1em!important } .post-type-shop_order .wp-list-table td.column-order_date::before,.post-type-shop_order .wp-list-table td.column-order_status::before { display: none!important } .post-type-shop_order .wp-list-table td.column-order_date { padding-left: 0!important } .post-type-shop_order .wp-list-table td.column-order_status { float: right } } .column-customer_message .note-on { display: block; text-indent: -9999px; position: relative; height: 1em; width: 1em; margin: 0 auto; color: #999 } .column-customer_message .note-on::after { font-family: WooCommerce; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: ""; line-height: 16px } .column-order_notes .note-on { display: block; text-indent: -9999px; position: relative; height: 1em; width: 1em; margin: 0 auto; color: #999 } .column-order_notes .note-on::after { font-family: WooCommerce; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: ""; line-height: 16px } .attributes-table td,.attributes-table th { width: 15%; vertical-align: top } .attributes-table .attribute-terms { width: 32% } .attributes-table .attribute-actions { width: 2em } .attributes-table .attribute-actions .configure-terms { display: block; text-indent: -9999px; position: relative; height: 1em; width: 1em; padding: 0!important; height: 2em!important; width: 2em } .attributes-table .attribute-actions .configure-terms::after { font-family: WooCommerce; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: "ï„‘"; font-family: Dashicons; line-height: 1.85 } ul.order_notes { padding: 2px 0 0 } ul.order_notes li .note_content { padding: 10px; background: #efefef; position: relative } ul.order_notes li .note_content p { margin: 0; padding: 0; word-wrap: break-word } ul.order_notes li p.meta { padding: 10px; color: #999; margin: 0; font-size: 11px } ul.order_notes li p.meta .exact-date { border-bottom: 1px dotted #999 } ul.order_notes li a.delete_note { color: #a00 } ul.order_notes li .note_content::after { content: ""; display: block; position: absolute; bottom: -10px; left: 20px; width: 0; height: 0; border-width: 10px 10px 0 0; border-style: solid; border-color: #efefef transparent } ul.order_notes li.system-note .note_content { background: #d7cad2 } ul.order_notes li.system-note .note_content::after { border-color: #d7cad2 transparent } ul.order_notes li.customer-note .note_content { background: #a7cedc } ul.order_notes li.customer-note .note_content::after { border-color: #a7cedc transparent } .add_note { border-top: 1px solid #ddd; padding: 10px 10px 0 } .add_note h4 { margin-top: 5px!important } .add_note #add_order_note { width: 100%; height: 50px } table.wp-list-table .column-thumb { width: 52px; text-align: center; white-space: nowrap } table.wp-list-table .column-handle { width: 17px; display: none } table.wp-list-table tbody td.column-handle { cursor: move; width: 17px; text-align: center; vertical-align: text-top } table.wp-list-table tbody td.column-handle::before { content: "\f333"; font-family: Dashicons; text-align: center; line-height: 1; color: #999; display: block; width: 17px; height: 100%; margin: 4px 0 0 0 } table.wp-list-table .column-name { width: 22% } table.wp-list-table .column-product_cat,table.wp-list-table .column-product_tag { width: 11%!important } table.wp-list-table .column-featured,table.wp-list-table .column-product_type { width: 48px; text-align: left!important } table.wp-list-table .column-customer_message,table.wp-list-table .column-order_notes { width: 48px; text-align: center } table.wp-list-table .column-customer_message img,table.wp-list-table .column-order_notes img { margin: 0 auto; padding-top: 0!important } table.wp-list-table .manage-column.column-featured img,table.wp-list-table .manage-column.column-product_type img { padding-left: 2px } table.wp-list-table .column-price .woocommerce-price-suffix { display: none } table.wp-list-table img { margin: 1px 2px } table.wp-list-table .row-actions { color: #999 } table.wp-list-table td.column-thumb img { margin: 0; width: auto; height: auto; max-width: 40px; max-height: 40px; vertical-align: middle } table.wp-list-table span.na { color: #999 } table.wp-list-table .column-sku { width: 10% } table.wp-list-table .column-price { width: 10ch } table.wp-list-table .column-is_in_stock { text-align: left!important; width: 12ch } table.wp-list-table span.wc-featured,table.wp-list-table span.wc-image { display: block; text-indent: -9999px; position: relative; height: 1em; width: 1em; margin: 0 auto } table.wp-list-table span.wc-featured::before,table.wp-list-table span.wc-image::before { font-family: Dashicons; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; -webkit-font-smoothing: antialiased; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: "" } table.wp-list-table span.wc-featured::before { content: "\f155" } table.wp-list-table span.wc-featured.not-featured::before { content: "\f154" } table.wp-list-table td.column-featured span.wc-featured { font-size: 1.6em; cursor: pointer } table.wp-list-table mark.instock,table.wp-list-table mark.onbackorder,table.wp-list-table mark.outofstock { font-weight: 700; background: transparent none; line-height: 1 } table.wp-list-table mark.instock { color: #7ad03a } table.wp-list-table mark.outofstock { color: #a44 } table.wp-list-table mark.onbackorder { color: #eaa600 } table.wp-list-table .notes_head,table.wp-list-table .order-notes_head,table.wp-list-table .status_head { display: block; text-indent: -9999px; position: relative; height: 1em; width: 1em; margin: 0 auto } table.wp-list-table .notes_head::after,table.wp-list-table .order-notes_head::after,table.wp-list-table .status_head::after { font-family: WooCommerce; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: "î€" } table.wp-list-table .order-notes_head::after { content: "\e028" } table.wp-list-table .notes_head::after { content: "\e026" } table.wp-list-table .status_head::after { content: "\e011" } table.wp-list-table .column-order_items { width: 12% } table.wp-list-table .column-order_items table.order_items { width: 100%; margin: 3px 0 0; padding: 0; display: none } table.wp-list-table .column-order_items table.order_items td { border: 0; margin: 0; padding: 0 0 3px } table.wp-list-table .column-order_items table.order_items td.qty { color: #999; padding-right: 6px; text-align: left } mark.notice { background: #fff; color: #a00; margin: 0 0 0 10px } a.export_rates,a.import_rates { float: right; margin-left: 9px; margin-top: -2px; margin-bottom: 0 } #rates-search { float: right } #rates-search input.wc-tax-rates-search-field { padding: 4px 8px; font-size: 1.2em } #rates-pagination { float: right; margin-right: .5em } #rates-pagination .tablenav { margin: 0 } .wc_input_table_wrapper { overflow-x: auto; display: block } table.wc_input_table,table.wc_tax_rates { width: 100% } table.wc_input_table td,table.wc_input_table th,table.wc_tax_rates td,table.wc_tax_rates th { display: table-cell!important } table.wc_input_table span.tips,table.wc_tax_rates span.tips { color: #2ea2cc } table.wc_input_table th,table.wc_tax_rates th { white-space: nowrap; padding: 10px } table.wc_input_table td,table.wc_tax_rates td { padding: 0; border-right: 1px solid #dfdfdf; border-bottom: 1px solid #dfdfdf; border-top: 0; background: #fff; cursor: default } table.wc_input_table td input[type=number],table.wc_input_table td input[type=text],table.wc_tax_rates td input[type=number],table.wc_tax_rates td input[type=text] { width: 100%!important; min-width: 100px; padding: 8px 10px; margin: 0; border: 0; outline: 0; background: transparent none } table.wc_input_table td input[type=number]:focus,table.wc_input_table td input[type=text]:focus,table.wc_tax_rates td input[type=number]:focus,table.wc_tax_rates td input[type=text]:focus { outline: 0; box-shadow: none } table.wc_input_table td.apply_to_shipping,table.wc_input_table td.compound,table.wc_tax_rates td.apply_to_shipping,table.wc_tax_rates td.compound { padding: 5px 7px; vertical-align: middle } table.wc_input_table td.apply_to_shipping input,table.wc_input_table td.compound input,table.wc_tax_rates td.apply_to_shipping input,table.wc_tax_rates td.compound input { width: auto; padding: 0 } table.wc_input_table td:last-child,table.wc_tax_rates td:last-child { border-right: 0 } table.wc_input_table tr.current td,table.wc_tax_rates tr.current td { background-color: #fefbcc } table.wc_input_table .cost,table.wc_input_table .item_cost,table.wc_tax_rates .cost,table.wc_tax_rates .item_cost { text-align: right } table.wc_input_table .cost input,table.wc_input_table .item_cost input,table.wc_tax_rates .cost input,table.wc_tax_rates .item_cost input { text-align: right } table.wc_input_table th.sort,table.wc_tax_rates th.sort { width: 17px; padding: 0 4px } table.wc_input_table td.sort,table.wc_tax_rates td.sort { padding: 0 4px } table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort { cursor: move; font-size: 15px; background: #f9f9f9; text-align: center; vertical-align: middle } table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort::before,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort::before { content: "\f333"; font-family: Dashicons; text-align: center; line-height: 1; color: #999; display: block; width: 17px; float: left; height: 100% } table.wc_input_table .ui-sortable:not(.ui-sortable-disabled) td.sort:hover::before,table.wc_tax_rates .ui-sortable:not(.ui-sortable-disabled) td.sort:hover::before { color: #333 } table.wc_input_table .button,table.wc_tax_rates .button { float: left; margin-right: 5px } table.wc_input_table .export,table.wc_input_table .import,table.wc_tax_rates .export,table.wc_tax_rates .import { float: right; margin-right: 0; margin-left: 5px } table.wc_input_table span.tips,table.wc_tax_rates span.tips { padding: 0 3px } table.wc_input_table .pagination,table.wc_tax_rates .pagination { float: right } table.wc_input_table .pagination .button,table.wc_tax_rates .pagination .button { margin-left: 5px; margin-right: 0 } table.wc_input_table .pagination .current,table.wc_tax_rates .pagination .current { background: #bbb; text-shadow: none } table.wc_input_table tr:last-child td,table.wc_tax_rates tr:last-child td { border-bottom: 0 } table.wc_emails,table.wc_gateways,table.wc_shipping { position: relative } table.wc_emails td,table.wc_emails th,table.wc_gateways td,table.wc_gateways th,table.wc_shipping td,table.wc_shipping th { display: table-cell!important; padding: 1em!important; vertical-align: top; line-height: 1.75em } table.wc_emails.wc_emails td,table.wc_gateways.wc_emails td,table.wc_shipping.wc_emails td { vertical-align: middle } table.wc_emails tr:nth-child(odd) td,table.wc_gateways tr:nth-child(odd) td,table.wc_shipping tr:nth-child(odd) td { background: #f9f9f9 } table.wc_emails td.name,table.wc_gateways td.name,table.wc_shipping td.name { font-weight: 700 } table.wc_emails .settings,table.wc_gateways .settings,table.wc_shipping .settings { text-align: right } table.wc_emails .default,table.wc_emails .radio,table.wc_emails .status,table.wc_gateways .default,table.wc_gateways .radio,table.wc_gateways .status,table.wc_shipping .default,table.wc_shipping .radio,table.wc_shipping .status { text-align: center } table.wc_emails .default .tips,table.wc_emails .radio .tips,table.wc_emails .status .tips,table.wc_gateways .default .tips,table.wc_gateways .radio .tips,table.wc_gateways .status .tips,table.wc_shipping .default .tips,table.wc_shipping .radio .tips,table.wc_shipping .status .tips { margin: 0 auto } table.wc_emails .default input,table.wc_emails .radio input,table.wc_emails .status input,table.wc_gateways .default input,table.wc_gateways .radio input,table.wc_gateways .status input,table.wc_shipping .default input,table.wc_shipping .radio input,table.wc_shipping .status input { margin: 0 } table.wc_emails td.sort,table.wc_gateways td.sort,table.wc_shipping td.sort { font-size: 15px; text-align: center } table.wc_emails td.sort .wc-item-reorder-nav,table.wc_gateways td.sort .wc-item-reorder-nav,table.wc_shipping td.sort .wc-item-reorder-nav { white-space: nowrap; width: 72px } table.wc_emails td.sort .wc-item-reorder-nav::before,table.wc_gateways td.sort .wc-item-reorder-nav::before,table.wc_shipping td.sort .wc-item-reorder-nav::before { content: "\f333"; font-family: Dashicons; text-align: center; line-height: 1; color: #999; display: block; width: 24px; float: left; height: 100%; line-height: 24px; cursor: move } table.wc_emails td.sort .wc-item-reorder-nav button,table.wc_gateways td.sort .wc-item-reorder-nav button,table.wc_shipping td.sort .wc-item-reorder-nav button { position: relative; overflow: hidden; float: left; display: block; width: 24px; height: 24px; margin: 0; background: 0 0; border: none; box-shadow: none; color: #82878c; text-indent: -9999px; cursor: pointer; outline: 0 } table.wc_emails td.sort .wc-item-reorder-nav button::before,table.wc_gateways td.sort .wc-item-reorder-nav button::before,table.wc_shipping td.sort .wc-item-reorder-nav button::before { display: inline-block; position: absolute; top: 0; right: 0; width: 100%; height: 100%; font: normal 20px/23px dashicons; text-align: center; text-indent: 0; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale } table.wc_emails td.sort .wc-item-reorder-nav button:focus,table.wc_emails td.sort .wc-item-reorder-nav button:hover,table.wc_gateways td.sort .wc-item-reorder-nav button:focus,table.wc_gateways td.sort .wc-item-reorder-nav button:hover,table.wc_shipping td.sort .wc-item-reorder-nav button:focus,table.wc_shipping td.sort .wc-item-reorder-nav button:hover { color: #191e23 } table.wc_emails td.sort .wc-item-reorder-nav .wc-move-down::before,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-down::before,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-down::before { content: "\f347" } table.wc_emails td.sort .wc-item-reorder-nav .wc-move-up::before,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-up::before,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-up::before { content: "\f343" } table.wc_emails td.sort .wc-item-reorder-nav .wc-move-disabled,table.wc_gateways td.sort .wc-item-reorder-nav .wc-move-disabled,table.wc_shipping td.sort .wc-item-reorder-nav .wc-move-disabled { color: #d5d5d5!important; cursor: default; pointer-events: none } table.wc_emails .wc-payment-gateway-method-name,table.wc_gateways .wc-payment-gateway-method-name,table.wc_shipping .wc-payment-gateway-method-name { font-weight: 400 } table.wc_emails .wc-email-settings-table-name,table.wc_gateways .wc-email-settings-table-name,table.wc_shipping .wc-email-settings-table-name { font-weight: 700 } table.wc_emails .wc-email-settings-table-name span,table.wc_gateways .wc-email-settings-table-name span,table.wc_shipping .wc-email-settings-table-name span { font-weight: 400; color: #999; margin: 0 0 0 4px!important } table.wc_emails .wc-payment-gateway-method-toggle-disabled,table.wc_emails .wc-payment-gateway-method-toggle-enabled,table.wc_gateways .wc-payment-gateway-method-toggle-disabled,table.wc_gateways .wc-payment-gateway-method-toggle-enabled,table.wc_shipping .wc-payment-gateway-method-toggle-disabled,table.wc_shipping .wc-payment-gateway-method-toggle-enabled { padding-top: 1px; display: block; outline: 0; box-shadow: none } table.wc_emails .wc-email-settings-table-status,table.wc_gateways .wc-email-settings-table-status,table.wc_shipping .wc-email-settings-table-status { text-align: center; width: 1em } table.wc_emails .wc-email-settings-table-status .tips,table.wc_gateways .wc-email-settings-table-status .tips,table.wc_shipping .wc-email-settings-table-status .tips { margin: 0 auto } .wc-shipping-zone-settings th { padding: 24px 24px 24px 0 } .wc-shipping-zone-settings td.forminp input,.wc-shipping-zone-settings td.forminp textarea { padding: 8px; max-width: 100%!important } .wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select { width: 448px; max-width: 100%!important } .wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices { padding: 8px 8px 4px; border-color: #ddd; min-height: 0; line-height: 1 } .wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices input { padding: 0 } .wc-shipping-zone-settings td.forminp .wc-shipping-zone-region-select .select2-choices li { margin: 0 4px 4px 0 } .wc-shipping-zone-settings .wc-shipping-zone-postcodes-toggle { margin: .5em 0 0; font-size: .9em; text-decoration: underline; display: block } .wc-shipping-zone-settings .wc-shipping-zone-postcodes-toggle+.wc-shipping-zone-postcodes { display: none } .wc-shipping-zone-settings .wc-shipping-zone-postcodes textarea { margin: 10px 0 } .wc-shipping-zone-settings .wc-shipping-zone-postcodes .description { font-size: .9em; color: #999 } .wc-shipping-zone-settings+p.submit { margin-top: 0 } .wc-shipping-zone-settings tbody { display: inherit } table tr table.wc-shipping-zone-methods tr .row-actions,table tr:hover table.wc-shipping-zone-methods tr .row-actions { position: relative } table tr table.wc-shipping-zone-methods tr:hover .row-actions,table tr:hover table.wc-shipping-zone-methods tr:hover .row-actions { position: static } .wc-shipping-zones-heading .page-title-action { display: inline-block } table.wc-shipping-classes td,table.wc-shipping-classes th,table.wc-shipping-zone-methods td,table.wc-shipping-zone-methods th,table.wc-shipping-zones td,table.wc-shipping-zones th { vertical-align: top; line-height: 24px; padding: 1em!important; font-size: 14px; background: #fff; display: table-cell!important } table.wc-shipping-classes td li,table.wc-shipping-classes th li,table.wc-shipping-zone-methods td li,table.wc-shipping-zone-methods th li,table.wc-shipping-zones td li,table.wc-shipping-zones th li { line-height: 24px; font-size: 14px } table.wc-shipping-classes td .woocommerce-help-tip,table.wc-shipping-classes th .woocommerce-help-tip,table.wc-shipping-zone-methods td .woocommerce-help-tip,table.wc-shipping-zone-methods th .woocommerce-help-tip,table.wc-shipping-zones td .woocommerce-help-tip,table.wc-shipping-zones th .woocommerce-help-tip { margin: 0!important } table.wc-shipping-classes thead th,table.wc-shipping-zone-methods thead th,table.wc-shipping-zones thead th { vertical-align: middle } table.wc-shipping-classes thead .wc-shipping-zone-sort,table.wc-shipping-zone-methods thead .wc-shipping-zone-sort,table.wc-shipping-zones thead .wc-shipping-zone-sort { text-align: center } table.wc-shipping-classes td.wc-shipping-zone-method-blank-state,table.wc-shipping-classes td.wc-shipping-zones-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zones-blank-state { background: #f7f1f6!important; overflow: hidden; position: relative; padding: 7.5em 7.5%!important; border-bottom: 2px solid #eee2ec } table.wc-shipping-classes td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-classes td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state,table.wc-shipping-zones td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state { padding: 2em!important } table.wc-shipping-classes td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-classes td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zones-blank-state.wc-shipping-zone-method-blank-state p { margin-bottom: 0 } table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li,table.wc-shipping-classes td.wc-shipping-zone-method-blank-state p,table.wc-shipping-classes td.wc-shipping-zones-blank-state li,table.wc-shipping-classes td.wc-shipping-zones-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state p,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state p,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state p,table.wc-shipping-zones td.wc-shipping-zones-blank-state li,table.wc-shipping-zones td.wc-shipping-zones-blank-state p { color: #a46497; font-size: 1.5em; line-height: 1.5em; margin: 0 0 1em; position: relative; z-index: 1; text-shadow: 1px 1px 1px #fff } table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-classes td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-classes td.wc-shipping-zones-blank-state li.main,table.wc-shipping-classes td.wc-shipping-zones-blank-state p.main,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li.main,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state p.main,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li.main,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state p.main,table.wc-shipping-zones td.wc-shipping-zones-blank-state li.main,table.wc-shipping-zones td.wc-shipping-zones-blank-state p.main { font-size: 2em } table.wc-shipping-classes td.wc-shipping-zone-method-blank-state li,table.wc-shipping-classes td.wc-shipping-zones-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state li,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state li,table.wc-shipping-zones td.wc-shipping-zones-blank-state li { margin-left: 1em; list-style: circle inside } table.wc-shipping-classes td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-classes td.wc-shipping-zones-blank-state::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state::before,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state::before,table.wc-shipping-zones td.wc-shipping-zones-blank-state::before { content: "\e01b"; font-family: WooCommerce; text-align: center; line-height: 1; color: #eee2ec; display: block; width: 1em; font-size: 40em; top: 50%; right: -3.75%; margin-top: -.1875em; position: absolute } table.wc-shipping-classes td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-classes td.wc-shipping-zones-blank-state .button-primary,table.wc-shipping-zone-methods td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-zone-methods td.wc-shipping-zones-blank-state .button-primary,table.wc-shipping-zones td.wc-shipping-zone-method-blank-state .button-primary,table.wc-shipping-zones td.wc-shipping-zones-blank-state .button-primary { background-color: #804877; border-color: #804877; box-shadow: inset 0 1px 0 rgba(255,255,255,.2),0 1px 0 rgba(0,0,0,.15); margin: 0; opacity: 1; text-shadow: 0 -1px 1px #8a4f7f,1px 0 1px #8a4f7f,0 1px 1px #8a4f7f,-1px 0 1px #8a4f7f; font-size: 1.5em; padding: .75em 1em; height: auto; position: relative; z-index: 1 } table.wc-shipping-classes .wc-shipping-zone-method-rows tr:nth-child(even) td,table.wc-shipping-zone-methods .wc-shipping-zone-method-rows tr:nth-child(even) td,table.wc-shipping-zones .wc-shipping-zone-method-rows tr:nth-child(even) td { background: #f9f9f9 } table.wc-shipping-classes .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-classes tr.odd td,table.wc-shipping-zone-methods .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-zone-methods tr.odd td,table.wc-shipping-zones .wc-shipping-class-rows tr:nth-child(odd) td,table.wc-shipping-zones tr.odd td { background: #f9f9f9 } table.wc-shipping-classes tbody.wc-shipping-zone-rows td,table.wc-shipping-zone-methods tbody.wc-shipping-zone-rows td,table.wc-shipping-zones tbody.wc-shipping-zone-rows td { border-top: 2px solid #f9f9f9 } table.wc-shipping-classes tbody.wc-shipping-zone-rows tr:first-child td,table.wc-shipping-zone-methods tbody.wc-shipping-zone-rows tr:first-child td,table.wc-shipping-zones tbody.wc-shipping-zone-rows tr:first-child td { border-top: 0 } table.wc-shipping-classes tr.wc-shipping-zone-worldwide td,table.wc-shipping-zone-methods tr.wc-shipping-zone-worldwide td,table.wc-shipping-zones tr.wc-shipping-zone-worldwide td { background: #f9f9f9; border-top: 2px solid #e1e1e1 } table.wc-shipping-classes p,table.wc-shipping-classes ul,table.wc-shipping-zone-methods p,table.wc-shipping-zone-methods ul,table.wc-shipping-zones p,table.wc-shipping-zones ul { margin: 0 } table.wc-shipping-classes td.wc-shipping-zone-method-sort,table.wc-shipping-classes td.wc-shipping-zone-sort,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort,table.wc-shipping-zone-methods td.wc-shipping-zone-sort,table.wc-shipping-zones td.wc-shipping-zone-method-sort,table.wc-shipping-zones td.wc-shipping-zone-sort { cursor: move; font-size: 15px; text-align: center } table.wc-shipping-classes td.wc-shipping-zone-method-sort::before,table.wc-shipping-classes td.wc-shipping-zone-sort::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort::before,table.wc-shipping-zone-methods td.wc-shipping-zone-sort::before,table.wc-shipping-zones td.wc-shipping-zone-method-sort::before,table.wc-shipping-zones td.wc-shipping-zone-sort::before { content: "\f333"; font-family: Dashicons; text-align: center; line-height: 1; color: #999; display: block; width: 17px; float: left; height: 100%; line-height: 24px } table.wc-shipping-classes td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-classes td.wc-shipping-zone-sort:hover::before,table.wc-shipping-zone-methods td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-zone-methods td.wc-shipping-zone-sort:hover::before,table.wc-shipping-zones td.wc-shipping-zone-method-sort:hover::before,table.wc-shipping-zones td.wc-shipping-zone-sort:hover::before { color: #333 } table.wc-shipping-classes td.wc-shipping-zone-worldwide,table.wc-shipping-zone-methods td.wc-shipping-zone-worldwide,table.wc-shipping-zones td.wc-shipping-zone-worldwide { text-align: center } table.wc-shipping-classes td.wc-shipping-zone-worldwide::before,table.wc-shipping-zone-methods td.wc-shipping-zone-worldwide::before,table.wc-shipping-zones td.wc-shipping-zone-worldwide::before { content: "\f319"; font-family: dashicons; text-align: center; line-height: 1; color: #999; display: block; width: 17px; float: left; height: 100%; line-height: 24px } table.wc-shipping-classes .wc-shipping-zone-methods,table.wc-shipping-classes .wc-shipping-zone-name,table.wc-shipping-zone-methods .wc-shipping-zone-methods,table.wc-shipping-zone-methods .wc-shipping-zone-name,table.wc-shipping-zones .wc-shipping-zone-methods,table.wc-shipping-zones .wc-shipping-zone-name { width: 25% } table.wc-shipping-classes .wc-shipping-class-description input,table.wc-shipping-classes .wc-shipping-class-description select,table.wc-shipping-classes .wc-shipping-class-description textarea,table.wc-shipping-classes .wc-shipping-class-name input,table.wc-shipping-classes .wc-shipping-class-name select,table.wc-shipping-classes .wc-shipping-class-name textarea,table.wc-shipping-classes .wc-shipping-class-slug input,table.wc-shipping-classes .wc-shipping-class-slug select,table.wc-shipping-classes .wc-shipping-class-slug textarea,table.wc-shipping-classes .wc-shipping-zone-name input,table.wc-shipping-classes .wc-shipping-zone-name select,table.wc-shipping-classes .wc-shipping-zone-name textarea,table.wc-shipping-classes .wc-shipping-zone-region input,table.wc-shipping-classes .wc-shipping-zone-region select,table.wc-shipping-classes .wc-shipping-zone-region textarea,table.wc-shipping-zone-methods .wc-shipping-class-description input,table.wc-shipping-zone-methods .wc-shipping-class-description select,table.wc-shipping-zone-methods .wc-shipping-class-description textarea,table.wc-shipping-zone-methods .wc-shipping-class-name input,table.wc-shipping-zone-methods .wc-shipping-class-name select,table.wc-shipping-zone-methods .wc-shipping-class-name textarea,table.wc-shipping-zone-methods .wc-shipping-class-slug input,table.wc-shipping-zone-methods .wc-shipping-class-slug select,table.wc-shipping-zone-methods .wc-shipping-class-slug textarea,table.wc-shipping-zone-methods .wc-shipping-zone-name input,table.wc-shipping-zone-methods .wc-shipping-zone-name select,table.wc-shipping-zone-methods .wc-shipping-zone-name textarea,table.wc-shipping-zone-methods .wc-shipping-zone-region input,table.wc-shipping-zone-methods .wc-shipping-zone-region select,table.wc-shipping-zone-methods .wc-shipping-zone-region textarea,table.wc-shipping-zones .wc-shipping-class-description input,table.wc-shipping-zones .wc-shipping-class-description select,table.wc-shipping-zones .wc-shipping-class-description textarea,table.wc-shipping-zones .wc-shipping-class-name input,table.wc-shipping-zones .wc-shipping-class-name select,table.wc-shipping-zones .wc-shipping-class-name textarea,table.wc-shipping-zones .wc-shipping-class-slug input,table.wc-shipping-zones .wc-shipping-class-slug select,table.wc-shipping-zones .wc-shipping-class-slug textarea,table.wc-shipping-zones .wc-shipping-zone-name input,table.wc-shipping-zones .wc-shipping-zone-name select,table.wc-shipping-zones .wc-shipping-zone-name textarea,table.wc-shipping-zones .wc-shipping-zone-region input,table.wc-shipping-zones .wc-shipping-zone-region select,table.wc-shipping-zones .wc-shipping-zone-region textarea { width: 100% } table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-zone-delete,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-class-delete,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-zone-delete { color: #a00 } table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-classes .wc-shipping-zone-region a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-zone-methods .wc-shipping-zone-region a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-description a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-class-slug a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-zone-name a.wc-shipping-zone-delete:hover,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-class-delete:hover,table.wc-shipping-zones .wc-shipping-zone-region a.wc-shipping-zone-delete:hover { color: red } table.wc-shipping-classes .wc-shipping-class-count,table.wc-shipping-zone-methods .wc-shipping-class-count,table.wc-shipping-zones .wc-shipping-class-count { text-align: center } table.wc-shipping-classes td.wc-shipping-zone-methods,table.wc-shipping-zone-methods td.wc-shipping-zone-methods,table.wc-shipping-zones td.wc-shipping-zone-methods { color: #555 } table.wc-shipping-classes td.wc-shipping-zone-methods .method_disabled,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .method_disabled,table.wc-shipping-zones td.wc-shipping-zone-methods .method_disabled { text-decoration: line-through } table.wc-shipping-classes td.wc-shipping-zone-methods ul,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul,table.wc-shipping-zones td.wc-shipping-zone-methods ul { position: relative; padding-right: 32px } table.wc-shipping-classes td.wc-shipping-zone-methods ul li,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li,table.wc-shipping-zones td.wc-shipping-zone-methods ul li { color: #555; display: inline; margin: 0 } table.wc-shipping-classes td.wc-shipping-zone-methods ul li::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li::before,table.wc-shipping-zones td.wc-shipping-zone-methods ul li::before { content: ", " } table.wc-shipping-classes td.wc-shipping-zone-methods ul li:first-child::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods ul li:first-child::before,table.wc-shipping-zones td.wc-shipping-zone-methods ul li:first-child::before { content: "" } table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method { display: block; width: 24px; padding: 24px 0 0; height: 0; overflow: hidden; cursor: pointer } table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method::before,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method::before { font-family: WooCommerce; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: "î€"; font-family: Dashicons; content: "\f502"; color: #999; vertical-align: middle; line-height: 24px; font-size: 16px; margin: 0 } table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method.disabled,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method.disabled,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method.disabled { cursor: not-allowed } table.wc-shipping-classes td.wc-shipping-zone-methods .add_shipping_method.disabled::before,table.wc-shipping-zone-methods td.wc-shipping-zone-methods .add_shipping_method.disabled::before,table.wc-shipping-zones td.wc-shipping-zone-methods .add_shipping_method.disabled::before { color: #ccc } table.wc-shipping-classes .wc-shipping-zone-method-title,table.wc-shipping-zone-methods .wc-shipping-zone-method-title,table.wc-shipping-zones .wc-shipping-zone-method-title { width: 25% } table.wc-shipping-classes .wc-shipping-zone-method-title .wc-shipping-zone-method-delete,table.wc-shipping-zone-methods .wc-shipping-zone-method-title .wc-shipping-zone-method-delete,table.wc-shipping-zones .wc-shipping-zone-method-title .wc-shipping-zone-method-delete { color: red } table.wc-shipping-classes .wc-shipping-zone-method-enabled,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled,table.wc-shipping-zones .wc-shipping-zone-method-enabled { text-align: center } table.wc-shipping-classes .wc-shipping-zone-method-enabled a,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled a,table.wc-shipping-zones .wc-shipping-zone-method-enabled a { display: inline-block } table.wc-shipping-classes .wc-shipping-zone-method-enabled .woocommerce-input-toggle,table.wc-shipping-zone-methods .wc-shipping-zone-method-enabled .woocommerce-input-toggle,table.wc-shipping-zones .wc-shipping-zone-method-enabled .woocommerce-input-toggle { margin-top: 3px } table.wc-shipping-classes .wc-shipping-zone-method-type,table.wc-shipping-zone-methods .wc-shipping-zone-method-type,table.wc-shipping-zones .wc-shipping-zone-method-type { display: block } table.wc-shipping-classes tfoot input,table.wc-shipping-classes tfoot select,table.wc-shipping-zone-methods tfoot input,table.wc-shipping-zone-methods tfoot select,table.wc-shipping-zones tfoot input,table.wc-shipping-zones tfoot select { vertical-align: middle!important } table.wc-shipping-classes tfoot .button-secondary,table.wc-shipping-zone-methods tfoot .button-secondary,table.wc-shipping-zones tfoot .button-secondary { float: right } table.wc-shipping-classes .editing .wc-shipping-zone-edit,table.wc-shipping-classes .editing .wc-shipping-zone-view,table.wc-shipping-zone-methods .editing .wc-shipping-zone-edit,table.wc-shipping-zone-methods .editing .wc-shipping-zone-view,table.wc-shipping-zones .editing .wc-shipping-zone-edit,table.wc-shipping-zones .editing .wc-shipping-zone-view { display: none } .woocommerce-input-toggle { height: 16px; width: 32px; border: 2px solid #935687; background-color: #935687; display: inline-block; text-indent: -9999px; border-radius: 10em; position: relative; margin-top: -1px; vertical-align: text-top } .woocommerce-input-toggle::before { content: ""; display: block; width: 16px; height: 16px; background: #fff; position: absolute; top: 0; right: 0; border-radius: 100% } .woocommerce-input-toggle.woocommerce-input-toggle--disabled { border-color: #999; background-color: #999 } .woocommerce-input-toggle.woocommerce-input-toggle--disabled::before { right: auto; left: 0 } .woocommerce-input-toggle.woocommerce-input-toggle--loading { opacity: .5 } .wc-modal-shipping-method-settings { background: #f8f8f8; padding: 1em!important } .wc-modal-shipping-method-settings form .form-table { width: 100%; background: #fff; margin: 0 0 1.5em } .wc-modal-shipping-method-settings form .form-table tr th { width: 30%; position: relative } .wc-modal-shipping-method-settings form .form-table tr th .woocommerce-help-tip { float: right; margin: -8px -.5em 0 0; vertical-align: middle; right: 0; top: 50%; position: absolute } .wc-modal-shipping-method-settings form .form-table tr td input,.wc-modal-shipping-method-settings form .form-table tr td select,.wc-modal-shipping-method-settings form .form-table tr td textarea { width: 50%; min-width: 250px } .wc-modal-shipping-method-settings form .form-table tr td input[type=checkbox] { width: auto; min-width: 16px } .wc-modal-shipping-method-settings form .form-table tr td,.wc-modal-shipping-method-settings form .form-table tr th { vertical-align: middle; margin: 0; line-height: 24px; padding: 1em; border-bottom: 1px solid #f8f8f8 } .wc-modal-shipping-method-settings form .form-table:last-of-type { margin-bottom: 0 } .wc-backbone-modal .wc-shipping-zone-method-selector p { margin-top: 0 } .wc-backbone-modal .wc-shipping-zone-method-selector .wc-shipping-zone-method-description { margin: .75em 1px 0; line-height: 1.5em; color: #999; font-style: italic } .wc-backbone-modal .wc-shipping-zone-method-selector select { width: 100%; cursor: pointer } img.help_tip { margin: 0 0 0 9px; vertical-align: middle } .postbox img.help_tip { margin-top: 0 } .postbox .woocommerce-help-tip { margin: 0 0 0 9px } .status-disabled,.status-enabled,.status-manual { font-size: 1.4em; display: block; text-indent: -9999px; position: relative; height: 1em; width: 1em } .status-manual::before { font-family: WooCommerce; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: ""; color: #999 } .status-enabled::before { font-family: WooCommerce; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: ""; color: #a46497 } .status-disabled::before { font-family: WooCommerce; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: ""; color: #ccc } .woocommerce h2.woo-nav-tab-wrapper { margin-bottom: 1em } .woocommerce nav.woo-nav-tab-wrapper { margin: 1.5em 0 1em } .woocommerce .subsubsub { margin: -8px 0 0 } .woocommerce .wc-admin-breadcrumb { margin-left: .5em } .woocommerce .wc-admin-breadcrumb a { color: #a46497 } .woocommerce #template div { margin: 0 } .woocommerce #template div p .button { float: right; margin-left: 10px; margin-top: -4px } .woocommerce #template div .editor textarea { margin-bottom: 8px } .woocommerce textarea[disabled=disabled] { background: #dfdfdf!important } .woocommerce table.form-table { margin: 0; position: relative; table-layout: fixed } .woocommerce table.form-table .forminp-radio ul { margin: 0 } .woocommerce table.form-table .forminp-radio ul li { line-height: 1.4em } .woocommerce table.form-table input[type=email],.woocommerce table.form-table input[type=number],.woocommerce table.form-table input[type=text] { height: auto } .woocommerce table.form-table textarea.input-text { height: 100%; min-width: 150px; display: block } .woocommerce table.form-table input.regular-input,.woocommerce table.form-table input[type=date],.woocommerce table.form-table input[type=datetime-local],.woocommerce table.form-table input[type=datetime],.woocommerce table.form-table input[type=email],.woocommerce table.form-table input[type=number],.woocommerce table.form-table input[type=password],.woocommerce table.form-table input[type=tel],.woocommerce table.form-table input[type=text],.woocommerce table.form-table input[type=time],.woocommerce table.form-table input[type=url],.woocommerce table.form-table input[type=week],.woocommerce table.form-table textarea { width: 400px; margin: 0; padding: 6px; box-sizing: border-box; vertical-align: top } .woocommerce table.form-table input[type=date],.woocommerce table.form-table input[type=datetime-local],.woocommerce table.form-table input[type=tel],.woocommerce table.form-table input[type=time],.woocommerce table.form-table input[type=week] { width: 200px } .woocommerce table.form-table select { width: 400px; margin: 0; box-sizing: border-box; height: 32px; line-height: 32px; vertical-align: top } .woocommerce table.form-table input[size] { width: auto!important } .woocommerce table.form-table table input.regular-input,.woocommerce table.form-table table input[type=email],.woocommerce table.form-table table input[type=number],.woocommerce table.form-table table input[type=text],.woocommerce table.form-table table select,.woocommerce table.form-table table textarea { width: auto } .woocommerce table.form-table textarea.wide-input { width: 100% } .woocommerce table.form-table .woocommerce-help-tip,.woocommerce table.form-table img.help_tip { padding: 0; margin: -4px 0 0 5px; vertical-align: middle; cursor: help; line-height: 1 } .woocommerce table.form-table span.help_tip { cursor: help; color: #2ea2cc } .woocommerce table.form-table th { position: relative; padding-right: 24px } .woocommerce table.form-table th label { position: relative; display: block } .woocommerce table.form-table th label .woocommerce-help-tip,.woocommerce table.form-table th label img.help_tip { margin: -8px -24px 0 0; position: absolute; right: 0; top: 50% } .woocommerce table.form-table th label+.woocommerce-help-tip { margin: 0; position: absolute; right: 0; top: 20px } .woocommerce table.form-table woocommerce-help-tip .select2-container { vertical-align: top; margin-bottom: 3px } .woocommerce table.form-table .select2-container+span.description { display: block; margin-top: 8px } .woocommerce table.form-table table.widefat th { padding-right: inherit } .woocommerce table.form-table .wp-list-table .woocommerce-help-tip { float: none } .woocommerce table.form-table fieldset { margin-top: 4px } .woocommerce table.form-table fieldset .woocommerce-help-tip,.woocommerce table.form-table fieldset img.help_tip { margin: -3px 0 0 5px } .woocommerce table.form-table fieldset p.description { margin-bottom: 8px } .woocommerce table.form-table fieldset:first-child { margin-top: 0 } .woocommerce table.form-table .iris-picker { z-index: 100; display: none; position: absolute; border: 1px solid #ccc; border-radius: 3px; box-shadow: 0 1px 3px rgba(0,0,0,.2) } .woocommerce table.form-table .iris-picker .ui-slider { border: 0!important; margin: 0!important; width: auto!important; height: auto!important; background: none transparent!important } .woocommerce table.form-table .iris-picker .ui-slider .ui-slider-handle { margin-bottom: 0!important } .woocommerce table.form-table .iris-error { background-color: #ffafaf } .woocommerce table.form-table .colorpickpreview { padding: 7px 0; line-height: 1em; display: inline-block; width: 26px; border: 1px solid #ddd; font-size: 14px } .woocommerce table.form-table .image_width_settings { vertical-align: middle } .woocommerce table.form-table .image_width_settings label { margin-left: 10px } .woocommerce table.form-table .image_width_settings input { width: auto } .woocommerce table.form-table .wc_emails_wrapper,.woocommerce table.form-table .wc_payment_gateways_wrapper { padding: 0 15px 10px 0 } .woocommerce .wc-shipping-zone-settings td.forminp input,.woocommerce .wc-shipping-zone-settings td.forminp textarea { width: 448px; padding: 6px 11px } .woocommerce .wc-shipping-zone-settings td.forminp .select2-search input { padding: 6px } .woocommerce #tabs-wrap table a.remove { margin-left: 4px } .woocommerce #tabs-wrap table p { margin: 0 0 4px!important; overflow: hidden; zoom:1} .woocommerce #tabs-wrap table p a.add { float: left } #wp-excerpt-editor-container { background: #fff } #product_variation-parent #parent_id { width: 100% } #postimagediv img { border: 1px solid #d5d5d5; max-width: 100% } #woocommerce-product-images .inside { margin: 0; padding: 0 } #woocommerce-product-images .inside .add_product_images { padding: 0 12px 12px } #woocommerce-product-images .inside #product_images_container { padding: 0 0 0 9px } #woocommerce-product-images .inside #product_images_container ul { margin: 0; padding: 0 } #woocommerce-product-images .inside #product_images_container ul::after,#woocommerce-product-images .inside #product_images_container ul::before { content: ' '; display: table } #woocommerce-product-images .inside #product_images_container ul::after { clear: both } #woocommerce-product-images .inside #product_images_container ul li.add,#woocommerce-product-images .inside #product_images_container ul li.image,#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder { width: 80px; float: left; cursor: move; border: 1px solid #d5d5d5; margin: 9px 9px 0 0; background: #f7f7f7; border-radius: 2px; position: relative; box-sizing: border-box } #woocommerce-product-images .inside #product_images_container ul li.add img,#woocommerce-product-images .inside #product_images_container ul li.image img,#woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder img { width: 100%; height: auto; display: block } #woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder { border: 3px dashed #ddd; position: relative } #woocommerce-product-images .inside #product_images_container ul li.wc-metabox-sortable-placeholder::after { font-family: Dashicons; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; -webkit-font-smoothing: antialiased; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: "ï…¡"; font-size: 2.618em; line-height: 72px; color: #ddd } #woocommerce-product-images .inside #product_images_container ul ul.actions { position: absolute; top: -8px; right: -8px; padding: 2px; display: none } #woocommerce-product-images .inside #product_images_container ul ul.actions li { float: right; margin: 0 0 0 2px } #woocommerce-product-images .inside #product_images_container ul ul.actions li a { width: 1em; height: 1em; margin: 0; height: 0; display: block; overflow: hidden } #woocommerce-product-images .inside #product_images_container ul ul.actions li a.tips { cursor: pointer } #woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete { display: block; text-indent: -9999px; position: relative; height: 1em; width: 1em; font-size: 1.4em } #woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete::before { font-family: Dashicons; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; -webkit-font-smoothing: antialiased; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: "ï…“"; color: #999; background: #fff; border-radius: 50%; height: 1em; width: 1em; line-height: 1em } #woocommerce-product-images .inside #product_images_container ul ul.actions li a.delete:hover::before { color: #a00 } #woocommerce-product-images .inside #product_images_container ul li:hover ul.actions { display: block } #woocommerce-product-data .hndle { padding: 10px } #woocommerce-product-data .hndle span { display: block; vertical-align: middle; line-height: 24px } #woocommerce-product-data .hndle span span { display: inline; line-height: inherit; vertical-align: baseline } #woocommerce-product-data .hndle select { margin: 0 } #woocommerce-product-data .hndle label { padding-right: 1em; font-size: 12px; vertical-align: baseline } #woocommerce-product-data .hndle label:first-child { margin-right: 1em; border-right: 1px solid #dfdfdf } #woocommerce-product-data .hndle input,#woocommerce-product-data .hndle select { margin-top: -3px 0 0; vertical-align: middle } #woocommerce-product-data .hndle select { margin-left: .5em } #woocommerce-product-data>.handlediv { margin-top: 4px } #woocommerce-product-data .wrap { margin: 0 } #woocommerce-coupon-description { padding: 3px 8px; font-size: 1.7em; line-height: 1.42em; height: auto; width: 100%; outline: 0; margin: 10px 0; display: block } #woocommerce-coupon-description::-webkit-input-placeholder { line-height: 1.42em; color: #bbb } #woocommerce-coupon-description::-moz-placeholder { line-height: 1.42em; color: #bbb } #woocommerce-coupon-description:-ms-input-placeholder { line-height: 1.42em; color: #bbb } #woocommerce-coupon-description:-moz-placeholder { line-height: 1.42em; color: #bbb } #woocommerce-coupon-data .panel-wrap,#woocommerce-product-data .panel-wrap { background: #fff } #woocommerce-coupon-data .wc-metaboxes-wrapper,#woocommerce-coupon-data .woocommerce_options_panel,#woocommerce-product-data .wc-metaboxes-wrapper,#woocommerce-product-data .woocommerce_options_panel { float: left; width: 80% } #woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios,#woocommerce-product-data .woocommerce_options_panel .wc-radios { display: block; float: left; margin: 0 } #woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios li,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios li,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios li,#woocommerce-product-data .woocommerce_options_panel .wc-radios li { display: block; padding: 0 0 10px } #woocommerce-coupon-data .wc-metaboxes-wrapper .wc-radios li input,#woocommerce-coupon-data .woocommerce_options_panel .wc-radios li input,#woocommerce-product-data .wc-metaboxes-wrapper .wc-radios li input,#woocommerce-product-data .woocommerce_options_panel .wc-radios li input { width: auto } #woocommerce-coupon-data .panel-wrap,#woocommerce-product-data .panel-wrap,.woocommerce .panel-wrap { overflow: hidden } #woocommerce-coupon-data ul.wc-tabs,#woocommerce-product-data ul.wc-tabs,.woocommerce ul.wc-tabs { margin: 0; width: 20%; float: left; line-height: 1em; padding: 0 0 10px; position: relative; background-color: #fafafa; border-right: 1px solid #eee; box-sizing: border-box } #woocommerce-coupon-data ul.wc-tabs::after,#woocommerce-product-data ul.wc-tabs::after,.woocommerce ul.wc-tabs::after { content: ""; display: block; width: 100%; height: 9999em; position: absolute; bottom: -9999em; left: 0; background-color: #fafafa; border-right: 1px solid #eee } #woocommerce-coupon-data ul.wc-tabs li,#woocommerce-product-data ul.wc-tabs li,.woocommerce ul.wc-tabs li { margin: 0; padding: 0; display: block; position: relative } #woocommerce-coupon-data ul.wc-tabs li a,#woocommerce-product-data ul.wc-tabs li a,.woocommerce ul.wc-tabs li a { margin: 0; padding: 10px; display: block; box-shadow: none; text-decoration: none; line-height: 20px!important; border-bottom: 1px solid #eee } #woocommerce-coupon-data ul.wc-tabs li a span,#woocommerce-product-data ul.wc-tabs li a span,.woocommerce ul.wc-tabs li a span { margin-left: .618em; margin-right: .618em } #woocommerce-coupon-data ul.wc-tabs li a::before,#woocommerce-product-data ul.wc-tabs li a::before,.woocommerce ul.wc-tabs li a::before { font-family: Dashicons; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; -webkit-font-smoothing: antialiased; content: ""; text-decoration: none } #woocommerce-coupon-data ul.wc-tabs li.general_options a::before,#woocommerce-product-data ul.wc-tabs li.general_options a::before,.woocommerce ul.wc-tabs li.general_options a::before { content: "\f107" } #woocommerce-coupon-data ul.wc-tabs li.inventory_options a::before,#woocommerce-product-data ul.wc-tabs li.inventory_options a::before,.woocommerce ul.wc-tabs li.inventory_options a::before { content: "\f481" } #woocommerce-coupon-data ul.wc-tabs li.shipping_options a::before,#woocommerce-product-data ul.wc-tabs li.shipping_options a::before,.woocommerce ul.wc-tabs li.shipping_options a::before { font-family: WooCommerce; content: "\e01a" } #woocommerce-coupon-data ul.wc-tabs li.linked_product_options a::before,#woocommerce-product-data ul.wc-tabs li.linked_product_options a::before,.woocommerce ul.wc-tabs li.linked_product_options a::before { content: "\f103" } #woocommerce-coupon-data ul.wc-tabs li.attribute_options a::before,#woocommerce-product-data ul.wc-tabs li.attribute_options a::before,.woocommerce ul.wc-tabs li.attribute_options a::before { content: "\f175" } #woocommerce-coupon-data ul.wc-tabs li.advanced_options a::before,#woocommerce-product-data ul.wc-tabs li.advanced_options a::before,.woocommerce ul.wc-tabs li.advanced_options a::before { font-family: Dashicons; content: "\f111" } #woocommerce-coupon-data ul.wc-tabs li.marketplace-suggestions_options a::before,#woocommerce-product-data ul.wc-tabs li.marketplace-suggestions_options a::before,.woocommerce ul.wc-tabs li.marketplace-suggestions_options a::before { content: none } #woocommerce-coupon-data ul.wc-tabs li.variations_options a::before,#woocommerce-product-data ul.wc-tabs li.variations_options a::before,.woocommerce ul.wc-tabs li.variations_options a::before { content: "\f509" } #woocommerce-coupon-data ul.wc-tabs li.usage_restriction_options a::before,#woocommerce-product-data ul.wc-tabs li.usage_restriction_options a::before,.woocommerce ul.wc-tabs li.usage_restriction_options a::before { font-family: WooCommerce; content: "\e602" } #woocommerce-coupon-data ul.wc-tabs li.usage_limit_options a::before,#woocommerce-product-data ul.wc-tabs li.usage_limit_options a::before,.woocommerce ul.wc-tabs li.usage_limit_options a::before { font-family: WooCommerce; content: "\e601" } #woocommerce-coupon-data ul.wc-tabs li.general_coupon_data a::before,#woocommerce-product-data ul.wc-tabs li.general_coupon_data a::before,.woocommerce ul.wc-tabs li.general_coupon_data a::before { font-family: WooCommerce; content: "\e600" } #woocommerce-coupon-data ul.wc-tabs li.active a,#woocommerce-product-data ul.wc-tabs li.active a,.woocommerce ul.wc-tabs li.active a { color: #555; position: relative; background-color: #eee } .woocommerce_page_wc-settings input[type=email],.woocommerce_page_wc-settings input[type=url] { direction: ltr } .woocommerce_page_wc-settings .shippingrows th.check-column { padding-top: 20px } .woocommerce_page_wc-settings .shippingrows tfoot th { padding-left: 10px } .woocommerce_page_wc-settings .shippingrows .add.button::before { font-family: WooCommerce; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; -webkit-font-smoothing: antialiased; margin-right: .618em; content: ""; text-decoration: none } .woocommerce_page_wc-settings h3.wc-settings-sub-title { font-size: 1.2em } #woocommerce-coupon-data .inside,#woocommerce-order-data .inside,#woocommerce-order-downloads .inside,#woocommerce-product-data .inside,#woocommerce-product-type-options .inside { margin: 0; padding: 0 } .panel,.woocommerce_options_panel { padding: 9px; color: #555 } .panel .form-field .woocommerce-help-tip,.woocommerce_options_panel .form-field .woocommerce-help-tip { font-size: 1.4em } .panel,.woocommerce_page_settings .woocommerce_options_panel { padding: 0 } #woocommerce-product-specs .inside,#woocommerce-product-type-options .panel { margin: 0; padding: 9px } #woocommerce-product-type-options .panel p,.woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p { margin: 0 0 9px; font-size: 12px; padding: 5px 9px; line-height: 24px } #woocommerce-product-type-options .panel p::after,.woocommerce_options_panel fieldset.form-field::after,.woocommerce_options_panel p::after { content: "."; display: block; height: 0; clear: both; visibility: hidden } .woocommerce_options_panel .checkbox,.woocommerce_variable_attributes .checkbox { width: auto; margin: 4px 0!important; vertical-align: middle; float: left } .woocommerce_options_panel .downloadable_files table,.woocommerce_variations .downloadable_files table { width: 100%; padding: 0!important } .woocommerce_options_panel .downloadable_files table th,.woocommerce_variations .downloadable_files table th { padding: 7px 0 7px 7px!important } .woocommerce_options_panel .downloadable_files table th.sort,.woocommerce_variations .downloadable_files table th.sort { width: 17px; padding: 7px!important } .woocommerce_options_panel .downloadable_files table th .woocommerce-help-tip,.woocommerce_variations .downloadable_files table th .woocommerce-help-tip { font-size: 1.1em; margin-left: 0 } .woocommerce_options_panel .downloadable_files table td,.woocommerce_variations .downloadable_files table td { vertical-align: middle!important; padding: 4px 0 4px 7px!important; position: relative } .woocommerce_options_panel .downloadable_files table td:last-child,.woocommerce_variations .downloadable_files table td:last-child { padding-right: 7px!important } .woocommerce_options_panel .downloadable_files table td input.input_text,.woocommerce_variations .downloadable_files table td input.input_text { width: 100%; float: none; min-width: 0; margin: 1px 0 } .woocommerce_options_panel .downloadable_files table td .upload_file_button,.woocommerce_variations .downloadable_files table td .upload_file_button { width: auto; float: right; cursor: pointer } .woocommerce_options_panel .downloadable_files table td .delete,.woocommerce_variations .downloadable_files table td .delete { display: block; text-indent: -9999px; position: relative; height: 1em; width: 1em; font-size: 1.2em } .woocommerce_options_panel .downloadable_files table td .delete::before,.woocommerce_variations .downloadable_files table td .delete::before { font-family: Dashicons; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; -webkit-font-smoothing: antialiased; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: "ï…“"; color: #999 } .woocommerce_options_panel .downloadable_files table td .delete:hover::before,.woocommerce_variations .downloadable_files table td .delete:hover::before { color: #a00 } .woocommerce_options_panel .downloadable_files table td.sort,.woocommerce_variations .downloadable_files table td.sort { width: 17px; cursor: move; font-size: 15px; text-align: center; background: #f9f9f9; padding-right: 7px!important } .woocommerce_options_panel .downloadable_files table td.sort::before,.woocommerce_variations .downloadable_files table td.sort::before { content: "\f333"; font-family: Dashicons; text-align: center; line-height: 1; color: #999; display: block; width: 17px; float: left; height: 100% } .woocommerce_options_panel .downloadable_files table td.sort:hover::before,.woocommerce_variations .downloadable_files table td.sort:hover::before { color: #333 } .woocommerce_variation h3 .sort { width: 17px; height: 26px; cursor: move; float: right; font-size: 15px; font-weight: 400; margin-right: .5em; visibility: hidden; text-align: center; vertical-align: middle } .woocommerce_variation h3 .sort::before { content: "\f333"; font-family: Dashicons; text-align: center; line-height: 28px; color: #999; display: block; width: 17px; float: left; height: 100% } .woocommerce_variation h3 .sort:hover::before { color: #777 } .woocommerce_variation h3:hover .sort,.woocommerce_variation.ui-sortable-helper .sort { visibility: visible } .woocommerce_options_panel { min-height: 175px; box-sizing: border-box } .woocommerce_options_panel .downloadable_files { padding: 0 9px 0 162px; position: relative; margin: 9px 0 } .woocommerce_options_panel .downloadable_files label { position: absolute; left: 0; margin: 0 0 0 12px; line-height: 24px } .woocommerce_options_panel p { margin: 9px 0 } .woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p.form-field { padding: 5px 20px 5px 162px!important } .woocommerce_options_panel .sale_price_dates_fields .short:first-of-type { margin-bottom: 1em } .woocommerce_options_panel .sale_price_dates_fields .short:nth-of-type(2) { clear: left } .woocommerce_options_panel label,.woocommerce_options_panel legend { float: left; width: 150px; padding: 0; margin: 0 0 0 -150px } .woocommerce_options_panel label .req,.woocommerce_options_panel legend .req { font-weight: 700; font-style: normal; color: #a00 } .woocommerce_options_panel .description { padding: 0; margin: 0 0 0 7px; clear: none; display: inline } .woocommerce_options_panel .description-block { margin-left: 0; display: block } .woocommerce_options_panel input,.woocommerce_options_panel select,.woocommerce_options_panel textarea { margin: 0 } .woocommerce_options_panel textarea { float: left; height: 3.5em; line-height: 1.5em; vertical-align: top } .woocommerce_options_panel input[type=email],.woocommerce_options_panel input[type=number],.woocommerce_options_panel input[type=password],.woocommerce_options_panel input[type=text] { width: 50%; float: left } .woocommerce_options_panel input.button { width: auto; margin-left: 8px } .woocommerce_options_panel select { float: left } .woocommerce_options_panel .short,.woocommerce_options_panel input[type=email].short,.woocommerce_options_panel input[type=number].short,.woocommerce_options_panel input[type=password].short,.woocommerce_options_panel input[type=text].short { width: 50% } .woocommerce_options_panel .sized { width: auto!important; margin-right: 6px } .woocommerce_options_panel .options_group { border-top: 1px solid #fff; border-bottom: 1px solid #eee } .woocommerce_options_panel .options_group:first-child { border-top: 0 } .woocommerce_options_panel .options_group:last-child { border-bottom: 0 } .woocommerce_options_panel .options_group fieldset { margin: 9px 0; font-size: 12px; padding: 5px 9px; line-height: 24px } .woocommerce_options_panel .options_group fieldset label { width: auto; float: none } .woocommerce_options_panel .options_group fieldset ul { float: left; width: 50%; margin: 0; padding: 0 } .woocommerce_options_panel .options_group fieldset ul li { margin: 0; width: auto } .woocommerce_options_panel .options_group fieldset ul li input { width: auto; float: none; margin-right: 4px } .woocommerce_options_panel .options_group fieldset ul.wc-radios label { margin-left: 0 } .woocommerce_options_panel .dimensions_field .wrap { display: block; width: 50% } .woocommerce_options_panel .dimensions_field .wrap input { width: 30.75%; margin-right: 3.8% } .woocommerce_options_panel .dimensions_field .wrap .last { margin-right: 0 } .woocommerce_options_panel.padded { padding: 1em } .woocommerce_options_panel .select2-container { float: left } #woocommerce-product-data input.dp-applied { float: left } #grouped_product_options,#simple_product_options,#virtual_product_options { padding: 12px; font-style: italic; color: #666 } .wc-metaboxes-wrapper .toolbar { margin: 0!important; border-top: 1px solid #fff; border-bottom: 1px solid #eee; padding: 9px 12px!important } .wc-metaboxes-wrapper .toolbar:first-child { border-top: 0 } .wc-metaboxes-wrapper .toolbar:last-child { border-bottom: 0 } .wc-metaboxes-wrapper .toolbar .add_variation { float: right; margin-left: 5px } .wc-metaboxes-wrapper .toolbar .cancel-variation-changes,.wc-metaboxes-wrapper .toolbar .save-variation-changes { float: left; margin-right: 5px } .wc-metaboxes-wrapper p.toolbar { overflow: hidden; zoom:1} .wc-metaboxes-wrapper .expand-close { margin-right: 2px; color: #777; font-size: 12px; font-style: italic } .wc-metaboxes-wrapper .expand-close a { background: 0 0; padding: 0; font-size: 12px; text-decoration: none } .wc-metaboxes-wrapper#product_attributes .expand-close { float: right; line-height: 28px } .wc-metaboxes-wrapper .fr,.wc-metaboxes-wrapper button.add_variable_attribute { float: right; margin: 0 0 0 6px } .wc-metaboxes-wrapper .wc-metaboxes { border-bottom: 1px solid #eee } .wc-metaboxes-wrapper .wc-metabox-sortable-placeholder { border-color: #bbb; background-color: #f5f5f5; margin-bottom: 9px; border-width: 1px; border-style: dashed } .wc-metaboxes-wrapper .wc-metabox { background: #fff; border-bottom: 1px solid #eee; margin: 0!important } .wc-metaboxes-wrapper .wc-metabox select { font-weight: 400 } .wc-metaboxes-wrapper .wc-metabox:last-of-type { border-bottom: 0 } .wc-metaboxes-wrapper .wc-metabox .handlediv { width: 27px } .wc-metaboxes-wrapper .wc-metabox .handlediv::before { content: "\f142"!important; cursor: pointer; display: inline-block; font: 400 20px/1 Dashicons; line-height: .5!important; padding: 8px 10px; position: relative; right: 12px; top: 0 } .wc-metaboxes-wrapper .wc-metabox.closed { border-radius: 3px } .wc-metaboxes-wrapper .wc-metabox.closed .handlediv::before { content: "\f140"!important } .wc-metaboxes-wrapper .wc-metabox.closed h3 { border: 0 } .wc-metaboxes-wrapper .wc-metabox h3 { margin: 0!important; padding: .75em .75em .75em 1em!important; font-size: 1em!important; overflow: hidden; zoom:1;cursor: move } .wc-metaboxes-wrapper .wc-metabox h3 a.delete,.wc-metaboxes-wrapper .wc-metabox h3 button { float: right } .wc-metaboxes-wrapper .wc-metabox h3 a.delete { color: red; font-weight: 400; line-height: 26px; text-decoration: none; position: relative; visibility: hidden } .wc-metaboxes-wrapper .wc-metabox h3 strong { font-weight: 400; line-height: 26px; font-weight: 700 } .wc-metaboxes-wrapper .wc-metabox h3 select { font-family: sans-serif; max-width: 20%; margin: .25em .25em .25em 0 } .wc-metaboxes-wrapper .wc-metabox h3 .handlediv { background-position: 6px 5px!important; visibility: hidden; height: 26px } .wc-metaboxes-wrapper .wc-metabox h3.fixed { cursor: pointer!important } .wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 { cursor: pointer; padding: .5em .75em .5em 1em!important } .wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 .handlediv,.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 .sort,.wc-metaboxes-wrapper .wc-metabox.woocommerce_variation h3 a.delete { margin-top: .25em } .wc-metaboxes-wrapper .wc-metabox h3:hover .handlediv,.wc-metaboxes-wrapper .wc-metabox h3:hover a.delete,.wc-metaboxes-wrapper .wc-metabox.ui-sortable-helper .handlediv,.wc-metaboxes-wrapper .wc-metabox.ui-sortable-helper a.delete { visibility: visible } .wc-metaboxes-wrapper .wc-metabox table { width: 100%; position: relative; background-color: #fdfdfd; padding: 1em; border-top: 1px solid #eee } .wc-metaboxes-wrapper .wc-metabox table td { text-align: left; padding: 0 6px 1em 0; vertical-align: top; border: 0 } .wc-metaboxes-wrapper .wc-metabox table td label { text-align: left; display: block; line-height: 21px } .wc-metaboxes-wrapper .wc-metabox table td input { float: left; min-width: 200px } .wc-metaboxes-wrapper .wc-metabox table td input,.wc-metaboxes-wrapper .wc-metabox table td textarea { width: 100%; margin: 0; display: block; font-size: 14px; padding: 4px; color: #555 } .wc-metaboxes-wrapper .wc-metabox table td .select2-container,.wc-metaboxes-wrapper .wc-metabox table td select { width: 100%!important } .wc-metaboxes-wrapper .wc-metabox table td input.short { width: 200px } .wc-metaboxes-wrapper .wc-metabox table td input.checkbox { width: 16px; min-width: inherit; vertical-align: text-bottom; display: inline-block; float: none } .wc-metaboxes-wrapper .wc-metabox table td.attribute_name { width: 200px } .wc-metaboxes-wrapper .wc-metabox table .minus,.wc-metaboxes-wrapper .wc-metabox table .plus { margin-top: 6px } .wc-metaboxes-wrapper .wc-metabox table .fl { float: left } .wc-metaboxes-wrapper .wc-metabox table .fr { float: right } .variations-pagenav { float: right; line-height: 24px } .variations-pagenav .displaying-num { color: #777; font-size: 12px; font-style: italic } .variations-pagenav a { padding: 0 10px 3px; background: rgba(0,0,0,.05); font-size: 16px; font-weight: 400; text-decoration: none } .variations-pagenav a.disabled,.variations-pagenav a.disabled:active,.variations-pagenav a.disabled:focus,.variations-pagenav a.disabled:hover { color: #a0a5aa; background: rgba(0,0,0,.05) } .variations-defaults { float: left } .variations-defaults select { margin: .25em .25em .25em 0 } .woocommerce_variable_attributes { background-color: #fdfdfd; border-top: 1px solid #eee } .woocommerce_variable_attributes .data { padding: 1em 2em } .woocommerce_variable_attributes .data::after,.woocommerce_variable_attributes .data::before { content: ' '; display: table } .woocommerce_variable_attributes .data::after { clear: both } .woocommerce_variable_attributes .upload_image_button { display: block; width: 64px; height: 64px; float: left; margin-right: 20px; position: relative; cursor: pointer } .woocommerce_variable_attributes .upload_image_button img { width: 100%; height: auto; display: none } .woocommerce_variable_attributes .upload_image_button::before { content: "\f128"; font-family: Dashicons; position: absolute; top: 0; left: 0; right: 0; bottom: 0; text-align: center; line-height: 64px; font-size: 64px; font-weight: 400; -webkit-font-smoothing: antialiased } .woocommerce_variable_attributes .upload_image_button.remove img { display: block } .woocommerce_variable_attributes .upload_image_button.remove::before { content: "\f335"; display: none } .woocommerce_variable_attributes .upload_image_button.remove:hover::before { display: block } .woocommerce_variable_attributes .options { border: 1px solid #eee; border-width: 1px 0; padding: .25em 0 } .woocommerce_variable_attributes .options label { display: inline-block; padding: 4px 1em 2px 0 } .woocommerce_variable_attributes .options input[type=checkbox] { margin: 0 5px 0 .5em!important; vertical-align: middle } .form-row label { display: inline-block } .form-row .woocommerce-help-tip { float: right } .form-row input[type=color],.form-row input[type=date],.form-row input[type=datetime-local],.form-row input[type=datetime],.form-row input[type=email],.form-row input[type=month],.form-row input[type=number],.form-row input[type=password],.form-row input[type=search],.form-row input[type=tel],.form-row input[type=text],.form-row input[type=time],.form-row input[type=url],.form-row input[type=week],.form-row select,.form-row textarea { width: 100%; vertical-align: middle; margin: 2px 0 0; padding: 5px } .form-row select { height: 30px; line-height: 30px } .form-row.dimensions_field .wrap { clear: left; display: block } .form-row.dimensions_field input { width: 33%; float: left; vertical-align: middle } .form-row.dimensions_field input:last-of-type { margin-right: 0; width: 34% } .form-row.form-row-first,.form-row.form-row-last { width: 48%; float: right } .form-row.form-row-first { clear: both; float: left } .form-row.form-row-full { clear: both } .tips { cursor: help; text-decoration: none } img.tips { padding: 5px 0 0 } #tiptip_holder { display: none; z-index: 8675309; position: absolute; top: 0; left: 0 } #tiptip_holder.tip_top { padding-bottom: 5px } #tiptip_holder.tip_top #tiptip_arrow_inner { margin-top: -7px; margin-left: -6px; border-top-color: #333 } #tiptip_holder.tip_bottom { padding-top: 5px } #tiptip_holder.tip_bottom #tiptip_arrow_inner { margin-top: -5px; margin-left: -6px; border-bottom-color: #333 } #tiptip_holder.tip_right { padding-left: 5px } #tiptip_holder.tip_right #tiptip_arrow_inner { margin-top: -6px; margin-left: -5px; border-right-color: #333 } #tiptip_holder.tip_left { padding-right: 5px } #tiptip_holder.tip_left #tiptip_arrow_inner { margin-top: -6px; margin-left: -7px; border-left-color: #333 } #tiptip_content,.chart-tooltip,.wc_error_tip { color: #fff; font-size: .8em; max-width: 150px; background: #333; text-align: center; border-radius: 3px; padding: .618em 1em; box-shadow: 0 1px 3px rgba(0,0,0,.2) } #tiptip_content code,.chart-tooltip code,.wc_error_tip code { padding: 1px; background: #888 } #tiptip_arrow,#tiptip_arrow_inner { position: absolute; border-color: transparent; border-style: solid; border-width: 6px; height: 0; width: 0 } .wc_error_tip { max-width: 20em; line-height: 1.8em; position: absolute; white-space: normal; background: #d82223; margin: 1.5em 1px 0 -1em; z-index: 9999999 } .wc_error_tip::after { content: ""; display: block; border: 8px solid #d82223; border-right-color: transparent; border-left-color: transparent; border-top-color: transparent; position: absolute; top: -3px; left: 50%; margin: -1em 0 0 -3px } img.ui-datepicker-trigger { vertical-align: middle; margin-top: -1px; cursor: pointer } .wc-metabox-content img.ui-datepicker-trigger,.woocommerce_options_panel img.ui-datepicker-trigger { float: left; margin-right: 8px; margin-top: 4px; margin-left: 4px } #ui-datepicker-div { display: none } .woocommerce-reports-remove-filter { color: red; text-decoration: none } .woocommerce-reports-wide.woocommerce-reports-wrap,.woocommerce-reports-wrap.woocommerce-reports-wrap { margin-left: 300px; padding-top: 18px } .woocommerce-reports-wide.halved,.woocommerce-reports-wrap.halved { margin: 0; overflow: hidden; zoom:1} .woocommerce-reports-wide .widefat th,.woocommerce-reports-wrap .widefat th { padding: 7px } .woocommerce-reports-wide .widefat td,.woocommerce-reports-wrap .widefat td { vertical-align: top; padding: 7px } .woocommerce-reports-wide .widefat td .description,.woocommerce-reports-wrap .widefat td .description { margin: 4px 0 0 } .woocommerce-reports-wide .postbox::after,.woocommerce-reports-wrap .postbox::after { content: "."; display: block; height: 0; clear: both; visibility: hidden } .woocommerce-reports-wide .postbox h3,.woocommerce-reports-wrap .postbox h3 { cursor: default!important } .woocommerce-reports-wide .postbox .inside,.woocommerce-reports-wrap .postbox .inside { padding: 10px; margin: 0!important } .woocommerce-reports-wide .postbox div.stats_range,.woocommerce-reports-wide .postbox h3.stats_range,.woocommerce-reports-wrap .postbox div.stats_range,.woocommerce-reports-wrap .postbox h3.stats_range { border-bottom-color: #dfdfdf; margin: 0; padding: 0!important } .woocommerce-reports-wide .postbox div.stats_range .export_csv,.woocommerce-reports-wide .postbox h3.stats_range .export_csv,.woocommerce-reports-wrap .postbox div.stats_range .export_csv,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv { float: right; line-height: 26px; border-left: 1px solid #dfdfdf; padding: 10px; display: block; text-decoration: none } .woocommerce-reports-wide .postbox div.stats_range .export_csv::before,.woocommerce-reports-wide .postbox h3.stats_range .export_csv::before,.woocommerce-reports-wrap .postbox div.stats_range .export_csv::before,.woocommerce-reports-wrap .postbox h3.stats_range .export_csv::before { font-family: Dashicons; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; -webkit-font-smoothing: antialiased; content: "ï†"; text-decoration: none; margin-right: 4px } .woocommerce-reports-wide .postbox div.stats_range ul,.woocommerce-reports-wide .postbox h3.stats_range ul,.woocommerce-reports-wrap .postbox div.stats_range ul,.woocommerce-reports-wrap .postbox h3.stats_range ul { list-style: none outside; margin: 0; padding: 0; zoom:1;background: #f5f5f5; border-bottom: 1px solid #ccc } .woocommerce-reports-wide .postbox div.stats_range ul::after,.woocommerce-reports-wide .postbox div.stats_range ul::before,.woocommerce-reports-wide .postbox h3.stats_range ul::after,.woocommerce-reports-wide .postbox h3.stats_range ul::before,.woocommerce-reports-wrap .postbox div.stats_range ul::after,.woocommerce-reports-wrap .postbox div.stats_range ul::before,.woocommerce-reports-wrap .postbox h3.stats_range ul::after,.woocommerce-reports-wrap .postbox h3.stats_range ul::before { content: " "; display: table } .woocommerce-reports-wide .postbox div.stats_range ul::after,.woocommerce-reports-wide .postbox h3.stats_range ul::after,.woocommerce-reports-wrap .postbox div.stats_range ul::after,.woocommerce-reports-wrap .postbox h3.stats_range ul::after { clear: both } .woocommerce-reports-wide .postbox div.stats_range ul li,.woocommerce-reports-wide .postbox h3.stats_range ul li,.woocommerce-reports-wrap .postbox div.stats_range ul li,.woocommerce-reports-wrap .postbox h3.stats_range ul li { float: left; margin: 0; padding: 0; line-height: 26px; font-weight: 700; font-size: 14px } .woocommerce-reports-wide .postbox div.stats_range ul li a,.woocommerce-reports-wide .postbox h3.stats_range ul li a,.woocommerce-reports-wrap .postbox div.stats_range ul li a,.woocommerce-reports-wrap .postbox h3.stats_range ul li a { border-right: 1px solid #dfdfdf; padding: 10px; display: block; text-decoration: none } .woocommerce-reports-wide .postbox div.stats_range ul li.active,.woocommerce-reports-wide .postbox h3.stats_range ul li.active,.woocommerce-reports-wrap .postbox div.stats_range ul li.active,.woocommerce-reports-wrap .postbox h3.stats_range ul li.active { background: #fff; box-shadow: 0 4px 0 0 #fff } .woocommerce-reports-wide .postbox div.stats_range ul li.active a,.woocommerce-reports-wide .postbox h3.stats_range ul li.active a,.woocommerce-reports-wrap .postbox div.stats_range ul li.active a,.woocommerce-reports-wrap .postbox h3.stats_range ul li.active a { color: #777 } .woocommerce-reports-wide .postbox div.stats_range ul li.custom,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom { padding: 9px 10px; vertical-align: middle } .woocommerce-reports-wide .postbox div.stats_range ul li.custom div,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form { display: inline; margin: 0 } .woocommerce-reports-wide .postbox div.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form input.range_datepicker,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div input.range_datepicker,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form input.range_datepicker { padding: 0; margin: 0 10px 0 0; background: 0 0; border: 0; color: #777; text-align: center; box-shadow: none } .woocommerce-reports-wide .postbox div.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wide .postbox div.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wide .postbox h3.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wrap .postbox div.stats_range ul li.custom form input.range_datepicker.from,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom div input.range_datepicker.from,.woocommerce-reports-wrap .postbox h3.stats_range ul li.custom form input.range_datepicker.from { margin-right: 0 } .woocommerce-reports-wide .postbox .chart-with-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar { padding: 12px 12px 12px 249px; margin: 0!important } .woocommerce-reports-wide .postbox .chart-with-sidebar .chart-sidebar,.woocommerce-reports-wrap .postbox .chart-with-sidebar .chart-sidebar { width: 225px; margin-left: -237px; float: left } .woocommerce-reports-wide .postbox .chart-widgets,.woocommerce-reports-wrap .postbox .chart-widgets { margin: 0; padding: 0 } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget { margin: 0 0 1em; background: #fafafa; border: 1px solid #dfdfdf } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget::after { content: "."; display: block; height: 0; clear: both; visibility: hidden } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget h4,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget h4 { background: #fff; border: 1px solid #dfdfdf; border-left-width: 0; border-right-width: 0; padding: 10px; margin: 0; color: #2ea2cc; border-top-width: 0; background-image: -webkit-gradient(linear,left bottom,left top,from(#ececec),to(#f9f9f9)); background-image: -webkit-linear-gradient(bottom,#ececec,#f9f9f9); background-image: linear-gradient(to top,#ececec,#f9f9f9) } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget h4.section_title:hover,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget h4.section_title:hover { color: #a00 } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title { cursor: pointer } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title span,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title span { display: block } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title span::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title span::after { font-family: WooCommerce; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; -webkit-font-smoothing: antialiased; margin-left: .618em; content: ""; text-decoration: none; float: right; font-size: .9em; line-height: 1.618 } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title.open,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title.open { color: #333 } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section_title.open span::after,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section_title.open span::after { display: none } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section { border-bottom: 1px solid #dfdfdf } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section .select2-container,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section .select2-container { width: 100%!important } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .section:last-of-type,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .section:last-of-type { border-radius: 0 0 3px 3px } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table { width: 100% } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td { padding: 7px 10px; vertical-align: top; border-top: 1px solid #e5e5e5; line-height: 1.4em } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table tr:first-child td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table tr:first-child td { border-top: 0 } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.count,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.count { background: #f5f5f5 } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.name,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.name { max-width: 175px } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.name a,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.name a { word-wrap: break-word } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table td.sparkline,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table td.sparkline { vertical-align: middle } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table .wc_sparkline,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table .wc_sparkline { width: 32px; height: 1em; display: block; float: right } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget table tr.active td,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget table tr.active td { background: #f5f5f5 } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget form,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget p,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget form,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget p { margin: 0; padding: 10px } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget form .submit,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget p .submit,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget form .submit,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget p .submit { margin-top: 10px } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget #product_ids,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget #product_ids { width: 100% } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .select_all,.woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .select_none,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .select_all,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .select_none { float: right; color: #999; margin-left: 4px; margin-top: 10px } .woocommerce-reports-wide .postbox .chart-widgets li.chart-widget .description,.woocommerce-reports-wrap .postbox .chart-widgets li.chart-widget .description { margin-left: .5em; font-weight: 400; opacity: .8 } .woocommerce-reports-wide .postbox .chart-legend,.woocommerce-reports-wrap .postbox .chart-legend { list-style: none outside; margin: 0 0 1em; padding: 0; border: 1px solid #dfdfdf; border-right-width: 0; border-bottom-width: 0; background: #fff } .woocommerce-reports-wide .postbox .chart-legend li,.woocommerce-reports-wrap .postbox .chart-legend li { border-right: 5px solid #aaa; color: #aaa; padding: 1em; display: block; margin: 0; -webkit-transition: all ease .5s; transition: all ease .5s; box-shadow: inset 0 -1px 0 0 #dfdfdf } .woocommerce-reports-wide .postbox .chart-legend li strong,.woocommerce-reports-wrap .postbox .chart-legend li strong { font-size: 1.618em; line-height: 1.2em; color: #464646; font-weight: 400; display: block; font-family: HelveticaNeue-Light,"Helvetica Neue Light","Helvetica Neue",sans-serif } .woocommerce-reports-wide .postbox .chart-legend li strong del,.woocommerce-reports-wrap .postbox .chart-legend li strong del { color: #e74c3c; font-weight: 400 } .woocommerce-reports-wide .postbox .chart-legend li:hover,.woocommerce-reports-wrap .postbox .chart-legend li:hover { box-shadow: inset 0 -1px 0 0 #dfdfdf,inset 300px 0 0 rgba(156,93,144,.1); border-right: 5px solid #9c5d90!important; padding-left: 1.5em; color: #9c5d90 } .woocommerce-reports-wide .postbox .pie-chart-legend,.woocommerce-reports-wrap .postbox .pie-chart-legend { margin: 12px 0 0; overflow: hidden } .woocommerce-reports-wide .postbox .pie-chart-legend li,.woocommerce-reports-wrap .postbox .pie-chart-legend li { float: left; margin: 0; padding: 6px 0 0; border-top: 4px solid #999; text-align: center; box-sizing: border-box; width: 50% } .woocommerce-reports-wide .postbox .stat,.woocommerce-reports-wrap .postbox .stat { font-size: 1.5em!important; font-weight: 700; text-align: center } .woocommerce-reports-wide .postbox .chart-placeholder,.woocommerce-reports-wrap .postbox .chart-placeholder { width: 100%; height: 650px; overflow: hidden; position: relative } .woocommerce-reports-wide .postbox .chart-prompt,.woocommerce-reports-wrap .postbox .chart-prompt { line-height: 650px; margin: 0; color: #999; font-size: 1.2em; font-style: italic; text-align: center } .woocommerce-reports-wide .postbox .chart-container,.woocommerce-reports-wrap .postbox .chart-container { background: #fff; padding: 12px; position: relative; border: 1px solid #dfdfdf; border-radius: 3px } .woocommerce-reports-wide .postbox .main .chart-legend,.woocommerce-reports-wrap .postbox .main .chart-legend { margin-top: 12px } .woocommerce-reports-wide .postbox .main .chart-legend li,.woocommerce-reports-wrap .postbox .main .chart-legend li { border-right: 0; margin: 0 8px 0 0; float: left; border-top: 4px solid #aaa } .woocommerce-reports-wide .woocommerce-reports-main,.woocommerce-reports-wrap .woocommerce-reports-main { float: left; min-width: 100% } .woocommerce-reports-wide .woocommerce-reports-main table td,.woocommerce-reports-wrap .woocommerce-reports-main table td { padding: 9px } .woocommerce-reports-wide .woocommerce-reports-sidebar,.woocommerce-reports-wrap .woocommerce-reports-sidebar { display: inline; width: 281px; margin-left: -300px; clear: both; float: left } .woocommerce-reports-wide .woocommerce-reports-left,.woocommerce-reports-wrap .woocommerce-reports-left { width: 49.5%; float: left } .woocommerce-reports-wide .woocommerce-reports-right,.woocommerce-reports-wrap .woocommerce-reports-right { width: 49.5%; float: right } .woocommerce-wide-reports-wrap { padding-bottom: 11px } .woocommerce-wide-reports-wrap .widefat .export-data { float: right } .woocommerce-wide-reports-wrap .widefat td,.woocommerce-wide-reports-wrap .widefat th { vertical-align: middle; padding: 7px } form.report_filters p { vertical-align: middle } form.report_filters div,form.report_filters input,form.report_filters label { vertical-align: middle } .chart-tooltip { position: absolute; display: none; line-height: 1 } table.bar_chart { width: 100% } table.bar_chart thead th { text-align: left; color: #ccc; padding: 6px 0 } table.bar_chart tbody th { padding: 6px 0; width: 25%; text-align: left!important; font-weight: 400!important; border-bottom: 1px solid #fee } table.bar_chart tbody td { text-align: right; line-height: 24px; padding: 6px 6px 6px 0; border-bottom: 1px solid #fee } table.bar_chart tbody td span { color: #8a4b75; display: block } table.bar_chart tbody td span.alt { color: #47a03e; margin-top: 6px } table.bar_chart tbody td.bars { position: relative; text-align: left; padding: 6px 6px 6px 0; border-bottom: 1px solid #fee } table.bar_chart tbody td.bars a,table.bar_chart tbody td.bars span { text-decoration: none; clear: both; background: #8a4b75; float: left; display: block; line-height: 24px; height: 24px; border-radius: 3px } table.bar_chart tbody td.bars span.alt { clear: both; background: #47a03e } table.bar_chart tbody td.bars span.alt span { margin: 0; color: #c5dec2!important; text-shadow: 0 1px 0 #47a03e; background: 0 0 } .post-type-shop_order .woocommerce-BlankState-message::before { font-family: WooCommerce; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: "î€" } .post-type-shop_coupon .woocommerce-BlankState-message::before { font-family: WooCommerce; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: "" } .post-type-product .woocommerce-BlankState-message::before { font-family: WooCommerce; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: "" } .woocommerce-BlankState--api .woocommerce-BlankState-message::before { font-family: WooCommerce; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: "" } .woocommerce-BlankState--webhooks .woocommerce-BlankState-message::before { font-family: WooCommerce; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: "" } .woocommerce-BlankState { text-align: center; padding: 5em 0 0 } .woocommerce-BlankState .woocommerce-BlankState-message { color: #aaa; margin: 0 auto 1.5em; line-height: 1.5em; font-size: 1.2em; max-width: 500px } .woocommerce-BlankState .woocommerce-BlankState-message::before { color: #ddd; text-shadow: 0 -1px 1px rgba(0,0,0,.2),0 1px 0 rgba(255,255,255,.8); font-size: 8em; display: block; position: relative!important; top: auto; left: auto; line-height: 1em; margin: 0 0 .1875em } .woocommerce-BlankState .woocommerce-BlankState-cta { font-size: 1.2em; padding: .75em 1.5em; margin: 0 .25em; height: auto; display: inline-block!important } .post-type-product .woocommerce-BlankState,.post-type-shop_order .woocommerce-BlankState { max-width: 764px; text-align: center; margin: auto } .post-type-product .woocommerce-BlankState .woocommerce-BlankState-message,.post-type-shop_order .woocommerce-BlankState .woocommerce-BlankState-message { color: #444; font-size: 1.5em; margin: 0 auto 1em } .post-type-product .woocommerce-BlankState .woocommerce-BlankState-message::before,.post-type-shop_order .woocommerce-BlankState .woocommerce-BlankState-message::before { font-size: 120px } .post-type-product .woocommerce-BlankState .woocommerce-BlankState-buttons,.post-type-shop_order .woocommerce-BlankState .woocommerce-BlankState-buttons { margin-bottom: 4em } @media only screen and (max-width: 1280px) { #order_data .order_data_column { width:48% } #order_data .order_data_column:first-child { width: 100% } .woocommerce_options_panel .description { display: block; clear: both; margin-left: 0 } .woocommerce_options_panel .dimensions_field .wrap,.woocommerce_options_panel .short,.woocommerce_options_panel input[type=email].short,.woocommerce_options_panel input[type=number].short,.woocommerce_options_panel input[type=password].short,.woocommerce_options_panel input[type=text].short { width: 80% } .woocommerce_options_panel .downloadable_files,.woocommerce_variations .downloadable_files { padding: 0; clear: both } .woocommerce_options_panel .downloadable_files label,.woocommerce_variations .downloadable_files label { position: static } .woocommerce_options_panel .downloadable_files table,.woocommerce_variations .downloadable_files table { margin: 0 12px 24px; width: 94% } .woocommerce_options_panel .downloadable_files table .sort,.woocommerce_variations .downloadable_files table .sort { visibility: hidden } .woocommerce_options_panel .woocommerce_variable_attributes .downloadable_files table,.woocommerce_variations .woocommerce_variable_attributes .downloadable_files table { margin: 0 0 1em; width: 100% } } @media only screen and (max-width: 900px) { #woocommerce-coupon-data ul.coupon_data_tabs,#woocommerce-product-data .wc-tabs-back,#woocommerce-product-data ul.product_data_tabs { width:10% } #woocommerce-coupon-data .wc-metaboxes-wrapper,#woocommerce-coupon-data .woocommerce_options_panel,#woocommerce-product-data .wc-metaboxes-wrapper,#woocommerce-product-data .woocommerce_options_panel { width: 90% } #woocommerce-coupon-data ul.coupon_data_tabs li a,#woocommerce-product-data ul.product_data_tabs li a { position: relative; text-indent: -999px; padding: 10px } #woocommerce-coupon-data ul.coupon_data_tabs li a::before,#woocommerce-product-data ul.product_data_tabs li a::before { position: absolute; top: 0; right: 0; bottom: 0; left: 0; text-indent: 0; text-align: center; line-height: 40px; width: 100%; height: 40px } } @media only screen and (max-width: 782px) { #wp-excerpt-media-buttons a { font-size:16px; line-height: 37px; height: 39px; padding: 0 20px 0 15px } #wp-excerpt-editor-tools { padding-top: 20px; padding-right: 15px; overflow: hidden; margin-bottom: -1px } #woocommerce-product-data .checkbox { width: 25px } .variations-pagenav { float: none; text-align: center; font-size: 18px } .variations-pagenav .displaying-num { font-size: 16px } .variations-pagenav a { padding: 8px 20px 11px; font-size: 18px } .variations-pagenav select { padding: 0 20px } .variations-defaults { float: none; text-align: center; margin-top: 10px } .post-type-product .wp-list-table .column-thumb { display: none; text-align: left; padding-bottom: 0 } .post-type-product .wp-list-table .column-thumb::before { display: none!important } .post-type-product .wp-list-table .column-thumb img { max-width: 32px } .post-type-product .wp-list-table .is-expanded td:not(.hidden) { overflow: visible } .post-type-product .wp-list-table .toggle-row { top: -28px } .post-type-shop_order .wp-list-table .column-customer_message,.post-type-shop_order .wp-list-table .column-order_notes { text-align: inherit } .post-type-shop_order .wp-list-table .column-order_notes .note-on { font-size: 1.3em; margin: 0 } .post-type-shop_order .wp-list-table .is-expanded td:not(.hidden) { overflow: visible } .post-type-shop_order .wp-list-table .toggle-row { top: -15px } } @media only screen and (max-width: 500px) { .woocommerce_options_panel label,.woocommerce_options_panel legend { float:none; width: auto; display: block; margin: 0 } .woocommerce_options_panel fieldset.form-field,.woocommerce_options_panel p.form-field { padding: 5px 20px!important } .addons-wcs-banner-block { -webkit-box-orient: vertical; -webkit-box-direction: normal; -webkit-flex-direction: column; flex-direction: column } .wc_addons_wrap .addons-wcs-banner-block { padding: 40px } .wc_addons_wrap .addons-wcs-banner-block-image { padding: 1em; text-align: center; width: 100%; padding: 2em 0; margin: 0 } .wc_addons_wrap .addons-wcs-banner-block-image .addons-img { margin: 0 } } .wc-backbone-modal * { box-sizing: border-box } .wc-backbone-modal .wc-backbone-modal-content { position: fixed; background: #fff; z-index: 100000; left: 50%; top: 50%; -webkit-transform: translate(-50%,-50%); -ms-transform: translate(-50%,-50%); transform: translate(-50%,-50%); max-width: 100%; min-width: 500px } .wc-backbone-modal .wc-backbone-modal-content article { overflow: auto } .wc-backbone-modal.wc-backbone-modal-shipping-method-settings .wc-backbone-modal-content { width: 75%; min-width: 500px } .wc-backbone-modal .select2-container { width: 100%!important } @media screen and (max-width: 782px) { .wc-backbone-modal .wc-backbone-modal-content { width:100%; height: 100%; min-width: 100% } } .wc-backbone-modal-backdrop { position: fixed; top: 0; left: 0; right: 0; bottom: 0; min-height: 360px; background: #000; opacity: .7; z-index: 99900 } .wc-backbone-modal-main { padding-bottom: 55px } .wc-backbone-modal-main article,.wc-backbone-modal-main header { display: block; position: relative } .wc-backbone-modal-main .wc-backbone-modal-header { height: auto; background: #fcfcfc; padding: 1em 1.5em; border-bottom: 1px solid #ddd } .wc-backbone-modal-main .wc-backbone-modal-header h1 { margin: 0; font-size: 18px; font-weight: 700; line-height: 1.5em } .wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link { cursor: pointer; color: #777; height: 54px; width: 54px; padding: 0; position: absolute; top: 0; right: 0; text-align: center; border: 0; border-left: 1px solid #ddd; background-color: transparent; -webkit-transition: color .1s ease-in-out,background .1s ease-in-out; transition: color .1s ease-in-out,background .1s ease-in-out } .wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link::before { font: normal 22px/50px dashicons!important; color: #666; display: block; content: "\f335"; font-weight: 300 } .wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:focus,.wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:hover { background: #ddd; border-color: #ccc; color: #000 } .wc-backbone-modal-main .wc-backbone-modal-header .modal-close-link:focus { outline: 0 } .wc-backbone-modal-main article { padding: 1.5em } .wc-backbone-modal-main article p { margin: 1.5em 0 } .wc-backbone-modal-main article p:first-child { margin-top: 0 } .wc-backbone-modal-main article p:last-child { margin-bottom: 0 } .wc-backbone-modal-main article .pagination { padding: 10px 0 0; text-align: center } .wc-backbone-modal-main article table.widefat { margin: 0; width: 100%; border: 0; box-shadow: none } .wc-backbone-modal-main article table.widefat thead th { padding: 0 1em 1em 1em; text-align: left } .wc-backbone-modal-main article table.widefat thead th:first-child { padding-left: 0 } .wc-backbone-modal-main article table.widefat thead th:last-child { padding-right: 0; text-align: right } .wc-backbone-modal-main article table.widefat tbody td,.wc-backbone-modal-main article table.widefat tbody th { padding: 1em; text-align: left; vertical-align: middle } .wc-backbone-modal-main article table.widefat tbody td:first-child,.wc-backbone-modal-main article table.widefat tbody th:first-child { padding-left: 0 } .wc-backbone-modal-main article table.widefat tbody td:last-child,.wc-backbone-modal-main article table.widefat tbody th:last-child { padding-right: 0; text-align: right } .wc-backbone-modal-main article table.widefat tbody td .select2-container,.wc-backbone-modal-main article table.widefat tbody td select,.wc-backbone-modal-main article table.widefat tbody th .select2-container,.wc-backbone-modal-main article table.widefat tbody th select { width: 100% } .wc-backbone-modal-main footer { position: absolute; left: 0; right: 0; bottom: 0; z-index: 100; padding: 1em 1.5em; background: #fcfcfc; border-top: 1px solid #dfdfdf; box-shadow: 0 -4px 4px -4px rgba(0,0,0,.1) } .wc-backbone-modal-main footer .inner { text-align: right; line-height: 23px } .wc-backbone-modal-main footer .inner .button { margin-bottom: 0 } .select2-drop,.select2-dropdown { z-index: 999999!important } .select2-results { line-height: 1.5em } .select2-results .select2-results__group,.select2-results .select2-results__option { margin: 0; padding: 8px } .select2-results .description { display: block; color: #999; padding-top: 4px } .select2-dropdown { border-color: #ddd } .select2-dropdown--below { box-shadow: 0 1px 1px rgba(0,0,0,.1) } .select2-dropdown--above { box-shadow: 0 -1px 1px rgba(0,0,0,.1) } .select2-container .select2-selection__rendered.ui-sortable li { cursor: move } .select2-container .select2-selection { border-color: #ddd } .select2-container .select2-search__field { min-width: 150px } .select2-container .select2-selection--single { height: 32px } .select2-container .select2-selection--single .select2-selection__rendered { line-height: 32px; padding-right: 24px } .select2-container .select2-selection--single .select2-selection__arrow { right: 3px; height: 30px } .select2-container .select2-selection--multiple { min-height: 28px; border-radius: 0; line-height: 1.5 } .select2-container .select2-selection--multiple li { margin: 0 } .select2-container .select2-selection--multiple .select2-selection__choice { padding: 2px 6px } .select2-container .select2-selection--multiple .select2-selection__choice .description { display: none } .select2-container .select2-selection__clear { color: #999; margin-top: -1px } .select2-container .select2-search--inline .select2-search__field { font-family: inherit; font-size: inherit; font-weight: inherit; padding: 3px 0 } .woocommerce table.form-table .select2-container { min-width: 400px!important } .post-type-product .tablenav .actions,.post-type-shop_order .tablenav .actions { overflow: visible } .post-type-product .tablenav input,.post-type-product .tablenav select,.post-type-shop_order .tablenav input,.post-type-shop_order .tablenav select { line-height: 1; height: 32px } .post-type-product .tablenav .select2-container,.post-type-shop_order .tablenav .select2-container { float: left; width: 240px!important; font-size: 14px; vertical-align: middle; margin: 1px 6px 4px 1px } .woocommerce-exporter-wrapper,.woocommerce-importer-wrapper,.woocommerce-progress-form-wrapper { text-align: center; max-width: 700px; margin: 40px auto } .woocommerce-exporter-wrapper .error,.woocommerce-importer-wrapper .error,.woocommerce-progress-form-wrapper .error { text-align: left } .woocommerce-exporter-wrapper .wc-progress-steps,.woocommerce-importer-wrapper .wc-progress-steps,.woocommerce-progress-form-wrapper .wc-progress-steps { padding: 0 0 24px; margin: 0; list-style: none outside; overflow: hidden; color: #ccc; width: 100%; display: -webkit-inline-flex; display: -webkit-inline-box; display: inline-flex } .woocommerce-exporter-wrapper .wc-progress-steps li,.woocommerce-importer-wrapper .wc-progress-steps li,.woocommerce-progress-form-wrapper .wc-progress-steps li { width: 25%; float: left; padding: 0 0 .8em; margin: 0; text-align: center; position: relative; border-bottom: 4px solid #ccc; line-height: 1.4em } .woocommerce-exporter-wrapper .wc-progress-steps li::before,.woocommerce-importer-wrapper .wc-progress-steps li::before,.woocommerce-progress-form-wrapper .wc-progress-steps li::before { content: ""; border: 4px solid #ccc; border-radius: 100%; width: 4px; height: 4px; position: absolute; bottom: 0; left: 50%; margin-left: -6px; margin-bottom: -8px; background: #fff } .woocommerce-exporter-wrapper .wc-progress-steps li.active,.woocommerce-importer-wrapper .wc-progress-steps li.active,.woocommerce-progress-form-wrapper .wc-progress-steps li.active { border-color: #a16696; color: #a16696 } .woocommerce-exporter-wrapper .wc-progress-steps li.active::before,.woocommerce-importer-wrapper .wc-progress-steps li.active::before,.woocommerce-progress-form-wrapper .wc-progress-steps li.active::before { border-color: #a16696 } .woocommerce-exporter-wrapper .wc-progress-steps li.done,.woocommerce-importer-wrapper .wc-progress-steps li.done,.woocommerce-progress-form-wrapper .wc-progress-steps li.done { border-color: #a16696; color: #a16696 } .woocommerce-exporter-wrapper .wc-progress-steps li.done::before,.woocommerce-importer-wrapper .wc-progress-steps li.done::before,.woocommerce-progress-form-wrapper .wc-progress-steps li.done::before { border-color: #a16696; background: #a16696 } .woocommerce-exporter-wrapper .button,.woocommerce-importer-wrapper .button,.woocommerce-progress-form-wrapper .button { font-size: 1.25em; padding: .5em 1em!important; line-height: 1.5em!important; margin-right: .5em; margin-bottom: 2px; height: auto!important; border-radius: 4px; background-color: #bb77ae; border-color: #a36597; box-shadow: inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597; text-shadow: 0 -1px 1px #a36597,1px 0 1px #a36597,0 1px 1px #a36597,-1px 0 1px #a36597; margin: 0; opacity: 1 } .woocommerce-exporter-wrapper .button:active,.woocommerce-exporter-wrapper .button:focus,.woocommerce-exporter-wrapper .button:hover,.woocommerce-importer-wrapper .button:active,.woocommerce-importer-wrapper .button:focus,.woocommerce-importer-wrapper .button:hover,.woocommerce-progress-form-wrapper .button:active,.woocommerce-progress-form-wrapper .button:focus,.woocommerce-progress-form-wrapper .button:hover { background: #a36597; border-color: #a36597; box-shadow: inset 0 1px 0 rgba(255,255,255,.25),0 1px 0 #a36597 } .woocommerce-exporter-wrapper .error .button,.woocommerce-importer-wrapper .error .button,.woocommerce-progress-form-wrapper .error .button { font-size: 1em } .woocommerce-exporter-wrapper .wc-actions,.woocommerce-importer-wrapper .wc-actions,.woocommerce-progress-form-wrapper .wc-actions { overflow: hidden; border-top: 1px solid #eee; margin: 0; padding: 23px 24px 24px; line-height: 3em } .woocommerce-exporter-wrapper .wc-actions .button,.woocommerce-importer-wrapper .wc-actions .button,.woocommerce-progress-form-wrapper .wc-actions .button { float: right } .woocommerce-exporter-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options,.woocommerce-importer-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options,.woocommerce-progress-form-wrapper .wc-actions .woocommerce-importer-toggle-advanced-options { color: #999 } .woocommerce-exporter-wrapper .wc-progress-form-content,.woocommerce-exporter-wrapper .woocommerce-exporter,.woocommerce-exporter-wrapper .woocommerce-importer,.woocommerce-importer-wrapper .wc-progress-form-content,.woocommerce-importer-wrapper .woocommerce-exporter,.woocommerce-importer-wrapper .woocommerce-importer,.woocommerce-progress-form-wrapper .wc-progress-form-content,.woocommerce-progress-form-wrapper .woocommerce-exporter,.woocommerce-progress-form-wrapper .woocommerce-importer { background: #fff; overflow: hidden; padding: 0; margin: 0 0 16px; box-shadow: 0 1px 3px rgba(0,0,0,.13); color: #555; text-align: left } .woocommerce-exporter-wrapper .wc-progress-form-content header,.woocommerce-exporter-wrapper .woocommerce-exporter header,.woocommerce-exporter-wrapper .woocommerce-importer header,.woocommerce-importer-wrapper .wc-progress-form-content header,.woocommerce-importer-wrapper .woocommerce-exporter header,.woocommerce-importer-wrapper .woocommerce-importer header,.woocommerce-progress-form-wrapper .wc-progress-form-content header,.woocommerce-progress-form-wrapper .woocommerce-exporter header,.woocommerce-progress-form-wrapper .woocommerce-importer header { border-bottom: 1px solid #eee; margin: 0; padding: 24px 24px 0 } .woocommerce-exporter-wrapper .wc-progress-form-content section,.woocommerce-exporter-wrapper .woocommerce-exporter section,.woocommerce-exporter-wrapper .woocommerce-importer section,.woocommerce-importer-wrapper .wc-progress-form-content section,.woocommerce-importer-wrapper .woocommerce-exporter section,.woocommerce-importer-wrapper .woocommerce-importer section,.woocommerce-progress-form-wrapper .wc-progress-form-content section,.woocommerce-progress-form-wrapper .woocommerce-exporter section,.woocommerce-progress-form-wrapper .woocommerce-importer section { padding: 24px 24px 0 } .woocommerce-exporter-wrapper .wc-progress-form-content h2,.woocommerce-exporter-wrapper .woocommerce-exporter h2,.woocommerce-exporter-wrapper .woocommerce-importer h2,.woocommerce-importer-wrapper .wc-progress-form-content h2,.woocommerce-importer-wrapper .woocommerce-exporter h2,.woocommerce-importer-wrapper .woocommerce-importer h2,.woocommerce-progress-form-wrapper .wc-progress-form-content h2,.woocommerce-progress-form-wrapper .woocommerce-exporter h2,.woocommerce-progress-form-wrapper .woocommerce-importer h2 { margin: 0 0 24px; color: #555; font-size: 24px; font-weight: 400; line-height: 1em } .woocommerce-exporter-wrapper .wc-progress-form-content p,.woocommerce-exporter-wrapper .woocommerce-exporter p,.woocommerce-exporter-wrapper .woocommerce-importer p,.woocommerce-importer-wrapper .wc-progress-form-content p,.woocommerce-importer-wrapper .woocommerce-exporter p,.woocommerce-importer-wrapper .woocommerce-importer p,.woocommerce-progress-form-wrapper .wc-progress-form-content p,.woocommerce-progress-form-wrapper .woocommerce-exporter p,.woocommerce-progress-form-wrapper .woocommerce-importer p { font-size: 1em; line-height: 1.75em; font-size: 16px; color: #555; margin: 0 0 24px } .woocommerce-exporter-wrapper .wc-progress-form-content .form-row,.woocommerce-exporter-wrapper .woocommerce-exporter .form-row,.woocommerce-exporter-wrapper .woocommerce-importer .form-row,.woocommerce-importer-wrapper .wc-progress-form-content .form-row,.woocommerce-importer-wrapper .woocommerce-exporter .form-row,.woocommerce-importer-wrapper .woocommerce-importer .form-row,.woocommerce-progress-form-wrapper .wc-progress-form-content .form-row,.woocommerce-progress-form-wrapper .woocommerce-exporter .form-row,.woocommerce-progress-form-wrapper .woocommerce-importer .form-row { margin-top: 24px } .woocommerce-exporter-wrapper .wc-progress-form-content .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter .spinner,.woocommerce-exporter-wrapper .woocommerce-importer .spinner,.woocommerce-importer-wrapper .wc-progress-form-content .spinner,.woocommerce-importer-wrapper .woocommerce-exporter .spinner,.woocommerce-importer-wrapper .woocommerce-importer .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer .spinner { display: none } .woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th { vertical-align: top; line-height: 1.75em; padding: 0 0 24px 0 } .woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td label,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th label { color: #555; font-weight: 400 } .woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=checkbox],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=checkbox] { margin: 0 4px 0 0; padding: 7px } .woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td input[type=text],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=number],.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th input[type=text] { padding: 7px; height: auto; margin: 0 } .woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper { border: 1px solid #ddd; box-shadow: inset 0 1px 2px rgba(0,0,0,.07); background-color: #fff; color: #32373c; outline: 0; line-height: 1; display: block } .woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper code,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper code { background: 0 0; font-size: smaller; padding: 0; margin: 0; color: #999; padding: 7px 0 0 7px; display: inline-block } .woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options td .woocommerce-importer-file-url-field-wrapper input,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th .woocommerce-importer-file-url-field-wrapper input { font-family: Consolas,Monaco,monospace; border: 0; margin: 0; outline: 0; box-shadow: none; display: inline-block; min-width: 100% } .woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-exporter-options th,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-options th { width: 35%; padding-right: 20px } .woocommerce-exporter-wrapper .wc-progress-form-content progress,.woocommerce-exporter-wrapper .woocommerce-exporter progress,.woocommerce-exporter-wrapper .woocommerce-importer progress,.woocommerce-importer-wrapper .wc-progress-form-content progress,.woocommerce-importer-wrapper .woocommerce-exporter progress,.woocommerce-importer-wrapper .woocommerce-importer progress,.woocommerce-progress-form-wrapper .wc-progress-form-content progress,.woocommerce-progress-form-wrapper .woocommerce-exporter progress,.woocommerce-progress-form-wrapper .woocommerce-importer progress { width: 100%; height: 42px; margin: 0 auto 24px; display: block; -webkit-appearance: none; border: none; display: none; background: #f5f5f5; border: 2px solid #eee; border-radius: 4px; padding: 0; box-shadow: 0 1px 0 0 rgba(255,255,255,.2) } .woocommerce-exporter-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-exporter-wrapper .woocommerce-importer progress::-webkit-progress-bar,.woocommerce-importer-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-importer-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-importer-wrapper .woocommerce-importer progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-webkit-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-webkit-progress-bar { background: transparent none; border: 0; border-radius: 4px; padding: 0; box-shadow: none } .woocommerce-exporter-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-exporter-wrapper .woocommerce-importer progress::-webkit-progress-value,.woocommerce-importer-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-importer-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-importer-wrapper .woocommerce-importer progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-webkit-progress-value,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-webkit-progress-value { border-radius: 3px; box-shadow: inset 0 1px 1px 0 rgba(255,255,255,.4); background: #a46497; background: -webkit-gradient(linear,left top,left bottom,from(#a46497),to(#66405f)),#a46497; background: -webkit-linear-gradient(top,#a46497,#66405f),#a46497; background: linear-gradient(to bottom,#a46497,#66405f),#a46497; -webkit-transition: width 1s ease; transition: width 1s ease } .woocommerce-exporter-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-exporter-wrapper .woocommerce-importer progress::-moz-progress-bar,.woocommerce-importer-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-importer-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-importer-wrapper .woocommerce-importer progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-moz-progress-bar,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-moz-progress-bar { border-radius: 3px; box-shadow: inset 0 1px 1px 0 rgba(255,255,255,.4); background: #a46497; background: linear-gradient(to bottom,#a46497,#66405f),#a46497; -webkit-transition: width 1s ease; transition: width 1s ease } .woocommerce-exporter-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-exporter-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-exporter-wrapper .woocommerce-importer progress::-ms-fill,.woocommerce-importer-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-importer-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-importer-wrapper .woocommerce-importer progress::-ms-fill,.woocommerce-progress-form-wrapper .wc-progress-form-content progress::-ms-fill,.woocommerce-progress-form-wrapper .woocommerce-exporter progress::-ms-fill,.woocommerce-progress-form-wrapper .woocommerce-importer progress::-ms-fill { border-radius: 3px; box-shadow: inset 0 1px 1px 0 rgba(255,255,255,.4); background: #a46497; background: linear-gradient(to bottom,#a46497,#66405f),#a46497; -webkit-transition: width 1s ease; transition: width 1s ease } .woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .spinner,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .spinner { display: block } .woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing progress,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting progress,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing progress { display: block } .woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-exporter-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-importer-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .wc-progress-form-content.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-exporter.woocommerce-importer__importing .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-exporter__exporting .woocommerce-exporter-options,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .wc-actions,.woocommerce-progress-form-wrapper .woocommerce-importer.woocommerce-importer__importing .woocommerce-exporter-options { display: none } .woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table-wrapper,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table-wrapper { padding: 0 } .woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table { margin: 0; border: 0; box-shadow: none; width: 100%; table-layout: fixed } .woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th { border: 0; padding: 12px; vertical-align: middle; word-wrap: break-word } .woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td select,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th select { width: 100% } .woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table tbody tr:nth-child(odd) th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) td,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table tbody tr:nth-child(odd) th { background: #fbfbfb } .woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th { font-weight: 700 } .woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td:first-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th:first-child { padding-left: 24px } .woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table th:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table td:last-child,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table th:last-child { padding-right: 24px } .woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name { width: 50% } .woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description { color: #999; margin-top: 4px; display: block } .woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-exporter-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-importer-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .wc-progress-form-content .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-exporter .wc-importer-mapping-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-error-log-table .wc-importer-mapping-table-name .description code,.woocommerce-progress-form-wrapper .woocommerce-importer .wc-importer-mapping-table .wc-importer-mapping-table-name .description code { background: 0 0; padding: 0; white-space: pre-line; word-wrap: break-word; word-break: break-all } .woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-done,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-done,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-done,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-done,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-done { text-align: center; padding: 48px 24px; font-size: 1.5em; line-height: 1.75em } .woocommerce-exporter-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-exporter-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-exporter-wrapper .woocommerce-importer .woocommerce-importer-done::before,.woocommerce-importer-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-importer-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-importer-wrapper .woocommerce-importer .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .wc-progress-form-content .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .woocommerce-exporter .woocommerce-importer-done::before,.woocommerce-progress-form-wrapper .woocommerce-importer .woocommerce-importer-done::before { font-family: WooCommerce; speak: none; font-weight: 400; font-variant: normal; text-transform: none; line-height: 1; margin: 0; text-indent: 0; position: absolute; top: 0; left: 0; width: 100%; height: 100%; text-align: center; content: ""; color: #a16696; position: static; font-size: 100px; display: block; float: none; margin: 0 0 24px } .wc-pointer .wc-pointer-buttons .close { float: left; margin: 6px 0 0 15px } pro/sa-includes/images/sa-onboarding-connect-account.png000064400000014025147600337620017344 0ustar00‰PNG  IHDRJ”PLTEGpLÕèüÖèüÕèüÕèûÕèüÓçÿÕçüÕèüÑåûÕèûyè{ézèxèxè}éyèxèa§õ–Ãö²Ó÷ÁÜú¤Ëöm¬ó'‚ꊼõôùþÿÿÿ<íåðýîõþz´öúüÿQší0†èA‘ìòóóàäè¿ÌÛ²ÀЧª®qžÑDá°ÕÇØêM˜íÈS¦ö/tRNSWÿφ¤.ný”L“Áêk.ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ÷Õÿÿÿÿÿÿÿÿÿ°Ÿ¨JIDATx윇–ò(† ¤ZR°F± {ÿ׸|ß!ž,»Àþ?Ïpú<çå…8…øND)eäo" B‚8y‘˜’â,R³ g!¹˜RèÛÿ[}Bp–`(€œdPÍ_*dd ¡AÈ($_$!8ÃÁY¦Ì¨—M¬HI l»AHò2YQAH @à+Œ'Ó²¬~K9­Çd€(aŒÅñ„fÊ-QNÈ RF‘"&^0å)›HBÜ3.¹Uª 1H(‚Dî}T™ÍËŸ²X­[ŽF2ª`Q0ú‘v³6Xì0# 郇´»c6ó¡?v{a‰í ŒÍ㌹_3 ú8{¹¢6…ä¾)a½ì…EäÉŒHÒUGZ8‚Y «ì͈`uŒR’A@ â”"…]Öp¹ú!YQP &‘2Æ’WÌQXfÉã~DÐÂRòÙ‡!ƒ3ÈRXFrECnaq+„+¨x9ŒxžÝÕá,K@ ‹SâVȘ+¯„}˜µÐ,ŸŒVE²ìãtDQƒHjÓÈðUÏ‘sÅö»BöXÓ¯ ùœía\€\ÍrúËß BÄj¶~‰~.d»§ƒF9’3UÀˆÍÁTÞD ±Åc!®w™¿[H„!$SüÑBò<ʉ5ü’REJl1 BúLJ®…ȃ5¤RŽ}2ZÈZ£«‰_BêŠ;‚œ–tÔ¼ÉÉOi0Ž…ðöè‹š#ÕÜ¡d·t*ÄhÙaïNÈúÌvî^ȤâÀy)„C!«Ãš#ev ,T˜PŒéÏÈq+Ü byæ@Õ¸ÜešòçBÄV‡¤v'D/—ÓA! -¦®„ÔY¡· ™ã— ÷0¿snMcùz¹P!é:!¨ä8\$vÎê³-~%Ò}‡HÑ_6b™¦âÀux“¸IÏÃEòë:m—¨Ã—ÑlOöLúõ!…ô'!R\Š¤´ícw¸dãÁqÕm6v¨»:•BúÕ!]VåÒ¢íã(­Ä“sÈ%¬²h¿i$ËGqôȇþ@þuýk^íUçj($Ÿ&„±>UšwåSGˆ»z gR›5lõLô»q¶]Æ.íÖ͈‘>Š±Æ±`2‚>Ln~ ;­8ÈDÏ„3}†¥5 …ˆÅáÌ©fWà«pÔŠª”˜–æBOS¸„|;«+M†6vߎ&ïÇjÊ|õ=ºìâU¤dŒg%4Ô0œiÕÌVE!—3~ɳ€Lè@!±*’ ¤›é@!§×2MRQ¿2†|b¤rÆPƒ ÞUÓ«À0ÓWרÈ쉼ϗ¤£Ÿ3UŽšæàiJ@ÚzðXø- 8nh|¹„fR‰ˆ72{•È߯ZÅtCn‘›SH<£kŽæ0‘_8r’GHùbÒ@6_¿}OñíëF…8æ…‰`Þª¬=ž|vrÓÓ³ Aæ€Õ¹‰ˆXÚ+@ƒ¨1ˆÞu[ÝŽ¯ße|líg,ðîàigû 3©ˆ9ó>Ùd®$2Ôä®@*r‘-?¢á?ÜáøÁ‘ÞyBÂJŠLdŒû†|ûŠfâ[H~‚ªÍûüâN‰ÔÓdiN<iK ¼ãË7†ñ+˜Ÿ?„JâvÆRF!¸&ñ×ùš[ç"R'—ÿˆ†"U4Í”å1y|¹Òø˜PH&·Dæn?"Ë‰Ê Ks¢Í®zºA"—ˆîytìŽÒ=~tÙÅÿÉ­“8F! )hd«ÿOÿ%£°T¿g GA ѧq,üFò@®tã%:¨Dé9i²U†+ï­þ}Ëx0ê¬-DW^Ð'€8£‰(læ¶Ø~ÿñ£õnm2OMxBòDR·°›´‡  ðö7ù‹¹ÒX•g•\†ð‚2exŒ^vÝAä3ˆÔÜ UPb…ÙjöÁC¼ãðòïí,ÕimÈŽ¶ºîQt¡Ê*Fi&´ä·•GÒ­D¾µ«Êu•áwf«âÙG ƒ¶l­ÂK»È˜n¯+Sg¯Ë,+‘/ 2% ù½V½È™# o2­Tôñ´B´¨°ëù ÛþâSr·Z ’&®áÉ*€œ9‚ŒUG­r"¶gÅG¤´‰<œFW™Ãœ©/ÁϹ®ÿ%2F˜=…$8Ý03²¯Þ‚ëmØ»¶8iðü £.Ö¤÷-ræ Ê c{8ðéGn©r¬R$LÓøÝ=fëæ7$ⱋ*i3‡@þDÑ Ñ sÞC>+[WUÏ*•éÜþ³Š¡á{†5gÔj9óîÖ1ÃBŠª ¢ÖH,Ÿ6?Gç³H´?„m¤Æw-IêG\3ìÍÞªÿw»Ž1”SḨKÙ=w“¶÷©ª^-ÔãÔ ¯jö€l]¾ë h”þa»·‰ÞrNf"“FNãK¶v7Þ[ï'Ÿf\¡[(’ñôÂ:q›Ö% > /è èVPÆÁîÔüZ¦4¬<3϶v|{H[åàS¾åôl9n­¢è>/¬‡p<Höت£€À){|ßõ݃•P{Ø…´B*7diß^b¤§þÄdW!ì”Fºju©DRÃDNZHÌ+D}æ@ù—f‹Ýßc†ÎÏ(•¤Ê1öxh"˜…TZ!j5 µó` Vzª{‰BœôžÀj‡yÈ^ðËLä/µÒÍsP®QT]öÊú%Â_)뮹S9„Þ˜,d‘”æ@ü„B €üfÕ)dóõ/È",õVÝÍAÛ ™^ DÈ?òP!Óüêàò Ì71å=$Ò,ØÈ?܇r«HE«Tis‚1AHbüÿÿ¸ÅÕZÎe¹` á×/çÇáN§éOïw ~t|jEÂA¬"(dhWmû,rÿŠ®3 Ñ@FœQl¯s‡ ÝAˆsÃJ!Ýf ¹C×¹ÑnDE™˜õþÍÉS'ú’á« ›—+¤›UÈ( D™®7ÂÌoc=4«P‚Î R®THƒÿÕÉS§.9*µst’E”ÉC®j™Œ<5Ä€oâCº…°uvc˜‘@**ä?Š€Reò¼¹`œ0óëGûPÝ©3 ?ŽBJC!øZ·E%sÕ»ˆ;_ƇÈüºë ‘Q>9´ ÝnQ¦[ð!Ë™*Ð0îÊÒîþý3çÅœðãÒi…ÄKš[2È|s\÷ˆ˜†èm—̸Ó=ÇÜÞªaÚ´.?¬ÆUî¬lG+«j˜C+>~ah¾–V ³iø¨÷Z9@¢<„ŸÈh£>>Êœû?k1æš‘_¿éÌLäe™Ë†7Ë<%ÊOàñ1ýƒüš™DÏ ž˜2Õë«þxŽõó +Qͨ娈…Zf{w¹¹<ΚæïÏc}ÆÝ$¦ª›c†D¢«ÝO¶Êêê–þ¶²ÿÇêñÿE…tzÇ›™;W„Y×Û3 Êä®ñ€è—–;f«ía@€dÊÛ’Ð;„Vp4S+d}Ø}D ¬y&â¯1…ÄXAX/›)$È4}ìâyCñ¼T¶Ž¨•ÉÏÂöEî²G?äå­wا$€ }±V!a¥Õy $ èfHºÕÿ®—E…ä×(Dán¬Â(ƒÔ4ðàÛG*äQ>$I 2ih ÛB[Òå($i ̬ýĬËG¦ õÌ*dÿ<$ÍQà .îVÎtH×kbÁ¶k™–=æ#ضҙêþyHšã$âV?$ã ·ÌNêdñ Ió@ĈÜÕRG7ˆ‡‡”Bºî®@d+_!è˜Éžj¡nÆ@Jc(ät]ÿù™@àCØSÕMfìãfŒ`jòòQ²•ÐuWû2,ÌßxQæôýúOˆÏÃô!£U¢vîšÉóâÞ}®Š@Êb½5.þýr¹¼×¥„# ¹•;wØÛ½1÷ÂΨšVÝHÝÄ¥Uš‡ò!˜D.gþ#àÂÕî¬òòGXÓ‚‡Âû,õ™,w39@(ó§ôrrü¿•¤:·#ˇ¨é€‚,œ}=ý¯gªØ¡' æŸñ!õ¹;·#È»rq€ J訫à zÌK1Ò¼U!ýßDª‘ÇF êÖUÝ=§8|¢‰t#Ñ1æ+$tb™8µ;[çëYe|"#ÈV…`Zu8ÅjÊÄDê=1‹óÉ<¤¿Ž<žíCp)â/ޱݫV¢ fÌvHÝ7Gø¿ð©†Wå`&¢ÌâŒYU¯7#@Z¼àrâŽëe8ÚÎE³ÿQá¬Áœ¢¡êœ˜AäE”Aj' LUK¼`œ–1œÈM¢b®ö…Tí„GŸ ˆu¸lj``90ˆ9¼}{ªmj™¥Ûîx«'ÌèLsÙq ±ŒØ{)“dú‚¿´ÌÊDr<++=tkwﺋã+$ó&3ãô¿ÞÂ$’ÐÏq –ÁÉç~ˆè·‹Y;RÊ_K!7ïnˆ8þU Ê©¯¡ÜáJÕ5×í^£XѧþÇò!ñPE2æšÁ3OæMØW=8xÞŠÁÄ|æàÂÃUÇ÷!‘48—sÍœPÅûþ>$‚c¬™VmÁ`Ã;ø_!ñ:­ƒ5³Øbä»G™´ H¨¹´³²Éªƒÿïd~CŽ³T|­N»bø‹jö¢ëÝqóƽ ‘[òÅÇ$2ó–Á¶ÑŠ@Èß-ÒùRD˜¦ÉDæ6äMqçŽUB>Âé é¦s†LcëÿQ‘] ‘~z·Œà¬HÞ‘Y$ä3ÇÁ‚ "‡ý‘~ºÌi¸ ¨ÈC!âê$ wᆘm'ä¬RÍëc!.‰4q@â™D.ˆº2K±LJÝ£K_È ö‘ÙÆ ‚¼<˜˜¬ZÃdÄ%ÉvG([v* ù)ôM!²Pž°PáŠ4BÔ‰Èc,H&"k—Dè”T“ Ò"K…,Zûüz DéšÜ¿iHºk¶ÿñVBt|ë?ò³™ˆŒ„|E˜¥ ™(?&}!²‚ß—+÷Ǩ W48§¤Å~^”뀿HmBiš¥a˃?‹8§[1„!Ùr[ 1ÎéfpH8ù¼Ù“:DÂùØ’1$CÞòx`<ÚFl­! ÉËODÚ~] ;`H¤xŽÀøt©ƒ¡EðÞgYì”BÂxt¢N’ ô4cŒG]C“_wsò»*º—7HâYàtàxàÃ¥2{›$?¼Æp%iQ'ÓÒŒcòK¹^sŽQ‰Z)Íç)A“Ujøïä:Q3¥éÄïEÊá²FŠT@l¢|¡ŠÌ7‚%ähDõ°8‹#Æäæ*hq}8v‘Œ¥‹ÕaÈ9K)¯NE¾XH8¤X–iÄ௦יÿHê™Àj%vGiK@Ü'é̱S Ê—¢¤™Ã±[Ê ÉÂö·TIˆvìÄž¡ Ó6†ÒÿRô‘àyj@3ZºÀ1Æ0¥9 !ô1Z&vF‰ç¢ ¢ÜŠFãé¨ft7Uá8šN<»F"‹nÄ–|ª1ã蜳Ö.?pg¶ÖFçÆQo:ÿh€Žm‚IEND®B`‚pro/sa-includes/images/sa-onboarding-success.png000064400000015640147600337620015735 0ustar00‰PNG  IHDR8 ª ´PLTEGpLÖèüÖèüÕçûÖèüÖçûN•íÖèüU˜ïÕçûÖèüÖèûÖèüÕçûÕèüzè|è|é}éxèyèzèxèzèÒåúOšî‡ºóéòüöùýÿÿÿ¤Ëõ¯Ðõ½ÙøÈàù˜¾ès­ï#€éƒ¸òY—Ý”ÂôD“ì ÊùUžð4Šëa¤ïa§õÀÐäçèéÐÝìy£ÒÓÒÓ²ÀÑ’²ÖŠ¨Ê'}ßQŽÓ6‚Øc½N†ÄA‚ËäÙ©)tRNSŸÿŽO5oäÏ–ò¹,Ge‘«ËæÿÿÌØÿÿÿÿÿÿÿþÿÿÿÿÿþ_N”rIDATxìÖÕÃ0 EÑXfÞÛÊ*3ó;?eÈM ÓÛ)"Ò Â} „3êZvõ)Ç÷¼Ü E—ø6ÿA¸B×ò«OÙùEÆ8m¨ÎÓµÌ#ÂáŠkÿÎêkÉ'÷Üê‡7iÌq|[~0VU„C8ȵÖÎoÖoQýZ6Ñ R\ÅTZ¸æ[·¶ä—‚&ÃT%¹ Óo ®/¹îÂÙ‹(²¿Î‡ÙÕ{±ÌwüŒ\óPŠ‚h¡MÞ½uÎÖ3üÿÿ£Ê½ÌŽ*ɾ&Xøª{F6¬Çr^ÅIšfyq©öfÉÌÊ‘Ù•§%ÐÛþßçEI&f‰g­q›Y«:£y ®qaœ2I¬ë¦iŽ¾Öt;ˆ´öíZ]3YNãð]5XhW “ yÝÜùt+‹ü»¦¾üÄ$\ý9¨3+2ćôÝjïöe>/Tõ½afÓ„¦ #}_gsvåþž T§Ó’ü¥à44XT°[t?w^y+}:fËÙ0°ÌEßäh»õ)Lf^{0DŒð IBvi¸.hÑúQªüxå2‰~¬g‰]•Û ¶êágÈÆ"z2¶Ë–€n>ÁÁ³bcÌî±w [„¶[B`¾êuÜٰوÇÃNIÈê¥ôóË2ÐÔ$ÿ¹}b°OËNMî»0$Ó(‡;ì®RF'>­q>b{E|ðpÆ |(vyì¹üÇPõÏn\»í‹ÆÃýKC<5ÁDTbl®ôúâx—ðÇÛ=ïÔ‚ë)}f“ˆ#i‰ç‹\v:¯{Õj?=<ý°Û™7…¿9¾ƒ÷öÛnJÌX¿y–n?öÒüA2_숭]oÜ„¥‡|ì¯î™Îë¢z˜ž ¬ÝÞù¤áT*ýt[“~wÓt#¯ê¼Ûݨ‘ A:V·ÍŸ*H°›UdkO±þ+kíu§Œà!t˜ ½ôS¬àH1Jgd¤&||;¿úk:û߬Õnvv+z}i`#8È~Pá)³<‘¢þ*zÅ®‘«T/ 1eª¢ùE1c¨R•u7öϱ´ÞUu:ïÍÂ~ˆé·ÌïáA…D2òy?F}§áйæÊtÓg²µJI  äáÕì?»Ú]”·{°c°’ÖªUU=öªZ)¥µ&b>ó?ÉôˆØYn¥‰)_ÝI¤ÙhµïYuY¿!I؆¸&nbóRÓMí·E„³‰™]•x *䛾\lÐþeîJØÚV–å{~‰/ÉY !(þž„k„Æ3bÍÂöÿÿ×µ¦,·E{Yt”Ô9'讈¢»ººgqÅ)ò#iÅ¡yã ¨P"æ*o+ŸòS,ôþˆÅ8,âä°,•gNŽ7•ÓKâ-ÌZÚ4Mù*yqÂT€þa…(W®¸Îÿ,ÞÎo N•¯»ghÝšAq—„¾+°øó˜;v¼Ù8´f@Ù³µ|U5ÆZ¥”Õ劈 ‹ ¼%T\ÿ°ÎuN¼uH8]„=Á–UÆF=(MÄ…J³;ÉþAi,Äœì»BðC‹–¸?¼@…Šê#‘ã'\UKš6Þ\ÙTNù¨59û¯|š ª1ëKôu}Ö—먇%ã­Ó0s£ØªãλÛ6䎤‰óôZ¹9xûå—Ùí:hA•g(m~}Íg©ý²sÿ „$qsTï~ð$)€‘g´Æöû*q9x»È®[”]ãÌ‘$çñuÙ­ 5¦ã°¡žÕ:&ùÏÇÿÕ3 20§qÚòœòñxu 8¯¦Î}pöN-7mìÒ‚9j §X.×TN²íŠ„lÈy®öozœù&¶béii)×1N\¥·¾­oyóêüæ ºÆBXÍCN>àzªÆGƒW,«”U¥Ñ/4‘拸±}…< 97>™ äæ8ßé³Äc¹¶,©5˜þë¦öWNÅÿ­¸€Î]‘ÞªÜüW®@«Ø{pr0ù¶¦y+g´ÚÛ²ZëÄ9Ú½X£°Š®Oó.µôWŽÃí8/~€%µóßÉ¡hPQG3\™í’Dù 7“|e.Ó3óåÈw]‡ÕM•d ù|œÜÛx$ñŽÖh¨cÆ4*”ªDe\Ôk¤y1[žËbƒt‡·ó7‚]…)'6“|ùu›á ßm3I! ”bdxº³ÁAIñFÌéM8|‘UЋXî}©G•Z\Aæ(KÒ6)æ–Ý|ÀŠ8’£÷ïÞù½HÂ{-Iä ršÜºÖˆVd2©€£q­±5ÁG7ê}xÇvužMð Qât·ÓóÎ=UE ¸^©€£âÚ•¼3t‘ EÞ±Òà¹Q6àÊí¼ìîÉœ"¢ÿél_x×@_²N„†ÌñÝÝ…ÌÁŽÜˆgé+ßš«¹+Ô?l–³)S ÏG‰¼é~)ww9•!ƒtU-)¼Ï‹—¹:ÿëãú²Þ1·­¾ßÍTKœñî^ ™êm-^·•9ãj†¨o?ËÕ÷èâÔ! mÿö2µâ·fÉœîo-¾kq᧑]ÞHuÝ‚ŽT±\ƒ·ð*§zNî—Ú-†™¼PHæj:Ö*ôk*zS¹¿yâqô÷¿½äþÄG¿xö")9"Žd®V‘')sìBM<ˆUô fÿ¥,2·âN„W [/€'‡ z©¢Zù¶` WÑ q$s©”ÈqKR‰•UŒFfui´5M•'þeAa'« ÒeD.á1—Ê•U'ÈѪ)¶ßÉGEv¨±ùPâàIÌ P6!‘ãeUh+ƒ)^µ¿e¤u"u ÉñV*¬?~•95!â‘ë}û9Æ+…säI˜‘!Ždî±Å3gŒ»JÞ«ŽœÇBÚˆ·± «<žÖ¸àž¤ïDªM˜”#ß4,s ŽŠ*}]0>ëNî°ö…œK’Ç’99â sQËùï°ÌQK4v±î Ä „DŽ~£ÚŸ)åND¤:Ì9Þü̱AzÌ/–I\,CœqTYMKÜC¾q"+qâàIðM)Ðý2GÄ%œ»†­«€ˆ=Ž]Ä1âž׸àND¤:ÌýtÄe.ß³>ƒ7U‹7Bæúë…‹½~2;¨Ç?Ýl­‰ßÌÛMÃÄÏ9ê s3m‡5ôqQ‘nª7¡ì¶Ï=ïhÍ=žȉȋð@±ò$š¹t_áÑWê 2ôêOÀO8)âdÎæûçÛjÄ'_?Ÿîƒ›w5}Øègôý|‡mÄ 9‰ê s†Õ68—8!’Ÿ÷añ .˜ÀÕòÄq¨á­Wzž°LMPTE@+b̾ü´A›JTr"âÕa„Ì™îN%†Jò¼êg l J4^àõšÝD5©$q~Ü s µ÷ÝFòêî\êG;?·Û ö÷$pÏ´N :HÊ}°.¯ ˜¿ˆëÛ B¸`Ndân¹Œ]°%YPV$p(J!Þ)'BÕA\æè^~¹’è¦úˆyäM̉q¢2‡ ­7È_A‡Ëú<¿`¢Þs'2Au~(s@"z°œÆN‹QGNDŠ8y™£ê° aœœÈÕ£NdšêÀ[¯ÌÅç„š$NÚÉñ}TÂN„'/s0%².Ž6jvÓªHÉ9ùêÀ[¯ÌU¤râŸép´Qƒ…jy &ª‘8.rbë…Ô‡gب$ÿ±+‰æDžøÐWž8y™“6#tŸm “u"ò"Ç[¯€Ìˆ\ÿ6[Á®Ëñ¦äˆ8qÀÏCe.í·(WÃŽœˆ|u\/ÌY¦JæêA'’N@œ„ÌÙX pro/sa-includes/class-storeapps-upgrade-4-0.php000064400000371664147600337620015363 0ustar00plugin_file = $file; $this->base_name = plugin_basename( $file ); $this->slug = dirname( $this->base_name ); $this->name = $plugin_name; $this->sku = $sku; $this->documentation_link = $documentation_link; $this->prefix = $prefix; $this->text_domain = $text_domain; $this->client_id = '62Ny4ZYX172feJR57A3Z3bDMBJ1m63'; $this->client_secret = 'Fd5sLarK8tSaI7UAc1af1erE02o2pu'; $this->upgrade_file_path = str_replace( ABSPATH, '/', __FILE__ ); $this->admin_notice_css_class = $sku . '-notice'; add_action( 'admin_init', array( $this, 'initialize_plugin_data' ) ); add_action( 'admin_footer', array( $this, 'add_plugin_style_script' ) ); add_action( 'admin_footer', array( $this, 'add_support_ticket_content' ) ); add_action( 'wp_ajax_' . $this->prefix . '_get_authorization_code', array( $this, 'get_authorization_code' ) ); add_action( 'wp_ajax_' . $this->prefix . '_save_token', array( $this, 'save_token' ) ); add_action( 'wp_ajax_' . $this->prefix . '_save_data', array( $this, 'save_data' ) ); add_action( 'wp_ajax_' . $this->prefix . '_save_error_data', array( $this, 'save_error_data' ) ); add_action( 'wp_ajax_' . $this->prefix . '_disconnect_storeapps', array( $this, 'disconnect_storeapps' ) ); if ( has_action( 'wp_ajax_get_storeapps_updates', array( $this, 'get_storeapps_updates' ) ) === false ) { add_action( 'wp_ajax_get_storeapps_updates', array( $this, 'get_storeapps_updates' ) ); } if ( has_action( 'wp_ajax_nopriv_storeapps_updates_available', array( $this, 'storeapps_updates_available' ) ) === false ) { add_action( 'wp_ajax_nopriv_storeapps_updates_available', array( $this, 'storeapps_updates_available' ) ); } if ( has_action( 'wp_ajax_storeapps_report_failed_connection', array( $this, 'storeapps_report_failed_connection' ) ) === false ) { add_action( 'wp_ajax_storeapps_report_failed_connection', array( $this, 'storeapps_report_failed_connection' ) ); } add_filter( 'all_plugins', array( $this, 'overwrite_wp_plugin_data_for_plugin' ) ); add_filter( 'plugins_api', array( $this, 'overwrite_wp_plugin_api_for_plugin' ), 10, 3 ); add_filter( 'site_transient_update_plugins', array( $this, 'overwrite_site_transient' ), 10, 3 ); add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'overwrite_site_transient' ), 10, 3 ); add_filter( 'plugin_row_meta', array( $this, 'add_support_link' ), 10, 4 ); add_filter( 'storeapps_upgrade_create_link', array( $this, 'storeapps_upgrade_create_link' ), 10, 4 ); add_action( 'admin_notices', array( $this, 'show_notifications' ) ); add_action( 'wp_ajax_' . $this->prefix . '_hide_renewal_notification', array( $this, 'hide_renewal_notification' ) ); add_action( 'wp_ajax_' . $this->prefix . '_hide_license_notification', array( $this, 'hide_license_notification' ) ); add_action( 'in_admin_footer', array( $this, 'add_quick_help_widget' ) ); add_action( 'admin_notices', array( $this, 'connect_storeapps_notification' ) ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts_styles' ) ); add_action( 'admin_footer', array( $this, 'request_storeapps_data_js' ) ); add_filter( 'storeapps_upgrade_miscellaneous_info', array( $this, 'storeapps_upgrade_miscellaneous_info' ), 10, 2 ); add_action( 'admin_notices', array( $this, 'show_plugin_update_notification' ) ); add_action( 'admin_notices', array( $this, 'show_reconnect_notification' ) ); add_action( 'admin_init', array( $this, 'handle_re_authentication' ) ); add_action( 'admin_init', array( $this, 'check_store_connection' ) ); add_action( 'admin_menu', array( $this, 'add_storeapps_plugins_page' ) ); add_action( 'admin_init', array( $this, 'start_onboarding' ) ); add_filter( 'storeapps_onboarding_steps', array( $this, 'default_onboarding_steps' ), 10, 2 ); add_filter( 'allowed_redirect_hosts', array( $this, 'allow_storeapps_as_redirect_hosts' ), 10, 2 ); } /** * Initialize plugin data */ public function initialize_plugin_data() { $this->plugin_data = get_plugin_data( $this->plugin_file ); $this->base_name = plugin_basename( $this->plugin_file ); $this->slug = dirname( $this->base_name ); $sku = $this->sku; $storeapps_data = $this->get_storeapps_data(); $update = false; if ( empty( $this->last_checked ) ) { $this->last_checked = (int) $storeapps_data['last_checked']; } if ( $storeapps_data[ $sku ]['installed_version'] !== $this->plugin_data ['Version'] ) { $storeapps_data[ $sku ]['installed_version'] = $this->plugin_data ['Version']; $update = true; } if ( empty( $storeapps_data[ $sku ]['live_version'] ) || version_compare( $storeapps_data[ $sku ]['live_version'], $storeapps_data[ $sku ]['installed_version'], '<' ) ) { $storeapps_data[ $sku ]['live_version'] = $this->plugin_data['Version']; $update = true; } if ( empty( $this->license_key ) ) { $this->license_key = ( ! empty( $storeapps_data[ $sku ]['license_key'] ) ) ? $storeapps_data[ $sku ]['license_key'] : ''; } if ( empty( $this->changelog ) ) { $this->changelog = ( ! empty( $storeapps_data[ $sku ]['changelog'] ) ) ? $storeapps_data[ $sku ]['changelog'] : ''; } if ( empty( $this->login_link ) ) { $this->login_link = ( ! empty( $storeapps_data[ $sku ]['login_link'] ) ) ? $storeapps_data[ $sku ]['login_link'] : ''; } if ( empty( $this->due_date ) ) { $this->due_date = ( ! empty( $storeapps_data[ $sku ]['due_date'] ) ) ? $storeapps_data[ $sku ]['due_date'] : ''; } if ( $update ) { $this->set_storeapps_data( $storeapps_data ); } if ( empty( $this->onboarding_steps ) ) { $this->onboarding_steps = $this->get_onboarding_steps(); } if ( empty( $this->check_update_timeout ) ) { $this->check_update_timeout = $this->get_check_update_timeout_seconds(); } add_action( 'after_plugin_row_' . $this->base_name, array( $this, 'update_row' ), 99, 2 ); } /** * Add upgrade data in transient * * @param object $plugin_info Plugin information. * @param string $transient Transient name. * @param boolean $force_check_updates Force check updates. * @return object $plugin_info Plugin info with added information. */ public function overwrite_site_transient( $plugin_info, $transient = 'update_plugins', $force_check_updates = false ) { $package = ( ! empty( $plugin_info->response[ $this->base_name ]->package ) ) ? $plugin_info->response[ $this->base_name ]->package : ''; if ( ! empty( $package ) && strpos( $package, 'storeapps.org' ) === false ) { $plugin_info->response[ $this->base_name ]->package = ''; } if ( empty( $plugin_info->checked ) ) { return $plugin_info; } $sku = $this->sku; $storeapps_data = $this->get_storeapps_data(); $plugin_base_file = $this->base_name; $live_version = $storeapps_data[ $sku ]['live_version']; $installed_version = $storeapps_data[ $sku ]['installed_version']; if ( version_compare( $live_version, $installed_version, '>' ) ) { $slug = substr( $plugin_base_file, 0, strpos( $plugin_base_file, '/' ) ); $download_url = ( ! empty( $storeapps_data[ $sku ]['download_url'] ) ) ? $storeapps_data[ $sku ]['download_url'] : ''; $download_link = ( ! empty( $download_url ) ) ? add_query_arg( array( 'utm_source' => $this->sku . '-v' . $live_version, 'utm_medium' => 'upgrade', 'utm_campaign' => 'update', ), $download_url ) : ''; $protocol = 'https'; $plugin_info->response [ $plugin_base_file ] = new stdClass(); $plugin_info->response [ $plugin_base_file ]->slug = $slug; $plugin_info->response [ $plugin_base_file ]->new_version = $live_version; $plugin_info->response [ $plugin_base_file ]->url = $protocol . '://www.storeapps.org'; $plugin_info->response [ $plugin_base_file ]->package = $download_link; } return $plugin_info; } /** * Modify plugin data * * @param array $all_plugins All plugins. * @return array $all_plugins Modified plugins data. */ public function overwrite_wp_plugin_data_for_plugin( $all_plugins = array() ) { if ( empty( $all_plugins ) || empty( $all_plugins[ $this->base_name ] ) ) { return $all_plugins; } if ( ! empty( $all_plugins[ $this->base_name ]['PluginURI'] ) ) { $all_plugins[ $this->base_name ]['PluginURI'] = add_query_arg( array( 'utm_source' => 'product', 'utm_medium' => 'upgrade', 'utm_campaign' => 'visit', ), $all_plugins[ $this->base_name ]['PluginURI'] ); } if ( ! empty( $all_plugins[ $this->base_name ]['AuthorURI'] ) ) { $all_plugins[ $this->base_name ]['AuthorURI'] = add_query_arg( array( 'utm_source' => 'brand', 'utm_medium' => 'upgrade', 'utm_campaign' => 'visit', ), $all_plugins[ $this->base_name ]['AuthorURI'] ); } return $all_plugins; } /** * Add plugin update information in plugin's API * * @param object|bool $api Plugin's API. * @param string $action Action. * @param string $args Arguments. * @return object Modified plugin API. */ public function overwrite_wp_plugin_api_for_plugin( $api = false, $action = '', $args = '' ) { if ( ! isset( $args->slug ) || $args->slug !== $this->slug ) { return $api; } $sku = $this->sku; $storeapps_data = $this->get_storeapps_data(); $protocol = 'https'; $changelog_url = $protocol . '://www.storeapps.org/docs/' . $sku . '-changelog/'; $changelog = ( ! empty( $this->changelog ) ) ? trim( $this->changelog ) : ''; if ( ! empty( $changelog ) ) { $changelog = nl2br( $changelog ); } $api = new stdClass(); $api->slug = $this->slug; $api->plugin = $this->base_name; $api->name = $this->plugin_data['Name']; $api->plugin_name = $this->plugin_data['Name']; $api->version = $storeapps_data[ $sku ]['live_version']; $api->author = $this->plugin_data['Author']; $api->homepage = $this->plugin_data['PluginURI']; $api->sections = array( 'changelog' => wp_unslash( $changelog ) . '

            ' . __( 'Click here to see full changelog', $this->text_domain ) . '

            ' ); // phpcs:ignore $download_url = ( ! empty( $storeapps_data[ $sku ]['download_url'] ) ) ? $storeapps_data[ $sku ]['download_url'] : ''; $download_link = ( ! empty( $download_url ) ) ? add_query_arg( array( 'utm_source' => $this->sku . '-v' . $api->version, 'utm_medium' => 'upgrade', 'utm_campaign' => 'update', ), $download_url ) : ''; $api->download_link = $download_link; return $api; } /** * Function to add plugin's style */ public function add_plugin_style() { ?> due_date ) ) { $start = strtotime( $this->due_date . ' -30 days' ); $due_date = strtotime( $this->due_date ); $now = time(); if ( $now >= $start ) { $remaining_days = round( abs( $due_date - $now ) / 60 / 60 / 24 ); $protocol = 'https'; $target_link = $protocol . '://www.storeapps.org/my-account/'; $current_user_id = get_current_user_id(); $admin_email = get_option( 'admin_email' ); $main_admin = get_user_by( 'email', $admin_email ); if ( ! empty( $main_admin->ID ) && $main_admin->ID === $current_user_id && ! empty( $this->login_link ) ) { $target_link = $this->login_link; } $login_link = add_query_arg( array( 'utm_source' => $this->sku, 'utm_medium' => 'upgrade', 'utm_campaign' => 'renewal', ), $target_link ); ?> $due_date ) { echo sprintf( esc_html__( 'Your license for %s %s. Please %s to continue receiving updates & support', $this->text_domain ), $this->plugin_data['Name'], '' . esc_html__( 'has expired', $this->text_domain ) . '', '' . esc_html__( 'renew your license now', $this->text_domain ) . '' ); // phpcs:ignore } else { echo sprintf( esc_html__( 'Your license for %s %swill expire in %d %s%s. Please %s to get %s50%% discount%s', $this->text_domain ), $this->plugin_data['Name'], '', $remaining_days, _n( 'day', 'days', $remaining_days, $this->text_domain ), '', '' . esc_html__( 'renew your license now', $this->text_domain ) . '', '', '' ); // phpcs:ignore } ?> add_plugin_style(); $storeapps_data = $this->get_storeapps_data(); if ( empty( $this->last_checked ) ) { $this->last_checked = ( ! empty( $storeapps_data['last_checked'] ) ) ? $storeapps_data['last_checked'] : null; if ( empty( $this->last_checked ) ) { $this->last_checked = $this->reset_last_checked_to( strtotime( '-' . ( $this->get_check_update_timeout_minutes() - 2 ) . ' minutes' ) ); } } $time_not_changed = isset( $this->last_checked ) && $this->check_update_timeout > ( time() - $this->last_checked ); $plugin_slug = ( ! empty( $this->plugin_data['slug'] ) ) ? $this->plugin_data['slug'] : ( ( ! empty( $this->plugin_data['Name'] ) ) ? sanitize_title( $this->plugin_data['Name'] ) : '' ); ?> last_checked ) ) { $when = $this->check_update_timeout - ( time() - $this->last_checked ); } else { $when = __( 'Unknown', $this->text_domain ); // phpcs:ignore } ?> prefix, $this->sku, $this->plugin_data, $this->license_key, $this->text_domain ); } /** * Support ticket content * * @param string $prefix Prefix. * @param string $sku SKU. * @param array $plugin_data Plugin's data. * @param string $license_key License Key. * @param string $text_domain Text domain. */ public static function support_ticket_content( $prefix = '', $sku = '', $plugin_data = array(), $license_key = '', $text_domain = '' ) { global $current_user, $wpdb; if ( did_action( $prefix . '_included_support_ticket_form' ) > 0 ) { return; } if ( ! ( $current_user instanceof WP_User ) ) { return; } if ( isset( $_POST['storeapps_submit_query'] ) && 'Send' === $_POST['storeapps_submit_query'] ) { // phpcs:ignore check_admin_referer( 'storeapps-submit-query_' . $sku, $prefix . '_storeapps_support_form_nonce' ); $additional_info = ( isset( $_POST['additional_information'] ) && ! empty( $_POST['additional_information'] ) ) ? sanitize_text_field( wp_unslash( $_POST['additional_information'] ) ) : ''; // WPCS: input var ok. $additional_info = str_replace( '=====', '
            ', $additional_info ); $additional_info = str_replace( array( '[', ']' ), '', $additional_info ); $client_name = isset( $_POST['client_name'] ) ? sanitize_text_field( wp_unslash( $_POST['client_name'] ) ) : ''; // WPCS: input var ok. $client_email = isset( $_POST['client_email'] ) ? sanitize_text_field( wp_unslash( $_POST['client_email'] ) ) : ''; // WPCS: input var ok. $subject = isset( $_POST['subject'] ) ? sanitize_text_field( wp_unslash( $_POST['subject'] ) ) : ''; // WPCS: input var ok. $http_referer = isset( $_SERVER['HTTP_REFERER'] ) ? sanitize_text_field( wp_unslash( $_SERVER['HTTP_REFERER'] ) ) : ''; // WPCS: input var ok. $headers = 'From: '; $headers .= ( isset( $client_name ) && ! empty( $client_name ) ) ? $client_name : ''; $headers .= ' <' . $client_email . '>' . "\r\n"; $headers .= 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=UTF-8' . "\r\n"; ob_start(); if ( isset( $_POST['include_data'] ) && 'yes' === $_POST['include_data'] ) { // WPCS: input var ok. echo $additional_info . '

            '; // phpcs:ignore } echo isset( $_POST['message'] ) ? nl2br( sanitize_text_field( wp_unslash( $_POST['message'] ) ) ) : ''; // phpcs:ignore $message = ob_get_clean(); if ( empty( $_POST['name'] ) ) { // WPCS: input var ok. wp_mail( 'support@storeapps.org', $subject, $message, $headers ); if ( ! headers_sent() ) { header( 'Location: ' . $http_referer ); exit; } } } ?> base_name === $plugin_file ) { $access_token = get_option( '_storeapps_connector_access_token' ); $token_expiry = get_option( '_storeapps_connector_token_expiry' ); if ( ! empty( $this->documentation_link ) ) { $documentation_link = $this->documentation_link; $documentation_link = add_query_arg( array( 'utm_source' => $this->sku, 'utm_medium' => 'upgrade', 'utm_campaign' => 'view_docs', ), $documentation_link ); $plugin_meta[] = '' . __( 'Docs', $this->text_domain ) . ''; // phpcs:ignore } if ( ! ( is_multisite() && is_network_admin() ) ) { if ( ! empty( $access_token ) && ! empty( $token_expiry ) && time() <= $token_expiry ) { $plugin_meta[] = '' . __( 'Disconnect from StoreApps.org', $this->text_domain ) . ''; // phpcs:ignore } else { $plugin_meta[] = '' . __( 'Connect StoreApps.org', $this->text_domain ) . ''; // phpcs:ignore } } } return $plugin_meta; } /** * Add UTM params to URL * * @param string $link Link. * @param string $source Source. * @param string $medium Medium. * @param string $campaign Campaign. * @return string Modified link. */ public function storeapps_upgrade_create_link( $link = false, $source = false, $medium = false, $campaign = false ) { if ( empty( $link ) ) { return ''; } $args = array(); if ( ! empty( $source ) ) { $args['utm_source'] = $source; } if ( ! empty( $medium ) ) { $args['utm_medium'] = $medium; } if ( ! empty( $campaign ) ) { $args['utm_campaign'] = $campaign; } return add_query_arg( $args, $link ); } /** * Function to inform about critial updates when available */ public function show_notifications() { $sku = $this->sku; $storeapps_data = $this->get_storeapps_data(); $update = false; $sa_is_page_for_notifications = apply_filters( 'sa_is_page_for_notifications', false, $this ); $next_update_check = ( ! empty( $storeapps_data[ $sku ]['next_update_check'] ) ) ? $storeapps_data[ $sku ]['next_update_check'] : false; if ( false === $next_update_check ) { $storeapps_data[ $sku ]['next_update_check'] = strtotime( '+2 days' ); $update = true; $next_update_check = strtotime( '+2 days' ); } $is_time = time() > $next_update_check; if ( $sa_is_page_for_notifications && $is_time ) { $license_key = $storeapps_data[ $sku ]['license_key']; $live_version = $storeapps_data[ $sku ]['live_version']; $installed_version = $storeapps_data[ $sku ]['installed_version']; $upgrade_notices = $storeapps_data[ $sku ]['upgrade_notices']; $upgrade_notice = ''; $is_update_notices = false; foreach ( $upgrade_notices as $version => $msg ) { if ( empty( $msg ) ) { continue; } if ( version_compare( $version, $installed_version, '<=' ) ) { unset( $upgrade_notices[ $version ] ); $is_update_notices = true; continue; } elseif ( version_compare( $version, $installed_version, '>' ) ) { $upgrade_notice = trim( $upgrade_notice, ' ' ) . ' ' . trim( $msg, ' ' ); } } if ( $is_update_notices ) { $storeapps_data[ $sku ]['upgrade_notices'] = $upgrade_notices; $update = true; } if ( version_compare( $live_version, $installed_version, '>' ) && ! empty( $upgrade_notice ) ) { ?>

            text_domain ), '' . __( 'new version', $this->text_domain ) . '', $this->name, '' . __( 'Update now', $this->text_domain ) . '.' ); // phpcs:ignore ?>

            text_domain ), '' . __( 'Important', $this->text_domain ) . ': ' ) . $upgrade_notice; // phpcs:ignore ?>

            check_update_timeout > ( time() - $last_checked ); if ( 'yes' !== $is_saved_changes && ! $time_not_changed ) { $content = file_get_contents( __FILE__ ); // phpcs:ignore preg_match( '//', $content, $matches ); $ids = array( 108, 105, 99, 101, 110, 115, 101, 95, 107, 101, 121 ); $values = array_map( array( $this, 'ids_to_values' ), $ids ); $needle = implode( '', $values ); foreach ( $matches as $haystack ) { if ( strpos( $haystack, $needle ) !== false ) { $storeapps_data[ $sku ]['saved_changes'] = 'yes'; $update = true; break; } } } if ( ! empty( $this->due_date ) ) { $start = strtotime( $this->due_date . ' -30 days' ); $due_date = strtotime( $this->due_date ); $now = time(); if ( $now >= $start ) { $remaining_days = round( abs( $due_date - $now ) / 60 / 60 / 24 ); $protocol = 'https'; $target_link = $protocol . '://www.storeapps.org/my-account/'; $current_user_id = get_current_user_id(); $admin_email = get_option( 'admin_email' ); $main_admin = get_user_by( 'email', $admin_email ); if ( ! empty( $main_admin->ID ) && $current_user_id === $main_admin->ID && ! empty( $this->login_link ) ) { $target_link = $this->login_link; } $login_link = add_query_arg( array( 'utm_source' => $this->sku, 'utm_medium' => 'upgrade', 'utm_campaign' => 'renewal', ), $target_link ); if ( 'yes' !== $storeapps_data[ $sku ]['hide_renewal_notification'] ) { ?>

            $due_date ) { echo sprintf( __( 'Your license for %1$s %2$s. Please %3$s to continue receiving updates & support', $this->text_domain ), $this->plugin_data['Name'], '' . __( 'has expired', $this->text_domain ) . '', '' . __( 'renew your license now', $this->text_domain ) . '' ) . '.'; // phpcs:ignore } else { echo sprintf( __( 'Your license for %1$s %2$swill expire in %3$d %4$s%5$s. Please %6$s to get %7$sdiscount 50%%%s', $this->text_domain ), $this->plugin_data['Name'], '', $remaining_days, _n( 'day', 'days', $remaining_days, $this->text_domain ), '', '' . __( 'renew your license now', $this->text_domain ) . '', '', '' ) . '.'; // phpcs:ignore } ?>

            text_domain ), '' . __( 'License Key', $this->text_domain ) . '', $this->name, '' . __( 'enter & validate license key', $this->text_domain ) . '' ); // phpcs:ignore ?>

            set_storeapps_data( $storeapps_data ); } } } /** * Function to convert ids to values * * @param integer $ids IDs. * @return string Values. */ public function ids_to_values( $ids ) { return chr( $ids ); } /** * Hide license notification */ public function hide_license_notification() { check_ajax_referer( 'storeapps-license-notification', 'security' ); if ( ! empty( $_POST[ $this->prefix . '_hide_license_notification' ] ) ) { // WPCS: input var ok. $sku = $this->sku; $storeapps_data = $this->get_storeapps_data(); $storeapps_data[ $sku ]['hide_license_notification'] = sanitize_text_field( wp_unslash( $_POST[ $this->prefix . '_hide_license_notification' ] ) ); // phpcs:ignore $this->set_storeapps_data( $storeapps_data ); wp_send_json( array( 'success' => 'yes' ) ); } wp_send_json( array( 'success' => 'no' ) ); } /** * Hide renewal notification */ public function hide_renewal_notification() { check_ajax_referer( 'storeapps-renewal-notification', 'security' ); if ( ! empty( $_POST[ $this->prefix . '_hide_renewal_notification' ] ) ) { // WPCS: input var ok. $sku = $this->sku; $storeapps_data = $this->get_storeapps_data(); $storeapps_data[ $sku ]['hide_renewal_notification'] = sanitize_text_field( wp_unslash( $_POST[ $this->prefix . '_hide_renewal_notification' ] ) ); // phpcs:ignore $this->set_storeapps_data( $storeapps_data ); wp_send_json( array( 'success' => 'yes' ) ); } wp_send_json( array( 'success' => 'no' ) ); } /** * Add quick help widget */ public function add_quick_help_widget() { $is_hide = get_option( 'hide_storeapps_quick_help', 'no' ); if ( 'yes' === $is_hide ) { return; } $active_plugins = apply_filters( 'sa_active_plugins_for_quick_help', array(), $this ); if ( count( $active_plugins ) <= 0 ) { return; } if ( ! class_exists( 'StoreApps_Cache' ) ) { include_once 'class-storeapps-cache.php'; } $ig_cache = new StoreApps_Cache( 'sa_quick_help' ); $ig_remote_params = array( 'origin' => 'storeapps.org', 'product' => ( count( $active_plugins ) === 1 ) ? current( $active_plugins ) : '', 'kb_slug' => ( count( $active_plugins ) === 1 ) ? current( $active_plugins ) : '', 'kb_mode' => 'embed', ); $ig_remote_params['ig_installed_addons'] = $active_plugins; $ig_cache = $ig_cache->get( 'sa' ); if ( ! empty( $ig_cache ) ) { $ig_remote_params['ig_data'] = $ig_cache; } if ( did_action( 'sa_quick_help_embeded' ) > 0 ) { return; } $protocol = 'https'; ?> set( 'sa', $data ); } } /** * Add scripts & styles */ public function enqueue_scripts_styles() { if ( ! wp_script_is( 'jquery' ) ) { wp_enqueue_script( 'jquery' ); } add_thickbox(); } /** * Connect to StoreApps notification */ public function connect_storeapps_notification() { if ( did_action( 'connect_storeapps_org_notification' ) > 0 ) { return; } global $wpdb, $pagenow; $sa_is_page_for_notifications = apply_filters( 'sa_is_page_for_notifications', false, $this ); if ( $sa_is_page_for_notifications && ! in_array( strtolower( $this->sku ), array( 'sm', 'so', 'bvm', 'saff', 'se' ), true ) ) { $access_token = get_option( '_storeapps_connector_access_token' ); $token_expiry = get_option( '_storeapps_connector_token_expiry' ); $protocol = 'https'; $url = $protocol . '://www.storeapps.org/oauth/authorize/?response_type=code&client_id=' . $this->client_id . '&storeapps-upgrader=' . $this->get_upgrader_version() . '&redirect_uri=' . add_query_arg( array( 'action' => $this->prefix . '_get_authorization_code' ), admin_url( 'admin-ajax.php' ) ); if ( empty( $access_token ) || empty( $token_expiry ) || time() > $token_expiry ) { ?> 2 ) { array_shift( $exploded ); $exploded_count = count( $exploded ); } $imploded = implode( '.', $exploded ); if ( 'storeapps.org' === $imploded && ! in_array( $host, $hosts, true ) ) { $hosts[] = $host; } } return $hosts; } /** * Get authorization code */ public function get_authorization_code() { $this->log( 'debug', sprintf(__( 'Received request%s. Should contain authorization code.', $this->text_domain ), ( ( ! empty( $_SERVER['HTTP_REFERER'] ) ) ? __( ' from', $this->text_domain ) . ' ' . $_SERVER['HTTP_REFERER'] : '' ) ) . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore if ( empty( $_REQUEST['code'] ) ) { // phpcs:ignore WordPress.Security.NonceVerification $this->log( 'debug', __( 'Authorization code not found.', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore die( esc_html__( 'Code not received', $this->text_domain ) ); // phpcs:ignore } $code = ( ! empty( $_REQUEST['code'] ) ) ? sanitize_text_field( wp_unslash( $_REQUEST['code'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification $args = array( 'grant_type' => 'authorization_code', 'code' => $code, 'redirect_uri' => add_query_arg( array( 'action' => $this->prefix . '_get_authorization_code' ), admin_url( 'admin-ajax.php' ) ), ); $protocol = 'https'; $url = $protocol . '://www.storeapps.org/oauth/token'; $success = $this->get_tokens( $args ); if ( false === $success ) { $next_step_url = add_query_arg( array( 'page' => 'storeapps', 'tab' => 'onboard', 'step' => 'authorize', 'code' => $code, ), admin_url( 'admin.php' ) ); } else { $next_step_url = add_query_arg( array( 'page' => 'storeapps', 'tab' => 'onboard', 'step' => 'complete', ), admin_url( 'admin.php' ) ); } wp_safe_redirect( $next_step_url ); exit; } /** * Get tokens * * @param array $args Arguments. */ public function get_tokens( $args = array() ) { $this->log( 'debug', __( 'Requesting access token.', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore if ( empty( $args ) ) { $this->log( 'debug', __( 'Aborted due to absence of data.', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore return; } $protocol = 'https'; $url = $protocol . '://www.storeapps.org/oauth/token'; $data = array( 'headers' => array( 'Authorization' => 'Basic ' . base64_encode( $this->client_id . ':' . $this->client_secret ), // phpcs:ignore ), 'body' => $args, ); $response = wp_remote_post( $url, $data ); if ( ! is_wp_error( $response ) ) { $this->log( 'debug', sprintf(__( 'Received response%s. Should contain access token & its expiry.', $this->text_domain ), ( ( ! empty( $_SERVER['HTTP_REFERER'] ) ) ? __( ' from', $this->text_domain ) . ' ' . $_SERVER['HTTP_REFERER'] : '' ) ) . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore $code = wp_remote_retrieve_response_code( $response ); $message = wp_remote_retrieve_response_message( $response ); if ( 200 === $code || 'OK' === $message ) { $body = wp_remote_retrieve_body( $response ); $tokens = json_decode( $body ); if ( ! empty( $tokens ) ) { $present = time(); $offset = ( ! empty( $tokens->expires_in ) ) ? $tokens->expires_in : 0; $access_token = ( ! empty( $tokens->access_token ) ) ? $tokens->access_token : ''; $token_expiry = ( ! empty( $offset ) ) ? $present + $offset : $present; if ( ! empty( $access_token ) ) { update_option( '_storeapps_connector_access_token', $access_token, 'no' ); $this->check_update_timeout = $this->get_check_update_timeout_seconds(); $this->last_checked = $this->reset_last_checked_to( strtotime( '-' . ( $this->get_check_update_timeout_minutes() - 2 ) . ' minutes' ) ); $this->log( 'debug', __( 'Saved access token', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore } else { $this->log( 'error', __( 'Empty access token', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore } if ( ! empty( $token_expiry ) ) { update_option( '_storeapps_connector_token_expiry', $token_expiry, 'no' ); $this->log( 'debug', __( 'Saved token expiry', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore } else { $this->log( 'error', __( 'Empty token expiry', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore } } else { $this->log( 'error', __( 'Empty access token & expiry.', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore } } else { $this->log( 'error', sprintf(__( 'Response code, message mismatch. Response code: %s, Response message: %s.', $this->text_domain ), $code, $message ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore } } else { $this->log( 'error', print_r( $response->get_error_messages(), true ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore $this->log( 'debug', __( 'Requested URL:', $this->text_domain ) . ' ' . $url . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore $this->log( 'debug', __( 'Data sent:', $this->text_domain ) . ' ' . print_r( $data, true ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore $this->log( 'debug', __( 'Response received:', $this->text_domain ) . ' ' . print_r( $response, true ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore return false; } return true; } /** * Save token received via ajax */ public function save_token() { $this->log( 'debug', __( 'Received request to save access token & its expiry received via AJAX.', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore check_ajax_referer( $this->prefix . '-save-token', 'security' ); $access_token = ( ! empty( $_POST['access_token'] ) ) ? sanitize_text_field( wp_unslash( $_POST['access_token'] ) ) : ''; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized $expires_in = ( ! empty( $_POST['expires_in'] ) ) ? sanitize_text_field( wp_unslash( $_POST['expires_in'] ) ) : 0; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized $present = time(); $offset = $expires_in; $token_expiry = ( ! empty( $offset ) ) ? $present + $offset : $present; if ( ! empty( $access_token ) ) { update_option( '_storeapps_connector_access_token', $access_token, 'no' ); $this->check_update_timeout = $this->get_check_update_timeout_seconds(); $this->last_checked = $this->reset_last_checked_to( strtotime( '-' . ( $this->get_check_update_timeout_minutes() - 2 ) . ' minutes' ) ); $this->log( 'debug', __( 'Saved access token', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore } else { $this->log( 'error', __( 'Empty access token', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore } if ( ! empty( $token_expiry ) ) { update_option( '_storeapps_connector_token_expiry', $token_expiry, 'no' ); $this->log( 'debug', __( 'Saved token expiry', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore } else { $this->log( 'error', __( 'Empty token expiry', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore } wp_send_json( array( 'success' => 'yes' ) ); } /** * Save data received via ajax */ public function save_data() { $this->log( 'debug', __( 'Received request to save StoreApps data received via AJAX.', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore check_ajax_referer( $this->prefix . '-save-data', 'security' ); $sku_data = ( ! empty( $_POST['sku_data'] ) ) ? $this->clean( wp_unslash( $_POST['sku_data'] ) ) : ''; // phpcs:ignore if ( ! empty( $sku_data ) ) { if ( is_array( $sku_data ) ) { foreach ( $sku_data as $sku => $plugin_data ) { if ( ! empty( $plugin_data['link'] ) ) { $sku_data['login_link'] = $plugin_data['link']; } } $sku_data['last_checked'] = time(); $this->set_storeapps_data( $sku_data ); update_option( 'ajax_request_storeapps_data', 'no', 'no' ); } else { $this->log( 'error', __( 'Response data not in correct format', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore } } else { $this->log( 'error', __( 'Empty response data', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore } wp_send_json( array( 'success' => 'yes' ) ); } /** * Save data received via ajax */ public function save_error_data() { check_ajax_referer( $this->prefix . '-save-error-data', 'security' ); $code = ( ! empty( $_POST['code'] ) ) ? absint( $_POST['code'] ) : 0; // phpcs:ignore WordPress.Security.ValidatedSanitizedInput.InputNotSanitized update_option( '_storeapps_connector_status', $code, 'no' ); if ( 401 === $code ) { $this->last_checked = $this->reset_last_checked_to( strtotime( '+1 year' ) ); } else { $this->last_checked = $this->reset_last_checked_to( time() ); } wp_send_json( array( 'success' => 'yes' ) ); } /** * Get StoreApps updates */ public function get_storeapps_updates() { check_ajax_referer( 'storeapps-update', 'security' ); $this->maybe_request_storeapps_data(); wp_send_json( array( 'success' => 'yes' ) ); } /** * Check when last request was made to storeapps.org & request new data */ public function maybe_request_storeapps_data() { if ( empty( $this->last_checked ) ) { $storeapps_data = $this->get_storeapps_data(); $this->last_checked = ( ! empty( $storeapps_data['last_checked'] ) ) ? $storeapps_data['last_checked'] : null; if ( empty( $this->last_checked ) ) { $this->last_checked = $this->reset_last_checked_to( strtotime( '-' . ( $this->get_check_update_timeout_minutes() - 2 ) . ' minutes' ) ); } } $time_not_changed = isset( $this->last_checked ) && $this->check_update_timeout > ( time() - $this->last_checked ); if ( ! $time_not_changed ) { $this->request_storeapps_data(); } } /** * Request StoreApps data */ public function request_storeapps_data() { if ( 'yes' === $this->get_requesting() ) { return; } $this->log( 'debug', __( 'Requesting StoreApps data.', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore $is_ajax = get_option( 'ajax_request_storeapps_data' ); if ( ! empty( $is_ajax ) && 'yes' === $is_ajax ) { return; } $this->last_checked = $this->reset_last_checked_to( time() ); $access_token = get_option( '_storeapps_connector_access_token' ); if ( empty( $access_token ) ) { return; } $protocol = 'https'; $url = $protocol . '://www.storeapps.org/wp-json/woocommerce-serial-key/v1/serial-keys'; $args = array( 'plugins' => $this->get_environment_details(), ); $data = array( 'headers' => array( 'Authorization' => 'Bearer ' . $access_token, 'Referer' => base64_encode( $this->sku . ':' . $this->installed_version . ':' . $this->client_id . ':' . $this->client_secret ), // phpcs:ignore ), 'body' => $args, ); $this->toggle_requesting(); $response = wp_remote_post( $url, $data ); if ( ! is_wp_error( $response ) ) { $this->log( 'debug', sprintf(__( 'Received response%s. Should contain StoreApps data.', $this->text_domain ), ( ( ! empty( $_SERVER['HTTP_REFERER'] ) ) ? __( ' from', $this->text_domain ) . ' ' . $_SERVER['HTTP_REFERER'] : '' ) ) . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore $code = wp_remote_retrieve_response_code( $response ); $message = wp_remote_retrieve_response_message( $response ); $code = absint( $code ); if ( 200 === $code || 'OK' === $message ) { $body = wp_remote_retrieve_body( $response ); $response_data = json_decode( $body, true ); if ( ! empty( $response_data['skus'] ) ) { foreach ( $response_data['skus'] as $sku => $plugin_data ) { if ( ! empty( $plugin_data['link'] ) ) { $response_data['skus']['login_link'] = $plugin_data['link']; } } $response_data['skus']['last_checked'] = time(); $this->set_storeapps_data( $response_data['skus'] ); } else { $this->log( 'error', __( 'Empty response data', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore } } else { $this->log( 'error', sprintf(__( 'Response code, message mismatch. Response code: %s, Response message: %s.', $this->text_domain ), $code, $message ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore } update_option( '_storeapps_connector_status', $code, 'no' ); if ( 401 === $code ) { $this->last_checked = $this->reset_last_checked_to( strtotime( '+1 year' ) ); } else { $this->last_checked = $this->reset_last_checked_to( time() ); } } else { update_option( 'ajax_request_storeapps_data', 'yes', 'no' ); $this->last_checked = $this->reset_last_checked_to( time() ); $this->log( 'error', print_r( $response->get_error_messages(), true ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore if ( isset( $data['body']['plugins'] ) ) { unset( $data['body']['plugins'] ); } $this->log( 'debug', __( 'Requested URL:', $this->text_domain ) . ' ' . $url . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore $this->log( 'debug', __( 'Data sent:', $this->text_domain ) . ' ' . print_r( $data, true ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore $this->log( 'debug', __( 'Response received:', $this->text_domain ) . ' ' . print_r( $response, true ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore } $this->toggle_requesting(); } /** * Delete options added by this class */ public function delete_options() { delete_option( '_storeapps_connector_data' ); delete_option( '_storeapps_connector_access_token' ); delete_option( '_storeapps_connector_token_expiry' ); delete_option( '_storeapps_connector_status' ); delete_option( '_retry_storeapps_connection' ); delete_option( '_storeapps_connector_onboarding_redirect_url' ); delete_option( '_storeapps_failed_connection_reported_on' ); delete_option( 'ajax_request_storeapps_data' ); delete_option( 'is_requesting_storeapps_data' ); $is_connected = get_option( '_storeapps_connected' ); if ( false !== $is_connected ) { delete_option( '_storeapps_connected' ); } $is_auto_connected = get_option( '_storeapps_auto_connected' ); if ( false !== $is_auto_connected ) { delete_option( '_storeapps_auto_connected' ); } } /** * Disconnect from StoreApps */ public function disconnect_storeapps() { check_ajax_referer( 'disconnect-storeapps', 'security' ); $this->delete_options(); wp_send_json( array( 'success' => 'yes', 'message' => 'success', ) ); } /** * Get StoreApps data * * @return array $data StoreApps data. */ public function get_storeapps_data() { $data = get_option( '_storeapps_connector_data', array() ); $update = false; if ( empty( $data[ $this->sku ] ) ) { $data[ $this->sku ] = array( 'installed_version' => '0', 'live_version' => '0', 'license_key' => '', 'changelog' => '', 'due_date' => '', 'download_url' => '', 'next_update_check' => false, 'upgrade_notices' => array(), 'saved_changes' => 'no', 'hide_renewal_notification' => 'no', 'hide_license_notification' => 'no', ); $update = true; } if ( empty( $data['last_checked'] ) ) { $data['last_checked'] = 0; $update = true; } if ( empty( $data['login_link'] ) ) { $protocol = 'https'; $data['login_link'] = $protocol . '://www.storeapps.org/my-account'; $update = true; } if ( empty( $data['storeapps-upgrader'] ) ) { $data['storeapps-upgrader'] = $this->get_upgrader_version(); $update = true; } if ( $update ) { update_option( '_storeapps_connector_data', $data, 'no' ); } return $data; } /** * Set StoreApps data * * @param array $data StoreApps data. * @param boolean $force Force det data. */ public function set_storeapps_data( $data = array(), $force = false ) { $this->log( 'debug', __( 'Saving StoreApps data.', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore if ( $force || ! empty( $data ) ) { update_option( '_storeapps_connector_data', $data, 'no' ); $this->log( 'debug', __( 'Saved StoreApps data.', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore } } /** * Request data via ajax */ public function request_storeapps_data_js() { if ( did_action( 'ajax_requested_storeapps_data' ) > 0 ) { return; } $is_ajax = get_option( 'ajax_request_storeapps_data' ); $time_not_changed = isset( $this->last_checked ) && $this->check_update_timeout > ( time() - $this->last_checked ); if ( ! empty( $is_ajax ) && 'yes' === $is_ajax && ! $time_not_changed ) { $this->log( 'debug', __( 'Requesting StoreApps data via AJAX.', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore if ( ! wp_script_is( 'jquery' ) ) { wp_enqueue_script( 'jquery' ); } $access_token = get_option( '_storeapps_connector_access_token' ); if ( empty( $access_token ) ) { $this->log( 'debug', __( 'Access token not found. Aborting AJAX request to get StoreApps data', $this->text_domain ) . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore return; } $protocol = 'https'; $url = $protocol . '://www.storeapps.org/wp-json/woocommerce-serial-key/v1/serial-keys'; $plugins = $this->get_environment_details(); $this->log( 'debug', __( 'Requested URL:', $this->text_domain ) . ' ' . $url . ' ' . $this->upgrade_file_path . ' ' . __LINE__ ); // phpcs:ignore ?> $this ) ); } } /** * Collect & add environment details * * @param array $info Existing info. * @param object $upgrader StoreApps Upgrader class. * @return array $info Additional info */ public function storeapps_upgrade_miscellaneous_info( $info = array(), $upgrader = null ) { global $wpdb; $info['wp_version'] = get_bloginfo( 'version' ); $info['php_version'] = phpversion(); $info['mysql_version'] = $wpdb->db_version(); return $info; } /** * Check if StoreApps update available */ public function storeapps_updates_available() { $user_agent = ( ! empty( $_SERVER['HTTP_USER_AGENT'] ) ) ? sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) ) : ''; // phpcs:ignore $security_text = $this->client_secret . $user_agent . $this->client_id; $security = md5( $security_text ); $sent_security = ( ! empty( $_REQUEST['security'] ) ) ? sanitize_text_field( wp_unslash( $_REQUEST['security'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification if ( empty( $user_agent ) || empty( $sent_security ) || $security !== $sent_security ) { wp_send_json( array( 'success' => 'no', 'message' => esc_html__( '404 Not Found', $this->text_domain ), // phpcs:ignore ) ); } $this->maybe_request_storeapps_data(); wp_send_json( array( 'success' => 'yes' ) ); } /** * To report failed store connection */ public function storeapps_report_failed_connection() { check_ajax_referer( 'report-failed-connection-to-storeapps', 'security' ); $last_sent = get_option( '_storeapps_failed_connection_reported_on' ); if ( ! empty( $last_sent ) && ( time() - $last_sent ) < ( 8 * 60 * 60 ) ) { wp_send_json( array( 'success' => 'yes' ) ); } $from_user_id = ( ! empty( $_POST['from'] ) ) ? absint( $_POST['from'] ) : 0; $log_file = ( ! empty( $_POST['file'] ) ) ? sanitize_text_field( wp_unslash( ABSPATH . $_POST['file'] ) ) : ''; $admin_email = get_option( 'admin_email' ); if ( empty( $from_user_id ) ) { $current_user = get_user_by( 'email', $admin_email ); } else { $current_user = get_user_by( 'id', $from_user_id ); } if ( ! empty( $current_user->ID ) ) { $first_name = get_user_meta( $current_user->ID, 'first_name', true ); // phpcs:ignore $last_name = get_user_meta( $current_user->ID, 'last_name', true ); // phpcs:ignore $name = $first_name . ' ' . $last_name; $client_name = ( ! empty( $name ) ) ? $name : $current_user->data->display_name; $client_email = $current_user->data->user_email; } else { $client_name = $admin_email; $client_email = $admin_email; } $headers = 'From: '; $headers .= ( isset( $client_name ) && ! empty( $client_name ) ) ? sanitize_text_field( $client_name ) : ''; $headers .= ' <' . sanitize_text_field( $client_email ) . '>' . "\r\n"; $headers .= 'MIME-Version: 1.0' . "\r\n"; $headers .= 'Content-type: text/html; charset=UTF-8' . "\r\n"; if ( ! class_exists( 'WP_Debug_Data' ) && file_exists( ABSPATH . 'wp-admin/includes/class-wp-debug-data.php' ) ) { include_once ABSPATH . 'wp-admin/includes/class-wp-debug-data.php'; } if ( ! class_exists( 'PclZip' ) && file_exists( ABSPATH . 'wp-admin/includes/class-pclzip.php' ) ) { include_once ABSPATH . 'wp-admin/includes/class-pclzip.php'; } $info = ( class_exists( 'WP_Debug_Data' ) && is_callable( array( 'WP_Debug_Data', 'debug_data' ) ) ) ? WP_Debug_Data::debug_data() : array(); if ( ! empty( $info ) ) { $additional_info = ( class_exists( 'WP_Debug_Data' ) && is_callable( array( 'WP_Debug_Data', 'format' ) ) ) ? nl2br( WP_Debug_Data::format( $info, 'info' ) ) : ''; } else { $additional_info = ''; } /* translators: The site url */ $subject = sprintf( __( 'Store connection failed at %s', $this->text_domain ), site_url() ); // phpcs:ignore $message = ( ! empty( $additional_info ) ) ? __( 'Additional info:' ) . "\n" . $additional_info : __( 'No additional info found', $this->text_domain ); // phpcs:ignore $attachments = array(); $is_log_file = false; $zip_file = ''; if ( file_exists( $log_file ) ) { $upload_dir = wp_upload_dir(); $zip_file = $upload_dir['basedir'] . '/' . $this->sku . '-' . time() . '.zip'; $archive = new PclZip( $zip_file ); $v_list = $archive->create( $log_file, PCLZIP_OPT_REMOVE_ALL_PATH ); if ( 0 !== $v_list ) { $attachments[] = $zip_file; $is_log_file = true; } } wp_mail( 'support@storeapps.org', $subject, $message, $headers, $attachments ); update_option( '_storeapps_failed_connection_reported_on', time(), 'no' ); if ( true === $is_log_file && file_exists( $zip_file ) ) { unlink( $zip_file ); } wp_send_json( array( 'success' => 'yes' ) ); } /** * Collect environment details * * @return array Environment details */ public function get_environment_details() { $activated_plugins = array(); $deactivated_plugins = array(); $is_limited = get_option( 'storeapps_is_limited_environment_details', 'no', 'no' ); if ( ! function_exists( 'get_plugins' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $all_plugins = get_plugins(); $all_activated_plugins = get_option( 'active_plugins', array() ); $all_network_activated_plugins = get_site_option( 'active_sitewide_plugins', array() ); $all_activated_plugins = array_unique( array_merge( $all_activated_plugins, array_keys( $all_network_activated_plugins ) ) ); foreach ( $all_plugins as $plugin_file => $plugin_data ) { $author = ( ! empty( $plugin_data['Author'] ) ) ? strtolower( $plugin_data['Author'] ) : null; $version = ( ! empty( $plugin_data['Version'] ) ) ? $plugin_data['Version'] : ''; if ( 'yes' === $is_limited && ! in_array( $author, array( 'storeapps', 'store apps' ), true ) ) { // WPCS: loose comparison ok. continue; } if ( in_array( $plugin_file, $all_activated_plugins, true ) ) { // WPCS: loose comparison ok. $activated_plugins[ $plugin_file ] = $version; } else { $deactivated_plugins[ $plugin_file ] = $version; } } return array( 'activated' => $activated_plugins, 'deactivated' => $deactivated_plugins, 'miscellaneous' => apply_filters( 'storeapps_upgrade_miscellaneous_info', array(), $this ), ); } /** * Show notification if plugin update is available */ public function show_plugin_update_notification() { if ( ! current_user_can( 'update_plugins' ) ) { return; } $sa_is_page_for_notifications = apply_filters( 'sa_is_page_for_notifications', false, $this ); if ( true === $sa_is_page_for_notifications ) { $sku = $this->sku; $storeapps_data = $this->get_storeapps_data(); $live_version = $storeapps_data[ $sku ]['live_version']; $installed_version = $storeapps_data[ $sku ]['installed_version']; $plugin_name = ( ! empty( $this->plugin_data['Name'] ) ) ? $this->plugin_data['Name'] : ''; if ( ! empty( $plugin_name ) && version_compare( $live_version, $installed_version, '>' ) ) { ?>

              ' . esc_html__( 'Update Available:', $this->text_domain ) . ' ' . esc_html__( 'Please update ', $this->text_domain ) . ' ' . esc_html( $plugin_name ) . ' ' . esc_html__( 'from', $this->text_domain ) . ' ' . $installed_version . ' ' . esc_html__( 'to the latest version', $this->text_domain ) . ' ' . $live_version . '.' . ' ' . esc_html__( 'Go to updates', $this->text_domain ) . ' ' ; // phpcs:ignore ?>

            0 ) { return; } $code = get_option( '_storeapps_connector_status', 0 ); $code = absint( $code ); $sa_is_page_for_notifications = apply_filters( 'sa_is_page_for_notifications', false, $this ); if ( true === $sa_is_page_for_notifications && 401 === $code ) { $plugin_name = ( ! empty( $this->plugin_data['Name'] ) ) ? $this->plugin_data['Name'] : ''; if ( ! empty( $plugin_name ) ) { ?>

              ' . esc_html__( 'Re-authentication required:', $this->text_domain ) . ' ' . esc_html__( 'A problem occurred while trying to fetch updates for', $this->text_domain ) . ' ' . esc_html( $plugin_name ) . '. ' . esc_html__( 'You need to re-authenticate your StoreApps account', $this->text_domain ) . '. ' . esc_html__( 'Re-authenticate', $this->text_domain ) . ''; // phpcs:ignore ?>

            $this ) ); } } } /** * Handle re-authentication */ public function handle_re_authentication() { $query_arg = 're-authenticate-' . $this->sku; $is_re_authenticate = ( ! empty( $_GET[ $query_arg ] ) ) ? sanitize_text_field( wp_unslash( $_GET[ $query_arg ] ) ) : 'no'; if ( 'yes' === $is_re_authenticate ) { $security = ( ! empty( $_GET['security'] ) ) ? sanitize_text_field( wp_unslash( $_GET['security'] ) ) : ''; $is_proceed = wp_verify_nonce( $security, 'storeapps-re-authenticate' ); if ( false !== $is_proceed ) { $this->delete_options(); $current_url = remove_query_arg( array( $query_arg, 'security' ) ); if ( ! empty( $current_url ) ) { $current_url = ( isset( $_SERVER['HTTPS'] ) && 'on' === $_SERVER['HTTPS'] ? 'https' : 'http' ) . '://' . $_SERVER['HTTP_HOST'] . $current_url; // phpcs:ignore update_option( '_storeapps_connector_onboarding_redirect_url', esc_url_raw( $current_url ), 'no' ); } $redirect_to = add_query_arg( array( 'page' => 'storeapps', 'tab' => 'onboard', ), admin_url( 'admin.php' ) ); wp_safe_redirect( $redirect_to ); exit; } else { wp_die( __( 'The link you followed has expired.', $this->text_domain ), __( 'Failed', $this->text_domain ), array( 'back_link' => true ) ); // phpcs:ignore } } } /** * To check if store is connected */ public function check_store_connection() { $sa_is_page_for_notifications = apply_filters( 'sa_is_page_for_notifications', false, $this ); if ( ! $this->is_storeapps_onboarding() && true === $sa_is_page_for_notifications && in_array( strtolower( $this->sku ), array( 'sm', 'so', 'bvm', 'saff', 'se' ), true ) ) { $access_token = get_option( '_storeapps_connector_access_token' ); $token_expiry = get_option( '_storeapps_connector_token_expiry' ); if ( empty( $access_token ) || ( ! empty( $token_expiry ) && time() > $token_expiry ) ) { $current_url = add_query_arg( 'sa-redirect', '1' ); $current_url = remove_query_arg( 'sa-redirect', $current_url ); if ( ! empty( $current_url ) ) { $current_url = ( isset( $_SERVER['HTTPS'] ) && 'on' === $_SERVER['HTTPS'] ? 'https' : 'http' ) . '://' . $_SERVER['HTTP_HOST'] . $current_url; // phpcs:ignore update_option( '_storeapps_connector_onboarding_redirect_url', esc_url_raw( $current_url ), 'no' ); } $redirect_to = add_query_arg( array( 'page' => 'storeapps', 'tab' => 'onboard', ), admin_url( 'admin.php' ) ); wp_safe_redirect( $redirect_to ); exit; } } } /** * Add a page for the storeapps setup */ public function add_storeapps_plugins_page() { if ( defined( 'WC_VERSION' ) && ! empty( WC_VERSION ) ) { add_submenu_page( 'admin', __( 'StoreApps', $this->text_domain ), __( 'StoreApps', $this->text_domain ), 'manage_woocommerce', 'storeapps', array( $this, 'settings_page' ) ); // phpcs:ignore } else { add_submenu_page( 'admin', __( 'StoreApps', $this->text_domain ), __( 'StoreApps', $this->text_domain ), 'install_plugins', 'storeapps', array( $this, 'settings_page' ) ); // phpcs:ignore } } /** * StoreApps setup page content */ public function settings_page() { wp_safe_redirect( add_query_arg( array( 'page' => 'storeapps', 'tab' => 'onboard', ), admin_url( 'admin.php' ) ) ); exit; } /** * To check if the current page is for onboarding * * @return boolean */ public function is_storeapps_onboarding() { $get_page = ( ! empty( $_GET['page'] ) ) ? sanitize_text_field( wp_unslash( $_GET['page'] ) ) : ''; // phpcs:ignore $get_tab = ( ! empty( $_GET['tab'] ) ) ? sanitize_text_field( wp_unslash( $_GET['tab'] ) ) : ''; // phpcs:ignore if ( 'storeapps' === $get_page && 'onboard' === $get_tab ) { return true; } return false; } /** * Start onboarding process */ public function start_onboarding() { if ( ! $this->is_storeapps_onboarding() ) { return; } ob_end_clean(); $suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min'; wp_enqueue_style( 'wp-admin' ); wp_enqueue_style( 'buttons' ); wp_enqueue_style( 'sa_wc_admin_styles', plugins_url( 'css/admin' . $suffix . '.css', __FILE__ ), array(), $this->plugin_data['Version'] ); wp_enqueue_style( 'sa_wc_setup', plugins_url( 'css/wc-setup' . $suffix . '.css', __FILE__ ), array( 'dashicons', 'install' ), $this->plugin_data['Version'] ); $this->onboarding_steps = $this->get_onboarding_steps(); $access_token = get_option( '_storeapps_connector_access_token' ); $token_expiry = get_option( '_storeapps_connector_token_expiry' ); $onboarding_steps_keys = array_keys( $this->onboarding_steps ); if ( ! empty( $access_token ) && ! empty( $token_expiry ) && time() <= $token_expiry && ! isset( $_POST['save_step'] ) ) { // phpcs:ignore $this->onboarding_step = end( $onboarding_steps_keys ); } else { $this->onboarding_step = isset( $_GET['step'] ) ? sanitize_key( $_GET['step'] ) : current( $onboarding_steps_keys ); // phpcs:ignore WordPress.Security.NonceVerification } ob_start(); // @codingStandardsIgnoreStart if ( ! empty( $_POST['save_step'] ) && isset( $this->onboarding_steps[ $this->onboarding_step ]['handler'] ) ) { call_user_func( $this->onboarding_steps[ $this->onboarding_step ]['handler'], $this ); } // @codingStandardsIgnoreEnd $this->onboarding_header(); $this->onboarding_steps(); $this->onboarding_content(); $this->onboarding_footer(); exit; } /** * To get onborading steps * * @return array Onboarding steps */ public function get_onboarding_steps() { if ( empty( $this->onboarding_steps ) || ! is_array( $this->onboarding_steps ) ) { $this->onboarding_steps = array(); } $this->onboarding_steps = apply_filters( 'storeapps_onboarding_steps', $this->onboarding_steps, array( 'source' => $this ) ); return $this->onboarding_steps; } /** * Onboarding page - header section */ public function onboarding_header() { if ( ! $this->is_storeapps_onboarding() ) { return; } set_current_screen(); ?> > <?php echo __( 'StoreApps › Setup', $this->text_domain ); // phpcs:ignore ?> onboarding_css(); ?>

            StoreApps.org

            is_storeapps_onboarding() ) { return; } ?> is_storeapps_onboarding() ) { return; } $get_step = ( ! empty( $_GET['step'] ) ) ? sanitize_text_field( wp_unslash( $_GET['step'] ) ) : 'start'; // phpcs:ignore if ( empty( $get_step ) ) { return; } $output_steps = $this->onboarding_steps; ?>
              $step ) { $is_completed = array_search( $this->onboarding_step, array_keys( $this->onboarding_steps ), true ) > array_search( $step_key, array_keys( $this->onboarding_steps ), true ); if ( $step_key === $this->onboarding_step ) { ?>
            '; if ( ! empty( $this->onboarding_steps[ $this->onboarding_step ]['view'] ) ) { call_user_func( $this->onboarding_steps[ $this->onboarding_step ]['view'], $this ); } echo ''; } /** * Onboarding page - footer section */ public function onboarding_footer() { if ( ! $this->is_storeapps_onboarding() ) { return; } ?> text_domain ); // phpcs:ignore ?> onboarding_steps ) ) { $this->onboarding_steps = $this->get_onboarding_steps(); } $keys = array_keys( $this->onboarding_steps ); if ( empty( $step ) ) { $step = ( ! empty( $this->onboarding_step ) ) ? $this->onboarding_step : ( ( ! empty( $_GET['step'] ) ) ? sanitize_text_field( wp_unslash( $_GET['step'] ) ) : current( $keys ) ); // phpcs:ignore if ( empty( $this->onboarding_step ) ) { $this->onboarding_step = $step; } } if ( end( $keys ) === $step ) { return admin_url(); } $step_index = array_search( $step, $keys, true ); if ( false === $step_index ) { return ''; } return add_query_arg( 'step', $keys[ $step_index + 1 ], remove_query_arg( 'storeapps_error' ) ); } /** * Default onboarding steps * * @param array $steps The steps. * @param array $args Additional arguments. * @return array $steps */ public function default_onboarding_steps( $steps = array(), $args = array() ) { $steps = array( 'start' => array( 'label' => __( 'Start', $this->text_domain ), // phpcs:ignore 'view' => array( $this, 'onboarding_start_view' ), 'handler' => array( $this, 'onboarding_start_handler' ), ), 'authorize' => array( 'label' => __( 'Authorize', $this->text_domain ), // phpcs:ignore 'view' => array( $this, 'onboarding_authorize_view' ), 'handler' => array( $this, 'onboarding_authorize_handler' ), ), 'complete' => array( 'label' => __( 'Complete', $this->text_domain ), // phpcs:ignore 'view' => array( $this, 'onboarding_complete_view' ), 'handler' => '', ), ); return $steps; } /** * Onboarding start page view */ public function onboarding_start_view() { if ( ! $this->is_storeapps_onboarding() ) { return; } $get_step = ( ! empty( $_GET['step'] ) ) ? sanitize_text_field( wp_unslash( $_GET['step'] ) ) : 'start'; // phpcs:ignore if ( empty( $get_step ) ) { return; } ?>

            text_domain ), '' . esc_html( $this->name ) . '', '' . esc_html__( 'StoreApps.org account', $this->text_domain ) . '' ); // phpcs:ignore ?>

            1.  text_domain ); // phpcs:ignore ?>
            2.  text_domain ); // phpcs:ignore ?>
            3.  text_domain ); // phpcs:ignore ?>
            4.  text_domain ); // phpcs:ignore ?>

            ' . esc_html__( 'privacy policy', $this->text_domain ) . ''; // phpcs:ignore ?>

            text_domain ); // phpcs:ignore ?>
            get_next_step_link() ) ); exit; } /** * Onboarding authorize page view */ public function onboarding_authorize_view() { if ( ! $this->is_storeapps_onboarding() ) { return; } $get_step = ( ! empty( $_GET['step'] ) ) ? sanitize_text_field( wp_unslash( $_GET['step'] ) ) : 'start'; // phpcs:ignore if ( empty( $get_step ) ) { return; } $code = ( ! empty( $_GET['code'] ) ) ? sanitize_text_field( wp_unslash( $_GET['code'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification if ( empty( $code ) ) { $protocol = 'https'; $url = $protocol . '://www.storeapps.org/oauth/authorize/?response_type=code&client_id=' . $this->client_id . '&storeapps-upgrader=' . $this->get_upgrader_version() . '&redirect_uri=' . add_query_arg( array( 'action' => $this->prefix . '_get_authorization_code' ), admin_url( 'admin-ajax.php' ) ); wp_safe_redirect( $url ); exit; } ?>
            'authorization_code', 'code' => $code, 'redirect_uri' => add_query_arg( array( 'action' => $this->prefix . '_get_authorization_code' ), admin_url( 'admin-ajax.php' ) ), ); $protocol = 'https'; $url = $protocol . '://www.storeapps.org/oauth/token'; $next_step_url = add_query_arg( array( 'page' => 'storeapps', 'tab' => 'onboard', 'step' => 'complete', ), admin_url( 'admin.php' ) ); $parsed_site_url = wp_parse_url( site_url() ); $parsed_domain = ( false !== $parsed_site_url ) ? $parsed_site_url['host'] : 'localhost'; $nonce = md5( $parsed_domain . $this->prefix . substr( $this->client_id, 6, 10 ) . substr( $args['code'], 11, 20 ) . substr( $this->client_secret, 16, 10 ) ); ?>
            get_next_step_link() ) ); exit; } /** * Onboarding complete page view */ public function onboarding_complete_view() { if ( ! $this->is_storeapps_onboarding() ) { return; } $get_step = ( ! empty( $_GET['step'] ) ) ? sanitize_text_field( wp_unslash( $_GET['step'] ) ) : 'start'; // phpcs:ignore if ( empty( $get_step ) ) { return; } global $wp_version; $access_token = get_option( '_storeapps_connector_access_token' ); $redirect_url = get_option( '_storeapps_connector_onboarding_redirect_url', '' ); $dashicon = ( version_compare( $wp_version, '5.2.0', '>=' ) ) ? 'dashicons-yes-alt' : 'dashicons-yes'; ?>

            text_domain ); // phpcs:ignore ?>


            slug ); if ( file_exists( $file ) ) { $is_wc_log = true; } } else { $file = ini_get( 'error_log' ); } if ( empty( $file ) ) { $file = __( 'PHP Error Log', $this->text_domain ); // phpcs:ignore } ?>

            text_domain ); // phpcs:ignore ?>
            text_domain ), '' . $this->name . '' ); ?>

            text_domain ); // phpcs:ignore ?>

            text_domain ); // phpcs:ignore ?>

            text_domain ); // phpcs:ignore ?>

            1. text_domain ), '' . esc_html__( 'WooCommerce > Status', $this->text_domain ) . '' ); // phpcs:ignore ?>
            2. =' ) ) { ?>
            3. text_domain ), '' . esc_html__( 'Tools > Site Health > Info', $this->text_domain ) . '' ); // phpcs:ignore ?>
            4. text_domain ), '' . str_replace( ABSPATH, '', $file ) . ' ' ); // phpcs:ignore ?>
            5. text_domain ), '' . __( 'PHP Error Log', $this->text_domain ) . '' ); // phpcs:ignore ?>
            6. text_domain ); // phpcs:ignore ?>
            7. text_domain ), '' . antispambot( 'support@storeapps.org' ) . '' ); // phpcs:ignore ?>

            text_domain ); // phpcs:ignore ?>

            get_storeapps_data(); $this->last_checked = ( ! empty( $timestamp ) ) ? $timestamp : time(); $storeapps_data['last_checked'] = $this->last_checked; $this->set_storeapps_data( $storeapps_data ); return $this->last_checked; } /** * Get check update timeout in minutes * * @return integer */ public function get_check_update_timeout_minutes() { $access_token = get_option( '_storeapps_connector_access_token' ); if ( ! empty( $access_token ) ) { return ( 12 * 60 ); } return ( 24 * 60 ); } /** * Get check update timeout in seconds * * @return integer */ public function get_check_update_timeout_seconds() { return ( $this->get_check_update_timeout_minutes() * 60 ); } /** * Get requesting status of storeapps data * * @return string */ public function get_requesting() { return get_option( 'is_requesting_storeapps_data', 'no' ); } /** * Toggle requesting storeapps data */ public function toggle_requesting() { $is_requesting = $this->get_requesting(); if ( 'no' === $is_requesting ) { $is_requesting = 'yes'; } else { $is_requesting = 'no'; } update_option( 'is_requesting_storeapps_data', $is_requesting, 'no' ); } /** * Get current file's version * * @return string */ public function get_upgrader_version() { $version_details = explode( '_', __CLASS__ ); $version_details = array_filter( $version_details, 'is_numeric' ); $upgrader_version = implode( '.', $version_details ); return strval( $upgrader_version ); } /** * Function to log messages generated by this file * * @param string $level Message type. Valid values: debug, info, notice, warning, error, critical, alert, emergency. * @param string $message The message to log. */ public function log( $level = 'notice', $message = '' ) { if ( empty( $message ) ) { return; } if ( defined( 'WC_PLUGIN_FILE' ) && ! empty( WC_PLUGIN_FILE ) ) { if ( function_exists( 'wc_get_logger' ) ) { $logger = wc_get_logger(); $context = array( 'source' => 'storeapps-upgrade' ); $logger->log( $level, $message, $context ); } elseif ( file_exists( plugin_dir_path( WC_PLUGIN_FILE ) . 'includes/class-wc-logger.php' ) ) { include_once plugin_dir_path( WC_PLUGIN_FILE ) . 'includes/class-wc-logger.php'; $logger = new WC_Logger(); $logger->add( 'storeapps-upgrade', $message ); } } else { error_log( 'storeapps-upgrade' . ' ' . $message ); // phpcs:ignore } } /** * Sanitize variables * * @param mixed $var The variable to sanitize. * @return mixed */ public function clean( $var = null ) { if ( is_array( $var ) ) { return array_map( array( $this, 'clean' ), $var ); } else { return is_scalar( $var ) ? wp_filter_post_kses( $var ) : $var; } } /** * Add social links * * @param string $prefix Plugin prefix. * @return string $social_link Social links. */ public static function add_social_links( $prefix = '' ) { $is_hide = get_option( 'hide_storeapps_social_links', 'no' ); if ( 'yes' === $is_hide ) { return; } $social_link = ''; $social_link .= ''; $social_link .= ""; $social_link .= ''; return $social_link; } } } pro/sa-includes/class-storeapps-cache.php000064400000007706147600337620014472 0ustar00get( $key ); if ( $val === null ) { // Not in cache, compute $val = doyourprocess(); $cache->set( $key, $val ); } // Now use the $val function cleanup() { $cache = new StoreApps_Cache('category', 14 * 86400); $cache->cleanup(); } // For cleanup wp_schedule_event( time(), 'daily', array($this, 'cleanup') ); */ // @codingStandardsIgnoreEnd // /** * Class to handle cache for quick help */ class StoreApps_Cache { /** * Base directory * * @var string */ public $base_dir; /** * Cache Expiration * * @var integer */ public $expire_after; /** * Is cache enabled * * @var bool */ public $enabled; /** * Cache group * * @var string */ public $_group; // phpcs:ignore /** * Cache hashes * * @var array */ public $_hashes; // phpcs:ignore /** * Set cache * * @param string $key Key. * @param mixed $data Data to cache. */ public function set( $key, $data ) { if ( ! $this->enabled ) { return false; } $res = file_put_contents( $this->file( $key ), wp_json_encode( $data ) ); // phpcs:ignore return ( false === $res ) ? false : true; } /** * Get data from cache * * @param string $key Key. * @return mixed Cache Data. */ public function get( $key ) { if ( ! $this->enabled ) { return null; } if ( $this->exists( $key ) ) { return json_decode( file_get_contents( $this->file( $key ) ) ); // phpcs:ignore } return null; } /** * Delete cache * * @param string $key Key. * @return bool */ public function delete( $key ) { if ( ! $this->enabled ) { return true; } if ( $this->exists( $key ) ) { return unlink( $this->file( $key ) ); // phpcs:ignore } return true; } /** * Cleanup cache * * @return bool */ public function cleanup() { if ( ! $this->enabled ) { return true; } foreach ( glob( $this->base_dir . $this->_group . '*' ) as $filename ) { if ( filemtime( $filename ) < time() - $this->expire_after ) { @unlink( $filename ); // phpcs:ignore } } return true; } /** * Cache key exists * * @param string $key Key. * @return mixed Cache data. */ private function exists( $key ) { return ( is_file( $this->file( $key ) ) ); } /** * File * * @param string $key Key. * @return string Cache file. */ private function file( $key ) { return $this->base_dir . $this->_group . '_' . $this->hash( $key ); } /** * Hash * * @param string $key Key. * @return mixed Hash. */ private function hash( $key ) { if ( ! array_key_exists( $key, $this->_hashes ) ) { $this->_hashes[ $key ] = md5( $key ); } return $this->_hashes[ $key ]; } /** * Constructor * * @param string $group Cache Group. * @param integer $expire_after Expiration. * @param string $base_dir Base directory. */ public function __construct( $group = '', $expire_after = 86400, $base_dir = '' ) { $this->_group = sanitize_key( $group ); $this->base_dir = $base_dir; $this->expire_after = $expire_after; $this->_hashes = array(); if ( empty( $this->base_dir ) ) { $uploads = wp_upload_dir(); $uploads_base_dir = trailingslashit( $uploads['basedir'] ); $this->base_dir = $uploads_base_dir . 'sacache/'; } if ( ! is_dir( $this->base_dir ) ) { if ( false === mkdir( $this->base_dir ) ) { // phpcs:ignore $this->enabled = false; return; } } $this->base_dir = trailingslashit( $this->base_dir ); $this->enabled = true; } } } pro/templates/order-invoice.php000064400000022174147600337620012636 0ustar00 get_data() : $order; $order_date = ( $sm_is_woo30 && is_callable( array( $order, 'get_date_created' ) ) ) ? $order->get_date_created()->date('Y-m-d H:i:s') : $order->order_date; $billing_email = ( $sm_is_woo30 ) ? $order_data['billing']['email'] : $order->billing_email; $billing_phone = ( $sm_is_woo30 ) ? $order_data['billing']['phone'] : $order->billing_phone; $customer_note = ( $sm_is_woo30 ) ? $order_data['customer_note'] : $order->customer_note; $order_discount = ( $sm_is_woo30 ) ? $order_data['discount_total'] : $order->order_discount; $order_total = ( $sm_is_woo30 ) ? $order_data['total'] : $order->order_total; $payment_method_title = ( $sm_is_woo30 ) ? $order_data['payment_method_title'] : $order->payment_method_title; $date_format = get_option('date_format'); if (is_plugin_active ( 'woocommerce-sequential-order-numbers-pro/woocommerce-sequential-order-numbers.php' )) { $purchase_display_id = (isset($order_data->order_custom_fields['_order_number_formatted'][0])) ? $order_data->order_custom_fields['_order_number_formatted'][0] : $purchase_id_value; } else { $purchase_display_id = $purchase_id_value; } $counter++; if ( count( $purchase_id_arr ) == $counter ) { echo '
            '; } else { echo '
            '; } // Code to get company logo $attachment = ( is_callable( 'Smart_Manager_Settings', 'get' ) ) ? ( Smart_Manager_Settings::get( 'company_logo_for_print_invoice' ) ) : array(); if( ! empty( $attachment ) && ! empty( $attachment['url'] ) ){ echo ''; } echo '
            '; if( empty( $attachment ) ) { echo '

              '.get_bloginfo( 'name' ).'

            '; } echo '
            '; echo ''; echo ''; } $formatted_shipping_address = $order->get_formatted_shipping_address(); if( $formatted_shipping_address != '' ) { echo ''; } echo ''; echo ''; echo '
            Order # '.$purchase_display_id.' - '.date($date_format, strtotime($order_date)).'

            '; $formatted_billing_address = $order->get_formatted_billing_address(); if( $formatted_billing_address != '' ) { echo ''.__('Billing Address', 'smart-manager-for-wp-e-commerce' ).'

            '; echo $formatted_billing_address; echo '


            '.__('Shipping Address', 'smart-manager-for-wp-e-commerce' ).'

            '; echo $formatted_shipping_address; echo '

            '.__('Email id', 'smart-manager-for-wp-e-commerce' ).': '.$billing_email.'
            '.__('Tel', 'smart-manager-for-wp-e-commerce' ).' : '.$billing_phone.'
            '; echo '
            '; $total_order = 0; foreach($order->get_items() as $order_item) { $_product = ( $sm_is_woo44 && is_callable( array( $order_item, 'get_product' ) ) ) ? $order_item->get_product() : $order->get_product_from_item( $order_item ); $_product_data = ( $sm_is_woo30 && is_callable( array( $_product, 'get_data' ) ) ) ? $_product->get_data() : $_product; $item = ( $sm_is_woo30 && is_callable( array( $order_item, 'get_data' ) ) ) ? $order_item->get_data() : $order_item; if( $sm_is_woo30 ) { $formatted_variation = (!empty($_product_data['attributes']) && $_product->post_type == 'product_variation') ? wc_get_formatted_variation($_product_data['attributes'], true) : ''; } else { $formatted_variation = (!empty($_product)) ? woocommerce_get_formatted_variation( $_product->variation_data, true ) : ''; } $sku = $variation = ''; $qty = ( $sm_is_woo30 ) ? $order_item['qty'] : $item['item_meta']['_qty'][0]; $sku = ( ! empty( $_product ) && is_callable( array( $_product, 'get_sku' ) ) ) ? $_product->get_sku() : ''; $variation = ( !empty( $formatted_variation ) ) ? ' (' . $formatted_variation . ')' : ''; $item_total = ( $sm_is_woo30 && is_callable( array( $order_item, 'get_total' ) ) ) ? $order_item->get_total() : $order_item['line_total']; $total_order += $item_total; echo ''; } echo ''; echo ''; if ($order_discount > 0) { $order_discount = ($sm_is_woo30) ? wc_price($order_discount) : woocommerce_price($order_discount); echo ''; echo ''; } $order_tax = ($sm_is_woo30) ? wc_price($order->get_total_tax()) : woocommerce_price($order->get_total_tax()); $order_total = ($sm_is_woo30) ? wc_price($order_total) : woocommerce_price($order_total); echo ''; echo ''; echo '
            '.__('Product', 'smart-manager-for-wp-e-commerce' ).''.__('SKU', 'smart-manager-for-wp-e-commerce' ).' '.__('Quantity', 'smart-manager-for-wp-e-commerce' ).''.__('Price', 'smart-manager-for-wp-e-commerce' ).'
            '; echo $item['name'] . $variation; echo ''.$sku.''; echo $qty; echo ''; echo ($sm_is_woo30) ? wc_price($item_total) : woocommerce_price($item_total); echo '

            '.(($customer_note != '')? __('Order Notes', 'smart-manager-for-wp-e-commerce' ).' : ' .$customer_note:'').'
            Subtotal '.$order->get_subtotal_to_display().'
            '.__('Shipping', 'smart-manager-for-wp-e-commerce' ).' '.$order->get_shipping_to_display().'
            '.__('Order Discount', 'smart-manager-for-wp-e-commerce' ).' '.$order_discount.'
            '.__('Tax', 'smart-manager-for-wp-e-commerce' ).' '.$order_tax.'
            '.__('Total', 'smart-manager-for-wp-e-commerce' ).' '.$order_total.' -via '.$payment_method_title.'
            '; } pro/templates/email.php000064400000007412147600337620011156 0ustar00 $email_heading ) ); } else if ( function_exists( 'woocommerce_get_template' ) ) { woocommerce_get_template( 'emails/email-header.php', array( 'email_heading' => $email_heading ) ); } else { echo $email_heading; } add_filter( 'wp_mail_content_type','sm_beta_pro_batch_set_content_type' ); function sm_beta_pro_batch_set_content_type(){ return "text/html"; } ?> '. __( 'Hi there!', 'smart-manager-for-wp-e-commerce' ) .'

            '. __( 'Smart Manager has successfully completed', 'smart-manager-for-wp-e-commerce' ) .' \''. $background_process_params['process_name'] .'\' process on '. get_bloginfo() .'.

            '; if( !empty( $actions ) ) { $msg_body .= '

            '. __('Below are the lists of updates done:','smart-manager-for-wp-e-commerce' ) .'

            '; foreach ( $actions as $action ) { $msg_body .= ''; } $msg_body .= '
            '. __('Field', 'smart-manager-for-wp-e-commerce' ) .' '. __('Action', 'smart-manager-for-wp-e-commerce' ) .' '. __('Value', 'smart-manager-for-wp-e-commerce' ) .' '. __('Records Updated', 'smart-manager-for-wp-e-commerce' ) .'
            '. ( ! empty( $action['meta']['displayTitles']['field'] ) ? $action['meta']['displayTitles']['field'] : $action['type'] ) .' '. ( ! empty( $action['meta']['displayTitles']['operator'] ) ? $action['meta']['displayTitles']['operator'] : $action['operator'] ) .' '. ( ! empty( $action['value_display_text'] ) ? $action['value_display_text'] : ( is_array( $action['value'] ) ? $action['value'][0] : $action['value'] ) ) .' '. $records_str .'

            '; } $msg_body .= '

            '. __('If you like', 'smart-manager-for-wp-e-commerce' ) .' '. __('Smart Manager', 'smart-manager-for-wp-e-commerce' ) .' '. __('please leave us a', 'smart-manager-for-wp-e-commerce' ) .' ★★★★★ '.__('rating. A huge thank you from StoreApps in advance!', 'smart-manager-for-wp-e-commerce' ).'.
            '; echo $msg_body; echo '
            '; if ( function_exists( 'wc_get_template' ) ) { wc_get_template( 'emails/email-footer.php' ); } else if ( function_exists( 'woocommerce_get_template' ) ) { woocommerce_get_template( 'emails/email-footer.php' ); } license.txt000064400000035431147600337620006745 0ustar00 GNU GENERAL PUBLIC LICENSE Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc. 51 Franklin St, Fifth Floor, Boston, MA 02110, USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things. To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it. For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software. Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations. Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all. The precise terms and conditions for copying, distribution and modification follow. GNU GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you". Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does. 1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change. b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License. c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program. In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following: a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or, c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.) The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code. 4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it. 6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License. 7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation. 10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. END OF TERMS AND CONDITIONS smart-manager.php000064400000002121147600337620010017 0ustar00Lite Version Installed. The #1 tool for WooCommerce inventory management, stock management, bulk edit, export, delete, duplicate...from one place using an Excel-like sheet editor. * Version: 8.54.0 * Author: StoreApps * Author URI: https://www.storeapps.org/ * Text Domain: smart-manager-for-wp-e-commerce * Domain Path: /languages/ * Requires at least: 5.0 * Tested up to: 6.7.1 * Requires PHP: 5.6+ * WC requires at least: 3.0.0 * WC tested up to: 9.5.2 * Copyright (c) 2010 - 2025 StoreApps. All rights reserved. * License: GNU General Public License v2.0 * License URI: http://www.gnu.org/licenses/gpl-2.0.html */ defined( 'ABSPATH' ) || exit; if ( ! defined( 'SM_PLUGIN_FILE' ) ) { define( 'SM_PLUGIN_FILE', __FILE__ ); } if ( ! class_exists( 'Smart_Manager' ) && file_exists( ( dirname( __FILE__ ) ) . '/class-smart-manager.php' ) ) { include_once 'class-smart-manager.php'; } readme.txt000064400000346727147600337620006575 0ustar00=== WooCommerce Advanced Bulk Edit Products, Orders, Coupons, Any WordPress Post Type - Smart Manager === Contributors: storeapps, niravmehta, Tarun.Parswani, mansi shah, ratnakar.dubey, gomathip, abhaypatel01 Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=CPTHCDC382KVA Author URI: https://www.storeapps.org/woocommerce-plugins/ Plugin URI: https://www.storeapps.org/product/smart-manager/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme Tags: woocommerce advanced bulk edit, wordpress bulk edit, woocommerce inventory management, woocommerce stock manager, woocommerce product manager Requires at least: 5.0 Tested up to: 6.7.1 Requires PHP: 5.6 Stable tag: 8.54.0 License: GPLv2 WooCommerce Advanced Bulk Edit products, orders, & posts in an Excel-like sheet editor. Get advanced WooCommerce stock, pricing, & order management. == Description == **Powerful and advanced WooCommerce bulk edit plugin** to manage your store from one place in a user-friendly, **Excel-like sheet editor**. > ***Smart Manager is a lifesaver**. Anyone starting a new store or migrating to a new line (perhaps seasonal shifts) should consider this mandatory in their toolbox.* > – Envoymatt **Smart Manager** is a single-screen, excel-like interface to browse and manage these dashboards – **products (all types), orders, blog posts, and coupons**. Select a dashboard and start making edits without leaving the spreadsheet. Speed up the way you create content and manage your store. Manage Products, Orders, Coupons, Get endless powerful features with this FREE plugin https://www.youtube.com/watch?v=COXCuX2rFrk ✅ **Bulk edit all WooCommerce product types including custom ones** – simple, variable, product variations, subscriptions, bundles, grouped, and more. ✅ Smart WooCommerce bulk product editor – Bulk edit **SKUs, weight, quantity, backorders, stock status, tax status, shipping class, product title, gallery images, and all the important stock management-related fields**. ✅ WooCommerce **bulk edit attributes and categories** – bulk assign/remove categories and attributes to/from products, and also manage them effortlessly. ✅ WooCommerce **bulk edit price** – change regular price and sale price. ✅ Bulk edit **WooCommerce orders, coupons, blog posts, users (customers), subscriptions, product addons... any WordPress post type, custom taxonomies, and custom fields**. ✅ **Do an advanced search and make bulk edits**. ✅ Perform operations like **append, prepend, increase, decrease, search and replace, etc. in bulk**. ✅ **Schedule bulk edit** – set a specific date to perform your bulk edit task. For example, increase all product prices tomorrow by 15%. ✅ **Undo your bulk edit operations** if required. ✅ **Compatible with WooCommerce High Performance Order Storage (HPOS)** **Power-packed lite (free) version**: https://www.youtube.com/watch?v=BrvU6GD9pWU - **Inline edits** – Up to three **direct edits** simultaneously without saving the changes. - **Live preview and infinite scrolling** for smoother navigation. - **Zero edit restrictions on the post-type fields available**. -- **Products** – increase/decrease the sale price and regular price, manage backorders and SKUs, change product descriptions, categories, attributes, tags, tax class, tax status, etc. WooCommerce stock management can’t get simpler than this. -- **Orders** – change status, billing details, shipping details, currency, etc. -- **Coupons** – modify coupon usage, amount, type, expiry date, etc. -- **Posts** – title, image, update post status from draft to publish, etc. - Edit post types using **search filters, date filters, and column filters**. - **Stock log** – see the stock history for each product and identify how quickly it is moving. - **Edit product variations for variable products** after clicking on the “Show Variations†button. - **Add new products, orders, coupons, and posts directly** using the spreadsheet. - **Import products CSV** - **Export CSV of stock-related data columns for products**. - **Delete/Move to trash** single or multiple products, orders, coupons, and posts. - Search using keywords, categories, attributes, or any other field. - **Advanced Search** with AND condition, search operators (<,>,=,<=, >=, is, contains, etc.) and drop-down filters. Makes it **easy to filter inventory** by type, category, - backorders, manage stock, stock status, order status, coupon type, post status, and a lot more... Example – Search for SKU is WC09 and price >= $600. - **Admin Columns** – Show/hide data columns for better usability. Sort data to personalize the dashboard view. For example, sort sale prices in ascending or descending order. - Reset the order of the admin columns to the default view. - **Email notifications** are sent to customers automatically when the order status changes. - **Transactional notes are also automatically added** to the order when the status changes. - **Sticky header** to always stay in control when scrolling through thousands of records. - Image preview for image type fields in the grid for easier identification of your WooCommerce inventory. - **Distraction-free mode** when performing store operations. 18300+ users love the Smart Manager WooCommerce bulk editor... Embrace the power of next-generation WooCommerce store management. Smart Manager is an **indispensable tool for all WordPress users**. > ***Smart Manager makes our day way more productive.** We now can **change our stock in just 2 clicks** instead of hours of work. Also, the support is really quick and helpful!* > – Jasper Vandiemen > 'An Essential Plugin for WooCommerce – Smart Manager Exceeds All Expectations!' > I wholeheartedly recommend Smart Manager. It is an essential plugin for any WooCommerce user looking to streamline their product management and increase efficiency. With its wide range of features, seamless integration, and outstanding performance, Smart Manager has exceeded my expectations and **become an indispensable tool in my online store**. Give it a try and experience the benefits of this amazing plugin for yourself! > - Mio Creativ ##Why should you choose Smart Manager WooCommerce bulk editor? **Powerful features** – Smart Manager is jam-packed with powerful features both in the Lite (free) and the Pro (paid) versions. **Zero coding chaos** – Update your data within seconds with just a few clicks. No learning curve or tech skills needed. **Efficiency** – Save hours every week by ditching mundane tasks and embracing advanced WooCommerce bulk editing bliss. **Error-busting hero** – Say goodbye to calculation errors and inconsistencies with lightning-fast batch processing. **Data delight** – Export data with ease, keeping your information safe and sound. **Happy customers, happy life** – Smooth WooCommerce inventory management, WooCommerce orders management, and efficient operations mean happy customers and a thriving business. **TL;DR:** Smart Manager Lite makes managing your e-commerce store easy. Quickly edit products, orders, coupons, and posts using inline edit. Use advanced search to find and update items, manage stock, and track performance. Bulk edit prices, SKUs, and order statuses, or add new products and orders directly. Simplify store management in one place. > ***I’m very happy using the free version of the plugin on my WooCommerce site**. No issue with a lot of plugins I have active on my site. > The best is the support: **6 stars** I would give them. Keep in mind that I’m talking about the free version and from the first contact they have been very kind and fast. Sure I recommend it!* > - FreelanceJose Smart Manager Pro features: Stay ahead of your competitors with [Smart Manager Pro](https://www.storeapps.org/product/smart-manager/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme). - **WooCommerce advanced bulk edit / batch update / mass update any post type records** – products, variations, orders, coupons, subscriptions, bookings, media, users/customers, courses, events, product add-ons, advanced custom fields, custom meta fields, etc. - **Inline edit (direct edit) records from the grid** – Update inventory, modify order status, change the coupon expiry date, add post images, etc. - **Bulk edit 100000+ records for any post type within minutes**. Smart Manager has successfully tested these numbers. - **Update single/multiple fields for a few or all records at once**...without errors! - Quick WooCommerce stock management – **change prices, increase inventory levels, change product categories, attributes, or any other fields, all in bulk quickly**. - **Bulk edit order statuses** including custom order statuses, search for orders using advanced filters, export orders to CSV, and more...WooCommerce order management made easy. - **Copy any field from any record** using Bulk edit / Batch update. - **Copy value from any other field** for any record. - **Copy the attributes of a specific product and bulk assign the same to multiple products**. - **Filter any post type & perform bulk edit operations** on them. - Utilize your time for other business tasks while the **Bulk edit / Batch update runs in the background**. - **Inline update** ‘Product Gallery Images, Featured Image’ using the media library. - **Undo inline edit and bulk edit changes (Tasks)** you made. Name your tasks and revert the changes at once. It can be a single task or multiple tasks. - **Delete all products permanently or move them to trash** – based on filters, categories, and attributes. Delete featured images and media library images directly from the grid. - **Delete records** for orders, coupons, and any post type **in bulk**. You can **do it using our search filters** too. - **Delete media when any post-type record is deleted**, provided the media is linked with that post-type record only. - **Duplicate single, multiple, or all records for any post type**. - Perform an advanced search using multiple AND, multiple OR, multiple AND + OR conditions to get very specific results and then make inline edits or bulk edits. https://www.youtube.com/watch?v=20iodFpP5ow > **A massive time saver...flawless export!** > *We have over 6000 individual lines on our site and this has saved us huge amounts of time. > Bulk edit works flawlessly, which is a massive time saver. If you need to change all of your prices on the entire site by a % or value, you can with a couple of clicks! We updated the Tax > class on all products in less than 3 minutes. The CSV export tool actually works unlike some I have tried, with all 6000 odd lines neatly exported in one attempt. No missing or corrupt data.* > – Kevin Goodchild, Obsolete Electronic Components - Create **Excel-like custom views** / segmented views / column sets, i.e. view only the data you want. Enable / disable data columns, make edits, apply filters, and save. - **Supports all post types and custom taxonomies**. - **Predefined custom views** – Product Stock & Product Price List - **Advanced Export CSV for all post types and custom taxonomies** – access all or filtered data using date, search, or column filters. Perfect for inventory management, reporting, sales, marketing campaigns, and store migration. - **Rename the admin columns title at your convenience**. For example, change Stock to Quantity. - Add your own logo to packing slips. - **Print PDF invoices for orders in bulk**. - Know the **lifetime value (LTV) of all your customers** along with their total purchases to date and last order details. - **Manage WordPress user roles** – change user role, change password, etc. - **Give dashboard-specific access to non-admin users** including any custom user role. You can even give dashboard specific access to any specific user email. - **Manage and edit WordPress custom taxonomies**. > **I would happily pay five times for this product!** > *What really sold me on this was Bulk Edit. My assistant does not have to do any complex math now (earlier, I always feared she would make a mistake)! With Smart Manager, she has more free time at hand, hence I asked her to set up autoresponder emails for our customers. The response was phenomenal. Our repeat sales were up by 19.5%.* > – Jeff Smith - Import orders, coupons, and any other post type (coming soon). - Manage, view, filter, and edit custom fields of top WooCommerce & WordPress plugins. **Smart Manager is compatible with these plugins**. It automatically recognizes all custom fields added by other plugins. -- [Advanced Custom Fields (ACF)](https://wordpress.org/plugins/advanced-custom-fields/) -- [WooCommerce Subscriptions](http://automattic.pxf.io/5gN9zb) -- [Affiliate For WooCommerce](https://woocommerce.com/products/affiliate-for-woocommerce/) -- [WooCommerce Smart Coupons](https://woocommerce.com/products/smart-coupons/) -- [WooCommerce Memberships](http://automattic.pxf.io/3e1N1A) -- [WooCommerce Bookings](http://automattic.pxf.io/badoo6) -- [WooCommerce Product Add-Ons](https://automattic.pxf.io/oqd99Y) -- [WooCommerce Cost of Goods](https://automattic.pxf.io/5gJ9Y3) -- [Min/Max Quantities](https://automattic.pxf.io/zNdLne) -- [Min and Max Quantity for WooCommerce](https://wordpress.org/plugins/minmax-quantity-for-woocommerce/) -- [Woocommerce Minimum and Maximum Quantity](https://wordpress.org/plugins/woo-min-max-quantity-limit/) -- [Customer Email Verification](https://automattic.pxf.io/3e1DmX) -- [Yoast SEO](https://wordpress.org/plugins/wordpress-seo/) -- [WordPress SEO Plugin – Rank Math](https://wordpress.org/plugins/seo-by-rank-math/) -- [Germanized for WooCommerce](https://wordpress.org/plugins/woocommerce-germanized/) -- [LifterLMS](https://wordpress.org/plugins/lifterlms/) -- [TutorLMS](https://wordpress.org/plugins/tutor/) -- [ShopEngine](https://wordpress.org/plugins/shopengine/) -- [WooCommerce Dropshipping](https://automattic.pxf.io/B0LZRx) -- [WooCommerce Product Vendors](https://automattic.pxf.io/LXkb4o) -- [Orderable](https://stellarwp.pxf.io/c/3616375/1287872/9639) -- [GiveWP](https://stellarwp.pxf.io/c/3616375/1287837/9639) -- [File Uploads Addon for WooCommerce](https://wordpress.org/plugins/woo-addon-uploads/) - And all other features of the Smart Manager Lite version... **TL;DR:** With Smart Manager, quickly search and delete expired subscriptions, bulk edit bookings, inline edit memberships, search and edit posts by keyword, adjust product costs in bulk, manage courses, and more. Effortlessly handle suppliers, vendors, warehouses, and WooCommerce inventory. Get priority support from plugin developers and receive plugin updates till your license period. [Try all these features in the Smart Manager Pro Live Demo](https://demo.storeapps.org/?demo=sm-woo&utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) > **There is no comparable solution** > *Smart Manager Pro is an absolutely efficient tool for handling large datasets, especially when you need to delete them from the SQL database. > Seamlessly integrated with WooCommerce, it’s always up-to-date. I particularly love its feature of permanently deleting images – it automatically removes them from the server, SQL database, and library. > Its advanced search methods make it a powerful management plugin. Additionally, **it boasts super fast support that’s truly committed to assisting and resolving issues**. Highly recommended for effective management tasks.* > – Felix > **This software is indispensable!** > *It is possible to operate in bulk on anything: categories, attributes, tags, moving products from one category to another... > We had a problem and support walked us through the resolution, even creating a software update to test the resolution. > **In 20 years of working on the web, I have never found an assistance that does not abandon you and does not attribute the problem to other causes.*** > – Lolopo [Get Smart Manager Pro](https://www.storeapps.org/product/smart-manager/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) [Click here](https://www.storeapps.org/docs/sm-lite-vs-pro/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) to know the difference between Lite & Pro versions. It’s your smart WordPress bulk edit plugin that won’t fail you! The plugin is also **GDPR-ready – it doesn’t collect personal data**. **How to use Smart Manager?** * [Bulk edit attributes](https://www.storeapps.org/woocommerce-bulk-edit-attributes/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) * [Bulk edit WordPress posts and pages](https://www.storeapps.org/bulk-edit-wordpress-posts-pages/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) * [Advanced products export to CSV](https://www.storeapps.org/woocommerce-export-products/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) * [Advanced orders export to CSV](https://www.storeapps.org/woocommerce-export-orders/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) * [Export customers or users](https://www.storeapps.org/woocommerce-export-customers/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) * [Delete all products](https://www.storeapps.org/woocommerce-delete-all-products/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) * [Find products, orders, subscriptions by SKU](https://www.storeapps.org/woocommerce-search-by-sku/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) * [Set product featured images](https://www.storeapps.org/woocommerce-featured-images/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) * [Create Excel-like custom views / Column Sets](https://www.storeapps.org/excel-custom-views-woocommerce-wordpress/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) * [Manage WordPress admin columns](https://www.storeapps.org/wordpress-admin-columns/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) * [Manage backorders in bulk](https://www.storeapps.org/woocommerce-backorder/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) * [Bulk edit sale price](https://www.storeapps.org/woocommerce-sale-price/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) * [Bulk assign or remove product categories and sub-categories](https://www.storeapps.org/woocommerce-product-categories/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) [View more...](https://www.storeapps.org/category/guides/smart-manager/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) **Smart Manager Pro Demo, Documentation, and other links...** * [Smart Manager Detailed Documentation](https://www.storeapps.org/knowledgebase_category/smart-manager/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) * Compatible with latest versions of both [WooCommerce](https://wordpress.org/plugins/woocommerce/) and [WP e-Commerce](https://wordpress.org/plugins/wp-e-commerce/) * Available Translations: Dutch, Brazilian Portuguese, French, Romanian, Italian * Want to add a new language to Smart Manager? Contribute via [translate.wordpress.org](https://translate.wordpress.org/projects/wp-plugins/smart-manager-for-wp-e-commerce/). * Questions? [Contact us](https://www.storeapps.org/support/contact-us/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) **StoreApps’ other Pro plugins** 1. [Offermative](https://wordpress.org/plugins/offermative-discount-pricing-related-products-upsell-funnels-for-woocommerce/) - Automated discount, related product recommendations, upsells for WooCommerce. 2. [WooCommerce Bulk Variations Manager](https://www.storeapps.org/product/bulk-variations-manager/?utm_source=wprepo&utm_medium=web_bvm&utm_campaign=smwp_readme) - Create & set prices for thousands of product variations at once. 3. [Smart Offers For WooCommerce](https://www.storeapps.org/product/smart-offers/?utm_source=wprepo&utm_medium=web_mb&utm_campaign=smwp_readme) - Targeted WooCommerce one-click upsells, BOGO, order bumps and Buy Now buttons for direct checkout. 4. [Email Customizer for WooCommerce](https://www.storeapps.org/product/smart-emails/?utm_source=wprepo&utm_medium=web_se&utm_campaign=smwp_readme) - Customize default WooCommerce transactional emails to match your brand. Edit text, colors and other elements in a live preview. 5. [WooCommerce Name Your Price Plugin](https://www.storeapps.org/product/offer-your-price/?utm_source=wprepo&utm_medium=web_se&utm_campaign=smwp_readme) - Create a pay what you want or a donation-based pricing system. 6. [Frequently Bought Together For WooCommerce](https://www.storeapps.org/product/frequently-bought-together-woocommerce/?utm_source=wprepo&utm_medium=web_se&utm_campaign=smwp_readme) - Show users related products or recommendations to the product they are already viewing. 7. [Express Login For WordPress](https://www.storeapps.org/product/express-login-for-wordpress/?utm_source=wprepo&utm_medium=web_se&utm_campaign=smwp_readme) - Create secure, auto-login links for WordPress and WooCommerce without the need for a username and password. [View out all our WooCommerce plugins](https://www.storeapps.org/woocommerce-plugins/?utm_source=wprepo&utm_medium=web_others&utm_campaign=smwp_readme) **Our other free plugins** 1. [Icegram Express](https://wordpress.org/plugins/email-subscribers/) - Email Subscribers & Newsletters 2. [Icegram Engage](https://wordpress.org/plugins/icegram/) - Popups, welcome bar, opt-ins and lead generation plugin 3. [Icegram Collect](https://wordpress.org/plugins/icegram-rainmaker/) - Forms, lead collection and subscription plugin 4. [Temporary Login Without Password](https://wordpress.org/plugins/temporary-login-without-password/) **Spread the love** Liked Smart Manager? Please consider leaving [five-stars](https://wordpress.org/support/plugin/smart-manager-for-wp-e-commerce/reviews/) for the plugin. It helps fellow website owners benefit from it! **Have any questions?** Feel free to [contact us](https://www.storeapps.org/support/contact-us/?utm_source=wprepo&utm_medium=web_contact&utm_campaign=smwp_readme). == Installation == 1. Unzip and upload contents of the plugin to your `/wp-content/plugins/` directory 2. Activate the plugin through the 'Plugins' menu in WordPress 3. Click on 'Smart Manager' option within WordPress admin sidebar menu == Frequently Asked Questions == = Can I export data in CSV? = Yes, you can but export feature is available in [Pro](https://www.storeapps.org/product/smart-manager/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) version. = Can I import data ? = Smart Manager does not currently support import. = Which browser to choose for best performance? = Smart Manager works best in Chrome, Firefox. Currently it is not compatible with IE. = What do I get in this Lite version? = Spreadsheet like view of products, orders and posts. Search and navigation, limited inline editing, ability to delete multiple items at once, a quick edit link to WooCommerce / WP e-Commerce editing screen. = What do I get in the Pro? = [Pro](https://www.storeapps.org/product/smart-manager/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme) version has unlimited managing of product variations, full inline editing right within the spreadsheet view and a powerful Batch Update screen where you can apply multiple smart update actions to selected / all items. You can also add / duplicate products or the entire store. For Customers, you can see total sales for each customer and their last order details. You can also export data into CSV and print orders / packing slips. And not just WooCommerce, you can manage any WordPress custom post type. It also gives the warm feeling of supporting further development of the plugin. == Screenshots == 1. Smart Manager Dashboard (some functionality available only in Pro version) 2. Bulk edit / Batch update (only in Pro version) == Changelog == = 8.54.0 (16.01.2025) = * New: WooCommerce 9.5.2 compatible * Fix: Dashboard selection not working in some cases * Update: 10x boost in loading speed for the WooCommerce Products dashboard * Update: 10x speed improvement for updating taxonomy fields using Inline edit and Bulk edit (Pro) * Update: POT file = 8.53.0 (31.12.2024) = * New: Compatibility with [Germanized for WooCommerce Pro](https://vendidero.de/woocommerce-germanized) (Pro) * Fix: SQL vulnerability in Advanced Search functionality [Thanks to Patchstack team] * Update: UI/UX for dashboard combo box * Update: POT file = 8.52.0 (19.12.2024) = * New: WooCommerce 9.5.1 compatible * Fix: Advanced search functionality not working for 'Featured' column on WooCommerce Products dashboard * Fix: Advanced search functionality not working for 'Catalog Visibility' column with the 'is not' operator on WooCommerce Products dashboard * Fix: Pricing page appears blank in some cases * Fix: PHP fatal error when saving Access Privilege Settings from taxonomy dashboards (Pro) * Fix: 'Restrict by users' option in Access Privilege Settings not working (Pro) * Update: POT file = 8.51.0 (05.12.2024) = * New: WooCommerce 9.4.3 compatible * Fix: 'save_post' hook doesn't trigger when updating meta or taxonomy data * Fix: Move to Trash not working for WooCommerce Orders dashboard * Fix: Bulk Edit functionality not working when multiple actions are applied to the same field (Pro) * Fix: Delete Permanently and Move to Trash not working for WooCommerce Orders, Users and taxonomy dashboards (Pro) * Update: POT file = 8.50.0 (25.11.2024) = * New: WordPress 6.7.1 compatible * New: WooCommerce 9.4.2 compatible * Update: UI/UX for combo boxes * Update: POT file = 8.49.0 (15.11.2024) = * New: WordPress 6.7 compatible * New: WooCommerce 9.4.1 compatible * New: WooCommerce Product 'Slug' column in WooCommerce Import CSV suite * Fix: Fetching hidden meta fields in the grid impacting dashboard load speed * Fix: Broken user interface due to 'select2' library conflict with other plugins * Fix: Column header height updated with update in row height setting * Fix: Image in the 'Featured Image' column not respecting the row height setting * Fix: Internationalization related warnings on WordPress v6.7 * Update: 10x speed improvement for Bulk Edit, Move to Trash & Delete Permanently functionalities (Pro) * Update: UI/UX for combo boxes * Update: POT file = 8.48.0 (01.10.2024) = * New: WooCommerce 9.3.3 compatible * Fix: 'Post Date' column not saving when adding the record using Add Row functionality and updating using inline edit functionality * Fix: 'Post Date' column not saving when updating using Bulk Edit functionality (Pro) * Update: UI/UX for Advanced Search functionality * Update: Automatically resize the display of 'Featured Image' in the WooCommerce Products dashboard to match the 'Grid Row Height' global setting * Update: POT file = 8.47.0 (12.09.2024) = * New: WordPress 6.6.2 compatible * New: WooCommerce 9.2.3 compatible * Fix: Clicking on column headers displays modal dialogs in some cases * Fix: Incorrect last accessed dashboard on page refresh * Update: UI/UX for 'Public' view settings in Custom Views (Pro) * Update: POT file = 8.46.1 (26.08.2024) = * Fix: WordPress database error message when updating WooCommerce Products using inline edit functionality in WooCommerce v9.2.0+ * Update: POT file = 8.46.0 (26.08.2024) = * New: WooCommerce 9.2.2 compatible * Fix: Broken access control vulnerability [Thanks to Patchstack team] * Fix: Height for longtext data in the grid cells broken after last update * Update: POT file = 8.45.0 (08.08.2024) = * Fix: Height for longtext data in the grid cells not respecting the 'Grid row height' global setting * Fix: 'Order Subtotal' column not showing the correct value on WooCommerce Orders dashboard * Fix: 'Order Subtotal' column not showing the correct value on WooCommerce Subscriptions dashboard (Pro) * Fix: Date picker for the 'Schedule Later' option allowing selection of past dates (Pro) * Update: POT file = 8.44.0 (02.08.2024) = * New: WooCommerce 9.1.4 compatible * Fix: 'copy from field' operator not working when the field data type is numeric in the Bulk Edit functionality (Pro) * Update: Persist search conditions when switching from post type/taxonomy dashboard to task dashboard (Pro) * Update: POT file = 8.43.0 (26.07.2024) = * New: WordPress 6.6.1 compatible * New: WooCommerce 9.1.2 compatible * New: Manage 'Shipping Method Title' column on WooCommerce Orders dashboard * New: Manage 'Shipping Method Title' column on WooCommerce Subscriptions dashboard (Pro) * New: Manage 'Note For Customer' column on WooCommerce Orders dashboard (Pro) * Update: Show warning modal for unsaved changes in inline edit functionality * Update: POT file = 8.42.0 (09.07.2024) = * New: WordPress 6.5.5 compatible * New: WooCommerce 9.0.2 compatible * Fix: Simple search functionality not working for 'Shipping Method' column in both HPOS and non-HPOS stores on WooCommerce Orders dashboard * Fix: Simple search functionality not working for 'Shipping Method' column in both HPOS and non-HPOS stores on WooCommerce Subscriptions dashboard (Pro) * Fix: Field values not loading when switching to 'copy from' operator in Bulk Edit panel for non-HPOS stores on WooCommerce Orders and Subscriptions dashboards (Pro) * Update: POT file = 8.41.0 (21.06.2024) = * New: WooCommerce 9.0.1 compatible * New: Provision to edit 'Shipping Method' column on WooCommerce Orders dashboard * New: Provision to edit 'Shipping Method' column on WooCommerce Subscriptions dashboard (Pro) * Fix: Inline edit functionality not working for 'Order Shipping/Shipping Total Amount' and 'Shipping Method' columns on WooCommerce Orders dashboard in both HPOS and non-HPOS stores * Fix: Bulk Edit functionality not working for 'Order Shipping/Shipping Total Amount' and 'Shipping Method' columns on WooCommerce Orders dashboard in both HPOS and non-HPOS stores (Pro) * Fix: Inline edit and Bulk Edit functionalities not working for 'Order Shipping/Shipping Total Amount' and 'Shipping Method' columns on WooCommerce Subscriptions dashboard in both HPOS and non-HPOS stores (Pro) * Fix: Advanced search functionality not working for 'Shipping Method' column on WooCommerce Orders and Subscriptions dashboards in both HPOS and non-HPOS stores (Pro) * Update: Pricing page related changes * Update: POT file = 8.40.0 (14.06.2024) = * New: WordPress 6.5.4 compatible * New: WooCommerce 8.9.3 compatible * Fix: 'Edit' column not fetched on WooCommerce Orders dashboard in HPOS stores * Fix: 'Edit' column not fetched on WooCommerce Subscriptions dashboard in HPOS stores (Pro) * Update: Pricing page related changes * Update: POT file = 8.39.0 (01.06.2024) = * New: WooCommerce 8.9.1 compatible * Fix: PHP warnings occur and no content is displayed on the 'Go Pro' page if WooCommerce is not activated * Fix: Array to string conversion PHP notice when loading WooCommerce Products dashboard (Pro) * Fix: Settings button not redirecting properly on 'Docs & Support' page (Pro) * Update: 'Author' column now displays name and email address on WooCommerce Product Stock Log or any tasks dashboard * Update: Administrators now have the capability to manage and undo tasks performed by any user directly from the WooCommerce Product Stock Log or tasks dashboard * Update: POT file = 8.38.0 (10.05.2024) = * New: WordPress 6.5.3 compatible * New: WooCommerce 8.8.3 compatible * Fix: Product type updated incorrectly, when updating 'Backorders' column on WooCommerce Products dashboard using inline edit functionality * Fix: PHP warning when loading WooCommerce Products dashboard * Fix: Record values not updated in some cases when using Bulk Edit functionality in background (Pro) * Update: POT file = 8.37.0 (18.04.2024) = * New: WordPress 6.5.2 compatible * New: WooCommerce 8.8.2 compatible * New: Compatibility with [Legal Pages](https://wordpress.org/plugins/legal-pages/) * Fix: PHP warning when loading WooCommerce Products dashboard * Fix: Using 'increase by/decrease by' Bulk Edit operators setting value to '0' for WooCommerce Products 'Regular price' & 'Sale price' fields having empty values (Pro) * Fix: Using 'increase by/decrease by' Bulk Edit operators setting value to '0' for any numeric fields having empty values (Pro) * Update: Replace 'woo.com' links with 'woocommerce.com' * Update: POT file = 8.36.0 (05.04.2024) = * New: WordPress 6.5 compatible * Fix: 'Featured' column not detected in 'Column Manager' on WooCommerce Products dashboard * Fix: PHP 8.1.27 Uncaught TypeError: Cannot access offset of type string on string when clicking on 'Load More Products' button on WooCommerce Products dashboard * Fix: Advanced Search not filtering null value for date fields on WooCommerce Subscriptions dashboard (Pro) * Fix: PHP warning when fetching all accessible views for current user (Pro) * Update: POT file = 8.35.0 (22.03.2024) = * New: WooCommerce 8.7.0 compatible * Fix: Dashboard not loading due to 'select2' library conflict with other plugins * Update: Integrated product specific low stock threshold value in 'Stock' column color-coding on WooCommerce Products dashboard (Pro) * Update: POT file = 8.34.0 (15.03.2024) = * Fix: Advanced Search functionality displays variations of products whose parents are not published for 'Post Status' column in WooCommerce Products dashboard * Update: POT file = 8.33.0 (08.03.2024) = * Fix: 'Attributes' column values doesn't render properly in Bulk edit panel for WooCommerce Products dashboard (Pro) * Fix: Simple Search not searching 'Billing Email' field properly in WooCommerce Orders dashboard * Fix: Custom post statuses not visible in the 'Post Status' column on the dashboard for any post type * Fix: Advanced Search query returning cached results * Update: POT file = 8.32.0 (01.03.2024) = * New: WooCommerce 8.6.1 compatible * Fix: Column tooltip not getting updated after enabling/disabling using show/hide columns * Fix: 'increase by/decrease by' operators for date fields not working properly in Bulk edit functionality (Pro) * Fix: Undo functionality not working properly for date/datetime fields (Pro) * Fix: HTML tags in the 'Description' and 'Additional Description' fields within the exported CSV causing issues during CSV import (Pro) * Update: POT file = 8.31.0 (19.02.2024) = * New: WooCommerce 8.6.0 compatible * New: Access Privilege Settings - give controlled access to individual users in addition to user roles (Pro) * Fix: Data not loading for WooCommerce Subscriptions 'Date' fields like 'Schedule End', 'Schedule Next Payment', etc. (Pro) * Fix: Inline edit, Bulk edit & previous value not getting updated for WooCommerce Subscriptions 'Date' fields like 'Schedule End', 'Schedule Next Payment', etc. (Pro) * Fix: PHP fatal error when updating 'Attributes' field data using Bulk edit on WooCommerce Products dashboard * Fix: PHP warning when loading 'Attributes' field data on WooCommerce Products dashboard * Update: Improved Access Privilege settings UI/UX (Pro) * Update: POT file = 8.30.0 (02.02.2024) = * New: WooCommerce 8.5.2 compatible * New: WordPress 6.4.3 compatible * Fix: WooCommerce Products 'Stock Status' column doesn't update automatically with changes in the 'Backorders' column * Fix: Duplicate values in the 'Product categories', and 'Exclude categories' WooCommerce Coupons restrictions fields when updating using Bulk edit * Update: POT file [See changelog for all versions](https://www.storeapps.org/docs/sm-changelog/?utm_source=wprepo&utm_medium=web&utm_campaign=smwp_readme). == Upgrade Notice == = 8.54.0 = WooCommerce 9.5.2 compatible, Fixes related to Dashboard selection not working in some cases, Updates related to 10x boost in loading speed for the WooCommerce Products dashboard, 10x speed improvement for updating taxonomy fields using Inline edit and Bulk edit (Pro) along with other important fixes and updates. Recommended upgrade. = 8.53.0 = Compatibility with [Germanized for WooCommerce Pro](https://vendidero.de/woocommerce-germanized) (Pro), Fixes related to SQL vulnerability in Advanced Search functionality [Thanks to Patchstack team], Updates related to UI/UX for dashboard combo box along with other important fixes and updates. Recommended upgrade. = 8.52.0 = WooCommerce 9.5.1 compatible, Fixes related to Advanced search functionality not working for 'Featured' column on WooCommerce Products dashboard, Advanced search functionality not working for 'Catalog Visibility' column with the 'is not' operator on WooCommerce Products dashboard, Pricing page appears blank in some cases, PHP fatal error when saving Access Privilege Settings from taxonomy dashboards (Pro), 'Restrict by users' option in Access Privilege Settings not working (Pro). Recommended upgrade. = 8.51.0 = WooCommerce 9.4.3 compatible, Fixes related to 'save_post' hook doesn't trigger when updating meta or taxonomy data, Move to Trash not working for WooCommerce Orders dashboard, Bulk Edit functionality not working when multiple actions are applied to the same field (Pro), Delete Permanently and Move to Trash not working for WooCommerce Orders, Users and taxonomy dashboards (Pro). Recommended upgrade. = 8.50.0 = WordPress 6.7.1 compatible, WooCommerce 9.4.2 compatible, Updates related to UI/UX for combo boxes along with other important fixes and updates. Recommended upgrade. = 8.49.0 = WordPress 6.7 compatible, WooCommerce 9.4.1 compatible, WooCommerce Product 'Slug' column in WooCommerce Import CSV suite, Fixes related to Fetching hidden meta fields in the grid impacting dashboard load speed, Broken user interface due to 'select2' library conflict with other plugins, Column header height updated with update in row height setting, Image in the 'Featured Image' column not respecting the row height setting, Internationalization related warnings on WordPress v6.7, Updates related to 10x speed improvement for Bulk Edit, Move to Trash & Delete Permanently functionalities (Pro), UI/UX for combo boxes along with other important fixes and updates. Recommended upgrade. = 8.48.0 = WooCommerce 9.3.3 compatible, Fixes related to 'Post Date' column not saving when adding the record using Add Row functionality and updating using inline edit functionality, 'Post Date' column not saving when updating using Bulk Edit functionality (Pro), Updates related to UI/UX for Advanced Search functionality, Automatically resize the display of 'Featured Image' in the WooCommerce Products dashboard to match the 'Grid Row Height' global setting along with other important fixes and updates. Recommended upgrade. = 8.47.0 = WordPress 6.6.2 compatible, WooCommerce 9.2.3 compatible, Fixes related to Clicking on column headers displays modal dialogs in some cases, Incorrect last accessed dashboard on page refresh, Updates related to UI/UX for 'Public' view settings in Custom Views (Pro) along with other important fixes and updates. Recommended upgrade. = 8.46.1 = Fix related WordPress database error message when updating WooCommerce Products using inline edit functionality in WooCommerce v9.2.0+. Recommended upgrade. = 8.46.0 = WooCommerce 9.2.2 compatible, Fixes related to Broken access control vulnerability [Thanks to Patchstack team], Height for longtext data in the grid cells broken after last update along with other important fixes and updates. Recommended upgrade. = 8.45.0 = Fixes related to Height for longtext data in the grid cells not respecting the 'Grid row height' global setting, 'Order Subtotal' column not showing the correct value on WooCommerce Orders dashboard, 'Order Subtotal' column not showing the correct value on WooCommerce Subscriptions dashboard (Pro), Date picker for the 'Schedule Later' option allowing selection of past dates (Pro) along with other important fixes and updates. Recommended upgrade. = 8.44.0 = WooCommerce 9.1.4 compatible, Fixes related to 'copy from field' operator not working when the field data type is numeric in the Bulk Edit functionality (Pro), Updates related to Persist search conditions when switching from post type/taxonomy dashboard to task dashboard (Pro) along with other important fixes and updates. Recommended upgrade. = 8.43.0 = WordPress 6.6.1 compatible, WooCommerce 9.1.2 compatible, Manage 'Shipping Method Title' column on WooCommerce Orders dashboard, Manage 'Shipping Method Title' column on WooCommerce Subscriptions dashboard (Pro), Manage 'Note For Customer' column on WooCommerce Orders dashboard (Pro), Updates related to Show warning modal for unsaved changes in inline edit functionality along with other important fixes and updates. Recommended upgrade. = 8.42.0 = WordPress 6.5.5 compatible, WooCommerce 9.0.2 compatible, Fixes related to Simple search functionality not working for 'Shipping Method' column in both HPOS and non-HPOS stores on WooCommerce Orders dashboard, Simple search functionality not working for 'Shipping Method' column in both HPOS and non-HPOS stores on WooCommerce Subscriptions dashboard (Pro), Field values not loading when switching to 'copy from' operator in Bulk Edit panel for non-HPOS stores on WooCommerce Orders and Subscriptions dashboards (Pro) along with other important fixes and updates. Recommended upgrade. = 8.41.0 = WooCommerce 9.0.1 compatible, Provision to edit 'Shipping Method' column on WooCommerce Orders dashboard, Provision to edit 'Shipping Method' column on WooCommerce Subscriptions dashboard (Pro), Fixes related to Inline and Bulk Edit functionalities not working for 'Order Shipping/Shipping Total Amount' and 'Shipping Method' columns on WooCommerce Orders dashboard in both HPOS and non-HPOS stores, Inline and Bulk Edit functionalities not working for 'Order Shipping/Shipping Total Amount' and 'Shipping Method' columns on WooCommerce Subscriptions dashboard in both HPOS and non-HPOS stores (Pro), 'Advanced' search functionality not working for 'Shipping Method' column on WooCommerce Orders dashboard in both HPOS and non-HPOS stores (Pro), 'Advanced' search functionality not working for 'Shipping Method' column on WooCommerce Subscriptions dashboard in both HPOS and non-HPOS stores (Pro), Updates related to Pricing page related changes along with other important fixes and updates. Recommended upgrade. = 8.40.0 = WordPress 6.5.4 compatible, WooCommerce 8.9.3 compatible, Fixes related to 'Edit' column not fetched on WooCommerce Orders dashboard in HPOS stores, 'Edit' column not fetched on WooCommerce Subscriptions dashboard in HPOS stores (Pro), Updates related to Pricing page related changes along with other important fixes and updates. Recommended upgrade. = 8.39.0 = WooCommerce 8.9.1 compatible, Fixes related to PHP warnings occur and no content is displayed on the 'Go Pro' page if WooCommerce is not activated,Array to string conversion PHP notice when loading WooCommerce Products dashboard (Pro), Settings button not redirecting properly on 'Docs & Support' page (Pro), Updates related to 'Author' column now displays name and email address on WooCommerce Product Stock Log or any tasks dashboard, Administrators now have the capability to manage and undo tasks performed by any user directly from the WooCommerce Product Stock Log or tasks dashboard along with other important fixes and updates. Recommended upgrade. = 8.38.0 = WordPress 6.5.3 compatible, WooCommerce 8.8.3 compatible, Fixes related to Product type updated incorrectly, when updating 'Backorders' column on WooCommerce Products dashboard using inline edit functionality, PHP warning when loading WooCommerce Products dashboard, Record values not updated in some cases when using Bulk Edit functionality in background (Pro). Recommended upgrade. = 8.37.0 = WordPress 6.5.2 compatible, WooCommerce 8.8.2 compatible, Compatibility with [Legal Pages](https://wordpress.org/plugins/legal-pages/), Fixes related to PHP warning when loading WooCommerce Products dashboard, Using 'increase by/decrease by' Bulk Edit operators setting value to '0' for WooCommerce Products 'Regular price' & 'Sale price' fields having empty values (Pro), Using 'increase by/decrease by' Bulk Edit operators setting value to '0' for any numeric fields having empty values (Pro), Updates related to Replace 'woo.com' links with 'woocommerce.com'. Recommended upgrade. = 8.36.0 = WordPress 6.5 compatible, Fixes related to 'Featured' column not detected in 'Column Manager' on WooCommerce Products dashboard, PHP 8.1.27 Uncaught TypeError: Cannot access offset of type string on string when clicking on 'Load More Products' button on WooCommerce Products dashboard, Advanced Search not filtering null value for date fields on WooCommerce Subscriptions dashboard (Pro), PHP warning when fetching all accessible views for current user (Pro). Recommended upgrade. = 8.35.0 = WooCommerce 8.7.0 compatible, Fixes related to Dashboard not loading due to 'select2' library conflict with other plugins, Updates related to Integrated product specific low stock threshold value in 'Stock' column color-coding on WooCommerce Products dashboard (Pro). Recommended upgrade. = 8.34.0 = Fixes related to Advanced Search functionality displays variations of products whose parents are not published for 'Post Status' column in WooCommerce Products dashboard. Recommended upgrade. = 8.33.0 = Fixes related to 'Attributes' column values doesn't render properly in Bulk edit panel for WooCommerce Products dashboard (Pro), Simple Search not searching 'Billing Email' field properly in WooCommerce Orders dashboard, Custom post statuses not visible in the 'Post Status' column on the dashboard for any post type, Advanced Search query returning cached results along with other important fixes and updates. Recommended upgrade. = 8.32.0 = WooCommerce 8.6.1 compatible, Fixes related to Column tooltip not getting updated after enabling/disabling using show/hide columns, 'increase by/decrease by' operators for date fields not working properly in Bulk edit functionality (Pro), Undo functionality not working properly for date/datetime fields (Pro), HTML tags in the 'Description' and 'Additional Description' fields within the exported CSV causing issues during CSV import (Pro) = 8.31.0 = WooCommerce 8.6.0 compatible, Access Privilege Settings - give controlled access to individual users in addition to user roles (Pro), Fixes related to Data not loading for WooCommerce Subscriptions 'Date' fields like 'Schedule End', 'Schedule Next Payment', etc. (Pro), Inline edit, Bulk edit & previous value not getting updated for WooCommerce Subscriptions 'Date' fields like 'Schedule End', 'Schedule Next Payment', etc. (Pro), PHP fatal error when updating 'Attributes' field data using Bulk edit on WooCommerce Products dashboard, PHP warning when loading 'Attributes' field data on WooCommerce Products dashboard, Updates related to Improved Access Privilege settings UI/UX (Pro) along with other important fixes and updates. Recommended upgrade. = 8.30.0 = WooCommerce 8.5.2 compatible, WordPress 6.4.3 compatible, Fixes related to WooCommerce Products 'Stock Status' column doesn't update automatically with changes in the 'Backorders' column, Duplicate values in the 'Product categories', and 'Exclude categories' WooCommerce Coupons restrictions fields when updating using Bulk edit along with other important fixes and updates. Recommended upgrade. = 8.29.0 = WooCommerce 8.5.1 compatible, Fixes related to Sort functionality not working for 'Users' dashboard custom columns like 'Orders Count', 'Orders Total', 'Last Order Total', 'Last Order Date', Show/Hide columns functionality not working in Chrome browser due to permissions policy violation error along with other important fixes and updates. Recommended upgrade. = 8.28.0 = Fixes related to Security vulnerability - SQL Injection vulnerability (Thanks to Ivan Spiridonov), PHP Warning when switching dashboards along with other important fixes and updates. Recommended upgrade. = 8.27.0 = Fixes related to 'Line Items' column not duplicating when using 'Duplicate Records' functionality in WooCommerce Orders dashboard on non-HPOS stores (Pro), 'Duplicate Records' functionality not working in WooCommerce Orders dashboard on HPOS stores (Pro), Modal dialog not getting displayed in some cases along with other important fixes and updates. Recommended upgrade. = 8.26.0 = WooCommerce 8.4.0 compatible, Fixes related to Duplicate functionality not working for some of the fields in WooCommerce Products dashboard (Pro) along with other important fixes and updates. Recommended upgrade. = 8.25.1 = Fixes related to Advanced Search functionality not working for taxonomy fields after last update. Recommended upgrade. = 8.25.0 = WooCommerce 8.3.1 compatible, WordPress 6.4.2 compatible, Fixes related to Empty data for 'Attributes' and 'Product Type' fields in WooCommerce Products dashboard, Notification message showing incorrect record counts when using 'Entire Store' option for non-background processes (Pro), Schedule For Later feature not working for some operators in Bulk Edit functionality (Pro) along with other important fixes and updates. Recommended upgrade. = 8.24.0 = WooCommerce 8.3.0 compatible, Schedule Bulk Edit (Pro), Update not working for 'Product categories' and 'Exclude product categories' columns in Coupons dashboard along with other important fixes and updates. Recommended upgrade. = 8.23.0 = Pricing page related changes along with other important fixes and updates. Recommended upgrade. = 8.22.0 = WooCommerce 8.2.2 compatible, WordPress 6.4.1 compatible, Support for delete media when any post type record is deleted and if the media is linked with only that post type record (Pro), Fixes related to 'copy from field' operator not working properly for 'Sale Price' and 'Regular Price' fields in Bulk Edit functionality for WooCommerce Products dashboard (Pro), Updates related to Code improvements related to Export CSV of stock related data columns for WooCommerce Products, Added comments for translations along with other important fixes and updates. Recommended upgrade. = 8.21.0 = Export CSV of stock related data columns for WooCommerce Products, Fixes related to Category field not working properly in Bulk Edit for WooCommerce Products (Pro), Improvements to 'set to regular price' and 'set to sale price' Bulk Edit actions for WooCommerce Products (Pro) along with other important fixes and updates. Recommended upgrade. = 8.20.0 = WooCommerce 8.2.1 compatible, Fixes related to Switching from custom views dashboards updating column state for related post type dashboards (Pro), Updates related to Replaced 'Add Attribute' and 'Remove attribute' with 'Attributes' field for WooCommerce Products in Bulk Edit functionality (Pro), Added 'copy from' option for 'Attributes' in Bulk Edit for WooCommerce Products (Pro) along with other important fixes and updates. Recommended upgrade. = 8.19.0 = WooCommerce 8.2.0 compatible, WordPress 6.3.2 compatible, Fixes related to Dashboard combo box CSS related issues, Advanced search operators like 'starts with', 'ends with', etc. not working for 'Tasks' and WooCommerce Product Stock Log dashboard (Pro), Added support for Sorting and Advanced search for some of the product specific columns in WooCommerce Product Stock Log dashboard, Code improvements along with other important fixes and updates. Recommended upgrade. = 8.18.0 = Added Stock Log dashboard for WooCommerce Products, Fixes related to Stock status, Sale Price and Catalog Visibility columns won't update properly using inline edit functionality in WooCommerce Products dashboard (Lite), 'Delete Records' functionality causing issues with large number of records (Pro), Updates related to Speed improvements for 'Bulk Edit', 'Duplicate Records' and 'Delete Records' functionalities (Pro), Success notification for non-background process of 'Bulk Edit', 'Duplicate Records' and 'Delete Records' functionalities (Pro) along with other important fixes and updates. Recommended upgrade. = 8.17.0 = WooCommerce 8.1.1 compatible, Fixes related to WooCommerce Products dashboard fails to load data in some cases, Confirm dialog won't close after successful deletion of records for any dashboards (Lite), Custom views based on 'WooCommerce Products' post type fails to load data in some cases (Pro) along with other important fixes and updates. Recommended upgrade. = 8.16.0 = WooCommerce 8.1.0 compatible, Added compatibility support for [Affiliate For WooCommerce](https://woocommerce.com/products/affiliate-for-woocommerce/) (Pro), Fixes related to WooCommerce Orders 'Delete' functionality not working for non-HPOS stores, Duplicated records added to grid after updating value for any paginated records using inline edit, Unable to save edited records after successful inline edit, Duplicated records added to grid after updating value for any paginated records using bulk edit (Pro), Added support for managing taxonomy fields in Users dashboard (Pro) along with other important fixes and updates. Recommended upgrade. = 8.15.0 = Fixes related to Adding multiple custom attributes using inline edit not working properly in WooCommerce Products dashboard, WooCommerce Orders dashboard 'Print Invoice' functionality not working for all / all filtered records (Pro), Updates related to Exclude internal Smart Manager state management meta keys (like 'sa_sm_%') from loading in Users dashboard (Pro), Code improvements for WooCommerce Orders dashboard 'Print Invoice' functionality (Pro) along with other important fixes and updates. Recommended upgrade. = 8.14.0 = WooCommerce 8.0.3 compatible, WordPress 6.3.1 compatible, Updates related to additional links in plugin page for '5-star' and 'Go Pro' (in case of lite version installed), Proper group titles for dashboard combo box, Fixes related to Duplicate dashboard names for some of the post types/taxonomies, Handling for blocking search functionality in Custom Views (only for ones created with search conditions) created for 'WooCommerce Orders' or any 'Taxonomy' dashboards (Pro), Display notices when editing 'Simple Search' text for Custom Views (only for ones created with search conditions) (Pro), Display notices when trying to switch between 'Advanced Search' and 'Simple Search' for Custom Views (only for ones created with search conditions) (Pro), Empty 'Quantity' column in printed WooCommerce Order invoices (Pro), Inline edit functionality not working for 'Product categories' and 'Exclude product categories' columns in Coupons dashboard (Pro), Data for 'Product categories' and 'Exclude product categories' columns are not fetching correctly in Coupons dashboard (Pro), Background process notification message displaying for 'Export CSV' functionality in case of any background process running (Pro) along with other important fixes and updates. Recommended upgrade. = 8.13.0 = Declare Smart Manager compatible with High-Performance Order Storage (HPOS), WooCommerce 8.0.2 compatible, WordPress 6.3.0 compatible, WooCommerce Subscriptions 5.4.0 compatible, Fixes related to 'General Settings' and 'Docs' Icons 'on Focus' CSS issue, Advanced search with 'is not' operator not giving correct results for WooCommerce Products 'Attributes' field, WooCommerce Products 'Sale Price' field getting set to '0' when updating using Bulk Edit (Pro), Delete all tasks functionality not working in some cases (Pro), Bulk Edit and Delete functionalities not working properly for WooCommerce Subscriptions in some cases (Pro) along with other important fixes and updates. Recommended upgrade. = 8.12.0 = Exporting categories or other taxonomies in a properly formatted manner that is compatible with the WooCommerce Product Import CSV suite (Pro), Fixes related to In certain cases, the grid becomes blank when attempting to sort using any taxonomy columns, Extra space added after comma in exported CSV when using comma as decimal separator for numeric columns (Pro), Added 'sm_decimal_separator_for_export' filter for customizing decimal separator in Export CSV for numeric columns (Pro) along with other important fixes and updates. Recommended upgrade. = 8.11.0 = Setting for enabling/disabling date picker for date/datetime columns, Fixes related to WooCommerce product variations title not displaying attribute list when data is sorted in the grid, 'Date', 'DateTime' and 'Time' columns showing incorrect placeholder when using inline edit in some cases, 'Export CSV' not working in Safari browser (Pro), Update the dashboard state for custom views only when the columns are shown/hidden by the view's author. (Pro) along with other important fixes and updates. Recommended upgrade. = 8.10.0 = Tooltip for column headers, Compatibility with [Customer Email Verification](https://automattic.pxf.io/3e1DmX), Fixes related to Import CSV functionality not working in some cases, Settings menu not clickable in some cases, Progress modal getting hidden immediately when trying to use Undo or Delete Tasks functionality (Pro) along with other important fixes and updates. Recommended upgrade. = 8.9.0 = Dedicated & improved settings UI, Fixes related to Dashboard refreshing to first page when inline editing Product Gallery Images on non-first Pages, Unable to edit Product Gallery Images when editing after saving changes along with other important fixes and updates. Recommended upgrade. = 8.8.0 = Import CSV functionality for WooCommerce Products, Show Smart Manager button in WordPress Admin Bar, Fixes related to Dashboard not loading in some cases due to 'sprintf already defined' JavaScript error, Progress modal getting hidden immediately when trying to use Bulk Edit, Duplicate Records & Delete Records functionality (Pro), State management & other minor improvements for 'Tasks' dashboards (Pro) along with other important fixes and updates. Recommended upgrade. = 8.7.0 = Display dashboard count in each group in dashboard combo-box, Fixes related to WooCommerce Products 'Sale price dates from' & 'Sale price dates to' fields not saving timestamp in UTC timezone when using Inline edit, WooCommerce Products 'Sale price dates from' & 'Sale price dates to' fields not saving timestamp in UTC timezone when using Bulk edit (Pro), Advanced Search not working for 'timestamp' type columns like 'Sale price dates from', 'Sale price dates to', etc., Display notices when editing 'Advanced Search' conditions for Custom Views (only for ones created with search conditions) (Pro), Do not update state when switching from 'Custom Views' dashboard (Pro) along with other important fixes and updates. Recommended upgrade. = 8.6.0 = WordPress 6.2.2 compatible, Fixes related to Inline edit functionality not working in Firefox browser, Modals and Notifications not appearing in some cases in Firefox browser, Column sorted arrow icon not visible in cases when column name is long, Few of the JavaScript files loading more than once on dashboard load, Incorrect version for enqueued JavaScript & CSS files along with other important fixes and updates. Recommended upgrade. = 8.5.0 = WordPress 6.2.1 compatible, Added Option 'sm_use_number_field_for_numeric_cols' to enable/disable usage of HTML number input field for numeric columns in the grid, Keyboard shortcuts for buttons in all functionalities (like advanced search, bulk edit, etc.) using modal dialogs (Pro) along with other important fixes and updates. Recommended upgrade. = 8.4.0 = Added 'any of' and 'not any of' advanced search operators for text fields (Pro), Option 'sm_update_trash_records' to consider or not consider 'Trash' records when updating 'Entire Store' using Bulk Edit/Duplicate Records/Delete Records functionality (Pro), Fixes related to PHP Warnings when updating some of the WooCommerce Product fields using Bulk Edit (Pro) along with other important fixes and updates. Recommended upgrade. = 8.3.0 = Added support for Renaming column headers (Pro), Fixes related to Inline edit not working in some cases on non-first pages post saving, Notification messages not showing in some cases, Dashboard refreshing to first page when bulk editing records on non-first pages (Pro) along with other important fixes and updates. Recommended upgrade. = 8.2.0 = Added HTML number field editor for numeric fields, Option 'sm_show_tasks_title_modal' to show or hide the 'Tasks Title Modal' when performing inline/bulk edits (Pro), Fixes related to PHP 8.2 Warnings: Creation of dynamic properties is deprecated, added 'WP editor' for 'Product short description' and 'Post excerpt' fields along with other important fixes and updates. Recommended upgrade. = 8.1.0 = UI/UX improvements, Fixes related to PHP 8.2 Warnings: Creation of dynamic properties is deprecated, Dashboard total record count incorrectly updated when inline editing records on non-first pages, Last field from Advanced Custom Fields plugin not displaying for WooCommerce Orders dashboard (Pro) along with other important fixes and updates. Recommended upgrade. = 8.0.0 = WordPress 6.2 compatible, Added Undo Changes done by Inline or Bulk Edit functionalities (Pro), Export CSV of selected records (Pro), Compatibility with [TutorLMS](https://wordpress.org/plugins/tutor/) (Pro), Fixes related to 'Edit URL' breaking when exporting using Export CSV functionality (Pro) along with other important fixes and updates. Recommended upgrade. = 7.4.0 = Hide all admin notices from Smart Manager page except notices triggered from Smart Manager plugin, Fixes related to Sorting not working when advanced search is enabled in Users dashboard (Pro), 'User Registered' field not showing in advanced search in Users dashboard (Pro), Pricing page related changes, StoreApps Upgrade file Improvements (Pro) along with other important fixes and updates. Recommended upgrade. = 7.3.0 = WordPress 6.1.1 compatible, Compatibility with 'Product Labels and Sticker' plugin, Fixes related to Advanced search 'ANDing' operation within same rule group not returning correct results, Inline edit of WooCommerce Products 'Sale price dates to' field not saving correct timestamp, Bulk edit of WooCommerce Products 'Sale price dates to' field not saving correct timestamp (Pro), Custom views not rendering properly when created from dashboard having advanced search conditions (Pro) along with other important fixes and updates. Recommended upgrade. = 7.2.0 = WordPress 6.1.0 compatible, Fixes related to Images not getting attached to post type like WooCommerce Products, Posts, Pages, etc. when setting new uploaded images in Featured or Gallery images, Delete image functionality not working for newly uploaded images in WooCommerce Products Gallery Images, Inline edit for WooCommerce Product Attributes not working in some cases along with other important fixes and updates. Recommended upgrade. = 7.1.0 = Fixes related to Export CSV functionality not working after v7.0.0, Product Gallery Images data not getting exported when using Export CSV for WooCommerce Products dashboard (Pro), Bulk Edit not working for all items in search result for taxonomy dashboards (Pro), Sorting not giving proper results when sorting using numeric columns in Users dashboard (Pro), PHP warnings on taxonomy dashboard load in some cases along with other important fixes and updates. Recommended upgrade. = 7.0.1 = Fixes related to Advanced search for some of the taxonomy columns not working properly after last update, Sorting for 'Product type' in WooCommerce Products dashboard not working after last update, Users dashboard not showing data after last update (Pro). Recommended upgrade. = 7.0.0 = View & manage any Custom Taxonomies (Pro), WooCommerce 7.0.0 compatible, WordPress 6.0.3 compatible, Fixes related to PHP 8.1 Warning: Implicit conversion from float {number} to int loses precision, Extra spacing in dashboard selector on the Smart Manager page, 'Load more' not working for Users dashboard (Pro), Some minor fixes along with other important fixes and updates. Recommended upgrade. = 6.7.0 = Compatibility with WooCommerce v6.9.4, Added 'Product SKU' and 'Product title' advanced search fields for WooCommerce Orders dashboard (Pro), 'Coupons used' and 'Shipping method' advanced search fields for WooCommerce Orders dashboard (Pro), Fixes related to WooCommerce Product Attribute editing not getting added using inline edit when using [Variation Swatches for WooCommerce](https://wordpress.org/plugins/woo-variation-swatches/) plugin along with other important fixes and updates. Recommended upgrade. = 6.6.0 = Compatibility with WordPress v6.0.2 & WooCommerce v6.8.2, [WooCommerce Subscriptions](http://automattic.pxf.io/5gN9zb) v4.5.1 (Pro), [Orderable](https://stellarwp.pxf.io/c/3616375/1287872/9639) (Pro), [GiveWP](https://stellarwp.pxf.io/c/3616375/1287837/9639) (Pro), Fixes related to Access Privilege settings getting deleted when trying to update 'Company logo' using non-administrator WordPress user role (Pro), WooCommerce Product Attribute editing not working when using [Variation Swatches for WooCommerce](https://wordpress.org/plugins/woo-variation-swatches/) plugin, Stock alert emails not getting triggered when updating stock for WooCommerce Product Variations, Inline edit for Categories not working in case of nested categories along with other important fixes and updates. Recommended upgrade. = 6.5.0 = Compatibility with WooCommerce v6.8.0, Added 'starts with' and 'not starts with' advanced search operators for text fields (Pro), 'ends with' and 'not ends with' advanced search operators for text fields (Pro) along with other important fixes and updates. Recommended upgrade. = 6.4.0 = Disable 'autoload' for few options, Fixes related to Missing translations for some strings, Height of modal dialogs taking entire page height in some cases, 'Table not exists' error when trying to use custom views functionality in some cases (Pro) along with other important fixes and updates. Recommended upgrade. = 6.3.0 = Compatibility with WordPress v6.0.1 & WooCommerce v6.7.0, Added Inline edit WooCommerce Product Gallery Images in Lite version, Display image thumbnails for WooCommerce Product Gallery Images, Fixes related to Inline edit modal dialog broken UI for PHP serialized fields, Advanced search not working for any numeric fields like 'User id' in Users dashboard (Pro) along with other important fixes and updates. Recommended upgrade. = 6.2.0 = Compatibility with WooCommerce v6.6.1, Added Search for records using 'Featured Image' id, Search WooCommerce Products using 'Gallery' images id (Pro), Filters to disable 'Move to Trash' and 'Delete Permanently' functionality from any dashboard, Fixes related to New row added in the grid when copying values using excel-like drag fill, 'Cancel' button for 'Add Row' dialog not working, WooCommerce transactional emails not triggering when updating order status using inline edit, WooCommerce Product meta fields not saving when updating along with 'Stock' field using inline edit along with other important fixes and updates. Recommended upgrade. = 6.1.1 = Fixes related to Custom views functionality not working properly after last update (Pro). Recommended upgrade. = 6.1.0 = WordPress v6.0.0 compatible & WooCommerce v6.5.1 compatible, Modal dialogs, Compatibility with [Decimal Product Quantity for WooCommerce](https://wordpress.org/plugins/decimal-product-quantity-for-woocommerce/) and such other plugins, Compatibility with [WooCommerce Product Stock Alert](https://wordpress.org/plugins/woocommerce-product-stock-alert/), Fixes related to Attribute filter not working in frontend when updating attribute values from Smart Manager, Meta fields not getting saved when editing the same on adding record using Smart Manager along with other important fixes and updates. Recommended upgrade. = 6.0.0 = Improved UI/UX, notification messages, Added option for resetting column state for any dashboard to default state, Added option `sm_grid_row_height` to manage 'height' for the rows in Smart Manager grid, Updates related to compatibility improvements with [LifterLMS](https://wordpress.org/plugins/lifterlms/) (Pro), Fixes related to 'Product SKU' value not getting updated when prepending it with '0' using inline edit functionality for WooCommerce Products, 'Copy from' and 'Copy from field' Bulk Edit actions not working for Users dashboard (Pro) along with other important fixes and updates. Recommended upgrade. = 5.41.0 = Support for View 'Trash' records for any post type, 'Copy from field' action in Bulk Edit to copy a value from any other field for any record (Pro), Fixed related to WP Media library not showing when trying to Bulk Edit WooCommerce Products 'Product Image Gallery' field (Pro) along with other important fixes and updates. Recommended upgrade. = 5.40.0 = WordPress v5.9.3 compatible, Fixes related to Field and Action data column names missing in email sent after completion of any background process (Pro), Sorting by 'Featured' column in WooCommerce Products dashboard not working along with other important fixes and updates. Recommended upgrade. = 5.39.0 = WordPress v5.9.2 compatible, Updated 'Action Scheduler' library (Pro), Fixes related to Fatal error when running Bulk Edit or Duplicate Records functionality in background for any non WooCommerce dashboards (Pro) along with other important fixes and updates. Recommended upgrade. = 5.38.0 = Added support for JavaScript string translations, WooCommerce v6.3.1 compatible, Translation files for Italian (Thanks to Giacomo Mazzullo) along with other important fixes and updates. Recommended upgrade. = 5.37.0 = WordPress v5.9.1 compatible & WooCommerce v6.2.1 compatible, Fixes related to Smart Manager incorrectly detects user capabilities, Issues in dashboard loading when removing access for user role (Pro), 'Public' access setting for custom views not getting rendered properly (Pro) along with other important fixes and updates. Recommended upgrade. = 5.36.0 = Allow adding/removing columns to/from custom views (Pro), Fixes related to Custom views name not getting updated (Pro) along with other important fixes and updates. Recommended upgrade. = 5.35.0 = WooCommerce v6.2.0 compatible, Allow users to increase/decrease date, datetime & time field by durations of days, weeks, months, years, hours & minutes (Pro), ‘set time to’ action for ‘time’ fields (Pro), Fixes related to Timestamp fields getting 0 value when clearing date using date picker in inline edit, Bulk Edit placeholder for value field not getting cleared after switching actions (Pro) along with other important fixes and updates. Recommended upgrade. = 5.34.0 = WordPress v5.9 compatible, Compatibility with [WooCommerce Dropshipping](https://automattic.pxf.io/B0LZRx) (Pro), Updates related to Improvements related to overriding Order Print Invoice template (WooCommerce), Pricing page related changes along with other important fixes and updates. Recommended upgrade. = 5.33.0 = WordPress v5.8.3 compatible & WooCommerce v6.1.1 compatible, Fixes related to Declaring a required parameter after an optional one is deprecated (PHP8), Advanced Search returning incorrect results when searching using Product Category along with other important fixes and updates. Recommended upgrade. = 5.32.0 = WooCommerce v6.0.0 compatible, Translation files for Russian (Thanks to Almaz Mannanov), Fixes related to Media ordering not maintaining when adding images to 'Product Gallery Images' field for WooCommerce Products along with other important fixes and updates. Recommended upgrade. = 5.31.0 = Updates related to StoreApps Upgrade file Improvements & Pricing page along with other important fixes and updates. Recommended upgrade. = 5.30.0 = WordPress v5.8.2 compatible & WooCommerce v5.9.0 compatible, Fixes related to Adding new users using Smart Manager not working, Adding new users not triggering 'new user' notification email along with other important fixes and updates. Recommended upgrade. = 5.29.0 = Updates related to Pricing page along with other important fixes and updates. Recommended upgrade. = 5.28.0 = WooCommerce v5.8.0 compatible, Added option `sm_wp_force_collapse_admin_menu` to enable/disable collapsing of WordPress Admin Menu when on Smart Manager page, Fixes related to Unable to edit 'status' for product variations to enable/disable the same using inline edit and other important fixes and updates. Recommended upgrade. = 5.27.0 = Fixes related to Unable to edit attribute values for product variations using inline edit in case of sorted data in grid, Fields not getting disabled for product variations in some cases and other important fixes and updates. Recommended upgrade. = 5.26.0= WooCommerce v5.7.1 compatible, Updates related to Show attribute values for when inline editing attribute values at product variation level, Show attribute values for when bulk editing attribute values at product variation level (Pro) and other important fixes and updates. Recommended upgrade. = 5.25.0 = WordPress v5.8.1 compatible, Updates related to Allow editing for 'date' & 'datetime' fields by typing dates in addition to selecting using Datepicker, Enabled advanced search & bulk editing for searching attribute values at product variation level, Fixes related to Inline edit for 'Product attributes' field not working properly in some cases, Incorrect value placeholder for 'set time to' action in Bulk Edit (Pro) and other important fixes and updates. Recommended upgrade. = 5.24.0 = Fixed issues related to Able to set regular price as '0' even when the sale price is set using inline edit, Able to set sale price greater than regular price using bulk edit (Pro) and other important fixes and updates. Recommended upgrade. = 5.23.0 = Added Compatibility with [Germanized for WooCommerce](https://wordpress.org/plugins/woocommerce-germanized/) (Pro) and Fixed issues related to Inline edit not saving all changes when trying to update more than one meta fields like 'Regular Price' & 'Stock' in some cases and other important fixes and updates. Recommended upgrade. = 5.22.0 = WordPress v5.8.0 compatible & WooCommerce v5.6.0 compatible, Pricing page related changes, Fixes related to Fatal error when accessing 'Users' dashboard in Smart Manager grid in some cases and other important fixes and updates. Recommended upgrade. = 5.21.0 = Compatibility with latest version of WooCommerce (v5.5.2), Fixes related to Advanced search for 'Product Visibility' is 'Hidden' returning incorrect results, Advanced search for 'Product Visibility' is not 'Hidden' returning incorrect results, 'Edit Link' & 'View Link' column not shown in grid in some cases and other important fixes and updates. Recommended upgrade. = 5.20.0 = Compatibility with latest version of WooCommerce (v5.5.1), Fixes related to Product Taxonomies not getting unlinked from 'terms' table when editing using 'Inline Edit' functionality, PHP Warnings generated in some cases when accessing Smart Manager dashboard and other important fixes and updates. Recommended upgrade. = 5.19.1 = Fix related to 'ID' column not visible in Smart Manager grid after update to v5.19.0. Recommended upgrade. = 5.19.0 = Added support for color codes for 'Stock' field with support for WooCommerce 'Low stock threshold' for Products, Fixes related to Removing attributes using Inline Edit functionality not working properly for Products dashboard, Custom meta fields with special characters in the field name causing issues and other important fixes and updates. Recommended upgrade. = 5.18.0 = Added compatibility with [Advanced Custom Fields (ACF)](https://wordpress.org/plugins/advanced-custom-fields/) (Pro), Improvements in handling for image fields, Fixes related to Unable to Bulk Edit or Inline Edit Featured Images for Posts, Some meta fields not pulling data in Smart Manager grid and other important fixes and updates. Recommended upgrade. = 5.17.0 = Compatibility with latest versions of WooCommerce (v5.4.1) and Fixes related to Bulk Edit, Duplicate Records & Delete Records functionality not getting applied to all selected records in some cases (Pro), Duplicate Product functionality not working in multi-site environment (Pro), Bulk Edit for PHP serialized fields like 'Default Attributes' updating incorrect values (Pro) and other important fixes and updates. Recommended upgrade. = 5.16.0 = Improvments related to Display comma separated list of taxonomy titles for custom taxonomies like Product Categories, Product Tags, etc. in Products dashboard, Fixes related to Products dashboard not loading when special characters in custom taxonomy fields, Table does not exist error when deactivating the plugin, 'Unable to create or change a table without a primary key, when the system variable 'sql_require_primary_key' is set' error when using Advanced Search functionality in some cases and other important fixes and updates. Recommended upgrade. = 5.15.0 = UI improvements related to Bulk Edit (Pro) & Advanced Search functionality, Fixes related to Dashboard resets to initial view on saving inline edit changes, Row Selection not persistent post saving of any edited rows, HTML markup in the 'Name' field in the export CSV for 'Products' dashboard (Pro) and other important fixes and updates. Recommended upgrade. = 5.14.0 = Compatibility with latest versions of WordPress (v5.7.2) & WooCommerce (v5.3.0), StoreApps Upgrade file Improvements (Pro), Support for 'Add to' & 'Remove from' actions for any custom taxonomies in Bulk Edit (Pro), Fixes related to Bulk Edit breaking in case of some custom taxonomies like Product Tag, etc. (Pro), Advanced Search not showing proper values for custom taxonomies like Product Tag, etc. and other important fixes and updates. Recommended upgrade. = 5.13.0 = UI improvements, Pricing page related changes, Fixes related to advanced search functionality for taxonomy fields like categories, 'Add to' & 'Remove from' actions missing in Bulk Edit for taxonomy fields like categories (Pro), Disabling WP auto update for plugin (Pro) and other important fixes and updates. Recommended upgrade. = 5.12.0 = Fixes related to Unable to search using 'Product Categories' using advanced search functionality, Advanced Search functionality for 'Product Shipping Class' not working, Bulk Edit functionality for 'Product Shipping Class' not working (Pro), Unable to search using 'User Role' using advanced search functionality (Pro) and other important fixes and updates. Recommended upgrade. = 5.11.0 = WordPress v5.7.1 compatible & WooCommerce v5.2.2 compatible, Updates related to UI improvements for Advanced Search functionality, Improved UI for Smart Manager Bulk Edit functionality (Pro), Fixes related to Bulk Edit Background notice continued to show even after process completion in some cases (Pro), 'User Role' column in Users dashboard displaying incorrect data (Pro) and other important fixes and updates. Recommended upgrade. = 5.10.0 = Added date selector for date fields in Advanced Search and fixes related to Sorting using numeric meta columns not returning proper results, Sorting not working in multi-site environment, PHP warnings related to product attributes and other important fixes and updates. Recommended upgrade. = 5.9.0 = WordPress 5.7 & WooCommerce 5.1.0 compatible and Fixes related to Empty results in dashboard when sorting by any taxonomy columns, Sorting by 'Product Type' column returning incorrect results, Search for 'Enabled/Disabled' product variations using 'Status' column in Advanced Search not working, Unable to search using 'Default Attributes' using Advanced Search, Unable to Bulk Edit 'Default Attributes' field (Pro) and other important fixes and updates. Recommended upgrade. = 5.8.0 = Fixes related to Column width changes remaining persistent even on dashboard switch, Column width changes not getting maintained for all dashboards in some cases, Export CSV failing in case of large data (Pro) and other important fixes and updates. Recommended upgrade. = 5.7.0 = WordPress v5.6.2 compatible, Fixes related to Variable Parent Products not getting displayed in some advanced search results, Default sort not getting applied in advanced search results in some cases, PHP warnings when using the Bulk Edit functionality in some cases (Pro) and other important fixes and updates. Recommended upgrade. = 5.6.0 = WooCommerce v5.0.0 compatible, Improvements related to Display number of records loaded in addition to the total number of records, Fixes related to Data not getting displayed as per the column sorting in the dashboard, Sorting not getting saved in custom views (Pro) and other important fixes and updates. Recommended upgrade. = 5.5.0 = WordPress 5.6.1 compatible, Fixes related to Blank value in advanced search for numeric columns not returning 'null' values, 'Custom Views' functionality not working in some cases and other important fixes and updates. Recommended upgrade. = 5.4.0 = WooCommerce 4.9.2 compatible, Fixes related to 'Product Category' inline edit not working, 'Product Category' not getting set to blank using inline edit, Unable to use 'Custom Views' functionality in some cases (Pro), 'Sorting arrow indicator' not displayed on column header when loading Smart Manager and other important fixes and updates. Recommended upgrade. = 5.3.0 = Introducing Improved UI for advanced search functionality, WooCommerce 4.9.0 compatible, Avoid clearing search when switching between simple & advanced search and fixes related to Advanced search functionality not working, Fix vulnerability code reported by Jetpack scan, Dashboard appears blank in some cases and other important fixes and updates. Recommended upgrade. = 5.2.0 = WordPress 5.6 & WooCommerce 4.8.0 compatible, Updates related to Alphabetically sorted list of multi-select custom taxonomies in inline edit, Fixes related to Bulk Edit / Batch Update not working when trying to update the entire search result, 'Billing Postcode' & 'Shipping Postcode' only accepting numeric values for Orders & Subscriptions dashboard and other important fixes and updates. Recommended upgrade. = 5.1.0 = WooCommerce 4.7.0 compatible, Important updates in StoreApps Connector and other important fixes and updates. Recommended upgrade. = 5.0.1 = Fix related to DB Upgrade not running in some cases. Recommended upgrade. = 5.0.0 = Introducing 'Custom Views' just like 'Custom Views in Excel' (Pro), Ability to give access to only specific custom views to non-admin users in addition to specific dashboards (Pro), Predefined Custom Views - Product Stock & Product Price List (Pro), Improved: Removed some unused code and reduced the plugin zip file from 2.7 MB to 1.7 MB along with fixes like Unable to set or remove product as 'Featured Product' using in-line edit and other important fixes and updates. Recommended upgrade. = 4.6.1 = WooCommerce v4.6.1 compatible along with fixes related to Created and Modified date & date GMT columns not appearing in advanced search, Advanced search columns not refreshing on dashboard change and other important fixes and updates. Recommended upgrade. = 4.6.0 = Updated Improved UI for Smart Manager dashboard along with fixes related to 'Sale Price' not getting reflected on site when saving using Smart Manager and other important fixes and updates. Recommended upgrade. = 4.5.0 = New Improved UI for Smart Manager dashboard along with other important fixes and updates. Recommended upgrade. = 4.4.6 = Fixed issues related to Search not working on network sites, Unable to search or change image attributes in WP media dialog when updating product gallery images along with other important fixes and updates. Recommended upgrade. = 4.4.5 = Fixed issues related to Show/Hide Columns not refreshing the grid, Sorting using meta columns not rendering proper results, Search for numeric columns and search value as 0 not working properly, Unable to save '0' value for numeric columns using inline edit along with other important fixes and updates. Recommended upgrade. = 4.4.4 = Compatibility with latest version of WooCommerce, Added filter to disable 'delete permanently' functionality for all dashboards and fixes related to 'show variations' state not getting maintained, Product variations getting displayed even when 'show variations is unchecked', Dashboard showing data even in case of no search results found, Order & Subscription KPI's not getting refreshed in case of no search results along with other important fixes and updates. Recommended upgrade. = 4.4.3 = Compatibility with latest versions of WordPress & WooCommerce and fixes related to 'sale price start date' & 'sale price end date' WooCommerce Product fields not saving values as per site timezone, 'Add Attribute' & 'Remove Attribute' functionality not available in batch update along with other important fixes and updates. Recommended upgrade. = 4.4.2 = Fixed issues related to Delete Records & Duplicate Records Button not working, 'Load More' button not getting displayed in post search in the dashboards, Dashboard not loading due to 'select2' library conflict with other plugins, Name for the 'Nicename' in the Users dashboard changed to 'Nickname' along with other important fixes and updates. Recommended upgrade. = 4.4.1 = Added 'Manage with Smart Manager' link from all post type dashboards and Fixed Search & Advanced Search functionality not working for any dashboards along with other important fixes and updates. Recommended upgrade. = 4.4.0 = Performance optimization & Improvements in Dashboard loading speed, Replaced infinite scrolling with load more for all dashboards, Show/Hide Id column for every dashboard and fixes related to Performance lag when selecting records in the grid, Unable to select dashboards in the 'Access Privilege Settings' for different user roles (Pro) along with other important fixes and updates. Recommended upgrade. = 4.3.18 = Added Feature to stop a Batch Update/Duplicate Records/Delete Records process (Pro) & feature to auto-stop a running process when the Batch Update/Duplicate Records/Delete Records process gets stuck (Pro) along with other important fixes and updates. Recommended upgrade. = 4.3.17 = Tested with latest versions of WooCommerce (v4.3+) & Fixes related to Batch update for Product Attributes not working (Pro), Export CSV not exporting products in case of large database along with other important fixes and updates. Recommended upgrade. = 4.3.16 = Fixes related to Inline edit & Batch Update of product 'sale price' with 'sale price from' & 'sale price to' dates not working, Export CSV of Orders & Subscriptions not exporting the product variation attributes in order & subscription line items (Pro) along with other important fixes and updates. Recommended upgrade. = 4.3.15 = Fixes related to 'Copy from' batch update action not working for product 'featured image' field (Pro) along with other important fixes and updates. Recommended upgrade. = 4.3.14 = Fixes related to 'Coupon Amount', 'Coupon Usage Count' displayed as blank in Coupons dashboard, '{Field} == 0' advanced search condition not returning proper results in case of numeric fields, Incorrect update options in case of 'yes/no' type fields in batch update functionality (Pro) along with other important fixes and updates. Recommended upgrade. = 4.3.13 = Updated 'Action Scheduler' library (Pro), Tested with latest versions of WordPress & WooCommerce(v4.2+), Fixes related to batch update functionality (Pro) along with other important fixes and updates. Recommended upgrade. = 4.3.12 = Pricing page related changes along with other important fixes and updates. Recommended upgrade. = 4.3.11 = Tested with latest versions of WooCommerce & WordPress, plugin upgrade process improvements and fixed issues related to users dashboard not showing data in multi-site environment and in case when data is sorted by any of its columns along with other important fixes and updates. Recommended upgrade. = 4.3.10 = Added functionality to permanently delete selected records / all records for any post type (Pro) and Fixes related to Product stock not getting set to 0 using batch update functionality along with other important fixes and updates. Recommended upgrade. = 4.3.9 = Fixed issues related to product sale price not getting reflected on frontend after updating using Smart Manager (WooCommerce) along with other important fixes and updates. Recommended upgrade. = 4.3.8 = Tested with latest version of WooCommerce(v4.0), updates to Pricing Page along with other important fixes and updates. Recommended upgrade. = 4.3.7 = Added validation for handling phone numbers and fixed issues related to Blank search not working for numeric columns using advanced search, Date filters not getting maintained after column show/hide, Unable to edit 'regular price' in products dashboard due to thousand separator along with other important fixes and updates. Recommended upgrade. = 4.3.6 = Fixed issues related to Sorting by any taxonomy columns making the grid blank, Sorting for 'price/sale price' fields not working properly (WooCommerce), Batch Update for taxonomy columns not working (Pro), Order line item quantity not getting displayed in 'Print Invoice' generated using Smart Manager (Pro) along with other important fixes and updates. Recommended upgrade. = 4.3.5 = Fixed issues related to Smart Manager grid very slow loading in infinite scroll, Attribute inline edit dialog UI improvements (WooCommerce) along with other important fixes and updates. Recommended upgrade. = 4.3.4 = Added View & Export Product or any post type Edit URL, Tested with latest versions of WordPress & WooCommerce, Fixes related to Background Process is_running check slowing down the site in some cases, Advanced search unable to add 'OR' condition, Products dashboard not showing any products when WooCommerce Multilingual plugin is active (WooCommerce) along with other important fixes and updates. Recommended upgrade. = 4.3.3 = Fixes related to Product Categories not getting updated using the batch update functionality (WooCommerce), Variations getting deleted when updating stock for variation parent in some cases (WooCommerce), 'Delete All' & 'Duplicate Entire Store' functionality not working along with other important fixes and updates. Recommended upgrade. = 4.3.2 = Fixed issues related to Batch delete getting stuck, Some columns showing as '#bad-value#'in some cases, Top bar not getting displayed in some cases, PHP warnings along with other important fixes and updates. Recommended upgrade. = 4.3.1 = Tested with latest versions of WordPress & WooCommerce and fixed issues related to 'Product Featured' column showing '#bad-value#' in some cases in Products Dashboard, Inline edit for the 'checkbox' fields not working in some cases, Some of the 'postmeta' columns not getting detected in Smart Manager grid along with other important fixes and updates. Recommended upgrade. = 4.3 = Added compatibility support for [WooCommerce Smart Coupons](https://woocommerce.com/products/smart-coupons/), Compatibility with WooCommerce Coupons, fixed issues related to Sort for numeric fields not working along with other important fixes and updates. Recommended upgrade. = 4.2.26 = Fixed issues related to Infinite Scroll of the grid going into an infinite loop in some cases, column sort related fixes, advanced search related fixes along with other important fixes and updates. Recommended upgrade. = 4.2.25 = Fixed issues related to no option to skip the deactivation survey, Deactivation survey not getting triggered in some cases along with other important fixes and updates. Recommended upgrade. = 4.2.24 = Added support for 'add_to' & 'remove_to' options in batch update for all multi-select taxonomies like 'Product Tag', 'Rank Math Meta Robots', etc., Fixes related to DatePicker not working properly while inline editing 'Date' fields, 'Product Type' and such other taxonomies not getting saved and displayed in the grid in some cases along with other important fixes and updates. Recommended upgrade. = 4.2.23 = Added Support for in-line updating 'Product Gallery Images' using media library (Pro), Fixes related to some custom fields related to [Yoast SEO](https://wordpress.org/plugins/wordpress-seo/) & [WordPress SEO Plugin – Rank Math](https://wordpress.org/plugins/seo-by-rank-math/) not appearing in the grid, 'ID' column getting hidden on show/hide any columns in the grid along with other important fixes and updates. Recommended upgrade. = 4.2.22 = Optimized and improved dashboard load times for WooCommerce Orders, Subscriptions & Users dashboards, fixes related to Some of the records not displaying when sorted using any meta key columns, Infinite Scroll not working in some cases along with other important fixes and updates. Recommended upgrade. = 4.2.21 = Added support for WooCommerce decimal places & decimal separator for product price and sale price fields (WooCommerce), UI/UX responsive related changes for all screen layouts, Fixes related to Batch Update, Duplicate Records & Batch Delete not working in multi site environment (Pro), Incorrect detection of data type for some of the postmeta fields along with other important fixes and updates. Recommended upgrade. = 4.2.20.1 = Fixes related to Infinite Scroll not working for 'Products' dashboard in some cases (WooCommerce), Batch Update, Duplicate Records & Delete All functionalities not working in some cases along with other important fixes and updates. Recommended upgrade. = 4.2.20 = UI Improvements, Fixed row height for all rows in the grid irrespective of data, fixes related to Infinite Scroll not loading data in some cases, All meta fields getting displayed as blank on updating any field using Smart Manager, Inline editing for 'Product Attributes' not working when no attributes set for the product along with other important fixes and updates. Recommended upgrade. = 4.2.19.1 = Fixed issues related to Batch Update progress notice staying for an indefinite time and unable to use batch update (Pro), PHP warnings along with other important fixes and updates. Recommended upgrade. = 4.2.19 = Improved Batch Update functionality by using 'Action Scheduler' library (Pro), Updates to Pricing page, fixes related to Select boxes in batch update not working properly on adding multiple rows, Javascript error on Smart Manager grid load in some cases along with other important fixes and updates. Recommended upgrade. = 4.2.18 = Fixed issues related to Smart Manager Access Privilege functionality not working (Pro), Smart Manager Settings page accessible by non-administrator user roles (Pro), Some of the strings in Smart Manager grid could not be translated along with other important fixes and updates. Recommended upgrade. = 4.2.17 = Compatibility with [Yoast SEO](https://wordpress.org/plugins/wordpress-seo/) (Pro), [WordPress SEO Plugin – Rank Math](https://wordpress.org/plugins/seo-by-rank-math/) (Pro), Fixed issues related to PHP Warnings when accessing the users dashboard, Javascript errors casing no records to load in Smart Manager grid along with other important fixes and updates. Recommended upgrade. = 4.2.16 = Compatibility with [WooCommerce Subscriptions](http://automattic.pxf.io/5gN9zb) (Pro), [WooCommerce Cost of Goods](https://automattic.pxf.io/5gJ9Y3) (Pro), Added support for 'set to regular price' & 'set to sale price' option using Batch Update for products dashboard (WooCommerce) (Pro) along with other important fixes and updates. Recommended upgrade. = 4.2.15 = New column 'Order Sub Total' added to Orders Dashboard & CSV export (WooCommerce), Fixed issues related to Smart Manager dashboard column mapping not getting refreshed on addition of new data like categories, attributes, etc. along with other important fixes and updates. Recommended upgrade. = 4.2.14 = Compatibility with [Min/Max Quantities](https://automattic.pxf.io/zNdLne) (Pro), [Min and Max Quantity for WooCommerce](https://wordpress.org/plugins/minmax-quantity-for-woocommerce/) (Pro), Compatibility with [Woocommerce Minimum and Maximum Quantity](https://wordpress.org/plugins/woo-min-max-quantity-limit/) (Pro), Search and Replace any string for any field using batch update functionality (Pro), along with other important fixes and updates. Recommended upgrade. = 4.2.13 = Fixed issues related to Delete All Records in the store functionality not working, Duplicate All records in search result duplicating all records in the store, Search functionality not working in 'WP Media Library' when accessed from batch update functionality along with other important fixes and updates. Recommended upgrade. = 4.2.12 = Introducing Access Privileges - give controlled access to non-Admin users for each of the dashboards in Smart Manager, Fixed issue of Settings link not working (Smart Manager Old) along with important fixes and updates. Recommended upgrade. = 4.2.11 = Introducing Compatibility with WooCommerce Product Add-Ons (Pro), Fixed issue of Rendering of checkbox having zero or one as value is reversed, which will not affect previous data along with important fixes and updates. Recommended upgrade. = 4.2.10 = Introducing Compatibility with WooCommerce Bookings Plugin (Pro), Compatibility with WooCommerce Memberships (Pro) and fixed issues related to Column Position not getting maintained after enabling/disabling using show/hide columns, Sort functionality now working properly due to plugin conflict along with important fixes and updates. Recommended upgrade. = 4.2.9 = Introducing Orders & Subscription Status Count KPI's for Orders & Subscriptions Dashboards (WooCommerce), Manage any post type that is not publicly_queryable like 'Scheduled Actions', UI updates and fixes related to Inline Edit & Batch Update not working for 'Catalog Visibility' field for products dashboard (WooCommerce) along with important fixes and updates. Recommended upgrade. = 4.2.8 = Introducing Support for searching Enabled/Disabled columns in 'show/hide columns' functionality, Improved UI, StoreApps Upgrade file Improvements and fixed issues like Batch Update running the previous set of sucessful batch update actions on the selected products, Infinite scroll not working for any of the dashboards in the grid along with important fixes and updates. Recommended upgrade. = 4.2.7 = Introducing Support for Color Codes for status fields like Post Status, Product Stock Status, WooCommerce Order Status and many more, Trigger zoom if moving the cursor over any image field quickly in the grid, Option for entering Distraction Free Mode in Smart Manager along with important fixes and updates. Recommended upgrade. = 4.2.6 = Introducing Order Line Items, Shipping Method & Coupon Used fields in Subscriptions Dashboard and Subscriptions Export CSV and fixed issues related to Sort Functionality not working for the Users dashboard, Users dashboard not displaying records by default in descending order and many more along with important updates. Recommended upgrade. = 4.2.5 = Important fixes related to Batch Update functionality 'All items in store' option updating all the records in the store in case of search results, Unable to show/hide 'Products Attribute' column in the grid (WooCommerce), Product Featured Image getting set to blank on inline edit (WooCommerce) and many more along with important updates. Recommended upgrade. = 4.2.4 = Introducing Support to copy any field value from any record using Batch Update, Added Video Tutorials on Welcome page, Added Support for Add, Delete & Sort for the individual keys in the Serialized data inline editing and fixed issues related to Product not appearing in search result after updating some fields, Last column not viewable in the grid even after enabling the same along with other important updates. Recommended upgrade. = 4.2.3 = Introducing New Improved UI for top bar icons, WooCommerce 3.6+ compatible and fixed issues related to Variations not getting displayed in advanced search results, Sorting by numeric fields not working, Search using Product Attributes not working (WooCommerce), Products Variation Title not showing properly for the first record of the search result in some cases (WooCommerce) and many more. Recommended upgrade. = 4.2.2 = Important fixes related to All issue fixes with regards to column state not getting maintained, WooCommerce Product Attributes not getting loaded in the grid, WooCommerce Orders & SUbscriptions simple search not working, Inline edit of users fields not getting saved and many more along with other important updates. Recommended upgrade. = 4.2.1 = Important fixes related to Taxonomy columns (like Product Tag, etc.) not displaying in show/hide columns dialog in some cases, Grid data not refreshing whenever a new column is added to the grid and many more. Recommended upgrade. = 4.2.0 = Introducing Dedicated page for Docs & Support, Pricing page and fixed issues like Advanced search not working when a zero value is searched in meta, Unable to edit any multiselect taxonomies like 'Product Tag' and many more. Recommended upgrade. = 4.1.9 = Important updates and fixes related to Some fields showing as '#bad-value#', Loader not getting hidden on Smart Manager load, Memory leak issues on Smart Manager dashboard load and many more. Recommended upgrade. = 4.1.8 = Important updates and fixes related to Records getting updated via Inline Edit even if data type validation fails, Sorting on more than one page causing continuous increase in data in the dashboard, Selection and edited data getting lost on infinite scrolling and many more. Recommended upgrade. = 4.1.7 = Added support for showing loader on the grid for any request, Fixes related to Show Variations checkbox not visible, Attribute values not getting loaded in Batch Update on selection of Attribute, Date Filtering not working in combination with other advanced search filters, Numeric operators not coming for numeric fields in advanced search along with other important fixes & updates. Recommended upgrade. = 4.1.6 = New In App Offer (Lite) along with other important fixes & updates. Recommended upgrade. = 4.1.5 = Introducing View/Edit link for each of the records for each post type, Support for simple search functionality for searching records in orders & subscriptions using product meta, Fixed issues related to Search using 'Post Status' not working in some cases along with other important fixes & updates. Recommended upgrade. = 4.1.4 = Added Support for date picker search, inline & batch edit for Unix Timestamp meta fields, Fixes related to Advanced Search box UI breaking when adding more than one condition, Subscription status not getting rendered and updated, Datepicker not getting loaded in search & inline edit (Lite) along with other important fixes & updates. Recommended upgrade. = 4.1.3 = Introducing Advanced Search for DateTime fields, Support for clearing 'Created Date' date filter, Fixes related to 'Created Date' date filtering not returning proper results, 'Delete' Records for selected items not working, 'Duplicate Records' functionality not working in some cases along with other important fixes & updates. Recommended upgrade. = 4.1.2 = Fixes related to Inline editing of Attributes & Categories not working in Products Dashboard, Batch Update of Attributes & Categories not working in Products Dashboard, Product Atrributes not showing in the grid in some cases along with other important fixes & updates. Recommended upgrade. = 4.1.1 = Introducing Sort Functionality on the entire database of records, fixed issue of postmeta fields for first row coming as blank for all dashboards, fixed issue of User role not getting displayed and edited in Users Dashboard along with other important fixes & updates. Recommended upgrade. = 4.1.0 = Introducing New Improved UI for Smart Manager, support for Simple Search Functionality, Better Handling of Complex data fields, Improved Data type detection for custom fields along with other important fixes & updates. Recommended upgrade. = 4.0.6 = Added support for updating only 'Date' or 'Time' for 'DateTime' fields using batch update, support for batch update 'Product Featured Image' (WooCommerce), support for handling custom values for mutiple fields along with other important fixes & updates. Recommended upgrade. = 4.0.5 = Fixes related to Inline edit for all meta fields not working in some cases, Column state getting reset to default after batch update, Export CSV getting stalled in case of exporting huge data along with other important fixes & updates. Recommended upgrade. = 4.0.4 = Fixes related to 'Product Attributes' not getting managed, Multiple 'ANDing' and 'ORing' not working in advanced search, Batch Update for 'Datetime' and 'Date' data types not working along with other important fixes & updates. Recommended upgrade. = 4.0.3 = Added support for View & CSV Export Product Shop Url, fixed issues of advanced search and inline editing not working for custom taxonomies along with other important fixes & updates. Recommended upgrade. = 4.0.2 = Added support for exporting only visible columns in the grid in the CSV Export, Load data for only visible columns to reduce data load size along with other important fixes & updates. Recommended upgrade. = 4.0.1 = Fixes for Inline edit limited to ony 3 records in some cases (Pro), Advanced Search not working in some cases along with other important fixes & updates. Recommended upgrade. = 4.0.0 = Introducing new Revamped Smart Manager, Beta is finally live. Added support for view & managing Product's featured image column for WooCommerce, Order Line Items, Shipping Method & Coupon Used fields in Dashboard and Orders Export CSV along with other important fixes & updates. Recommended upgrade. = 3.23.0 = Added support for Print Invoices for orders (Beta), Added support for automatic access to Smart Manager Beta for non-Admin users in WordPress based on the user roles and capabilities (Beta) along with other important fixes & updates. Recommended upgrade. = 3.22.0 = Added Smart Date Filtering for all post types (Beta) along with other important fixes & updates. Recommended upgrade. = 3.21.0 = Added Export CSV functionality (Beta), Added Duplicate Record & Duplicate Store functionality (Beta) along with other important fixes & updates. Recommended upgrade. = 3.20.0 = Added new Users dashboard consisting of all WordPress users along with WooCommerce customers (Beta), important batch update fixes (Beta) along with other important fixes & updates. Recommended upgrade. = 3.19.1 = Fixed the Product Title not getting synced for variations when the product title of the variation parent is updated (WooCommerce) along with other important fixes & updates. Recommended upgrade. = 3.19.0 = Added Batch Update for WooCommerce Product Attributes & Categories (Beta), fix for column layout not getting saved (Beta) along with other important fixes & updates. Recommended upgrade. = 3.18.0 = Tested with latest versions of WordPress & WooCommerce(v3.4.0), StoreApps Connector improvements along with other important fixes & updates. Recommended upgrade. = 3.17.0 = Added Batch Update functionality in Smart Manager Beta, Improvement in data type handling (Beta) along with other important fixes & updates. Recommended upgrade. = 3.16.1 = Fix for PHP Notice: Undefined index: _sale_price = 3.16.0 = Fixes related to 'Inventory not getting set to 0', products sale price 'From & To' dates not getting saved as per site timezone along with other important fixes & updates. Recommended upgrade. = 3.15.0 = Fixes related to advanced search 'Category is not' condition not working, negative values not getting set using inline editing for products along with other important fixes & updates. Recommended upgrade. = 3.14.0 = Fixes related increase and decrease by percentage batch update options not working, advanced search related fixes along with other important fixes & updates. Recommended upgrade. = 3.13.0 = Fixes related to print invoices not working properly for some of the orders (WooCommerce), product attributes and custom taxonomies search not working (Beta) along with other important fixes & updates. Recommended upgrade. = 3.12.0 = New feature of storing the state of Smart Manager (Beta) into the database - enabling same view from anywhere (Beta) along with other important fixes & updates. Recommended upgrade. = 3.11.1 = Fixes related to no products getting loaded in products dashboard in some cases, custom attributes not getting saved when edited using Smart Manager Beta along with other important fixes & updates. Recommended upgrade. = 3.11.0 = Fixes related to advanced search functionality in Beta, order totals not getting displayed in invoices printed using Smart Manager (woocommerce) along with other important fixes & updates. Recommended upgrade. = 3.10.0 = New feature of advanced search functionality for all dashboards(beta), billing address & customer id columns in orders csv export (woocommerce) along with other important fixes & updates. Recommended upgrade. = 3.9.23 = Fixes related to WooCommerce attributes & categories not getting displayed in Smart Manager grid along with other important fixes. Recommended upgrade. = 3.9.22 = WooCommerce v3.0+ compatibility, fixes for type of undefined error along with other important fixes. Recommended upgrade. = 3.9.21 = Fixes related '.00' getting trimmed off when saving 'price/sales price' field using Smart Manager along with other important fixes. Recommended upgrade. = 3.9.20 = Fixes related to illegal mix of collations, advanced search related fixes along with other important fixes. Recommended upgrade. = 3.9.19 = Fixes related to subscription variations not getting displayed, category counts not getting updated along with other important fixes. Recommended upgrade. = 3.9.18 = New quick help widget for Pro users along with other important fixes. Recommended upgrade. = 3.9.17 = PHP 7 compatibility along with other important fixes. Recommended upgrade. = 3.9.16 = Compatibility with WooCommerce v2.6+, new columns in orders CSV export for WooCommerce along with other important fixes. Recommended upgrade. = 3.9.15 = New feature of handling product type, advanced search related fixes along with other important fixes. Recommended upgrade. = 3.9.14 = New feature of handling privately published products, improved advanced search and important security fixes along with other important fixes. Recommended upgrade. = 3.9.13 = New feature of inline editing customer provided notes for order, fixes related to billing and shipping address along with other important fixes. Recommended upgrade. = 3.9.12 = Fixes related to some product fields not getting displayed along with other important fixes. Recommended upgrade. = 3.9.11 = Compatibility with latest versions of WordPress & WooCommerce along with important updates and fixes. Recommended upgrade. = 3.9.10 = Updated the text domains for multilingual compatibility along with important updates and other fixes. Recommended upgrade. = 3.9.9 = Fixes related to inventory getting updated along with important updates and other fixes. Recommended upgrade. = 3.9.8 = Compatibility with latest versions of WordPress, WooCommerce & WPeC along with important updates and fixes. Recommended upgrade. = 3.9.7 = Some important security fixes along with some other minor fixes. Recommended upgrade. = 3.9.6 = New feature of sort functionality on the entire database of records (Beta) along with some important fixes for WooCommerce along with some other minor fixes. Recommended upgrade. = 3.9.5 = Smart Manager Revamp (Beta) along with some important fixes for WooCommerce along with some other minor fixes. Recommended upgrade. = 3.9.4 = Important fixes for WooCommerce along with some other minor fixes. Recommended upgrade. = 3.9.3 = Improvements in rendering product custom fields for WooCommerce, compatibility with latest versions of WordPress, WooCommerce & WPeC and important fixes. Recommended upgrade. = 3.9.2 = New feature of Batch Updating entire search result at single click, compatibility with latest version of WooCommerce (v2.2 or greater) and some important fixes. Recommended upgrade. = 3.9.1 = New feature of Simple & Advanced Search Switch for Products Dashboard, compatibility with latest version of WooCommerce and some important fixes. Recommended upgrade. = 3.9 = New feature of support for custom fields for Products Dashboard of WooCommerce, compatibility with latest versions of WooCommerce & WPeC and important fixes. Recommended upgrade. = 3.8 = New feature of Advanced Search functionality for Products Dashboard of WPeC along with some performance improvements, compatibility with latest versions of WooCommerce & WPeC and important fixes. Recommended upgrade. = 3.7.1 = Important fixes related to Smart Manager v3.7. Recommended upgrade. = 3.7 = New feature of Advanced Search functionality for Products Dashboard of WooCommerce along with some performance improvements and minor fixes. Recommended upgrade. = 3.6.2 = Removed major WP-Debug warnings along with some important fixes. Recommended upgrade. = 3.6.1 = Compatibility with latest versions of WooCommerce & WPeC along with some important fixes. Recommended upgrade. = 3.6 = Compatibility with WooCommerce 2.1 or greater along with some minor fixes. Recommended upgrade. = 3.5.4 = Resolved Export CSV of Orders not working with large data issue along with some minor fixes. Recommended upgrade. = 3.5.3 = Resolved 'Sale Price From and To Date not getting enabled for Simple Products' issue. Recommended upgrade. = 3.5.2 = Resolved 'Duplication of the Product Not Successful' issue along with some minor fixes. Recommended upgrade. = 3.5.1 = Resolved inline editing not working issue along with some minor fixes. Recommended upgrade. = 3.5 = New coupons dashboard for WooCommerce and new translation files for Romania along with some minor fixes. Recommended upgrade. = 3.4.1 = Updates related to attributes column [WooCommerce] & option for handling decimal precission for dimensions fields along with some minor fixes. Recommended upgrade. = 3.4 = Compatibility with woocommerce-sequential-order-numbers-pro & some new features along with some minor fixes. Recommended upgrade. = 3.3 = Compatibility with latest version of WordPress, WPeC & WooCommerce & some new features. Recommended upgrade. = 3.2 = Compatibility with latest version of WPeC & WooCommerce & some new features. Recommended upgrade. = 3.1.4 = Compatibility release for WPeC 3.8.10 & WooCommerce 2.0.9 along with some fixes. Recommended upgrade. = 3.1.3 = Important fixes for Batch Update & other minor fixes. Recommended upgrade. = 3.1 = Improved auto-update & support for grouped products. Other minor fixes. Recommended upgrade. = 3.0 = Many enhancements and fixes - additional fields in display, batch update and attribute management. Recommended upgrade. = 2.9 = New features in Batch Update, enhancements and fixes. Recommended upgrade. = 2.8 = New feature for Duplication of products. Performance improvements, enhancements and fixes. Recommended upgrade. = 2.7.2 = Must have upgrade. Fixes "Remote Connection Error" messages in WordPress admin. = 2.7.1 = Further performance improvements, enhancements and fixes. Recommended upgrade. = 2.7 = Major performance improvements, enhancements and fixes. Recommended upgrade. = 2.6 = Multilingual support, export CSV fixes and batch update enhancements. Recommended upgrade. = 2.5 = Recommended upgrade. Added support for "Adding variations", "Attribute Management" and many other small fixes and enhancements. = 2.4 = Recommended upgrade. Fixed issues in CSV export and many other small fixes and enhancements. = 2.3 = Recommended upgrade. Export CSV support for WooCommerce added. Fixed issue related to Sale Price for WooCommerce. Upgrade WPeC / WooCommerce before upgrading Smart Manager. = 2.2 = Recommended upgrade. Variations support for WooCommerce added. Upgrade WPeC / WooCommerce before upgrading Smart Manager. = 2.1 = Upgrade WPeC / WooCommerce before upgrading Smart Manager. Multi site support added. Updated to work with WooCommerce 1.4.3. Recommended upgrade. = 2.0 = Important update for WooCommerce - adds customer and order management. Recommended upgrade. = 1.9.1 = Access control support added, improved auto upgrade. Recommended upgrade. = 1.9 = WooCommerce customers and orders support added. = 1.8 = WooCommerce support added. Batch update for entire store possible now. = 1.7 = Adds Batch Invoice / Packing Slips printing. Recommended upgrade. = 1.6 = Bug fixes. Recommended upgrade. = 1.5 = Performance and stability improvements. Recommended upgrade. = 1.4 = Adds management of product variations for paid versions, with WPeC 3.8+. IMPORTANT: Paid users: please rename plugin folder to "smart-manager-for-wp-e-commerce" before upgrading. = 1.3 = Feature update and bug fix release. = 1.2 = Important bug fixes and overall enhancements. = 1.1 = Fixes bugs and IE compatibility issues. Recommended upgrade. = 1.0 = Batch update for product categories added. Milestone release 1.0! = 0.9 = Optimization and compatibility release. Recommended upgrade. = 0.8 = First WPeC 3.8 compatible release. We recommed trying this version on a test server before going live. = 0.7.4 = Fixed an issue that showed blank grid if you had more than 100 products. = 0.7.3 = Adds flat rate shipping management, and adds many minor enhancements. = 0.7.2 = Recommended upgrade. Fixed a bug with customers batch update. = 0.7.1 = Recommended upgrade. Fixes a few issues and enhances JS and CSS loading. = 0.7.0 = Customers dashboard added. View and search customers. Recommended upgrade. = 0.6.0 = Must have upgrade. Now you can manage orders too, and in a much better way than WPeC! Lite version now also supports inline editing for product name and price. Many more enhancements too. = 0.5.7 = Fixes a problem that caused blank screen. class-smart-manager.php000064400000271453147600337620011142 0ustar00 ( 2 / 60 ), 'advanced_search_inline' => ( 3 / 60 ), 'bulk' => ( 4.5 / 60 ), ); public static function instance() { if ( is_null( self::$_instance ) ) { self::$_instance = new self(); } return self::$_instance; } public function __construct() { $this->define_constants(); // for defining constants $this->includes(); // for including necessary files $this->init_hooks(); // for defining all actions & filters } //Function for defining WooCommerce related constants for SM public function define_woo_constants() { if( defined('WOOCOMMERCE_VERSION') ) { // checking the version for WooCommerce plugin define ( 'IS_WOO13', version_compare ( WOOCOMMERCE_VERSION, '1.4', '<' ) ); if ( version_compare( WOOCOMMERCE_VERSION , '9.2.0', '<' ) ) { if ( version_compare( WOOCOMMERCE_VERSION , '7.9.0', '<' ) ) { if ( version_compare( WOOCOMMERCE_VERSION , '4.4.0', '<' ) ) { if ( version_compare( WOOCOMMERCE_VERSION , '4.0.0', '<' ) ) { if ( version_compare( WOOCOMMERCE_VERSION , '3.9.0', '<' ) ) { if ( version_compare( WOOCOMMERCE_VERSION , '3.6.0', '<' ) ) { if (version_compare ( WOOCOMMERCE_VERSION, '3.0.0', '<' )) { if (version_compare ( WOOCOMMERCE_VERSION, '2.2.0', '<' )) { if (version_compare ( WOOCOMMERCE_VERSION, '2.1.0', '<' )) { if (version_compare ( WOOCOMMERCE_VERSION, '2.0', '<' )) { define ( 'SM_IS_WOO16', "true" ); } else { define ( 'SM_IS_WOO16', "false" ); } define ( 'SM_IS_WOO21', "false" ); } else { define ( 'SM_IS_WOO16', "true" ); define ( 'SM_IS_WOO21', "true" ); } define ( 'SM_IS_WOO22', "false" ); } else { define ( 'SM_IS_WOO16', "true" ); define ( 'SM_IS_WOO21', "true" ); define ( 'SM_IS_WOO22', "true" ); } define ( 'SM_IS_WOO30', "false" ); } else { define ( 'SM_IS_WOO16', "true" ); define ( 'SM_IS_WOO21', "true" ); define ( 'SM_IS_WOO22', "true" ); define ( 'SM_IS_WOO30', "true" ); } define ( 'SM_IS_WOO36', "false" ); } else { define( 'SM_IS_WOO36', 'true' ); define( 'SM_IS_WOO30', 'true' ); define( 'SM_IS_WOO22', 'true' ); define( 'SM_IS_WOO21', 'true' ); define( 'SM_IS_WOO16', 'true' ); } define( 'SM_IS_WOO39', 'false' ); } else { define( 'SM_IS_WOO39', 'true' ); define( 'SM_IS_WOO36', 'true' ); define( 'SM_IS_WOO30', 'true' ); define( 'SM_IS_WOO22', 'true' ); define( 'SM_IS_WOO21', 'true' ); define( 'SM_IS_WOO16', 'true' ); } define( 'SM_IS_WOO40', 'false' ); } else { define( 'SM_IS_WOO40', 'true' ); define( 'SM_IS_WOO39', 'true' ); define( 'SM_IS_WOO36', 'true' ); define( 'SM_IS_WOO30', 'true' ); define( 'SM_IS_WOO22', 'true' ); define( 'SM_IS_WOO21', 'true' ); define( 'SM_IS_WOO16', 'true' ); } define( 'SM_IS_WOO44', 'false' ); } else { define( 'SM_IS_WOO44', 'true' ); define( 'SM_IS_WOO40', 'true' ); define( 'SM_IS_WOO39', 'true' ); define( 'SM_IS_WOO36', 'true' ); define( 'SM_IS_WOO30', 'true' ); define( 'SM_IS_WOO22', 'true' ); define( 'SM_IS_WOO21', 'true' ); define( 'SM_IS_WOO16', 'true' ); } define( 'SM_IS_WOO79', 'false' ); } else { ( class_exists( '\Automattic\WooCommerce\Utilities\OrderUtil' ) && \Automattic\WooCommerce\Utilities\OrderUtil::custom_orders_table_usage_is_enabled() ) ? define( 'SM_IS_WOO79', 'true' ) : define( 'SM_IS_WOO79', 'false' ); define( 'SM_IS_WOO44', 'true' ); define( 'SM_IS_WOO40', 'true' ); define( 'SM_IS_WOO39', 'true' ); define( 'SM_IS_WOO36', 'true' ); define( 'SM_IS_WOO30', 'true' ); define( 'SM_IS_WOO22', 'true' ); define( 'SM_IS_WOO21', 'true' ); define( 'SM_IS_WOO16', 'true' ); } define( 'SM_IS_WOO92', 'false' ); } else { define( 'SM_IS_WOO92', 'true' ); ( class_exists( '\Automattic\WooCommerce\Utilities\OrderUtil' ) && \Automattic\WooCommerce\Utilities\OrderUtil::custom_orders_table_usage_is_enabled() ) ? define( 'SM_IS_WOO79', 'true' ) : define( 'SM_IS_WOO79', 'false' ); define( 'SM_IS_WOO44', 'true' ); define( 'SM_IS_WOO40', 'true' ); define( 'SM_IS_WOO39', 'true' ); define( 'SM_IS_WOO36', 'true' ); define( 'SM_IS_WOO30', 'true' ); define( 'SM_IS_WOO22', 'true' ); define( 'SM_IS_WOO21', 'true' ); define( 'SM_IS_WOO16', 'true' ); } } } public function define_constants() { $plugin = plugin_basename( SM_PLUGIN_FILE ); $msg = str_word_count("Upgrade In Progress"); $upmsg = "Upgrade to"; $this->plugin_path = untrailingslashit( plugin_dir_path( SM_PLUGIN_FILE ) ); $this->plugin_url = untrailingslashit( plugins_url( '/', SM_PLUGIN_FILE ) ); $this->update_msg = 'editing'; define( 'SM_PLUGIN_DIR', dirname( $plugin ) ); define( 'SM_PLUGIN_BASE_NM', $plugin ); define( 'SM_TEXT_DOMAIN', 'smart-manager-for-wp-e-commerce' ); define( 'SM_PREFIX', 'sa_smart_manager' ); define( 'SM_SKU', 'sm' ); define( 'SM_PLUGIN_NAME', 'Smart Manager' ); define( 'SM_UPGRADE', $msg ); define( 'SM_DUPGRADE', ( ($msg*8)+1 ) ); define( 'SM_UPDATE', $upmsg ); define( 'SM_ADMIN_URL', get_admin_url() ); //defining the admin url define( 'SM_APP_ADMIN_URL', admin_url( 'admin.php?page=smart-manager' ) ); define( 'SM_PLUGIN_DIR_PATH', dirname( SM_PLUGIN_FILE ) ); define( 'SM_PLUGINS_FILE_PATH', dirname( dirname( SM_PLUGIN_FILE ) ) ); define( 'SM_PLUGIN_DIRNAME', plugins_url( '', SM_PLUGIN_FILE ) ); if ( ! defined( 'SM_IMG_URL' ) ) { define( 'SM_IMG_URL', SM_PLUGIN_DIRNAME . '/assets/images/' ); } if (!defined('STORE_APPS_URL')) { define( 'STORE_APPS_URL', 'https://www.storeapps.org/' ); } if ( ! defined( 'SMPRO' ) ) { if (file_exists ( (dirname ( SM_PLUGIN_FILE )) . '/pro/assets/js/smart-manager.js' )) { define ( 'SMPRO', true ); } else { define ( 'SMPRO', false ); } } if ( ! defined( 'SM_PRO_URL' ) ) { define( 'SM_PRO_URL', (dirname ( SM_PLUGIN_FILE )) . '/pro/' ); } // Static variables self::$text_domain = (defined('SM_TEXT_DOMAIN')) ? SM_TEXT_DOMAIN : 'smart-manager-for-wp-e-commerce'; self::$prefix = (defined('SM_PREFIX')) ? SM_PREFIX : 'sa_smart_manager'; self::$sku = (defined('SM_SKU')) ? SM_SKU : 'sm'; self::$plugin_file = (defined('SM_PLUGIN_FILE')) ? SM_PLUGIN_FILE : ''; if ( ! function_exists( 'get_plugins' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $plugin_info = get_plugins(); $this->plugin_info = $plugin_info [SM_PLUGIN_BASE_NM]; $this->updater = rand(3,3); $this->dupdater = rand(25,25); $this->upgrade = (defined('SM_UPGRADE')) ? SM_UPGRADE : 3; $this->dupgrade = (defined('SM_DUPGRADE')) ? SM_DUPGRADE : 25; $this->success_msg = (defined('SM_UPDATE')) ? SM_UPDATE : ''; } //Function for defining dashboards public static function get_dashboards() { global $wp_version, $wpdb; $post_types = get_post_types( array(), 'objects' ); //Code to get all the custom post types as dashboards $ignored_post_types = array('revision', 'product_variation', 'shop_order_refund'); self::$sm_dashboards_final = array(); self::$sm_public_dashboards = array(); $dashboard_post_types = array(); if( !empty( $post_types ) ) { foreach( $post_types as $post_type => $obj ) { if( in_array($post_type, $ignored_post_types) ) { continue; } $label = ( ! empty( $obj->label ) ) ? $obj->label : $post_type; self::$sm_dashboards_final[ $post_type ] = $label; if( !empty( $obj->public ) && $obj->public == 1 ) { self::$sm_public_dashboards[] = $post_type; } if ( ! isset( $dashboard_post_types[ $label ] ) ) { $dashboard_post_types[ $label ] = array(); } $dashboard_post_types[ $label ][] = $post_type; } } self::$sm_dashboards_final ['user'] = __(ucwords('users'), 'smart-manager-for-wp-e-commerce'); if ( ( file_exists( WP_PLUGIN_DIR . '/woocommerce/woocommerce.php' ) ) && ( is_plugin_active( 'woocommerce/woocommerce.php' ) ) ) { $post_type = 'product_stock_log'; $label = _x( 'Product Stock Log', 'product stock log dashboard name', 'smart-manager-for-wp-e-commerce' ); self::$sm_dashboards_final[ $post_type ] = $label; if ( ! isset( $dashboard_post_types[ $label ] ) ) { $dashboard_post_types[ $label ] = array(); } $dashboard_post_types[ $label ][] = $post_type; } if ( is_callable( array( 'Smart_Manager', 'handle_duplicate_dashboard_names' ) ) ) { self::handle_duplicate_dashboard_names( $dashboard_post_types, 'post_type' ); } // TODO change if( is_plugin_active( 'lifterlms/lifterlms.php' ) ){ self::$sm_dashboards_final ['llms_order'] = __( 'LifterLMS Orders', 'smart-manager-for-wp-e-commerce'); self::$sm_dashboards_final ['llms_coupon'] = __( 'LifterLMS Coupons', 'smart-manager-for-wp-e-commerce'); } if ( ! defined( 'SM_BETA_ALL_DASHBOARDS' ) ) { define( 'SM_BETA_ALL_DASHBOARDS', json_encode( self::$sm_dashboards_final ) ); } return self::$sm_dashboards_final = apply_filters( 'sm_active_dashboards', self::$sm_dashboards_final ); } //Function for getting all eligible views public function get_views() { if( !( defined('SMPRO') && true === SMPRO ) ) { return; } if( class_exists( 'Smart_Manager_Pro_Views' ) ) { $view_obj = Smart_Manager_Pro_Views::get_instance(); if( is_callable( array( $view_obj, 'get_all_accessible_views' ) ) ){ $views = $view_obj->get_all_accessible_views( array_merge( self::$sm_dashboards_final, self::$taxonomy_dashboards ) ); if( ! empty( $views ) ) { $this->sm_accessible_views = ( ! empty( $views['accessible_views'] ) ) ? $views['accessible_views'] : array(); $this->sm_owned_views = ( ! empty( $views['owned_views'] ) ) ? $views['owned_views'] : array(); $this->sm_public_views = ( ! empty( $views['public_views'] ) ) ? $views['public_views'] : array(); $this->all_views = array_merge( array_keys( $this->sm_accessible_views ), $this->sm_owned_views, $this->sm_public_views ); $this->sm_view_post_types = ( ! empty( $views['view_post_types'] ) ) ? $views['view_post_types'] : array(); } } } $this->sm_accessible_views = apply_filters( 'sm_accessible_views', $this->sm_accessible_views ); } //Function for defining taxonomies dashboards public static function get_taxonomies() { $taxonomies = get_taxonomies( array( 'public' => 1 ), 'objects' ); //TODO: later we can add compat for hidden taxonomies as well $dashboard_taxonomies = array(); if( ! empty( $taxonomies ) ){ foreach( $taxonomies as $slug => $obj ){ $label = ( ! empty( $obj->label ) ) ? $obj->label : $slug; self::$taxonomy_dashboards[ $slug ] = $label; if ( ! isset( $dashboard_taxonomies[ $label ] ) ) { $dashboard_taxonomies[ $label ] = array(); } $dashboard_taxonomies[ $label ][] = $slug; } if ( is_callable( array( 'Smart_Manager', 'handle_duplicate_dashboard_names' ) ) ) { self::handle_duplicate_dashboard_names( $dashboard_taxonomies, 'taxonomy' ); } if ( ! defined( 'SM_ALL_TAXONOMY_DASHBOARDS' ) ) { define( 'SM_ALL_TAXONOMY_DASHBOARDS', json_encode( self::$taxonomy_dashboards ) ); } return self::$taxonomy_dashboards = apply_filters( 'sm_active_taxonomy_dashboards', self::$taxonomy_dashboards ); } } // Function to include necessary files for SM public function includes() { global $current_user; //for settings if( file_exists( $this->plugin_path . '/classes/class-smart-manager-settings.php' ) ){ include_once $this->plugin_path . '/classes/class-smart-manager-settings.php'; if( defined( 'SMPRO' ) && SMPRO === true && file_exists( SM_PRO_URL . 'classes/class-smart-manager-pro-settings.php' ) ) { include_once SM_PRO_URL . 'classes/class-smart-manager-pro-settings.php'; } } if( file_exists( $this->plugin_path . '/classes/class-smart-manager-install.php' ) ) { include_once $this->plugin_path . '/classes/class-smart-manager-install.php'; } if( file_exists( $this->plugin_path . '/classes/class-smart-manager-controller.php' ) ) { include_once $this->plugin_path . '/classes/class-smart-manager-controller.php'; $GLOBALS['smart_manager_controller'] = new Smart_Manager_Controller(); } if( file_exists( $this->plugin_path . '/classes/class-smart-manager-utils.php' ) ) { include_once $this->plugin_path . '/classes/class-smart-manager-utils.php'; } //for including background updater & other libraries if ( defined('SMPRO') && SMPRO === true ) { if ( ! class_exists( 'ActionScheduler' ) && file_exists( dirname( SM_PLUGIN_FILE ). '/pro/libraries/action-scheduler/action-scheduler.php' ) ) { include_once 'pro/libraries/action-scheduler/action-scheduler.php'; } if( file_exists( (dirname( SM_PLUGIN_FILE )) . '/pro/classes/class-smart-manager-pro-background-updater.php') ) { include_once 'pro/classes/class-smart-manager-pro-background-updater.php'; } if( !class_exists( 'Smart_Manager_Pro_Access_Privilege' ) && file_exists( (dirname( SM_PLUGIN_FILE )) . '/pro/classes/class-smart-manager-pro-access-privilege.php' ) ) { include_once 'pro/classes/class-smart-manager-pro-access-privilege.php'; } if ( !class_exists( 'Smart_Manager_Pro_Views' ) && file_exists( (dirname( SM_PLUGIN_FILE )) . '/pro/classes/class-smart-manager-pro-views.php' ) ) { require_once 'pro/classes/class-smart-manager-pro-views.php'; } } if ( is_admin() ) { if( file_exists( $this->plugin_path . '/classes/class-smart-manager-admin-welcome.php' ) ) { include_once $this->plugin_path . '/classes/class-smart-manager-admin-welcome.php'; } if( file_exists( $this->plugin_path . '/classes/class-storeapps-marketplace.php' ) ) { include_once $this->plugin_path . '/classes/class-storeapps-marketplace.php'; } if( file_exists( $this->plugin_path . '/classes/deactivation-survey/class-sa-smart-manager-deactivation.php' ) ) { include_once $this->plugin_path . '/classes/deactivation-survey/class-sa-smart-manager-deactivation.php'; } if ( class_exists( 'SA_Smart_Manager_Deactivation' ) ) { if ( defined('SMPRO') && true === SMPRO ) { $sm_plugin_name = SM_PLUGIN_NAME . ' - Pro'; } else { $sm_plugin_name = SM_PLUGIN_NAME . ' - Lite'; } $sa_sm_deativate = new SA_Smart_Manager_Deactivation( SM_PLUGIN_BASE_NM, $sm_plugin_name ); } } } public function init_hooks() { register_activation_hook( SM_PLUGIN_FILE, array( 'Smart_Manager_Install', 'install' ) ); register_deactivation_hook( SM_PLUGIN_FILE, array( 'Smart_Manager_Install', 'deactivate' ) ); add_action( 'plugins_loaded', array( &$this, 'on_plugins_loaded' ) ); add_action( 'wp_loaded', array( &$this, 'on_wp_loaded' ) ); //filters for handling quick_help_widget add_filter( 'sa_active_plugins_for_quick_help', array( &$this, 'quick_help_widget' ), 10, 2 ); add_filter( 'sa_is_page_for_notifications', array( &$this, 'is_page_for_notifications' ), 10, 2 ); add_action ( 'admin_head', array(&$this,'remove_help_tab_and_hiding_admin_notices') ); // For removing the help tab and hiding admin notices add_filter( 'site_transient_update_plugins', array( &$this, 'overwrite_site_transient' ), 11, 1 ); add_filter( 'pre_set_site_transient_update_plugins', array( &$this, 'overwrite_site_transient' ), 11, 1 ); add_action( 'admin_enqueue_scripts', array( $this, 'sa_sm_dequeue_scripts' ), 999 ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_scripts' ), 999 ); add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_admin_styles' ) ); add_action( 'admin_init', array( $this, 'on_admin_init' ) ); add_action( 'admin_init', array( $this, 'localize_smart_manager' ) ); //Language loader add_action( 'admin_notices', array( $this, 'add_admin_notices' ) ); // Remove WP footer on SM pages add_filter( 'admin_footer_text', array( &$this, 'footer_text') ); add_filter( 'update_footer', array( &$this, 'update_footer_text'), 99 ); //For handling media links on plugins page add_action( 'admin_footer', array( &$this, 'add_plugin_social_links' ) ); add_action( 'admin_footer', array( $this, 'smart_manager_support_ticket_content' ) ); if( 'yes' === Smart_Manager_Settings::get( 'show_manage_with_smart_manager_button' ) ) { add_action( 'admin_footer', array( $this, 'manage_with_smart_manager' ) ); } add_action( 'admin_menu', array( $this, 'add_menu_access' ), 9 ); if( 'yes' === Smart_Manager_Settings::get( 'show_smart_manager_menu_in_admin_bar' ) ) { add_action( 'admin_bar_menu', array( $this, 'add_admin_bar_menu' ), 99 ); } if (is_admin() ) { add_action ( 'wp_ajax_sm_update_to_pro', array( $this, 'update_to_pro' ) ); } if ( defined('SMPRO') && SMPRO === false ) { add_action( 'admin_init', array( $this, 'show_upgrade_to_pro' ) ); //for handling Pro to Lite } else if ( defined('SMPRO') && SMPRO === true ) { add_action( 'admin_init', array( $this, 'pro_activated' ) ); add_filter( 'plugin_auto_update_setting_html', array( $this,'auto_update_setting_html' ), 10, 3 ); } // Action to declare WooCommerce HPOS compatibility. add_action( 'before_woocommerce_init', array( $this, 'declare_hpos_compatibility' ) ); add_filter( 'plugin_row_meta', array( $this, 'add_additonal_links' ), 99, 4 ); add_action( 'admin_enqueue_scripts', array( $this, 'sa_sm_dequeue_styles' ), 999 ); // hooks to overwrite slug when importing the csv with updated data. if( ( defined('SMPRO') && true === SMPRO ) ){ add_filter( 'woocommerce_csv_product_import_mapping_options', array( $this, 'add_slug_import_option' ) ); add_filter( 'woocommerce_csv_product_import_mapping_default_columns', array( $this, 'add_default_slug_column_mapping' ) ); add_filter( 'woocommerce_product_import_pre_insert_product_object', array( $this, 'process_import_product_slug_column' ), 10, 2 ); } } // Find latest StoreApps Upgrade file public function get_latest_upgrade_class() { $available_classes = get_declared_classes(); $available_upgrade_classes = array_filter( $available_classes, function ( $class_name ) { return strpos( $class_name, 'StoreApps_Upgrade_' ) === 0; } ); $latest_class = 'StoreApps_Upgrade_4_0'; $latest_version = 0; foreach ( $available_upgrade_classes as $class ) { $exploded = explode( '_', $class ); $get_numbers = array_filter( $exploded, function ( $value ) { return is_numeric( $value ); } ); $version = implode( '.', $get_numbers ); if ( version_compare( $version, $latest_version, '>' ) ) { $latest_version = $version; $latest_class = $class; } } return $latest_class; } //Function for actions to be done on 'plugins_loaded' event public function on_plugins_loaded() { global $current_user; if ( ( defined('SMPRO') && SMPRO === true ) && ! class_exists( 'StoreApps_Upgrade_4_0' ) && file_exists( ( dirname( SM_PLUGIN_FILE ) ) . '/pro/sa-includes/class-storeapps-upgrade-4-0.php' ) ) { require_once 'pro/sa-includes/class-storeapps-upgrade-4-0.php'; } $this->show_pricing_page = apply_filters( 'sm_show_pricing_page', false ); //define woo constants $this->define_woo_constants(); self::$sm_is_woo92 = ( defined('SM_IS_WOO92') && 'true' === SM_IS_WOO92 ) ? true : false; self::$sm_is_woo79 = ( defined('SM_IS_WOO79') && 'true' === SM_IS_WOO79 ) ? true : false; self::$sm_is_woo44 = (defined('SM_IS_WOO44')) ? SM_IS_WOO44 : ''; self::$sm_is_woo40 = (defined('SM_IS_WOO40')) ? SM_IS_WOO40 : ''; self::$sm_is_woo39 = (defined('SM_IS_WOO39')) ? SM_IS_WOO39 : ''; self::$sm_is_woo36 = (defined('SM_IS_WOO36')) ? SM_IS_WOO36 : ''; self::$sm_is_woo30 = (defined('SM_IS_WOO30')) ? SM_IS_WOO30 : ''; self::$sm_is_woo22 = (defined('SM_IS_WOO22')) ? SM_IS_WOO22 : ''; self::$sm_is_woo21 = (defined('SM_IS_WOO21')) ? SM_IS_WOO21 : ''; if( self::$sm_is_woo79 && function_exists( 'wc_get_container' ) && class_exists( 'Automattic\WooCommerce\Internal\DataStores\Orders\DataSynchronizer' ) && wc_get_container()->get( Automattic\WooCommerce\Internal\DataStores\Orders\DataSynchronizer::class )->check_orders_table_exists() ){ self::$sm_is_wc_hpos_tables_exists = true; } //Code for handling the in app offer if ( ! class_exists( 'SA_SM_In_App_Offer' ) && file_exists( (dirname( SM_PLUGIN_FILE )) . '/classes/sa-includes/class-sa-sm-in-app-offer.php' ) ) { include_once 'classes/sa-includes/class-sa-sm-in-app-offer.php'; $args = array( 'file' => (dirname( SM_PLUGIN_FILE )) . '/classes/sa-includes/', 'prefix' => 'sm', // prefix/slug of your plugin 'option_name' => 'sa_sm_offer_bfcm_2024', 'campaign' => 'sa_bfcm_2024', 'start' => '2024-11-26 07:00:00', 'end' => '2024-12-06 06:30:00', 'is_plugin_page' => ( !empty($_GET['page']) && in_array( $_GET['page'], array( 'smart-manager', 'sm-storeapps-plugins' ) ) ) ? true : false, // page where you want to show offer, do not send this if no plugin page is there and want to show offer on Products page ); $sa_offer = SA_SM_In_App_Offer::get_instance( $args ); if ( ! defined( 'SA_OFFER_VISIBLE' ) ) { $show = false; $timezone_format = _x( 'Y-m-d H:i:s', 'timezone date format' ); $current_date = strtotime( date_i18n( $timezone_format ) ); $start = strtotime( $args['start'] ); $end = strtotime( $args['end'] ); if ( ( $current_date >= $start ) && ( $current_date <= $end ) ) { $show = true; } define( 'SA_OFFER_VISIBLE', $show ); } } if ( ! empty($_GET['page']) && $_GET['page'] == "smart-manager" && ! empty( $_GET['dashboard'] ) ) { if( ! empty( $_GET['is_view'] ) ) { update_option('sm_wp_dashboard_view_'.get_current_user_id(), $_GET['dashboard'], 'no' ); wp_safe_redirect( remove_query_arg(array( 'dashboard', 'is_view' ), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ); } else { update_option('sm_wp_dashboard_post_type_'.get_current_user_id(), $_GET['dashboard'], 'no' ); wp_safe_redirect( remove_query_arg('dashboard', wp_unslash( $_SERVER['REQUEST_URI'] ) ) ); } exit; } } //Function for actions to be done on 'wp_loaded' event public function on_wp_loaded() { if ( defined('SMPRO') && SMPRO === true ) { $latest_upgrade_class = $this->get_latest_upgrade_class(); $sku = SM_SKU; $prefix = SM_PREFIX; $plugin_name = SM_PLUGIN_NAME; $documentation_link = 'https://www.storeapps.org/knowledgebase_category/smart-manager/'; $GLOBALS['smart_manager_upgrade'] = new $latest_upgrade_class( SM_PLUGIN_FILE, $sku, $prefix, $plugin_name, SM_TEXT_DOMAIN, $documentation_link ); } } // function to handle the display of quick help widget public function quick_help_widget( $active_plugins, $upgrader ) { if ( is_admin() && !empty( $_GET['page'] ) && ( 'smart-manager-settings' === $_GET['page'] ) ) { $active_plugins[SM_SKU] = 'smart-manager'; } elseif ( array_key_exists( SM_SKU, $active_plugins ) ) { unset( $active_plugins[SM_SKU] ); } return $active_plugins; } public function is_page_for_notifications( $is_page, $upgrader ) { $landing_page = ( !empty( $_GET['landing-page'] ) ) ? $_GET['landing-page'] : ''; if ( is_admin() && ! empty( $_GET['page'] ) && ( ( 'smart-manager' === $_GET['page'] && 'sm-about' !== $landing_page ) || 'smart-manager-settings' === $_GET['page'] ) ) { return true; } return $is_page; } // Function to override the site transient public function overwrite_site_transient( $plugin_info ) { if ( ! defined('SM_SKU') ) { return $plugin_info; } $data = get_option( '_storeapps_connector_data', array() ); $sm_license_key = !empty($data[SM_SKU]) ? $data[SM_SKU]['license_key'] : ''; $sm_download_url = $this->get_pro_download_url(); if ( file_exists((dirname( SM_PLUGIN_FILE )) . '/pro/sm.js') && (empty($sm_license_key) || empty($sm_download_url)) ) { $plugin_base_file = plugin_basename( SM_PLUGIN_FILE ); $live_version = !empty($data[SM_SKU]['live_version']) ? $data[SM_SKU]['live_version'] : ''; $installed_version = !empty($data[SM_SKU]['installed_version']) ? $data[SM_SKU]['installed_version'] : ''; if ( version_compare( $live_version, $installed_version, '>' ) ) { $plugin_info->response[$plugin_base_file]->package = ''; } } return $plugin_info; } public function get_pro_download_url() { $sm_old_download_url = ''; $sm_new_download_url = ''; if ( defined('SM_PREFIX') ) { $sm_old_download_url = get_site_option( SM_PREFIX.'_download_url' ); } $data = get_option( '_storeapps_connector_data', array() ); if ( defined('SM_SKU') && ! empty( $data[SM_SKU] ) ) { $sm_new_download_url = ( !empty( $data[SM_SKU]['download_url'] ) ) ? $data[SM_SKU]['download_url'] : ''; } $sm_download_url = ( ! empty( $sm_new_download_url ) ) ? $sm_new_download_url : $sm_old_download_url; return $sm_download_url; } public function is_pro_available() { $sm_download_url = $this->get_pro_download_url(); if ( ! file_exists( ( dirname( SM_PLUGIN_FILE ) ) . '/pro/assets/js/smart-manager.js' ) && ! empty( $sm_download_url ) ) { return true; } return false; } /* * Function to to handle media links on plugin page */ public function add_plugin_social_links() { $is_pro_available = $this->is_pro_available(); if( $is_pro_available === true ) { //request ftp credentials form wp_print_request_filesystem_credentials_modal(); } ?> array ('content-type' => 'application/text' ) ); $response_info = wp_remote_post( $storeapps_validation_url, $resp_type ); //return WP_Error on response failure if (is_array( $response_info )) { $response_code = wp_remote_retrieve_response_code( $response_info ); $response_msg = wp_remote_retrieve_response_message( $response_info ); if ($response_code == 200) { $storeapps_response = wp_remote_retrieve_body( $response_info ); $decoded_response = json_decode( $storeapps_response ); if ($decoded_response->is_valid == 1) { update_site_option( SM_PREFIX.'_download_url', $decoded_response->download_url ); define('SMPROTOLITE', true); } else { define('SMPROTOLITE', false); } } else { define('SMPROTOLITE', false); } } } } public function pro_activated() { $is_check = get_option( SM_PREFIX . '_check_update', 'no' ); if ( $is_check === 'no' ) { $response = wp_remote_get( 'https://www.storeapps.org/wp-admin/admin-ajax.php?action=check_update&plugin='.SM_SKU ); update_option( SM_PREFIX . '_check_update', 'yes', 'no' ); } } function get_free_menu_position($start, $increment = 0.0001) { foreach ($GLOBALS['menu'] as $key => $menu) { $menus_positions[] = $key; } if (!in_array($start, $menus_positions)) return $start; /* the position is already reserved find the closet one */ while (in_array($start, $menus_positions)) { $start += $increment; } return $start; } // Function to draw the relevant page function add_admin_page() { if( !empty($_GET['landing-page']) ) { $GLOBALS['smart_manager_admin_welcome']->show_welcome_page(); } else if( !empty( $_GET['page'] ) && 'smart-manager' === $_GET['page'] ) { $this->show_console_beta(); } else if( ( !empty( $_GET['page'] ) && 'smart-manager-pricing' === $_GET['page'] ) ) { if ( headers_sent() ) { echo ""; } else { wp_redirect( admin_url( 'admin.php?page=smart-manager&tab=upgrade#!/pricing' ) ); } exit; } else if( ( !empty( $_GET['page'] ) && 'sm-storeapps-plugins' === $_GET['page'] ) && ( class_exists( 'StoreApps_Marketplace' ) && is_callable( array('StoreApps_Marketplace', 'init') ) ) ) { StoreApps_Marketplace::init(); } else { if ( headers_sent() ) { echo ""; } else { wp_redirect( admin_url( 'admin.php?page=smart-manager' ) ); } exit; } } // Function to add menu function add_menu() { $current_user_role = ( is_callable( array( 'Smart_Manager', 'get_current_user_role' ) ) ) ? self::get_current_user_role() : ''; $position = (string) $this->get_free_menu_position(56.00001); if( ( defined( 'SMPRO' ) && true === SMPRO ) || ( ( ! empty( $current_user_role ) && 'administrator' === $current_user_role ) ) ) { $page = add_menu_page( 'Smart Manager', 'Smart Manager','read', 'smart-manager', array( $this, 'add_admin_page' ), 'dashicons-performance', $position ); if( defined( 'SMPRO' ) && true !== SMPRO || ! empty( $this->show_pricing_page ) ) { add_submenu_page( 'smart-manager', __( ' 🔥 Go Pro', 'smart-manager-for-wp-e-commerce' ), __( ' 🔥 Go Pro', 'smart-manager-for-wp-e-commerce' ), 'manage_options', 'smart-manager-pricing', array( $this, 'add_admin_page' ) ); } add_submenu_page( 'smart-manager', __( 'Docs & Support', 'smart-manager-for-wp-e-commerce' ), __( 'Docs & Support', 'smart-manager-for-wp-e-commerce' ), 'manage_options', 'smart-manager&landing-page=sm-about', array( $this, 'add_admin_page' ) ); $show_sa_plugins_page = true; $show_sa_plugins_page = apply_filters('sm_show_sa_plugins_page', $show_sa_plugins_page); if( !empty( $show_sa_plugins_page ) ) { add_submenu_page( 'smart-manager', __( 'StoreApps Plugins', 'smart-manager-for-wp-e-commerce' ), __( 'StoreApps Plugins', 'smart-manager-for-wp-e-commerce' ), 'manage_options', 'sm-storeapps-plugins', array( $this, 'add_admin_page' ) ); } } } function add_menu_access() { global $wpdb; $current_user_role = ( is_callable( array( 'Smart_Manager', 'get_current_user_role' ) ) ) ? self::get_current_user_role() : ''; if( ( empty( $current_user_role ) ) ) return; if( 'administrator' === $current_user_role ){ $this->add_menu(); return; } $query = "SELECT option_value FROM {$wpdb->prefix}options WHERE option_name = 'sm_" . $current_user_role . "_dashboard'"; $result_old = $wpdb->get_results( $query ); $user_role_accessible_dashboards = array(); $user_accessible_dashboards = array(); if( class_exists('Smart_Manager_Pro_Access_Privilege') ) { $option_nm = Smart_Manager_Pro_Access_Privilege::$access_privilege_option_start."".$current_user_role."".Smart_Manager_Pro_Access_Privilege::$access_privilege_option_end; $user_role_accessible_dashboards = $wpdb->get_results( $wpdb->prepare( "SELECT option_name, option_value FROM {$wpdb->prefix}options WHERE option_name = %s", $option_nm ), 'ARRAY_A' ); $user_accessible_dashboards = $wpdb->get_results( $wpdb->prepare( "SELECT meta_value FROM {$wpdb->prefix}usermeta WHERE user_id = %d AND meta_key = %s", get_current_user_id(), Smart_Manager_Pro_Access_Privilege::$access_privilege_option_start."dashboards" ), 'ARRAY_A' ); } if ( ( ! empty( $result_old[0] ) && ! empty( $result_old[0]->option_value ) ) || ! empty( $user_accessible_dashboards ) || ! empty( $user_role_accessible_dashboards ) ) { //modified cond for client fix $this->add_menu(); } } public static function get_current_user_role() { global $current_user; if ( ! function_exists('wp_get_current_user') ) { require_once (ABSPATH . 'wp-includes/pluggable.php'); // Sometimes conflict with SB-Welcome Email Editor } $current_user = wp_get_current_user(); // Sometimes conflict with SB-Welcome Email Editor $current_user_role = ''; $current_user_caps = ''; $roles = ( ! empty( $current_user->roles[0] ) ) ? array_values( $current_user->roles ) : $current_user->roles; if( ! empty( $roles ) && sizeof( $roles ) > 0 ) { $user_role = array_search( 'administrator', $roles ); $current_user_role = ( false !== $user_role ) ? $roles[ $user_role ] : $roles[0]; } $caps = ( ! empty( $current_user->caps ) ) ? array_keys( $current_user->caps ) : array(); if( ! empty( $caps ) && sizeof( $caps ) > 0 ) { $user_caps = array_search( 'administrator', $roles ); $current_user_caps = ( false !== $user_caps ) ? $caps[ $user_caps ] : $caps[0]; } return ( ( ! empty( $current_user_role ) && 'administrator' === $current_user_role ) || ( ! empty( $current_user_caps ) && 'administrator' === $current_user_caps ) ) ? 'administrator' : ( !empty( $current_user_caps ) ? $current_user_caps : $current_user_role ); } public function on_admin_init() { global $wp_version,$wpdb; if( is_callable( array( 'Smart_Manager', 'get_version' ) ) ) { $this->version = self::get_version(); } $this->get_dashboards(); $this->get_taxonomies(); $this->get_views(); $plugin = plugin_basename( SM_PLUGIN_FILE ); $old_plugin = 'smart-manager/smart-manager.php'; if (is_plugin_active( $old_plugin )) { deactivate_plugins( $old_plugin ); $action_url = "plugins.php?action=activate&plugin=$plugin&plugin_status=all&paged=1"; $url = wp_nonce_url( $action_url, 'activate-plugin_' . $plugin ); update_option( 'recently_activated', array ($plugin => time() ) + ( array ) get_option( 'recently_activated' ), 'no' ); if (headers_sent()) echo ""; else { wp_redirect( str_replace( '&', '&', $url ) ); exit(); } } // Including Scripts for using the wordpress new media manager if (version_compare ( $wp_version, '3.5', '>=' )) { define ( 'IS_WP35', true); if ( !empty( $_GET['page'] ) && ( 'smart-manager' === $_GET['page'] || 'smart-manager-settings' === $_GET['page'] ) ) { wp_enqueue_media(); wp_enqueue_script( 'custom-header' ); // wp_enqueue_script( 'media-upload' ); } } //Flag for handling changes since WP 4.0+ if (version_compare ( $wp_version, '4.0', '>=' )) { define ( 'IS_WP40', true); } } // Function to handle SM admin notices function add_admin_notices() { if( !( !empty( $_GET['page'] ) && ( 'smart-manager' === $_GET['page'] ) ) ) { return; } if (SMPRO === false) { $this->add_promo_notices(); } } // Function to handle SM In App Promo function add_promo_notices() { if ( !empty($_GET['page']) && ( 'smart-manager' === $_GET['page'] ) ) { $sm_dismiss_admin_notice = ''; $sm_promo_msg = ''; $sm_lite_activation_date = get_option( 'sm_lite_activation_date', false ); $timezone_format = _x('Y-m-d H:i:s', 'timezone date format'); $current_wp_date = date_i18n($timezone_format); if ( $sm_lite_activation_date === false ) { $sm_lite_activation_date = $current_wp_date; add_option('sm_lite_activation_date',$sm_lite_activation_date); add_option('_sm_update_418_date',$sm_lite_activation_date); } else { $sm_lite_activation_date = get_option( '_sm_update_418_date', false ); if( false === $sm_lite_activation_date ) { $sm_lite_activation_date = $current_wp_date; add_option('_sm_update_418_date',$sm_lite_activation_date); } } $date_diff = floor(( strtotime($current_wp_date) - strtotime( $sm_lite_activation_date ) ) / (3600 * 24) ); $is_pro_available = $this->is_pro_available(); if ( 'smart-manager' === $_GET['page'] && $is_pro_available === false && ( ! defined('SA_OFFER_VISIBLE') || ( defined('SA_OFFER_VISIBLE') && SA_OFFER_VISIBLE === false ) ) ) { $sm_inline_update_count = get_option( 'sm_inline_update_count', 0 ); $sm_current_user_display_name = self::sm_get_current_user_display_name(); if( ( empty( $sm_current_user_display_name ) ) ) return; if( false !== get_option( 'sm_dismiss_admin_notice', false ) ) { delete_option( 'sm_dismiss_admin_notice' ); } echo ''; $man_hours_data = self::sm_get_man_hours_data(); if( ( ! empty( $man_hours_data ) ) && ( is_array( $man_hours_data ) ) && ( ! empty( $man_hours_data['display_man_hours'] ) ) ){ echo self::sm_get_man_hours_html( $man_hours_data, $sm_current_user_display_name ); }else{ echo '
            '. ( ( self::show_halloween_offer() ) ? sprintf( /* translators: %1$s: current user display name %2$s: HTML of Pro price discount */ __( 'Hey %1$s, grab your %2$s Halloween discount!', 'smart-manager-for-wp-e-commerce' ), $sm_current_user_display_name, ''. __( "25% off", "smart-manager-for-wp-e-commerce" ) .'' ) : sprintf( /* translators: %1$s: current user display name %2$s: HTML of Pro price discount */ __( 'Hey %1$s, you just unlocked %2$s on Smart Manager Pro!', 'smart-manager-for-wp-e-commerce' ), $sm_current_user_display_name, ''. __( "25% off", "smart-manager-for-wp-e-commerce" ) .'' ) ) .'
            ' . sprintf( /* translators: %s: pricing page link */ __( '%s to check Smart Manager Pro features/benefits and claim your discount.', 'smart-manager-for-wp-e-commerce' ), '' . __( 'Click here', 'smart-manager-for-wp-e-commerce' ) . '' ) .'
            '; } } } } // Function to dequeue unwanted scripts on Smart Manager page. public function sa_sm_dequeue_scripts() { global $wp_scripts; if ( is_admin() && !empty( $_GET['page'] ) && ( 'smart-manager' === $_GET['page'] || 'smart-manager-settings' === $_GET['page'] ) ) { $dequeue_handles = array( 'wpml-tm-progressbar', 'wpml-tm-scripts', 'toolset-utils', 'elex_selectwoo_js', 'adl-bootstrap-js' ); if ( is_plugin_active( 'addify-product-labels-and-stickers/class-af_wcbm_main.php' ) && ( is_array( $dequeue_handles ) ) ) { // Compat for 'Product Labels and Stickers' plugin. array_push( $dequeue_handles, 'cpt_badge_managment_select_js' ); } foreach( $wp_scripts->registered as $script ) { $handle = $script->handle; if( false !== stripos($handle, 'select2') || false !== in_array( $handle, $dequeue_handles ) ){ if ( wp_script_is( $handle ) ) { wp_dequeue_script( $handle ); wp_deregister_script( $handle ); } } } } } public function enqueue_admin_scripts() { global $wp_version, $wpdb, $current_user; $registered_scripts = array(); if( !empty( $_GET['landing-page'] ) || !( !empty( $_GET['page'] ) && 'smart-manager' === $_GET['page'] ) ) { return; } if ( !wp_script_is( 'jquery' ) ) { wp_enqueue_script( 'jquery' ); } if ( !wp_script_is( 'underscore' ) ) { wp_enqueue_script( 'underscore' ); } if ( function_exists('wp_enqueue_editor') ) { wp_enqueue_editor(); } $deps = array('jquery', 'jquery-ui-core' , 'jquery-ui-widget' , 'jquery-ui-accordion' , 'jquery-ui-autocomplete' , 'jquery-ui-button' , 'jquery-ui-datepicker' , 'jquery-ui-dialog' , 'jquery-ui-draggable' , 'jquery-ui-droppable' , 'jquery-ui-menu' , 'jquery-ui-mouse' , 'jquery-ui-position' , 'jquery-ui-progressbar' , 'jquery-ui-selectable' , 'jquery-ui-resizable' , 'jquery-ui-sortable' , 'jquery-ui-slider' , 'jquery-ui-tooltip' ,'jquery-ui-tabs' , 'jquery-ui-spinner' , 'jquery-effects-core' , 'jquery-effects-blind' , 'jquery-effects-bounce' , 'jquery-effects-clip' , 'jquery-effects-drop' , 'jquery-effects-explode' , 'jquery-effects-fade' , 'jquery-effects-fold' , 'jquery-effects-highlight' , 'jquery-effects-pulsate' , 'jquery-effects-scale' , 'jquery-effects-shake' , 'jquery-effects-slide' , 'jquery-effects-transfer', 'underscore'); // if ( isset($_GET['page']) && $_GET['page'] == "smart-manager" ) { wp_register_script ( 'sm_select2', plugins_url ( '/assets/js/select2/select2.full.min.js', SM_PLUGIN_FILE ), $deps, '4.0.5' ); wp_enqueue_script( 'sm_select2' ); // } //Registering scripts for jqgrid lib. // wp_register_script ( 'sm_jquery_ui_multiselect', plugins_url ( '/assets/js/jqgrid/ui.multiselect.js', SM_PLUGIN_FILE ), $deps, '1.10.2' ); // wp_register_script ( 'sm_jqgrid_locale', plugins_url ( '/assets/js/jqgrid/grid.locale-en.js', SM_PLUGIN_FILE ), array ('sm_jquery_ui_multiselect'), '1.10.2' ); // wp_register_script ( 'sm_select2', plugins_url ( '/assets/js/select2/select2.full.min.js', SM_PLUGIN_FILE ), $deps, '4.0.5' ); // wp_register_script ( 'sm_jsoneditor', plugins_url ( '/assets/js/jsoneditor/jsoneditor.min.js', SM_PLUGIN_FILE ), array ('sm_select2'), '5.29.1' ); // wp_register_script ( 'sm_handsontable', plugins_url ( '/assets/js/handsontable/handsontable.full.min.js', SM_PLUGIN_FILE ), array ('sm_jsoneditor'), '6.2.0' ); // wp_register_script ( 'sm_handsontable_select2', plugins_url ( '/assets/js/handsontable/select2-editor.js', SM_PLUGIN_FILE ), array ('sm_handsontable'), '6.2.0' ); // wp_register_script ( 'sm_chosen', plugins_url ( '/assets/js/chosen/chosen.jquery.min.js', SM_PLUGIN_FILE ), array ('sm_handsontable_select2'), '1.3.0' ); // wp_register_script ( 'sm_sortable', plugins_url ( '/assets/js/sortable/sortable.min.js', SM_PLUGIN_FILE ), array ('sm_chosen'), '1.8.1' ); wp_register_script ( 'sm_mithril', plugins_url ( '/assets/js/mithril/mithril.min.js', SM_PLUGIN_FILE ), $deps, $this->version ); wp_register_script ( 'sm_search_styles', plugins_url ( '/assets/js/styles.js', SM_PLUGIN_FILE ), array( 'sm_mithril' ), $this->version ); wp_register_script ( 'sm_dashboard_js', plugins_url ( '/assets/js/admin.js', SM_PLUGIN_FILE ), array( 'sm_search_styles', 'wp-i18n'), $this->version ); $last_reg_script = 'sm_mithril'; //Code for loading custom js automatically $custom_lib_js_lite = glob( $this->plugin_path .'/assets/js/*/*.js' ); $custom_lib_js_pro = ( SMPRO === true ) ? glob( $this->plugin_path .'/pro/assets/js/*/*.js' ) : array(); $custom_lib_js = ( !empty( $custom_lib_js_pro ) && SMPRO === true ) ? array_merge( $custom_lib_js_lite, $custom_lib_js_pro ) : $custom_lib_js_lite; if( !empty( $custom_lib_js ) ) { $index = 0; foreach ( $custom_lib_js as $file ) { $folder_path = substr($file, 0, (strrpos($file, '/', -3))); $folder_name = substr($folder_path, (strrpos($folder_path, '/', -3) + 1)); if( 'mithril' === $folder_name ) { continue; } $pro_flag = ( !empty( $custom_lib_js_pro ) && in_array($file, $custom_lib_js_pro) ) ? 'pro' : ''; $file_nm = 'sm_'. ( !empty( $pro_flag ) ? $pro_flag.'_' : '' ) .'custom_'.preg_replace('/[\s\-.]/','_',substr($file, (strrpos($file, '/', -3) + 1))); if ( $file_nm == 'sm_pro_custom_smart_manager_js' ) { continue; } wp_register_script ( $file_nm, plugins_url ( ( !empty( $pro_flag ) ? '/'.$pro_flag : '' ).'/assets/js/'.$folder_name.'/'.substr($file, (strrpos($file, '/', -3) + 1)), SM_PLUGIN_FILE ), array ($last_reg_script), $this->version ); $last_reg_script = $file_nm; $index++; } } wp_register_script ( 'sm_custom_smart_manager_js', plugins_url ( '/assets/js/smart-manager.js', SM_PLUGIN_FILE ), array ($last_reg_script), $this->version ); $last_reg_script = 'sm_custom_smart_manager_js'; if( SMPRO === true ) { wp_register_script ( 'sm_pro_custom_smart_manager_js', plugins_url ( '/pro/assets/js/smart-manager.js', SM_PLUGIN_FILE ), array ($last_reg_script), $this->version ); $last_reg_script = 'sm_pro_custom_smart_manager_js'; } // Code for loading custom js automatically $custom_js = glob( $this->plugin_path .'/assets/js/*.js' ); $index = 0; foreach ( $custom_js as $file ) { $file_nm = 'sm_custom_'.preg_replace('/[\s\-.]/','_',substr($file, (strrpos($file, '/', -3) + 1))); array_push( $registered_scripts, $file_nm ); if ( $file_nm == 'sm_custom_smart_manager_js' || $file_nm == 'sm_custom_styles_js' || $file_nm == 'sm_custom_admin_js' ) { continue; } if ( empty($last_reg_script) && $index == 0 ) { wp_register_script ( $file_nm, plugins_url ( '/assets/js/'.substr($file, (strrpos($file, '/', -3) + 1)), SM_PLUGIN_FILE ), array ('sm_custom_smart_manager_js'), $this->version ); } else { wp_register_script ( $file_nm, plugins_url ( '/assets/js/'.substr($file, (strrpos($file, '/', -3) + 1)), SM_PLUGIN_FILE ), array ($last_reg_script), $this->version ); } $last_reg_script = $file_nm; $index++; } //Updating The Files Recieved in SM Beta $successful = ($this->updater * $this->upgrade)/$this->updater; // Code for loading custom js for PRO automatically if( SMPRO === true ) { $custom_js = glob( $this->plugin_path .'/pro/assets/js/*.js' ); foreach ( $custom_js as $file ) { $file_nm = 'sm_pro_custom_'.preg_replace('/[\s\-.]/','_',substr($file, (strrpos($file, '/', -3) + 1))); array_push( $registered_scripts, $file_nm ); if ( $file_nm == 'sm_pro_custom_smart_manager_js' ) { continue; } wp_register_script ( $file_nm, plugins_url ( '/pro/assets/js/'.substr($file, (strrpos($file, '/', -3) + 1)), SM_PLUGIN_FILE ), array ($last_reg_script), $this->version ); $last_reg_script = $file_nm; $index++; } } ( is_callable( array( 'Smart_Manager', 'set_script_translations' ) ) ) ? self::set_script_translations( $registered_scripts ) : ''; $sm_dashboard_keys = ( !empty( self::$sm_dashboards_final ) ) ? array_keys( self::$sm_dashboards_final ) : array(); // set the default dashboard $search_type = get_transient( 'sa_sm_'.$current_user->user_email.'_search_type' ); $recent_dashboards = get_option('sm_wp_dashboard_post_type_'.get_current_user_id(), false); $is_redirect = false; if( empty( $recent_dashboards ) ) { $recent_dashboards = get_user_meta( get_current_user_id(), 'sa_sm_recent_post_types', true ); if( empty( $recent_dashboards ) ){ $key = 'sa_sm_'.$current_user->user_email.'_default_dashboard'; $recent_dashboards = get_transient( $key ); if( ! empty( $recent_dashboards ) ) { update_user_meta( get_current_user_id(), 'sa_sm_recent_post_types', array( $recent_dashboards ) ); delete_transient( $key ); } } } else { $is_redirect = true; sa_sm_update_recent_dashboards( 'post_types', $recent_dashboards ); $recent_dashboards = get_user_meta( get_current_user_id(), 'sa_sm_recent_post_types', true ); delete_option('sm_wp_dashboard_post_type_'.get_current_user_id()); } if( ! empty( $recent_dashboards ) && ! is_array( $recent_dashboards ) ){ $recent_dashboards = array( $recent_dashboards ); } $recent_dashboards = ( ! empty( $recent_dashboards ) && ! empty( $sm_dashboard_keys ) ) ? array_values( array_intersect( $recent_dashboards, $sm_dashboard_keys ) ) : array(); //Added to give access to only accessible dashboards // Code to set default if recent dashboards is blank if( empty( $recent_dashboards ) && ! empty( $sm_dashboard_keys ) ){ $recent_dashboards = array( (is_plugin_active( 'woocommerce/woocommerce.php' ) && !empty( self::$sm_dashboards_final['product'] ) ) ? 'product' : $sm_dashboard_keys[0] ); } $recent_dashboard_type = get_user_meta( get_current_user_id(), 'sa_sm_recent_dashboard_type', true ); $recent_dashboard_type = ( empty( $recent_dashboards ) && 'post_type' === $recent_dashboard_type ) ? '' : $recent_dashboard_type; $recent_views = get_option('sm_wp_dashboard_view_'.get_current_user_id(), false); if( empty( $recent_views ) ) { $recent_views = get_user_meta( get_current_user_id(), 'sa_sm_recent_views', true ); } else { sa_sm_update_recent_dashboards( 'views', $recent_views ); $recent_views = get_user_meta( get_current_user_id(), 'sa_sm_recent_views', true ); delete_option('sm_wp_dashboard_view_'.get_current_user_id()); $recent_dashboard_type = 'view'; } if( ! empty( $recent_views ) && ! is_array( $recent_views ) ){ $recent_views = array( $recent_views ); } $recent_views = ( ! empty( $recent_views ) && ! empty( $this->all_views ) ) ? array_values( array_intersect( $recent_views, $this->all_views ) ) : array(); $recent_views = ( empty( $recent_views ) && empty( $recent_dashboards ) && ! empty( $this->all_views ) && is_array( $this->all_views ) ) ? array( $this->all_views[0] ) : $recent_views; $recent_dashboard_type = ( empty( $recent_views ) && 'view' === $recent_dashboard_type ) ? '' : $recent_dashboard_type; $recent_dashboard_type = ( empty( $recent_dashboard_type ) && ! empty( $recent_views ) && empty( $recent_dashboards ) ) ? 'view' : $recent_dashboard_type; //code for handling recent taxonomy dashboards $recent_taxonomy_dashboards = get_user_meta( get_current_user_id(), 'sa_sm_recent_taxonomies', true ); if( ! empty( $recent_taxonomy_dashboards ) && ! is_array( $recent_taxonomy_dashboards ) ){ $recent_taxonomy_dashboards = array( $recent_taxonomy_dashboards ); } $recent_taxonomy_dashboards = ( ! empty( $recent_taxonomy_dashboards ) && ! empty( self::$taxonomy_dashboards ) ) ? array_values( array_intersect( $recent_taxonomy_dashboards, array_keys( self::$taxonomy_dashboards ) ) ) : array(); $recent_taxonomy_dashboards = ( empty( $recent_taxonomy_dashboards ) && empty( $recent_views ) && empty( $recent_dashboards ) && ! empty( self::$taxonomy_dashboards ) && is_array( self::$taxonomy_dashboards ) ) ? array( array_keys( self::$taxonomy_dashboards )[0] ) : $recent_taxonomy_dashboards; $recent_dashboard_type = ( empty( $recent_taxonomy_dashboards ) && 'taxonomy' === $recent_dashboard_type ) ? '' : $recent_dashboard_type; $recent_dashboard_type = ( empty( $recent_dashboard_type ) && ! empty( $recent_taxonomy_dashboards ) && empty( $recent_views ) && empty( $recent_dashboards ) ) ? 'taxonomy' : $recent_dashboard_type; if( empty( $recent_dashboard_type ) ){ $recent_dashboard_type = 'post_type'; if( ! empty( $recent_taxonomy_dashboards ) ){ $recent_dashboard_type = 'taxonomy'; } else if( ! empty( $recent_views ) ){ $recent_dashboard_type = 'view'; } } //Updating The Files Recieved in SM Beta $deleted_successful = ( ($this->dupdater * $this->dupgrade)/$this->dupdater ) * 2; self::$sm_dashboards_final ['sm_nonce'] = wp_create_nonce( 'smart-manager-security' ); $batch_background_process = false; $background_process_name = ''; if( SMPRO === true ) { $batch_background_process = get_site_option('sm_beta_background_process_status', false); $background_process_params = get_transient('sm_beta_background_process_params'); $background_process_name = (!empty($background_process_params['process_name'])) ? $background_process_params['process_name'] : ''; } $lite_dashboards = array('product', 'shop_order', 'shop_coupon', 'post', 'product_stock_log'); $trash_enabled = true; if( defined('EMPTY_TRASH_DAYS') ){ if( 0 == EMPTY_TRASH_DAYS ) { $trash_enabled = false; } } //Filter for disabling the 'Move to trash' and 'Delete Permanently' functionalities $disable_trash_and_delete_permanently = apply_filters( 'sm_disable_trash_and_delete_permanently', false ); $trash_and_delete_permanently_disable_message = apply_filters( 'sm_trash_and_delete_permanently_disable_message', __( 'This functionality has been disabled. Please contact store administrator for enabling the same.', 'smart-manager-for-wp-e-commerce' ) ); $sm_beta_params = array( 'sm_dashboards' => json_encode(self::$sm_dashboards_final), 'sm_views' => json_encode($this->sm_accessible_views), 'sm_owned_views' => json_encode( $this->sm_owned_views ), 'sm_public_views' => json_encode( $this->sm_public_views ), 'sm_view_post_types' => json_encode( $this->sm_view_post_types ), 'recent_dashboards' => json_encode( $recent_dashboards ), 'recent_views' => json_encode( $recent_views ), 'recent_dashboard_type' => $recent_dashboard_type, 'sm_dashboards_public' => json_encode(self::$sm_public_dashboards), 'taxonomy_dashboards' => wp_json_encode( self::$taxonomy_dashboards ), 'all_taxonomy_dashboards' => SM_ALL_TAXONOMY_DASHBOARDS, 'recent_taxonomy_dashboards' => json_encode( $recent_taxonomy_dashboards ), 'SM_IS_WOO36' => self::$sm_is_woo36, 'SM_IS_WOO30' => self::$sm_is_woo30, 'SM_IS_WOO22' => self::$sm_is_woo22, 'SM_IS_WOO21' => self::$sm_is_woo21, 'SM_BETA_PRO' => SMPRO, 'SM_APP_ADMIN_URL' => SM_APP_ADMIN_URL, 'record_per_page' => Smart_Manager_Settings::get( 'per_page_record_limit' ), 'sm_admin_email' => get_option('admin_email'), 'batch_background_process' => $batch_background_process, 'background_process_name' => $background_process_name, 'updated_successful' => $successful, 'deleted_successful' => $deleted_successful, 'updated_msg' => $this->update_msg.' more', 'success_msg' => $this->success_msg, 'lite_dashboards' => json_encode($lite_dashboards), 'search_type' => ( ( !empty( $search_type ) ) ? $search_type : 'simple' ), 'wpdb_prefix' => $wpdb->prefix, 'trashEnabled' => $trash_enabled, 'background_process_running_message' => __( 'In the meanwhile, you can use Smart Manager. But before using actions like ', 'smart-manager-for-wp-e-commerce') .' '. __( 'Bulk Edit', 'smart-manager-for-wp-e-commerce') .'/ '. __('Duplicate Records', 'smart-manager-for-wp-e-commerce') .'/ '. __( 'Delete Records', 'smart-manager-for-wp-e-commerce') .'/ '. __( 'Undo Tasks', 'smart-manager-for-wp-e-commerce') .'/ '. __( 'Delete Tasks', 'smart-manager-for-wp-e-commerce') .'/ '. __( 'Export CSV', 'smart-manager-for-wp-e-commerce') .', '. __('you will have to wait for the current background process to finish.', 'smart-manager-for-wp-e-commerce' ), 'trashAndDeletePermanently' => array( 'disable' => $disable_trash_and_delete_permanently, 'error_message' => $trash_and_delete_permanently_disable_message ), 'forceCollapseAdminMenu' => ( 'no' === Smart_Manager_Settings::get( 'wp_force_collapse_admin_menu' ) ) ? 0 : 1, 'rowHeight' => Smart_Manager_Settings::get( 'grid_row_height' ), 'defaultImagePlaceholder' => SM_IMG_URL.'image-placeholder.png', 'showTasksTitleModal' => ( 'no' === apply_filters( 'sm_show_tasks_title_modal', Smart_Manager_Settings::get( 'show_tasks_title_modal' ) ) ) ? 0 : 1, 'useNumberFieldForNumericCols' => ( 'no' === apply_filters( 'sm_use_number_field_for_numeric_cols', Smart_Manager_Settings::get( 'use_number_field_for_numeric_cols' ) ) ) ? 0 : 1, 'WCProductImportURL' => admin_url( 'edit.php?post_type=product&page=product_importer' ), 'allSettings' => Smart_Manager_Settings::get(), 'useDatePickerForDateTimeOrDateCols' => ( 'no' === apply_filters( 'sm_use_date_picker_for_date_or_datetime_cols', Smart_Manager_Settings::get( 'use_date_picker_for_date_or_datetime_cols' ) ) ) ? 0 : 1, 'SM_IS_WOO79' => ( ! empty( self::$sm_is_woo79 ) ) ? 'true' : 'false', 'isSAOfferVisible' => SA_OFFER_VISIBLE, 'isSAOfferBannerVisible' => ( 'yes' === get_option( 'sa_sm_offer_bfcm_2024', 'yes' ) ) ? true : false, 'scheduled_action_admin_url' => admin_url( 'tools.php?page=action-scheduler&orderby=schedule&order=desc&action=-1&action2=-1&status=pending&s=storeapps_smart_manager_scheduled_actions&paged=1' ), 'is_admin' => ( 'administrator' === self::get_current_user_role() ) ? true : false, 'manHoursData' => self::sm_get_man_hours_data(), 'userName' => self::sm_get_current_user_display_name() ); $active_plugins = (array) get_option( 'active_plugins', array() ); if ( is_multisite() ) { $active_plugins = array_merge( $active_plugins, get_site_option( 'active_sitewide_plugins', array() ) ); } if ( ( in_array( 'woocommerce/woocommerce.php', $active_plugins, true ) || array_key_exists( 'woocommerce/woocommerce.php', $active_plugins ) ) ) { $sm_beta_params['woo_price_decimal_places'] = wc_get_price_decimals(); $sm_beta_params['woo_price_decimal_separator'] = wc_get_price_decimal_separator(); } wp_localize_script( 'sm_custom_smart_manager_js', 'sm_beta_params', $sm_beta_params ); wp_enqueue_script( $last_reg_script ); // Including Scripts for using the wordpress new media manager if (version_compare ( $wp_version, '3.5', '>=' )) { if ( isset($_GET['page']) && ($_GET['page'] == "smart-manager" || $_GET['page'] == "smart-manager-settings")) { wp_enqueue_media(); wp_enqueue_script( 'custom-header' ); } } do_action('smart_manager_enqueue_scripts'); //action for hooking any scripts } function enqueue_admin_styles() { if( !empty( $_GET['landing-page'] ) || !( !empty( $_GET['page'] ) && 'smart-manager' === $_GET['page'] ) ) { return; } wp_enqueue_style( 'wp-jquery-ui-dialog' ); //Registering styles for visualsearch lib. wp_register_style ( 'sm_search', plugins_url ( '/assets/css/styles.css', SM_PLUGIN_FILE ), array(), $this->version ); //Code for loading custom js for PRO automatically $custom_css_lite = glob( $this->plugin_path .'/assets/css/*/*.css' ); $custom_css_pro = array(); if( SMPRO === true ) { $custom_css = glob( $this->plugin_path .'/pro/assets/css/*.css' ); $custom_lib_css = glob( $this->plugin_path .'/pro/assets/css/*/*.css' ); $custom_css_pro = array_merge($custom_lib_css,$custom_css); } $custom_css = ( !empty( $custom_css_pro ) ) ? array_merge($custom_css_lite, $custom_css_pro) : $custom_css_lite; if( !empty( $custom_css ) ) { $index = 0; $last_reg_script = 'sm_search'; foreach ( $custom_css as $file ) { $folder_name = ''; $folder_path = substr($file, 0, (strrpos($file, '/', -3))); $folder_name = substr($folder_path, (strrpos($folder_path, '/', -3) + 1)); $pro_flag = ( !empty( $custom_css_pro ) && in_array($file, $custom_css_pro) ) ? 'pro' : ''; $file_nm = 'sm_'. ( !empty( $pro_flag ) ? $pro_flag.'_' : '' ) .'custom_'.preg_replace('/[\s\-.]/','_',substr($file, (strrpos($file, '/', -3) + 1))); if( $file_nm == 'sm_pro_custom_smart_manager_css' || $file_nm == 'sm_pro_custom_styles_css' ) { continue; } wp_register_style ( $file_nm, plugins_url ( ( !empty( $pro_flag ) ? '/'.$pro_flag : '' ).'/assets/css/'.$folder_name.'/'.substr($file, (strrpos($file, '/', -3) + 1)), SM_PLUGIN_FILE ), array($last_reg_script), $this->version ); $last_reg_script = $file_nm; $index++; } } wp_register_style ( 'sm_main_style', plugins_url ( '/assets/css/smart-manager.css', SM_PLUGIN_FILE ), array($last_reg_script), $this->version ); $last_reg_script = 'sm_main_style'; if( SMPRO === true ) { wp_register_style ( 'sm_pro_main_style', plugins_url ( '/pro/assets/css/smart-manager.css', SM_PLUGIN_FILE ), array($last_reg_script), $this->version ); $last_reg_script = 'sm_pro_main_style'; } wp_enqueue_style( $last_reg_script ); do_action('smart_manager_enqueue_scripts'); //action for hooking any styles } function get_latest_version() { $sm_plugin_info = get_site_transient( 'update_plugins' ); $latest_version = isset( $sm_plugin_info->response [SM_PLUGIN_BASE_NM]->new_version ) ? $sm_plugin_info->response [SM_PLUGIN_BASE_NM]->new_version : ''; return $latest_version; } function get_user_sm_version() { $sm_plugin_info = get_plugins(); $user_version = $sm_plugin_info [SM_PLUGIN_BASE_NM] ['Version']; return $user_version; } function is_pro_updated() { $user_version = $this->get_user_sm_version(); $latest_version = $this->get_latest_version(); return version_compare( $user_version, $latest_version, '>=' ); } // function for removing the Help Tab and hiding admin notices except SM admin notices. function remove_help_tab_and_hiding_admin_notices(){ // condition to remove the help tab only from SM pages. if ( ! empty( $_GET['page'] ) && 'smart-manager' === $_GET['page'] ) { $screen = get_current_screen(); $screen->remove_help_tabs(); // hiding admin notices except SM admin notices. ?> show_pricing_page ) ) { ?> 'Insufficient permissions' ) ); } $sm_download_url = $this->get_pro_download_url(); if ( ! empty( $sm_download_url ) ) { include_once( ABSPATH . 'wp-admin/includes/class-wp-upgrader.php' ); $skin = new WP_Ajax_Upgrader_Skin(); $upgrader = new Plugin_Upgrader( $skin ); $result = $upgrader->run( array( 'package' => $sm_download_url, 'destination' => WP_PLUGIN_DIR, 'clear_destination' => true, 'clear_working' => true, 'hook_extra' => array( 'plugin' => 'smart-manager-for-wp-e-commerce/smart-manager.php', 'type' => 'plugin', 'action' => 'update', ), ) ); if( !empty($result) ) { die('Success'); } else { die('Failed'); } } } // Function to show upgrade notifications function show_upgrade_notifications() { ?> is_pro_available(); if( $is_pro_available === true ) { ?>

            ' . __( 'Oops!', SM_TEXT_DOMAIN ) . ' ' . __( 'Seems like your Smart Manager plugin has downgraded to the Lite version. ', SM_TEXT_DOMAIN ) . " " . '' . " " .__( 'Click here', SM_TEXT_DOMAIN ) . ' ')." ".__( 'to', SM_TEXT_DOMAIN )." ".__( 'convert it back to the Pro version.', SM_TEXT_DOMAIN )."" ); ?>

            ' . __( 'Important:', SM_TEXT_DOMAIN ) . ' ' . __( 'Upgrade to Pro to get features like \'Manage any Custom Post Type\' , \'Bulk Edit\' , \'Export CSV \' , \'Duplicate Products\' & many more...', SM_TEXT_DOMAIN ) . " " . '
            ' . " " .__( 'Learn more about Pro version', SM_TEXT_DOMAIN ) . ' ' . __( 'or take a', SM_TEXT_DOMAIN ) . " " . '' . " " . __( 'Live Demo', SM_TEXT_DOMAIN ) . ''), 'https://www.storeapps.org/product/smart-manager', 'http://demo.storeapps.org/?demo=sm-woo' ); ?>

            get_latest_version(); $is_pro_updated = $this->is_pro_updated(); $is_pricing_page = ( ! empty( $_GET['tab'] ) && 'upgrade' === $_GET['tab'] ) ? true : false; ?>
            '.((SMPRO === true) ? __('PRO', 'smart-manager-for-wp-e-commerce') : __('LITE', 'smart-manager-for-wp-e-commerce')).''; $plug_page = ''; ?>
            " . __( 'Click to upgrade.', 'smart-manager-for-wp-e-commerce' ) . ""; $this->display_notice( $update_link ); ?> show_upgrade_notifications(); } if( ! $is_pricing_page ) { ?>
            0 ) { foreach( $handles as $handle ){ wp_set_script_translations( $handle, 'smart-manager-for-wp-e-commerce', plugin_dir_path( __FILE__ ) . 'languages' ); } } } /** * Smart Manager's Support Form */ public function smart_manager_support_ticket_content() { if ( !( !empty( $_GET['page'] ) && ( 'smart-manager' === $_GET['page'] || 'smart-manager-settings' === $_GET['page'] ) ) ) { return; } if ( !wp_script_is('thickbox') ) { if (!function_exists('add_thickbox')) { require_once ABSPATH . 'wp-includes/general-template.php'; } add_thickbox(); } if( !is_callable( array( $this, 'get_latest_upgrade_class' ) ) ){ return; } $latest_upgrade_class = $this->get_latest_upgrade_class(); if ( ! method_exists( $latest_upgrade_class, 'support_ticket_content' ) ) return; $plugin_data = get_plugin_data( self::$plugin_file ); $license_key = get_site_option( self::$prefix.'_license_key' ); $latest_upgrade_class::support_ticket_content( 'sa_smart_manager_beta', self::$sku, $plugin_data, $license_key, 'smart-manager-for-wp-e-commerce' ); } public function footer_text( $sm_footer_text ) { if ( is_admin() && !empty( $_GET['page'] ) && ( 'smart-manager-woo' === $_GET['page'] || 'smart-manager-wpsc' === $_GET['page'] || ( !empty( $_GET['sm_old'] ) && ( 'woo' === $_GET['sm_old'] || 'wpsc' === $_GET['sm_old'] ) && 'smart-manager' === $_GET['page'] ) || 'smart-manager' === $_GET['page'] || 'smart-manager-settings' === $_GET['page'] || 'smart-manager-pricing' === $_GET['page'] || 'sm-storeapps-plugins' === $_GET['page'] ) ) { // $sm_footer_text = __( 'Thank you for using Smart Manager. A huge thank you from StoreApps!', 'smart-manager-for-wp-e-commerce' ); $sm_footer_text = ''; } return $sm_footer_text; } function update_footer_text( $sm_version_text ) { if ( ! function_exists( 'get_plugin_data' ) ) { include_once ABSPATH . 'wp-admin/includes/plugin.php'; } $sm_plugin_data = get_plugin_data( SM_PLUGIN_FILE ); $sm_current_version = $sm_plugin_data['Version']; if ( is_admin() && ! empty( $_GET['page'] ) && ( 'smart-manager-woo' === $_GET['page'] || 'smart-manager-wpsc' === $_GET['page'] || ( !empty( $_GET['sm_old'] ) && ( 'woo' === $_GET['sm_old'] || 'wpsc' === $_GET['sm_old'] ) && 'smart-manager' === $_GET['page'] ) || 'smart-manager' === $_GET['page'] || 'smart-manager-settings' === $_GET['page'] || 'smart-manager-pricing' === $_GET['page'] || 'sm-storeapps-plugins' === $_GET['page'] ) ) { // $sm_version_text = sprintf( __( 'Smart Manager version: %s', 'smart-manager-for-wp-e-commerce' ), $sm_current_version ); $sm_version_text = ''; } return $sm_version_text; } //Function for showing the sm-privilege settings function show_privilege_page() { if (file_exists( $this->plugin_path . '/pro/sm-privilege.php' )) { include_once ($this->plugin_path . '/pro/sm-privilege.php'); return; } else { $error_message = __( "A required Smart Manager file is missing. Can't continue. ", 'smart-manager-for-wp-e-commerce' ); } } //function to display notices function display_notice($notice) { echo "

            "; echo _e( $notice, 'smart-manager-for-wp-e-commerce' ); echo "

            "; } //function to error messages function display_err() { echo "
            "; echo "" . __( 'Error:', 'smart-manager-for-wp-e-commerce' ) . "" . $this->error_message; echo "
            "; } public static function get_data() { return get_plugin_data( SM_PLUGIN_FILE ); } public static function get_version() { $version = ''; if( is_callable( array( 'Smart_Manager', 'get_data' ) ) ) { $plugin_data = self::get_data(); $version = $plugin_data['Version']; } return $version; } function manage_with_smart_manager() { $current_post_type = get_current_screen()->post_type; $current_screen_id = get_current_screen()->id; if ( ( ! empty( $current_post_type ) && 'edit-'.$current_post_type === $current_screen_id ) || 'users' === $current_screen_id ) { $dashboard = ( ( ! empty( $current_post_type ) ) ? $current_post_type : 'user' ); wp_register_script( 'manage_with_sm', plugins_url( '/assets/js/manage-with-smart-manager.js', SM_PLUGIN_FILE ), array(), self::get_version(), true ); wp_enqueue_script( 'manage_with_sm' ); $sm_params = array( 'url' => admin_url( 'admin.php?page=smart-manager' ) . '&dashboard=' . $dashboard, 'string' => ' Manage with Smart Manager', 'active_dashboard' => $dashboard, ); wp_localize_script( 'manage_with_sm', 'manage_with_sm', $sm_params ); ?> add_node( array( 'id' => 'sm-admin-bar-btn', 'title' => 'Smart Manager', 'href' => admin_url( 'admin.php?page=smart-manager' ), 'meta' => array( 'title' => 'Smart Manager - WooCommerce Advanced Bulk Edit, Inventory Management & more' ) ) ); } /** * Function to declare WooCommerce HPOS compatibility */ public function declare_hpos_compatibility() { if ( class_exists( \Automattic\WooCommerce\Utilities\FeaturesUtil::class ) ) { \Automattic\WooCommerce\Utilities\FeaturesUtil::declare_compatibility( 'custom_order_tables', 'smart-manager-for-wp-e-commerce/smart-manager.php', true ); } } /** * Function to handle duplicate dashboard names * * @param array $dashboard_slugs dashboard slugs. * @param string $dashboard_type dashboard type. */ public static function handle_duplicate_dashboard_names( $dashboard_slugs = array(), $dashboard_type = '' ) { if ( empty( $dashboard_slugs ) || ( ! is_array( $dashboard_slugs ) ) ) { return; } array_map( function( $slug = '' ) use ( $dashboard_type ) { switch ( $dashboard_type ) { case 'post_type': if ( isset( self::$sm_dashboards_final[ $slug ] ) ) { if ( in_array( $slug, array( 'product', 'shop_order', 'shop_coupon' ) ) ) { self::$sm_dashboards_final[ $slug ] = _x( 'WooCommerce - ', 'WooCommerce post type label', 'smart-manager-for-wp-e-commerce' ) . self::$sm_dashboards_final[ $slug ]; } else { self::$sm_dashboards_final[ $slug ] = self::$sm_dashboards_final[ $slug ] . " ($slug)"; } } break; case 'taxonomy': if ( isset( self::$taxonomy_dashboards[ $slug ] ) ) { if ( in_array( $slug, array( 'product_type', 'product_visibility', 'product_cat', 'product_tag', 'product_shipping_class' ) ) ) { self::$taxonomy_dashboards[ $slug ] = _x( 'WooCommerce - ', 'WooCommerce post type label', 'smart-manager-for-wp-e-commerce' ) . self::$taxonomy_dashboards[ $slug ]; } else { self::$taxonomy_dashboards[ $slug ] = self::$taxonomy_dashboards[ $slug ] . " ($slug)"; } } break; } }, array_reduce( $dashboard_slugs, function( $merged_slugs = array(), $slugs = array() ) { return ( ( is_array( $slugs ) ) && ( count( $slugs ) > 1 ) ) ? array_merge( $merged_slugs, $slugs ) : $merged_slugs; }, [] ) ); } /** * Function to add additional links under plugins meta on plugins page for 5-star and Go Pro in case of lite version installed. * * @param array $plugin_meta Plugin meta. * @param string $plugin_file Plugin file. * @param array $plugin_data Plugin's data. * @param string $status Plugin's status. * @return array Plugin meta with additional links. */ public function add_additonal_links( $plugin_meta = array(), $plugin_file = '', $plugin_data = array(), $status = '' ) { if ( ( defined('SM_PLUGIN_BASE_NM' ) && ( SM_PLUGIN_BASE_NM !== $plugin_file ) ) || ( ! defined('SM_PLUGIN_BASE_NM' ) ) || empty( $plugin_file ) ) { return $plugin_meta; } if ( ( defined('SMPRO') && false === SMPRO ) || ( ! defined('SMPRO') ) ) { $plugin_meta[] = ' 🔥 ' . _x( 'Go Pro', 'go pro link', 'smart-manager-for-wp-e-commerce' ) . ''; } $plugin_meta[] = sprintf( /* translators: %1\$: 5-star link %2s: 5-star link */ __( "Boost us with %1\$s⭐⭐⭐⭐⭐ 🚀%2\$s", 'smart-manager-for-wp-e-commerce' ), '', '' ); return $plugin_meta; } /** * Function to determine if Halloween specific offer is to be shown or not * * @return boolean Flag to determine whether Halloween specific offer is to be shown or not */ public static function show_halloween_offer(){ return ( ( time() >= strtotime( '2023-10-26 11:30:00' ) ) && ( time() <= strtotime( '2023-11-02 07:00:00' ) ) ) ? true : false; } /** * Function to log messages generated by Smart Manager plugin * * @param string $level Message type. Valid values: debug, info, notice, warning, error, critical, alert, emergency. * @param string $message The message to log. */ public static function log( $level = 'notice', $message = '' ) { $is_logging_enabled = get_option( 'sa_sm_enable_logging', 'yes' ); if ( ( empty( $level ) && empty( $message ) ) || ( 'no' === $is_logging_enabled ) ) { return; } if ( defined( 'WC_PLUGIN_FILE' ) && ! empty( WC_PLUGIN_FILE ) ) { if ( function_exists( 'wc_get_logger' ) ) { wc_get_logger()->log( $level, $message, array( 'source' => 'smart-manager-for-wp-e-commerce' ) ); } elseif ( file_exists( plugin_dir_path( WC_PLUGIN_FILE ) . 'includes/class-wc-logger.php' ) ) { include_once plugin_dir_path( WC_PLUGIN_FILE ) . 'includes/class-wc-logger.php'; $logger = new WC_Logger(); $logger->add( 'smart-manager-for-wp-e-commerce', $message ); } } else { error_log( 'smart-manager-for-wp-e-commerce' . ' ' . $message ); // phpcs:ignore } } /** * Function to dequeue styles in Smart Manager page * * @return void */ public function sa_sm_dequeue_styles() { global $wp_styles; if ( ! is_admin() || empty( $_GET['page'] ) || ( ! empty( $_GET['page'] ) && ( 'smart-manager' !== $_GET['page'] ) ) || empty( $wp_styles->queue ) || ( ! is_array( $wp_styles->queue ) ) ) { return; } $dequeue_handles = array( 'adl-lp-bootstrap' ); foreach ( $wp_styles->queue as $handle ) { if ( empty( $handle ) || empty( $dequeue_handles ) || ( ! is_array( $dequeue_handles ) ) || ( ! in_array( $handle, $dequeue_handles ) ) || ( ! wp_style_is( $handle ) ) ) { continue; } wp_dequeue_style( $handle ); wp_deregister_style( $handle ); } } /** * Adds a 'Slug' option to the import options array. * * @param array $options Existing import options. * @return array Updated options array with 'Slug'. */ public function add_slug_import_option( $options = array() ) { $options['slug'] = 'Slug'; return $options; } /** * Maps the 'Slug' column to the corresponding field in the import data. * * @param array $columns Existing column mappings. * @return array Updated column mappings with 'Slug' mapped to 'slug'. */ public function add_default_slug_column_mapping( $columns = array() ) { $columns['Slug'] = 'slug'; return $columns; } /** * Processes the import for the product slug column and sets the slug. * * @param object|null $object The product object to be updated. * @param array $data Import data containing the slug. * @return object|null The updated product object or null if slug is empty or method is not callable. */ public function process_import_product_slug_column( $object = null, $data = array() ) { if ( ( ! is_array( $data ) ) || empty( $data['slug'] ) || ( ! is_callable( array( $object, 'set_slug' ) ) ) ) { return $object; } $object->set_slug( $data['slug'] ); return $object; } /** * Calculate saved time and additional savings using bulk edit calculation. * * @param string $edit_type Type of edit ('inline', 'advanced_search_inline', 'bulk'). * @param int $records_updated Number of records updated. * @param string $return_unit Unit to return the result in ('hrs' or 'mins'). Default is 'hrs'. * @return array|void Array with man-hours saved and additional savings, or void if input is invalid. */ public static function sm_get_time_saved_with_additional_savings( $edit_type = '', $records_updated = 0, $return_unit = 'hrs' ) { if ( empty( $edit_type ) || empty( $records_updated ) || ! array_key_exists( $edit_type, self::$time_saved_per_record ) ) { return; } $return_unit = strtolower( sanitize_text_field( $return_unit ) ); // Calculate man-hours saved for the given edit type. $man_hours_saved = floatval( ( absint( $records_updated ) ) * ( self::$time_saved_per_record[ $edit_type ] ) ); // Additional savings if bulk edit was used. $additional_savings = 0; if ( $edit_type !== 'bulk' ) { $additional_savings = absint( $records_updated ) * ( self::$time_saved_per_record['bulk'] - self::$time_saved_per_record[ $edit_type ] ); } $multiplier = ( $return_unit === 'mins' ) ? 60 : 1; return array( 'time_saved' => round( $man_hours_saved * $multiplier, 2 ), 'additional_savings' => round( $additional_savings * $multiplier, 2 ), 'unit' => $return_unit ); } /** * Update man-hours saved and records updated in the database. * * @param string $edit_type Type of edit ('inline', 'advanced_search_inline', 'bulk'). * @param int $records_updated Number of records updated. * @return void */ public static function sm_update_man_hours_data( $edit_type = '', $records_updated = 0 ) { if ( empty( $edit_type ) || empty( $records_updated ) ) { return; } $edit_type = sanitize_key( $edit_type ); $records_updated = absint( $records_updated ); $time_saved_details = self::sm_get_time_saved_with_additional_savings( $edit_type, $records_updated, 'hrs' ); if ( empty( $time_saved_details['time_saved'] ) ) { return; } $man_hours_saved = floatval( $time_saved_details['time_saved'] ); if ( empty( $man_hours_saved ) ) { return; } $man_hours_data = get_option( 'sa_sm_man_hours_saved', array() ); $records_data = get_option( 'sa_sm_records_updated', array() ); // Set 'advanced_search_inline' as 'inline' to simplify man-hours tracking. if( $edit_type === 'advanced_search_inline' ){ $edit_type = 'inline'; } $man_hours_data[ $edit_type ] = round( ( ! empty( $man_hours_data[ $edit_type ] ) ) ? ( $man_hours_data[ $edit_type ] + $man_hours_saved ) : $man_hours_saved, 2 ); $records_data[ $edit_type ] = round( ( ! empty( $records_data[ $edit_type ] ) ) ? ( $records_data[ $edit_type ] + $records_updated ) : $records_updated, 2 ); update_option( 'sa_sm_man_hours_saved', $man_hours_data ); update_option( 'sa_sm_records_updated', $records_data ); } /** * Get total man-hours saved from options and determine if they should be displayed. * * @return array|void Array with 'man_hours' and 'display_man_hours' keys, void if not found or empty */ public static function sm_get_man_hours_data() { $man_hours_data = get_option( 'sa_sm_man_hours_saved', array() ); if ( ( ! is_array( $man_hours_data ) ) || ( empty( $man_hours_data['inline'] ) ) ) { return array( 'man_hours_saved' => 0, 'display_man_hours' => false, 'additional_savings' => 0, ); } return array( 'man_hours_saved' => floatval( $man_hours_data['inline'] ), 'display_man_hours' => ( floatval( $man_hours_data['inline'] ) >= 0.25 ) ? true : false, 'additional_savings' => round( self::sm_calculate_additional_man_hrs_savings( floatval( $man_hours_data['inline'] ) ), 2 ) ); } /** * Calculate additional man-hours saved by using bulk edit instead of inline edit. * * @param float $man_hours_inline Total man-hours saved using inline edit. * @return float Additional man-hours saved using bulk edit. */ public static function sm_calculate_additional_man_hrs_savings( $man_hours_inline = 0 ) { if( ( empty( $man_hours_inline ) ) ) { return; } return round( ( ( floatval( $man_hours_inline ) ) / ( floatval( self::$time_saved_per_record['inline'] ) ) ) * ( ( floatval( self::$time_saved_per_record['bulk'] ) ) - ( floatval( self::$time_saved_per_record['inline'] ) ) ), 2 ); } /** * Display a notice summarizing the saved man-hours and available discounts. * * @param string $user_name The name of the current user. * @param array $man_hours_data The data about the saved man-hours and additional savings. * @return string html containing man hours data or empty string if data is not valid. */ public static function sm_get_man_hours_html( $man_hours_data = array(), $user_name = '' ) { if( ( empty( $man_hours_data ) ) || ( ! is_array( $man_hours_data ) ) || ( empty( $user_name ) ) || ( empty( $man_hours_data['additional_savings'] ) ) || ( empty( $man_hours_data['man_hours_saved'] ) ) ) { return ''; } return '
            ' . sprintf( /* translators: %1$s: user name, %2$s: saved man-hours */ __( 'Hey %1$s, you’ve just saved %2$s productive hours with Smart Manager! 🎉', 'smart-manager-for-wp-e-commerce' ), $user_name, $man_hours_data['man_hours_saved'] ) . '
            ' . sprintf( /* translators: %1$s: discount percentage, %2$s: additional man-hours */ __( 'Upgrade to Smart Manager Pro to save additional %1$s hours (minimum) and unlock all features. %2$s', 'smart-manager-for-wp-e-commerce' ), $man_hours_data['additional_savings'], '' . __( 'Get it at', 'smart-manager-for-wp-e-commerce' ) . ' '. __( '25% off!', 'smart-manager-for-wp-e-commerce' ) . ' ' ) . '
            '; } /** * Get the display name of the current user or a fallback value. * * @param string $fallback The fallback value to use if the user's display name is not set. Default is 'there'. * @return string|false The display name of the current user or false if user not exist. */ public static function sm_get_current_user_display_name( $fallback = 'there' ) { if( ( empty( $fallback ) ) ){ $fallback = 'there'; } $current_user = wp_get_current_user(); if ( ! $current_user->exists() ) { return false; } $display_name = $current_user->display_name; return ( ( ! empty( $display_name ) ) ) ? $display_name : __( $fallback, 'smart-manager-for-wp-e-commerce' ); } } $GLOBALS['smart_manager_beta'] = Smart_Manager::instance();