From f2ebd96cc8a3f37042e3d0164a79cd41d4ddc344 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Thu, 20 Oct 2022 09:43:02 +0200 Subject: [PATCH 001/474] WIP: Created new way to do the menus --- pandora_console/godmode/menu.php | 3 +- pandora_console/include/class/Menu.class.php | 126 +++++ .../include/class/MenuItem.class.php | 431 ++++++++++++++++++ pandora_console/include/functions_menu.php | 53 +-- pandora_console/include/styles/nMenu.css | 6 + pandora_console/operation/menu.php | 118 ++++- 6 files changed, 696 insertions(+), 41 deletions(-) create mode 100644 pandora_console/include/class/Menu.class.php create mode 100644 pandora_console/include/class/MenuItem.class.php create mode 100644 pandora_console/include/styles/nMenu.css diff --git a/pandora_console/godmode/menu.php b/pandora_console/godmode/menu.php index d63595d553..5097054b48 100644 --- a/pandora_console/godmode/menu.php +++ b/pandora_console/godmode/menu.php @@ -32,10 +32,11 @@ require_once 'include/functions_menu.php'; check_login(); -$access_console_node = !is_reporting_console_node(); +$access_console_node = is_reporting_console_node() === false; $menu_godmode = []; $menu_godmode['class'] = 'godmode'; +$menuGodmode = []; if ($access_console_node === true) { enterprise_include('godmode/menu.php'); } diff --git a/pandora_console/include/class/Menu.class.php b/pandora_console/include/class/Menu.class.php new file mode 100644 index 0000000000..bce38a89db --- /dev/null +++ b/pandora_console/include/class/Menu.class.php @@ -0,0 +1,126 @@ +ACL_el_que_sea') === true) { + haz cosas aqui + } + + */ + + public function __construct( + private string $name, + private array $items=[], + private array $menu=[] + ) { + + } + + + /** + * Create Item function. + * + * @param MenuItem $menuItem Item for print. + * + * @return array. + */ + public function generateItem(MenuItem $menuItem) + { + // Start with empty element. + $item = []; + if ($menuItem->canBeDisplayed() === true) { + // Handle of information. + if (empty($menuItem->getUrl()) === false) { + $urlPath = $menuItem->getUrl(); + } else { + $urlPath = ui_get_full_url( + $menuItem->getSec().'/'.$menuItem->getSec2().'/'.$menuItem->getParameters() + ); + } + + // Creation of the line. + $item[] = '
  • '; + + // Create the link if is neccesary. + if (empty($urlPath) === false) { + $item[] = sprintf( + '%s', + $urlPath, + $menuItem->getText() + ); + } + + // Check if this item has submenu. If is the case, create it. + if ($menuItem->hasSubmenu() === true) { + $item[] = ''; + } + + $item[] = '
  • '; + } + + return $item; + } + + + /** + * Generate the menu. + * + * @return void. + */ + public function generateMenu() + { + $output = []; + /* + Estructura + + */ + $output[] = ''; + + $this->menu[] = $output; + + } + + + /** + * Prints the menu. + * + * @return void. + */ + public function printMenu() + { + if (empty($this->menu) === false) { + foreach ($this->menu as $element) { + echo $element."\n"; + } + } + } + + +} diff --git a/pandora_console/include/class/MenuItem.class.php b/pandora_console/include/class/MenuItem.class.php new file mode 100644 index 0000000000..3ec088ac72 --- /dev/null +++ b/pandora_console/include/class/MenuItem.class.php @@ -0,0 +1,431 @@ +id) === true && empty($this->text) === false) { + $this->id = str_replace(' ', '_', $text); + } + + return $this; + } + + + /** + * Set Text. The caption of the option. + * + * @param string $text Text. + * + * @return void. + */ + public function setText(string $text) + { + $this->text = $text; + } + + + /** + * Get Text + * + * @return string. + */ + public function getText() + { + return $this->text; + } + + + /** + * Set URL. Raw URL avoid sec and sec2 information. + * + * @param string $url Url. + * + * @return void. + */ + public function setUrl(string $url) + { + $this->url = $url; + } + + + /** + * Get URL + * + * @return string. + */ + public function getUrl() + { + return $this->url; + } + + + /** + * Set sec + * + * @param string $sec Sec. + * + * @return void. + */ + public function setSec(string $sec) + { + $this->sec = $sec; + } + + + /** + * Get sec + * + * @return string. + */ + public function getSec() + { + return $this->sec; + } + + + /** + * Set sec2 + * + * @param string $sec2 Sec2. + * + * @return void. + */ + public function setSec2(string $sec2) + { + $this->sec2 = $sec2; + } + + + /** + * Get sec2 + * + * @return string. + */ + public function getSec2() + { + return $this->sec2; + } + + + /** + * Set parameters. Added parameters for builded url (sec + sec2). + * + * @param string $parameters Parameters. + * + * @return void. + */ + public function setParameters(string $parameters) + { + $this->parameters = $parameters; + } + + + /** + * Get parameters + * + * @return string. + */ + public function getParameters() + { + return $this->parameters; + } + + + /** + * Set id. This is useful for identify the option selected. + * + * @param string $id Id. + * + * @return void. + */ + public function setId(string $id) + { + $this->id = $id; + } + + + /** + * Get id + * + * @return string. + */ + public function getId() + { + return $this->id; + } + + + /** + * Set icon. Must be relative path. + * + * @param string $icon Icon. + * + * @return void. + */ + public function setIcon(string $icon) + { + $this->icon = $icon; + } + + + /** + * Get icon + * + * @return string. + */ + public function getIcon() + { + return $this->icon; + } + + + /** + * Set class. + * + * @param string $class Class. + * + * @return void. + */ + public function setClass(string $class) + { + $this->class = $class; + } + + + /** + * Get class + * + * @return string. + */ + public function getClass() + { + return $this->class; + } + + + /** + * Set submenu. Array with options under this selection. + * + * @param array $submenu Submenu. + * + * @return void. + */ + public function setSubmenu(array $submenu) + { + $this->submenu = $submenu; + } + + + /** + * Get Submenu + * + * @return array. + */ + public function getSubmenu() + { + return $this->submenu; + } + + + /** + * Set ACLs. Attach only allowed ACLs in an array. + * + * @param array $acl ACL. + * + * @return void. + */ + public function setACL(array $acl) + { + $this->acl = $acl; + } + + + /** + * Get ACLs + * + * @return array. + */ + public function getACL() + { + return $this->acl; + } + + + /** + * Set activation token. + * + * @param array $activationToken ACL. + * + * @return void. + */ + public function setActivationToken(array $activationToken) + { + $this->activationToken = $activationToken; + } + + + /** + * Get activation token. + * + * @return array. + */ + public function getActivationToken() + { + return $this->activationToken; + } + + + /** + * Set refr + * + * @param integer $refr Refr. + * + * @return void. + */ + public function setRefr(int $refr) + { + $this->refr = $refr; + } + + + /** + * Get Refr + * + * @return integer. + */ + public function getRefr() + { + return $this->refr; + } + + + /** + * Set display. The item will be exists if this value is true. + * + * @param boolean $display Display. + * + * @return void. + */ + public function setDisplay(bool $display) + { + $this->display = $display; + } + + + /** + * Get Display + * + * @return boolean. + */ + public function getDisplay() + { + return $this->display; + } + + + /** + * Set enabled + * + * @param boolean $enabled Enabled. + * + * @return void. + */ + public function setEnabled(bool $enabled) + { + $this->enabled = $enabled; + } + + + /** + * Get enabled + * + * @return boolean. + */ + public function getEnabled() + { + return $this->enabled; + } + + + /** + * Returns true if this object have submenu. + * + * @return boolean. + */ + public function hasSubmenu() + { + return empty($this->getSubmenu()) === false; + } + + + /** + * Returns true if this object can be displayed. + * + * @return boolean. + */ + public function canBeDisplayed() + { + // Global config. + global $config; + $response = true; + + if ($this->getDisplay() === false) { + // Display value is false. + $response = false; + } else if (empty($this->getACL()) === false) { + // Check all the ACLs. + $acls = $this->getACL(); + foreach ($acls as $acl) { + $response = check_acl($config['id_user'], 0, $acl); + // In false case, end the check. + if ($response === false) { + break; + } + } + } + + return $response; + } + + +} diff --git a/pandora_console/include/functions_menu.php b/pandora_console/include/functions_menu.php index 8b1f1deaae..5ac1239d9f 100644 --- a/pandora_console/include/functions_menu.php +++ b/pandora_console/include/functions_menu.php @@ -53,12 +53,12 @@ function menu_print_menu(&$menu) $sec = (string) get_parameter('sec'); $sec2 = (string) get_parameter('sec2'); - if ($sec2 == 'operation/agentes/ver_agente') { + if ($sec2 === 'operation/agentes/ver_agente') { $sec2 = 'godmode/agentes/configurar_agente'; - } else if ($sec2 == 'godmode/servers/discovery') { + } else if ($sec2 === 'godmode/servers/discovery') { $wiz = (string) get_parameter('wiz'); $sec2 = 'godmode/servers/discovery&wiz='.$wiz; - } else if ($sec2 == 'godmode/groups/group_list') { + } else if ($sec2 === 'godmode/groups/group_list') { $tab = (string) get_parameter('tab'); if ($tab === 'credbox') { $sec2 = 'godmode/groups/group_list&tab='.$tab; @@ -70,58 +70,39 @@ function menu_print_menu(&$menu) $menu_selected = false; $allsec2 = explode('sec2=', $_SERVER['REQUEST_URI']); - if (isset($allsec2[1])) { + if (isset($allsec2[1]) === true) { $allsec2 = $allsec2[1]; } else { $allsec2 = $sec2; } // Open list of menu. - echo ''; + echo ''; // Use $config because a global var is required because normal // and godmode menu are painted separately. - if (!isset($config['count_main_menu'])) { + if (isset($config['count_main_menu']) === false) { $config['count_main_menu'] = 0; } foreach ($menu as $mainsec => $main) { - $extensionInMenuParameter = (string) get_parameter('extension_in_menu', ''); + $extensionInMenuParameter = (string) get_parameter('extension_in_menu'); $showSubsection = true; - if ($extensionInMenuParameter != '') { - if ($extensionInMenuParameter == $mainsec) { - $showSubsection = true; - } else { - $showSubsection = false; - } + if (empty($extensionInMenuParameter) === false) { + $showSubsection = ($extensionInMenuParameter === $mainsec); } - if ($mainsec == 'class') { + if ($mainsec === 'class') { continue; } - // ~ if (enterprise_hook ('enterprise_acl', array ($config['id_user'], $mainsec)) == false) - // ~ continue; - if (! isset($main['id'])) { - $id = 'menu_'.(++$idcounter); - } else { - $id = $main['id']; - } - + $id = (isset($main['id']) === false) ? 'menu_'.(++$idcounter) : $main['id']; $submenu = false; - - if ($menuTypeClass === 'classic') { - $classes = [ - 'menu_icon', - 'no_hidden_menu', - ]; - } else { - $classes = [ - 'menu_icon', - 'menu_icon_collapsed', - ]; - } + $classes = [ + 'menu_icon', + ($menuTypeClass === 'classic') ? 'no_hidden_menu' : 'menu_icon_collapsed', + ]; if (isset($main['sub']) === true) { $classes[] = ''; @@ -132,11 +113,11 @@ function menu_print_menu(&$menu) $main['refr'] = 0; } - if (($sec == $mainsec) && ($showSubsection)) { + if (($sec === $mainsec) && ((bool) $showSubsection === true)) { $classes[] = ''; } else { $classes[] = ''; - if ($extensionInMenuParameter == $mainsec) { + if ($extensionInMenuParameter === $mainsec) { $classes[] = ''; } } diff --git a/pandora_console/include/styles/nMenu.css b/pandora_console/include/styles/nMenu.css new file mode 100644 index 0000000000..99a9ae70b1 --- /dev/null +++ b/pandora_console/include/styles/nMenu.css @@ -0,0 +1,6 @@ +.operation li, +.godmode li { + display: flex; + justify-content: flex-start; + align-items: center; +} diff --git a/pandora_console/operation/menu.php b/pandora_console/operation/menu.php index fb303dd3fa..03c073fa23 100644 --- a/pandora_console/operation/menu.php +++ b/pandora_console/operation/menu.php @@ -19,12 +19,122 @@ use PandoraFMS\Dashboard\Manager; require_once 'include/functions_menu.php'; require_once $config['homedir'].'/include/functions_visual_map.php'; +require_once 'include/class/MenuItem.class.php'; enterprise_include('operation/menu.php'); $menu_operation = []; $menu_operation['class'] = 'operation'; +$menuOperation = []; + +$subMenuMonitoring = []; + + +$subMenuMonitoringViews = []; + +// L0. Monitoring. +$menuOperation['monitoring'] = new MenuItem(__('Monitoring')); +$menuOperation['monitoring']->setIcon('icon'); +$menuOperation['monitoring']->setClass('menu'); +$menuOperation['monitoring']->setACL(['AR']); +$monitoringItems = []; + +// L1. Views. +$monitoringItems['views'] = new MenuItem(__('Views')); +$monitoringItems['views']->setIcon('icono'); +$monitoringItems['views']->setClass('submenu'); +$monitoringViewsItems = []; + +// L2. Tactical view. +$monitoringViewsItems['tacticalView'] = new MenuItem(__('Tactical view')); +$monitoringViewsItems['tacticalView']->setSec('view'); +$monitoringViewsItems['tacticalView']->setSec2('operation/agentes/tactical'); +$monitoringViewsItems['tacticalView']->setClass('submenu'); + +// L2. Group View. +$monitoringViewsItems['groupView'] = new MenuItem(__('Group view')); +$monitoringViewsItems['groupView']->setSec('view'); +$monitoringViewsItems['groupView']->setSec2('operation/agentes/group_view'); +$monitoringViewsItems['groupView']->setClass('submenu'); + +// L2. Tree View. +$monitoringViewsItems['treeView'] = new MenuItem(__('Tree view')); +$monitoringViewsItems['treeView']->setSec('view'); +$monitoringViewsItems['treeView']->setSec2('operation/tree'); +$monitoringViewsItems['treeView']->setClass('submenu'); + +// L2. Monitor detail. +$monitoringViewsItems['monitorDetail'] = new MenuItem(__('Monitor detail')); +$monitoringViewsItems['monitorDetail']->setSec('view'); +$monitoringViewsItems['monitorDetail']->setSec2('operation/agentes/status_monitor'); +$monitoringViewsItems['monitorDetail']->setClass('submenu'); + +// L2. Interface view. +$monitoringViewsItems['interfaceView'] = new MenuItem(__('Interface View')); +$monitoringViewsItems['interfaceView']->setSec('view'); +$monitoringViewsItems['interfaceView']->setSec2('operation/agentes/interface_view'); +$monitoringViewsItems['interfaceView']->setClass('submenu'); + +// L2. Enterprise Tag view. +$idTagView = 'tagView'; +$monitoringViewsItems[$idTagView] = enterprise_hook('tag_view_submenu', $idTagView); + +// L2. Alert detail view. +$monitoringViewsItems['alertDetail'] = new MenuItem(__('Alert Detail')); +$monitoringViewsItems['alertDetail']->setSec('view'); +$monitoringViewsItems['alertDetail']->setSec2('operation/agentes/alerts_status'); +$monitoringViewsItems['alertDetail']->setClass('submenu'); + +// L2. Heatmap view. +$monitoringViewsItems['heatmapView'] = new MenuItem(__('Heatmap view')); +$monitoringViewsItems['heatmapView']->setSec('view'); +$monitoringViewsItems['heatmapView']->setSec2('operation/heatmap'); +$monitoringViewsItems['heatmapView']->setClass('submenu'); + +$monitoringItems['views']->setSubmenu($monitoringViewsItems); + +// L1. Inventory. +$monitoringItems['inventory'] = new MenuItem(__('Inventory')); +$monitoringItems['inventory']->setSec('estado'); +$monitoringItems['inventory']->setSec2('enterprise/operation/inventory/inventory'); +$monitoringItems['inventory']->setClass('submenu'); + +// L1. Network. +$monitoringItems['network'] = new MenuItem(); +$monitoringItems['network']->setDisplay((bool) $config['activate_netflow'] === true); +$monitoringItems['network']->setText(__('Network')); + +// L2. Netflow explorer. +$monitoringNetworkItems['netflowExplorer'] = new MenuItem(); +$monitoringNetworkItems['netflowExplorer']->setText(__('Netflow Explorer')); +$monitoringNetworkItems['netflowExplorer']->setSec('network_traffic'); +$monitoringNetworkItems['netflowExplorer']->setSec2('operation/netflow/netflow_explorer'); + +// L2. Netflow Live view. +$monitoringNetworkItems['netflowLiveView'] = new MenuItem(); +$monitoringNetworkItems['netflowLiveView']->setText(__('Netflow Live View')); +$monitoringNetworkItems['netflowLiveView']->setSec('network_traffic'); +$monitoringNetworkItems['netflowLiveView']->setSec2('operation/netflow/nf_live_view'); + +// L2. Network usage map. +$monitoringNetworkItems['networkUsageMap'] = new MenuItem(); +$monitoringNetworkItems['networkUsageMap']->setText(__('Network usage map')); +$monitoringNetworkItems['networkUsageMap']->setSec('network_traffic'); +$monitoringNetworkItems['networkUsageMap']->setSec2('operation/network/network_usage_map'); + +$monitoringItems['network']->setSubmenu($monitoringNetworkItems); + +$menuOperation['monitoring']->setSubmenu($monitoringItems); + +// L0. Topology Maps. +$menuOperation['topologyMaps'] = new MenuItem(__('Topology Maps')); +$menuOperation['topologyMaps']->setIcon('icon'); +$menuOperation['topologyMaps']->setClass('menu'); + +$menuOperation['topologyMaps']->setSubmenu($topologyMapsItems); + + $access_console_node = !is_reporting_console_node(); if ($access_console_node === true) { // Agent read, Server read. @@ -74,8 +184,8 @@ if ($access_console_node === true) { $sub['view']['sub2'] = $sub2; enterprise_hook('inventory_menu'); - - if ($config['activate_netflow']) { + /* + if ($config['activate_netflow']) { $sub['network_traffic'] = [ 'text' => __('Network'), 'id' => 'Network', @@ -112,8 +222,8 @@ if ($access_console_node === true) { ); $sub['network_traffic']['sub2'] = $netflow_sub; - } - + } + */ if ($config['log_collector'] == 1) { enterprise_hook('log_collector_menu'); } From bf6ec7e99c9945f9a629a53d12741cc639ff817c Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Thu, 20 Oct 2022 10:37:58 +0200 Subject: [PATCH 002/474] Added new fonts --- pandora_console/include/fonts/Pandora-Bold.woff | Bin 0 -> 39276 bytes .../include/fonts/Pandora-Light.woff | Bin 0 -> 54820 bytes .../include/fonts/Pandora-Regular.woff | Bin 0 -> 34716 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 pandora_console/include/fonts/Pandora-Bold.woff create mode 100644 pandora_console/include/fonts/Pandora-Light.woff create mode 100644 pandora_console/include/fonts/Pandora-Regular.woff diff --git a/pandora_console/include/fonts/Pandora-Bold.woff b/pandora_console/include/fonts/Pandora-Bold.woff new file mode 100644 index 0000000000000000000000000000000000000000..25ab32f58d51c00be1a4bdab7e462c2d2945a81b GIT binary patch literal 39276 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 ~Mx~2AB?j+L z6GhGtkeE3xyaz(kaJq)V2}k}*L4NH3dyi3 zr%^^3;r1+X@xpOVSs6APN?Rnh*-jj}c}va?$7XA{=rkT2m1x}E8=>DW;b&<~Ik=D5 zb&=)LUGmS~n+j@K2?|34Y^2obX{}@wggtFuzE@tMeN^uckPRYd%lpXaC!B4@tATRFf>J4nN5%;8LeE7k(f zeIA-OKc6@M8xaxjMD+dVw&)XwASB_*o16=qyjVR94z2I7@`pfFhrTp2 zOXoIcyJ=#vAjeSDJ~R}n0zyD`^6F~YY9Y0$8E0cIa;8YHTs|FxGg&F1NXfniF_?? zCsb1=VdQxNOc)rh17s09}p`tv)444v_@V9@} zFdGMlBb1#@uENn`0+yKt2Hq*Q$PNde&=JbCAUk3c-wwMY70tLWlE@pf|H7!=umw3k zLywP-#^$iIn_eSUT`QLB?sh=IDVp6<)tekBA(bVMTggnRPOGhkk!B+ovs~;79psah z9J5x&=KEpj85x-90^b!uSCfB>Q%=#0zL{VkdxZom{!Bf%U)6B$WtCQ0Tt8_f&z7c! zF<~m2NvSE_Q~vsT(ED23^*0 z{?>jb5{A~L!_ZtdQR3`>R)&myD@IA&UrrU@C{B|!DorxXfPrlQ?}ZZ&&_*@v6rR|9 zS~)e^UqD5fj~^K;hK5$s#LJTXHH5+BWQ1kk0kaQHi=|@8@hsSQX6$6 zDKq8z?B~kxS>}y9dEGtH?WUbGfLtSqHVth>U9QQkpu2&$f(Bu09Y?6&@bu#N#GA40 zeSMU@75uEUKJUWBY`vP){zh)9_UdBi>l^@)RtOdo@^aZhHX0bK>x?Lvni?w$kgdZo7L{#BXb6XffzF3AuLS{`LP1cOGV6D(3E zibMK1Okcw%RU;}sdufpHH_=+}RbgGPtlMmbD1A+eLZ!QH&m(UthqFldYUsRYONlyJ zDb1HjMCybwJVVDx$D-)%_VpULxB1%RYM=O4s)(pGXIrFbn}Mi1>ig(l#7YzS2q$f5 zz8jPuRVR$GlyZ2II(+N~FIDQaNCTs0NeWo8>fqkul@W-vz_~#2Tg3NN*`OlpWqO^C zr)g0vN}9z!n+IxL?GQZzt!RnU!``mC@6Ad*|G*wwN)4)uTmGy zEDwuPPpqs@NW#L%TnC1hQ27FgFHI-8>C4Se?z*26zl)#EnDQBq4JhaA=%*4)>6x;ni5khs{|t((iSQT`huptM zK%d7$R5I45s8q22#qlll^{W0wNv2p4jTst7E0dQAPEqwsmA>AZ9E2Dv4&f|whHG1x zb8c8eU*p%comBlRo8X7Irx@2!tPAb_NL>tU4Nq8n=+3uVh-YOLwZ56m3I;zLd!I3R z7}wS3;R^;2!8qJHFXZs6H~veQ`?Cra3ILqKa@uKwb{gL$wZWWgm2M3sq~%4f>Jat*Rq?}YDg{=1|2MXbET=k zK$mjGrWt*P;D%(4Bi4}I#}d>_gaa{)s+)@e174kC$6EBR2M4Q%A;%4Q(Z)>sTDOZE z{(ie<6zaNF;GtcyAcQ^YK37Am(agV&m8~AhSW?!oviJE39UE|rajsl3;W8CeHw!zT zF&^Q2bIO|e~ zS86Rf4sjF)#4e3O;x@kR@&I%Vc3-AcOXrVq&Ix3l2uWOugx`eUh+hm(t7Lu_yRlf7 zEXRD`E!mQ25JRmT3`H~Y)-KZM)k*9U3iV6SlzGn?4}!S@0LU$ZL~3esDgC@XGvs6! zrlKxGoi~S?~r5H@)Vgkf_JzpK7Q z?Zvtit!iDLFyb}#N)XWC)#}7b4PKBj!{IIZ*AEL1FLN(WKDLXnp>6p?-+;h>?%uC& zysvM9hq84$-m8`q!#wJVEANbNe-Hmr z=$=O$?$Gk9Im&wBKDtvL1*yiM|9Y1<{$Dh1)9*LYksow`T$bw+D1rcjjcj11xlQ$YLo)ZZqjIwv-m{Kx7Md3Y?1z0tcB^ z?ORKa;_wsZz;RHf$qJ^tJ9M017>6066ccry$jZrmSXI(E{_w65S75nsMCC*nh*1}DaDI(ez&Od^Jy*>rE* zJDD5zj#t}q&%a&yKp%-y-SGda+#lh5>-zaykYIXWz!mb^*1;18Z)K2TDXm6T{@(7v z9HHqS8XMXazjJF-^Y1#3&pgfunda$L82OR9FPUamJ8~u^VPiez=ft9tWL&3PZ(nYg z=q36xd2@S=DspCFvW2iPzaP~dJOhOLLqK2 zVVkP1zD}MfDyCT7dyha%?#pO0J*GLwB{4E|GuTNHP)ubjY8s=CnwRcpMFtsjmO=$P zysZz}&{2c`>awx5f8A&dP>?g9eIehnPkJ%kYZ7Oa#CwQRoV?j3ja82}>BlwE2VU<7 zP+moG`UE~ts}F!YdhFe>4)r-)a^8f!pwB^FX?D6g>ffrC-5v#kvG5)pP(@8V=nKRv z`Z7GsJ~z`W{2VA&e~}zeQOGq-B7dP0N>L}*^wv0fkjSqUQRMc6l`r-dlYhg`e6SwD ziG8NiL*7N-iW{jQiSEQpCTNXQ&{2+X2WC;pq%pRKBDFtbsEa&(2Bm?%vye)WV^kDY zM_HFUzPS`pQI4R|V}yrC4y9ny!`xZ;ObV5j|CyejBlBP=9`eCJjP(Jw*DX0AJ3W*H zM*MrMh`z6`u&tQh{4EBaGjE%*p|aGp2lfC-2lRIvV!XV(tG z677EZRubH`S|&JQY2MKrTY4vto_--wq zAsf5lUqH^mLs$iaQ3uT{`g7DrAB_ghWlp2;-nntQOiI?y*|{ZewSd_E7O`$y2M6aN z3!`VaqsC>eynGJa?*3KsAV}d@Ih!Eu&N$YCC+tORvhg0eu)%g789x};%xvpd!xpf5 zL0C9?%p`ZF7gcx$U9h?Welt4hLyZ1!mzPBZk|!DAw6VtZuKfa)Y)RY|m*WC&oE>;8 z6Y=cmV=LRLzpo%I>jT+TG{!!EE1fo^IHun-`FzR9(4TWcQhO!I9FSm5`akK8C{(W$ zb_ZCe`Sa?*pOKao6dqoG+oN3<4+f1$+@M}^+$$L}@5tAe>9>09{ZhqD)(bLh$71xg zIv%jCEzABXX+>esu=93(e(J(vR4*TD&eJp{)go9nTOI_yr@n$uz_z}FWKrIs5eV)L zV#6_xN$usXBC-0NV&z`~q=)G-@CeUuHWD_%Z*Er+2k*}^L2fDX)M{uWwih-k6gfd{ zWW(-(jZC#Wvb_5&ya97%{uVZJp|BXcU|FijS5CE_!N7!lmIgs+<`K1v)1dyJjLw&C2 zl+cwzjqRoA%VJ<(gtO^oxMKTJYJzt*M}Z_y8Fx-Q4Qsl4U1$VTPoC331<}Jjjvs(mtIM zXxr-Ys+%3Xm24l`FM1_cVUWR{Vw^L6Ypa*xX6o9=r10N;;2jGs^i1%fUwq+}V9~?r zH_z;HD)<3hZ9u6~XHE&Y{<0jOU@F407+&ZLMbbXubK-FF-BP2>uLxuNw5Z0>R0xPc zBVWL?OiHG2J9WpwO8uA+I$3~OeuyRVsj`mcUc>}tQR973A7vW4!(w1r^*ggvXrjB0 zrP&Ved1d&-iE<%Z9kxXS=ZRUQ$xn#n4LuN3(WLtJ^481to1LxB6wbCzMvt|qO>|<| zyGdvmQ$yNGLW?|AAyS5(GM+);pb!<+D_a0(EyQ}^!8+9h; zZO#v4UCAp-A=&9HE)hTAW#}fkR4_T2z=L8~*%lItQ4%>U_4}!Y=uhM{gLR3E!=k79 zV1qG_bx1y@>Fa=upT*&a^gQ_$ss zsokkVi|h9+1zedVMahMQ*+w~Oz)iXX8=QLnSe{AqGr`<^tWGZfL|oJ168&j^zl{GUp(p2d|Pmo;SEngk)+NQ+nihVQ!2fBfd2wINs2|CA@R&bDKgKuv+Fk*Q(f!t zqOMvp;=0CwrR9W)2QSUOPEYVqI=Tz>cR~Vjo)x6ec3Y3`DY5#CO0{|frrh6!Z3;d| zB>4?1lBno`M^d7W+dLL=i(ByP;T#ty2X}=L_%Brg!E#143R0H>*X?Ma*YV>_sx*4n zDQ?GU2gfNg*GVq)kM97v8Tk{Fo^m;^^`%*Z8ug{Jw^jJ9{4RdQPoop;ef*pc__V_i zr)oUX+gbHbqc4c`*K%iIn%GUr3D)M~bP(lCi!Dl@MlDiXUp&=G8$#1d5=&0@8yS;xsv zF^_`%VKe387)R=AhQObf$r$h{LNnBA#ol^PTdD)?sYdDdXNmC-39)(BWTG0kdFyMt z*}ZKPS*Q+PnSgvcy(xDFOnn)kv)xHEh#Y#(LC2sB>dGn!D|q@=fXgr zVjNe2UgZ-NT_9@OYa12Ff)$s45dOF!(^AvIO?QGxt!GaC9c~wfyhdr?HT-w(?N4Uv z@n!nN;Xx_9KWvUtWll@YPJdJq6=Ek73j`Ar1q%|x3kQS>3x)c95ii}?{Lat5}y)z4v<-_aab7UWd3bHoprL_MP_4IXSTPx>$6p*RX zP(k}PG(p(L@x;Y6l|_$H(&oiUc7YC`Fc5vcw<-Hso>sS{)7cp_f)Wp99x~mg zh_WqYo=wx)2J9gTzQOzH$N#Fkg|3M6tdD=41X7XJELC)mHXZ(ZlgUw&wsb+Y0rQtr z8$=zAnip32NdPSPenP~@CVmB#G3jXYUwT*pJ6|etSjVXcgPvIJHyg6_ltg%xlvp)G zSPXh{cwfOz^?PfBKjygf;RkLc#7N~=x`}}3?_w=M z8!kJ!V0<$qD#;7c&h-_L7@z50c2okVI*-C#xkDHOaN5RjFJ!*KvpkXBRnir9HZ!;< z7SOOT(3Ynfb{a$+nOZ^pU;|n>TzSdd41IboSnGm=-HkjponVrqgsiYaix$tQVcKJn zlpQL6swWsKv-EKZ&u5`XCZpOZV(-k$Xu*O$g7vBFEBRcCba6|fub!cyviJu$dNJ4b zWwRSB^rbA2GEP<>poV?9@n^afWS=oTmZ2NkwY`Y2r`e~dENs>|OZ>pJgxE8iE&>tx zeZG7(T#hEc?zX}Y$Z`jx>2LMtI-$w=D&Z+xY>mBJ?8SN1YO83}dhuy)JS1+L4 zI~MQg+8$h7f4;dCfB*jQ(6NgTsWyvy6YBuEK7K6!72U(&^PXFL5xk?HuIzq+)XCbp z5An1CuLo$=S0{K{=FMSb-~@#e2JBk(EvJ{*Z&JSu^xN7zX%FvYg)g z2#}G+=xD#^^8a;`*bf^76GiQr?#qJ+2Q5kPaJc z;F*wmH{To50KAD%DP@R2(ZYVORDZgV2%(V%tT?qdBH<~-*LZo>UG^<+*W-8;ddap< zT|ao#zWt)0Arlh!xH|^!8CGAF;lS{AP}oNR;Ym%acMj%Ukp_q4Sj1u;f@bHu2L))6 zc*|k+isxS2rSyGR*xyBUl`0)QbyfaD;5Camuk*`nQro?!+0LU7mN+ytD{Q ztOXUm+y-rp`;dghY?iG0BV2@88FUmaeFsuJ0qk(u5d4SFXizW|_RE zL&lyW1xeP1({r-xUk7WiV=d-@NMA#w69h%RT;4m4L}5$+h-l+hZyxx2JX}s;p0uGv z#Kp5L_}Z_36nG#C__#(? z>g{xYjb(td%-OYzQ?TwQ&)Vpy2ze$VA$i%5i&`>tb{ecJFnG_t->&YTjtwuGo`0wA z?-mdE+*0t-3Sj21HupRxNl;1>(Q{Xu2hB`yI@I z=44v{p%$Vu`t%eWoHx|+qXTk+PQ$(eu&NKU?Yz;TJ?tZFaswgw@~spF=fgOz=gv;c z)gbt?-1}9baMw2h$1{dU;iQ~_Hk~eP@{-@F7FW}R?u7sq);lzHamnEI6HdbDP!)!O zeRLqTD2_o6oY2KW`l>Xe^#}i__s4Kg{-(tFFFg^E*}bP%@LDa8FB0|RkUrp!`K+IN z)sXp$xtj2=HU9ZPyRIc?{goi$YnZpw_i|lV%dO4+dK!5fy^m8Ms9A{M+{NVy^oBHO zg8)$wqJ=Lf-SvQrH$T+ls}@`U%&X@W%P{PtcCOmr*Cc_o(=I$UCLyj_W#ivodOKkWSi+D9u8FnUNGdJ8KLf))NL!Pyp$K8iJPgV<) zv~S{^`e@qb&FiuA8ECeWTJckcNyA#KqNkf>?8Y)NvdSc7Y}&VkmGcTf0TsimNoCq-B%dPLDe)RCzn6% z?WGl+qNAhY!Ee#VMy35~1A9v2xj4jXk?YJmea$i{7@w7U;7#PQvlH(@by8jRafA)@ zBg5t6zq9rr%*8P<-s!O>0(P7o#6V)W%$5g;B`RU2*!o; zyWyC(0I(Y!&RnA2OvtQJmLbu&o%jyW?Sekqv)gWr`hC82FY9kZ+7kM`%!$v+S+OwD z=Zad2&+yLQcN6pqJmF_j`g6+@uiO=;#)HVm#$7>&sO9RBHCvMoB4{H8Y!+aOMcIOWxvwm5 z4Wm9xCz&?*)8IIUef{-==7hPhp3aOexIA*-?s^^VxF*Q#pxk?1kNKNYtnEkW$meZe z>v=2Wd{P5tN8CEIK8G#EcYqYU^OQJn0c0~*;Kac>4Gz*gR=}{tyy^`3CB}gKam)k$ zpxny@KBx@1H03w%DJ5e%r;Z4ym3pFyxFh$`3Qbp6BsYtTka~iB!m9&8bTNqHX(yg@uECCh*%zdHq+0+o2}_vUAbF_Gmm&4&v{4ry)*2ElI=mg z`P-ioly}))@tX2-8*%|t|29O76+ll-^onjRh#!mn$n3etD2HtpyI3(I(Gcwyer*09 z0AfI$zk2(he7*XT;q^3UVj1~GZmBUS9l4^HYJw>{a?SqTvGZt|5PMpp_ew6UF$jw$ z_X3YY_T|4$qw}% zc_*<;eyI1-C5F_pzaY3D!zQPP9AY&UqY%3bJ{R+XpU=E~_?;tUL8zW-ux9igA}bcO zUAlDS9kLdwdt(m$_3+_dhO5hlZbt8uC?-9T7|Q=2EzCx1PI-Pp@%{ZnCtQ`2tJ&sJw@t3K^B3G2OZuCRKEZ3A-0f5I?h0?8T$zsWU#C2}fzqv9wX?Auun}ls zK}t%2kspr{kB6Kwl(FTiem1w$C$DTEKfosaB07Uj^% zD2F~VauwOw7h0>5BEzEaKxPj8(TjlS2DJ&JZ`_z(-R>F^hl}?>x$y~B;_)R?Y&<8( zas?zTaIdTLmxhL3@}51UspWfhlVD7@H0BZpgJ|C`jj_RB#sx%3{fQXnbFK#bxcU>c zo&v2i5)HF)fB#;c5%}rKbw)y=hp+wqZ`2u?sLTQ%mx_jMuG;St#t!F?i5-SR8*cw^ z#SS-37CQ`q0kr2ojvWqOF?JXYUDOXYY3y*v_}F16EJl0(H)4nIuU`~9454`Z$FW1j zm12iK!XT{rrLn`uCyX89*UzD!^A~x`3TF-zS-~%}VfDWmJN)=6vBMvs2L}Gl*kRw~ zu|o`e8-~k2Ct4l z052=k0^IS#A7L@Z>wh7B__u419}*l^b8>Q3V{39b@t;sk{_oTfs{tLH5X5tt=;5PB zbXF>x(Sbi zoNwVhYh!A!eWNy-G-;uYf%Ul+eGAI->jRsEko#+CcE-DOa#3nE84J3LDx1-_$f$H6pBRm9X_P6u zqpq@RUTv(8JdTXth6$q*7(F7SZp(u+JQOp#Q&Wqw6k$Oc$xLKnFM)5pGP6`z=Oc2} zT~252fZOq!6+?Z+d|lsBZgZFQTlmPcJ;*)it1wj?rjhqHza}wPuaR zOkDj;5pxIgv%tc|jKas&@+F^kc4b@CSSGbo)n+XLAcJ0Zmo;Zfoez9U0BLxaMQEXn5bt>$MGViT!Lf*PeM&5Kl`l;Ffq`goE8QKz*1OIVrFF$5^H!F_|NK&)iB551hyN4h>Sa26U>RY zr^dnqla~?^FOb}c<;ZBn@^lx;uv>Y?#&*N|(h8awwbraX~Rjc5> zj+p$i)|RsP6#q8%5=PUgQXjuZhlQ|P5~AK*o03v%q%^9)G>SvJ-8Fr=lD>pc5a%D< z+|?dnkq4k1ooL?8&}bBsvL;Lhrb|7hi^?S-d{u+d)4(3b8*~}7K^mK&j_;b8nxF4e z=Vu6sk{Ye{lDy(#*c%cdk&A^>qN+{#Il7ReO_-v9OTTPl7lILSIuWpR3bjx7x*QF& z_d(+aA8`B@gL!!lZb$3(l6s<~7(H$d!i7Z{oeMi>&Fo&(mw|@gc!Ry~(@&xC4N@N& z!`_AOAtxX3_MATVMFyl`F9>DVt+~!OJ!k2vu=?;-`BPH-!SK*S{}5?=&AnBf zvt|dZ@w3^JttwSxV`FRmKyToxVyUGdPGt*?2yH8#xhSxAQBX^|N}Zalh*Aqh5gkRv zi-I`6RHXAKl!)a>K(l$JoX-JlVSJ@oKX>U$pK*UdfvhY~Zjj3jD{Ge5)MTUsT1tGFgP;mPMg9I zo4o?E=0bsOrDWBuoEl!0 zI{&&Gde`jw<6ZUa+quoTIW0M8%|K*(gFNxN*7i*gZFtD@xoen)NbcT?3;4&bA^An= z9{;qGB5@RZ3)->lb@oY*=dC4SydwY2=dCIKhn}}4#W+M<{dsHra-B$?x3<_Xq9Ubv z)9$`S2Ohq6E{Jm)r)L|IMg5X_4RReJ&7B8+eG+bJ$;dF8(n%jDoZrA^_wxY8oT5IF zUYVX&okm|1E7Q^{(_kZg<8<JC}rN-Rl8t8ZCBx(;H8n(mV!bnDP`}_R)~+otTv=$4 zY3y~==vfg4Y4JS9d(|;_ZBeoOO;pA_J1cBi%iJZfIw@Y89QoLODBYr?Rm@*^4OoVlUCh14k5s}qwt3d)Xl zDiS*tBQ**3hT6VPca3u8tm)MWsk3YQdTJsJCcQj9!m6GnvPH}J8s+5qoWsc9t7f*p zN6l>VJd-3eZL*rtj)`kVCox7OnxJmni&v-{m&B;>JxTQ3diZF*1F3!B!(ac|RsDc{ znqI+kuJQ+W(#i;Q&Zar*F@IjeIn_HSKBp>IO?FPzj}bY4KuOpp7hvrh$;2^cQum0r zXe?t4m@qC0$KwQ&oiBD|<4@G%3nXI2Hc5miHa4NVw5zPtYSETi%vx<%8RlG-%4YpB zAtojv=HBq0WMx3PD%f<8$qO_FqWm6TYlMeLnjC0Z@H(r6x(MDj&flce~Ke94sTbfZ8OY(g> zWHG_WK=OTpkSpP*9g&0|K9?{VgQb?O;$Vo@M!IH#Kbr+!WXnI|FzfjesA)c z-d|n4rZ?H+Dp58Zbd3RJle5mCq)~$9_Gf%J&W^GyoO3AeeNih;z&^tz>PP*_12-GLfKg{{0A zbXr4g!XEA*CAlW)1x<6;apL+SYZG5X4PCK6I62(cv~|J`Y5lbIlMKt<7pd0}>`_DQ z%H92)tLU(4;tpy3v_DSP<7l5xQCixrM$5^nI8IF8>2x;!y z#P!{-Or7hzOW@oyF_paQNd0{ha=Gx~>QYF^?tY@$6j$MngI<*@c1(=Wn0glM`;*Ne z_gu3L@GbSEi?V^Mnxzj_hn_~}GOM-BjE3NRg~n`|X-Uzry>K4ilZxg3ZfZL-T3V37 zh3Euz-tp4n)&@4%1jO=A4W`8 zS9&fv7}MROZkUeWlZeR!WNiFnV)Yg?UcAHuw=Y?8dq(B*s;cGHk^o1oG)}E)4~dQr zf#+@?7`T1l=atpfE341v=AP6^bfGgA$GQBVPUdMY|CUtjc)Dbc6rFmJTWexa6!RPO zC5?G-92kUXB$+T`3^s9%v4*55b)rDzFH@t3Vzs83w&-cbm7aM zf-Of8A1(c_c!k!lvp^MNYSUs-(kZ?;;Ppn$R+V;rNKaH{~1II{=wBjVj^5eQ2eYeZxck8+ikOE+3dntve^|y2yR_i zTDq|GAlcr=@;c`NbkMr{lh@pbj`YMa)%C}f(&u>L2k3V_FTz#N=wwU14H6bMCh0OL+etp1`P_9sk>seDZ0XR zQ*49~>-_%%qtHRg004NLrB%Ii8$}d@LmF5D6;34C=@ekbA2^MmNHTOV zv$|VJJ6YY`?Cx2S8%k*CC}{Z~82AS$X{hOG7-lFbV20m5tt{Jdm~rrpPrrTd?c3kI zuO*^)lOHId+28wg8gW8f^lQW^HRzv+m*}nJqllMjGx;*&6}p@J9Puh`rp<^O^mh7L z#7$aFzm9l~Zl~Wze3Q1*KOM2&s9i@?h<(4ZrL1vZCr$w6_< zy62FUNVK>R$wdaV6H<69b2XOsxhMx>7P56^fa(o>RZF&Z4MLTqax8qtb zVy>?C-hMVxJ4edtA;`Mf*G&+t5Lkh?!|r+bJo^^hGojZUYwS5q&V3q^kVP9AS%zAe z00+xi2VeFUP^cQkeidd}hE>gp43aVILWd5}#j`%W4{6AQgx+zw`!OmDT>)1{W;%~XUc4!Ib#;4(LT_W z<6H0v{}u6BVSCtDkPf-HE0$;MJ6L*nkj!QlWy8MuysjWG*=xr90^?Skn3h@Q{0%;K zv*f+=*=V_m{8^_5KZ-W!#So~>n(LuZ1sme?<*qAtuO;utS}T9rd9tC7xx zD+hietpa6ZL|=)@mQH0g?wS^E7%OC+YmZ4O4PPsEEW-+?sEr#}w{UL(!xgpD)0rw9 zC|z%Kyhf6)&F58j*M<9#7L)%~)Bbo??pg#Xiun+#vhb!a{SHdjJ#vHVu6>UhN9cgr+6J6*=59VSX=3`~7f>p5^R>vAx z6Ki2@tb=v29@fVO*bp0GV{C#=u^BeU7T6M7VQXxIUTljDvdEzi{m5eg1r$-jcGw;} zU`OnPov{lBQN|D!U>GAe2!1&`oS zyo!_Y63)Oqcn#0td3N9#cCw4z?BQI_<9x2nRk$iwy)7dLPN zZpe+eF*o6++>D!Z3vS7+xHY$7FSlieS?1Wse&#vA0*fqhJ8sV%xFfE_owyoT;ji3@ zJL5K7jB9ZRF2JR@jJt48${Oo*xr9sUu|b~!n_R|_5o0DC<2WZc$>ltT z$MQHH&l7kePvXfug{Sf~p3XCPCePy8JcsAYhTrl#e$OBHBY)!0t%>huGMNRMgBe4u=Y~p(eWiZQL8F(4By*We!LVpp*6hz| z=ChiGjA6fF-f+Os#3`6Kg_35`JXbVviY9Kc&(Opxns`MMuV~^GO}t`h_HYsgO37yR z!`Xq1Vb(BbIA!lQ%o`3E77UAqCBq@Z1%|_hBPlBkgK^KP#;r<9n(d0ATdT*~SP8~` z?OrlzN+wOoq$!y+gN9{Oe%X{?HszO1`DIi7kdBwj<_$}&l^||dab4;CL-|zI^*pCC z8ceh-%8B9kwZ@@q)sm)i$d~(CY&Wz$r)5#LnD5i!2XeZ*f|+K)gfEyaE0`@Sm@O-q zEi0HUD-@^v2Mh~_s@-96CQTc8qpLV0WxX!gXQ<+h43CVYmOEk4>nDw{E$|&J#N&FU zJ+6n2UQ1PjBs7vcX8a;|LivVdU0)p`|K;=UJhU+M7;jJAN$0 z)~1(4f^BxtXjsxq*xaBZO={M0wM9-^K+ah>>M0Aenz5vuu&~Sd3cH@J5cF(?gPN>L z;RVvt5jhQaN@?|+NEP5LODsB*$n^dE4$J~l6DpmD@&{a{)jXEP1h1ey=5!Ztx zvV1iYd5y_xr=oUQ&1M)(OckFNiKpZa+1ZrRZMvG$yPB5hLS9L|wiP+uN>%rf($n?H zW?eKV<(^S-5|=vhwDVlEFyr1OSDcw>N}VxxI}^5NHRK(q^m(;J-Z+h5CT55E-%-l^ zY5Po!xyuqKl2e|Jl6L%x71fR0n3h%aNbHt39ew`v(oDdXg}qUf$%B%>emyxE52U$bbep` zi_DwW6Wc7c>An&>{R>;FVc9ZaVz=p56T9;leTrpWkPt>gM?Kyl{xo!1LTOcv3ag$) zVt3aQzh;F=!?P0U&@tVRP3@l((3;=7X1x0wAwO3hGl~ok} zzWZNBZ>fl6go;Egq+yv7wam1PEDeDGQBlb&h+=RtE|jI2IZxSSDpod`TH0)-4c3DV ztJQ-KtyZh7hw33Ka%>*#JLmryZe5yPcd_?5=ig_aea`vL-X9=k-4MV@I2qm113i(1UP%5|b9x7Zbxl}MW#saz zV0b##REHYsv9_i$ScQ#swKIa)6*6Dnh?VICG^HP&J? zc3>x7#$LRGcd;Lz;VT@&&-63EWTr8bXEB$22=%@$a}gq0x;yVW-#s+}&BiS8hKs&(lLaUGC`$Pgi<+nx|_# zy;=9a1Esu)^LaD(@DXm|0^Y){T!>cQ$~C-=xAP7@$3fi2M_HxQoz5E0;7rzX7O!C) z>ltDLXY*P%vWd;Sj@NSzZ{Urb%g4B#J9sDW;#%I#b$p!b`2=6%20qEB*uodMi@W(E zU*gN$$a{D%@8i>ahMV{-cPfJW`GDkue25Qovtll7e^~~h9r)}kob?yJ1|SDRFdP@- zGK|9IxB{bvsVh-{u_#0ligA??R*Eu|V>~8cqR=)8lQ9LAn2IVPZ#rr)1GT6}2o0Ex zFmA#vXu(5xSV(*XTd)4657SHB6igb_OPdc(NSb3#b z-s^B9mSdfKJcC{EG01s{;aHBxK`z3#h+`oqU@jNqJ6_0F5z8V@L=%_bdk#~tm=$Q| zQvAS+)Vqq4aEQzBBZWkka54^aIey{@^-4JfN4P>SZDo zlcUTO&`ur27|{M5<*R^B#nJi!ot2|36VM4d%31-PtD~$I;Dyr3+M9{0o6Sd`Mywp! z_sMr64q~oyR5K3YFpl7;GSW8@Hfi$Is{1X}Jr?V}N^~z}I{$KOmDJ{$`4OiD`^`j~ zp&i0Tloa)3=~=efnjZev4AbhN@f0r~N7}bpx!;XtG_P$|CcnE_$Zo$`M_*c*)de2h z9n#{;*hl(o^(>MtZnFPiqn6IJ{CCzV(&<83?w{C4pV>!PGpCo=j?6!w8{JE)>Ru+! z!3BEj1^>`bbdRRaWML473gLyyQ~%aybnpF?L$j5chABrD+j{%o{YPIZT`$($%W!4l z66M(%Wz_$3t>~*}C`-6^I!2kk5;M^#HgRIsjUGX!GDI65%2iorDOb!_{y)(%{4pB$ zr6s}Td#6XN?UO~TK8#l#V3(QQi5hQo&-tpPu4iknnle`>;S+)fa-PRB48K^&MO@4! zT*_r!&J|qARb1VPZ*(w*_2LRG?c89KVFaD{z(B>}G6KT|dU`xHMOnU&GJmS7L0Ttn z&{5q(s_QN7b^L&>-fgwpr9iwU*Y5F7dr(C8QNYz8CHj;zvjU?L}9HL)Bgm?2Lj?Z`I zV%FYNeTesLwRW+bY4teUe$KXCKih3P*|v*qd$wk0qC10KRKOOCJL<-q_Wvy+?`)D+ zK?;#6bWY$zR&bKI{S;R6YEBid{)&l)f6qlbP-#(`_#3x-rn`8Y<(&(BmBqE_XLdH5 zov;aE8}cGV#DJhk)zVg^3R>$MMWt4x^@(q*2#DaLr+RyOJf2>!?e*7RZ9P3oky46? z6s=l{R4GMDEr-M5P)jk57$8Orunl38WbS{~%(q`jHsRs9y}$d-Z}#_^Z_S!DYu2o_ z=CPGlN)@Tm>QWUt_qix+w+N@J-x0>B z-xJPIZ>zOxtlFghOP#3;bb%VDU)C?H@k-a!3r3su>w1;mpzA`B(D2YGy&*I)G&i&$ zR9_G+h!<28%nc6@e?Q#XYi^`8GOPF3dav!hJ{pM*k6sm>8GWVjlENzrzgBoh(X^sj zgl`vp-<}JvD0;Tf>#v zalAHu7I~0Q5aL(I?;v*x@tN@z$6SBRQo^gpyjeQDbn$@G2V6>+G~k*6-zxlC?2NLS z_{`$fWwm7|mX9t!ul#ENdu{o&^2ZC}<Wr#$t1hjYRCR6DLsd^yEvi~twSHh|V8y_zsum5rjeGlK>A)ujt{IrDF0DST z`mXA^)msL|2UQFjHRystj}DqQXz8GhgSHOZR&!#_I%>YqY}PBxW>rAFN7QpBq2DmA z+$~lmY6ZG`t)o{QzK<@vhvg2F?&*l&Z0O zH<_nXc(<5$OVnV#tx#|Ae4VKW^JXXz6O6WaDzs9z7F#ZG-T;K{q}mFu7m;=XFtl6^ zQE~Zd7hnCAJQq@iJ>**f{yX@($>mS$n@s8{+&@PSbImJio|&(nH_Oy~vt0em%u@@w ze}TAIou^(T*Cnb398XkB%~NWb`B(KS=eH>PD(JEX7=M6H>&zw%oBsrO?^Gnn_sk;Cz%J%{V-Xx%q(z6lCVhmLbNKh6DXDx^bZ zmmaEOdKhtpit3Y8sUAr@nfp>+n2B7oJ-9o)IvKr z^!B+`sB@^p>nP6+q`8grbiSNHe46+gX?DW5A(JH6B0Y@rNvfFKqWZ_?U2^IL{Urx- zDz@c;{#9_su~23(rL#El?Vg4XAff7t_hr=JJsFn=O~mX@^$ipeaYlyzR>w zhN59|jc1fKrf-Dex0o&ZR?gFi)A@EL?e;#iQO^R#!>R%doAnZ4yrDFdr;VoTo*3sz zso4iDLSP#P+ajIn*y&+QWRy9ueVG;aLs&1f` zZUWw|JiCqi>7<(hmUB#_dWbST0{qu#tskfns)6@Ap@D)nA-Hk~=UQrPDCc2jksfZ_ z1+*CnT`Zk$|QAf5O>v@e;Gab8?J!8L={xnkl4h#Gs+$ zwSB(rv{SNnWJ$Z{>LTd*7fRABZRlo720ewhQtiic@<^$z+<{{*Qcybp`)A45+u7EC7F6rB5z zqA?{wZOSSu$C2%0%{$1zq{#49lDdv|S_+(UD{F!1q;%9uWy@paXM39gmJVjW??sZp z>p-?9fmz2Ff3-OS)7X9unHd3Bjf}JqcB!FIvZ{WS#yiove6sYaI|CqGRz}QXPOH4wG z13YgN`O>TxnkKlqFZEpreoOcbrC`~fxUcWe3f0-*yjA44v?^Ln+`JAyC)Hr0ZBawu zfa9UY7*dZVTE0FTI-WysGTD3#HFi^;R?p{6lqn&y?{=b;4cPY)XInYX{e!~q%hc1- zyY8e{s*@h}MPMv}7hY1w(-zw4ZB|m|QfUv{Dc{F@*UUG&!E+CBFZT(~pKxw5Z>oLt zz^%mnTqn)r&|@j|n5)|9F*|5q#w@2j_0i8mqxrO(g>df@ICZ7yvrC{*f$yy&;1H9$ z2zOELB61h!t{-=`^qE36kq|{tZ3k3a2GtTG^@e!KH-=J-g`(qlZY9BFpj-=uER}AD zf{rp#C{qk&_IS!Hl-}Yw^P$iGSWl5Q^=rOcPW%mV1#uO5tO52qvo?cLdmN>RyNP>< zj#4pCsfAGL6(}_iN-cv@--S|3pwv&G)Cwpy4@%9GUg}P`h?>*0i1#CbW)tTiksmG^8w#|LE-5_T1a?UYA z$a_0!T{~%&cCr^-5^&fjoLkHfsQIPT{9e~Ox4M$JD-%|A&Si3x4* zS5?$_6*XQ(jSr#50)2Ktn`V)~ zi=h|2H@O}IJsPbfh6bA`e;Z{Ft5%}L@Bp!m*v_{d@QXo4-U;_QIZ#hol9UBmU|X`+ zmzTpczk~9N(32N=zS-ots~SD|r|8Kqs$ZFZLs$MaeDh~`<~4ZcWq9T_z1+MkGNXbo zO8LU}JeB0W7)#vA-WtnIlwkn)JG-UX_c%#;~!0DwffkP(1O^ay60z(@pT{CiwIf_;e+Fx}N&mLjA3${??0xS|U4!|h~)K7`?h|d$}6MsfrK+LRZ^b&A#_GPiHH}EL-cJUbM zek}1Vu<4z$i>u&%X9+e~9fq{;%3G(AI1MN1G#u$Il0fp-GHDasr7TlxJ^H-L#b&CI z6c(qjSkn$KI1L=FL=IUF^Y*pn%rMU*!k<{U@J?9rO2|8_m1z&p+ND*(xm&<)3wXEi zrU58bB0Wp#Gs|eD<P&EXlA|C6ZE;?1B=Z5Il|MJ zdXjqmp73z?n-bm>^Cp`0CM^FP7E2ut7kg0i^-5`L4fZ+qvbCjpQ4dAL81-jc<`CjIwEpq54J&=FBme8UUaZa{ zm*M1crdmTz?@_CDNTqtt@2gYjlPdI0^gp+d8#a_imgqagrx4^~%j0sgnyj_LMv+q$ zImO7S5IGkSX>>i&X>vBVvwdzO$*q>$Mv_}Cl&zIs&{|eD*QvytCHD%+{Wh*W2FQb2 zsnJ|4;$Sg^a3WX?0gD>2h>0!au&7bbi+9MD`wTES*JCmqOiol*=DyGQ19G!vPh%3x z!6cS}NewtyZhDV;tRvPF-zVC-Ss=g9i|4J8R=CH>0%;9aCuC9#xF5Dl)clq2lD zHx*KQ$6Nm3=@jHjmS#^ntG_-(nny&chlNi*AZ-KnkY6XY+?#-V6L7D!W}4vM1l*fI z_9i?BC%leXB_-J;zYXwfA-^%G-k0(hgL~ZAG;yzQw1D|=*As|MKAd*8jk2~;);7^G zprN`8tY?DpeMDQDpd?RA9i5o+j=e^kT8HlR0cjeDyGg&7bAt0H#1``0N4t0Ja2qAr zOi7w3NgXBGK}ohyk~+^_@f_}oQ>SsyU2*C(uJ0m#gLpUb9^y3Oy~OFn8N`{y72+Qm zEPB{*Fs=1|y#JIZF|RMic(T-b5usFAB>rT|G{yQ?tj|NVG5-W96Z1B6t7sdx7uw`` zW0NYFZ3XzTT9IjQat!UL{vcxmqt* z3sYB5rQSZ9dS`?W*ISpmO9+I(GZXRFeVLTXdWK5S4Z`B1(bAV_ z(S5Wpbxi!mi3}fXQZ%Zlf12B6db2keGtskNcjH~$_MZ1au`BLyK;z_A|W4#_>@%;@%L$w%%h*?y=s=eH>y6OP9~TReJR{9k@FSAD~Xdx`xUg2UZfbKC#aCVjCdt+65oe-db++G zjiP|7GJPqOnI!%DN2W?&X4-+(E~y4ddi%UuPlPw@T_N?7P#;nI6U<(|4FRcvoZHD6 zZ3!N~3RpJhV+6N};Noyy!K@U~YL@?O$~_@V*G?LcnfO-x_U zcVWr*8uD@ZwWl!I?;)nKxsDvQo(1>x*7tEgi+Dd@&Iao_#0R*3kTllE+M%ZsZzkSC zyp1@GI6d`M2VZsYRR>>ns9xfEy&o9qr){bqaFW1j1x_n)TJ^00t5x3#pG@OCoha}q z$7~{U8S5>A^=3-t)|^qd^B3LgZ_Tht{(Zg!&$G^ z%Wu8veCbNi3bZvq+W@o#(xzTCVLS4+N|ge2GZNYQo18~GnHr0d5fnQvLBBYF-!gI& z&vsz-NS{z7TJI2YKb{=NVN*F@#As(767S}II`804EW~57SA%|4u7=Vp z3_|-IhaPq|_8b-DTl;ZF5}T8j4bGGV&<6&n5wDEm7#OZ^^Bn2kQV zLw!?yM0iZKptbz7K28r)KhVP|A69?VKh{51@95|C^XgA}pqUBz`ggqqT5XV#|NqdxL6_O6LZ{kV zQYS4K^#pjItd#i}&W^(|NoqD?=P8&D0-B?hl}huRE7NM9s!#1en>>`%Yt47eU(m-2 z2_@#QrVi}dOp|FgTe3aJHh-pUACNp`4w!b^S6EIaO^dywr?b8Ma=5uU1M=_9 z9cUSfFZKX&7tk#K?|=pg^Ed8h(JGqJSd`47khvX>MpA~beFE(LstCxm9a=__hn$47 zLtwO%Hdi2DVo%Fc#l13(77xM9(mCY6YQ%o9=Y*t-`KQ(kp(wk%+hBfRJ^}77^Da5} z7QBjmfqEOO8S?~81UvCU0G(3!a;NLnY!;12(URQ#TV@8-D5VTVa<`rw+RX~Hj;ob~ z$Dz$eLbLf;(r-80ITb_Gb-dkbsUkYoD=DmQ6Xoejt{XjMR|_G5m_W}xIPcUQJWZY>VqS*^KNU#HF5$OZ zT;ysWCF&7hQ-iPayBzv2GdpwMW#t0oknqw0mq$1765U~!_b5Jil8ihyQv0dg{1NXW zq4gSBt}E&>S?}5#LqD-`lNZ& zyo%izp}jSxUs;LguM(8&ZjTVpCKMXcL*XoJ5Ql%hS& z<*3z!K&w0KFSpQJ?SdmMw+8h0{F&8?hoFTjNz=KWW2t8`pGLk0uA5_}a^7dlx_pp3 ze`z60?`}4s7p%$G7l;Ppb3ghT9=heHbo{;WMi;PJJXPIYTSi}WAa#}OTqn8Dkho}W z=sGQ;!R0@!jI=YX+7Fu2K~7{~mB@bAMfzm-ciB&+U$uQoqj@bCS~^eL_hqDS&Vf^# zC-=yqXf|mc@!#Z=zTHEqJDjh21UW-H%wKb^ck1@-dTa{iFr_b8Yu+*Q6jn3W*OC7oR9eUf3bCE9$8lJ(LIhDjqPz%>73Pi&HjwOyie+? zM68}nt0b$(?^>s^Z3!;i=5OO^?Kh*JEb^LQIH*;b_0*IFXLJ4nEE5Y*ARDQN8iabN0w zkB6M2d!_gzxX*!{I&xZl0Qu9cr=A_z{Cd#Tb>>Ze-+_uN^7Cri+Bvjwl^$VnNOS{N ztL3i2iha|3k|&+jTqDjC0SD#uR)+-at9$S!qwzX^^Zpwi%TBK%)SV8Ti-RAJHek8MruT~zsjb~c_M|%7> zc>?DiQfk*@#1F++aCD9%;JReztAl)zZv-L#mzMATEIO;b`*bEcq4pl1f{xV1;r4~-QQwg-)xmtjpN^K>734!WYV3*zdbjmvskFj|48CXxS`#TY zo2{ma_O%)PA$Pnxr7?=mu*K_{2blqI_|*9Htcg#r20ul}Yr2PNDU}IXWaPH)(s%m) zQ)}J%+;)Jxi#DaYHW6TjZh^&#M#QNuu9Y`&cr@>-8` z!=X_l^}NIE<}|?DRJ+kOmikwrOpkz@DJ4FJ;3%d-#;}DlFL!G7!Mogka|#dl$b0Y&LLvi zd{Ol#)QC6i0-5_-sQM7Ttojm)C0q>G#?{qWH>GNv8bG*Cl@Y$C$_XP>1!0(~Bz#q7 zn14kLBn(!^5=L_#td5f~Qr6f_P{$Mc@!be8`YfSvLqz^`+`*!Wi`|p_h7&aFTkBP_0%GKCjjhPEa2Zs#F7EpxRC- zQ#%P4sgDUasb<1dwVQCW+C#WS?Iql*63Xtk@d@E})k3&K?IYZ&S_yZl{e*9*B;js# zfN+m$BTQ56gnLy7VY)Je8Fq6wyWU%e)U|r39;!~)!}KsUNDtS;)#ZAG9-&UrC+U+^ zA3ai!RAcqY`egMvJxY&KC+kUilDbOYsBctJeUrXPmFTH@sw&qv>zh@jzD3`nj@7s7 zTh&l~o4!q*sBhP|t5Nz6eTVvtzEj_+PL(<1r|EC#Z>Z1eyY=1b3;G^?k2*t7)6>*h z`d)pn`jVcmr>jf!3_U|l)HC%=b)~*f->0VNS$dYbLEo?MSNG}JdbXOS=jb_VwthfA zpyucSUl^e02Q{@JGtkeJ8R)}h2Ksq=zMikn*T2xeP^B^ty;kO-U#3^+6?Q)${e~K^ zSL&7O3V7-++1GBU%mW?@r}cxAN(jetw&55;x$tYb8U*jxs9J(1?NE4fnDFum!k;G+ zDyjXET%SxRP@~kTT%Sg$6y6;nyj!V0M;HNbe4f-_AcWQFgn{Y|LN8j`7vbzP3BA>L zLN&a1E-miM1iL@U1>k5`4fKJ3F5>!PLanSIuv(tV#$q5d~vgnCN-kmo-lRH+}UpHR|&BSfUlj8Jpc0!sID z^#ZspRxeSCrG$R!mxN-qOufqW>x2^ZYqbJA-yoE!mCCNq{VkzPy-64%yAM{X)r5Ys z2jNL-4dEE|HX)+c5_+pY5QeM2s;!jbJ;Dj9ju2OWBMejZgcH>Jgt*#97^Zd*`m07l zOnpcgtWVLWsFC{f`gDHB>M!wozP^~2^E3T3c%!d4u!|`UTZjzo=hS$LW{! zQr`Yj|B@%m^fI2fh+!$WAp6$-Mjsct%CCTA6BhJQzS3%b{kaUD*TX zRz?n?o-GG{7LFQ&6dWh(NhTxluA|m&K&nhdn%s)~xE)D$pR5&mkQ^RCT0M)DdJXBc z4yn|DG}?(2YDW6(LFy!sHZ4e*R-{W3snUit=}-n45<+$iLuQOXR*XbOj6ycth)kG@ zEVu<3a2sv^4%+-(wDr4bEOXQnJlWNw+yZ=+toTp@(;mU>?p;Sd`s?xC=kd)LN znh|LJXbw>SF9$hg`z6xz2J=E&X)SG`uP+sx^p345vxl%<4U?VNHXpv<)zqcxZ3WiG zHf+*h#(Z1)3_mwW3Fc#=cXaPxG4Gn?*eESQS@~{#S!JPWY|B zeWlx^7T?D^jXPyS+iHCnDs!btv0xsTy)Ohxsy+{kJM4ZBrbR50H|;u_)Hp&(YW8TR z9oPN31ou9X9GRoP?*ANZGCLY@bk3Mgq+i zyKc){y*-#`lqZKRj@N+v1Q6Go?{<+U>1u$hUz!hPWWKHI+C)CA@+tSEzTM*ZSZKgyf>M}Azio6!*X+sQBAj^U5Rat9yD>Z4??R6i`7w*bAxJV|R= zV7@71w64WSpGIHOW;U2bNT$r$*j>}9*p*$`@qd>hCX&tW1YDA_7V+?LeKqB0v3+J# z);U@q`ef3T}2;fFube|<+e zPvS1*dNc3Z;pu(Q*Up!)V+RGn-0?0c9QC~AJ+vxV4OexvMuW`vg>P+{Yn0Ph>O~5K z(5U_bU0PJ3*)KTSe&Z4q%r3U`i#z*@qatk*aM)r`M@P>px6TBrw`I^bdg#0izH3Db zYfs_3RlI!>;gvP!ZR=N(yPc$(o%QXuuKfM<>Vbw~SL}Ua4rI=07U`1m)rxj#_v$Tz z(;}3=2(F2UFT_gjJ+zr7nJLkVernhKb~nDzh5s&N+%etiHbZ}_(=^FU`w;rQwM+Ym zUD`+N(ju`-!(x>diCx+c>#UkzYnK*?ofZ;1Eh2VWSnRZr*lAI*dBS4z^c9<@SZtn{ z*gSp3<|!7NCnh#ek=Q&Dv3a6m^Mu6a35m@U5^JZIUZ58!E$h9tSUbJN+9?!krBn(F-J=I z&lfLKk$9Qn;$(2)zn3yiCW7m#IQ*`qRXwpCC5b{R_p`A1${21hMrm5Lrl6U0B(TP*&uV)2g`i~lmQ z_{WRIKT$0H@!~@}R_y+>#qK{>?Edq_?!Q#*{`17{zfAsnpuc$Aju9WgXz>Az7azdq z#RqVX_yEojAHYT81GrfHa=oNgoGGp1Drps8l~(Z;X%$yVtN5z4imynkxLmw;Cy96N z6!E;BDqgiwx>nb!lf}0d72n!m@v03KuUfTu)lLwv+A#5|)r!yHEb&#K+zN|j**QxT~4E?A_>#?d9iD37QxD#n` z4^rS^Dd~HZ@NbmteM+>0_WdC(`}6t>`gB_L7xkI?EIm$-*JtZ<^q0VA0WJFlS~M8Y zmY1o}s1Dmljd=E?Z_+~0*34TnLQcUN3*c^eR>ldISA(lUYI^ctF-qW4(gID#2u}l)~;wVRx$xgTwd1 z|08niQVSvN2TsTG8eT%|mDYTt+w?r$=ucpi?k{$w?9V#?q}BG}!8-p=^AI@V@yi zPg+QoUO84E`%I*?0*~{q3_YRK>QeJbcWaWJt>ceymR5DpF|)(h{Dco|eORrmK=v6+ zf}>kYYxe-@5N)7MsPsuN<5Z}&&#uG|u+7o}cDX$pqy)jf8`2KC#31lLbh}$ZXI)T!uFmRG&jhm5bTgiIvfqOFLDC8mGE+9;ZH)r- zjOvQ%!%#H!dPG%rYl_Io^}aJ1Ou zu{Za1D_^?wruM9bbidxu&a{`6!;L+iT|vvqUgevT8@cmLyUSHd zd>dOuUuys9z`ofczl~U45xH82<+X-#Zj`nbmcGRG(-x++&xS~nlZin0KH^b4tE!HA|5(?NT3Jx&WtM}-Ew&`+mj^@pmPBWp%a z%8!tq3+E~BT0|bNj@8qgw34vHM@PMG_p1^9*a64vmp&-%#|U=6NVk%#xr(%~`K}%^ zo*i%yMQdy$?h{(I$V@Nib;M5Xv{yk{nhH{HL4TClyW2g_()`o8SMJ=`yLMxHbt_+j zezsM1rm>u5p@-A^J*4nSq`e@*vv%#cADfaLTndmTGFu9a_V_uk_H7|jLq;=XchYRF zv|W0hM3zp|XfesiIL#@p9ewCZnW3u$ST$$VNf&!WcqyLVD=D*d8FTGuZ<#%Qv(?KS zS4&Tw%Q0c6*U8>smU+T>S8sLXD^Q;+L6dzrn^qLKJJ%OP$(j@J=OMc>^b zJh&43#m;N0=H8C0EEXtL^e3CRvh8h$^ayoM>UrIGT}oG|_INsNI7%zFGhmC&QqtGR zlLg9Z4Hb6pMzewR#o`kgZ2yC#LO?~Poi-BAL(O%3pJlG^XQXyAZwp9FADq`?6XGm0{y^h?5gRqcJ4_e_m+Ss zMBm*L)Vd!9Xp;7p_P}-cbZ%5KSkKpz$t%8oGW6YGR)2=veb>E7^G?R+n0=!BxR?x17b;S4sev;50LChk!ope#_e*q zL-@3b9?8<8)OnA6-)490+v%v_`~G^r?%hFcO5vK_tJ)m|-FVrnDSTg*FKu1Na%Zhm zBf=}h5_)m#DPBfhzD}@K_dI&_#RR996{n>WPu3t2=}!c%El+`1$x&%{+n}rUid(&^ zh3D^@O}tqs`}K90_jvX(RR6X}wFT5eAiW%2mP>!R0*YEsehD>GFX_BpP0p<{;6cys?^^zQMq0FO*FO-gBqnrOnv&D5RsKnQlh!+_%zVCHZ61RE zA2p8?A2qY!^2g1$DPO|r6sdYi(3`9`|A|})=n|r3{Q?M^&CAg9b!hWl^CPpC`xWM2 zfgQGc8}fcTI^7@8?v|J-+_jr;n%9tQt-b|>MH1$WD`f0x6A4B^Q#I6)PNUpfRM*mT z_7|YGtXCk^Xf3r>*qFZedB;mL z+vmP5@;sjUZioEtlW~Hi^9UT-A+j*3y0CskQaT?~6XnBhz<%f+PE#Po1menWQl&JC zZsF|9lDpklcwLV(AI3g0d5&!RFr&7Doo*5$LEEi_&I6^%Q>9txx$H1;NuUp;^%vjY zI6c$N^{}?3@~aX%=`Wvjx6e|RbZngG*FS0^kKlyA>x)BtL@Z!oKkcWsYxvA9l8v!dXFO`S0@1RFS!~2^kf!ZMHx>E6xie9(21Wm&pCBK00$uB!JWDefo%W z@-uWhr!?E|9eC6KFSMK7wddVwQXTnIIqOCG04o=lXT1ydoasnOvF^qRn*AK1EbP3` zC1b9tc|GU5rp$Z}Uihs-kanwK9xXtf#?zZ)f0gQR;!ejCy-B<%KcCLN^ITqyAfr^h)y z%9_)iXYI7C{_Hd-S+3l!5u3#awb$+CE?VBMP8^iI>uI<8Zp!kBWardn+SDA^V5XtU z_Sfa^Uen1=N$CT-yp5KW@zoygN8V}tJ585X(TkcyH`tp_*IB~J6RY10m)%N(5;?hI z^))LwXr%$`@G}!3eLX zOL`V_)cca#yXzr+dzSR{VNP$1N{eznmejm%)p-VN=1%O6uimxu)S=8OdPqCdvYzjq zcjBP7fc*be6n)oX6c;+X9mMRvW<-$}_P=lX%RgwOwcEMb>vz-ri1$pcI!K-ex*dmY z%GgtOcb30lTe>`*^=WyUDGO3N|96ph4-T2bkYi8#D=Sm%2tl)3soiNtOM%KgEFP|= zyO$dQt`*&;u!rOCfOf?hCCs#FGTUNi`us@`to7J%iOL~*t!9e~| zW}C79$nH`VcRvHimwvCC)#cWCr29Ia??r##AiR{}_mp>bAMIXQaGF%muY^^uy;~*! zDV7;gZug5YYh{my#ayqDSq4Ju{Qn|> zY};x39J5bqq9mg)-f2e#y+^WGI6qC7pXAO`OL4!`Oa3eCWl0w}N1(TtknsGDEiBAp4l191u}!V zm&{=9i$*dESf3&ER;S3!Q9GMCDl?diWd3p=nZF#9`OAG}?sBorTJ9&amP=%ga(|hl zT&>O{*qPXNp7jNUQkkzjK;|o#$$aI3GGDn|<||jIO9_?oPiIv!Yk8o$LR|?QJ72k6 z<}268eC5G1U->whuRKI%DjzR%lxt;<^3aSG$67tE{wLQ@sP9o0I~O@BbCG+=T;!IL}^>X*R5&PA@4xyS=$E^@WZLLMZukcY@D zS-;_!@)yG?8)v#8#Q<6K>o$6XjaW@=u7Vqv--;sR~=BOFO z??Cx~;rBbTL&6*%A5;IJz6Do2q9&_Hsh=3NcDMX1Sh|P*I{c;7J#gqu&i8WV4m&g6 z9w)(_O6K6t@^3y1?&s=YSqoMpMwo|@Ma*mXNEbc@VE~S{~(mA2PlOL zk5a-%NihX3oXWdfD5Is!KdVc+qG$K!PSy#>_PK7{NtXi>wEnDJ)MF(W~4%J+~CjG=gFf$R>OP*`k4&0Q zxR0x;vVtZZW=n7UIkAqM=YAMmtHJj)+TiC>60$$MdnUDeZfY-u5%B%jN%tsHXe2V| z->BcY$de0^CT~Hh-ysL?kd*-U(%yfgX8j*b)fxMEoMT{MU}OM-TZ}8DK=j$3YABt{ K4*)sy1!4d-LgxPf literal 0 HcmV?d00001 diff --git a/pandora_console/include/fonts/Pandora-Light.woff b/pandora_console/include/fonts/Pandora-Light.woff new file mode 100644 index 0000000000000000000000000000000000000000..7d5cdaa9f0194d1b63b38446906d6e99a11acc7c GIT binary patch literal 54820 zcmZsBb9`mZllRTUwkEc1+qTV_*tRpVZQHhO+qN-DHqW!acX$7I&*#=Xr>pB*Reig= zZg-t_krNdK00F+QC1L>5_w5IL#XqJ0-zBUhA@(hY{apv~9|95+77+yi8l}I>Ro`@_ z0jFdtCNHP-&HD=gAb$Y>axY4XT18??DuMvO=r<1r9{@lZ%PN)-kyD~${5A;ljZ^q0 z{q9j+e%YtpFGU zzyaz2&~FquKp7DE4UB?=0RRJl{=pm687>&;o9OGG8HVfY>)!;=MA*UnjCg_(*Czn( z_W=(M{Efjku)UtW3jpr7Aw}!@l7xYwe#dA>#lRp7I7kUh)%`&M3T6u6Cx+Gi*Qd)B zhl~SpY|tAum4N$AbE^n6CJU#fCad)(E01T(@9zpLrf0=WN4etVCA{tFa5G-8<9=xZzBEZ9xlEuJ2CX7R!U@!qk2bbuS^)l(!*1gSiq(5pguD zQ`1+S$sENUj40&_tVzs30}FRcHt)iJP8&TQ3RL9BTzD}8S(cdW zEzfqb4Us^_kvm3RSahsjwcdd?%5j^075cm56zrikR+W^4HTUsa#`{L=7Ht;`SLvB} z`R{q7P$iy}Y@*_`9?$Go7NiC4DY3kG`I3Alw9EtGiT2rEGvqoY>qw>-%)vqVslO3| zcf>Xxpaq~>G4NW5G;;*mkrtAo2{e^Sp+mab@z)(rC24UJ=Y^uKcA3ek$-{S&0ZdC? zSwXD>#3o$f5kQKq4?;X!raWC!J=FZdjM+6_qBm8C#@Amh8D9>gNA!-WjbC863ku8Qa{i?i}1YTIcSdSM5vGVOg^T6 z-I9t^k{6^AvzC-UjR~PFVIGk&S-`)7W#m&OQjjbU&Ol2AcUv4jDMb~l&@?S>}7BLOnfGvgKyL(n; zvED5Ecd~$-fuv^18b#m5FrahP2=7{89CZ?%6O9>ta-fp70V(>6M`Y`>j(tRi? za7=qB+F{`Scky(fO3Wm2gfgWRJSN2(%5juRR=*`KOW9xxZ<$kz=DFR+KC$~^v4;oH zxY&WsjcxoPyOrl9^B z)G#h=l2nJSD00u;s%Sp%e9Pgjk~_bLt6mT&70Qxo#@dODCjdV12POPN{y5aiUx6+* zV6#VeD_s?sb>a5$LNsg!wyTbmlg7KI8|vKT;?~n4$vbm}qMWLSn9_a`c)! z{7?RU^Es^JA5W}P^ijJYM{HBl8TXO((9e57++*zM_l#R3T&~k(Q)6XKX*sH8utTT6 zGIED7-+Nbu>1NU&SUbh=W`-Xq_8&a=QLLMf9ixo^xM&^YJaFSZ$(8>4FT|^YtjUii zuo^n5aj5!i)FENfMZI5V%i?By^sD7NI?h<{+j{#Gx;;bz^L-)) zsoDs%ejjxTtb;xzb&!cIwyfJdE3DZLwRSL;Ex2d>vWf&S00RP|<1Fo;KfrZX-TLqQ z^M4oG&JsTEZ<{BURyf!7(=Gp4)#Egc%dW7r8(fQn8L*22e52c7cW`m{7_xrwx{!69 zA?_#*Lw5{_c@Da~fO9UCVdly*hH7IuPzUK=>T) z&6vo=J_6F&;8?pCM1Y+|gddGTf0c)RWPrWD;ZrrDao%CQ+RF`0!a&k%lW;jD@-ksR zc7Q^6H?MliViesP<8p#6ihPv2ERKJu*jji;8za=9Ew_lgfX6a7vI6aA;LfL~yti*k z-qD8d1;!pl?ig0`JRs@xb$Rxuo|3_h`_mBv|B#29fU`R4;f69jZO0pmqwcS@lH9ox zZG-?8-V+)j9~w#?8dM=3wJ;LsZ60B29s;rwWwa8u*%B<|`G+b_3rXttDD{W!@X*Mw zRQ&P7R_vtrJ53SjU*wU6tB&PUbKOp*U^SMiefCgfS!7n{yP**p5`R#%Ng(6p9K`ScM3#!6Y_djr}59 zSX3yf44{{gGfco8$mWFKe;{u=WuBNTf6=-=uSVO3aT zNMUYbi`!rorvi&xdlF8Ior^~-?2LYXJky;mcPFVn`sfIGe(vS%@$k^8 zK92lLXLHr5U}G=RR^bQB#oQO9+B?MCGLbMqnUg zpdVx15X66W8NoG}@#=mt9L&0l=ikQ2#uIcF34+OlG^9ZUIFh-aiefkJv0IbW4&NDM zqxN`Hg#xQWc+l|4YW~V-s$(}gv|Sq8Pe_ctaOS^ThorDZFX-5e8FLmZTL-4FQZuHX zAHy$7AebQUPl@+vi3V>?4r%e1YKfp~^}}inK5xmg=uAl71+m_TiylSy9P)Xo9^P@_ zJye$6chlW<+S;+=J zQskRD(!GpLDeFRqJ-_C->@ZSUKyvK;OgY`-g(-jP@@@_t6X)?dJ{CtGz}WK)Bm^Dw z1LeI79nkSgAlkgG|Ld8KmzT+o6M|2$sWcYR znuVMCohS7DqyBLCw{Tae+f*llno&04z64Q};SXP9@yA2g4@-nL1sv~=U}m^DRZEp9z*FLPigSp3;uk}6~f7jpXgH*rl<&2E}Y z^c8GFJc8rRo6Qrfu^H+G0@c1G@1+a{-a)pdfmtEh5HH73&h%5r<#8F}{Fy=EsmFWNO=MZKAdI(CYd9I9R#~T z0|$HQ*2SwtZYLu5K&;T~Xm6c+{bl#+WI~b1n|)bziLmsU7hh_|g1IoQ>-KmZAyDZ&rV!t$6X< zeh1e6=5iGx0UJ*rU>nz>9IfxDjQb&_L?V*pqO54>rbgmLeO+3Redv`4Q`3-maT{G2 zlae&Uzkltig{@2$(MYu4&6w}d$L?hO*Tocs#CD{cTXzN88~FuIV~ zlNt|+H_54Q*gpKG_HWQlZ3d|)^_TFA`V<0h5-h0HX%DYr!jmb4=A5d7l!Re`nX~FH z5f4v-V zZ!3}x-nFMJvt`+#VP}aK;@>s(Scg%j{4sSs1iYD!0&f(~G>4nQ-y7=owpW~L%#MFH zj!Q-IR71d+6~wz}s`pwb(iwkz`M&TAwPkYjm#BvBf{K{z!rD_UoMyI>^!E)CSm6!9 zLe`+nr~WD4%!$nmAvt~O021;ps<3*`hL#7pcQ7b(<+9a*WG^8|`W3hVQ(G{tyNnQ; zbHJpAQe^``&kXnzscIQFlU>QHZU?9QuV!VLTs5eg&PP~OkldtXytWQ8r z7m&<%zUgMG*Orjnkch}g?*MEl6B`B_W)u_)b0xEhk^W?)j^5mF1x`DOI+!{fJI|6@ zTOLS@REboE^%q(Vpm|=m3oHvP3Tz1s3=PaW2cmmk7YrN%0ZIfsw5p5Ma)VHt(PO8a|vjKmNQL7#OJme()R&9KZRb{^SGFhz}&v zt4;62;}?2Swe;Or_g^)G8c;zgFey^noQ|0l`U4cM)fqf6? z0e~Lk^@F`4&CY-K1OKywBFQzv-!$<4CdVy7RL6O-mM8jMz#9H@G2&=Q8#%RbV$Ia3zH@cm)6X*j#YAXO zL1+OIR+MQ*vH?0%)MZBN0p0-{tGL(Ajzb&Ir3d(yxPwS^xFL)~0x3?qfWA~PEza7Q zJyk$8PUnERRcI?N8$~H(sPNR>ThouVAoE0@Gl;g(EX7bEDcr=UP=ky$9!DR2mFOvz z2=`#r)mhhn`JmF(hBtWn@chNw+mG)cJCMRNR@oSNPy}{X@c}7+5W7~}63Jr_(oU%Z zsk<=2&V(~nPc;VCgp5O7HdgA8)lGXVhVB4fL`AqzxmEd>irAwP)&kLZbDZXC#hxmx zMNDIFTQSoKcUxdp9@fd0drMZX+NsrB;-@KAQ=P-A%w^OQvqx;_DzBkl4c?kfroXI4 zanbzP>S2cS6}wHQPt`H0U47f&#+fyAb1~Og<`J!niz{Y_zph4g*76qCj?4p^TY4wa zmdbUi-lENs%d^-E(}zkgSTAPpcy32-=5EDqfbmkMdd&>90Ug-qjAjM+E@s$#$oU|$80 z6(pJF2^+X8MbhWs9xytkvuCQQdB;ZxladpS8r40P(lgC$IQBJM6?FZUk0xJWx-#|l z@I)+QMcHH35|AH7z!~JFk?se#)w@IumfO)6HQ! z6MF0L&f!a2A&s;nt)?(LONTSfNi{x7hds*SFuO{JXHAl^s+=?$UvqEj#L*{Pb92u2 zGVN{;jB1gtio!Y}ZGE*4;5w0Q)4FPW-;aO&(UoU&!1ez5sYu>uu-kg0`a=B|#3&Zxstfu7)qU>X>Yp$K?T{E99{_>t! z{ivOio%J2Lh~O}KoFm~OPj#eneJ{%(9Xph%VH#JY>K!l7AUz7g!Q6v{F#m+?F$JC9 z0-2?Fkp&dY*{ZXuoczV7KY0q+9x{m>xMfE*R;F>$55u*Swd~b!M~vJ^>2@DG{zTu2 zbdA%!mJ27a$7wT$CDx$C)hP=7l;S$25HjwVh%2m9i5gRJqtx3pw`OEZUtiul<%JuB z4ib9r>$<^~sW@dWt~;8K(-b+kpt>vrc5INHKWr0{JEQR`%6`a3Uza*EdH7BtH9md* zGtNEw7gZ3{0h z(3oTpf*@@HUuJ~9E=e1I8z1q&4`Lx8X$JJIpZq`F-ERw3)d%bfyv=|{+Ap1gE`_fj z%2LD7)Stx;GQ3Z%9gbzohTC873XErj@|ja>u9)U`lsia~8?IU$X|A;v5LI-4BI+Kf zTL6C=BK{y=I8riV#aF1edVP3(kN0NtfhSObuOUxhjywS+3vwKgO-(UAjbYLMR%d6) zyWRs==WxO6G3|ZJ&do7B0E;)$eAE25J(MCY^ntLMoRphDL}ga20s-9^TSMh3_Rk@v zn-Fj8^`VW5w2Erxf@7n4rCR%Idoj;>mt-+Wb@#qLzA)>Y!W27|yL4652+G6-A%DP%9eH|w9?!19_@Rg#%p z^Z4&E&-ztw)wN8jl1^de(5N#<>(pL#>D`PMp_l_Ep2Kp2(H44@V|GIH20V&Sbl|rq z4|ygCP0ud`(bmh40X%PjSP_I{i!s$J;|g=VLnf+j$afX-zI*G6rW?+-v-wgGJAQ+) zADKBsBt{~(P}_%i{347LJ5c~pDw&2T>R&*G$uAoJ%NTQ2G%D8OfWS?rYZio=Wl|J+ zj**#PZ07I*%}bJRuA3TkeB!P)t^%rjT9ctKgSyYXrq>cXeKe`&(Gs0&h_=?_g5=$B zh)F3;W8$wVMSa<7Plh=z+t*DIcFP{YRwn$>{;OqIhRvSGE2MYo_CDQ<*{56qs+)+0 zf?5MY@C+ewTbQ3=L<%ihSfgPGJM~mp`d+Oo+5V^_V>UIJ#TaQ_Cki9=`v`-5ls3`x z2-98EUlY_uN=>KAB(&N$t>TLAvV^pPqf(XM>6`^qWmspi?&aPm!km>;xzOkKZAI2) zrEn*@?hRQ*=w~eM?YsrkXIO8s-sL_kVHXX~y6qJ@%hndpbs=lW7pqTn!?!O;Xbi>c*;&sdzWRbVe6o`=v3G^{9G zAnAhIggy@s?-0xGL;eMLBm0ONlZ7KVg{cnc8~$JjQ0LbV{G%?WO$r^mIigXJxWRu# zq8GQ#Y{JsW%)`>p925L;eHj6X8Qo~rkTg-28dYJbVd04C)MB056_GV(!=g;z6D$*~ zHnb$FPifpILprbFKymNNWU(ctl1r+@N-2F=jH~2xQs*evhR2f`Y@YQr8*+00fKE!r z6qP!8g29Dss!E@n!e^<}gxntPWkF$Cs()&%VOD9PV@y)vZZYP*n6$n$*fg<~IzG&D zIAp7l(POoH<$%|+?aAAP%@>$GRs8Do*XuJ;UZR950;LF|!&b_b3Jpms)JsIzSVTkm z&-nn=o|YJ^n1GnlFrgXxG0?HmGWW7t^Hlu&{G`#dFn2pQTW3&bX9w@K3q^B5JcdM^ zprT?Mxmo=EXybu(ox~Q&m%(l~zLf7+GV(n&{vH$r+O#G~RXfB|KO-*iWz- zU+k5iuE^A=7ns@@Fd*=ObwR&FEOUi&t8<7;Ab$G?=a8I0xcmF*6Q@9!`Ue5PIcrco zVV>dfqEVt?qF?e~zjSbnjBZx~T-RT6ULM%-wlRF-Mq=j6C2%#T~jMS7(kK^Go(-C4}3aO<9h!i zo$2DR!R@)PE}2bdD)qxEcwgsWs{4-zbTW_oJWpj4b3{_~wb|Bl*EJ90<(IOWirTU= zI3|iY7{0?OzI=@kEegLEF$@GhqPyP@1&UKpRFw9z2meje`f9ND%_UgY_R3AGzqTBf zCh^>#oZVcPE=+bXA3Xcd{r8P*19X5N)&P6)>t#3&dJ4v^FsQ+la43B874QVGJrJO> zoXK6=19p3LG1lP~iCx=(ZS*0)qwB`~(e7RAeIwu0s>k1#loy3l>f*#Sd{9V7cP=-K)8y})x=6HftLW8-yV&7E5pPf7mStHb2f}1?d zk`*T~hr~`2NvCFXjFgewvJQ(?V`K}&D@nm#6bXE1OKM=2;G8`#TEY{1pK+ zVc?M+zyTH;e?^us;Jotdbkr+uC6>^<2$xREkj$~iEkF65(_lj4jTkfV#|^(!LD-~6 zG4Hj*45WDG$~iv|kYm6mZYXf!3=L_?_~Bg(cTlNg%sKgS{X%*YTnX8Q>AVwXSD95m zR^$2Yz|3wZ9_Ldb9gC3!Q`E1ejTcOsEa{(|Hw>5-6WSZGS2Q^@p!{$SG-3gGX+)9E zSzMOl0t%&b(1H4F_+Wd^$|@&dRR<{yw96P@DdBOoRkO5uhXqg}MiT`!-9=qhtQcix zK48G!(OlX}7c_OC=4W_17+W0l?RIx6yHjYFA+y`lVa;MbU(OW{UhiE46O;K~n_4F)|1=`ATfKI?jspy*$5m6=MQQA;wJD0F{-v_s~!Ll7MR%dWqPt6rR+pO4r%@sNf%V;QUuXrrqp}IV= zkj4k=Zgdy+b;DihCCr+WzU^N935ERbe{Jw?xlh~-&fCF*YbOv8qC)-=ePbW%(J{Zq zlh)~tdVE<4LLi$$WPVpi&ny^0IM-ZGMGkBjD8)3W;EfG!8*2rV8bK2Qget^+yq*2& zAsxJzW@pce{Cy*?t#IDXqmeujHkS$y!{@AFu8^eo&0DVa_N(8(L63z=^A7sJY!LzY z)KS#(2sIcuW9$X2KZ!zpzhhQ3=j^V0+hqy4pQ|-o?W%cmc!KI|Q(Rn}zJ!xosaCdt zfKTpvVzC@P3>(NrE&%R4_>H-b(@WLhu_o!^a!4pL(*o=3<36G7KtVBYvgeouoVQ>S z=PhR@tE$cAe90#oRrDoobP_o|q>3hC2mn-kvq4TCWNVxjE-dhytO4DUbyo;{?UDiy z4Fx3uE#akg2~}3?R~z0Ykd6AYiB3;nHkF!awij!E@!CG@8eMGzkQA&*oP-gI8?ka2 z2Djl@s-Tu(06xHjaCPcyI(vuXlP%B7Li9cIMi*dok-$~*Ct3#*#6ZTl&_CymVHi_7 zGP7?;)~Rf#14vor6pYn1CVu|{te6SI<>1bs0jpnKU0nyYq=KA|iiVm3Ta7}rPB^N- zB%#z^{*-7)98QJ_9M>DpX0a=zaV-;Lrc2IRANbYGfti(USLyoqf+~>x_F|mCNDyQ! zzC8ZOZ*~!db^#S&?%PlT=DS82HO7pj^7ded23CavGXx{W@nPe-lG3ht-sgYAOHRLV ziphgedaAf=3}ZycZP>weA@zBOLDHI893=z^aTvHF2 z8jL^kk60*tU;Y|&a+yOAj!f+`ql_%bL+$WA(n}#%X^R0CPu#FEdOFr2jJhc4K#_avH3wZ5~UE-tl- zmilHy1k;nX&m;>jK1Q+Sq!JWVNke{L%8SFCvL=uf%Z|L#@PIu2KJVJKvOW|Sj6sH&_4)6GC_=S64yEEV^;CWOBd4(!VjWCc*9ZJkY_IMH^ zR^h(;UBhj+3bGu43=MLdDs?jJBEj=UTPn6q@_5p&4u2^|J&)n;tJ8_*0F+|csgsSV z&1w_kV`77DPkZwOn)i_nn440Xn*v#@sQAaqfi`RJ<-x!Y0TivbcZSko+?PBRx{MUM zP;}b#9d}zpKm0Bp>5=9EL|wO6A`^W}lgBdhr#flWhu{;GU9hBwY z(Xj%T@h#X8u0SL3j=ykkYT1JNMH8^ea$BJ;C;PSeM+SA9`V#y8gok^IbQxA_hqvpz zM%m9Imk*u)(Cz-zqMPz^m)z;3)gF1%X%PQnyY_VNH~0|i7lP***v^Pg;UR{=dTH4P zu#KJVKty-I65he7FQA^v!S!GPfqnC^2mD6+GnY3$wamLRFVN3NX!%vLaH$=m z@B6~h0{ojJ$fMnL&hDCLwKQ(g5<|*>jKMHm0Z)&E?}-Sgp`XO_8YLpd1OjMNTNw;M z6Um*p17*n0@9WzOnVOVJ#qy#Kc!*_vpS=4NkdxqPi^F3?^t9xdB??um0x-Y>yep{V z+#R*fd%tyd*n>hOF=ol$ixIlXMrAb8K$5rr5awQmlZzJ+g0CqBKKA8Fwlr(?;~Ul* zr)^#wwKvw>u#)6W@S=s@o225`1_kitm=)lH$8FcgeJczAFwO;v=yE!Sbqs{sM04jd z0e*T(pVgAR>QZU3f4h*a4MfPc3bZXbh_kkEjyI}3xkSumtbALYjX7IQ_66yi&_(@G z!}Q9(_FH4E=bu*l6hQKu1M&0uKu3q6U^Rje#L(+@1IdA+dbB&a$Ep}ZgJ=qtyXV)Z z3$AlY=%4tAs3U?a#U0I6d%iIs^RBKu=tp@}G+muVNvfTFjd)aD@(QUwrr*fAV6 zRa8edO@hUY=H{dhKaubHq zMN$)#Us$}fs0mAEvPz=hW8{mA<41{-Xse&tQT(lGsRHT`1u_mgj7-_C>I^heGj|aN zzg~{oBdZZPABqO*qXgK?C#QnviYLOpCPg@X=(1~fhd9k<0bpBz%k!QIf6aS;6*tX4 zi`g|k5##oBt|_%ZRn=Tn9q_G=5}@>lhsNV{-YOL>#rKj}5aM1T+07InZ4I}C$~90* zCf<@Po^%rJiIQU^W+(3}L!cPdMh=R%L|Od|B!AA)dM>Jti1QGQ{E0>W{5f!A{7_U( zRTPzNX<@IHXgG6o5@U1o*)3N}H@f>+`9#F3OAH|wzPNAZ*H}Hb4uAJlEc|X(*96V6 zm+*j`_kmT)0{R&X<3Dx}ASj}-MxO@$>j346@Jq6!4*hn5O@A13|IZ zY5R-&Gpn|0$i#;t54}9zCUm}<%~AMd41-kUAvB4Ij}qL%jphMQY?n5$1#(=$z(Usq z0c$`VI_ff0_EcGH6{1-DYi%2lCb4$Tg4A!6(vLxwGERWtFT&Ks^(XFA+!L^$-2au6N;E20@=l5>AMgk<*i8;Qv#jPbX&IaYY5R zQfE-q9urlP{MU?!#CD9F%US>ZSzkk# zJYu3_@&o0cvFzeJ#{Md--6!Vg4r-n{H=$P9o1EdKHMMG-EgY+ojIu8uQpn|m(=R-co7I=utf3;BVZ&M@p2$d^ zVM7OJnoMrD(W+Jl7n)RVx6`T)Q7yPOaNghP>HXm`nJ1$9xt?%pS-=Yh;VKEz!l_(*N0uK-QRP5C&Ap6?Ayht(CWEp zdbhmpraI?_WtEtHU#JS(5p}rWz9E`q0G}gVhl8=ppx18dD~AKl>!C<>hf=7G&smx6 z=81&J+XKb($FSjtQ@MJw0(%dng-y4&gpEVrg_T4Hby((&klXnv=aKu4e+1Zht1J1q zwx=|b#|{aVU@B?Y2Zg^e(US%O4kKk`ytLXI4?_;)bz}fSpn<9J(1FCF%D(pNKyF=~ zlCpOxl{i4f4y%lEIug0os_*4?7jk#hZx$#y6VHeh1wBLrh6UuJHwTe(kaw)VXeFc< z|LhOAu^&sgV^dJ^Ro1A#`CG%G6^oL~r19-MJmnLVAJupymgmXK09M_Qb zo6iGs%Pur4Bk5La((xpY^7?_ouwy|r<=!5|&bLozwZUWI?|tCEPo$sK=M&{^n+agx zQD>^MR+hw6!rMCxl$t{(9fT>(K9qZJ>C<}zOK^Ltyj{kXDY^$nkD$ zrLuH}rlnCIG!`Upx+1!SzTR@5f(a^`!Mwh{Zh3ypCF^YvIj376+?;#QnxR|USg&^N zWX~S&W3dh}EVP(RWza;f8EAJn+gXsE+rR=+C$A-5U9AN86~g8$gisNbw`}lfuf<=X z!l^a|x>Mwx`n{H5pW8?m&+8TP*Z1cibv=IKVZ23dSy`NG;wnVnrs}{b<mdE< zY2XdcsI_WTAM%42i?`jlw{Pk3&$4N`H`+v7?W3@l?rRj61@3lQBZ#KmbV2o39!84{ zgS8UoLQm6lq>#}ir)ac2UrE`BqBF{pG&36ZM9M97&N#pd0wTRay>IIe>LCR3aPqS9 z0!kaUa}Ymf630PZQOqAWCI+WqG+v z84XV}t%OGBK~ff4I#bu*3=YGu?#-|1)k&s>pRo)N>piT(s7C#-f(pWmV)Q%~fg9Gb zEE@)LDVhgmHoUlet*$EWO>F@_(Tp+y1-UDZy|X=O>1rl zYmbE8`@h_YBcr)L^jBOkf-qc5BCJIZ@N_i~e2(k`^1KLa_~_R7++HuyoN)u~>OPxh zVv#?o1c=v}F0g$=0K)AH>CJq0ua|RE^K(-|H7mcV+3j=@q^dw-Hz+R;Jfg-08YC+< zEQU=Qe+Ww5aiX~_4;>>OhiUXC2ju9>Lft(agm5GcXH8n zwVLmf$uIBt^V_tMHsd_A$yifnID%tcESfH55k;ee_z1ST)GWz1Q$smNYof0@?dgU6 zpEMJi>zpI4bwq!}4&FaV*=W>T-Kb9$LRN-l^I{ohoA zS^7C4c`Pr&0{=~6+cMtoR6ZbwNowY zU)fwUEY9wamE)>gb;>wxA#t|HEZfA_b7>oeNmEhH+f8Nq z(gNp?SZB6{ZF|8%f2x2%j!K(fj){jwM3sb5EPlF;i(6`Au|;^}e$=YoBHxW3nTmTf z`Bwh16u%g`rYSeKvrCn*XCH%+xa&fScfG)fcRR0Kne{E4oLr;BS_!pX<%Sv)Zb+2_ z-W-Lja1mHpIA={K8m;^gN3#6XZAX4_xWudk{t!K1ide!L{()byDCWeoy;~LjLNSIc z$I-c2)q$Np=3KVez$9nqmHbuTg0VdKERr{`%EnsNMfr0xna#ro<}2@z#c5%|k$Kn6 zO4;(u(k?tEhKS((j5RV)Z{w7Rxl9L-BtU31J|>! z%E*q0GB7NbhOl~1_OOZI+vuqmmn|e;2aWKnuO%ITd5l0Z#1Z(I%teSBcvn}O{|D;+ z{(=&OUO$;**%8Db(NAKsLSf2n>aV?xk}0jX^GilACslXBx;%(gFf55GYp66uv|>f~ z8lqj>=Hk{uqmE0_6k)w2O>sSnhrK#mRvBI8?ANmRgm3l@N8Jg|mN=cAVXbF+1amJF zTsn|8yu*-NSTkJ`=E2?iq_d_Oc4__u8j4`!QiQ@sksIhB;n zK8+D_TZoDHm#~tHqXSOaA&!pSaa5{Us~4`zIlK>o$9r?7-n;unGrODzZuQ{h8hni^ z7p<}LIU|nzPt5W^1?X;_@~)d!EjVIgvrQ)#t0LyZsILBA6|(E39l~v`pUvTIJJ6?Z zS_oeB^Zy!Er|C47A>PS1#T<1uMI>`w%t2QDUb;CYb!Nv70I?fNaFd4d)J(*=Y9MhD zShpGI<(K!_Xe>2EsDHpyQIj9i;5#C=AJ53peyEZLQAw7myCXEXmY z{mzl)ihy?B$SkL=&2%T>Y1Mx9TafzlXhj=-^^m%@TT6V<{rdchD)c$J zyoz^j{1H%Hpwn%W)#Y|?>TK%lyybzTv$@$8{SqA#g%Y%8bM<;uqG$iA9P5-Brr(va>Quy>-?V4TVge`FZw>Y&~SjYV)g>*8D#WPyA6c z?OYoQF-7EpW@nJynNubtZz7S{Nyx?ZCqF%S;8CANbVtEx&VtTd?B#A)!X$rb-f|j@ zOPa@Ioplj1T$XP1l16ZeM%MlzNeWneW0_OJSu8hBq*bh*Z;w!rSgj{5kNWyk^|W8f zcJkY$zGu!fvfct{LA*Vwt-7~rF){V@7e!fr3$dJ0@A+i19!wmpKQdD^4=a7IRhy6D zk-F_XzrX)%Nl|v(54g{@1KGP9YEV zs8hV-`TszWXV{RgwbCX}xN|w_@}QgQ{y>_u-r_!Kh!W){)tVEvr}$bEY`xR`Z#}6a zltq11a(~jC+q>eNPwDoYt41CV{7O@Z{O{<@3&S68^tZg`0^eS`{m08|vaJy6|5Xr3 z8kIc1v^pLU*Li7-UP<09*ir9g>X;>;i9QRewJL(lNirjuW>c#M`HWu=noNanzdlZf zWNjARN`U2oAo=uf%QFW&&Pp&d+2r?}kg8RjV`l~)cOx#}_{k@$o$LOnCio<|+CZnw z{-2+Qx|;b7e!HaFU+bOs0_|Net|v>HR=}$bdpIu>q_NF!&BYT%`lJK%&?%I5WsH_I z=Nf+t8SQ`Fq8cM=+srr{eS)gwL0!P@^yJmxsP4ZDGV$(CQHKksR@)k<$_0MYhk*-z zW_z`u!Y-|Xorq0K-Brfkn+}6Xf`TJiv=a{|P<|dwKYugjVTv4=!r{)`$F<7ou8$Y^ zTIo?Y(=*eP%kh?p41G`iPH+r)X@Q@Qgj=y6qPm1PX{c>3mR|DdJhjU&O*6RSAwNS# z!s1$Ib`JL=7fY^7Szny4p~|liNp6SL<|4CXwGxcuCOUDnH#JwTuem=qS_QP|O+v6- ztSzo}Qpm4uY}QgKC$M?0i)Xhans2t%WnEd(RIYOoskQ%%kTGN~TZJK zTo=y1IOYq~F7fNV;dkbADG7%6^*-)K+-#fJB6Y)kJ=-ZAEst&PRMLqVw|_iQGsb!V zr6E5l@>SGi7i#kOyKr+;dYfyck}E$L_Slg;R{6=p+zLBsy{{J<$JmaLhphsC&7+Yg7`$9G_zNfSSreDtDXUCyHDQ^^Jk;d&}> zteQR9$B~xcs>C-7@~w>5oYNzi(HXjPX3QccE#t~YY+SMgJ%Y@q(RPa-#O%;Vr*Olw z^AyPVCnvBsXGOjJd;<5>h?JG(03k9;!Q3(

    )|lyx9qz9ZV}kuo<(WR>s9Cnf_EX`)J9!rkD9Q4j!tPQSwNp_TZ|{?3?-rQMY)j5B zT$E$n92%HAMqMoin#-GEay8`$VgWazH00WO3`$1DV&HE=?^?3akMM24nO1D?(_PO) zgkQT&lV)P9S=%TpI42vMSZSvxYncpxhvMJAoSD1(+nZRr*Odt1PTZR|SC6(`t?lpn z%x(02^scw`ZRKpteWGWLzAB{yvdhz&>9c)nSf7JT)GU@?}3Q0u(58JVn59%|fSEXjt#o;(FBjNGH z|9mvL8NK3M)pQ?A6l>&RcYIF(7>GuSdUlBdu-`N-A&45#fYCM7i#1%wyTO6|29=U> zD!xr%Ht8FmTWz@l>@y^~r4kJ?5QIy{e@^%^N#8`_a5c0oISeVoJe(=_zS>8`ruELv z(X;C3zsQ9@Ly3auZ5yLW$*Db=Fp89_!AxiDT9A%O9t#(K$Z@Nk*5@m`_5=enGCD%3 zCkd#NYb%{g*|D&^tXZsEl$BGCk4s8%bJ&NrhAV{+hGlaVru^6-ox*H%L{qoIG#iTu zb>^xk!boM9B)q^|wIIY}65JHk#bSF9-dHyp_I|_}Ux>>M>1<3lSaT&w@Kwu_=0J%m z4};1m{TpLx`L}K_f=5gxv2csgM%P-@JzR;GZ^%;o9XLa$BnWpFSIvpfj40mlmTqt` zyS{s`<^($7X$tK=qM5^A_w) zcapAQPSoi8@cnKij8LC#RHy`JfmGnbD+Luz1$EiPR2(hh!TtPJtFcEB-(Bn$Pj5?+ zCHFSEg(SWPllOMGUb^aug;XhEKc=pNi+^6w`CtH zT6o~roVn_p^bfq}fI8`+yYt=h8VhWe3s>$RI@UVDXoHVcBV1oZnl5;Gkxxp!8&_)< zRzqhaxsu#wOZ9wP*Sh3s9{=5cE|6L9OyP=}V)yK{yY%`N;q+esX+W004!$0gf0lS} z+hRuD*MllMiT6$m>b^ddc<->vt{R=CafgxfjwhZQ(s+8d%gKrns{iB!ow8ZV-Oqk` z+^(q@YUHjvBi-<^Q5}j(J~oY(=q4q2Yq+MgCeM?dmFj|GR%|_QB0n2?X|1cy;;eN{ z?1j#Z$Ijh&WV6zDaOPLiu zL4`8kNhVVq8H_7ktyx?$Q zfU0Caz<5=~HP!OAL3L|QYiY5(#NkwBc%0OjHxM0%;7Kr^=;{#>J=W8a@v&ROp{m2{ z$L|~(x^p~yw6goAw!R&OU1euSf;-yVcLW1F#98N){Uhm-!nDtccyiv z&>&h@kn)_huDq<)Th>tCQ0w>RRblJelZ{-j*V@SY{$=!7uc?`PxBkmt#<#O`Z6~TI8D6JZ)5X*j=1^3J z%-UwQE9r{1O--q^vu!7RB{10-zX(|DJTJck#A%TOE#XF+`mMIYKd^qX7geg;O{)%V zx8((?rSMv7!9K%U%zZ|6QQv8`QU76$(I{+-Hpm*epT7p5lb5%E34QGf(AUS%=+m+# z%J(#0%x`eobVHUTknQ>I%{5mjU1himLO<+$6Vv#IFLdEW|bGV-Kwq{UiYVJ83MR zlY_|oZ$i2_PLIQ{TPgZM0Qg88^Xce%Wd1Y&e2b(derQ$rcLCsQ{0i~UMqes%NSDJ2 zaZQ`q_pTK61HfM>w-fUojT!sqGUA%_p7*X4Z2^G$G@TLM_fbRk3DQEKKU*mpj!wb5 zaSnPrqUXLU(RzXYEu!z#(EnN)iWzUD%79LNxl*=q!AY z#)Myt2|Pi&$9#g8E2KU}{q7h2j#7X8oJmE$4glZb5lt`5b8!dAQ#D4XZcN~5DDfWc z)NS!uEC(L_r>IX~L33axoaSZ@C7W@FaUN4@SyC~$q&)m-=Hd;u2pp;uK4_Mb@2zgt zk(H5};>b}kihU6-ObX@WkU_%5LVRdscPQB6$;%PT)USHCPxJAsk9Bq_-KwtHIeqOL z(cY{}61723jWtr4LU4f4WiCONCrpc@B5x^p2STB9PlV24wfyH-M@4<#67~Hl*5`r4 z;j|p4I&v9T4NFwnF21VD_c;x7l!NM&zc^?k>X6aXRY!J~yr1Lns2*`(X0l3tyJ44G z(JrqX2{sqx#taj>`pXx_GE5&M9>|1|a9TR!EQ0|z?2>~kHf0*Y!?`TriV)Eb=a^`D zCIh^DnaMI`_7Rt99OM~;;K}#_px1j2cL%LnE3>ICIz-6?4!~hfujw&;)8N9kghWH0 z#6}3Vp9r=m1e+VShSM^c!m}9AxntbsgCc}sQ#_zJgd7|s0WL>31O3jNo4HlIPHOJM zJnTSf6m{OS+p1_(vN09s{%`7gi_@Uv@JqzMrQ>sm3oEcD#J{cWBi@-*T6=Hh+5Bga zE+Z^awiPYLE$4o_j4PgYrQ6HoHv8x&$A5HrYvjA3_nnCRjP+fPe4qUXaZ2ykhVUA5 zMifw0ZEV_SML}wpS8~7f!(*TP;P`_VLX1VCtnxp;%KjXFL%H$&Ch}=%XYLpL7z^t{ ztVWN0?wI9j>$I!ws~Ri3X~`^%VqzBMn&j7(%dOJhDI0e0c&MBI)oOne{XhIo8lH|& z+8RY`9Rrus!6A*MIpl*TughqGV?LRcIvDD6c82&%ufD7U?_0{+zl(3AKiBiOSTk|N zB!0143Dj4U__yR7ET~L_p~oS3BZM`HuvOw0tB@c)bcugUBC#RzX~3*GLJu5QPlJX^ zd&?HC0R1-u1&+E6;}~+wnL*Bx929;eZaArq^i+pib<6byhm|RVjTmBoucxo!Ka6Fs zA?_7t$-zNospH;pszeO57oZmGpZ<^I(s! zQXBYp>6Ow0z&06Go8DG_PH!uSQXgMC`fr5FG3R5Ltp#~SwifuN_AVPe3crl2?-j2j zl$fs-{Wk;E&g9_x6iYztom7XyQ}F0GHrDcusf)4?ZPTtXv(vS`wX8ex=i*<)wvwDi z*x$q|`Wk7wS@?P4js73<=0bD00X;HOTu$P(Oq1zp4leKT$4!$|gFb4o7CB|Ij95kg z+0mn~Hp&RE1h1^Cx|E}hT`vEm!Wc6gZXBHJC-mYN+2b{WM$$pD^+Z|wr(BDs!=Y`V zE#cnnq3#`>f!zf~vw^lPvEzHw@p7=OwWrZP64S~9>GFIJHQ58I>L*34IhD1)w}n_` zh*gEIX37&@?UeVqW6MdxCQgUVY-Ag+#(Dqx3E>!i^)k}Z;jnhzDf@!^m25pHN(%tt z9)aiR_{=rpo)`~(kEpbKiSe)KOAPkvmf`UBBwu1SQav6ma;4=6og!C~t+kW+J(_`^ zwO?o2{2Kd4`*nP;(6^SantB77`N9l(Sa>-c-F5id=`Q>1;x^jTRDU3)EP zDKX%#QuZ?GeF0tvG2DY38h+n3;-zLDwD1+;-v{?t@M0Z*{WapHW}fI2>2LiSKzbtn z`fJ2XV?4lMW7Nlfh+bzW!&&J}ag;GtDQBQ6^v=&YzDvjZ%TXwcW-#9QL4|`hqKXz3 zv9wt8%+XxdTt?0`dWvY;G+rLr$jI)lUELkq3PYi-!vi-M?~&|&@nAL8jb8n!{;0iF zd#Pl&D$B8+3$u8J!?PL0o#7~o@ovkxHPc&>k?GAW#kFj2@(joD4Wn#t+Qdky-nNYF zj_eT+U(iVO#>a(*U%UD&NTXJVA4{| zJ97RZJ=t9|$E2oWDmt(0s_nq|C*%%HDbn-hg}}fsBVMfI8<)n3r_{o8l%6`=hXn|w zXG@@c*MgQB4D^&oBrkaZ(@CVMyjUv_thT(=%1`$bZ{(HWhRXP?fQ{y?fH~O=iVL$V zb1G9^@^HsVml2ono7*)0l8qy0CnsMrvhgJo!QI_myL)zP195u#!l>p{+S@ZH z9h8FdpFPp2rVq~9VSP3D7y#ia;`j||C&Z))Jv2j!u!Rc5nW#miWyBap=Q@ zJ{X7IPv}EacDkHyAe3JrboOve_69=t+M@e!BfWVgSp@aAsc-IN40V$9DR>Zo`uY7( z292=yF&A@iHlaE3lmX-HZsTawKj~zOLZN+1!zEfV2ZzEPM@)q~!uc{2mfu(2SkYME z$;y=ZuUv5sr(Nb8drORy{*G#YW@>LrW<|lRwgYC<>DrW*HH8iNd22+>)aAy`v}No} z$+i=2wIJd)7Mvyv63!!tdO~iu`)tPC$J9IFC3@#} zD!)Z5=jQTzsrC8J|$T7ZVO*19?dA~oPZ+dy4QT}xwqm53Xio0BEuM*EpRQ}?>G z#%3@DXD|n3P!pcCsh3t)pPwSX%x*<@pc_A1S@qIseDK(e5sTqm{3AF$JUnegW6)gd zriKQmwdc?X!Vryr9`T$f!1wb?^uRy(cs7>~__T+l4@G#r)5-KbV*R9X+Fu30;GU#% zOnz|4^JuR69={x(CE^7?M<1TFk7O1jY!gu!hGH=pSV~+(hL5tQjy@wQ!~RIQ$%U3f zy=c!}`rX}k$@ZuY*`6BFo;s-*=}2F~d#xAzP62d|bZIDEm3=wzTH%FQR zFT^IABEQ{gj5|%nxOaRBYjj7po6ND4J$`SG-`j(p{~soM{=L`u{CltC`OjJX^UnfT zHzxYf2lxcdXt@qkix{)cRJf>`TBN`|N#&II7Wut7*dnz(;ZD2D(juNs(E>!9PE>p{ zE=0gb`PcUwfdTqDI_=u?2Q*^yoLpsbBbJW6oJNivZCs%zkj;qIrNLg9MyvzwSz6d( z8nMC>ngfH1ZZyjqWBlIa)_8AsQgi&?8o#$jGHYn(rbE00GGYB==?useIhaIEVL1Eh zK@akA2F3!2;X5ApRC~44RXo~i?=+5!$HQxD+9vWtY{SU5P@Q)O^!g_04k#JIdIz*! z{{C=m|p2yoi1xnJj)8mg9tY>3gwkxh6|! zy+B2O5$^>^F6*(_;q;#vD7B5yEQ`LUKaflozh|2CrLUZ%gXvZ$>5J%<!_HW?BN3YfEVd+WyaJE}TDt<4kpT?NMnTQ)bZ->}u& zv$3OndvQm}tr>O04V{~FOH%7<>)P9!ihG7@hnm)nD5!t(1jXQxCb~W4z9=>78t{6t=s{t`#@EF>gI-O zU$xJRGgYDfF#*q^@?-yj9ak53jyW5;Y5l;|w*IcZiJ4uS!r|e=y?3{Y_ut;o-r#-w zk&W9XL;aIIH*6T$-qX1!e0OKz4WXVJTRLXfOD+B4Uc(T76O_V0IOJfAD_U%LhvK-~ ziIc9%^p!#S?BcY?K}31W%gL6XLQE|G-8kSGpN5sV`uY!SlgNUoi5>=s0QwfEsDu%B07hm>zpf-pVwqldsNeFJ2I} z95~R!-W5E5KKPr%Nxk8Pp>Q~raY$i;a{^pW*WGE%p)lYM5GOLK>fD#YoK8`X?v3wb zo4q2mmseJm=WEYS7rsp0?c!l>kLwn6XNvEdeD9k58;7WGPMy+wXa7(4j*c50v^V&u z)G2^F6V&S=z zz?K9seQBmdS1);ah@!smoGdw<7iC6`Ll;(!9%ZkH<9$V` z8C_Tn3QXqQWk2K|$dmgF1y?c$i)B@a`?|s)+pS-x&SQB_3RxdS?TnoBI213I%2}*3AsCt&zVRnVK45Q;|O#m{}K% zYPI05H^$1hYPU3M)!2d(?`dnR zmqsnT7L;Eh-q}84K=k7BC^1|zp;H3&ATQlUG2s_ih+iVy&K`4v)|M}gTI^v#oy2?U zC@~;BanbQwB_?n78APMpPJI>b+BRdKpl zXExLc$K8|G8BE8Yx;C76p0VIlvdzR#PYmHttq_04f|LIA+*q|tj#@RhqE6zaXG}+* zS{@~aXRIiXAg|qx9OT0Cr&d=^{Lk2yTW6{l?Xt{COQY7AicsqccE-9^Es0uJFbm2* zOT4!Qhyl@y%cI0_$%-lmi1+q(VnFob@+dJ}GNG8MLh_n2RWR~W6%w?zpnq!rYRfNa z<+oVMQLhGS+3`_o1ELp~M~UH*73C3)*M4N`BqB(uP0#^C9kugxTML_G=#H9-I7={-yIz{%hY| zuj+eZ=q-2k-F4p(dm=I>I7iusqRpMyUE zU2pbT?y<=$=}*in*?ynLCZvD7bpDe~XIATR3U4xR@d zm1F?X^{4%v&CC^0RcvK6z?sl06?z|cIk>`@;b}|y z#2iJlKmkx-&d}!ZTs;$GVLQ__@OmF%4YK0PefNHpKZ*7ITOp*;cP)v-%#1sgZ`d$#0tmYjI9b!I)UiF^sS zeLa!C7u&uj|Iw~+8OH33Mzv9bqtUpv|5_ZSXg|culHlbg9BqPlg^s@qz`~DjHQ82n zJG7ioGc%%f#LKS`@9bJ)K(x#jEhkjxMYKXg!*;y;ZnxvLqUD5Ic=5jfYseCLJWpe0 z(pzO54ruf40V8K>K$j?6R-)Wi0&C|NxJRoUB_6d%SbJoy#jZ!JXgQ&YJu-By-L|_clMd z-c3U86aiL=M-^i;Ej>@#-R-+4zOQ^2MymYXwP{M~E(^Mp@7^#i*OSHHBu{Qa(1T~f zh&5W*5LRpOie9|&-h<$wO`i%Qq&`4Sx@xtOixdh5{2n)Np?UEpaKBQvtV@a6iEbrl zkqY}0tLq9jJd4=CQY*qDGmJHQ zkA)b5SH#?WFhRcteRBd80~n$`(BFf#+Lj?~G!piEY1gO|ED=o^Xqf^pdiZLMLFRnE z`I{@6^NX)u-X8Q%Vvh};0}dj!W&o+w#2WdbU!bBxkkY2@r~@EHK~Bo->VJ?ZJG)a6 zHg{2ghlv6Ql@l^X!lEGrqj`Osn*0<}Ph?09WGo$H1l;|-1|*#=nLzKcZO!onYzGjHSz|snV-8u$j$fC{tMHY(EvK_ab^&e zndiI?=R{z_w5eAJv$@lDkIwAi<|kxZ-b-wOJd~i|g918ItrR&SrJ&lFgaX>Gkc84q z?nv-EQmLJMVn>R}({!F;CTTi{PV+mnnVmepGn3iHXBfffFELEXPu@v@#kKZ|mrqwgd;|AG6DO&$1vEdBO{6imqan`9>A~xfnGp^rM-N(e(lW6HH|R8w}b{?u()&b z$lWU|cOT8}TzG!oy7%UV^7-97zx#Z7;pV;8e4cyZ(X9_1%Vdr{wDsrCJ7FrCSIakastNk@AHTM^ZCOvZN)u@aR1{0V&_E}M}hx`jH6RKZd+Km zeaH4Y78mc_K6^BsJ~BIZIGsAuzxJB5XJ50r`kJ%Xzjm#-`SAm*k2e~RudY6}nONp0 zvHAGf)7=>d+uYDu;3shN%>2KM6Db)=4;B#GM7) z#h~f3#6fp`IJNAZJS6P7(~>i;&M$5WG>TuC{910`mPlbQe`3F3sZp7WR`<;O6gb2Z zFOCt_<4{$;2dVI=b5NxL79yC}>JzPw^qpPC?IUI*VTNVyk(j#~Gmrj? zAl4D`RuU^c7@$6k0b!N&6keR)h{EWYNKR$7B4>tA@JX?x1R92g3wlj{`}WD^&FI$V zN73Z#(-{Bf-^nz30r(+B{J`K}Qf{g&6#I}GxyFgNI~;+rxF@>P5%Lw2n1I@G#Uw|^ zJdtd7h2jf#;hIwENpr#47=z}T_otJVok_kCi#AeoCoC!JJ^jL&xtTL%yAAbZn`ina zICe`iwKZ0m9o}{jJd!7Rtzxxb50w#;pcsi#RgzS?GyiJSFruWbj-pTtvTP7at1dAc z0yC#dh2v#M()!Elr=ncp^ek76M5)YEO1pK2;M6nS+AK>W;r*G6ZXrLU((Q|QXnX<`B?hXYFNaabT zYWo}|=dKYJ@wWZhIX%tEY#NXCSS1!0xgqL7kmzR3I31G1x( z9jiXMVv4!l0y(MYq6j{x@+me}I5j(cx>P(aIFci)@oJa^kgG%^6=W!$omx0kDx931 zJDKkvn20v`L_HdB`xbFEN1; zzqeS}n@H>{OjWDp=}JXE^OSo1DKq4~_SBi|h5f7N&L7x+fg%Ja#=isicCwWRmn0;% z_N=q@hT`)N;@%X6$XKD!O+>d1*g9Y!Y_)Z;HL0+b9E0(a+1?|vl}>}|4QLIa&HuS8 zk=->X>>o(?6(iwO*WY*#6p(I848O#Azq4mufS5txe7~rI$27a zQE+lEz6E`*&$A=OVhfIWBl`6B@$YU z8XN=9U3%2*3Rk&ksT5_4MSXZB#w`Wa+Rwc=QVWyGm@aXgP>ORUqQOm^cog?`qh%{7 z@`yJBE%VbqYrY$)&{q>liqJAnYBVd9*Z7X+R!3HsndIJ{^vrfGkH_7r@sNuy;x5?KhMBFlK9Q4hm5|CVFf z9K0ZI6h-1@g1B9Vl}XV}5H=}jz)I0w>8`9)6t6BlGBFXZ#ADS+Xelz_G(_ciy*FHo zkSLL;#g>B_ZBXE1f)L{bk&gdFx1g5;9bq<6hzLQd6D>A+y08&$V_$}i-y~xrxDRj^QqXhQf{msRKS-2FB5 zLS80go@lmFet~HtBY2T`^n|kJl)0$C92bMg^r2%kx0vNCeTkl^%jGlsC(iQMcxU{4 zITs(I8QL|>MCltOF8&kE60J^P!zH;Wwr2iu!gc(i^Gx=HL`lp@nf%139)0uxhfK}ia@PT543V z%LG)$b;oKE_{V32H#PtEDRga|2l^3v8f0u+DVk#8>}%4B^jn{p3I$v2gJJHmjUXx% z@URR!J~~3%XhR=mMb;k0IG^lz1$-SQ>e@d4fKd0iHreNs$$6V~+*1>r4C90s!?KK* zWwnb*PkP7@b+V-rYmXTQ)1Ktg6O7I2c028!&xG7`C`7wMGVNfVny4|T8fJnqsjTr^ z)DtbRn8^j%m}SiCC8JVdT^s5;NLQUZXSdh#{t`pyJm$d>IVMl1i%h;s7k%EmTN7p( znq_HE3@C@n=ob8Ypj_9xDgjkj$eI6#kVEA(q1dh zdUJ0Jbg1kp5z=YTvGIExSRL|tqax~nbi^lXSGbm@DCttS9dzdIphF7;b;jmzW86o? z)gQ5ZjvRfADhjzy)+vlrN;*mZ1b0Q9`G1Q#R3@y;5!S_j(rdDEz&e+S6H1h*r{GXVCT+P6EO*P zF<>2uMo7Fi9upkEy5$XnTY{ar19l7O8lD$dd&H&&{=Lk*DWN3uuAOsQVq(W!y&Ue$ zm%yF*e~CL(ULw339Edn$C4sfGhM^RbT>9_s-UG0W<5(Ep*}Z~7QUpN|>?DZB-T)9J z2$G=K#3qtz6eU^3q6%e4?zUWF%PsD`q&U@oic5N2((U&gzc{@oe~O**(wx^_QtS}= zXZG$uut-+?{hboZ;cjPVXJ>b3W@l!B1xm~O{<6}*w;PQKuTje7=6H3pD$3~THfB5` zNR}R)34r0~-jC_OsytPuHtaTMy;Dwmfxg<6^B!z?yT313+ZzbTsZVRPRwLSvin5=e z{`)^dS9VbbecVH1{FA>l_Sj1B`g8n6ymy9m53GA(_DguHEVp~ry&%H8QI^}Y>Rt%T zeOTVxyQ;oAEO(QE~GbSpB;Wv!Y{S&W=@EZ3Q%==-y ze^}_unV)Utr!p$GFdXGxbN-D1X!{kN59bqx?~` zd>!6@m%M+GdH*u={;0fPgZKCHKjHmL%=;-oAtxqNW2aQk3D z#0cIwgw_msSP)*ko6RG2ZYS#C`*V^yx5J(I$rNX?xl>`KN4k`L7##co zFIx1@6O0q}2*YT5_xL9RxcA~&O#qqDzksB2!S`owQ_OWXUEC4jKY&!}SGuSrUS344 zFtDUCb}yZrVvLm^8`;tP2BCLt=gtdGcargM$T|FS5|CXeq6TRQE>xvOPprCt}?<=8IJXx*{c| zUBgYf-a6{X7PT}_wIaP6(TndZlHPA$PH)LkzhI9-O6ZcKeqqdazcBnB5}>dL;GnSs zB?ZAb*$o_McmdN@<^-p(mO^t8Jj=`n4a!mmY8tnXK_Tor4OsE^j&R6?_2oc2Kx-h_ z-u_r5=x=ZL2T4|q!42?!X-fB{N^_k zFC@N!fB2Dj;RVtKPyFxjfN;^dDyclYhU*z)7aOxB`OfhX*fdfry4V{$tKze;WhDJ^ z`7p4y6YpX_;tuAddDzGs0}ug9fo&(q#L96$_2CDiZLx#VbGr_Xynp7ycVGSF_V?4{ zg;@S`rzkJOg#9#x3!|M~=S2@i52oI~{fTStd}xNsWBr$cMwza&%llztk=Zgiln?=# zr#!J?Vq!yLVruG!`QKb{;cxcM{_6M@zr~pdp*#+n2ntPkkR=V?PZIAFewVTrPXRwW z>Yy+&xp8WOD!F0qw^tnh)$G3CTzJ8649}&<*^3hX2Uoy%BmT526=3mH)B&n-rh*EJ zy1+mK28P(b&l3BqD$qjb#$9dB0uaa~We>$;9VCK=V<9sugl8$@8k_#ts;cS`fTy^` z!y!~%RnrQ zy9DvBAiT-;Qw~N7a0V&|R9BePRusiRTiMv?3;Kf9q!Q6#u`!Y^CDQmUWZ?iufDta-Mo!|Um)K$N9Sg4k9_Y#&;I z?RLc0h1lveQ<$o3mNsQARbF!m-~PE{$3AyMf-iO<)a?k>C80jDng;Cq7F5&mHCqj_ zppue}uaeIp*c-&TU5moRmVIBs{pbp~ZR}DUQ!g$b6Wwx5IEowMYmBK&myand|G86? zUp=NST{fo1*nhw~Al)rFuRr-)N#7G+g_jwzOZBI;`N5Ob|0#_PdS!baPS19A8M5r1QkHcP z){d33Y@s2`n!+PWvvth_0jMZF*Et-Sp08@w5yIUF;bnx7OAvBbLhu?8;+`cScdKe$ z^P~g=Tx1||Hp6`o<*yRVe1ClKzWWB>0awV6nJ*fD#E%v1 zDR`d8k(2+K9W|uDqsYl`uEt;_9`<`x`3^Aj_O}n+pMIPCu&P{E<5!l|2vj5c8`UVi zn>eT1R#Lpc7>-$unptWI`73IaH#ieTtmp*SKj66&);TM)* z>2~Y!h}ShV1e=D2M@DuAkKcRcz?JtN5AGbfWA_;^2mUqi^wUqr=i@M&ei%Q#4@&y) z56sWgg1`I3yZL2e5-~1A9BNq`JCvGtf#iK`aO#eQ z+t8WX|25ZA1+-40_1d7Xw%dkNWK39H$M)^q4 zz#3`K-fxweD%|J{=WaLSK}Gh(?jLsrj$XdLtFbMzvnSB?6TGQW!*3Co1o1m46Ov}qzkTtV= zQ+b78Q}Y1xtYbSUcYhA*5G@)gs;Zo845jmOz|I^_yWfax#_!3f5=~S> zxn2Mf?hT)xOO=K~6&0c8P*YvFB3Kcq!OpJC_ze?@=#`xwnrLLw$smldzU;muu`jWG zFA-?-2!6ez|KEu||Nb&jXMTSEQ0_U~4El_mnRj@eC}dD4eV;)W@-{@O{1B;9$->N^ zst))oizrS8bu^wsqcNjccnXpKy{K8ldO7L8I%bme#+y0eXK21&Aa&T)%;B!CfwRY4 zJ>?4*N=-PYl)~)yMP5*V^l8qZL8JM5b;#2iyJySZrPM_{6tDlN%b94H^ zhmIV1_@EBQciy^1U%W!!aw~bhGRCXqiRD2$&A7%_Ug*lpb=Wo4z%a{1=Pr;q`iOu_ zIEF%5I0_5LK%)O}am=%!rDcOBR(!ZWF|g3xy)f`Fx?QwQH15+kM9S-NcJw2^=?_wfDzYy|N2fH>^Qc}bPaC2=Fsi(zW zG^pEUj8(kIi#n;Uxqk&D_-%BkV>>TdUnny|ZFc9{r;Uhm3lZqMn;?L9D*-&3-y zXG?E&k88Zcg+I3e{=WTf6KBnRpt*K?d-HZR{p-#H1DpFN<`3ub?K|!9iQ2Nx@f^M* zJW^IaU3S@l-0f%N9)58C*pp5CeYuM_MI=p4~&=fmRBXq#%ssJVSFo1R#)|u;FsFk@jnK8L!sVa zs3#cg362-yAO0Ro^>*Ti+f!74AMw8a=y(_2mJfyS3!^;O$PeAf4?)(%Vzf(E0E&o3 zn|#%k6*R7#pag+|Fp?EWvENd`>L!hjZET>Wz%V$;;U;sZtz>1d*M%EKmE0=~<=N#m zOlU4>O7!mSn4NBFpYU|K&z?*qcgLqUwOrSpSl54MuX`}Dsc$Z_e$)E-IVH9&zF~iH zE;Kra;-22UdAqjr$aWmN#d+x;yKeHdY>MmfQO{_5&zMO6YS+5HME3>_N|}&jvK7Z< zDXT}m|KSt)g4^t5Vsjvix2YgB;5zO9>&$M`?F+eJ%K_%Ju?1#2M&pomIvsnM!x3;$ z9!xJ5Y+bV;W41ZS;f$?O?oHH%=`sD~Wx$#-2qjQcR$pFkoU`I|U}??p>d!-kJ!p9K zFQrpDxnH$PPPqAzEydlK(s6jWbS8pfgPnU)4MXAZP(#B|UF}eM5&k*ddrM7MG_3zuj^kp*`Hyu_ETas;6il`aWd`JIU`Jn=7Y& zbI(WPj}G=w+(`YVo=4*!9qi!{SEUa*W1RMUU6k#DDYU&U4(Y&c=58`s78w$BGCTKL zCW1v`gamfc3vs!s|GDR2fBHS}wshC@^j+~glTeae{AHY(tH=p4$tqZgH4$}c@^S?i ze$ey^08LDIK!I_lDylhUaHeZq&nA?nS=~?3RjwkJheCSF*KM3i^hP@Zx_*>7Y}tppO{%+ z-mobyw(oEr`tYH{A4IOaa{Eo&9E-;tTW+cvyLebYu644;X6$vZ5oN`MLfm_t*)+Rm zvmaLh7;}=z+35hy=G4eN$_f&&+x30O0`k+ zX|Cgb;&+qNdw5Zzuxo!`a{oZifai?Pq1n>(k(6iIFJ*A&;-BCn@nB0A9-6c<($hKK z*Ix5|x{NeUwfDrwQtdTylQ%wyyx}Il5u3&pyCLBpCZR7Q;%5o;4kN570ue!5Ehx;p z{KOX5_TK?w&R97fMM=6bVsVGj6 z&Z^*`apDF^uDVJ4QchZ=TtQ7?VL?ra&%gmGQPa%j)&)tLk#;YBAUi~i#f3Z*@WYCY z;ZLR?A3A4aUE5qw!dp^OoJj4=8!EVFN20i-xHvI+$>6Th4<(~>=k*L;y3_ml=M?3+ z&ll|-+;dIo!JR_vJXCb(9lOtdpw${pv&aVlwjnj-rcgnkAV)hWLRAhqKsdqh8Phbg z6**b02vEjBw8Iw${YxQ()D|o0-HObjH2RHK3oND|`W*gk8y((Z@6Nq)Zs0)YJpCoU zkIGT^#O&lq?ymVbn(9ecGBNF@y#=!NT84jDzOhQ=gLGCBTmV0AooQ@gSyEF_Z6p$C zH+atpbr;OezmiI%F6m43ef!sCiLy)Z zMKs%in4EzSKLH(I$^ucpBFdci;uk8c}1LlzWw7JCFHBP2to63a6&gikh9h( zWuKJ479`ad^ts88$Z(fbaq ze{FiY{|m#r?CE#GLHn*@2)E58-(ph`^FhlGOa0RHLMP=wxniqbgt&v zxEus%G7#$=oaZC5F34xV@)235bJ;ReUtix+-`v=MdUmkJhdT|(p)OYqF7^e!{DKVD zgfxl4_(7VsH6Gj&f3;A@p;M$<&DeN;*-T1NQZr@eZ^VXBQ(8v7=_lZ@iVN0$HT@14 zEgEfs@IWF?DSP9Ifw#tY#KB%uwZFJ%hv!TERW*!p*}esAUorEs^Nd}&pwmG^U2t{T z+G)2h>w&UVJ@$?&9JA~VAExd?fx=f(U0zDO7V>4npN+}D^3IbCCp*p3m}w3E+=jE0 z$+I_@&79o3ck-_Io~{D}0|&a&7sdCWwPb9^*!WJgFYU%NYkJ80f&CBd+lyQIl}u*a zWsF}(UT}0~Pz3;tGffeScD}JTt4z^U1@RX);C8_ge*pU|wt`Gac9=r6kMv?He_U!I5X7*L{dIEy+YnLYVYvbvk8xgDUKhmn_ zBr5{B>`8Gh%jv@Mx3K&Iv1+#&r|E)UrK`W&{~dhepN=njd213W4H>9j^4d2nc$OXk zEZ?-rf*EIMHLs*V+JI^GwH60iiLpS8zN7zs{G+Pg@s4+Vy7^ZxHzk@b#@Ba~$$zD< z%}k+s#nqDr>S}!&DE-sm+KUYoUH9S&zh}^i>q*=Tf^pHfX~`>5pAC2xnf^ zy<#pm=JVHHi@*Bn%O=hE9>l$fGWX@dDlveQddzV6(3EHFcu0NN#M8<)Y>st_r-7o! zf72cPx8HvIReu?M;f2w^9>3#`cfRwTWCgu4{V~{_z9v4;fX%YM!ZiF3%R7l@gH2<3 zkS8?h+0YSQ@-+UTztac9F@KlO*Y#Il!XF*+#r^(-Pi9j73Opr(t9RlxW7j@JyY@*T zZ5Bt_z3?!cD=pJCsVc%iknk%w7qh0bjNnt$P>S0kCiLLzD0HWvm9Ip{FFFVgTmTRA zsndevSOX3(Avl2e{0Z@?KG_Z%ZSTjea)0VzR06(+B~F~I1Z`frGc|p!!;A(F!z;{5 znWGfo>guoqS9WBprEshwUJ+_F20X zqc7N0St^XrYQ}cMDW9B6sv@!Qe<_LpC$K5$E*C-B;DQy)Bh;6U;d znD;vQ32MVQ>*Kk+1=}E2^!6ZYg73i}n1;PAsJG+6SkR-YgK%5=0_aaa)$~mCne`96 zo1hG`1^6EKBNX)%P!xiKK!P#V1K&$Og+MN7>VNkG>z|1(gP|{j!SN1*@5Ap9hJ$*{ z@R4Hr8e5xQnpjLcX;2%u(r(A?>GLmtAo@W6g%^G?!TxcWCf39V@cs06pe=pA1c~ta zABd*^L@|S*_}UuXzaYN8>+{Laem0qY zJjpWS{Bop`a~a2Rww)d2WAJHdOW2y)RHgs6?1ySvjkdENatF*|`?{phL9+m0 zDhHL?!1$bz7+T|u(^^%CI}Eu_RLcZ8xs#U>IU@u~^;|+SVxSIpwGSw9Em&Gw7jE&j z4XbfATu$GA*q^Gc_EvgR{b3(|5I6L)THX#NOr<@1!%H1Fm+V5*2Jk5}FeMm~IlR4d zaAncgEgG}av2EM#*h$B>ZQHhO+qT`YZQHu({(WE7y?@;M-mO>ls&*wg`|PvU#2Dk` z%yssf@t+xzM?J>oU%`jR7e15#>%pGM&9mBIIDw=#8%rrNO_d?QjPJ3}4*(517=VED zV9k;PN7k5ax0M30gWEG-pVr63mNtZI_(ePPj9?B7%!_aikV3MCJiOQjIz9sR(1G-Z zQC+{Oke1oxmnTlyeot7(l$RqxpU(gAzq;+8S%kR0F-wDm2~+w5RxGwoo=P8u+mbZ!QP;Nv8l1ljPg9fss7^}rv|)>K)7-Oz<}1&0s?I8*1lD$Ez6cKcoN505;U>bmMW)& zU-i$icxHVRsUqN-WToXj>f4!`+Q&G|D}XWUjpqdCo5 zO-OAz*ZrhYsb-N}o9o@y$FVvGt3Bcq2S@gfS(lSP+r;)4vjkj#xCs}M1-tA39Rs7F z2|(ZbAOnL$s;MCyR(OQ@p>>bc(=6r650|EyemPRtf3($IbV(>__aDBYt$MhM4DGi+ zJI?KfubUsH?4&VF9&z`+rPTV4id+OrnmzKy|f)IJ8nA##j6XDLS)0h zeQqBOeGt0CO86c!f|^r2Q5Sy;ep;bs;gc_x_bu*0Sjj@{-pjPKOC7SEJL2s<)#m&a z)+iw({aVY|ktP)jmbf94-1{YdZf53D8#dLwGsxm4<1HD3Ej>w6@zNQ?gw=`1dT6<$ zDq!O2oFwdfjh;y7qqKXwBP57mfwiN$18A}OO7$Qx>bA^U`|;1pH_~BnR#;0OWEkiz zA{bA~Du2qXr%qRl{;Pa-LijrZPpL=!W(?F`?~HfSi?H)6x&AdM=U(F<-b^HHi1p?7 zT)ienOz~C&^#Q%rPV4TppIdI)!`x2}bbes6E#X_9X@9Ux%2Z)s@<66$d4gYXj7Yz< z+Z!fK#<|p?phX`Y<1f}J5o11T&k6^xz40 zGAt+m;v9)xz4vUW8-zOr>jGC72*$WnHG|m_sHD$N-c_M(O2##E;Wf+>8n)iIdT$K! z=D9n=FOb4At&hqI%&y9lgx259R58P@L^!)00Y^r~?;kc?U>J)Kn*VMt*(J&*klUjD z@M~>e;$0t|U#g2EQ5tjLb>8zYs=4(p^`?U zb<<~ovP#a6kEQUZr6;llGO?kz- z&KysTE9K5xtrrB-VCDsrd*Rytz>fmDK*~5rD$DE--f?*?yT8F|!RW>_Hsmg3T-!_Q zLoX&}J`-!fxSMd~>!b2Tg*+DbMwXCMYd~a3_sz7M$p4dP=eS~^t|KW6-yC})`@Xc# zI4$`(Hv+!-<<$Z~Be?}NbI&@r72_nFMgza7rnCToQ63dH$Gdr?Dswu(r<8^~NJl~* zlWK=7G=tpf^V}%dXQQ7c3t6109gUm+{yI25iMRrCK(l9oP0V7fui(gIqD2LY|CxP~ zeoe9ylF*itCEx}$Gk4*a-#4WF@dn8jh4s8es)g?fXuMK|sC`6hG+9TRR!=q428kb0 z0(s*zn$K14mB<9Mx`n$J72`Js~k2meLmtL$M9?gtH_qi?njEs*qSJ_ILf9V9i!f;>dnBA@E z-9xcYWK;pk8|hvxiUZA~Vq$WvabZ;*&+&L-DIm;K^?4{Lt$z8>-^o`i@v-h=RD%T9 z)gsLaugy#{nw^{o+m-!Aq-JD$A~i%=-Dt7bhVXt!5S;b_ikZ=I@zraig7?J2p9=@1F9`+1*`F z>u*hyo8DTu%Vxot>A`*K;NVS+BqQMw-WYFWBLpK({iVK5cE#J`dE>d1Wn(XbNxX&V zhsY|it98}IU5k53#k3&!CWa9a?uO_5%Ri)=$aWX*0!qP+;sgTuXI&{SCj~G90os}# zku^I$cFc!hxyZ)kCnw`4O)N{yDE#tN)EzC1b)D_?Wuz)3%cUKH;*nSN11-p%y*g?FaN=fe4N8N67te3N- z>A}b?2eRV~OKXUw=4jZ<$Gt4uGfCNwhFmA{NS~A}6&N-Xh9( zqAi?q?bTKS@*6p*j1`VncFF7*{*E_MNwfPwt2;@n4?>qSi^oHK2*&o7`o_*8re8=F z_Dl;b4&nU9<^q=M(p*C3&SM(w;LA9s+3T|lE6X`0X|eiZ;CyB+MW<{)ir{1#iYVtp zt5LWbZsc}#3>dG@A`OkLPB~V1?wQVMD66b$XZ=a}hh|VHy>kXpXG6?clC~QnR+%Jc zYH#aZtV>IcgeYsV0!i!?5=N~j>a`Yc>%{(b z*HPhMqd3mGWlaTTx@&*7n_f?6SG%G%xJS8d8IT_Mcw|C72np%WbfDvS+65ZSIr(;A zMWMa8!o^wIt<-Z=AQWrko68E~3OXt@mO%u~N)ATK=rC|6@))O-)*_I0CF<0>V zN}gQ_jpR_fS&g7}zV8IEF*)vwg?aXx5#5b&d5;i8?cBmO4JUmS@2G9-k5$QCQipgE zK!w4Ch1F(43eBDonjU?MWt`?3S5=l)Ym)y25}#a^%S zVOM@vJ%+PT3P$G%8FHIil!2(WOQo|eAGuz5NEjv6xDdhMr+u2Czf0ONyAUx-^0gP2 z_BI|>^z|dOh`?{n9#7i>AA)tV}t9!ekiAg4Rs54b%-(uW!f2y;Le z6Qhj_IG>}_yI#`go2darJwAD>+A?G*su_CU{LdxWzEP#(9`-;Q$(3)`qXK2Wy44pvPTWMS8jE_*ivv z&s-JO5mL`KjeB;ezBfABtA7>p8&h929{r@>n&DxcG`b1*zN!O$@}G zPyto<)HbXfX67C^9bCI3mnB|zhKruQg;eV4cq6p)7?&PDHcs{ z;reLp`tExBuf{$7XUHS-FM~NOn9jk;1+p(sA;QjMx@x27*`GzXFwqTewybXq-pGsO z&OIDnV#3Ys19dq!Pknr!njGlC=u5*ZwwG41`7js{%TgpeZsTu%mte^^-$q9EhL!!&FDqnk{NdFZplxV2 zw4!bn;WQ7W8OT&ZY{1AKF{~o?QR=PH{rPNSw1bL3Vi5yA-ToQSB6|#(?^C0dy=T1&%erc5 zL`8q{eFfcyKy_=&H`NB}<{>5(Ik-EXVb`EL0})lbra{)Fv9I4o4SqSfM$sCQgX=U{07e{-p_a=>EvwRPQt-JQ7eC!^!0C;dO z0?erK9VcetfEM=L_T9@AZf~j=Aued_+-Cx=h9*PvdNY<+gEmB4~8^NNTkJ;nKGdevB@ViM?vW9^Gow!*Yr$ z(C0ypp()1_%u)>1;qZ`g4 zFhe*q=2SrVb#a*Zy?Zzpc2~4zvD!LUwG;GITbELkQBascqPB&Hp&^2G>G3`4Bfb@o zcR>P>I^!YxQqxT)^&?BMkDNO>W=G`IT2nD%plE&OXwJkeQ`A$IVbd}nNamBV)S)X% z3|h%YWfufYQp5r)`0Q#*goRpSoc87Zl45@GVohW+WP~qWBUMM}G?zQ*O*9`&6GV6& zd)P}mP}n0`Fgc{veZpiaAEC?6TVYdv<|{fInmt^ic6&+2nT@5tA(?CaL$1ujJ4Y7O zP-dJq2M1tpufy>6I7K@LX70EQ**zn@XTJhYFdNjnCYp_i z^s^!rOImKG;)J}CLVjQdDLr{|xJmxHHj24&f0a}^1I~jud}@xRYX+=#&*7t3%qIuK z3(oo?oIs&zFZ{w9Ok9H>-}G7u8fwNKuH{ckIX_Ir`Wg;PS=v28b(MZdg>m83@*z1r3I_{?c$V4zU$W5%gttE=O516Y|^;ynI_ zs(f^O!KIGy7C%f=ujQzCuwczsY~bPw{BZz?jz#mezq{l<7fVT%3k*-}eMf}u+yD`}7D{-`&v;&*AUiB;8l5w?gtrmj|MnI@KsDZjtl)W^lH#D!E) z?B_(+rKvl{fA3!CNeS^KF#Ay#68*Y0u6qB)Te?}Z)n2x_*hS4&+SC;6SDUmwdisIo zsy5ro(r~(+M(7iNghKX#TS5c7iPU6qUuUq+GLM+Z3-ZYeMPm#$Y zW2MM!G(4u1{wX(q0?jg~R;b_--q-p>)9(mq+o`ZV#YHt@#R^hP!g)L~gyMbOU!`ob}jnK zbM1jiiVGJdk57lXxGGkNGj`6e*mQfLKV2-~f$~D{ZHWX4g1tZA8pMwn6!;bH}L0GoApQZ&*Cpu*O=e-j7;F}K!ER^$)9uZ zm|pKU&Ce1cUa&hG_h;)jA0~>9R7#r2QoNDfXr}$wsUZ)H`W!Q|T=7D~JS~PxJWgEAq^hO!Le=?DBXGXPoYS2ro=W z{U{uI8*aDx)A&#+b=1eoccd6~qdNWidBfvV=>ji_Fvo`Ors;Tc;Jj}3R z;3-!@C%8l9WkasCoQX`?apZT`kD7tY@%4WFawLGnOT$JRado8GLq>uou{n9gqVH!s z#H;G}p`NBXqd05JI9e^xK(5}&Vdl~*oY84bq3Akx!w0mY?B;$IuyF!@b$)RWFQ9$) zJVcj&tZ5R^eDfA@ya9yXDFHBT$UvV97DmHJgw^D`J~(~;+b-vLqfkSk*u(CjE8kt{ zoTk(2g3NROv#t4@EHatv^|39VGuO6YZ#`;9*CU?-Ocw~{nOlOs%__|E;nW{a^6UNO zNO!j=3ez1HOXH@1UxuFwtC(#)@F-j63yZ`J7U#GVUf0fpAxx(0sewS>a!@G}$&%9i zb&;+Ci%wfUEt(XfY*Nr!;^^lA|D`~Py{BGA45cIW*)4dCeao3>1 z1hNbU{O(G|3rajaJ5Mumw)?3=D_IwbHcyi7xHp!b4Rx0XRe#cY#DnY2q^;pQlEzEK zU;;(vWW=l>UlNmTbS)4I8lUasc@CTT1@x#2TUT_!51brw#=2M2G%3b2O%q3mjW6{; z$Ol{$5{Ep3F$7RbgHRc?1Pex>!;BR``;`W!-Th}Ca{ZM1bG7;jv#=_ty0@=dvfR&X z0`YfTIYx>m7eL9eMnE8XfWRGIKlexpfAeTY40}2t%B+BP}~7p!@4FRT*#VBsLh%kzTF z#waQyxY#dDhaoO7We{Gf{5%$BaF7*o%6udAyn7`Cd$uVl!Fg!P?f8O3ywJM`l`A-8 zK+h!CxJ=#r08sUDZDWKwa2Q}+&3vSGPaJTMH!eCjme#nPkKPK5Fg*Bz*7EOuPWyf` zUZiK`d@*uZJu1ExV%+H_hqn5&O--4_zodSJy1vlA?Xu(sj zWj!Ni`C{Dms)?lY6xy}h`(?B#_DkzE>NS>bJwtJQ{29xcr15Y37^FfyaXgAfw>ni< z6`=`i!Au=m33{cmG2b`hcfW?!6npY=W888w{^Xa)4P=pT566cZVPoO6y6O{YhFRh1 zSiFe;$T8l>^z8Ym;Du9CgU@OQ>tUGx*v+)s{KO&)`n#!7xkae&5m!(4%sm%&?j{qT zv)$CPNLuPs&jQvHIuE5Tf>r80^8KjL&ge^f80PsHnU&!*i)%XhQY>qF<(5q% z*~b{{oCMaznoeu_)t<36TY%vC$1w>F{ZVYEDSOgvCkb;?g0m~4>_;8Yu~AktA(u35 z`*!y>gNjQU&izu&>rTU(PwUCCiSf$6733a!1fsbf2jr)@p86!J^NPdF<`;I8+m_Op z%xB7|-Atc^`_->HqBnV-kL43Q9tV}TJf8Ze$=(i{c|Si%A#i>Wh5-TibV^vRHGLls z)=N=F8-( z`SM97)f&v^ssxH@Hr(z{=d62j@cV@$Fc_`+3drY-Cej$Kd-I6LmHJfBn$0HLBI)2s z`l~0e&BmLs+aJ$^$-#H}bMtGCmqX{^oDbInC6uc+S{#oy{Y7N5IztA&ApO7v$pOd! ze5{WwPN>Wc)|%EVyw;j3D<}id#mG(3RoPuZg$hMiEW#_BR;+?EomMQPJ0DlBeEfg1 zpNHf}v0nznOS4}@)W z({|pjVp3qG%q(c)D2#Q2wHd+r5lP{V~VK(0M6Ou@(RB1fSm*IKaEw`4v-S}>bdAsKAw+)yJ z1ONrFd`A5@?p>1L-wSK)lkFYT!5$OEEu%*sqe~v+PwylAUWdwFM>3y>*}sWoD+Eg! z4k#4LWh629>zbjYHav}RCS3cQ_+wI|mRp(EPE}?KFI;-w%f+?fXR2^*ab_Y<(hQlyvkKXfgLi1VyRL-%k1gAc?ebHUvnr5sp}g5r`Vf})WGKtMWoZ2 zjy0gyA5N&(n2gpTmoHYV)u0D9S*(R-kkw%lKc4?J$2Nh(_LM5DFtgp}WULXh`EuPo z<_1knM)q(ed`VQO>f0;=L{}cq7x)*i*S|!0O%54o{sQR*PQv~L08ry4v!N+diL&Jzta>e{VNr$Oc1S-SIf|&B>=; zk?j8>q=28GSX`lKB8g^@q-x#4NFpik05X{ZQWFxTY?)*$RHCj(q8YQ$v}W7G@j~&I58wX=dqx{UQtC|?%ZW$o-}qK_rrRf0(alXZiyd$BMTq{6rjiUp7-6zFnZXyAC7MbagE6KKS{%|PyG|GbLaPqwCDkMtQZ0EZ)x;@Qki=8f zjq1Xfs}8#vlBqc%j}nt&?kn+Nt`tytD&wR-_)%LJVy><9N;}o2bDtaHzOnc4{j^OX z#5zD5X73e~j+MZ9LHaEUKe%kWJrIZqtL53fPLv_S94SHHq>?@pR^8Fr7V;4HEu|u)cG6iF07ryqj!chIt6iWnU zU88QEi`C^B^D-hIksOhgafdCkE1Hozsu?II(`~n4x&ya~`SHLi!|Dt6$0vm0?ZoJ9 z?eYAx=B(PNeBVRxQ8WhlkOFl-BqOH2`8;OKA z!;!%sk*@uoWO7%}+1~c+@aW?)`fl*x#>(EdmV13r^kXoGik1Zyn0x!MrB%Ne zv{lbcMX5I35P9dlVS3&pQ6pjm2hy&m5+|d2|1AG3AcLNPL;WD?hEjNc+ai&3>^-l; z>*}#-Nd|9c@@#qRSnUT1P=HPxNi(czROXKkC^*(Y{J3Y5a@^VQZ) ztI5#el#Sz(o%|RbJyRiPS7!6e)V`mm{_w-8euae$cK`yCsN)4sy8J&Q`llR|z{{56 zH+H|~aOP%$IbdcSjSP$&7XcxA-}D|>xz~4YYzSW~;8V!AFfg>0{2J8uvT+OG_-Tvo zMbF57HD6VUG-D>oZfh?z=Om&+b}vK1`m8c zR}N3K}qTD1<1?V#FZ~-ruM(N8i{O z7z8Nd^|8Hj6Ee~OAs^zEmQ9Tt>lir5@*ztLyGz9U%|q_+ zSOJ7gyLBM<`Q2-P=dDVM{h*y~EgiQFwlZGPj+=~EFks9*%b$mwcj)?v*Xa{EHP1qC z9D&K2fr zyk20bgHUW*ta66W>r@J~{X_BwC+qi=Idok+K%(EXD54#O{hQ6J%T;516+u-Tuj(k- z5*_=S4pW&G-j*+6-Dc#M`b`{1eJ!-gdqW7d?N#I1*fUnTp=L^0P!YgT1{v&y1e zEGSqAW-fd;!}blNUNz~E&)E@(@^6bQ+r#;a0atUzCs+Tac?ebiFS5SZgD}4%Uozi< zS!%n~V*cGA=GzfD+T_0s^9}1>&Y}S$4U>PkvwW+UQx_hN63~e5nIAbW07ABIs*7r1 zRym8Y|C^LV4*I_X`ca^7*fl+iVQnd$+f>!DgBRR z^|$_oNn*rROG?~7#cEyu7uRIX&##n_nt7ef8SULY5QKGfTugL$-E0 zW#^0_Y6E#!`{CwTzk&0Z-hXhJcTSl4t8bj=t58btmsyPwlk)bzV10ZB{)d|@yc%=U zo1dZE`hg|;0k^fW@Cv?AtUC0D&8@L3Qr}2C-%H*S6@w}5>nXrS^vBMrT(Ux-F!2Or=2(lJJGO4bCTFZ{FGNXajTbGLNm(U{@96x z-Q?rv-QJh0c`XlTR!5^v-SqbphtE^$-&Y+zQjdG1)nfhLSI; z*$#GUc9D{JJ2ID>JRqCgJRplu(TU0JTzH`&-=T5+C2aMrzBzKm7XP6&c52kW;m~lY z{|nKUe_677zytJ+-qz&1_R8Kg?7LKkzvA84-FCG(|4%b!|7ixr=kDiy>a8F?#T9mt zurMmJ!j3_MjJuqF<4^W~5_D7ibYn;QDcnHaD<_h zWqt8K>$N_|lFhvxwX0sf#^|aKhivg6v~BX@&n0;E!};`Fh=^Yf?A)AWcSZTBAx-$m zHmZ4n=VGu}p3g4P5&AU_tWl@K?~=c!`#vl-u*B#Mk^&8}4)M`^=~H|JY(R>1zz%ib z-$m3s%?eJd5{OWYhDRG!O?RnON+N?0)bAhkraieW#p;M^HPEdRfH?QRZ=0NRg89A- zaE^~D*APt!6wM#<^uI^nL5oDNK_e5h+E}Q}L~HA= zjpzT~5>^+iA-maesU-8AsoLG`y)JhXf;f6q#(b8a`EfVCXy^mMK;zRNnh~)0=}ax& z!c=!%3D~$%bKvDIwd%-$g43OXSLG{pqIL(qw-i)_3$U2Ayx&deRt37>&JMcmI>Pq9?r5WKEFzN~^xL9v!r$kIa#zcZD=(4W=WgUQo5wagVnt!N1vUDo^ zQ{<2g>Lc_rf(4XOZ{KF`q~rxVdA>xxQ0G8xL|K9-VXaUI7a*gJ9|vqg5FuUXQUelq zH}2`8#`2uiab9t29E=P$u@1&Es-!ZeT_WB0&Lo3asCXU^AkwkP+h`Nm@pRpQ+MgoT z_izvAU=6Cj4E6X^jb!b>`tL2|aRMx-RyL&dBs+DWJ@2;Xx z7)e|dhv$=6@uL2mT_;9eDv5hm8HYtfsPoY0LqznRHpvLUTm!f-)H~=63;MW%btP3FZlzhUDUGRk{ngp-tNvTDzfLbbhSD*Tn0jhNt)#%%Mfc z6q-wpZIw&+eA&n8T{E!bJ}ONIe>}{KxmjdTEn}-zFgEH4-F9E`sy);{{aV>mTpq!>JN?B+dFT6764@+OT&8-pOeEcAKbxLrYXn4rd z5K`lV;!J>ZKyRI4PE|pv+ngV2^=K)bE-{E|%iF^Tv@WX<-bBj>w5AY%SumLZKtQQE z2swcZ@6#{pSVfezh8H@+vL=c$P%2-`tw{>2>g&Y;fsal({hFMaBFgG6V~fa=}xq$>Q$u zyTSkDv64Y^%%N6T{8c+HlhtjQ=`)jgOC-O$+y@Dr znk2v@wGVEQm0fL9g>$CgA)XbM&KR4mMDBjLb4oD^?oAKV7n`<(48!g zbgf6)^lu>T?eK&F)@PE!YwRu=Q`fem6Fybf^V?)QDBBFgjD4hH_I}kV+gJ&WL-A*RI_GC4I#}0H5ih9UG5knH5JKd_ zwofm#9i+>_UHAFCz-S|Q|6Msj8zmEF462RL=R!;wAtGT6ES1#fU`!dMGGYvFozUlj zRv95csShZm(r2es8KqFF4{EH?=f+$fAz`TxthCVQQ$A#K5LQG>HSgx_h!P+uPZDk+azP`r;>w>h2^dp#62m}Iwj|e|+ zW68)!) z^tZb7C(+8G7@Ye=$QozQHfvifYu7YuM>T8DRSRM(%q2G2B~^K%bIiPB3bSKWy>9b`>d)#L-s~Fe>>B;_;sg5<68#b&^Aa)r;z#=uR{auW z{StNc;*0wdnw{BC`#xsF+OZc!c{sf>j9WN#ruQ$kX{8lExA#>{Geu zSEd~NNE1oKwAqNmh8*Hb6DiEq|5py&u*qB#$=onaUsFxraD6S|r?@9Bxn#1s#5cR7 zJG&%5xn#pW$3#D;$UG-ZKWETB$5lV4SwEvJnR5g{$Npc=Gky0LnY?$<-M5(Cci`T) zsNQ$5U$dkh9CfrG$I}2{3?aQgbjkYBrXYkF!e%0LsrJyOK}Z-vMn>EMT}OdurHMI2P<5SOb=Vl380Jy_@vrY}#RG}T33oa>ObFHhn;)W=XwJZ z^AiGL^Xmi21e1VJfcjC?Qa)~bTfO~B_PRIzu73~c1kokv{xAk1L?1L6qD!)kFa|vbG^3bb?fQIQA`^-n`HmF?@uUpFkn zpZ%U3r0)2r?x8SDK&@yvh%)I8?!Lq3c+-%pxF*Qgow0lT>u6 zIo}9lKN2%%e$%^B;Mx+!2tt_}#0dR#MfxoWX{hj92*$CYb@M+j%+^ko$v5q~{){z3 zHjf3NZ&^Hmf2^Zfa`Z%z{@@uwUb@qmq5oc(&m7FWR(?&7P+SvHBhh-1?*ni-wB?t{ z1$TG(+*>LBS@n$HLFJ-)UAJwRTm0%A>F(z60B~jb@nq*&bT`^H=`BzV%sR#MMrG~a zZa@PfL2KX15!4D~GZ|+dTh9f2OBWOD%k^Vl7Y`QL6>X%ygdu{WpNrs@XKL;%*4^%b zOQchdRslozhm2pe_m)IHt+_{ZeRiI@q+Lr>r~RK$c_TH%(7QB!JWI^7Ev2rIp?Z;` z3m^Kmbzs`p{rWs~yf!8^AI2H|%Sr`t-P1z!wLY&srl~j`sCCrR9xmRKICZP4vw?Yh zioBm?{f2udg*93BP{bUdQjCG13v5nleot(9Y3xR8i@xScyu?Nsr$k00P2k#?8aJUU zyYNR+)051(;CtluY66oH1?+~}e0s1eh`-uRmJvHk*-SG&{1J|Z7^hrgdb7m#KjRif zjxSrh4Y;8}wez!x_LdpH@0=OdZqnLowcm|eszz3$)uUocAYdIAUq#UrZLxck6k1>m zr5X7|mr)PyBu7JC@O+T@RR8>${ra_U{rt6$tN21K@~E>60Psupx?A&mJ@N1ITWHww zA`Uu%sk?bb*ZeK-{@j-UPdQs@8)>{G`UtVIFcf)0sGPWAQJlDHNuiPwhG{~ilA2-h z_v-d>p|Ug>dP2CY@PSdBm}`omk`{_;LbRgNfpNSP=(3?Q-%oah5P50j!#D|{mIEc( zEEo9**f_~F;EGByL?LJ8C1=Ywp0y_U2+Q=|=o$o)NJFa-v zX-OKVomo=W&NkScFBB_Ym~hf=7-X+1pYXk{cu7Pbv~lrpCz2jn&N;gldxSqckytlt zcFwh1I$u3>H6=ei`8HLl9= zmamn1HE$UkKSO`EWg@meIfKvF^fxv(?g?vy{*+QK;H1N^1e7bL`lWB_p0S`H1=!Mcj3~qcWo? zS`pHiW$L#g4`X)el!sE+Z^M^7kJ8mU!xxmq9lm(+&Xu(V43?N$Kt13Aun-tHOgxrf z7Cy@WwSZNpR(FKpPAmpX>^k8Kjaf7 z)hS95-TNvDB>hksE!#3o`%|VB0w^V@N`FWwROpBasQ}f2=s^x3gb>3?;3fT{^8G)a z&{2_V9*ASCCE6Qy65j#bxUvw5oo@ar8~8MKE?d2l!CRum|UwCPS!?;F>f|u!rcHHBC7EG??P6?gD3p zyo1tYJ0u!uI|N}D2BC)urjKc)gUN0|3H$A^vG@);`t-<-sv%lao?@ALZ<$`|_b!sD zk{|o~jt$8Sh}|EiFERQe7ihIo!I0Ka*35Dw zh1S)`tzh;R$*oAk)kn}^gAI3TsH)_{&Jy+!sPq*}C92ZroEcPW#cXR7GE_2h0T~)8 zZA+hN#t$Gi3Uk{;V2^)t7sxnP^BD8YCr^mHvN)dZ&Fc%9)yS2Lb`L(`pRZ-D0NicX zz|@|~yRUZ{Xw_8PXLhDw+Q)xnsNb2qG0TjkAA$W?Ls)9kKh#@Bch%wu%PAtjDAQn@M^`NiRuh(h6(LKkU{6aPCkLhT%=F zZ8JH!wr$(CZQHhO+qP}nwvBH#MW)tYo|!)TCfTGGuHUxv(Be6KhPP(fPa<)i@C@KZ z2}!CF9-@+JTts6N{zjk%q~!Y?B*|`lyG)^nYBbF0Jg@V-&2s?H!#peTyvFmj@&)r1 z&)0nA8P6>|M=0<3{ur3ki7+4XoI}wuZ}EK3SDs)Vqdm3$ zPAm5Td_NQ&4HIFy3w39&SBJVdo(qdDT?y;m+rw6EH-6p-N4t6QxmRoXzUO-U``q1r z*Y0b7wWoepBJD4DsJ`(2zQ)`5==k>Z;1CufLrkX)0{i%&+n~vb#7-}i|K98Q^`dBL zy`s~~J@3<+=isFNd@sMg{C5Q!LrV{|J#>ZMFwh4(9L9Q}lVPUV??Po|W#^+y!M@vx z#7J~CZ1h66>wEFM`#lUN_49$Uva(mv+wc&c2i}U}aNYlw2wiAaf9tgH8GZ^9A#q=L z5!Gn}`#!LLenf0EA*6?_U_eUCxqJKEP|(uiqAWgNvX!Bx8$Auzp*}RV)VwbDtwl%C zUG%l9>|pc%PKVBhg_e$osh0D=zF$scl(a$Dip^qY5bkMlQCt`M?RwNn@0yi+r@zMn z$X6+%Nq7aASny1SSA#E{ejO$`~1>_%Rruu;+|kF%;!n-rz6 z`r>~FbPc3M5Jge=zMen9Ey3OM!V=uw-7UpkBHSUtEy2mK7>5*ReY5oqaps=n)mNu` zy1T|xQlz=+n!Aot=MqQo5xgJo#}n~HJGJ4fzLcBHlk9njPuSWgrg!SGyB@F*O1 z+N7qrm(Z8cPjd2d%5usX%6Q6nN-eI%1MmPm1P{Rj@j%=ywe!S{xDk)VWATivwIW?h zvvUuo52lY(FNI!YtvxAISe^3E<)n*NxM&4l$^L_sgA&taBV{9BUBDOcQoP=d))|wp z_~$C;J+D(cPxt7Jd*exV+E1B8+2gxn24#keUfMc`-{Xz=FTR~lDMH*5?(vxuIxxF( ze*e_Y7B|uhlmg{2K5VPeRwKO`y;5uP*~3m#Y<;)&o&Due>S@P%b>vlda(|5NHob#; z;jv5hQyu>UP9skW0C)kE&I61bQ5XmC|C{-rZ*aCRYEUDrZA2HHxt`tH4r<%BZ5v_T z=%S4_sPXc$jp}@PznM4l2?9W(NY}EV_31Zc3`|#5(1TPQ1kefbJuCVaV{h-CV~SDH zdz5tV;GPxIp~Ht1W9F#gL*@Gz`Byq>a4{YO-@d^HAfSPWK`i2sgk%^nVZlZUQjw;z zQleRUG%Nle^AdiOXaC6iuc?W@$V;!Pas@H5Mv9p=RZbn|*VMRuSg2fG>+!m=y*^M? zgT1b%hAJF)d23uatGukd=?S?5xbF?rdhpbdeem3A^3>z4r5zD*Le&o5 zJ0YKguK+XvLY+coF#sK!+7@8+Emr-r)jzefy5}epl<~?qr3FAkCbHEnS7|8ol=;d6 zWwO#l3Hso9a&odq#%!b5m})FFjvEmpV#dnoXTCPin|GyQtBs6a)^uyDb={7ak!hEw zJWnl5?FJFuM8g1-a43g~Y*ET#`Z9iDJsa4_CN{H$F1qQVmn*oMYdM>{xQF|AfX8@( zr+AGwc#C&pYzUOdb6aGJ61|7Mgt_$5&j1|;8RA%u<9JTsa<1YUZsbnx=3egSQ6A?> zUgdS(S7Qr%D1?ylFY=d2}4-UaGI0fh65?q5@a1S2Cb9fE!;WK=Pz8H$% z$U{c)C>f=rY?P0RQ8}tc^{5%O`@huhziS*#qj~>-*8NxQqhoZAuF*YuM(@a%Lg^cO z*f<_1<8+*j^KmgQ$JMwVH{*8Pjr;L19>>#o9xvk!yn_$$3BJHL_yND*5A4t3{6j!u zNCHVA86<}kkP=csYDfcVAswWL43H5rL1xGTSs@!_ha8X-azSp$19>4I#9zYYhl0k? z1e!uKXbvr)CA5Op(ni`!J83T+q@#3_&eBD?N;l~)J*21flHSrs`bs}(phoI1Ba3B; zER|)lTvo_RStYAwjjWY*vR*dG#@IAlV5@A4?Xweh$?n)QduP5DY|-||iHqZsxHK+{ z%i{{U68{*A2iyn)0E~h!Y4jhfw(Y34ZQHiiy4c!k`%N%Lo>4*$g%nY&ODUsVS5if_ zuBDE8-AEJ7x|KHCbtheP>t6ck*Mkf(tVbDRTu(B^w4P;-dA-OI%X*bH*7YV^Z0lY2 z*w=>~ajZ`{<6K{I#kIcWj(h#c6VLjUH{SIpUwms5W-Qu<9fx+|#-n}s3Fr`EB05H# zgietrqksAPXP_Qn>;M2Di2mK$wr$(CZQHhO+qP}nwr%(B+D4t|B@=7J4`hW>Xbh`x z3Xc&LNs%$CqA5D2RXU}|jLM|Um{r-79djy|a${cQQ+_O{LMn_!RZPXPq)MqYmQ^{G z$BL??%2-v^R2^%omTF^N)l+?Js77jxP1Q`zv87t6HMUhdwa1R?q|Vq?-P9d>s+W3W zU-eUe9H>DWj6*d{!vmo;UkkJ_bQQ{CEzwe3t`%B|tF=aJalJNZBW~6fZN=@{p`Ex} zd$bq#>wpg8VI9#?JgyTuiKlf&XYsr)=ptU$60VFD*~B22=C zl3@y`bSg~4lhR=ZXLKga!lANZ4(D_(%)_tpVF4F(AuPhZieU+tbSW&u%gSK|S9B$; z!r7`}4cBxnti$K(VFNdGBW%L;nqdpKbSrGb1KVLocXDU!>Td3iJ>AQ_v9J5NKMwRD z55}P$=HWQfqdXeNdYs4OL{IW$oa$+wjx#;WvvIEHc|I=mA}SI2RCwX5%9HwKMiT%>l+AfBg$HWXcM2`G-?W4v}y}Gbm|Iw^y&)-3>peYj2a6kOqvR3%$iHg+jQ(Ev0%%I+r*-6 z|J@~)>^OCwShnlTLt@3AbB~Et`z|~s)*QI>oLG10%1dIyk!!K%&8MI6-M3!`$|?1pa@E!3@V@sYM>4ppb1)_4LYC;dY}&mU>4?K5td;U)?pL2 zVHft{5RTy#&fyZS;TG=U5uV`{-r*CzA%Ni-nb8@W@tK&(nVRXDnc10}`B|97S(@cp znbldF_1T!s*@hk1g+17Z12}{uIEE8Ag)=yZ3%GQVk^E9E4flDy)rAiax1@@skPdxv%0Id`fIR;YqVx- zz7}h_R%^XBYrA%9zYgoTPV2lb>$-01z8>qjUhBO+>$?K=+s)lWdw7rR@jQ_y^HiSB zGkG@8<@vmjSM_TD+p%V-y@DV*-@bce+qRpq37Xip@!K}q*tXrrRqFI<)Ba8Dd2_zA z=e?i~i=Ewb=gwL)Sc0WkhUHj+l~{$0GflqA&7mh{BiOn#@J_!gvuREi_J$Ll?iv!V@_HLLQg8#A6!uc<`3-+F8FmC zU~}F<)3jtR(#&dU@R}iB(>&D3-DsPJBycp+X0dd|8mz@Stj7jy#3pRU7Hq{CoMkV( z;W?hiD_-D5UgBk5;Zwm8M+sBEzPk`ftRzYvME z>7paI8G82r1^E460EzGRVUgX}+je_5zuS9w+$p{Yt3`})C$c-6iNhy+kc8&lVwy?P z%_2JIanVO~?#5#}c#n_xOray#h)vkSqCDL!hNEZP$8he%qd4E4{pM`-6(axNIsgCw I0RR910OYKqU;qFB literal 0 HcmV?d00001 diff --git a/pandora_console/include/fonts/Pandora-Regular.woff b/pandora_console/include/fonts/Pandora-Regular.woff new file mode 100644 index 0000000000000000000000000000000000000000..257304a04018c4b6315cbe0048bce2ea4925b243 GIT binary patch literal 34716 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 @igF`38cJY0 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 c0RR910NUQy#Q*>R0L_ehHUIzs0L_eTE4eV+eE Date: Fri, 21 Oct 2022 13:32:57 +0200 Subject: [PATCH 003/474] CSS changes --- pandora_console/include/styles/pandora.css | 548 +++++++++++++++----- pandora_console/include/styles/register.css | 69 --- 2 files changed, 427 insertions(+), 190 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index eeff4d2fce..c19d13ea81 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -33,6 +33,23 @@ * --------------------------------------------------------------------- */ +@font-face { + font-family: "Pandora-Bold"; + src: url("../fonts/Pandora-Bold.woff") format("woff"); + font-weight: 700; +} + +@font-face { + font-family: "Pandora-Regular"; + src: url("../fonts/Pandora-Regular.woff") format("woff"); + font-weight: 400; +} + +@font-face { + font-family: "Pandora-Light"; + src: url("../fonts/Pandora-Light.woff") format("woff"); + font-weight: 100; +} @font-face { font-family: "lato"; src: url("../fonts/Lato-Regular.woff") format("woff"); @@ -139,7 +156,7 @@ body { flex-direction: column; min-height: 100%; font-weight: 400; - font-family: "lato"; + font-family: "Pandora-Regular"; } body.body-report { @@ -178,11 +195,6 @@ input.button { margin: 10px 15px; } -input[type="submit"], -input[type="button"] { - cursor: pointer; -} - h1, h2, h3, @@ -1810,7 +1822,10 @@ table.rounded_cells td { border-radius: 6px; } -.action-buttons, +.action-buttons { + display: flex; + flex-direction: row-reverse; +} .right { text-align: right; } @@ -1858,107 +1873,6 @@ input.spinn { padding-right: 30px; } -button.next, -input.next { - background-image: url(../../images/input_go.png); -} -button.upd, -input.upd { - background-image: url(../../images/input_update.png); -} -button.wand, -input.wand { - background-image: url(../../images/input_wand.png); -} -button.wand:disabled, -input.wand:disabled { - background-image: url(../../images/input_wand.disabled.png); -} -button.search, -input.search { - background-image: url(../../images/input_zoom.png); -} -button.search:disabled, -input.search:disabled { - background-image: url(../../images/input_zoom.disabled.png); -} -button.ok, -input.ok { - background-image: url(../../images/input_tick.png); -} -button.ok:disabled, -input.ok:disabled { - background-image: url(../../images/input_tick.disabled.png); -} -button.add, -input.add { - background-image: url(../../images/input_add.png); -} -button.add:disabled, -input.add:disabled { - background-image: url(../../images/input_add.disabled.png); -} -button.cancel, -input.cancel { - background-image: url(../../images/input_cross.png); -} -button.cancel:disabled, -input.cancel:disabled { - background-image: url(../../images/input_cross.disabled.png); -} -button.delete, -input.delete { - background-image: url(../../images/input_delete.png); -} -button.delete:disabled, -input.delete:disabled { - background-image: url(../../images/input_delete.disabled.png); -} -button.cog, -input.cog { - background-image: url(../../images/input_cog.png); -} -button.cog:disabled, -input.cog:disabled { - background-image: url(../../images/input_cog.disabled.png); -} -button.config, -input.config { - background-image: url(../../images/input_config.png); -} -button.config:disabled, -input.config:disabled { - background-image: url(../../images/input_config.disabled.png); -} -button.filter, -input.filter { - background-image: url(../../images/input_filter.png); -} -button.filter:disabled, -input.filter:disabled { - background-image: url(../../images/input_filter.disabled.png); -} -button.pdf, -input.pdf { - background-image: url(../../images/input_pdf.png); -} -button.pdf:disabled, -input.pdf:disabled { - background-image: url(../../images/input_pdf.disabled.png); -} -button.camera, -input.camera { - background-image: url(../../images/input_camera.png); -} -button.spinn, -input.spinn { - background-image: url(../../images/spinner_green.gif); -} -button.deploy, -input.deploy { - background-image: url(../../images/input_deploy.png); -} - button.add-item-img, input.add-item-img { background-image: url(../../images/add.png); @@ -7128,12 +7042,6 @@ div.graph div.legend table { height: 30em; } -.agent_manager { - display: flex; - justify-content: flex-end; - align-items: center; -} - #p_configurar_agente { float: right; font-style: lato; @@ -9072,13 +8980,407 @@ div#err_msg_centralised { } } -.text_input { - background-color: transparent !important; - border: none; - border-radius: 0; - border-bottom: 1px solid #ccc; - margin-bottom: 4px; - padding: 2px 5px; +input { + background-color: #f6f7fb; + height: 24px; + border: 1px solid #c0ccdc; + border-radius: 8px; + padding-left: 12px; + font: normal normal normal 12px Pandora-Light; + color: #2b3332; +} + +input:disabled { + background-color: #e5e9ed; + color: #8a96a6; +} + +input[type="button"], +input[type="submit"] { + width: 175px; + height: 45px; + background-color: #14524f; + box-shadow: 0px 3px 6px #c7c7c7; + letter-spacing: 0px; + color: #ffffff; + font-family: Pandora-Regular; + font-size: 16px; + margin-left: 1em; + cursor: pointer; +} + +input[type="button"]:hover, +input[type="submit"]:hover { + background-color: #1d7873; +} + +input[type="button"]:active, +input[type="submit"]:active { + background-color: #0d312f; + color: #ffffff; +} + +input[type="button"].secondary, +input[type="submit"].secondary { + width: 175px; + height: 45px; + background-color: #ffffff; + border: 2px solid #14524f; + color: #14524f; +} + +input[type="button"].secondary:hover, +input[type="submit"].secondary:hover { + border: 2px solid #1d7873; + color: #1d7873; +} + +input[type="button"].secondary:active, +input[type="submit"].secondary:active { + border: 2px solid #0d312f; + color: #0d312f; +} + +button.inputButton, +button.submitButton { + display: flex; + justify-content: space-between; + flex-direction: row; + min-width: 110px; + height: 32px; + font-size: 16px !important; + align-items: center; + line-height: 24px; + box-shadow: 0px 3px 6px #c7c7c7; + background-color: #14524f; + color: #fff; + border: 1px solid #14524f; + border-radius: 5px; + padding-left: 0.5em; + cursor: pointer; +} + +button.inputButton:hover, +button.submitButton:hover { + background-color: #1d7873; + border-color: #1d7873; +} + +button.inputButton:active, +button.submitButton:active { + background-color: #0d312f; + border-color: #0d312f; +} + +/* Button */ +button.inputButton > div, +button.submitButton > div { + background-color: #fff; + width: 2rem; + height: 2rem; + margin-left: 1rem; +} + +button.inputButton.secondary, +button.submitButton.secondary { + background-color: #fff; + color: #14524f; + border: 2px solid #14524f; +} + +button.inputButton.secondary > div, +button.submitButton.secondary > div { + background-color: #14524f !important; +} + +button.inputButton.secondary:hover, +button.submitButton.secondary:hover { + color: #1d7873 !important; + border-color: #1d7873 !important; +} + +button.inputButton.secondary:hover > div, +button.submitButton.secondary:hover > div { + background-color: #1d7873 !important; +} + +button.inputButton.secondary:active, +button.submitButton.secondary:active { + color: #0d312f !important; + border-color: #0d312f !important; +} + +button.inputButton.secondary:active > div, +button.submitButton.secondary:active > div { + background-color: #0d312f !important; +} + +button div.camera { + mask: url(../../images/svg/picture.svg) no-repeat center / contain; + -webkit-mask: url(../../images/svg/picture.svg) no-repeat center / contain; +} + +button div.ok { + mask: url(../../images/svg/ok.svg) no-repeat center / contain; + -webkit-mask: url(../../images/svg/ok.svg) no-repeat center / contain; +} + +button div.next { + mask: url(../../images/svg/arrow.svg) no-repeat center / contain; + -webkit-mask: url(../../images/svg/arrow.svg) no-repeat center / contain; +} + +button div.search { + mask: url(../../images/svg/search.svg) no-repeat center / contain; + -webkit-mask: url(../../images/svg/search.svg) no-repeat center / contain; +} + +button div.wand, +button div.upd { + mask: url(../../images/svg/success.svg) no-repeat center / contain; + -webkit-mask: url(../../images/svg/success.svg) no-repeat center / contain; +} + +button div.add { + mask: url(../../images/svg/plus.svg) no-repeat center / contain; + -webkit-mask: url(../../images/svg/plus.svg) no-repeat center / contain; +} + +button div.delete { + mask: url(../../images/svg/trash.svg) no-repeat center / contain; + -webkit-mask: url(../../images/svg/trash.svg) no-repeat center / contain; +} + +button div.cancel { + mask: url(../../images/svg/left.svg) no-repeat center / contain; + -webkit-mask: url(../../images/svg/left.svg) no-repeat center / contain; +} + +.ui-dialog-buttonset { + display: flex; +} + +button.ui-button-text-only.ui-widget.sub { + display: flex; + justify-content: center; + flex-direction: column; + align-content: center; + min-width: 100px; + height: 32px; + font-size: 16px !important; + align-items: center; + line-height: 24px; + box-shadow: 0px 3px 6px #c7c7c7; + border-radius: 5px; + cursor: pointer; + padding: 0; +} + +button.ui-button.ui-widget.submit-next { + background-color: #14524f; + color: #fff; + border: 1px solid #14524f; +} + +button.ui-button.ui-widget.submit-next:hover { + background-color: #1d7873; + border-color: #1d7873; +} + +button.ui-button.ui-widget.submit-next:active { + background-color: #0d312f; + border-color: #0d312f; +} + +button.ui-button.ui-widget.submit-cancel { + background-color: #fff; + color: #14524f; + border: 1px solid #fff; +} + +button.ui-button.ui-widget.submit-cancel:hover { + color: #1d7873; +} + +button.ui-button.ui-widget.submit-cancel:active { + color: #0d312f; +} + +/* clean the next */ +button.next, +input.next { + background-image: url(../../images/svg/arrow.svg); + background-position: 90% center; + background-repeat: no-repeat; + background-size: 24px; +} + +button.upd, +input.upd { + background-image: url(../../images/input_update.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.wand, +input.wand { + background-image: url(../../images/input_wand.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.wand:disabled, +input.wand:disabled { + background-image: url(../../images/input_wand.disabled.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.search, +input.search { + background-image: url(../../images/input_zoom.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.search:disabled, +input.search:disabled { + background-image: url(../../images/input_zoom.disabled.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.ok, +input.ok { + background-image: url(../../images/input_tick.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.ok:disabled, +input.ok:disabled { + background-image: url(../../images/input_tick.disabled.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.add, +input.add { + background-image: url(../../images/input_add.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.add:disabled, +input.add:disabled { + background-image: url(../../images/input_add.disabled.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.cancel, +input.cancel { + background-image: url(../../images/input_cross.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.cancel:disabled, +input.cancel:disabled { + background-image: url(../../images/input_cross.disabled.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.delete, +input.delete { + background-image: url(../../images/input_delete.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.delete:disabled, +input.delete:disabled { + background-image: url(../../images/input_delete.disabled.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.cog, +input.cog { + background-image: url(../../images/input_cog.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.cog:disabled, +input.cog:disabled { + background-image: url(../../images/input_cog.disabled.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.config, +input.config { + background-image: url(../../images/input_config.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.config:disabled, +input.config:disabled { + background-image: url(../../images/input_config.disabled.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.filter, +input.filter { + background-image: url(../../images/input_filter.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.filter:disabled, +input.filter:disabled { + background-image: url(../../images/input_filter.disabled.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.pdf, +input.pdf { + background-image: url(../../images/input_pdf.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.pdf:disabled, +input.pdf:disabled { + background-image: url(../../images/input_pdf.disabled.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.camera, +input.camera { + background-image: url(../../images/input_camera.png); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.spinn, +input.spinn { + background-image: url(../../images/spinner_green.gif); + background-position: 90% center; + background-repeat: no-repeat; +} + +button.deploy, +input.deploy { + background-image: url(../../images/input_deploy.png); + background-position: 90% center; + background-repeat: no-repeat; } .password_input { @@ -9119,3 +9421,7 @@ div#err_msg_centralised { margin-right: -110px; margin-top: 13px; } + +.svg_ico_border { + fill: #fff; +} diff --git a/pandora_console/include/styles/register.css b/pandora_console/include/styles/register.css index 77d56dbc85..3f867e3e9b 100644 --- a/pandora_console/include/styles/register.css +++ b/pandora_console/include/styles/register.css @@ -1,72 +1,3 @@ -input[type="submit"].submit-cancel, -button.submit-cancel.ui-button.ui-corner-all.ui-widget, -button.submit-cancel { - color: #fb4444; - border: 1px solid #fb4444; - background: #fff; - padding: 5px; - font-size: 1.3em; - margin: 0.5em 1em 0.5em 0; - cursor: pointer; - text-align: center; - height: 30px; - width: auto; - min-width: 90px; -} - -input[type="submit"].submit-cancel:hover, -button.submit-cancel.ui-button.ui-corner-all.ui-widget:hover, -button.submit-cancel:hover { - color: #fff; - background: #fb4444; -} - -input[type="submit"].submit-next, -button.submit-next.ui-button.ui-corner-all.ui-widget, -input[type="button"].submit-next { - color: #82b92e; - border: 1px solid #82b92e; - background: #fff; - padding: 5px; - font-size: 1.3em; - margin: 0.5em 0em; - cursor: pointer; - text-align: center; - height: 30px; - width: auto; - min-width: 90px; -} - -input[type="submit"].submit-next:hover, -button.submit-next.ui-button.ui-corner-all.ui-widget:hover, -input[type="button"].submit-next:hover { - color: #fff; - background: #82b92e; -} - -input[type="submit"].submit-warning, -button.submit-warning.ui-button.ui-corner-all.ui-widget, -input[type="button"].submit-warning { - color: #c9d511; - border: 1px solid #c9d511; - background: #fff; - padding: 5px; - font-size: 1.3em; - margin: 0.5em 1em 0.5em 0; - cursor: pointer; - text-align: center; - height: 30px; - width: auto; - min-width: 90px; -} - -input[type="submit"].submit-warning:hover, -button.submit-warning.ui-button.ui-corner-all.ui-widget:hover, -input[type="button"].submit-warning:hover { - color: #fff; - background: #c9d511; -} - div.submit_buttons_container { position: relative; margin: 10px auto 0px; From 6a21fcd6a927cecedca0994e85d8119de2eba5bf Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Fri, 21 Oct 2022 13:33:49 +0200 Subject: [PATCH 004/474] SVG files --- pandora_console/images/svg/add.svg | 1 + pandora_console/images/svg/arrow.svg | 1 + pandora_console/images/svg/bell.svg | 1 + pandora_console/images/svg/bubble.svg | 1 + pandora_console/images/svg/cog.svg | 1 + pandora_console/images/svg/device.svg | 1 + pandora_console/images/svg/display.svg | 1 + pandora_console/images/svg/down.svg | 1 + pandora_console/images/svg/duplicate.svg | 1 + pandora_console/images/svg/envelope.svg | 1 + pandora_console/images/svg/exit.svg | 1 + pandora_console/images/svg/eye.svg | 1 + pandora_console/images/svg/fail.svg | 1 + pandora_console/images/svg/file.svg | 1 + pandora_console/images/svg/house.svg | 1 + pandora_console/images/svg/iconos-19.svg | 1 + pandora_console/images/svg/iconos-27.svg | 1 + pandora_console/images/svg/info.svg | 1 + pandora_console/images/svg/left.svg | 1 + pandora_console/images/svg/menu_horizontal.svg | 1 + pandora_console/images/svg/menu_vertical.svg | 1 + pandora_console/images/svg/ok.svg | 1 + pandora_console/images/svg/picture.svg | 1 + pandora_console/images/svg/plus.svg | 1 + pandora_console/images/svg/protected.svg | 1 + pandora_console/images/svg/right.svg | 1 + pandora_console/images/svg/search.svg | 1 + pandora_console/images/svg/settings.svg | 1 + pandora_console/images/svg/sound.svg | 1 + pandora_console/images/svg/star.svg | 1 + pandora_console/images/svg/success.svg | 1 + pandora_console/images/svg/trash.svg | 1 + pandora_console/images/svg/up.svg | 1 + pandora_console/images/svg/user.svg | 1 + 34 files changed, 34 insertions(+) create mode 100644 pandora_console/images/svg/add.svg create mode 100644 pandora_console/images/svg/arrow.svg create mode 100644 pandora_console/images/svg/bell.svg create mode 100644 pandora_console/images/svg/bubble.svg create mode 100644 pandora_console/images/svg/cog.svg create mode 100644 pandora_console/images/svg/device.svg create mode 100644 pandora_console/images/svg/display.svg create mode 100644 pandora_console/images/svg/down.svg create mode 100644 pandora_console/images/svg/duplicate.svg create mode 100644 pandora_console/images/svg/envelope.svg create mode 100644 pandora_console/images/svg/exit.svg create mode 100644 pandora_console/images/svg/eye.svg create mode 100644 pandora_console/images/svg/fail.svg create mode 100644 pandora_console/images/svg/file.svg create mode 100644 pandora_console/images/svg/house.svg create mode 100644 pandora_console/images/svg/iconos-19.svg create mode 100644 pandora_console/images/svg/iconos-27.svg create mode 100644 pandora_console/images/svg/info.svg create mode 100644 pandora_console/images/svg/left.svg create mode 100644 pandora_console/images/svg/menu_horizontal.svg create mode 100644 pandora_console/images/svg/menu_vertical.svg create mode 100644 pandora_console/images/svg/ok.svg create mode 100644 pandora_console/images/svg/picture.svg create mode 100644 pandora_console/images/svg/plus.svg create mode 100644 pandora_console/images/svg/protected.svg create mode 100644 pandora_console/images/svg/right.svg create mode 100644 pandora_console/images/svg/search.svg create mode 100644 pandora_console/images/svg/settings.svg create mode 100644 pandora_console/images/svg/sound.svg create mode 100644 pandora_console/images/svg/star.svg create mode 100644 pandora_console/images/svg/success.svg create mode 100644 pandora_console/images/svg/trash.svg create mode 100644 pandora_console/images/svg/up.svg create mode 100644 pandora_console/images/svg/user.svg diff --git a/pandora_console/images/svg/add.svg b/pandora_console/images/svg/add.svg new file mode 100644 index 0000000000..b80fa3fb0d --- /dev/null +++ b/pandora_console/images/svg/add.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/arrow.svg b/pandora_console/images/svg/arrow.svg new file mode 100644 index 0000000000..7fb5d31ac4 --- /dev/null +++ b/pandora_console/images/svg/arrow.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/bell.svg b/pandora_console/images/svg/bell.svg new file mode 100644 index 0000000000..eec47bd762 --- /dev/null +++ b/pandora_console/images/svg/bell.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/bubble.svg b/pandora_console/images/svg/bubble.svg new file mode 100644 index 0000000000..08bf0727fb --- /dev/null +++ b/pandora_console/images/svg/bubble.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/cog.svg b/pandora_console/images/svg/cog.svg new file mode 100644 index 0000000000..4fc3b6b6fb --- /dev/null +++ b/pandora_console/images/svg/cog.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/device.svg b/pandora_console/images/svg/device.svg new file mode 100644 index 0000000000..46ea97ad8c --- /dev/null +++ b/pandora_console/images/svg/device.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/display.svg b/pandora_console/images/svg/display.svg new file mode 100644 index 0000000000..38e3a84fa4 --- /dev/null +++ b/pandora_console/images/svg/display.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/down.svg b/pandora_console/images/svg/down.svg new file mode 100644 index 0000000000..b515cd5102 --- /dev/null +++ b/pandora_console/images/svg/down.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/duplicate.svg b/pandora_console/images/svg/duplicate.svg new file mode 100644 index 0000000000..54b78c2aad --- /dev/null +++ b/pandora_console/images/svg/duplicate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/envelope.svg b/pandora_console/images/svg/envelope.svg new file mode 100644 index 0000000000..b50e20e331 --- /dev/null +++ b/pandora_console/images/svg/envelope.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/exit.svg b/pandora_console/images/svg/exit.svg new file mode 100644 index 0000000000..16e0eae613 --- /dev/null +++ b/pandora_console/images/svg/exit.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/eye.svg b/pandora_console/images/svg/eye.svg new file mode 100644 index 0000000000..5f9c897222 --- /dev/null +++ b/pandora_console/images/svg/eye.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/fail.svg b/pandora_console/images/svg/fail.svg new file mode 100644 index 0000000000..f6a60f9276 --- /dev/null +++ b/pandora_console/images/svg/fail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/file.svg b/pandora_console/images/svg/file.svg new file mode 100644 index 0000000000..6ef321521c --- /dev/null +++ b/pandora_console/images/svg/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/house.svg b/pandora_console/images/svg/house.svg new file mode 100644 index 0000000000..1361d98cdc --- /dev/null +++ b/pandora_console/images/svg/house.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/iconos-19.svg b/pandora_console/images/svg/iconos-19.svg new file mode 100644 index 0000000000..8471a06bea --- /dev/null +++ b/pandora_console/images/svg/iconos-19.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/iconos-27.svg b/pandora_console/images/svg/iconos-27.svg new file mode 100644 index 0000000000..9eb41e512d --- /dev/null +++ b/pandora_console/images/svg/iconos-27.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/info.svg b/pandora_console/images/svg/info.svg new file mode 100644 index 0000000000..a7b23d52d4 --- /dev/null +++ b/pandora_console/images/svg/info.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/left.svg b/pandora_console/images/svg/left.svg new file mode 100644 index 0000000000..d74cf540b3 --- /dev/null +++ b/pandora_console/images/svg/left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/menu_horizontal.svg b/pandora_console/images/svg/menu_horizontal.svg new file mode 100644 index 0000000000..bcd2f124cb --- /dev/null +++ b/pandora_console/images/svg/menu_horizontal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/menu_vertical.svg b/pandora_console/images/svg/menu_vertical.svg new file mode 100644 index 0000000000..1b5e468eb1 --- /dev/null +++ b/pandora_console/images/svg/menu_vertical.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/ok.svg b/pandora_console/images/svg/ok.svg new file mode 100644 index 0000000000..af6c3850cd --- /dev/null +++ b/pandora_console/images/svg/ok.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/picture.svg b/pandora_console/images/svg/picture.svg new file mode 100644 index 0000000000..978557a383 --- /dev/null +++ b/pandora_console/images/svg/picture.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/plus.svg b/pandora_console/images/svg/plus.svg new file mode 100644 index 0000000000..18736fde28 --- /dev/null +++ b/pandora_console/images/svg/plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/protected.svg b/pandora_console/images/svg/protected.svg new file mode 100644 index 0000000000..39f9c69aa1 --- /dev/null +++ b/pandora_console/images/svg/protected.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/right.svg b/pandora_console/images/svg/right.svg new file mode 100644 index 0000000000..e74f4abeb8 --- /dev/null +++ b/pandora_console/images/svg/right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/search.svg b/pandora_console/images/svg/search.svg new file mode 100644 index 0000000000..14f8f5fd8e --- /dev/null +++ b/pandora_console/images/svg/search.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/settings.svg b/pandora_console/images/svg/settings.svg new file mode 100644 index 0000000000..16858510e1 --- /dev/null +++ b/pandora_console/images/svg/settings.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/sound.svg b/pandora_console/images/svg/sound.svg new file mode 100644 index 0000000000..1ff57a311f --- /dev/null +++ b/pandora_console/images/svg/sound.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/star.svg b/pandora_console/images/svg/star.svg new file mode 100644 index 0000000000..1ba2f60041 --- /dev/null +++ b/pandora_console/images/svg/star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/success.svg b/pandora_console/images/svg/success.svg new file mode 100644 index 0000000000..26e83ff1f7 --- /dev/null +++ b/pandora_console/images/svg/success.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/trash.svg b/pandora_console/images/svg/trash.svg new file mode 100644 index 0000000000..0dc58d9e0f --- /dev/null +++ b/pandora_console/images/svg/trash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/up.svg b/pandora_console/images/svg/up.svg new file mode 100644 index 0000000000..88fe9cb5be --- /dev/null +++ b/pandora_console/images/svg/up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/pandora_console/images/svg/user.svg b/pandora_console/images/svg/user.svg new file mode 100644 index 0000000000..797b4e04a0 --- /dev/null +++ b/pandora_console/images/svg/user.svg @@ -0,0 +1 @@ + \ No newline at end of file From 20a41a1b2df8bd4c8e157b6abdc307df0386f980 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Fri, 21 Oct 2022 13:35:57 +0200 Subject: [PATCH 005/474] New buttons code changes --- pandora_console/include/functions_html.php | 130 +++++++++++++++++---- 1 file changed, 107 insertions(+), 23 deletions(-) diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 80b1ed0717..f916bb917a 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -3322,36 +3322,70 @@ function html_print_input_color($name, $value, $id='', $class=false, $return=fal * @param string $label Input label. * @param string $name Input name. * @param boolean $disabled Whether to disable by default or not. Enabled by default. - * @param array $attributes Additional HTML attributes. + * @param mixed $attributes Additional HTML attributes. * @param boolean $return Whether to return an output string or echo now (optional, echo by default). * * @return string HTML code if return parameter is true. */ function html_print_submit_button($label='OK', $name='', $disabled=false, $attributes='', $return=false) { - if (!$name) { + if (empty($name) === true) { $name = 'unnamed'; } - if (is_array($attributes)) { + // Icon for show in button. + $iconToUse = ''; + if (is_array($attributes) === true) { $attr_array = $attributes; $attributes = ''; foreach ($attr_array as $attribute => $value) { - $attributes .= $attribute.'="'.$value.'" '; + if ($attribute === 'icon') { + $iconToUse = $value; + } else if ($attribute === 'secondary') { + $secondary = true; + } else { + $attributes .= $attribute.'="'.$value.'" '; + } } + } else if (empty($attributes) === false && is_string($attributes) === true) { + $tmpData = explode(' ', $attributes); + $iconToUse = $tmpData[(array_search('sub', $tmpData) + 1)]; + $iconToUse = preg_replace('([^A-Za-z])', '', $iconToUse); } - $output = ' '', + 'class' => sprintf( + 'subIcon %s%s', + $iconToUse, + $secondary + ), + ], + true + ); + } else { + $iconDiv = ''; } - $output .= ' />'; - if (!$return) { + $output = sprintf( + '', + $secondary, + ($disabled === true) ? ' disabled' : '', + $label, + $iconDiv + ); + + if ($return === false) { echo $output; + } else { + return $output; } - - return $output; } @@ -3364,7 +3398,7 @@ function html_print_submit_button($label='OK', $name='', $disabled=false, $attri * @param string $name Input name. * @param boolean $disabled Whether to disable by default or not. Enabled by default. * @param string $script JavaScript to attach - * @param string $attributes Additional HTML attributes. + * @param mixed $attributes Additional HTML attributes. * @param boolean $return Whether to return an output string or echo now (optional, echo by default). * @param boolean $imageButton Set the button as a image button without text, by default is false. * @@ -3374,30 +3408,80 @@ function html_print_button($label='OK', $name='', $disabled=false, $script='', $ { $output = ''; - $alt = $title = ''; - if ($imageButton) { - $alt = $title = $label; - $label = ''; + if (empty($name) === true) { + $name = 'unnamed'; } - $output .= ' $value) { + if ($attribute === 'icon') { + $iconToUse = $value; + } else if ($attribute === 'secondary') { + $secondary = true; + } else { + $attributes .= $attribute.'="'.$value.'" '; + } + } + } else if (empty($attributes) === false && is_string($attributes) === true) { + $tmpData = explode(' ', $attributes); + $iconToUse = $tmpData[(array_search('sub', $tmpData) + 1)]; + $iconToUse = preg_replace('([^A-Za-z])', '', $iconToUse); } - $output .= ' />'; + // $secondary = true; + // Transform secondary boolean to string. + $secondary = ($secondary === true) ? ' secondary' : ''; - if ($modal && !enterprise_installed()) { + if (empty($iconToUse) === false) { + $iconDiv = html_print_div( + [ + 'style' => '', + 'class' => sprintf( + 'subIcon %s%s', + $iconToUse, + $secondary + ), + ], + true + ); + } else { + $iconDiv = ''; + } + + if ($imageButton === false) { + $content = $label; + $content .= $iconDiv; + } else { + $content = $iconDiv; + } + + $output = sprintf( + '', + $secondary, + (empty($name) === false) ? ' name="'.$name.'"' : '', + (empty($name) === false) ? ' id="button-'.$name.'"' : '', + (empty($label) === false) ? ' value="'.$label.'"' : '', + ($disabled === true) ? ' disabled' : '', + (empty($script) === false) ? ' onClick="'.$script.'"' : '', + $content + ); + + if ($modal !== false && enterprise_installed() === false) { $output .= "

    "; } - if ($return) { + if ($return === true) { return $output; + } else { + echo $output; } - echo $output; } From 83de025bc94fe52d13726167d3dee3e2554f2d33 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Fri, 21 Oct 2022 13:47:41 +0200 Subject: [PATCH 006/474] Several adaptations --- pandora_console/extensions/module_groups.php | 10 +++++++++- .../godmode/agentes/modificar_agente.php | 17 ++++++++++++++--- .../godmode/agentes/module_manager.php | 10 +++++++++- .../operation/agentes/estado_agente.php | 7 +++++-- 4 files changed, 37 insertions(+), 7 deletions(-) diff --git a/pandora_console/extensions/module_groups.php b/pandora_console/extensions/module_groups.php index a04e6a08dc..4dfe0e6b6d 100644 --- a/pandora_console/extensions/module_groups.php +++ b/pandora_console/extensions/module_groups.php @@ -280,7 +280,15 @@ function mainModuleGroups() html_print_input_text('module_group_search', $module_group_search); echo ''; - echo ""; + html_print_submit_button( + __('Search'), + 'srcbutton', + false, + [ + 'icon' => 'search', + 'secondary' => true, + ] + ); echo ''; echo ''; echo ''; diff --git a/pandora_console/godmode/agentes/modificar_agente.php b/pandora_console/godmode/agentes/modificar_agente.php index 3b714c277b..abaef3eaaa 100644 --- a/pandora_console/godmode/agentes/modificar_agente.php +++ b/pandora_console/godmode/agentes/modificar_agente.php @@ -369,7 +369,15 @@ echo ui_print_help_tip( ); echo ''; -echo ""; +html_print_submit_button( + __('Search'), + 'srcbutton', + false, + [ + 'icon' => 'search', + 'secondary' => true, + ] +); echo ''; echo ''; echo ''; @@ -945,7 +953,7 @@ if ($agents !== false) { ui_print_info_message(['no_close' => true, 'message' => __('There are no defined agents') ]); } -if (check_acl($config['id_user'], 0, 'AW')) { +if ((bool) check_acl($config['id_user'], 0, 'AW') === true) { // Create agent button. echo '
    '; echo '
    '; @@ -953,7 +961,10 @@ if (check_acl($config['id_user'], 0, 'AW')) { __('Create agent'), 'crt-2', false, - 'class="sub next"' + [ + 'icon' => 'search', + 'secondary' => true, + ] ); echo '
    '; echo '
    '; diff --git a/pandora_console/godmode/agentes/module_manager.php b/pandora_console/godmode/agentes/module_manager.php index 6cfa2685b4..20ecf6145a 100644 --- a/pandora_console/godmode/agentes/module_manager.php +++ b/pandora_console/godmode/agentes/module_manager.php @@ -226,7 +226,15 @@ if (($policy_page) || (isset($agent))) { html_print_input_hidden('edit_module', 1); echo ''; echo ''; - echo ''; + html_print_submit_button( + __('Create'), + 'updbutton', + false, + [ + 'icon' => 'next', + 'secondary' => true, + ] + ); echo ''; echo ''; echo ''; diff --git a/pandora_console/operation/agentes/estado_agente.php b/pandora_console/operation/agentes/estado_agente.php index 0210545a26..4b634f5f53 100644 --- a/pandora_console/operation/agentes/estado_agente.php +++ b/pandora_console/operation/agentes/estado_agente.php @@ -290,8 +290,11 @@ echo ''; html_print_submit_button( __('Search'), 'srcbutton', - '', - ['class' => 'sub search'] + false, + [ + 'icon' => 'search', + 'secondary' => true, + ] ); echo ''; From 95eecb1b7e89abb4c7f3273b357eb579a2a2614e Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Mon, 24 Oct 2022 09:41:57 +0200 Subject: [PATCH 007/474] Little changes --- pandora_console/include/styles/pandora.css | 186 +-------------------- 1 file changed, 4 insertions(+), 182 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index c19d13ea81..deb107d076 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -9047,16 +9047,16 @@ button.submitButton { justify-content: space-between; flex-direction: row; min-width: 110px; - height: 32px; - font-size: 16px !important; + height: 48px; + font-size: 14px !important; align-items: center; line-height: 24px; box-shadow: 0px 3px 6px #c7c7c7; background-color: #14524f; color: #fff; border: 1px solid #14524f; - border-radius: 5px; - padding-left: 0.5em; + border-radius: 50px; + padding: 0 10px 0 12px; cursor: pointer; } @@ -9072,7 +9072,6 @@ button.submitButton:active { border-color: #0d312f; } -/* Button */ button.inputButton > div, button.submitButton > div { background-color: #fff; @@ -9206,183 +9205,6 @@ button.ui-button.ui-widget.submit-cancel:active { color: #0d312f; } -/* clean the next */ -button.next, -input.next { - background-image: url(../../images/svg/arrow.svg); - background-position: 90% center; - background-repeat: no-repeat; - background-size: 24px; -} - -button.upd, -input.upd { - background-image: url(../../images/input_update.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.wand, -input.wand { - background-image: url(../../images/input_wand.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.wand:disabled, -input.wand:disabled { - background-image: url(../../images/input_wand.disabled.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.search, -input.search { - background-image: url(../../images/input_zoom.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.search:disabled, -input.search:disabled { - background-image: url(../../images/input_zoom.disabled.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.ok, -input.ok { - background-image: url(../../images/input_tick.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.ok:disabled, -input.ok:disabled { - background-image: url(../../images/input_tick.disabled.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.add, -input.add { - background-image: url(../../images/input_add.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.add:disabled, -input.add:disabled { - background-image: url(../../images/input_add.disabled.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.cancel, -input.cancel { - background-image: url(../../images/input_cross.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.cancel:disabled, -input.cancel:disabled { - background-image: url(../../images/input_cross.disabled.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.delete, -input.delete { - background-image: url(../../images/input_delete.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.delete:disabled, -input.delete:disabled { - background-image: url(../../images/input_delete.disabled.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.cog, -input.cog { - background-image: url(../../images/input_cog.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.cog:disabled, -input.cog:disabled { - background-image: url(../../images/input_cog.disabled.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.config, -input.config { - background-image: url(../../images/input_config.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.config:disabled, -input.config:disabled { - background-image: url(../../images/input_config.disabled.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.filter, -input.filter { - background-image: url(../../images/input_filter.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.filter:disabled, -input.filter:disabled { - background-image: url(../../images/input_filter.disabled.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.pdf, -input.pdf { - background-image: url(../../images/input_pdf.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.pdf:disabled, -input.pdf:disabled { - background-image: url(../../images/input_pdf.disabled.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.camera, -input.camera { - background-image: url(../../images/input_camera.png); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.spinn, -input.spinn { - background-image: url(../../images/spinner_green.gif); - background-position: 90% center; - background-repeat: no-repeat; -} - -button.deploy, -input.deploy { - background-image: url(../../images/input_deploy.png); - background-position: 90% center; - background-repeat: no-repeat; -} - .password_input { background-color: transparent !important; border: none !important; From b2b9de121017139227b39406c21b63795b442705 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Mon, 24 Oct 2022 12:05:51 +0200 Subject: [PATCH 008/474] Improved visual styles continuing guide line --- pandora_console/include/styles/pandora.css | 33 ++++++++++++++++------ 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index deb107d076..cda80757a5 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -1826,6 +1826,9 @@ table.rounded_cells td { display: flex; flex-direction: row-reverse; } +.action-buttons > button { + margin-left: 16px; +} .right { text-align: right; } @@ -9052,24 +9055,31 @@ button.submitButton { align-items: center; line-height: 24px; box-shadow: 0px 3px 6px #c7c7c7; - background-color: #14524f; color: #fff; border: 1px solid #14524f; border-radius: 50px; padding: 0 10px 0 12px; cursor: pointer; + background: linear-gradient( + 90deg, + #14524f 0%, + #14524f 49%, + #1d7873 50%, + #1d7873 100% + ); + background-size: 200% 1px; + transition: ease-in 0.3s; } button.inputButton:hover, button.submitButton:hover { - background-color: #1d7873; - border-color: #1d7873; + background-position: -100% 0; } button.inputButton:active, button.submitButton:active { - background-color: #0d312f; - border-color: #0d312f; + transition: ease-in 100ms; + border: 5px solid #57ea82; } button.inputButton > div, @@ -9135,6 +9145,7 @@ button div.search { } button div.wand, +button div.update, button div.upd { mask: url(../../images/svg/success.svg) no-repeat center / contain; -webkit-mask: url(../../images/svg/success.svg) no-repeat center / contain; @@ -9164,13 +9175,13 @@ button.ui-button-text-only.ui-widget.sub { justify-content: center; flex-direction: column; align-content: center; - min-width: 100px; + min-width: 180px; height: 32px; font-size: 16px !important; align-items: center; line-height: 24px; box-shadow: 0px 3px 6px #c7c7c7; - border-radius: 5px; + border-radius: 16px; cursor: pointer; padding: 0; } @@ -9198,11 +9209,15 @@ button.ui-button.ui-widget.submit-cancel { } button.ui-button.ui-widget.submit-cancel:hover { - color: #1d7873; + /*color: #1d7873;*/ + background-color: #e1e7ee; + border-color: #e1e7ee; } button.ui-button.ui-widget.submit-cancel:active { - color: #0d312f; + color: #fff; + background-color: #96a2bf; + border-color: #96a2bf; } .password_input { From d0fa29d2de13707c68787151535c239e9e34fac5 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Mon, 24 Oct 2022 12:06:45 +0200 Subject: [PATCH 009/474] Adapted some buttons --- .../general/first_task/service_list.php | 7 ++++- .../general/first_task/transactional_list.php | 7 ++++- .../godmode/servers/modificar_server.php | 31 +++++++++++++------ 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/pandora_console/general/first_task/service_list.php b/pandora_console/general/first_task/service_list.php index f3b816c006..0ea4a01878 100755 --- a/pandora_console/general/first_task/service_list.php +++ b/pandora_console/general/first_task/service_list.php @@ -37,7 +37,12 @@ ui_require_css_file('first_task'); ?>

    - +
    diff --git a/pandora_console/general/first_task/transactional_list.php b/pandora_console/general/first_task/transactional_list.php index c1d9ef2f42..4fe3f52e7a 100644 --- a/pandora_console/general/first_task/transactional_list.php +++ b/pandora_console/general/first_task/transactional_list.php @@ -38,7 +38,12 @@ Transaction graphs represent the different processes within our infrastructure t ?>

    - +
    diff --git a/pandora_console/godmode/servers/modificar_server.php b/pandora_console/godmode/servers/modificar_server.php index 34524c6aa7..6aec7b7ba7 100644 --- a/pandora_console/godmode/servers/modificar_server.php +++ b/pandora_console/godmode/servers/modificar_server.php @@ -96,17 +96,30 @@ if (isset($_GET['server'])) { html_print_table($table); - echo '
    '; - echo ''; - echo '
    '; + html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_submit_button( + __('Update'), + '', + false, + [ 'icon' => 'update' ], + true + ), + ] + ); + echo ''; - if ($row['server_type'] == 13) { - echo '
    '; - ui_toggle($content, __('Credential boxes'), '', 'toggle_credential', false); - echo '
    '; + if ((int) $row['server_type'] === 13) { + html_print_div( + [ + 'class' => 'mrgn_top_20px', + 'content' => ui_toggle($content, __('Credential boxes'), '', 'toggle_credential', false, true), + ], + ); } -} else if (isset($_GET['server_remote'])) { +} else if (isset($_GET['server_remote']) === true) { // Headers. $id_server = get_parameter_get('server_remote'); $ext = get_parameter('ext', ''); @@ -168,7 +181,7 @@ if (isset($_GET['server'])) { ui_print_page_header(__('%s servers', get_product_name()), 'images/gm_servers.png', false, '', true); // Move SNMP modules back to the enterprise server. - if (isset($_GET['server_reset_snmp_enterprise'])) { + if (isset($_GET['server_reset_snmp_enterprise']) === true) { $result = db_process_sql('UPDATE tagente_estado SET last_error=0'); if ($result === false) { From 828f12e6f39c2adaa45672199bc08a94f06ef72d Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Mon, 24 Oct 2022 12:34:03 +0200 Subject: [PATCH 010/474] Defined buttons --- pandora_console/include/styles/pandora.css | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index cda80757a5..0a67d0d04b 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -9051,7 +9051,8 @@ button.submitButton { flex-direction: row; min-width: 110px; height: 48px; - font-size: 14px !important; + font-size: 13px !important; + font-family: "Pandora-Light"; align-items: center; line-height: 24px; box-shadow: 0px 3px 6px #c7c7c7; @@ -9166,6 +9167,10 @@ button div.cancel { -webkit-mask: url(../../images/svg/left.svg) no-repeat center / contain; } +button div.cog { + mask: url(../../images/svg/cog.svg) no-repeat center / contain; + -webkit-mask: url(../../images/svg/cog.svg) no-repeat center / contain; +} .ui-dialog-buttonset { display: flex; } From dca36cbe0b12e9a403b60fcb884236d6fe5c4dea Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Mon, 24 Oct 2022 13:12:11 +0200 Subject: [PATCH 011/474] Improve CSS --- pandora_console/include/styles/pandora.css | 2 +- pandora_console/include/styles/wizard.css | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 0a67d0d04b..c9e9548a24 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -9068,7 +9068,7 @@ button.submitButton { #1d7873 50%, #1d7873 100% ); - background-size: 200% 1px; + background-size: 202% 1px; transition: ease-in 0.3s; } diff --git a/pandora_console/include/styles/wizard.css b/pandora_console/include/styles/wizard.css index 4f55f19e3e..9d01aa42aa 100644 --- a/pandora_console/include/styles/wizard.css +++ b/pandora_console/include/styles/wizard.css @@ -155,9 +155,18 @@ ul.wizard li > textarea { } .action_button_list { + display: flex; + align-content: center; + justify-content: flex-end; height: 60px; } +.action_button_list ul { + display: flex; + flex-direction: row-reverse; + justify-content: flex-start; + align-items: center; +} .action_button_list li { display: inline; } From 4cf92cc995da5fb9781ff355929da9fb744f2f95 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Mon, 24 Oct 2022 13:13:56 +0200 Subject: [PATCH 012/474] Adapted views --- pandora_console/godmode/setup/links.php | 34 ++++++++++++++++--- .../operation/agentes/pandora_networkmap.php | 26 +++++++++----- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/pandora_console/godmode/setup/links.php b/pandora_console/godmode/setup/links.php index 7135936d34..adb23600d5 100644 --- a/pandora_console/godmode/setup/links.php +++ b/pandora_console/godmode/setup/links.php @@ -123,12 +123,26 @@ if ((isset($_GET['form_add'])) or (isset($_GET['form_edit']))) { echo ''; echo ""; echo "
    "; - if (isset($_GET['form_add'])) { - echo ""; + if (isset($_GET['form_add']) === true) { + $actionForPerform = __('Create'); + $iconForPerform = 'wand'; } else { - echo ""; + $actionForPerform = __('Update'); + $iconForPerform = 'update'; } + html_print_div( + [ + 'class' => 'action-buttons', + 'content' => html_print_submit_button( + $actionForPerform, + 'crtbutton', + false, + [ 'icon' => $iconForPerform ] + ), + ], + ); + echo '
    '; } else { // Main list view for Links editor @@ -170,6 +184,18 @@ if ((isset($_GET['form_add'])) or (isset($_GET['form_edit']))) { echo ""; echo "
    "; echo "
    "; - echo ""; + + html_print_div( + [ + 'class' => 'action-buttons', + 'content' => html_print_submit_button( + __('Add'), + 'form_add', + false, + [ 'icon' => 'wand' ] + ), + ], + ); + echo '
    '; } diff --git a/pandora_console/operation/agentes/pandora_networkmap.php b/pandora_console/operation/agentes/pandora_networkmap.php index 9c57ad033f..5a03df54a4 100644 --- a/pandora_console/operation/agentes/pandora_networkmap.php +++ b/pandora_console/operation/agentes/pandora_networkmap.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2021 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2022 Artica Soluciones Tecnologicas * Please see http://pandorafms.org for full contribution list * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -822,19 +822,27 @@ switch ($tab) { } if ($networkmaps_write || $networkmaps_manage) { - echo "
    "; - echo '
    '; + echo ''; html_print_input_hidden('new_networkmap', 1); - html_print_submit_button(__('Create network map'), 'crt', false, 'class="sub next float-right"'); echo '
    '; - echo '
    '; - echo "
    "; - echo '
    '; + echo ''; html_print_input_hidden('new_empty_networkmap', 1); - html_print_submit_button(__('Create empty network map'), 'crt', false, 'class="sub next float-right mrgn_right_20px"'); echo '
    '; - echo '
    '; + + html_print_div( + [ + 'class' => 'action-buttons', + 'content' => html_print_submit_button(__('Create network map'), 'crt', false, [ 'icon' => 'next', 'form' => 'new_networkmap' ], true).html_print_submit_button(__('Create empty network map'), 'crt', false, [ 'icon' => 'next', 'form' => 'empty_networkmap' ], true), + ], + false + ); + /* + echo "
    "; + html_print_submit_button(__('Create network map'), 'crt', false, 'class="sub next"'); + html_print_submit_button(__('Create empty network map'), 'crt', false, 'class="sub next"'); + echo '
    '; + */ } break; } From 9cc811a436be4726da9eb70e535b5f979bd05336 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Mon, 24 Oct 2022 13:14:19 +0200 Subject: [PATCH 013/474] Improve code for buttons --- pandora_console/include/functions_html.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index f916bb917a..4b10ba8917 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -3335,16 +3335,15 @@ function html_print_submit_button($label='OK', $name='', $disabled=false, $attri // Icon for show in button. $iconToUse = ''; + $attributesOutput = ''; if (is_array($attributes) === true) { - $attr_array = $attributes; - $attributes = ''; - foreach ($attr_array as $attribute => $value) { + foreach ($attributes as $attribute => $value) { if ($attribute === 'icon') { $iconToUse = $value; } else if ($attribute === 'secondary') { $secondary = true; } else { - $attributes .= $attribute.'="'.$value.'" '; + $attributesOutput .= $attribute.'="'.$value.'" '; } } } else if (empty($attributes) === false && is_string($attributes) === true) { @@ -3374,9 +3373,10 @@ function html_print_submit_button($label='OK', $name='', $disabled=false, $attri } $output = sprintf( - '', + '', $secondary, ($disabled === true) ? ' disabled' : '', + $attributesOutput, $label, $iconDiv ); @@ -3460,7 +3460,7 @@ function html_print_button($label='OK', $name='', $disabled=false, $script='', $ } $output = sprintf( - '', + '', $secondary, (empty($name) === false) ? ' name="'.$name.'"' : '', (empty($name) === false) ? ' id="button-'.$name.'"' : '', From 300a07c3b2c8a6d4bfa927e03f610a3acdcd7f9c Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Mon, 24 Oct 2022 14:54:15 +0200 Subject: [PATCH 014/474] Improve buttons --- pandora_console/include/styles/pandora.css | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index c9e9548a24..e47d1f3afd 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -9057,10 +9057,14 @@ button.submitButton { line-height: 24px; box-shadow: 0px 3px 6px #c7c7c7; color: #fff; - border: 1px solid #14524f; + border: 2px solid #14524f; border-radius: 50px; padding: 0 10px 0 12px; cursor: pointer; +} + +button.inputButton:not(.secondary), +button.submitButton:not(.secondary) { background: linear-gradient( 90deg, #14524f 0%, @@ -9075,13 +9079,19 @@ button.submitButton { button.inputButton:hover, button.submitButton:hover { background-position: -100% 0; + /*border: 5px solid #1d7873;*/ } button.inputButton:active, button.submitButton:active { transition: ease-in 100ms; - border: 5px solid #57ea82; + border: 2px solid #57ea82; } +/*button.inputButton:active, +button.submitButton:active { + transition: ease-in 100ms; + background-color: #0d312f; +}*/ button.inputButton > div, button.submitButton > div { From 3634aab8077d840691d817ff1f925240b2ea7268 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Mon, 24 Oct 2022 19:54:15 +0200 Subject: [PATCH 015/474] Code improvement --- pandora_console/include/functions_html.php | 85 ++++++++-------------- pandora_console/include/styles/pandora.css | 67 ++++++++++++----- 2 files changed, 77 insertions(+), 75 deletions(-) diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 4b10ba8917..4d3ae6abc5 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -3329,56 +3329,19 @@ function html_print_input_color($name, $value, $id='', $class=false, $return=fal */ function html_print_submit_button($label='OK', $name='', $disabled=false, $attributes='', $return=false) { - if (empty($name) === true) { - $name = 'unnamed'; + if (is_string($attributes) === true) { + $attributes = []; } - // Icon for show in button. - $iconToUse = ''; - $attributesOutput = ''; - if (is_array($attributes) === true) { - foreach ($attributes as $attribute => $value) { - if ($attribute === 'icon') { - $iconToUse = $value; - } else if ($attribute === 'secondary') { - $secondary = true; - } else { - $attributesOutput .= $attribute.'="'.$value.'" '; - } - } - } else if (empty($attributes) === false && is_string($attributes) === true) { - $tmpData = explode(' ', $attributes); - $iconToUse = $tmpData[(array_search('sub', $tmpData) + 1)]; - $iconToUse = preg_replace('([^A-Za-z])', '', $iconToUse); - } + $attributes['type'] = 'submit'; - // $secondary = true; - // Transform secondary boolean to string. - $secondary = ($secondary === true) ? ' secondary' : ''; - - if (empty($iconToUse) === false) { - $iconDiv = html_print_div( - [ - 'style' => '', - 'class' => sprintf( - 'subIcon %s%s', - $iconToUse, - $secondary - ), - ], - true - ); - } else { - $iconDiv = ''; - } - - $output = sprintf( - '', - $secondary, - ($disabled === true) ? ' disabled' : '', - $attributesOutput, + $output = html_print_button( $label, - $iconDiv + $name, + $disabled, + '', + $attributes, + true ); if ($return === false) { @@ -3407,6 +3370,7 @@ function html_print_submit_button($label='OK', $name='', $disabled=false, $attri function html_print_button($label='OK', $name='', $disabled=false, $script='', $attributes='', $return=false, $imageButton=false, $modal=false, $message='') { $output = ''; + $classes = ''; if (empty($name) === true) { $name = 'unnamed'; @@ -3420,8 +3384,14 @@ function html_print_button($label='OK', $name='', $disabled=false, $script='', $ foreach ($attr_array as $attribute => $value) { if ($attribute === 'icon') { $iconToUse = $value; - } else if ($attribute === 'secondary') { - $secondary = true; + } else if ($attribute === 'mode') { + $buttonMode = $value; + $classes .= ' '.$value; + } else if ($attribute === 'type') { + $buttonType = $value; + $classes .= ' '.$value.'Button'; + } else if ($attribute === 'class') { + $classes .= ' '.$value; } else { $attributes .= $attribute.'="'.$value.'" '; } @@ -3432,18 +3402,14 @@ function html_print_button($label='OK', $name='', $disabled=false, $script='', $ $iconToUse = preg_replace('([^A-Za-z])', '', $iconToUse); } - // $secondary = true; - // Transform secondary boolean to string. - $secondary = ($secondary === true) ? ' secondary' : ''; - if (empty($iconToUse) === false) { $iconDiv = html_print_div( [ 'style' => '', 'class' => sprintf( - 'subIcon %s%s', + 'subIcon %s %s', $iconToUse, - $secondary + (isset($buttonMode) === true) ? $buttonMode : '' ), ], true @@ -3459,9 +3425,16 @@ function html_print_button($label='OK', $name='', $disabled=false, $script='', $ $content = $iconDiv; } + // In case of not selected button type, in this case, will be normal button. + if (isset($buttonType) === false || ($buttonType !== 'button' && $buttonType !== 'submit')) { + $buttonType = 'button'; + $classes .= ' buttonButton'; + } + $output = sprintf( - '', - $secondary, + '', + $buttonType, + $classes, (empty($name) === false) ? ' name="'.$name.'"' : '', (empty($name) === false) ? ' id="button-'.$name.'"' : '', (empty($label) === false) ? ' value="'.$label.'"' : '', diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index e47d1f3afd..fee3efcb72 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -9044,7 +9044,7 @@ input[type="submit"].secondary:active { color: #0d312f; } -button.inputButton, +button.buttonButton, button.submitButton { display: flex; justify-content: space-between; @@ -9063,8 +9063,43 @@ button.submitButton { cursor: pointer; } -button.inputButton:not(.secondary), -button.submitButton:not(.secondary) { +button.buttonButton.mini, +button.submitButton.mini { + height: 32px; +} + +button.buttonButton.link, +button.submitButton.link { + height: 32px; + text-decoration: underline; + box-shadow: none; + background: rgba(0, 0, 0, 0) !important; + border-color: rgba(0, 0, 0, 0) !important; + color: #14524f; +} + +button.buttonButton.link > div, +button.submitButton.link > div { + color: #14524f; +} + +button.buttonButton.link:hover, +button.submitButton.link:hover, +button.buttonButton.link > div:hover, +button.submitButton.link > div:hover { + background-color: #e1e7ee; +} + +button.buttonButton.link:hover, +button.submitButton.link:hover, +button.buttonButton.link > div:hover, +button.submitButton.link > div:hover { + color: #fff; + background-color: #96a2bf; +} + +button.buttonButton:not(.secondary):not(.link), +button.submitButton:not(.secondary):not(.link) { background: linear-gradient( 90deg, #14524f 0%, @@ -9076,24 +9111,18 @@ button.submitButton:not(.secondary) { transition: ease-in 0.3s; } -button.inputButton:hover, +button.buttonButton:hover, button.submitButton:hover { - background-position: -100% 0; - /*border: 5px solid #1d7873;*/ + background-position: -100% 0 !important; } -button.inputButton:active, +button.buttonButton:active, button.submitButton:active { transition: ease-in 100ms; border: 2px solid #57ea82; } -/*button.inputButton:active, -button.submitButton:active { - transition: ease-in 100ms; - background-color: #0d312f; -}*/ -button.inputButton > div, +button.buttonButton > div, button.submitButton > div { background-color: #fff; width: 2rem; @@ -9101,36 +9130,36 @@ button.submitButton > div { margin-left: 1rem; } -button.inputButton.secondary, +button.buttonButton.secondary, button.submitButton.secondary { background-color: #fff; color: #14524f; border: 2px solid #14524f; } -button.inputButton.secondary > div, +button.buttonButton.secondary > div, button.submitButton.secondary > div { background-color: #14524f !important; } -button.inputButton.secondary:hover, +button.buttonButton.secondary:hover, button.submitButton.secondary:hover { color: #1d7873 !important; border-color: #1d7873 !important; } -button.inputButton.secondary:hover > div, +button.buttonButton.secondary:hover > div, button.submitButton.secondary:hover > div { background-color: #1d7873 !important; } -button.inputButton.secondary:active, +button.buttonButton.secondary:active, button.submitButton.secondary:active { color: #0d312f !important; border-color: #0d312f !important; } -button.inputButton.secondary:active > div, +button.buttonButton.secondary:active > div, button.submitButton.secondary:active > div { background-color: #0d312f !important; } From 00de0faac3a5181694f4749f092e0b99fe24aa11 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Mon, 24 Oct 2022 19:55:22 +0200 Subject: [PATCH 016/474] Adapted views --- pandora_console/extensions/module_groups.php | 4 +- .../godmode/agentes/agent_manager.php | 26 +++++++---- .../godmode/agentes/modificar_agente.php | 24 +++++----- .../godmode/agentes/module_manager.php | 4 +- .../godmode/events/event_edit_filter.php | 4 +- pandora_console/include/ajax/events.php | 44 +++++++++++-------- .../include/class/ModuleTemplates.class.php | 12 ++--- .../operation/agentes/estado_agente.php | 4 +- 8 files changed, 71 insertions(+), 51 deletions(-) diff --git a/pandora_console/extensions/module_groups.php b/pandora_console/extensions/module_groups.php index 4dfe0e6b6d..d8b432da08 100644 --- a/pandora_console/extensions/module_groups.php +++ b/pandora_console/extensions/module_groups.php @@ -285,8 +285,8 @@ function mainModuleGroups() 'srcbutton', false, [ - 'icon' => 'search', - 'secondary' => true, + 'icon' => 'search', + 'mode' => 'secondary', ] ); echo ''; diff --git a/pandora_console/godmode/agentes/agent_manager.php b/pandora_console/godmode/agentes/agent_manager.php index 676a4db993..f5a8154908 100644 --- a/pandora_console/godmode/agentes/agent_manager.php +++ b/pandora_console/godmode/agentes/agent_manager.php @@ -967,26 +967,34 @@ echo ''; if ($id_agente) { - echo '
    '; - html_print_submit_button( + $submitButton = html_print_submit_button( __('Update'), 'updbutton', false, - 'class="sub upd"' + [ 'icon' => 'update'], + true ); - html_print_input_hidden('update_agent', 1); - html_print_input_hidden('id_agente', $id_agente); + $submitButton .= html_print_input_hidden('update_agent', 1); + $submitButton .= html_print_input_hidden('id_agente', $id_agente); } else { - html_print_submit_button( + $submitButton = html_print_submit_button( __('Create'), 'crtbutton', false, - 'class="sub wand"' + [ 'icon' => 'wand'], + true ); - html_print_input_hidden('create_agent', 1); + $submitButton .= html_print_input_hidden('create_agent', 1); } -echo '
    '; +html_print_div( + [ + 'class' => 'action-buttons', + 'content' => $submitButton, + ] +); + +echo ''; ui_require_jquery_file('pandora.controls'); ui_require_jquery_file('ajaxqueue'); diff --git a/pandora_console/godmode/agentes/modificar_agente.php b/pandora_console/godmode/agentes/modificar_agente.php index abaef3eaaa..b91b1556bc 100644 --- a/pandora_console/godmode/agentes/modificar_agente.php +++ b/pandora_console/godmode/agentes/modificar_agente.php @@ -374,8 +374,8 @@ html_print_submit_button( 'srcbutton', false, [ - 'icon' => 'search', - 'secondary' => true, + 'icon' => 'search', + 'mode' => 'mini', ] ); echo ''; @@ -955,19 +955,23 @@ if ($agents !== false) { if ((bool) check_acl($config['id_user'], 0, 'AW') === true) { // Create agent button. - echo '
    '; echo '
    '; - html_print_submit_button( - __('Create agent'), - 'crt-2', - false, + html_print_div( [ - 'icon' => 'search', - 'secondary' => true, + 'class' => 'action-buttons', + 'content' => html_print_submit_button( + __('Create agent'), + 'crt-2', + false, + [ + 'icon' => 'cog', + 'mode' => 'secondary', + ], + true + ), ] ); echo '
    '; - echo '
    '; } echo ''; diff --git a/pandora_console/godmode/agentes/module_manager.php b/pandora_console/godmode/agentes/module_manager.php index 20ecf6145a..35f50687db 100644 --- a/pandora_console/godmode/agentes/module_manager.php +++ b/pandora_console/godmode/agentes/module_manager.php @@ -231,8 +231,8 @@ if (($policy_page) || (isset($agent))) { 'updbutton', false, [ - 'icon' => 'next', - 'secondary' => true, + 'icon' => 'next', + 'mode' => 'secondary', ] ); echo ''; diff --git a/pandora_console/godmode/events/event_edit_filter.php b/pandora_console/godmode/events/event_edit_filter.php index 91045ce0ea..8badf3d1e2 100644 --- a/pandora_console/godmode/events/event_edit_filter.php +++ b/pandora_console/godmode/events/event_edit_filter.php @@ -675,10 +675,10 @@ echo '
    '; if ($id) { html_print_input_hidden('update', 1); html_print_input_hidden('id', $id); - html_print_submit_button(__('Update'), 'crt', false, 'class="sub upd"'); + html_print_submit_button(__('Update'), 'crt', false, ['icon' => 'update']); } else { html_print_input_hidden('create', 1); - html_print_submit_button(__('Create'), 'crt', false, 'class="sub wand"'); + html_print_submit_button(__('Create'), 'crt', false, ['icon' => 'wand']); } echo '
    '; diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index 0d0b77ffd4..3b19e13a52 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -553,16 +553,13 @@ if ($load_filter_modal) { $table->width = '100%'; $table->cellspacing = 4; $table->cellpadding = 4; + $table->styleTable = 'font-weight: bold; color: #555; text-align:left;'; $table->class = 'databox'; - if (is_metaconsole()) { + $filter_id_width = '200px'; + if (is_metaconsole() === true) { $table->cellspacing = 0; $table->cellpadding = 0; $table->class = 'databox filters'; - } - - $table->styleTable = 'font-weight: bold; color: #555; text-align:left;'; - $filter_id_width = '200px'; - if (is_metaconsole()) { $filter_id_width = '150px'; } @@ -587,7 +584,10 @@ if ($load_filter_modal) { __('Load filter'), 'load_filter', false, - 'class="sub upd"', + [ + 'icon' => 'update', + 'mode' => 'secondary', + ], true ); $data[1] .= html_print_input_hidden('load_filter', 1, true); @@ -726,14 +726,14 @@ if ($save_filter_modal) { $table->cellspacing = 4; $table->cellpadding = 4; $table->class = 'databox'; - if (is_metaconsole()) { + if (is_metaconsole() === true) { $table->class = 'databox filters'; $table->cellspacing = 0; $table->cellpadding = 0; } $table->styleTable = 'font-weight: bold; text-align:left;'; - if (!is_metaconsole()) { + if (is_metaconsole() === false) { $table->style[0] = 'width: 50%; width:50%;'; } @@ -824,15 +824,23 @@ if ($save_filter_modal) { $table->rowclass[] = ''; html_print_table($table); - echo '
    '; - echo html_print_submit_button( - __('Save filter'), - 'save_filter', - false, - 'class="sub upd float-right" onclick="save_new_filter();"', - true - ); - echo '
    '; + + html_print_div( + [ + 'class' => 'action-buttons', + 'content' => html_print_submit_button( + __('Save filter'), + 'save_filter', + false, + [ + 'icon' => 'update', + 'mode' => 'secondary', + 'onClick' => 'save_new_filter();', + ], + true + ), + ] + ); } else { include 'general/noaccess.php'; } diff --git a/pandora_console/include/class/ModuleTemplates.class.php b/pandora_console/include/class/ModuleTemplates.class.php index ba67142560..f478549269 100644 --- a/pandora_console/include/class/ModuleTemplates.class.php +++ b/pandora_console/include/class/ModuleTemplates.class.php @@ -998,16 +998,16 @@ class ModuleTemplates extends HTML { global $config; - $createNewTemplate = ($this->id_np == 0) ? true : false; + $createNewTemplate = ((int) $this->id_np === 0); - if ($createNewTemplate) { + if ($createNewTemplate === true) { // Assignation for submit button. - $formButtonClass = 'sub wand'; + $formButtonClass = 'wand'; $formAction = 'create'; $formButtonLabel = __('Create'); } else { // Assignation for submit button. - $formButtonClass = 'sub upd'; + $formButtonClass = 'update'; $formAction = 'update'; $formButtonLabel = __('Update'); } @@ -1099,7 +1099,7 @@ class ModuleTemplates extends HTML 'name' => 'action_button', 'label' => $formButtonLabel, 'type' => 'submit', - 'attributes' => 'class="float-right '.$formButtonClass.'"', + 'attributes' => [ 'icon' => $formButtonClass ], 'return' => true, ], ]; @@ -1110,7 +1110,7 @@ class ModuleTemplates extends HTML 'name' => 'add_components_button', 'label' => __('Add components'), 'type' => 'button', - 'attributes' => 'class="float-right sub cog"', + 'attributes' => [ 'icon' => 'cog' ], 'script' => 'showAddComponent();', 'return' => true, ], diff --git a/pandora_console/operation/agentes/estado_agente.php b/pandora_console/operation/agentes/estado_agente.php index 4b634f5f53..0dd5469f33 100644 --- a/pandora_console/operation/agentes/estado_agente.php +++ b/pandora_console/operation/agentes/estado_agente.php @@ -292,8 +292,8 @@ html_print_submit_button( 'srcbutton', false, [ - 'icon' => 'search', - 'secondary' => true, + 'icon' => 'search', + 'mode' => 'secondary', ] ); From 15f2a6ae8851ecc253f618296867299ebecbad84 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Tue, 25 Oct 2022 09:08:34 +0200 Subject: [PATCH 017/474] Testing with links --- .../godmode/setup/setup_visuals.php | 29 ++++++++++++++++--- pandora_console/include/styles/pandora.css | 10 ++++--- 2 files changed, 31 insertions(+), 8 deletions(-) diff --git a/pandora_console/godmode/setup/setup_visuals.php b/pandora_console/godmode/setup/setup_visuals.php index 897d5ddea0..af64e0055a 100755 --- a/pandora_console/godmode/setup/setup_visuals.php +++ b/pandora_console/godmode/setup/setup_visuals.php @@ -160,7 +160,18 @@ $table_styles->data[$row][1] = html_print_select( '', true ); -$table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'status_set_preview', false, '', 'class="sub camera logo_preview"', true); +$table_styles->data[$row][1] .= html_print_button( + __('View'), + 'status_set_preview', + false, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true +); $row++; // Divs to show icon status Colours (Default). @@ -1579,9 +1590,19 @@ echo ''.__('Other configuration').' '.ui_print_help_icon('other_conf_tab html_print_table($table_other); echo ''; -echo '
    '; -html_print_submit_button(__('Update'), 'update_button', false, 'class="sub upd"'); -echo '
    '; +html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_submit_button( + __('Update'), + 'update_button', + false, + [ 'icon' => 'next' ], + true + ), + ] +); + echo ''; diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index fee3efcb72..aa1d4c754f 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -9071,7 +9071,6 @@ button.submitButton.mini { button.buttonButton.link, button.submitButton.link { height: 32px; - text-decoration: underline; box-shadow: none; background: rgba(0, 0, 0, 0) !important; border-color: rgba(0, 0, 0, 0) !important; @@ -9091,11 +9090,14 @@ button.submitButton.link > div:hover { } button.buttonButton.link:hover, -button.submitButton.link:hover, +button.submitButton.link:hover { + color: #1d7873; + text-decoration: underline; + font-family: "Pandora-Bold"; +} button.buttonButton.link > div:hover, button.submitButton.link > div:hover { - color: #fff; - background-color: #96a2bf; + background-color: #1d7873; } button.buttonButton:not(.secondary):not(.link), From 70d0e38382e55da66908a1327f2a4b16b8664d07 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Tue, 25 Oct 2022 11:46:28 +0200 Subject: [PATCH 018/474] Adapt views --- .../godmode/setup/setup_visuals.php | 262 +++++++++++++++--- .../godmode/users/configure_user.php | 10 +- pandora_console/include/functions_events.php | 40 ++- pandora_console/include/functions_ui.php | 40 ++- .../operation/network/network_report.php | 2 +- 5 files changed, 297 insertions(+), 57 deletions(-) diff --git a/pandora_console/godmode/setup/setup_visuals.php b/pandora_console/godmode/setup/setup_visuals.php index af64e0055a..3e0e5cc817 100755 --- a/pandora_console/godmode/setup/setup_visuals.php +++ b/pandora_console/godmode/setup/setup_visuals.php @@ -130,6 +130,7 @@ $table_styles = new stdClass(); $table_styles->width = '100%'; $table_styles->class = 'databox filters'; $table_styles->style[0] = 'font-weight: bold;'; +$table_styles->style[1] = 'display: flex; align-items: center;'; $table_styles->size[0] = '50%'; $table_styles->data = []; @@ -146,7 +147,6 @@ $table_styles->data[$row][1] = html_print_select( ); $row++; - $table_styles->data[$row][0] = __('Status icon set'); $iconsets['default'] = __('Colors'); $iconsets['faces'] = __('Faces'); @@ -236,7 +236,18 @@ $table_styles->data[$row][1] = html_print_select( false, 'width:240px' ); -$table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'login_background_preview', false, '', 'class="sub camera logo_preview"', true); +$table_styles->data[$row][1] .= html_print_button( + __('View'), + 'login_background_preview', + false, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true +); $row++; @@ -290,16 +301,44 @@ function logo_custom_enterprise($name, $logo) $table_styles->data[$row][0] = __('Custom logo (menu)'); $table_styles->data[$row][1] = logo_custom_enterprise('custom_logo', $config['custom_logo']); -$table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_logo_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); +$table_styles->data[$row][1] .= ' '.html_print_button( + __('View'), + 'custom_logo_preview', + $open, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true, + false, + $open, + 'visualmodal' +); $row++; $table_styles->data[$row][0] = __('Custom logo collapsed (menu)'); $table_styles->data[$row][1] = logo_custom_enterprise('custom_logo_collapsed', $config['custom_logo_collapsed']); -$table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_logo_collapsed_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); +$table_styles->data[$row][1] .= ' '.html_print_button( + __('View'), + 'custom_logo_collapsed_preview', + $open, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true, + false, + $open, + 'visualmodal' +); $row++; $table_styles->data[$row][0] = __('Custom logo (header white background)'); -if (enterprise_installed()) { +if (enterprise_installed() === true) { $ent_files = list_files('enterprise/images/custom_logo', 'png', 1, 0); $open_files = list_files('images/custom_logo', 'png', 1, 0); @@ -334,7 +373,21 @@ if (enterprise_installed()) { ); } -$table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_logo_white_bg_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); +$table_styles->data[$row][1] .= ' '.html_print_button( + __('View'), + 'custom_logo_white_bg_preview', + $open, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true, + false, + $open, + 'visualmodal' +); $row++; $table_styles->data[$row][0] = __('Custom logo (login)'); @@ -371,11 +424,25 @@ if (enterprise_installed()) { ); } -$table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_logo_login_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); +$table_styles->data[$row][1] .= ' '.html_print_button( + __('View'), + 'custom_logo_login_preview', + $open, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true, + false, + $open, + 'visualmodal' +); $row++; -// Splash login -if (enterprise_installed()) { +// Splash login. +if (enterprise_installed() === true) { $table_styles->data[$row][0] = __('Custom Splash (login)'); $table_styles->data[$row][1] = html_print_select( @@ -393,11 +460,25 @@ if (enterprise_installed()) { 'width:240px' ); - $table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_splash_login_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); + $table_styles->data[$row][1] .= ' '.html_print_button( + __('View'), + 'custom_splash_login_preview', + $open, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true, + false, + $open, + 'visualmodal' + ); $row++; } -if (enterprise_installed()) { +if (enterprise_installed() === true) { // Get all the custom logos. $files = list_files('enterprise/images/custom_general_logos', 'png', 1, 0); @@ -418,7 +499,21 @@ if (enterprise_installed()) { false, 'width:240px' ); - $table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_docs_logo_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); + $table_styles->data[$row][1] .= ' '.html_print_button( + __('View'), + 'custom_docs_logo_preview', + $open, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true, + false, + $open, + 'visualmodal' + ); $row++; // Custom support icon. @@ -437,7 +532,21 @@ if (enterprise_installed()) { false, 'width:240px' ); - $table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_support_logo_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); + $table_styles->data[$row][1] .= ' '.html_print_button( + __('View'), + 'custom_support_logo_preview', + $open, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true, + false, + $open, + 'visualmodal' + ); $row++; // Custom center networkmap icon. @@ -456,7 +565,21 @@ if (enterprise_installed()) { false, 'width:240px' ); - $table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_network_center_logo_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); + $table_styles->data[$row][1] .= ' '.html_print_button( + __('View'), + 'custom_network_center_logo_preview', + $open, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true, + false, + $open, + 'visualmodal' + ); $row++; // Custom center mobile console icon. @@ -475,7 +598,21 @@ if (enterprise_installed()) { false, 'width:240px' ); - $table_styles->data[$row][1] .= ' '.html_print_button(__('View'), 'custom_mobile_console_logo_preview', $open, '', 'class="sub camera logo_preview"', true, false, $open, 'visualmodal'); + $table_styles->data[$row][1] .= ' '.html_print_button( + __('View'), + 'custom_mobile_console_logo_preview', + $open, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true, + false, + $open, + 'visualmodal' + ); $row++; } @@ -489,45 +626,45 @@ $table_styles->data[$row][0] = __('Subtitle (header)'); $table_styles->data[$row][1] = html_print_input_text('custom_subtitle_header', $config['custom_subtitle_header'], '', 50, 40, true); $row++; -// login title1 -if (enterprise_installed()) { +// Login title1. +if (enterprise_installed() === true) { $table_styles->data[$row][0] = __('Title 1 (login)'); $table_styles->data[$row][1] = html_print_input_text('custom_title1_login', $config['custom_title1_login'], '', 50, 50, true); $row++; } -// login text2 -if (enterprise_installed()) { +// Login text2. +if (enterprise_installed() === true) { $table_styles->data[$row][0] = __('Title 2 (login)'); $table_styles->data[$row][1] = html_print_input_text('custom_title2_login', $config['custom_title2_login'], '', 50, 50, true); $row++; } -if (enterprise_installed()) { +if (enterprise_installed() === true) { $table_styles->data[$row][0] = __('Docs URL (login)'); $table_styles->data[$row][1] = html_print_input_text('custom_docs_url', $config['custom_docs_url'], '', 50, 50, true); $row++; } -if (enterprise_installed()) { +if (enterprise_installed() === true) { $table_styles->data[$row][0] = __('Support URL (login)'); $table_styles->data[$row][1] = html_print_input_text('custom_support_url', $config['custom_support_url'], '', 50, 50, true); $row++; } -if (enterprise_installed()) { +if (enterprise_installed() === true) { $table_styles->data[$row][0] = __('Product name'); $table_styles->data[$row][1] = html_print_input_text('rb_product_name', get_product_name(), '', 30, 255, true); $row++; } -if (enterprise_installed()) { +if (enterprise_installed() === true) { $table_styles->data[$row][0] = __('Copyright notice'); $table_styles->data[$row][1] = html_print_input_text('rb_copyright_notice', get_copyright_notice(), '', 30, 255, true); $row++; } -if (enterprise_installed()) { +if (enterprise_installed() === true) { $table_styles->data[$row][0] = __('Disable logo in graphs'); $table_styles->data[$row][1] = html_print_checkbox_switch( 'fixed_graph', @@ -563,7 +700,7 @@ $table_styles->data[$row][1] = html_print_checkbox_switch( $row++; -// For 5.1 Autohidden menu feature +// For 5.1 Autohidden menu feature. $table_styles->data['autohidden'][0] = __('Automatically hide submenu'); $table_styles->data['autohidden'][1] = html_print_checkbox_switch( 'autohidden_menu', @@ -589,6 +726,7 @@ $table_gis = new stdClass(); $table_gis->width = '100%'; $table_gis->class = 'databox filters'; $table_gis->style[0] = 'font-weight: bold;'; +$table_gis->style[1] = 'display: flex; align-items: center;'; $table_gis->size[0] = '50%'; $table_gis->data = []; @@ -617,7 +755,18 @@ $table_gis->data[$row][1] = html_print_select( '', true ); -$table_gis->data[$row][1] .= ' '.html_print_button(__('View'), 'gis_icon_preview', false, '', 'class="sub camera logo_preview"', true); +$table_gis->data[$row][1] .= ' '.html_print_button( + __('View'), + 'gis_icon_preview', + false, + '', + [ + 'icon' => 'camera', + 'mode' => 'link', + 'class' => 'logo_preview', + ], + true +); $row++; // ---------------------------------------------------------------------- @@ -1323,15 +1472,15 @@ $table_other->data[$row][1] = ''.__('Example').' '.date($config['date_f $table_other->data[$row][1] .= html_print_input_text('date_format', $config['date_format'], '', 30, 100, true); $row++; -if ($config['prominent_time'] == 'comparation') { +if ($config['prominent_time'] === 'comparation') { $timestamp = false; $comparation = true; $compact = false; -} else if ($config['prominent_time'] == 'timestamp') { +} else if ($config['prominent_time'] === 'timestamp') { $timestamp = true; $comparation = false; $compact = false; -} else if ($config['prominent_time'] == 'compact') { +} else if ($config['prominent_time'] === 'compact') { $timestamp = false; $comparation = false; $compact = true; @@ -1363,7 +1512,10 @@ $table_other->data[$row][3] = html_print_button( 'custom_value_add_btn', false, '', - 'class="sub next"', + [ + 'icon' => 'next', + 'mode' => 'secondary mini', + ], true ); @@ -1386,10 +1538,13 @@ $table_other->data[$row][3] = html_print_button( 'custom_values_del_btn', empty($count_custom_postprocess), '', - 'class="sub cancel"', + [ + 'icon' => 'cancel', + 'mode' => 'secondary mini', + ], true ); -// This hidden field will be filled from jQuery before submit +// This hidden field will be filled from jQuery before submit. $table_other->data[$row][1] .= html_print_input_hidden( 'custom_value_to_delete', '', @@ -1414,17 +1569,37 @@ $units = [ $table_other->data[$row][1] = __('Value').': '; $table_other->data[$row][1] .= html_print_input_text('interval_value', '', '', 5, 5, true); $table_other->data[$row][2] = html_print_select($units, 'interval_unit', 1, '', '', '', true, false, false); -$table_other->data[$row][3] = html_print_button(__('Add'), 'interval_add_btn', false, '', 'class="sub next"', true); +$table_other->data[$row][3] = html_print_button( + __('Add'), + 'interval_add_btn', + false, + '', + [ + 'icon' => 'next', + 'mode' => 'secondary mini', + ], + true +); $row++; $table_other->data[$row][0] = ''; $table_other->data[$row][1] = __('Delete interval').': '; $table_other->data[$row][2] = html_print_select(get_periods(false, false), 'intervals', '', '', '', '', true); -$table_other->data[$row][3] = html_print_button(__('Delete'), 'interval_del_btn', empty($config['interval_values']), '', 'class="sub cancel"', true); +$table_other->data[$row][3] = html_print_button( + __('Delete'), + 'interval_del_btn', + empty($config['interval_values']), + '', + [ + 'icon' => 'cancel', + 'mode' => 'secondary mini', + ], + true +); $table_other->data[$row][1] .= html_print_input_hidden('interval_values', $config['interval_values'], true); -// This hidden field will be filled from jQuery before submit +// This hidden field will be filled from jQuery before submit. $table_other->data[$row][1] .= html_print_input_hidden('interval_to_delete', '', true); $table_other->data[$row][3] .= '

    '; // ---------------------------------------------------------------------- @@ -1434,7 +1609,17 @@ $table_other->data[$row][0] = __('Module units'); $table_other->data[$row][1] = __('Value').': '; $table_other->data[$row][1] .= html_print_input_text('custom_module_unit', '', '', 15, 50, true); $table_other->data[$row][2] = ''; -$table_other->data[$row][3] = html_print_button(__('Add'), 'module_unit_add_btn', false, '', 'class="sub next"', true); +$table_other->data[$row][3] = html_print_button( + __('Add'), + 'module_unit_add_btn', + false, + '', + [ + 'icon' => 'next', + 'mode' => 'secondary mini', + ], + true +); $row++; $table_other->data[$row][0] = ''; @@ -1445,7 +1630,10 @@ $table_other->data[$row][3] = html_print_button( 'custom_module_unit_del_btn', empty($count_custom_postprocess), '', - 'class="sub cancel"', + [ + 'icon' => 'cancel', + 'mode' => 'secondary mini', + ], true ); diff --git a/pandora_console/godmode/users/configure_user.php b/pandora_console/godmode/users/configure_user.php index 2609c7f23c..c4d269ab70 100644 --- a/pandora_console/godmode/users/configure_user.php +++ b/pandora_console/godmode/users/configure_user.php @@ -1508,14 +1508,20 @@ if ($config['admin_can_add_user']) { __('Create'), 'crtbutton', false, - 'class="sub wand" form="user_profile_form"' + [ + 'icon' => 'wand', + 'form' => 'user_profile_form', + ] ); } else { html_print_submit_button( __('Update'), 'uptbutton', false, - 'class="sub upd" form="user_profile_form"' + [ + 'icon' => 'update', + 'form' => 'user_profile_form', + ] ); } } diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index a9a5a7d676..f8b17781f8 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -3325,7 +3325,10 @@ function events_page_responses($event) 'owner_button', false, 'event_change_owner('.$event['id_evento'].', '.$event['server_id'].');', - 'class="sub next w70p"', + [ + 'icon' => 'next', + 'mode' => 'mini secondary', + ], true ); @@ -3404,7 +3407,10 @@ function events_page_responses($event) 'status_button', false, 'event_change_status(\''.$event['similar_ids'].'\','.$event['server_id'].');', - 'class="sub next w70p"', + [ + 'icon' => 'next', + 'mode' => 'mini secondary', + ], true ); } @@ -3432,7 +3438,10 @@ function events_page_responses($event) 'comment_button', false, '$(\'#link_comments\').trigger(\'click\');', - 'class="sub next w70p"', + [ + 'icon' => 'next', + 'mode' => 'mini secondary', + ], true ); @@ -3456,7 +3465,10 @@ function events_page_responses($event) 'delete_button', false, 'if(!confirm(\''.__('Are you sure?').'\')) { return false; } this.form.submit();', - 'class="sub cancel w70p"', + [ + 'icon' => 'cancel', + 'mode' => 'mini secondary', + ], true ); $data[2] .= html_print_input_hidden('delete', 1, true); @@ -3511,7 +3523,10 @@ function events_page_responses($event) 'custom_response_button', false, 'execute_response('.$event['id_evento'].','.$server_id.',0)', - "class='sub next w70p'", + [ + 'icon' => 'next', + 'mode' => 'mini secondary', + ], true ); } @@ -4190,7 +4205,10 @@ function events_page_details($event, $server_id=0) 'custom_button', false, '$(\'#link_custom_fields\').trigger(\'click\');', - 'class="sub next"', + [ + 'icon' => 'next', + 'mode' => 'mini secondary', + ], true ); $table_details->data[] = $data; @@ -5042,7 +5060,10 @@ function events_page_comments($event, $ajax=false, $groupedComments=[]) 'comment_button', false, 'event_comment(\''.base64_encode(json_encode($event)).'\');', - 'class="sub next"', + [ + 'icon' => 'next', + 'mode' => 'mini secondary', + ], true ); $comments_form .= '
    '; @@ -5638,7 +5659,10 @@ function get_row_response_action( 'btn_str', false, 'perform_response(\''.base64_encode(json_encode($event_response)).'\','.$response_id.',\''.trim($index).'\')', - "class='sub next'", + [ + 'icon' => 'next', + 'mode' => 'mini secondary', + ], true ); $output .= ''; diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 1e9d9f8dd7..d45097afb3 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -3381,24 +3381,46 @@ function ui_print_datatable(array $parameters) } $filter .= '
  • '; - // Search button. - $filter .= ''; // Extra buttons. if (isset($parameters['form']['extra_buttons']) === true && is_array($parameters['form']['extra_buttons']) === true ) { foreach ($parameters['form']['extra_buttons'] as $button) { - $filter .= ''; + $filter .= html_print_button( + $button['text'], + $button['id'], + false, + $button['onclick'], + [ + 'style' => ($button['style'] ?? ''), + 'mode' => 'mini secondary', + 'class' => $button['class'], + ], + true + ); } } + // Search button. + $filter .= html_print_div( + [ + 'class' => 'action-buttons', + 'content' => html_print_submit_button( + __('Filter'), + $form_id.'_search_bt', + false, + [ + 'icon' => 'search', + 'mode' => 'mini', + 'class' => $search_button_class, + ], + true + ), + ], + true + ); + $filter .= '
  • '; $filter .= '
    '; diff --git a/pandora_console/operation/network/network_report.php b/pandora_console/operation/network/network_report.php index 700f94e01e..b9c4cbf6d1 100644 --- a/pandora_console/operation/network/network_report.php +++ b/pandora_console/operation/network/network_report.php @@ -270,7 +270,7 @@ $chart_data = []; $hide_filter = !empty($main_value) && ($action === 'udp' || $action === 'tcp'); foreach ($data as $item) { $row = []; - $row['main'] = '
    '; + $row['main'] = '
    '; $row['main'] .= $item['host']; if (!$hide_filter) { $row['main'] .= html_print_link_with_params( From 21e0a39b406037355d53fe62394d2fb7eb016f8b Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Tue, 25 Oct 2022 11:46:59 +0200 Subject: [PATCH 019/474] Improve CSS --- pandora_console/include/styles/pandora.css | 81 +++++++++++----------- 1 file changed, 42 insertions(+), 39 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index aa1d4c754f..e54704c111 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -4227,12 +4227,7 @@ form ul.form_flex li ul li { text-align: center; } -.div-v-centered { - display: flex; - align-items: center; -} - -.div-v-centered > form > input[type="image"] { +.flex_center > form > input[type="image"] { margin: 0; padding: 0; width: 14px; @@ -9068,38 +9063,6 @@ button.submitButton.mini { height: 32px; } -button.buttonButton.link, -button.submitButton.link { - height: 32px; - box-shadow: none; - background: rgba(0, 0, 0, 0) !important; - border-color: rgba(0, 0, 0, 0) !important; - color: #14524f; -} - -button.buttonButton.link > div, -button.submitButton.link > div { - color: #14524f; -} - -button.buttonButton.link:hover, -button.submitButton.link:hover, -button.buttonButton.link > div:hover, -button.submitButton.link > div:hover { - background-color: #e1e7ee; -} - -button.buttonButton.link:hover, -button.submitButton.link:hover { - color: #1d7873; - text-decoration: underline; - font-family: "Pandora-Bold"; -} -button.buttonButton.link > div:hover, -button.submitButton.link > div:hover { - background-color: #1d7873; -} - button.buttonButton:not(.secondary):not(.link), button.submitButton:not(.secondary):not(.link) { background: linear-gradient( @@ -9137,6 +9100,7 @@ button.submitButton.secondary { background-color: #fff; color: #14524f; border: 2px solid #14524f; + box-shadow: none; } button.buttonButton.secondary > div, @@ -9166,6 +9130,40 @@ button.submitButton.secondary:active > div { background-color: #0d312f !important; } +button.buttonButton.link, +button.submitButton.link { + background-color: rgba(0, 0, 0, 0); + color: #14524f; + border: 0; + box-shadow: none; + justify-content: flex-start; +} + +button.buttonButton.link > div, +button.submitButton.link > div { + background-color: #14524f !important; +} + +button.buttonButton.link:hover, +button.submitButton.link:hover { + color: #1d7873 !important; + text-decoration: underline; +} + +button.buttonButton.link:hover > div, +button.submitButton.link:hover > div { + background-color: #1d7873 !important; +} + +button.buttonButton.link:active, +button.submitButton.link:active { + color: #0d312f !important; +} + +button.buttonButton.link:active > div, +button.submitButton.link:active > div { + background-color: #0d312f !important; +} button div.camera { mask: url(../../images/svg/picture.svg) no-repeat center / contain; -webkit-mask: url(../../images/svg/picture.svg) no-repeat center / contain; @@ -9255,7 +9253,6 @@ button.ui-button.ui-widget.submit-cancel { } button.ui-button.ui-widget.submit-cancel:hover { - /*color: #1d7873;*/ background-color: #e1e7ee; border-color: #e1e7ee; } @@ -9266,6 +9263,12 @@ button.ui-button.ui-widget.submit-cancel:active { border-color: #96a2bf; } +.list_button_alignment { + display: flex; + align-items: center; +} + +/* FINISH */ .password_input { background-color: transparent !important; border: none !important; From ab865cd133243da6f516149d720e040cbd380781 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Tue, 25 Oct 2022 13:13:09 +0200 Subject: [PATCH 020/474] Added new image --- pandora_console/include/styles/pandora.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index e54704c111..10a7484521 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -1825,6 +1825,7 @@ table.rounded_cells td { .action-buttons { display: flex; flex-direction: row-reverse; + align-items: center; } .action-buttons > button { margin-left: 16px; @@ -9210,6 +9211,10 @@ button div.cog { mask: url(../../images/svg/cog.svg) no-repeat center / contain; -webkit-mask: url(../../images/svg/cog.svg) no-repeat center / contain; } +button div.fail { + mask: url(../../images/svg/fail.svg) no-repeat center / contain; + -webkit-mask: url(../../images/svg/fail.svg) no-repeat center / contain; +} .ui-dialog-buttonset { display: flex; } From 13b0c7d0c8ab244585d26f616629246e0441a6ac Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Tue, 25 Oct 2022 13:13:52 +0200 Subject: [PATCH 021/474] Fixed views --- pandora_console/extensions/quick_shell.php | 2 +- .../godmode/agentes/agent_template.php | 16 +++- .../godmode/agentes/modificar_agente.php | 7 +- .../godmode/agentes/module_manager.php | 68 ++++++++++------- .../godmode/alerts/alert_list.builder.php | 36 +++++++-- .../godmode/alerts/alert_list.list.php | 15 +++- .../include/class/ExternalTools.class.php | 25 ++++++- .../operation/agentes/alerts_status.php | 24 +++--- .../operation/agentes/estado_agente.php | 16 +++- .../operation/agentes/estado_monitores.php | 10 ++- pandora_console/operation/agentes/graphs.php | 73 ++++++++++++++----- .../operation/agentes/ver_agente.php | 2 +- 12 files changed, 218 insertions(+), 76 deletions(-) diff --git a/pandora_console/extensions/quick_shell.php b/pandora_console/extensions/quick_shell.php index 7cbb5607e1..a01283eb25 100644 --- a/pandora_console/extensions/quick_shell.php +++ b/pandora_console/extensions/quick_shell.php @@ -202,7 +202,7 @@ function quickShell() 'arguments' => [ 'type' => 'submit', 'label' => __('Connect'), - 'attributes' => 'class="sub next"', + 'attributes' => ['icon' => 'cog'], ], ], ], diff --git a/pandora_console/godmode/agentes/agent_template.php b/pandora_console/godmode/agentes/agent_template.php index 31e6de29b5..b4313aee88 100644 --- a/pandora_console/godmode/agentes/agent_template.php +++ b/pandora_console/godmode/agentes/agent_template.php @@ -185,7 +185,21 @@ echo ""; html_print_select($select, 'template_id', '', '', '', 0, false, false, true, '', false, 'max-width: 200px !important'); echo ''; echo ''; -html_print_submit_button(__('Assign'), 'crt', false, 'class="sub next mgn_tp_0"'); +html_print_div( + [ + 'class' => 'action-buttons', + 'content' => html_print_submit_button( + __('Assign'), + 'crt', + false, + [ + 'icon' => 'wand', + 'mode' => 'mini', + ], + true + ), + ] +); echo ''; echo ''; echo ''; diff --git a/pandora_console/godmode/agentes/modificar_agente.php b/pandora_console/godmode/agentes/modificar_agente.php index b91b1556bc..df45d9da73 100644 --- a/pandora_console/godmode/agentes/modificar_agente.php +++ b/pandora_console/godmode/agentes/modificar_agente.php @@ -375,7 +375,7 @@ html_print_submit_button( false, [ 'icon' => 'search', - 'mode' => 'mini', + 'mode' => 'secondary mini', ] ); echo ''; @@ -963,10 +963,7 @@ if ((bool) check_acl($config['id_user'], 0, 'AW') === true) { __('Create agent'), 'crt-2', false, - [ - 'icon' => 'cog', - 'mode' => 'secondary', - ], + [ 'icon' => 'next' ], true ), ] diff --git a/pandora_console/godmode/agentes/module_manager.php b/pandora_console/godmode/agentes/module_manager.php index 35f50687db..e846562795 100644 --- a/pandora_console/godmode/agentes/module_manager.php +++ b/pandora_console/godmode/agentes/module_manager.php @@ -80,7 +80,15 @@ if (($policy_page !== false) || (isset($agent) === true)) { echo ''; echo ""; -html_print_submit_button(__('Filter'), 'filter', false, 'class="sub search"'); +html_print_submit_button( + __('Filter'), + 'filter', + false, + [ + 'icon' => 'search', + 'mode' => 'secondary mini', + ] +); echo ''; echo ""; echo ''; @@ -232,7 +240,7 @@ if (($policy_page) || (isset($agent))) { false, [ 'icon' => 'next', - 'mode' => 'secondary', + 'mode' => 'mini secondary', ] ); echo ''; @@ -1283,33 +1291,43 @@ if (check_acl_one_of_groups($config['id_user'], $all_groups, 'AW')) { html_print_table($table); -if (check_acl_one_of_groups($config['id_user'], $all_groups, 'AW')) { - echo '
    '; - +if ((bool) check_acl_one_of_groups($config['id_user'], $all_groups, 'AW') === true) { html_print_input_hidden('submit_modules_action', 1); - html_print_select( + html_print_div( [ - 'disable' => 'Disable selected modules', - 'delete' => 'Delete selected modules', - ], - 'module_action', - '', - '', - '', - 0, - false, - false, - false + 'class' => 'action-buttons', + 'content' => html_print_submit_button( + __('Execute action'), + 'submit_modules_action', + false, + [ + 'icon' => 'next', + 'mode' => 'link', + ], + true + ).html_print_select( + [ + 'disable' => 'Disable selected modules', + 'delete' => 'Delete selected modules', + ], + 'module_action', + '', + '', + '', + 0, + true, + false, + false, + '', + false, + false, + false, + 300 + ), + ] ); - html_print_submit_button( - __('Execute action'), - 'submit_modules_action', - false, - 'class="sub next"' - ); - echo '
    '; echo ''; } ?> @@ -1317,7 +1335,7 @@ if (check_acl_one_of_groups($config['id_user'], $all_groups, 'AW')) { + Date: Tue, 25 Oct 2022 16:26:23 +0200 Subject: [PATCH 024/474] Fixed for only icon buttons --- pandora_console/include/functions_html.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 4d3ae6abc5..b43615bf09 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -3402,14 +3402,14 @@ function html_print_button($label='OK', $name='', $disabled=false, $script='', $ $iconToUse = preg_replace('([^A-Za-z])', '', $iconToUse); } - if (empty($iconToUse) === false) { + if (empty($iconToUse) === false || (isset($buttonMode) === true && $buttonMode !== 'onlyIcon')) { $iconDiv = html_print_div( [ 'style' => '', 'class' => sprintf( 'subIcon %s %s', $iconToUse, - (isset($buttonMode) === true) ? $buttonMode : '' + (empty($buttonMode) === false) ? $buttonMode : '' ), ], true From 5aaa415ed9bb48e87e002c3518b3a6ec6bf4ecea Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Tue, 25 Oct 2022 17:11:18 +0200 Subject: [PATCH 025/474] Several fixes --- .../include/class/AgentWizard.class.php | 7 ++- pandora_console/include/functions_html.php | 3 +- .../operation/agentes/ver_agente.php | 2 +- pandora_console/operation/users/user_edit.php | 54 +++++++++++++++---- 4 files changed, 51 insertions(+), 15 deletions(-) diff --git a/pandora_console/include/class/AgentWizard.class.php b/pandora_console/include/class/AgentWizard.class.php index 0c80bce84c..a22c215388 100644 --- a/pandora_console/include/class/AgentWizard.class.php +++ b/pandora_console/include/class/AgentWizard.class.php @@ -751,7 +751,10 @@ class AgentWizard extends HTML 'label' => $this->actionLabel, 'name' => 'sub-protocol', 'type' => 'submit', - 'attributes' => 'class="sub next" onclick="$(\'#form-main-wizard\').submit();"', + 'attributes' => [ + 'icon' => 'cog', + 'onclick' => '$(\'#form-main-wizard\').submit();', + ], 'return' => true, ], ]; @@ -3658,7 +3661,7 @@ class AgentWizard extends HTML 'label' => __('Create modules'), 'name' => 'create-modules-action', 'type' => 'button', - 'attributes' => 'class="sub cog float-right"', + 'attributes' => [ 'icon' => 'next' ], 'script' => 'processListModules();', 'return' => true, ], diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index b43615bf09..cc1d12fb2d 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -3333,13 +3333,14 @@ function html_print_submit_button($label='OK', $name='', $disabled=false, $attri $attributes = []; } + // Set the button type from here. $attributes['type'] = 'submit'; $output = html_print_button( $label, $name, $disabled, - '', + (isset($attributes['onclick']) === true) ? $attributes['onclick'] : '', $attributes, true ); diff --git a/pandora_console/operation/agentes/ver_agente.php b/pandora_console/operation/agentes/ver_agente.php index 48f4283b1b..9fed0b0d70 100644 --- a/pandora_console/operation/agentes/ver_agente.php +++ b/pandora_console/operation/agentes/ver_agente.php @@ -1386,7 +1386,7 @@ $maintab['text'] = '

    '.__('Event filter').'

    '; $user_groups = implode(',', array_keys((users_get_groups($config['id_user'], 'AR', true)))); $event_filter .= html_print_select_from_sql( @@ -736,7 +744,14 @@ if ($config['ehorus_enabled'] && $config['ehorus_user_level_conf']) { $row = []; $row['name'] = __('Test'); - $row['control'] = html_print_button(__('Start'), 'test-ehorus', false, 'ehorus_connection_test("'.$ehorus_host.'",'.$ehorus_port.')', 'class="sub next"', true); + $row['control'] = html_print_button( + __('Start'), + 'test-ehorus', + false, + 'ehorus_connection_test("'.$ehorus_host.'",'.$ehorus_port.')', + [ 'icon' => 'next' ], + true + ); $row['control'] .= ' '; $row['control'] .= ' '; $row['control'] .= ' '; @@ -782,7 +797,14 @@ if ($config['integria_enabled'] && $config['integria_user_level_conf']) { $row = []; $row['name'] = __('Test'); - $row['control'] = html_print_button(__('Start'), 'test-integria', false, 'integria_connection_test("'.$integria_host.'",'.$integria_api_pass.')', 'class="sub next"', true); + $row['control'] = html_print_button( + __('Start'), + 'test-integria', + false, + 'integria_connection_test("'.$integria_host.'",'.$integria_api_pass.')', + [ 'icon' => 'next' ], + true + ); $row['control'] .= ' '; $row['control'] .= ' '; $row['control'] .= ' '; @@ -796,15 +818,25 @@ if ($config['integria_enabled'] && $config['integria_user_level_conf']) { if ($is_management_allowed === true) { - echo '
    '; - if (!$config['user_can_update_info']) { - echo ''.__('You can not change your user info under the current authentication scheme').''; + if ((bool) $config['user_can_update_info'] === false) { + $outputButton = ''.__('You can not change your user info under the current authentication scheme').''; } else { - html_print_csrf_hidden(); - html_print_submit_button(__('Update'), 'uptbutton', $view_mode, 'class="sub upd"'); + $outputButton = html_print_submit_button( + __('Update'), + 'uptbutton', + $view_mode, + [ 'icon' => 'update' ], + true + ); + $outputButton .= html_print_csrf_hidden(true); } - echo '
    '; + html_print_div( + [ + 'class' => 'action-buttons', + 'content' => $outputButton, + ] + ); } echo ''; From ffa0d2408394fdd704bbbe7dc62eb0c627a99b4a Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Tue, 25 Oct 2022 21:59:30 +0200 Subject: [PATCH 026/474] Improve CSS --- pandora_console/include/styles/pandora.css | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index b426879d51..718d3eea2e 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -9102,6 +9102,7 @@ button.submitButton > div { button.buttonButton.onlyIcon, button.submitButton.onlyIcon { width: 32px; + height: 32px; border: none; box-shadow: none; } @@ -9276,7 +9277,8 @@ button.ui-button.ui-widget.submit-next:active { button.ui-button.ui-widget.submit-cancel { background-color: #fff; color: #14524f; - border: 1px solid #fff; + border: 0; + box-shadow: none; } button.ui-button.ui-widget.submit-cancel:hover { From c7aa456d605a5d809c9a1c8bbd61cc7951215df5 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Wed, 26 Oct 2022 10:51:12 +0200 Subject: [PATCH 027/474] Adapt views --- pandora_console/godmode/setup/performance.php | 18 ++-- pandora_console/godmode/setup/setup_auth.php | 75 +++++++-------- .../godmode/setup/setup_ehorus.php | 54 ++++++++--- .../godmode/setup/setup_general.php | 45 ++++++--- .../godmode/setup/setup_integria.php | 92 +++++++++++++------ .../godmode/setup/setup_websocket_engine.php | 18 ++-- 6 files changed, 197 insertions(+), 105 deletions(-) diff --git a/pandora_console/godmode/setup/performance.php b/pandora_console/godmode/setup/performance.php index 89b745cfca..ab226eb116 100644 --- a/pandora_console/godmode/setup/performance.php +++ b/pandora_console/godmode/setup/performance.php @@ -725,15 +725,19 @@ echo '
    '; html_print_table($table_other); echo '
    '; -echo '
    '; html_print_input_hidden('update_config', 1); -html_print_submit_button( - __('Update'), - 'update_button', - false, - 'class="sub upd"' +html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_submit_button( + __('Update'), + 'update_button', + false, + [ 'icon' => 'update' ], + true + ), + ] ); -echo '
    '; echo ''; ?> diff --git a/pandora_console/godmode/setup/setup_auth.php b/pandora_console/godmode/setup/setup_auth.php index e1318f96c2..ebe6c08c60 100644 --- a/pandora_console/godmode/setup/setup_auth.php +++ b/pandora_console/godmode/setup/setup_auth.php @@ -1,30 +1,30 @@ data = []; $table->width = '100%'; @@ -62,7 +62,7 @@ if (is_ajax()) { ); $table->data['fallback_local_auth'] = $row; - if (enterprise_installed()) { + if (enterprise_installed() === true) { $is_management_allowed = is_management_allowed(); // Autocreate remote users. $row = []; @@ -83,9 +83,6 @@ if (is_ajax()) { } switch ($type_auth) { - case 'mysql': - break; - case 'ldap': // LDAP server. $row = []; @@ -335,11 +332,12 @@ if (is_ajax()) { case 'saml': case 'integria': // Add enterprise authentication options. - if (enterprise_installed()) { + if (enterprise_installed() === true) { add_enterprise_auth_options($table, $type_auth); } break; + case 'mysql': default: // Default case. break; @@ -373,7 +371,7 @@ if (is_ajax()) { true ); - if (!$config['double_auth_enabled']) { + if ((bool) $config['double_auth_enabled'] === false) { $table->rowclass['2FA_all_users'] = 'invisible'; } else { $table->rowclass['2FA_all_users'] = ''; @@ -432,7 +430,7 @@ $auth_methods = [ 'mysql' => __('Local %s', get_product_name()), 'ldap' => __('ldap'), ]; -if (enterprise_installed()) { +if (enterprise_installed() === true) { add_enterprise_auth_methods($auth_methods); } @@ -452,7 +450,7 @@ $table->data['auth'] = $row; // Form. echo '
    '; -if (!is_metaconsole()) { +if (is_metaconsole() === false) { html_print_input_hidden('update_config', 1); } else { // To use it in the metasetup. @@ -461,15 +459,20 @@ if (!is_metaconsole()) { } html_print_table($table); -echo '
    '; -echo '
    '; -html_print_submit_button( - __('Update'), - 'update_button', - false, - 'class="sub upd"' +html_print_div([ 'id' => 'table_auth_result' ]); +html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_submit_button( + __('Update'), + 'update_button', + false, + [ 'icon' => 'update' ], + true + ), + ] ); -echo '
    '; + echo '
    '; ?> diff --git a/pandora_console/godmode/setup/setup_ehorus.php b/pandora_console/godmode/setup/setup_ehorus.php index 136c0e6075..0aceb31710 100644 --- a/pandora_console/godmode/setup/setup_ehorus.php +++ b/pandora_console/godmode/setup/setup_ehorus.php @@ -1,12 +1,20 @@ data['ehorus_req_timeout'] = $row; // Test. $row = []; $row['name'] = __('Test'); -$row['control'] = html_print_button(__('Start'), 'test-ehorus', false, '', 'class="sub next"', true); +$row['control'] = html_print_button( + __('Start'), + 'test-ehorus', + false, + '', + [ + 'icon' => 'cog', + 'mode' => 'secondary mini', + ], + true +); $row['control'] .= ''; $row['control'] .= ''; $row['control'] .= ''; @@ -119,7 +138,7 @@ $table_remote->data['ehorus_test'] = $row; // Print. echo '
    '; echo ''; echo '
    '; - echo '
    '; - html_print_submit_button(__('Update'), 'update_button', false, 'class="sub upd"'); - echo '
    '; + html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_submit_button( + __('Update'), + 'update_button', + false, + ['icon' => 'update'], + true + ), + ] + ); echo ''; -?> + ?> diff --git a/pandora_console/godmode/setup/setup_general.php b/pandora_console/godmode/setup/setup_general.php index 93a3d64a27..6c6afc156a 100644 --- a/pandora_console/godmode/setup/setup_general.php +++ b/pandora_console/godmode/setup/setup_general.php @@ -620,7 +620,7 @@ echo ''.__('Mail configuration').''; 'email_test_dialog', false, "show_email_test('".$uniqid."');", - 'class="sub next"', + [ 'icon' => 'next' ], true ); @@ -634,9 +634,19 @@ echo ''.__('Mail configuration').''; echo '
    '; - echo '
    '; - html_print_submit_button(__('Update'), 'update_button', false, 'class="sub upd"'); - echo '
    '; + html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_submit_button( + __('Update'), + 'update_button', + false, + ['icon' => 'update'], + true + ), + ] + ); + echo ''; @@ -667,17 +677,26 @@ echo ''.__('Mail configuration').''; true ); - $table_mail_test->data[1][0] = html_print_button( - __('Send'), - 'email_test', - false, - '', - 'class="sub next"', + $table_mail_test->data[1][0] = '  Email could not be sent'; + + $table_mail_test->data[1][1] = html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_button( + __('Send'), + 'email_test', + false, + '', + [ + 'icon' => 'cog', + 'mode' => 'mini', + ], + true + ), + ], true ); - $table_mail_test->data[1][1] = '  Email could not be sent'; - echo ''; } @@ -814,6 +833,6 @@ $(document).ready (function () { } }) - $('input#button-email_test').click(perform_email_test); + $('#button-email_test').click(perform_email_test); }); diff --git a/pandora_console/godmode/setup/setup_integria.php b/pandora_console/godmode/setup/setup_integria.php index 7f9b419fac..15d17e8542 100644 --- a/pandora_console/godmode/setup/setup_integria.php +++ b/pandora_console/godmode/setup/setup_integria.php @@ -1,12 +1,20 @@ 1]); - } else { - echo json_encode(['login' => 0]); - } + echo json_encode(['login' => ($login_result !== false) ? 1 : 0]); return; } @@ -312,7 +313,17 @@ $table_remote->data['integria_req_timeout'] = $row; $row = []; $row['name'] = __('Inventory'); -$row['control'] = html_print_button(__('Sync inventory'), 'sync-inventory', false, '', 'class="sub next"', true); +$row['control'] = html_print_button( + __('Sync inventory'), + 'sync-inventory', + false, + '', + [ + 'icon' => 'cog', + 'mode' => 'secondary mini', + ], + true +); $row['control'] .= ''; $row['control'] .= ''; $row['control'] .= ''; @@ -564,7 +575,17 @@ $table_cr_settings->data['custom_response_incident_status'] = $row; // Test. $row = []; $row['name'] = __('Test'); -$row['control'] = html_print_button(__('Start'), 'test-integria', false, '', 'class="sub next"', true); +$row['control'] = html_print_button( + __('Start'), + 'test-integria', + false, + '', + [ + 'icon' => 'cog', + 'mode' => 'secondary mini', + ], + true +); $row['control'] .= ''; $row['control'] .= ''; $row['control'] .= ''; @@ -628,13 +649,31 @@ if ($has_connection != false) { echo '
    '; echo '
    '; - echo '
    '; - html_print_submit_button(__('Update'), 'update_button', false, 'class="sub upd"'); - echo '
    '; + html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_submit_button( + __('Update'), + 'update_button', + false, + ['icon' => 'update'], + true + ), + ] + ); } else { - echo '
    '; - html_print_submit_button(__('Update and continue'), 'update_button', false, 'class="sub next"'); - echo '
    '; + html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_submit_button( + __('Update and continue'), + 'update_button', + false, + ['icon' => 'update'], + true + ), + ] + ); } @@ -653,7 +692,7 @@ echo ''; var handleUserLevel = function(event) { var is_checked = $('input:checkbox[name="integria_enabled"]').is(':checked'); var is_checked_userlevel = $('input:checkbox[name="integria_user_level_conf"]').is(':checked'); - + if (event.target.value == '1' && is_checked && !is_checked_userlevel) { showUserPass(); $('input:checkbox[name="integria_user_level_conf"]').attr('checked', true); @@ -797,11 +836,11 @@ echo ''; } var handleInventorySync = function (event) { - + var badRequestMessage = ''; var notFoundMessage = ''; var invalidPassMessage = ''; - + var hideLoadingImage = function () { $('span#test-integria-spinner-sync').hide(); } @@ -821,7 +860,6 @@ echo ''; $('span#test-integria-failure-sync').show(); } - hideSuccessImage(); hideFailureImage(); showLoadingImage(); @@ -887,9 +925,7 @@ echo ''; }); } - $('input#button-test-integria').click(handleTest); - $('input#button-sync-inventory').click(handleInventorySync); - - + $('#button-test-integria').click(handleTest); + $('#button-sync-inventory').click(handleInventorySync); diff --git a/pandora_console/godmode/setup/setup_websocket_engine.php b/pandora_console/godmode/setup/setup_websocket_engine.php index 0422000120..f6e05c09de 100644 --- a/pandora_console/godmode/setup/setup_websocket_engine.php +++ b/pandora_console/godmode/setup/setup_websocket_engine.php @@ -84,12 +84,16 @@ if (function_exists('quickShellSettings') === true) { quickShellSettings(); } -echo '
    '; -html_print_submit_button( - __('Update'), - 'update_button', - false, - 'class="sub upd"' +html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_submit_button( + __('Update'), + 'update_button', + false, + [ 'icon' => 'update' ], + true + ), + ] ); -echo '
    '; echo ''; From 5e4bf4863cdd3fa6a784f2259e805d2e003f5fa1 Mon Sep 17 00:00:00 2001 From: "jose.gonzalez@pandorafms.com" Date: Wed, 26 Oct 2022 12:02:56 +0200 Subject: [PATCH 028/474] Adapted views --- .../general/first_task/custom_fields.php | 54 ++++++++++++++----- .../agentes/status_monitor_custom_fields.php | 15 ++++-- .../godmode/reporting/map_builder.php | 54 ++++++++++++------- .../reporting/visual_console_favorite.php | 16 ++++-- .../operation/agentes/status_monitor.php | 43 ++++++++------- pandora_console/operation/tree.php | 13 ++++- 6 files changed, 137 insertions(+), 58 deletions(-) diff --git a/pandora_console/general/first_task/custom_fields.php b/pandora_console/general/first_task/custom_fields.php index c8767a3c48..11f9f30c2d 100644 --- a/pandora_console/general/first_task/custom_fields.php +++ b/pandora_console/general/first_task/custom_fields.php @@ -1,16 +1,32 @@ true, 'message' => __('There are no custom __('Custom Fields')]); ?>
    -

    +

    true, 'message' => __('There are no custom ?>

    + 'action-buttons', + 'content' => html_print_submit_button( + __('Create Custom Fields'), + 'button_task', + false, + [ 'icon' => 'next' ], + true + ), + ] + ); + ?>
    diff --git a/pandora_console/godmode/agentes/status_monitor_custom_fields.php b/pandora_console/godmode/agentes/status_monitor_custom_fields.php index d9960c7547..b4077e2eb8 100644 --- a/pandora_console/godmode/agentes/status_monitor_custom_fields.php +++ b/pandora_console/godmode/agentes/status_monitor_custom_fields.php @@ -202,10 +202,19 @@ $table->data[1][2] = html_print_select( echo '
    '; html_print_table($table); -echo '
    '; - html_print_submit_button(__('Update'), 'upd_button', false, 'class="sub upd"'); +html_print_div( + [ + 'class' => 'action-buttons w100p', + 'content' => html_print_submit_button( + __('Update'), + 'update_button', + false, + [ 'icon' => 'update' ], + true + ), + ] +); echo ''; -echo '
    '; ?> diff --git a/pandora_console/godmode/reporting/visual_console_builder.elements.php b/pandora_console/godmode/reporting/visual_console_builder.elements.php index 61674f9012..e969d08379 100755 --- a/pandora_console/godmode/reporting/visual_console_builder.elements.php +++ b/pandora_console/godmode/reporting/visual_console_builder.elements.php @@ -1,22 +1,38 @@ '; -} else { - echo "
    "; -} - -if (!defined('METACONSOLE')) { - echo '
    '; -} - -if (!defined('METACONSOLE')) { html_print_input_hidden('action', 'update'); } else { + echo ""; html_print_input_hidden('action2', 'update'); } html_print_table($table); -echo '
    '; -html_print_submit_button(__('Update'), 'go', false, 'class="sub next"'); -echo ' '; -html_print_button(__('Delete'), 'delete', false, 'submit_delete_multiple_items();', 'class="sub delete"'); -echo '
    '; +$buttons = html_print_submit_button( + __('Update'), + 'go', + false, + [ 'icon' => 'next' ], + true +); + +$buttons .= html_print_button( + __('Delete'), + 'delete', + false, + 'submit_delete_multiple_items();', + [ + 'icon' => 'delete', + 'mode' => 'secondary', + ], + true +); + +html_print_div( + [ + 'class' => 'action-buttons', + 'content' => $buttons, + ] +); + echo ''; -// Form for multiple delete -if (!defined('METACONSOLE')) { - $url_multiple_delete = 'index.php?'.'sec=network&'.'sec2=godmode/reporting/visual_console_builder&'.'tab='.$activeTab.'&'.'id_visual_console='.$visualConsole['id']; - - echo '
    '; +// Form for multiple delete. +if (is_metaconsole() === false) { + $url_multiple_delete = 'index.php?sec=network&sec2=godmode/reporting/visual_console_builder&tab='.$activeTab.'&id_visual_console='.$visualConsole['id']; } else { - $url_multiple_delete = 'index.php?'.'operation=edit_visualmap&'.'sec=screen&'.'sec2=screens/screens&'.'action=visualmap&'.'pure=0&'.'tab=list_elements&'.'id_visual_console='.$idVisualConsole; - - echo "'.html -if (is_metaconsole()) { +if (is_metaconsole() === true) { $pure = get_parameter('pure', 0); echo ''; } -if (defined('METACONSOLE')) { +if (is_metaconsole() === true) { echo "
    ".__('Wizard').'
    '; } html_print_table($table); -echo '
    '; -if (is_metaconsole()) { +if (is_metaconsole() === true) { html_print_input_hidden('action2', 'update'); } else { html_print_input_hidden('action', 'update'); } html_print_input_hidden('id_visual_console', $visualConsole['id']); -html_print_submit_button(__('Add'), 'go', false, 'class="sub wizard wand"'); -echo '
    '; +html_print_div( + [ + 'class' => 'action-buttons', + 'content' => html_print_submit_button( + __('Add'), + 'go', + false, + [ 'icon' => 'wand' ], + true + ), + ] +); + echo '
    '; // Trick for it have a traduct text for javascript. diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index e289632aad..0fd926acdb 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -2374,25 +2374,38 @@ if (check_acl( echo '
    '; echo '
    '; echo ''; - html_print_select( + + $elements = html_print_button( + __('Execute event response'), + 'submit_event_response', + false, + 'execute_event_response(true);', + [ + 'icon' => 'cog', + 'mode' => 'mini', + ], + true + ); + + $elements .= html_print_select( $array_events_actions, 'response_id', '', '', '', 0, - false, + true, false, false ); - echo '  '; - html_print_button( - __('Execute event response'), - 'submit_event_response', - false, - 'execute_event_response(true);', - 'class="sub next"' + + html_print_div( + [ + 'class' => 'action-buttons', + 'content' => $elements, + ] ); + echo "
    '; echo ''; $table->data[0][2] = ''.__('Module').''; if ($is_metaconsole === true) { - $table->data[0][3] = html_print_select($fields, 'module_inventory_general_view', $inventory_module, $filteringFunction, __('Basic info'), 0, true, false, true, '', false, 'min-width: 194px; max-width: 200px;'); + // array_unshift($fields, __('All')); + $table->data[0][3] = html_print_select($fields, 'module_inventory_general_view', $inventory_module, $filteringFunction, __('All'), 0, true, false, true, '', false, 'min-width: 194px; max-width: 200px;'); } else { $sql = 'SELECT name as indexname, name FROM tmodule_inventory, tagent_module_inventory @@ -381,7 +382,7 @@ if ($is_metaconsole === true) { $fields[$id] = $value; } - array_unshift($fields, 'All'); + array_unshift($fields, __('All')); $table->data[0][3] = html_print_select($fields, 'module_inventory_general_view', $inventory_module, '', __('Basic info'), 'basic', true, false, false); } From 17c0e78d06b484ddeabbf502e9426a72522ecec9 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Thu, 26 Jan 2023 13:25:24 +0100 Subject: [PATCH 115/474] Improve TreeView --- pandora_console/images/minus.svg | 14 ++ pandora_console/images/plus.svg | 16 ++ pandora_console/include/class/Tree.class.php | 1 + pandora_console/include/functions_agents.php | 30 +++- .../include/functions_treeview.php | 155 +++++++++-------- pandora_console/include/functions_ui.php | 156 +++++++++++------- .../include/javascript/fixed-bottom-box.js | 6 +- .../include/javascript/tree/TreeController.js | 44 +++-- .../lib/Dashboard/Widgets/tree_view.php | 8 +- .../include/styles/fixed-bottom-box.css | 39 +---- pandora_console/include/styles/pandora.css | 11 ++ pandora_console/include/styles/tree.css | 132 ++++++++++----- pandora_console/operation/tree.php | 15 +- 13 files changed, 392 insertions(+), 235 deletions(-) create mode 100644 pandora_console/images/minus.svg create mode 100644 pandora_console/images/plus.svg diff --git a/pandora_console/images/minus.svg b/pandora_console/images/minus.svg new file mode 100644 index 0000000000..fbefe9cbdf --- /dev/null +++ b/pandora_console/images/minus.svg @@ -0,0 +1,14 @@ + + + + + + + + + diff --git a/pandora_console/images/plus.svg b/pandora_console/images/plus.svg new file mode 100644 index 0000000000..16651c428c --- /dev/null +++ b/pandora_console/images/plus.svg @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/pandora_console/include/class/Tree.class.php b/pandora_console/include/class/Tree.class.php index 7daea2bf1f..2588d3f48f 100644 --- a/pandora_console/include/class/Tree.class.php +++ b/pandora_console/include/class/Tree.class.php @@ -669,6 +669,7 @@ class Tree } $module['statusImageHTML'] = ui_print_status_image($statusType, htmlspecialchars($statusTitle), true); + $module['statusImageHTML'] = 'cipote'; // HTML of the server type image. $module['serverTypeHTML'] = ui_print_servertype_icon((int) $module['server_type']); diff --git a/pandora_console/include/functions_agents.php b/pandora_console/include/functions_agents.php index 12e9c20282..0e28cf7cec 100644 --- a/pandora_console/include/functions_agents.php +++ b/pandora_console/include/functions_agents.php @@ -3004,7 +3004,10 @@ function agents_tree_view_status_img_ball($critical, $warning, $unknown, $total, STATUS_AGENT_NO_MONITORS_BALL, __('No Monitors'), true, - false, + [ + 'is_tree_view', + true, + ], false, // Use CSS shape instead of image. true @@ -3016,7 +3019,10 @@ function agents_tree_view_status_img_ball($critical, $warning, $unknown, $total, STATUS_ALERT_FIRED_BALL, __('Alert fired on agent'), true, - false, + [ + 'is_tree_view', + true, + ], false, // Use CSS shape instead of image. true @@ -3028,7 +3034,10 @@ function agents_tree_view_status_img_ball($critical, $warning, $unknown, $total, STATUS_AGENT_CRITICAL_BALL, __('At least one module in CRITICAL status'), true, - false, + [ + 'is_tree_view', + true, + ], false, // Use CSS shape instead of image. true @@ -3038,7 +3047,10 @@ function agents_tree_view_status_img_ball($critical, $warning, $unknown, $total, STATUS_AGENT_WARNING_BALL, __('At least one module in WARNING status'), true, - false, + [ + 'is_tree_view', + true, + ], false, // Use CSS shape instead of image. true @@ -3048,7 +3060,10 @@ function agents_tree_view_status_img_ball($critical, $warning, $unknown, $total, STATUS_AGENT_DOWN_BALL, __('At least one module is in UKNOWN status'), true, - false, + [ + 'is_tree_view', + true, + ], false, // Use CSS shape instead of image. true @@ -3058,7 +3073,10 @@ function agents_tree_view_status_img_ball($critical, $warning, $unknown, $total, STATUS_AGENT_OK_BALL, __('All Monitors OK'), true, - false, + [ + 'is_tree_view', + true, + ], false, // Use CSS shape instead of image. true diff --git a/pandora_console/include/functions_treeview.php b/pandora_console/include/functions_treeview.php index 35e4c80690..66bd44847f 100755 --- a/pandora_console/include/functions_treeview.php +++ b/pandora_console/include/functions_treeview.php @@ -55,29 +55,19 @@ function treeview_printModuleTable($id_module, $server_data=false, $no_head=fals $table = new StdClass(); $table->width = '100%'; - $table->class = 'floating_form'; + $table->class = 'floating_form margin-top-10'; $table->id = 'tree_view_module_data'; $table->style = []; - $table->style['title'] = 'height: 46px; width: 30%; padding-right: 5px; text-align: end;'; - $table->style['data'] = 'height: 46px; width: 70%; padding-left: 5px; font-family: \'Pandora-Regular\';'; + $table->style['title'] = 'height: 32px; width: 30%; padding-right: 5px; text-align: end;'; + $table->style['data'] = 'height: 32px; width: 70%; padding-left: 5px; font-family: \'Pandora-Regular\';'; $table->data = []; // Module name. - if ($module['disabled']) { - $cellName = ''.ui_print_truncate_text($module['nombre'], GENERIC_SIZE_TEXT, true, true, true, '[…]', 'text-transform: uppercase;').ui_print_help_tip(__('Disabled'), true).''; - } else { - $cellName = ui_print_truncate_text($module['nombre'], GENERIC_SIZE_TEXT, true, true, true, '[…]', 'text-transform: uppercase;'); - } + $cellName = ((bool) $module['disabled'] === true) ? ''.$module['nombre'].''.ui_print_help_tip(__('Disabled'), true) : $module['nombre']; $row = []; $row['title'] = __('Name'); - $row['data'] = html_print_anchor( - [ - 'href' => $console_url.'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente='.$module['id_agente'].'&tab=module&edit_module=1&id_agent_module='.$module['id_agente_modulo'].$url_hash, - 'content' => $cellName, - ], - true - ); + $row['data'] = $cellName; $table->data['name'] = $row; // Interval. @@ -126,14 +116,7 @@ function treeview_printModuleTable($id_module, $server_data=false, $no_head=fals $row = []; $row['title'] = __('Description'); - $row['data'] = ui_print_truncate_text( - $module['descripcion'], - 'description', - true, - true, - true, - '[…]' - ); + $row['data'] = $module['descripcion']; $table->data['description'] = $row; // Tags. @@ -321,6 +304,18 @@ function treeview_printModuleTable($id_module, $server_data=false, $no_head=fals $row['data'] = $time_elapsed; $table->data['tags'] = $row; + // Edit module button. + $row = []; + $row['title'] = html_print_button( + __('Edit module'), + 'edit_module_link', + false, + 'window.location.assign(\''.$console_url.'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente='.$module['id_agente'].'&tab=module&edit_module=1&id_agent_module='.$module['id_agente_modulo'].$url_hash.'\')', + [ 'mode' => 'link' ], + true + ); + $table->data['edit_button'] = $row; + $table->colspan['edit_button'] = 2; // Title. echo ''.__('Module information').''; // End of table. @@ -570,19 +565,15 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $table->class = 'floating_form'; $table->id = 'tree_view_agent_detail'; $table->style = []; - $table->style['title'] = 'height: 46px; width: 30%; padding-right: 5px; text-align: end;'; - $table->style['data'] = 'height: 46px; width: 70%; padding-left: 5px; font-family: \'Pandora-Regular\';'; + $table->style['title'] = 'height: 32px; width: 30%; padding-right: 5px; text-align: end;'; + $table->style['data'] = 'height: 32px; width: 70%; padding-left: 5px; font-family: \'Pandora-Regular\';'; $table->head = []; $table->data = []; // Agent name. - if ($agent['disabled']) { - $cellName = ''; - } else { - $cellName = ''; - } + $cellName = ((bool) $agent['disabled'] === true) ? '' : ''; - if (is_metaconsole()) { + if (is_metaconsole() === true) { $pwd = $server_data['auth_token']; // Create HASH login info. $user = $config['id_user']; @@ -592,28 +583,18 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $hashdata = $user.$pwd_deserialiced['auth_token']; $hashdata = md5($hashdata); - $url = $server_data['server_url'].'/index.php?'.'sec=estado&'.'sec2=operation/agentes/ver_agente&'.'id_agente='.$agent['id_agente']; - - if ($grants_on_node && (bool) $user_access_node !== false) { - $cellName .= html_print_anchor( - [ - 'onClick' => 'sendHash(\''.$url.'\')', - 'content' => ''.$agent['alias'].'', - ], - true - ); + if ((bool) $grants_on_node === true && (bool) $user_access_node !== false) { + $urlAgent = 'sendHash(\''.$server_data['server_url'].'/index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$agent['id_agente'].'\')'; } else { - $cellName .= ''.$agent['alias'].''; + $urlAgent = ''; } } else { - $url = ui_get_full_url( - 'index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$agent['id_agente'] - ); - $cellName .= ''; - $cellName .= ''.$agent['alias'].''; + $urlAgent = 'window.location.assign(\'index.php?sec=estado&sec2=operation/agentes/ver_agente&id_agente='.$agent['id_agente'].'\')'; } - if ($agent['disabled']) { + $cellName = $agent['alias']; + + if ((bool) $agent['disabled'] === true) { $cellName .= ui_print_help_tip(__('Disabled'), true).''; } @@ -640,6 +621,10 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) ); } + if (empty($address) === true) { + $address = __('N/A'); + } + $row = []; $row['title'] = __('IP Address'); $row['data'] = $address; @@ -660,7 +645,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) // Last contact. $last_contact = ui_print_timestamp($agent['ultimo_contacto'], true, ['class' => 'font_11']); - if ($agent['ultimo_contacto_remoto'] == '01-01-1970 00:00:00') { + if ($agent['ultimo_contacto_remoto'] === '01-01-1970 00:00:00') { $last_remote_contact = __('Never'); } else { $last_remote_contact = date_w_fixed_tz( @@ -669,9 +654,14 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) } $row = []; - $row['title'] = __('Last contact').' / '.__('Remote'); - $row['data'] = "$last_contact / $last_remote_contact"; - $table->data['contact'] = $row; + $row['title'] = __('Last contact'); + $row['data'] = $last_contact; + $table->data['last_contact'] = $row; + + $row = []; + $row['title'] = __('Remote contact'); + $row['data'] = $last_remote_contact; + $table->data['remote_contact'] = $row; // Next contact (agent). $progress = agents_get_next_contact($id_agente); @@ -681,12 +671,28 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $row['data'] = ui_progress( $progress, '100%', - '1.5', - '#82b92e', - true + '1.2', + '#ececec', + true, + '', + false, + 'line-height: 13px;' ); $table->data['next_contact'] = $row; + // Edit agent button. + $row = []; + $row['title'] = html_print_button( + __('Edit agent'), + 'edit_agent_link', + false, + $urlAgent, + [ 'mode' => 'link' ], + true + ); + $table->data['edit_button'] = $row; + $table->colspan['edit_button'] = 2; + // End of table. $agent_table = html_print_table($table, true); /* @@ -711,7 +717,27 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) } */ // Print agent data toggle. - ui_toggle($agent_table, ''.__('Agent data').'', '', '', false, false, '', 'white-box-content', 'white_table_graph'); + ui_toggle( + $agent_table, + ''.__('Agent data').'', + '', + '', + false, + false, + '', + 'white-box-content', + 'white_table_graph', + '', + '', + false, + false, + false, + '', + '', + null, + null, + true + ); // Advanced data. $table = new StdClass(); @@ -719,8 +745,8 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $table->class = 'floating_form'; $table->id = 'tree_view_agent_advanced'; $table->style = []; - $table->style['title'] = 'height: 46px; width: 30%; padding-right: 5px; text-align: end;'; - $table->style['data'] = 'height: 46px; width: 70%; padding-left: 5px; font-family: \'Pandora-Regular\';'; + $table->style['title'] = 'height: 32px; width: 30%; padding-right: 5px; text-align: end;'; + $table->style['data'] = 'height: 32px; width: 70%; padding-left: 5px; font-family: \'Pandora-Regular\';'; $table->head = []; $table->data = []; @@ -803,8 +829,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) // End of table advanced. $table_advanced = html_print_table($table, true); - $table_advanced .= '
    '; - + echo '
    '; ui_toggle( $table_advanced, ''.__('Advanced information').'', @@ -814,7 +839,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) false, '', 'white-box-content', - 'white_table_graph' + 'white_table_graph margin-top-20' ); if ($config['agentaccess']) { @@ -825,7 +850,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) false ); $access_graph .= '
    '; - + echo '
    '; ui_toggle( $access_graph, ''.__('Agent access rate (24h)').'', @@ -835,7 +860,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) false, '', 'white-box-content', - 'white_table_graph' + 'white_table_graph margin-top-20' ); } @@ -853,7 +878,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $server_id ); $events_graph .= '

    '; - + echo '
    '; ui_toggle( $events_graph, ''.__('Events (24h)').'', @@ -863,7 +888,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) false, '', 'white-box-content', - 'white_table_graph' + 'white_table_graph margin-top-20' ); // Table network interfaces diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index f49076c952..d0bc862ac6 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -2813,6 +2813,7 @@ function ui_print_status_image( if ($image_with_css === true) { $shape_status = get_shape_status_set($type); + $shape_status['is_tree_view'] = true; return ui_print_status_sets($type, $title, $return, $shape_status, $extra_info); } else { $imagepath .= '/'.$type; @@ -2970,7 +2971,9 @@ function ui_print_status_sets( $options['style'] .= ' background: '.modules_get_color_status($status).';'; } - if (isset($options['class']) === true) { + if (isset($options['is_tree_view']) === true) { + $options['class'] = 'item_status_tree_view'; + } else if (isset($options['class']) === true) { $options['class'] = $options['class']; } @@ -2992,6 +2995,16 @@ function ui_print_status_sets( $output .= '> 
    '; + if (isset($options['is_tree_view']) === true) { + $output = html_print_div( + [ + 'class' => '', + 'content' => $output, + ], + true + ); + } + if ($return === false) { echo $output; } else { @@ -3004,13 +3017,13 @@ function ui_print_status_sets( * Generates a progress bar CSS based. * Requires css progress.css * - * @param integer $progress Progress. - * @param string $width Width. - * @param integer $height Height in 'em'. - * @param string $color Color. - * @param boolean $return Return or paint (if false). - * @param boolean $text Text to be displayed,by default progress %. - * @param array $ajax Ajax: [ 'page' => 'page', 'data' => 'data' ] Sample: + * @param integer $progress Progress. + * @param string $width Width. + * @param integer $height Height in 'em'. + * @param string $color Color. + * @param boolean $return Return or paint (if false). + * @param boolean $text Text to be displayed,by default progress %. + * @param array $ajax Ajax: [ 'page' => 'page', 'data' => 'data' ] Sample: * [ * 'page' => 'operation/agentes/ver_agente', Target page. * 'interval' => 100 / $agent["intervalo"], Ask every interval seconds. @@ -3021,6 +3034,8 @@ function ui_print_status_sets( * ], * ]. * + * @param string $otherStyles Raw styles for control. + * * @return string HTML code. */ function ui_progress( @@ -3030,7 +3045,8 @@ function ui_progress( $color='#82b92e', $return=true, $text='', - $ajax=false + $ajax=false, + $otherStyles='' ) { if (!$progress) { $progress = 0; @@ -3052,7 +3068,7 @@ function ui_progress( ui_require_css_file('progress'); $output = ''; + $output .= '" style="width: '.$width.'; height: '.$height.'em; border-color: '.$color.'; '.$otherStyles.'">'; $output .= ''; $output .= ''; @@ -4100,6 +4116,7 @@ function ui_print_event_priority( * @param string $toggl_attr Main box extra attributes. * @param boolean|null $switch_on Switch enabled disabled or depending on hidden_Default. * @param string|null $switch_name Use custom switch input name or generate one. + * @param boolean|null $disableToggle If True, the toggle is disabled. * * @return string HTML. */ @@ -4121,23 +4138,33 @@ function ui_toggle( $attributes_switch='', $toggl_attr='', $switch_on=null, - $switch_name=null + $switch_name=null, + $disableToggle=false ) { // Generate unique Id. $uniqid = uniqid(''); - $image_a = html_print_image( - $img_a, - true, - [ 'style' => 'object-fit: contain;' ], - true - ); - $image_b = html_print_image( - $img_b, - true, - [ 'style' => 'object-fit: contain;' ], - true - ); + if (empty($img_a) === false) { + $image_a = html_print_image( + $img_a, + true, + [ 'style' => 'object-fit: contain;' ], + true + ); + } else { + $image_a = ''; + } + + if (empty($img_b) === false) { + $image_b = html_print_image( + $img_b, + true, + [ 'style' => 'object-fit: contain;' ], + true + ); + } else { + $image_b = ''; + } // Options. $style = 'overflow:hidden;width: -webkit-fill-available;width: -moz-fill-available;'; @@ -4165,7 +4192,7 @@ function ui_toggle( // Link to toggle. $output = '
    '; - $output .= '
    '; + $output .= '
    '; if ($reverseImg === false) { if ($switch === true) { if (empty($switch_name) === true) { @@ -4241,45 +4268,48 @@ function ui_toggle( $output .= '
    '; $output .= '
    '; - // JQuery Toggle. - $output .= ''; + if ($disableToggle === false) { + // JQuery Toggle. + $output .= ''; + } + $output .= '
    '; if (!$return) { diff --git a/pandora_console/include/javascript/fixed-bottom-box.js b/pandora_console/include/javascript/fixed-bottom-box.js index 88fea06f22..1943106deb 100644 --- a/pandora_console/include/javascript/fixed-bottom-box.js +++ b/pandora_console/include/javascript/fixed-bottom-box.js @@ -101,13 +101,17 @@ self._renderHead = function(head) { head = head || self._head; + var headBody = $("
    "); + headBody.addClass("fixed-bottom-box-head-body"); var headClose = $(""); headClose.addClass("fixed-bottom-box-head-close").click(function(event) { self.close(); }); self._box.head = $("
    "); - self._box.head.addClass("fixed-bottom-box-head").append(headClose); + self._box.head + .addClass("fixed-bottom-box-head") + .append(headClose, headBody); self._box.append(self._box.head); self.emit("head-rendered", { diff --git a/pandora_console/include/javascript/tree/TreeController.js b/pandora_console/include/javascript/tree/TreeController.js index 389215a183..69a308ac69 100644 --- a/pandora_console/include/javascript/tree/TreeController.js +++ b/pandora_console/include/javascript/tree/TreeController.js @@ -239,8 +239,10 @@ var TreeController = { } if (type == "services") { - var $counters = $("
    "); - $counters.addClass("tree-node-counters"); + var $counters = $(""); + $counters + .addClass("tree-node-counters") + .addClass("tree-node-service-counters"); if ( counters.total_services + @@ -648,11 +650,11 @@ var TreeController = { element.icon.length > 0 ) { $content.append( - '
    ' + '" />
    ' ); } else if ( typeof element.iconHTML != "undefined" && @@ -728,8 +730,11 @@ var TreeController = { typeof element.statusImageHTML != "undefined" && element.statusImageHTML.length > 0 ) { + console.log("es aqui pollito agente"); var $statusImage = $(element.statusImageHTML); - $statusImage.addClass("agent-status"); + $statusImage.addClass("node-icon"); + $statusImage.addClass("node-status"); + //$statusImage.addClass("agent-status"); $content.append($statusImage); } @@ -809,8 +814,6 @@ var TreeController = { } if (element.name !== null) { - console.log(element.name); - console.log("2"); $content.append("   " + element.name); } @@ -853,13 +856,12 @@ var TreeController = { } if (element.name !== null) { - console.log(element.name); - console.log("3"); $content.append("   " + element.name); } break; case "services": + $content.addClass("node-service"); if ( typeof element.statusImageHTML != "undefined" && element.statusImageHTML.length > 0 @@ -874,7 +876,7 @@ var TreeController = { (element.title ? element.title : element.name) + '" data-use_title_for_force_title="1" src="' + (controller.baseURL.length > 0 ? controller.baseURL : "") + - 'images/info@svg.svg" class="img_help" ' + + 'images/info@svg.svg" style="width: 16px" class="img_help" ' + ' alt="' + element.name + '"/> '; @@ -903,14 +905,24 @@ var TreeController = { typeof element.elementDescription !== "undefined" && element.elementDescription != "" ) { - $content.append(" " + element.elementDescription); + $content.append( + '' + + element.elementDescription + + "" + ); } else if ( typeof element.description !== "undefined" && element.description != "" ) { - $content.append(" " + element.description); + $content.append( + '' + + element.description + + "" + ); } else { - $content.append('' + element.name + ""); + $content.append( + '' + element.name + "" + ); } } else { $content.remove($node); @@ -975,6 +987,8 @@ var TreeController = { $statusImage.addClass("module-status"); $content.append($statusImage); + } else { + $content.addClass("module-only-caption"); } element.name = htmlDecode(element.name); @@ -1174,7 +1188,7 @@ var TreeController = { element.icon.length > 0 ) { $content.append( - '
    ' + + '' + element.name + "" ); diff --git a/pandora_console/include/lib/Dashboard/Widgets/tree_view.php b/pandora_console/include/lib/Dashboard/Widgets/tree_view.php index 2c0441ead8..bdb30b16ce 100644 --- a/pandora_console/include/lib/Dashboard/Widgets/tree_view.php +++ b/pandora_console/include/lib/Dashboard/Widgets/tree_view.php @@ -571,15 +571,17 @@ class TreeViewWidget extends Widget $base_url = \ui_get_full_url('/'); // Spinner. - $output .= \html_print_image( + $output .= ui_print_spinner(__('Loading'), true); + /* + $output .= \html_print_image( 'images/spinner.gif', true, [ 'class' => 'loading_tree', 'style' => 'display: none;', ] - ); - + ); + */ // Container tree. $style = 'height:'.$height.'px; width:'.$width.'px;'; $style .= 'text-align: left; padding:10px;'; diff --git a/pandora_console/include/styles/fixed-bottom-box.css b/pandora_console/include/styles/fixed-bottom-box.css index b98861c214..b8882ee0a2 100644 --- a/pandora_console/include/styles/fixed-bottom-box.css +++ b/pandora_console/include/styles/fixed-bottom-box.css @@ -25,20 +25,12 @@ div.fixed-bottom-box { /* Overrides end */ div.fixed-bottom-box > div.fixed-bottom-box-head { - width: 20px !important; - height: 30px; + width: 100% !important; + height: 40px; line-height: 30px; vertical-align: middle; position: absolute; - top: 10px; - right: 20px; - /* background-color: #3f3f3f; */ - /* border-radius: 10px 10px 0 0; */ - /* -moz-border-radius: 10px 10px 0 0; */ - /* -webkit-border-radius: 10px 10px 0 0; */ - /* -o-border-radius: 10px 10px 0 0; */ - /* -ms-border-radius: 10px 10px 0 0; */ - /* -khtml-border-radius: 10px 10px 0 0; */ + border-bottom: 1px solid #aeaeae; } div.fixed-bottom-box @@ -60,39 +52,21 @@ div.fixed-bottom-box background-image: url(../../images/close@svg.svg); background-repeat: no-repeat; background-position: center; - float: right; + position: absolute; + top: 10px; + right: 20px; } div.fixed-bottom-box > div.fixed-bottom-box-head > div.fixed-bottom-box-head-body:hover { cursor: pointer; - /* - background-color: #747474; - - border-radius: inherit; - -moz-border-radius: inherit; - -webkit-border-radius: inherit; - -o-border-radius: inherit; - -ms-border-radius: inherit; - -khtml-border-radius: inherit; - */ } div.fixed-bottom-box > div.fixed-bottom-box-head > span.fixed-bottom-box-head-close:hover { cursor: pointer; - /* - background-color: #747474; - - border-radius: 0 10px 0 0; - -moz-border-radius: 0 10px 0 0; - -webkit-border-radius: 0 10px 0 0; - -o-border-radius: 0 10px 0 0; - -ms-border-radius: 0 10px 0 0; - -khtml-border-radius: 0 10px 0 0; - */ } div.fixed-bottom-box.fixed-bottom-box-hided @@ -119,5 +93,6 @@ div.fixed-bottom-box > div.fixed-bottom-box-content { box-sizing: border-box; width: 100% !important; height: 100% !important; + max-height: 100% !important; border-left: 1px solid #aeaeae; } diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index e4f71b3c06..ad0f9579c2 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -1123,6 +1123,9 @@ p.center { margin-bottom: 10px; } +.margin-top-20 { + margin-top: 20px; +} .margin-bottom-20 { margin-bottom: 20px; } @@ -11007,3 +11010,11 @@ p.trademark-copyright { height: 80%; overflow: auto; } + +.item_status_tree_view { + position: absolute; + top: 7px; + left: 8px; + width: 24px; + height: 24px; +} diff --git a/pandora_console/include/styles/tree.css b/pandora_console/include/styles/tree.css index 5741ba280b..1da0b7650c 100644 --- a/pandora_console/include/styles/tree.css +++ b/pandora_console/include/styles/tree.css @@ -19,20 +19,42 @@ float: right; } +.tree-node .node-content.node-service { + display: flex; + flex-wrap: nowrap; + align-items: center; + justify-content: flex-start; +} .tree-node img { padding: 10px; } .tree-node .node-icon { - background-position: 10px; - background-repeat: no-repeat; width: 40px; - height: 38px; display: inline-block; box-sizing: border-box; border-right: 1px solid #aeaeae; } +.tree-node .node-icon .node-icon-container { + display: flex; + align-items: center; + justify-content: center; + height: 38px; +} + +.tree-node .node-icon .node-icon-container img { + padding: 0; + width: 20px; +} +.tree-node .node-status { + width: 40px; + height: 38px; + border-radius: 7px 0 0 7px; + padding: 1px; + box-sizing: border-box; + position: absolute; +} .tree-node .node-name { position: relative; top: -15px; @@ -51,6 +73,7 @@ background-repeat: repeat-y; */ min-height: 26px; + margin-top: 8px; } div.tree-node { @@ -67,10 +90,9 @@ div.tree-node span { .node-content { border: 1px solid #aeaeae; border-radius: 8px; - width: calc(100% - 40px); + width: calc(100% - 50px); box-sizing: border-box; height: 40px; - /*height: 26px;*/ font-size: 1.2em; display: flex; flex-direction: row; @@ -80,7 +102,7 @@ div.tree-node span { .node-content > img { position: relative; - top: -2px; + /*top: -2px;*/ } .node-content:hover { @@ -93,8 +115,7 @@ div.tree-node span { .leaf-icon { width: 18px; - /*height: 20px;*/ - height: 35px; + height: 32px; } .node-content, @@ -108,45 +129,28 @@ div.tree-node span { } .tree-node.leaf-open > .leaf-icon { - background-image: url(../../images/tree/last_expanded.png); - cursor: pointer; -} - -.tree-node.tree-first.leaf-open > .leaf-icon { - background-image: url(../../images/tree/first_expanded.png); - cursor: pointer; + background-image: url(../../images/minus.svg); } .tree-node.leaf-closed > .leaf-icon { - background-image: url(../../images/tree/last_closed.png); - cursor: pointer; + background-image: url(../../images/plus.svg); } - -.tree-node.tree-first.leaf-closed > .leaf-icon { - background-image: url(../../images/tree/first_closed.png); - cursor: pointer; -} - -.tree-node.leaf-loading > .leaf-icon { - background-image: url(../../images/tree/last_expanded.png); -} - -.tree-node.leaf-empty > .leaf-icon { - background-image: url(../../images/tree/last_leaf.png); -} - -.tree-node.tree-first.leaf-empty > .leaf-icon { - background-image: url(../../images/tree/first_leaf.png); -} - +.tree-node.leaf-open > .leaf-icon, +.tree-node.tree-first.leaf-open > .leaf-icon, +.tree-node.leaf-closed > .leaf-icon, +.tree-node.tree-first.leaf-closed > .leaf-icon, +.tree-node.leaf-loading > .leaf-icon, +.tree-node.leaf-empty > .leaf-icon, +.tree-node.tree-first.leaf-empty > .leaf-icon, .tree-node.leaf-error > .leaf-icon { - background-image: url(../../images/tree/last_leaf.png); + cursor: pointer; } .tree-node > .leaf-icon { - background-position: 0px 0px; + background-position: 0px 11px; background-repeat: no-repeat; - width: 17px; + float: left; + margin-right: 10px; } .tree-node > .node-content > img { @@ -168,31 +172,48 @@ div.tree-node span { border-bottom-left-radius: 6px; height: 38px; position: relative; +} + +.tree-node > .node-content > .agent-status.status_balls { top: -1px; } + .tree-node > .node-content > .module-status.status_small_balls { - top: -8px; + /*top: -8px;*/ } .tree-node > .node-content > .module-name { margin: 0 0 0 1em; /*width: 250px;*/ width: 55%; - display: inline-block; + /*display: inline-block;*/ + flex: 1 1 80%; position: relative; font-weight: bold; } +.tree-node > .node-content > .module-name-parent.module-only-caption { + top: 9px; +} + +.tree-node > .node-content.module-only-caption > .module-name { + top: 7px; +} + +/*.node-content.module.module-only-caption:not(:first-of-type) { + margin-top: 8px; +}*/ .tree-node > .node-content > .module-name-alias { font-size: 12pt; font-weight: normal; top: 8px; + margin-left: 3.3em; } .tree-node > .node-content > .module-name-parent { font-size: 12pt; margin-left: 0.5em; - top: -14px; + top: -4px; } .tree-node > .node-content > .module-value { @@ -233,6 +254,9 @@ div.tree-node span { right: 10px; } +.tree-node > .node-content > .tree-node-counters.tree-node-service-counters { + top: 0; +} .tree-node > .node-content > img { vertical-align: middle; } @@ -272,15 +296,21 @@ div#tree-controller-recipient { .tree-group .node-content { position: relative; - top: -10px; + /*top: -10px;*/ } .tree-group .node-content.module { - top: -12px; + /*top: -12px;*/ + /* top: -35px; */ + display: flex; + flex-wrap: nowrap; + flex-direction: row; + align-items: center; + width: calc(100% - 50px); + margin: 8px 0 0 8px; } .node-content .module-button { - margin-top: 5px; padding: 6px; } @@ -289,3 +319,17 @@ div#tree-controller-recipient { background-color: #fff; border-radius: 8px; } +.tree-group .node-content.module:last-child { + margin-bottom: 15px; +} + +.tree-node.leaf-open:last-child, +.tree-node.leaf-closed:last-child, +.tree-node.leaf-empty:last-child { + margin-bottom: 8px; +} + +.tree-root > .tree-node { + margin-top: 0; + margin-bottom: 10px; +} diff --git a/pandora_console/operation/tree.php b/pandora_console/operation/tree.php index d1aa8f5448..a91be60326 100755 --- a/pandora_console/operation/tree.php +++ b/pandora_console/operation/tree.php @@ -310,16 +310,17 @@ ui_include_time_picker(); ui_require_jquery_file('ui.datepicker-'.get_user_language(), 'include/javascript/i18n/'); ui_require_javascript_file('TreeController', 'include/javascript/tree/'); - -html_print_image( +ui_print_spinner(__('Loading')); +/* + html_print_image( 'images/spinner.gif', false, [ 'class' => 'loading_tree', 'style' => 'display: none;', ] -); - + ); +*/ html_print_div( [ 'id' => 'tree-controller-recipient', @@ -356,7 +357,8 @@ enterprise_hook('close_meta_frame'); if (typeof treeController.recipient != 'undefined' && treeController.recipient.length > 0) treeController.recipient.empty(); - $(".loading_tree").show(); + showSpinner(); + //$(".loading_tree").show(); var parameters = {}; parameters['page'] = "include/ajax/tree.ajax"; @@ -407,7 +409,8 @@ enterprise_hook('close_meta_frame'); data: parameters, success: function(data) { if (data.success) { - $(".loading_tree").hide(); + hideSpinner(); + //$(".loading_tree").hide(); var foundMessage = ''; if (data.tree.length === 0) { foundMessage = ""; From 251fc46d1772264121cae84d781d01b85330980f Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Thu, 26 Jan 2023 13:43:03 +0100 Subject: [PATCH 116/474] Resolve issue with filters --- pandora_console/include/styles/pandora.css | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index ad0f9579c2..35cc36229d 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -10797,14 +10797,20 @@ pre.external_tools_output { } .fixed_filter_bar input, -.fixed_filter_bar .select2-container .select2-selection--single { +.filter_table input, +.fixed_filter_bar .select2-container .select2-selection--single, +.filter_table .select2-container .select2-selection--single { height: 32px !important; } -.fixed_filter_bar .select2-selection__arrow { +.fixed_filter_bar .select2-selection__arrow, +.filter_table .select2-selection__arrow { top: -4px !important; } - +.filter_table + .select2-container + .select2-selection--single + .select2-selection__rendered, .fixed_filter_bar .select2-container .select2-selection--single @@ -10813,6 +10819,10 @@ pre.external_tools_output { } .fixed_filter_bar + .select2-container--default + .select2-search--dropdown + .select2-search__field, +.filter_table .select2-container--default .select2-search--dropdown .select2-search__field { From deb69a0659fa7f779ce763d21e3a363cc3451e4f Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Thu, 26 Jan 2023 16:00:08 +0100 Subject: [PATCH 117/474] Fix issue with info box messages --- pandora_console/include/functions_ui.php | 34 +++++++------------ pandora_console/include/javascript/pandora.js | 12 +++++++ pandora_console/index.php | 16 +++++++++ 3 files changed, 41 insertions(+), 21 deletions(-) diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index d0bc862ac6..a008104594 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -378,33 +378,25 @@ function ui_print_message($message, $class='', $attributes='', $return=false, $t // JavaScript help vars. $messageCreated = html_print_table($messageTable, true); $autocloseTime = ((int) $config['notification_autoclose_time'] * 1000); - $definedMessageTop = '20'; - ob_start(); - ?> - - $id, - 'style' => 'top: 120px;', - 'class' => 'info_box_container', - 'content' => $jsCode.$messageCreated, + 'style' => 'top: '.$position.'px;', + 'class' => $classes, + 'content' => $messageCreated, ], true ); diff --git a/pandora_console/include/javascript/pandora.js b/pandora_console/include/javascript/pandora.js index 03a2ec8fe3..2b2eb1d23f 100644 --- a/pandora_console/include/javascript/pandora.js +++ b/pandora_console/include/javascript/pandora.js @@ -2296,3 +2296,15 @@ $(document).ready(function() { }); } }); + +function close_info_box(id) { + $("#" + id).fadeOut("slow", function() { + $("#" + id).remove(); + }); +} + +function autoclose_info_box(id, autoCloseTime) { + setTimeout(() => { + close_info_box(id); + }, autoCloseTime); +} diff --git a/pandora_console/index.php b/pandora_console/index.php index 6e9390fd90..ab6a664307 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -42,6 +42,11 @@ if (__PAN_XHPROF__ === 1) { } } +// Needed for InfoBox count. +if (isset($_SESSION['info_box_count']) === true) { + $_SESSION['info_box_count'] = 0; +} + // Set character encoding to UTF-8 // fixes a lot of multibyte character issues. if (function_exists('mb_internal_encoding') === true) { @@ -1674,6 +1679,17 @@ require 'include/php_to_js_values.php'; "html" ); } + + // Info messages action. + $(document).ready(function() { + var $autocloseTime = ; + var $listOfMessages = document.querySelectorAll('.info_box_autoclose'); + $listOfMessages.forEach( + function(item) { + autoclose_info_box(item.id, $autocloseTime) + } + ); + }); Date: Fri, 27 Jan 2023 12:41:06 +0100 Subject: [PATCH 118/474] fix filter events sounds pandora_enterprise#10188 --- pandora_console/include/ajax/events.php | 31 ++++++++++++++++++++ pandora_console/include/functions_events.php | 1 - 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index d9be30cc33..bfff7a1171 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -2493,6 +2493,37 @@ if ($get_events_fired) { $filter = events_get_event_filter($filter_id); } + if (is_metaconsole() === true) { + $servers = metaconsole_get_servers(); + if (is_array($servers) === true) { + $servers = array_reduce( + $servers, + function ($carry, $item) { + $carry[$item['id']] = $item['server_name']; + return $carry; + } + ); + } else { + $servers = []; + } + + if ($filter['server_id'] === '') { + $filter['server_id'] = array_keys($servers); + } else { + if (is_array($filter['server_id']) === false) { + if (is_numeric($filter['server_id']) === true) { + if ($filter['server_id'] !== 0) { + $filter['server_id'] = [$filter['server_id']]; + } else { + $filter['server_id'] = array_keys($servers); + } + } else { + $filter['server_id'] = explode(',', $filter['server_id']); + } + } + } + } + // Set time. $filter['event_view_hr'] = 0; diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index 3740257717..48ef7b2c30 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -4948,7 +4948,6 @@ function events_page_general_acknowledged($event_id) global $config; $Acknowledged = ''; $event = db_get_row('tevento', 'id_evento', $event_id); - hd($event['ack_utimestamp'], true); if ($event !== false && $event['estado'] == 1) { $user_ack = db_get_value( 'fullname', From 34fede2ce103f9c9add426828ddf8a2cbe7aa61e Mon Sep 17 00:00:00 2001 From: Jonathan Date: Fri, 27 Jan 2023 12:42:23 +0100 Subject: [PATCH 119/474] #9819 New section configuration sound event --- pandora_console/extras/mr/65.sql | 10 + .../godmode/events/configuration_sounds.php | 71 +++ pandora_console/include/ajax/events.php | 5 + .../include/class/EventSound.class.php | 495 ++++++++++++++++++ .../operation/events/sound_events.php | 5 + pandora_console/operation/menu.php | 4 + 6 files changed, 590 insertions(+) create mode 100644 pandora_console/extras/mr/65.sql create mode 100644 pandora_console/godmode/events/configuration_sounds.php create mode 100644 pandora_console/include/class/EventSound.class.php diff --git a/pandora_console/extras/mr/65.sql b/pandora_console/extras/mr/65.sql new file mode 100644 index 0000000000..7e65e62c2f --- /dev/null +++ b/pandora_console/extras/mr/65.sql @@ -0,0 +1,10 @@ +START TRANSACTION; + +CREATE TABLE `tevent_sound` ( + `id` INT NOT NULL AUTO_INCREMENT, + `name` TEXT NULL, + `sound` TEXT NULL, + `active` TINYINT NOT NULL DEFAULT '1', +PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +COMMIT; diff --git a/pandora_console/godmode/events/configuration_sounds.php b/pandora_console/godmode/events/configuration_sounds.php new file mode 100644 index 0000000000..d4e9d77688 --- /dev/null +++ b/pandora_console/godmode/events/configuration_sounds.php @@ -0,0 +1,71 @@ + '[EventSound]'.$e->getMessage() ]); + exit; + } else { + echo '[EventSound]'.$e->getMessage(); + } + + // Stop this execution, but continue 'globally'. + return; +} + +// AJAX controller. +if ((bool) is_ajax() === true) { + $method = get_parameter('method'); + + if (method_exists($controller, $method) === true) { + if ($controller->ajaxMethod($method) === true) { + $controller->{$method}(); + } else { + $controller->error('Unavailable method.'); + } + } else { + $controller->error('Method not found. ['.$method.']'); + } + + // Stop any execution. + exit; +} else { + // Run. + $controller->run(); +} diff --git a/pandora_console/include/ajax/events.php b/pandora_console/include/ajax/events.php index d9be30cc33..2f06006f0b 100644 --- a/pandora_console/include/ajax/events.php +++ b/pandora_console/include/ajax/events.php @@ -2348,6 +2348,11 @@ if ($drawConsoleSound === true) { 'Star_Trek_emergency_simulation.wav' => 'StarTrek emergency simulation', ]; + $eventsounds = mysql_db_get_all_rows_sql('SELECT * FROM tevent_sound WHERE active = 1'); + foreach ($eventsounds as $key => $row) { + $sounds[$row['sound']] = $row['name']; + } + $inputs[] = [ 'class' => 'test-sounds', 'direct' => 1, diff --git a/pandora_console/include/class/EventSound.class.php b/pandora_console/include/class/EventSound.class.php new file mode 100644 index 0000000000..93f42ec7c4 --- /dev/null +++ b/pandora_console/include/class/EventSound.class.php @@ -0,0 +1,495 @@ +ajaxController = $ajaxController; + } + + + /** + * Run view + * + * @return void + */ + public function run() + { + global $config; + $tab = get_parameter('tab', ''); + $action = get_parameter('action', ''); + $message_ok = 0; + $error_msg = __('Name already exist'); + $ok_msg = __('Successfully created'); + + if ($action == 'create') { + $name = get_parameter('name', ''); + $sound = get_parameter('file', ''); + + $exist = db_get_all_rows_sql(sprintf('SELECT * FROM tevent_sound WHERE name = "%s"', $name)); + + if ($exist === false) { + $uploadMaxFilesize = config_return_in_bytes(ini_get('upload_max_filesize')); + + $upload_status = get_file_upload_status('file'); + $upload_result = translate_file_upload_status($upload_status); + if ($uploadMaxFilesize < $sound['size']) { + $error_msg = __('File is too large to upload. Check the configuration in php.ini.'); + } else { + $pathname = $config['homedir'].'/include/sounds/'; + $nameSound = str_replace(' ', '_', $_FILES['file']['name']); + $target_file = $pathname.basename($nameSound); + + if (file_exists($target_file)) { + $error_msg = __('Sound already are exists.'); + } else { + if (move_uploaded_file($_FILES['file']['tmp_name'], $target_file)) { + $insert = db_process_sql_insert( + 'tevent_sound', + [ + 'name' => $name, + 'sound' => $nameSound, + ] + ); + $ok_msg = __('Successfully created'); + } else { + $error_msg = __('Fail uploading the sound'); + } + } + } + + if ($insert > 0) { + $tab = ''; + $message_ok = 1; + } + } else { + $error_msg = __('Sound already are exists'); + } + } else if ($action == 'change_action') { + $id = get_parameter('id', ''); + $new_action = (int) get_parameter('set_action', '1'); + + $exist = db_get_all_rows_sql(sprintf('SELECT * FROM tevent_sound WHERE id = "%s"', $id)); + + if ($exist !== false) { + $result = db_process_sql_update( + 'tevent_sound', + ['active' => $new_action], + ['id' => $id] + ); + if (false === (bool) $result) { + $error_msg = __('Error on update status'); + } else { + $message_ok = 1; + } + } else { + $error_msg = __('Sound not exist'); + } + } + + if ($action) { + ui_print_result_message( + $message_ok, + $ok_msg, + $error_msg, + '', + false + ); + } + + $base_url = 'index.php?sec=eventos&sec2=godmode/events/configuration_sounds'; + $setup_url = $base_url.'&tab=add'; + $tabs = [ + 'list' => [ + 'text' => ''.html_print_image( + 'images/eye_show.png', + true, + [ + 'title' => __('Sounds'), + 'class' => 'invert_filter', + ] + ).'', + 'active' => (bool) ($tab != 'add'), + ], + 'options' => [ + 'text' => ''.html_print_image( + 'images/pen.png', + true, + [ + 'title' => __('Create'), + 'class' => 'invert_filter', + ] + ).'', + 'active' => (bool) ($tab == 'add'), + ], + ]; + + if ($tab === 'add') { + $helpHeader = ''; + $titleHeader = __('Add new sound'); + } else { + $helpHeader = 'servers_ha_clusters_tab'; + $titleHeader = __('Events sound list'); + } + + // Header. + ui_print_standard_header( + $titleHeader, + 'images/gm_servers.png', + false, + $helpHeader, + false, + $tabs, + [ + [ + 'link' => '', + 'label' => __('Events'), + ], + [ + 'link' => '', + 'label' => __('Configuration Sounds'), + ], + ] + ); + + // Javascript. + ui_require_jquery_file('pandora'); + // CSS. + ui_require_css_file('wizard'); + ui_require_css_file('discovery'); + + if ($tab === 'add') { + echo '
    '; + $table = new stdClass(); + $table->width = '100%'; + + $table->class = 'databox filters'; + $table->data = []; + $table->data[0][0] = __('Name:'); + + $table->data[0][1] = html_print_input_text( + 'name', + '', + '', + 80, + 100, + true, + false, + true + ); + + $table->data[1][0] = __('WAV Sound'); + $table->data[1][1] = html_print_input_file('file', true, ['required' => true]); + + html_print_table($table); + + echo '
    '; + html_print_submit_button( + __('Create'), + 'save_sound', + false, + 'class="sub wand"' + ); + echo '
    '; + echo '
    '; + + // Load own javascript file. + echo $this->loadJS(); + } else { + // Datatables list. + try { + $columns = [ + 'name', + 'sound', + [ + 'text' => 'options', + 'class' => 'action_buttons mw120px', + ], + ]; + + $column_names = [ + __('Name'), + __('Sound'), + __('Options'), + ]; + + $this->tableId = 'event_sounds'; + + if (is_metaconsole() === true) { + // Only in case of Metaconsole, format the frame. + open_meta_frame(); + } + + // Load datatables user interface. + ui_print_datatable( + [ + 'id' => $this->tableId, + 'class' => 'info_table', + 'style' => 'width: 100%', + 'columns' => $columns, + 'column_names' => $column_names, + 'ajax_url' => $this->ajaxController, + 'ajax_data' => ['method' => 'draw'], + 'no_sortable_columns' => [-1], + 'order' => [ + 'field' => 'id', + 'direction' => 'asc', + ], + 'search_button_class' => 'sub filter', + 'form' => [ + 'inputs' => [ + [ + 'label' => __('Free search').ui_print_help_tip(__('Search filter by Name or Sound fields content'), true), + 'type' => 'text', + 'class' => 'w200px', + 'id' => 'filter_text', + 'name' => 'filter_text', + ], + [ + 'label' => __('Active'), + 'type' => 'select', + 'fields' => [ + '' => __('All'), + '0' => __('No'), + '1' => __('Yes'), + ], + 'class' => 'w100px', + 'id' => 'active', + 'name' => 'active', + ], + ], + ], + ] + ); + } catch (Exception $e) { + echo $e->getMessage(); + } + + if (is_metaconsole() === true) { + // Close the frame. + close_meta_frame(); + } + + // Load own javascript file. + echo $this->loadJS(); + } + } + + + /** + * Get the data for draw the table. + * + * @return void. + */ + public function draw() + { + global $config; + // Initialice filter. + $filter = '1=1'; + // Init data. + $data = []; + // Count of total records. + $count = 0; + // Catch post parameters. + $start = get_parameter('start', 0); + $length = get_parameter('length', $config['block_size']); + // There is a limit of (2^32)^2 (18446744073709551615) rows in a MyISAM table, show for show all use max nrows. + $length = ($length != '-1') ? $length : '18446744073709551615'; + $order = get_datatable_order(); + $filters = get_parameter('filter', []); + $filterText = $filters['filter_text']; + $filterActive = $filters['active']; + + if (empty($filterText) === false) { + $filter .= sprintf( + " AND (name LIKE '%%%s%%' OR sound LIKE '%%%s%%')", + $filterText, + $filterText + ); + } + + if (in_array($filterActive, [0, 1])) { + $filter .= sprintf( + ' AND active = %s', + $filterActive, + ); + } + + $count = (int) db_get_value_sql(sprintf('SELECT COUNT(*) as "total" FROM tevent_sound WHERE %s', $filter)); + + $sql = sprintf( + 'SELECT * + FROM tevent_sound + WHERE %s + ORDER BY %s + LIMIT %d, %d', + $filter, + $order, + $start, + $length + ); + $data = db_get_all_rows_sql($sql); + + foreach ($data as $key => $row) { + if ($row['active'] === '1') { + $img = 'images/lightbulb.png'; + $action = __('Disable sound'); + $new_action = 0; + } else { + $img = 'images/lightbulb_off.png'; + $action = __('Enable sound'); + $new_action = 1; + } + + $options = ''; + $options .= html_print_image( + $img, + true, + [ + 'title' => $action, + 'class' => 'invert_filter', + ] + ); + $options .= ''; + + $data[$key]['options'] = $options; + } + + echo json_encode( + [ + 'data' => $data, + 'recordsTotal' => $count, + 'recordsFiltered' => $count, + ] + ); + } + + + /** + * Checks if target method is available to be called using AJAX. + * + * @param string $method Target method. + * + * @return boolean True allowed, false not. + */ + public function ajaxMethod(string $method) + { + return in_array($method, $this->AJAXMethods); + } + + + /** + * Load Javascript code. + * + * @return string. + */ + public function loadJS() + { + // Nothing for this moment. + ob_start(); + + // Javascript content. + ?> + + 'StarTrek emergency simulation', ]; +$eventsounds = mysql_db_get_row_sql('SELECT * FROM tevent_sound WHERE active = 1'); +foreach ($eventsounds as $key => $row) { + $sounds[$row['sound']] = $row['name']; +} + $inputs[] = [ 'label' => \__('Sounds'), 'class' => 'flex-row', diff --git a/pandora_console/operation/menu.php b/pandora_console/operation/menu.php index bb0802a567..fd681495be 100644 --- a/pandora_console/operation/menu.php +++ b/pandora_console/operation/menu.php @@ -477,6 +477,10 @@ if ($access_console_node === true) { } Date: Fri, 27 Jan 2023 12:44:15 +0100 Subject: [PATCH 120/474] blink button test sound events pandora_enterprise#10189 --- .../include/javascript/pandora_events.js | 2 + .../include/styles/sound_events.css | 56 +++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/pandora_console/include/javascript/pandora_events.js b/pandora_console/include/javascript/pandora_events.js index c2ee675f0d..92eadf14fe 100644 --- a/pandora_console/include/javascript/pandora_events.js +++ b/pandora_console/include/javascript/pandora_events.js @@ -1030,8 +1030,10 @@ function openSoundEventModal(settings) { function test_sound_button(test_sound, urlSound) { if (test_sound === true) { + $("#button-melody_sound").addClass("blink-image"); add_audio(urlSound); } else { + $("#button-melody_sound").removeClass("blink-image"); remove_audio(); } } diff --git a/pandora_console/include/styles/sound_events.css b/pandora_console/include/styles/sound_events.css index 667446b1e8..9990550fda 100644 --- a/pandora_console/include/styles/sound_events.css +++ b/pandora_console/include/styles/sound_events.css @@ -301,3 +301,59 @@ background: #e63c52; } } + +/* Firefox old*/ +@-moz-keyframes blink { + 0% { + opacity: 1; + } + 50% { + opacity: 0; + } + 100% { + opacity: 1; + } +} + +@-webkit-keyframes blink { + 0% { + opacity: 1; + } + 50% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +/* IE */ +@-ms-keyframes blink { + 0% { + opacity: 1; + } + 50% { + opacity: 0.5; + } + 100% { + opacity: 1; + } +} +/* Opera and prob css3 final iteration */ +@keyframes blink { + 0% { + opacity: 1; + } + 50% { + opacity: 0.5; + } + 100% { + opacity: 1; + } +} +.blink-image { + -moz-animation: blink normal 2s infinite ease-in-out; /* Firefox */ + -webkit-animation: blink normal 2s infinite ease-in-out; /* Webkit */ + -ms-animation: blink normal 2s infinite ease-in-out; /* IE */ + animation: blink normal 2s infinite ease-in-out; /* Opera and prob css3 final iteration */ + filter: hue-rotate(120deg); +} From 7111fd66e2fc23008fb7080dad788d9325d4f95f Mon Sep 17 00:00:00 2001 From: Calvo Date: Fri, 27 Jan 2023 13:43:23 +0100 Subject: [PATCH 121/474] Fix empty module data list view --- pandora_console/operation/agentes/status_monitor.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/operation/agentes/status_monitor.php b/pandora_console/operation/agentes/status_monitor.php index 8da3b9b2ba..82ba6fcfee 100644 --- a/pandora_console/operation/agentes/status_monitor.php +++ b/pandora_console/operation/agentes/status_monitor.php @@ -1939,7 +1939,7 @@ if (!empty($result)) { } else { $sub_string = substr(io_safe_output($row['datos']), 0, 12); if ($module_value == $sub_string) { - if ($module_value == 0 && !$sub_string) { + if ((empty($module_value) === true || $module_value == 0) && !$sub_string) { $salida = 0; } else { $data_macro = modules_get_unit_macro($row['datos'], $row['unit']); From 624463d5739ec26dff469ddede86dc8b31e85d7d Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 30 Jan 2023 08:27:03 +0100 Subject: [PATCH 122/474] #9819 change setcion menu configuration sound --- pandora_console/godmode/menu.php | 4 ++++ pandora_console/operation/menu.php | 5 ----- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/pandora_console/godmode/menu.php b/pandora_console/godmode/menu.php index d98eb9d3c6..9dc13b6abb 100644 --- a/pandora_console/godmode/menu.php +++ b/pandora_console/godmode/menu.php @@ -435,6 +435,10 @@ if ((bool) check_acl($config['id_user'], 0, 'PM') === true || (bool) check_acl($ } } + $sub['godmode/events/configuration_sounds']['text'] = __('Configuration Sounds'); + $sub['godmode/events/configuration_sounds']['id'] = 'Configuration Sounds'; + $sub['godmode/events/configuration_sounds']['pages'] = ['godmode/events/configuration_sounds']; + $menu_godmode['gextensions']['sub'] = $sub; } diff --git a/pandora_console/operation/menu.php b/pandora_console/operation/menu.php index fd681495be..c777e1d97b 100644 --- a/pandora_console/operation/menu.php +++ b/pandora_console/operation/menu.php @@ -477,10 +477,6 @@ if ($access_console_node === true) { } Date: Mon, 30 Jan 2023 13:39:27 +0100 Subject: [PATCH 123/474] Polish TreeView --- pandora_console/include/class/Tree.class.php | 1 - .../include/functions_treeview.php | 119 ++++++++---------- pandora_console/include/functions_ui.php | 1 + .../include/javascript/fixed-bottom-box.js | 6 + .../include/javascript/tree/TreeController.js | 22 ++-- .../include/styles/fixed-bottom-box.css | 24 ++-- pandora_console/include/styles/pandora.css | 1 + pandora_console/include/styles/progress.css | 2 +- pandora_console/include/styles/tree.css | 41 ++++-- pandora_console/operation/tree.php | 5 +- 10 files changed, 114 insertions(+), 108 deletions(-) diff --git a/pandora_console/include/class/Tree.class.php b/pandora_console/include/class/Tree.class.php index 2588d3f48f..7daea2bf1f 100644 --- a/pandora_console/include/class/Tree.class.php +++ b/pandora_console/include/class/Tree.class.php @@ -669,7 +669,6 @@ class Tree } $module['statusImageHTML'] = ui_print_status_image($statusType, htmlspecialchars($statusTitle), true); - $module['statusImageHTML'] = 'cipote'; // HTML of the server type image. $module['serverTypeHTML'] = ui_print_servertype_icon((int) $module['server_type']); diff --git a/pandora_console/include/functions_treeview.php b/pandora_console/include/functions_treeview.php index 66bd44847f..bf0874f407 100755 --- a/pandora_console/include/functions_treeview.php +++ b/pandora_console/include/functions_treeview.php @@ -55,7 +55,7 @@ function treeview_printModuleTable($id_module, $server_data=false, $no_head=fals $table = new StdClass(); $table->width = '100%'; - $table->class = 'floating_form margin-top-10'; + $table->class = 'floating_form'; $table->id = 'tree_view_module_data'; $table->style = []; $table->style['title'] = 'height: 32px; width: 30%; padding-right: 5px; text-align: end;'; @@ -70,6 +70,21 @@ function treeview_printModuleTable($id_module, $server_data=false, $no_head=fals $row['data'] = $cellName; $table->data['name'] = $row; + // Edit module button. + $row = []; + $row['title'] = html_print_button( + __('Edit module'), + 'edit_module_link', + false, + 'window.location.assign(\''.$console_url.'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente='.$module['id_agente'].'&tab=module&edit_module=1&id_agent_module='.$module['id_agente_modulo'].$url_hash.'\')', + [ + 'mode' => 'link', + 'style' => 'float: right;justify-content: end;padding: 0;', + ], + true + ); + $table->data['edit_button'] = $row; + // Interval. $row = []; $row['title'] = __('Interval'); @@ -304,20 +319,8 @@ function treeview_printModuleTable($id_module, $server_data=false, $no_head=fals $row['data'] = $time_elapsed; $table->data['tags'] = $row; - // Edit module button. - $row = []; - $row['title'] = html_print_button( - __('Edit module'), - 'edit_module_link', - false, - 'window.location.assign(\''.$console_url.'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente='.$module['id_agente'].'&tab=module&edit_module=1&id_agent_module='.$module['id_agente_modulo'].$url_hash.'\')', - [ 'mode' => 'link' ], - true - ); - $table->data['edit_button'] = $row; - $table->colspan['edit_button'] = 2; // Title. - echo ''.__('Module information').''; + echo ''; // End of table. html_print_table($table); @@ -562,7 +565,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $table = new StdClass(); $table->width = '100%'; - $table->class = 'floating_form'; + $table->class = 'floating_form border-bottom-gray'; $table->id = 'tree_view_agent_detail'; $table->style = []; $table->style['title'] = 'height: 32px; width: 30%; padding-right: 5px; text-align: end;'; @@ -603,6 +606,22 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $row['data'] = $cellName; $table->data['name'] = $row; + // Edit agent button. + $row = []; + $row['title'] = html_print_button( + __('Edit agent'), + 'edit_agent_link', + false, + $urlAgent, + [ + 'mode' => 'link', + 'style' => 'float: right;justify-content: end;padding: 0;', + ], + true + ); + $row['data'] = ''; + $table->data['edit_button'] = $row; + // Addresses. $ips = []; $addresses = agents_get_addresses($id_agente); @@ -670,7 +689,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $row['title'] = __('Next agent contact'); $row['data'] = ui_progress( $progress, - '100%', + '80%', '1.2', '#ececec', true, @@ -680,19 +699,6 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) ); $table->data['next_contact'] = $row; - // Edit agent button. - $row = []; - $row['title'] = html_print_button( - __('Edit agent'), - 'edit_agent_link', - false, - $urlAgent, - [ 'mode' => 'link' ], - true - ); - $table->data['edit_button'] = $row; - $table->colspan['edit_button'] = 2; - // End of table. $agent_table = html_print_table($table, true); /* @@ -716,28 +722,10 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $agent_table .= $go_to_agent; } */ + // Title. + echo ''; // Print agent data toggle. - ui_toggle( - $agent_table, - ''.__('Agent data').'', - '', - '', - false, - false, - '', - 'white-box-content', - 'white_table_graph', - '', - '', - false, - false, - false, - '', - '', - null, - null, - true - ); + echo $agent_table; // Advanced data. $table = new StdClass(); @@ -829,7 +817,6 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) // End of table advanced. $table_advanced = html_print_table($table, true); - echo '
    '; ui_toggle( $table_advanced, ''.__('Advanced information').'', @@ -838,8 +825,8 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) true, false, '', - 'white-box-content', - 'white_table_graph margin-top-20' + 'white-box-content border-bottom-gray', + 'white_table_graph margin-top-10 margin-bottom-10' ); if ($config['agentaccess']) { @@ -850,7 +837,6 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) false ); $access_graph .= '
    '; - echo '
    '; ui_toggle( $access_graph, ''.__('Agent access rate (24h)').'', @@ -859,8 +845,8 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) true, false, '', - 'white-box-content', - 'white_table_graph margin-top-20' + 'white-box-content border-bottom-gray', + 'white_table_graph margin-top-10 margin-bottom-10' ); } @@ -878,7 +864,6 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $server_id ); $events_graph .= '

    '; - echo '
    '; ui_toggle( $events_graph, ''.__('Events (24h)').'', @@ -888,18 +873,18 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) false, '', 'white-box-content', - 'white_table_graph margin-top-20' + 'white_table_graph margin-bottom-10 border-bottom-gray' ); - // Table network interfaces + // Table network interfaces. $network_interfaces_by_agents = agents_get_network_interfaces([$agent]); $network_interfaces = []; - if (!empty($network_interfaces_by_agents) && !empty($network_interfaces_by_agents[$id_agente])) { + if (empty($network_interfaces_by_agents) === false && empty($network_interfaces_by_agents[$id_agente]) === false) { $network_interfaces = $network_interfaces_by_agents[$id_agente]['interfaces']; } - if (!empty($network_interfaces)) { + if (empty($network_interfaces) === false) { $table = new stdClass(); $table->id = 'agent_interface_info'; $table->class = 'databox'; @@ -911,10 +896,10 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $table->data = []; foreach ($network_interfaces as $interface_name => $interface) { - if (!empty($interface['traffic'])) { - $permission = check_acl($config['id_user'], $agent['id_grupo'], 'RR'); + if (empty($interface['traffic']) === false) { + $permission = (bool) check_acl($config['id_user'], $agent['id_grupo'], 'RR'); - if ($permission) { + if ($permission === true) { $params = [ 'interface_name' => $interface_name, 'agent_id' => $id_agente, @@ -922,14 +907,14 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) 'traffic_module_out' => $interface['traffic']['out'], ]; - if (defined('METACONSOLE') && !empty($server_id)) { + if (is_metaconsole() === true && empty($server_id) === false) { $params['server'] = $server_id; } $params_json = json_encode($params); $params_encoded = base64_encode($params_json); $url = ui_get_full_url('operation/agentes/interface_traffic_graph_win.php', false, false, false); - $graph_url = "$url?params=$params_encoded"; + $graph_url = $url.'?params='.$params_encoded; $win_handle = dechex(crc32($interface['status_module_id'].$interface_name)); $graph_link = ""; @@ -955,7 +940,7 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $table->data[] = $data; } - // End of table network interfaces + // End of table network interfaces. $table_interfaces = html_print_table($table, true); $table_interfaces .= '
    '; diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index a008104594..90d8ac041d 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -2917,6 +2917,7 @@ function get_shape_status_set($type) case STATUS_ALERT_NOT_FIRED_BALL: case STATUS_ALERT_DISABLED_BALL: $return = ['class' => 'status_small_balls']; + // $return = ['class' => 'status_balls']; break; default: diff --git a/pandora_console/include/javascript/fixed-bottom-box.js b/pandora_console/include/javascript/fixed-bottom-box.js index 1943106deb..0d07eedb41 100644 --- a/pandora_console/include/javascript/fixed-bottom-box.js +++ b/pandora_console/include/javascript/fixed-bottom-box.js @@ -44,6 +44,7 @@ self._width = params.width || 300; self._height = params.height || 400; + self._headTitle = params.headTitle || ""; self.setWidth = function(width) { if (typeof width !== "number" || width <= 0) @@ -103,6 +104,11 @@ var headBody = $("
    "); headBody.addClass("fixed-bottom-box-head-body"); + headBody.append( + $( + '' + ) + ); var headClose = $(""); headClose.addClass("fixed-bottom-box-head-close").click(function(event) { self.close(); diff --git a/pandora_console/include/javascript/tree/TreeController.js b/pandora_console/include/javascript/tree/TreeController.js index 69a308ac69..3dd22194dc 100644 --- a/pandora_console/include/javascript/tree/TreeController.js +++ b/pandora_console/include/javascript/tree/TreeController.js @@ -622,6 +622,10 @@ var TreeController = { data: postData, success: function(data, textStatus, xhr) { callback(null, data); + console.log(data); + $("#fixed-bottom-box-head-title").html( + $("#fixedBottomHeadTitle").html() + ); }, error: function(xhr, textStatus, errorThrown) { callback(errorThrown); @@ -730,11 +734,9 @@ var TreeController = { typeof element.statusImageHTML != "undefined" && element.statusImageHTML.length > 0 ) { - console.log("es aqui pollito agente"); var $statusImage = $(element.statusImageHTML); $statusImage.addClass("node-icon"); $statusImage.addClass("node-status"); - //$statusImage.addClass("agent-status"); $content.append($statusImage); } @@ -906,7 +908,7 @@ var TreeController = { element.elementDescription != "" ) { $content.append( - '' + + '' + element.elementDescription + "" ); @@ -915,13 +917,15 @@ var TreeController = { element.description != "" ) { $content.append( - '' + + '' + element.description + "" ); } else { $content.append( - '' + element.name + "" + '' + + element.name + + "" ); } } else { @@ -977,14 +981,14 @@ var TreeController = { break; case "module": $content.addClass("module"); - + //console.log(element); $statusImage.addClass("node-status"); // Status image if ( typeof element.statusImageHTML != "undefined" && element.statusImageHTML.length > 0 ) { var $statusImage = $(element.statusImageHTML); - $statusImage.addClass("module-status"); + $statusImage.addClass("node-icon").addClass("node-status"); $content.append($statusImage); } else { @@ -1047,7 +1051,6 @@ var TreeController = { }); actionButtons.append(graphImageHistogram); - //$content.append(graphImageHistogram); } // Graph pop-up @@ -1101,7 +1104,6 @@ var TreeController = { }); actionButtons.append($graphImage); - //$content.append($graphImage); } // Data pop-up @@ -1140,7 +1142,6 @@ var TreeController = { }); actionButtons.append($dataImage); - //$content.append($dataImage); } } } @@ -1176,7 +1177,6 @@ var TreeController = { .css("cursor", "pointer"); actionButtons.append($alertsImage); - //$content.append($alertsImage); } $content.append(actionButtons); diff --git a/pandora_console/include/styles/fixed-bottom-box.css b/pandora_console/include/styles/fixed-bottom-box.css index b8882ee0a2..ede8a885d8 100644 --- a/pandora_console/include/styles/fixed-bottom-box.css +++ b/pandora_console/include/styles/fixed-bottom-box.css @@ -2,12 +2,7 @@ div.fixed-bottom-box { background: #fff; height: -webkit-fill-available; height: -moz-fill-available; - border-radius: 10px 10px 0 0; - -moz-border-radius: 10px 10px 0 0; - -webkit-border-radius: 10px 10px 0 0; - -o-border-radius: 10px 10px 0 0; - -ms-border-radius: 10px 10px 0 0; - -khtml-border-radius: 10px 10px 0 0; + border-left: 1px solid #aeaeae; } /* Overrides */ @@ -29,8 +24,8 @@ div.fixed-bottom-box > div.fixed-bottom-box-head { height: 40px; line-height: 30px; vertical-align: middle; - position: absolute; - border-bottom: 1px solid #aeaeae; + box-sizing: border-box; + border-bottom: 1px solid #eaeaea; } div.fixed-bottom-box @@ -38,10 +33,10 @@ div.fixed-bottom-box > div.fixed-bottom-box-head-body { height: inherit; line-height: inherit; - color: #ffffff; + background-color: #fff; font-weight: bold; vertical-align: middle; - text-align: center; + border-bottom: 1px solid #eaeaea; } div.fixed-bottom-box @@ -54,7 +49,7 @@ div.fixed-bottom-box background-position: center; position: absolute; top: 10px; - right: 20px; + right: 10px; } div.fixed-bottom-box @@ -94,5 +89,10 @@ div.fixed-bottom-box > div.fixed-bottom-box-content { width: 100% !important; height: 100% !important; max-height: 100% !important; - border-left: 1px solid #aeaeae; +} + +#fixed-bottom-box-head-title { + position: absolute; + top: 10px; + left: 20px; } diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 35cc36229d..4f61b95064 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -10986,6 +10986,7 @@ pre.external_tools_output { padding-bottom: 17px; } +.border-bottom-gray, .table-about .about-last-tr { border-bottom: 1px solid #eaeaea; } diff --git a/pandora_console/include/styles/progress.css b/pandora_console/include/styles/progress.css index 1717bbe06d..66921d7da6 100644 --- a/pandora_console/include/styles/progress.css +++ b/pandora_console/include/styles/progress.css @@ -5,7 +5,7 @@ width: 100%; display: inline-block; display: flex; - border-radius: 8px; + border-radius: 4px; line-height: 24px; font-size: 11pt; } diff --git a/pandora_console/include/styles/tree.css b/pandora_console/include/styles/tree.css index 1da0b7650c..edab87260c 100644 --- a/pandora_console/include/styles/tree.css +++ b/pandora_console/include/styles/tree.css @@ -8,9 +8,10 @@ flex-direction: row; flex-wrap: wrap; align-items: center; - width: calc(100% - 25px); - border: 1px solid #aeaeae; - border-radius: 8px; + width: calc(100% - 24px); + border: 1px solid #eaeaea; + border-radius: 4px; + background-color: #fff; margin-bottom: 8px; } @@ -33,7 +34,7 @@ width: 40px; display: inline-block; box-sizing: border-box; - border-right: 1px solid #aeaeae; + border-right: 1px solid #eaeaea; } .tree-node .node-icon .node-icon-container { @@ -62,7 +63,7 @@ .tree-group { margin-left: 24px; - padding-top: 1px; + /*padding-top: 1px;*/ } .tree-node { @@ -73,7 +74,7 @@ background-repeat: repeat-y; */ min-height: 26px; - margin-top: 8px; + margin-top: 1px; } div.tree-node { @@ -88,8 +89,9 @@ div.tree-node span { background: 0 0; } .node-content { - border: 1px solid #aeaeae; - border-radius: 8px; + border: 1px solid #eaeaea; + background-color: #fff; + border-radius: 4px; width: calc(100% - 50px); box-sizing: border-box; height: 40px; @@ -190,19 +192,30 @@ div.tree-node span { flex: 1 1 80%; position: relative; font-weight: bold; + font-size: 11pt; } .tree-node > .node-content > .module-name-parent.module-only-caption { top: 9px; } +.node-service > .node-service-name { + flex: 1 1 50%; + font-size: 11pt; + font-weight: bold; +} .tree-node > .node-content.module-only-caption > .module-name { top: 7px; } +.node-content.module:not(.module-only-caption) .module-name { + margin-left: 3.5em; + font-weight: normal; +} /*.node-content.module.module-only-caption:not(:first-of-type) { margin-top: 8px; }*/ + .tree-node > .node-content > .module-name-alias { font-size: 12pt; font-weight: normal; @@ -210,6 +223,9 @@ div.tree-node span { margin-left: 3.3em; } +.tree-node > .node-content.module-only-caption > .module-name-alias { + margin-left: 1em; +} .tree-node > .node-content > .module-name-parent { font-size: 12pt; margin-left: 0.5em; @@ -269,10 +285,9 @@ div.tree-node span { div#tree-controller-recipient { text-align: left; - width: 65%; - /* width: 98%; */ + width: calc((100% - 34%) - 20px); margin-top: 10px; - margin-left: 10px; + margin-left: 20px; } .tree-controller-recipient { @@ -307,7 +322,7 @@ div#tree-controller-recipient { flex-direction: row; align-items: center; width: calc(100% - 50px); - margin: 8px 0 0 8px; + margin: 1px 0 0 8px; } .node-content .module-button { @@ -331,5 +346,5 @@ div#tree-controller-recipient { .tree-root > .tree-node { margin-top: 0; - margin-bottom: 10px; + margin-bottom: 2px; } diff --git a/pandora_console/operation/tree.php b/pandora_console/operation/tree.php index a91be60326..a850a632c9 100755 --- a/pandora_console/operation/tree.php +++ b/pandora_console/operation/tree.php @@ -333,7 +333,7 @@ if (is_metaconsole() === true) { } enterprise_hook('close_meta_frame'); - +$infoHeadTitle = 'Sombra oscura'; ?> @@ -438,11 +438,10 @@ enterprise_hook('close_meta_frame'); break; } } - treeController.init({ recipient: $("div#tree-controller-recipient"), - detailRecipient: $.fixedBottomBox({ width: 400, height: window.innerHeight * 0.9 }), + detailRecipient: $.fixedBottomBox({ width: 400, height: window.innerHeight * 0.9, headTitle: "" }), page: parameters['page'], emptyMessage: "", foundMessage: foundMessage, From 0162767f6d0c315ff35c6a88ab8dc231c579307c Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 30 Jan 2023 13:39:58 +0100 Subject: [PATCH 124/474] Clean debug --- .../godmode/agentes/module_manager_editor_common.php | 9 --------- 1 file changed, 9 deletions(-) diff --git a/pandora_console/godmode/agentes/module_manager_editor_common.php b/pandora_console/godmode/agentes/module_manager_editor_common.php index 981bda17a5..cd149dd5ca 100644 --- a/pandora_console/godmode/agentes/module_manager_editor_common.php +++ b/pandora_console/godmode/agentes/module_manager_editor_common.php @@ -1937,15 +1937,6 @@ $(document).ready (function () { $('.switch_radio_button label').on('click', function(){ var thisLabel = $(this).attr('for'); - /* - console.log(thisLabel); - console.log($('#'+thisLabel).attr('name')); - console.log($('#'+thisLabel).attr('value')); - console.log($('[name='+$('#'+thisLabel).attr('name')+']')); - */ - //console.log($('#'+$('#'+thisLabel).attr('name')).val()); - //$('[name='+$('#'+thisLabel).attr('name')+']').val($('#'+thisLabel).attr('value')); - //$('[name='+$('#'+thisLabel).attr('name')+']').prop('checked', true); $('#'+thisLabel).attr('checked', 'checked'); $('#'+thisLabel).siblings().attr('checked', false); From 9694699ab091476678858258dfc0b5b536a4eb33 Mon Sep 17 00:00:00 2001 From: alejandro Date: Mon, 30 Jan 2023 15:31:58 +0100 Subject: [PATCH 125/474] update google sheet plugin --- .../google_sheets/pandora_googlesheet.py | 72 ++++++++++++++----- 1 file changed, 54 insertions(+), 18 deletions(-) diff --git a/pandora_plugins/google_sheets/pandora_googlesheet.py b/pandora_plugins/google_sheets/pandora_googlesheet.py index a6e599b429..d02fc4cd3b 100644 --- a/pandora_plugins/google_sheets/pandora_googlesheet.py +++ b/pandora_plugins/google_sheets/pandora_googlesheet.py @@ -1,7 +1,13 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + import gspread -import argparse +import argparse,json,sys from oauth2client.service_account import ServiceAccountCredentials from pprint import pprint +from os import remove + +import base64 __author__ = "Alejandro Sánchez Carrion" __copyright__ = "Copyright 2022, PandoraFMS" @@ -15,33 +21,63 @@ Version = {__version__} Manual execution -python3 pandora_googlesheets.py --cred --row --column +python3 pandora_googlesheets.py --creds_json/creds_base64 --row --column """ parser = argparse.ArgumentParser(description= info, formatter_class=argparse.RawTextHelpFormatter) -parser.add_argument('--cred', help='') -parser.add_argument('--name', help='') -parser.add_argument('--row', help='',type=int) -parser.add_argument('--column', help='',type=int) +parser.add_argument('--creds_json', help='To authenticate with a json file.') +parser.add_argument('--creds_base64', help='To authenticate with a file that includes the credentials for base64 authentication.') +parser.add_argument('--name', help='Name of the google sheets document.') +parser.add_argument('--cell', help='To collect the value of a cell.') +parser.add_argument('--row', help='To collect the value of a row.',type=int) +parser.add_argument('--column', help='To collect the value of a column.',type=int) +parser.add_argument('--sheet', help='To indicate the name of the document sheet, put it in quotation marks and count spaces and capital letters.',type=str) args = parser.parse_args() scope = ["https://spreadsheets.google.com/feeds",'https://www.googleapis.com/auth/spreadsheets',"https://www.googleapis.com/auth/drive.file","https://www.googleapis.com/auth/drive"] -creds = ServiceAccountCredentials.from_json_keyfile_name(args.cred, scope) + + + + +## authenticate with file json input +if args.creds_json is not None and args.creds_base64 == None: + creds = ServiceAccountCredentials.from_json_keyfile_name(args.creds_json, scope) +## authenticate with base64 input +elif args.creds_base64 is not None and args.creds_json== None: + ## base64 to json + with open(args.creds_base64, 'r') as file: + data = file.read().replace('\n', '') + text=base64.b64decode(data).decode('utf-8') + with open("cred.json", "w") as outfile: + outfile.write(text) + creds = ServiceAccountCredentials.from_json_keyfile_name("cred.json", scope) + remove("cred.json") +else: + print("You need to use the --creds_json or creds_base 64 parameter to authenticate. You can only select one.") + sys.exit() client = gspread.authorize(creds) -sheet = client.open(args.name).sheet1 # Open the spreadhseet +sheet = client.open(args.name) # Open the spreadhseet +worksheet = sheet.worksheet(args.sheet) # Open worksheet -data = sheet.get_all_records() # Get a list of all records +if args.cell is not None and args.row==None and args.column==None : -if args.row is not None and args.column==None: - row = sheet.row_values(args.row) # Get a specific row - print(row) -elif args.row ==None and args.column is not None: - col = sheet.col_values(args.column) # Get a specific column - print(col) -elif args.row is not None and args.column is not None: - cell = sheet.cell(args.row,args.column).value # Get the value of a specific cell - print(cell) + val = worksheet.acell(args.cell).value + +elif args.row is not None and args.column==None and args.cell == None: + + val = worksheet.row_values(args.row) # Get a specific row + +elif args.column is not None and args.row== None and args.cell == None: + + val = worksheet.col_values(args.column) # Get a specific column + +else: + print("To search for data in a cell use the --cell parameter, for data in a column --column and in a row --row, only one of these parameters can be used at a time.") + sys.exit() + + +print(val) From 891e485781e5aec3ad96f92df42fea500f2bd665 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 30 Jan 2023 16:14:05 +0100 Subject: [PATCH 126/474] Fixed users list view --- .../godmode/users/profile_list.php | 19 +- pandora_console/godmode/users/user_list.php | 235 ++++++++++++------ pandora_console/include/functions_html.php | 2 +- pandora_console/include/styles/pandora.css | 5 +- 4 files changed, 173 insertions(+), 88 deletions(-) diff --git a/pandora_console/godmode/users/profile_list.php b/pandora_console/godmode/users/profile_list.php index da8eac4e9e..f2094c87c3 100644 --- a/pandora_console/godmode/users/profile_list.php +++ b/pandora_console/godmode/users/profile_list.php @@ -80,13 +80,24 @@ if (is_metaconsole() === false) { $buttons[$tab]['active'] = true; - ui_print_page_header( - __('User management').' » '.__('Profiles defined on %s', get_product_name()), + // Header. + ui_print_standard_header( + __('User Profile management'), 'images/gm_users.png', false, 'profile_tab', - true, - $buttons + false, + $buttons, + [ + [ + 'link' => '', + 'label' => __('Profiles'), + ], + [ + 'link' => '', + 'label' => __('Manage users'), + ], + ] ); $sec = 'gusuarios'; } else { diff --git a/pandora_console/godmode/users/user_list.php b/pandora_console/godmode/users/user_list.php index a110631c0a..07f577da65 100644 --- a/pandora_console/godmode/users/user_list.php +++ b/pandora_console/godmode/users/user_list.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2021 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 Artica Soluciones Tecnologicas * Please see http://pandorafms.org for full contribution list * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -285,13 +285,24 @@ if (is_metaconsole() === true) { $buttons[$tab]['active'] = true; - ui_print_page_header( - __('User management').' » '.__('Users defined on %s', get_product_name()), + // Header. + ui_print_standard_header( + __('Users management'), 'images/gm_users.png', false, '', - true, - $buttons + false, + $buttons, + [ + [ + 'link' => '', + 'label' => __('Profiles'), + ], + [ + 'link' => '', + 'label' => __('Manage users'), + ], + ] ); $sec = 'gusuarios'; @@ -443,12 +454,14 @@ if (($filter_group == 0) && ($filter_search == '')) { $search = false; } -$table = new stdClass(); -$table->width = '100%'; -$table->class = 'databox filters'; -$table->rowclass[0] = ''; -$table->data[0][0] = ''.__('Group').''; -$table->data[0][1] = html_print_select_groups( +$filterTable = new stdClass(); +$filterTable->width = '100%'; +$filterTable->class = 'fixed_filter_bar'; +$filterTable->rowclass[0] = ''; +$filterTable->cellstyle[0][0] = 'width:0'; +$filterTable->cellstyle[0][1] = 'width:0'; +$filterTable->data[0][0] = __('Group'); +$filterTable->data[1][0] = html_print_select_groups( false, 'AR', true, @@ -459,8 +472,8 @@ $table->data[0][1] = html_print_select_groups( 0, true ); -$table->data[0][2] = ''.__('Search').''.ui_print_help_tip(__('Search by username, fullname or email'), true); -$table->data[0][3] = html_print_input_text( +$filterTable->data[0][1] = __('Search').ui_print_help_tip(__('Search by username, fullname or email'), true); +$filterTable->data[1][1] = html_print_input_text( 'filter_search', $filter_search, __('Search by username, fullname or email'), @@ -468,11 +481,16 @@ $table->data[0][3] = html_print_input_text( 90, true ); -$table->data[0][4] = html_print_submit_button( +$filterTable->cellstyle[1][2] = 'vertical-align: bottom'; +$filterTable->data[1][2] = html_print_submit_button( __('Search'), 'search', false, - ['class' => 'sub search'], + [ + 'icon' => 'search', + 'class' => 'float-right', + 'mode' => 'secondary mini', + ], true ); @@ -497,22 +515,16 @@ if (is_metaconsole() === false && is_management_allowed() === false) { if (is_metaconsole() === true) { - $table->width = '96%'; + $filterTable->width = '96%'; $form_filter = "
    "; - $form_filter .= html_print_table($table, true); + $form_filter .= html_print_table($filterTable, true); $form_filter .= '
    '; ui_toggle($form_filter, __('Show Options')); } else { $form_filter = "
    "; - $form_filter .= html_print_table($table, true); + $form_filter .= html_print_table($filterTable, true); $form_filter .= '
    '; - ui_toggle( - $form_filter, - __('Users control filter'), - __('Toggle filter(s)'), - '', - !$search - ); + echo $form_filter; } // Urls to sort the table. @@ -527,8 +539,9 @@ $url_down_last = '?sec='.$sec.'&sec2=godmode/users/user_list&sort_field=last_con $table = new stdClass(); $table->cellpadding = 0; $table->cellspacing = 0; -$table->width = '100%'; -$table->class = 'info_table'; +$table->class = 'info_table tactical_table'; +$table->id = 'user_list'; +$table->styleTable = 'margin: 0 10px'; $table->head = []; $table->data = []; @@ -536,15 +549,18 @@ $table->align = []; $table->size = []; $table->valign = []; -$table->head[0] = __('User ID').ui_get_sorting_arrows($url_up_id, $url_down_id, $selectUserIDUp, $selectUserIDDown); -$table->head[1] = __('Name').ui_get_sorting_arrows($url_up_name, $url_down_name, $selectFullnameUp, $selectFullnameDown); -$table->head[2] = __('Last contact').ui_get_sorting_arrows($url_up_last, $url_down_last, $selectLastConnectUp, $selectLastConnectDown); +$table->head[0] = ''.__('User ID').''; +$table->head[0] .= ui_get_sorting_arrows($url_up_id, $url_down_id, $selectUserIDUp, $selectUserIDDown); +$table->head[1] = ''.__('Name').''; +$table->head[1] .= ui_get_sorting_arrows($url_up_name, $url_down_name, $selectFullnameUp, $selectFullnameDown); +$table->head[2] = ''.__('Last contact').''; +$table->head[2] .= ui_get_sorting_arrows($url_up_last, $url_down_last, $selectLastConnectUp, $selectLastConnectDown); -$table->head[3] = __('Admin'); -$table->head[4] = __('Profile / Group'); -$table->head[5] = __('Description'); +$table->head[3] = ''.__('Admin').''; +$table->head[4] = ''.__('Profile / Group').''; +$table->head[5] = ''.__('Description').''; if ($is_management_allowed === true) { - $table->head[6] = ''.__('Op.').''; + $table->head[6] = ''.__('Actions').''; } if (is_metaconsole() === false) { @@ -579,7 +595,7 @@ if ($user_is_admin) { } else { $group_um = users_get_groups_UM($config['id_user']); // 0 is the group 'all'. - if (isset($group_um[0])) { + if (isset($group_um[0]) === true) { $info1 = get_users($order); } else { foreach ($group_um as $group => $value) { @@ -636,9 +652,6 @@ foreach ($info1 as $user_id => $user_info) { $info = $info1; -// Prepare pagination. -ui_pagination(count($info)); - $offset = (int) get_parameter('offset'); $limit = (int) $config['block_size']; @@ -720,12 +733,12 @@ foreach ($info as $user_id => $user_info) { if ($user_info['is_admin']) { $data[3] = html_print_image( - 'images/user_suit.png', + 'images/user.svg', true, [ 'alt' => __('Admin'), 'title' => __('Administrator'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ).' '; } else { @@ -784,10 +797,10 @@ foreach ($info as $user_id => $user_info) { } $data[5] = ui_print_string_substr($user_info['comments'], 24, true); - + $table->cellclass[][6] = 'table_action_buttons'; + $data[6] = ''; + $userListActionButtons = []; if ($is_management_allowed === true) { - $table->cellclass[][6] = 'table_action_buttons'; - $data[6] = ''; if ($user_is_admin || $config['id_user'] == $user_info['id_user'] || isset($group_um[0]) @@ -796,30 +809,47 @@ foreach ($info as $user_id => $user_info) { ) { // Disable / Enable user. if (isset($user_info['not_delete']) === false) { - if ($user_info['disabled'] == 0) { + if ((int) $user_info['disabled'] === 0) { $toDoString = __('Disable'); $toDoAction = '1'; - $toDoImage = 'images/lightbulb.png'; + $toDoImage = 'images/disable.svg'; $toDoClass = ''; } else { $toDoString = __('Enable'); $toDoAction = '0'; - $toDoImage = 'images/lightbulb_off.png'; + $toDoImage = 'images/enable.svg'; $toDoClass = 'filter_none'; } - $data[6] = '
    '; - $data[6] .= html_print_input_hidden( + $userListActionButtons[] = html_print_menu_button( + [ + 'href' => ui_get_full_url( + sprintf( + 'index.php?sec=%s&sec2=godmode/users/user_list&disable_user=%s&pure=%s&id=%s', + $sec, + $toDoAction, + $pure, + $user_info['id_user'] + ) + ), + 'image' => $toDoImage, + 'title' => $toDoString, + ], + true + ); + /* + $data[6] = ''; + $data[6] .= html_print_input_hidden( 'id', $user_info['id_user'], true - ); - $data[6] .= html_print_input_hidden( + ); + $data[6] .= html_print_input_hidden( 'disable_user', $toDoAction, true - ); - $data[6] .= html_print_input_image( + ); + $data[6] .= html_print_input_image( 'submit_disable_enable', $toDoImage, '', @@ -828,66 +858,101 @@ foreach ($info as $user_id => $user_info) { [ 'data-title' => $toDoString, 'data-use_title_for_force_title' => '1', - 'class' => 'forced_title no-padding '.$toDoClass, + 'class' => 'main_menu_icon forced_title no-padding '.$toDoClass, ] - ); - $data[6] .= '
    '; + ); + $data[6] .= ''; + */ } - // Edit user. - $data[6] .= '
    '; - $data[6] .= html_print_input_hidden( + /* + // Edit user. + $data[6] .= ''; + $data[6] .= html_print_input_hidden( 'id_user', $user_info['id_user'], true - ); - $data[6] .= html_print_input_hidden( + ); + $data[6] .= html_print_input_hidden( 'edit_user', '1', true - ); - $data[6] .= html_print_input_image( + ); + $data[6] .= html_print_input_image( 'submit_edit_user', - 'images/config.png', + 'images/edit.svg', '', 'padding:0', true, [ 'data-title' => __('Edit'), 'data-use_title_for_force_title' => '1', - 'class' => 'forced_title no-padding', + 'class' => 'main_menu_icon forced_title no-padding', ] + ); + $data[6] .= '
    ';*/ + + $userListActionButtons[] = html_print_menu_button( + [ + 'href' => ui_get_full_url( + sprintf( + 'index.php?sec=%s&sec2=godmode/users/configure_user&edit_user=1&pure=%s&id_user=%s', + $sec, + $pure, + $user_info['id_user'] + ) + ), + 'image' => 'images/edit.svg', + 'title' => __('Edit user'), + ], + true ); - $data[6] .= ''; if ($config['admin_can_delete_user'] && $user_info['id_user'] != $config['id_user'] && isset($user_info['not_delete']) === false ) { - $data[6] .= '
    '; - $data[6] .= html_print_input_hidden( + /* + $data[6] .= ''; + $data[6] .= html_print_input_hidden( 'delete_user', $user_info['id_user'], true - ); - $data[6] .= html_print_input_hidden( + ); + $data[6] .= html_print_input_hidden( 'user_del', '1', true - ); - $data[6] .= html_print_input_image( + ); + $data[6] .= html_print_input_image( 'submit_delete_user', - 'images/cross.png', + 'images/delete.svg', '', 'padding:0', true, [ 'data-title' => __('Delete'), 'data-use_title_for_force_title' => '1', - 'class' => 'forced_title no-padding', + 'class' => 'main_menu_icon forced_title no-padding', ] + ); + $data[6] .= '
    '; + */ + $userListActionButtons[] = html_print_menu_button( + [ + 'href' => ui_get_full_url( + sprintf( + 'index.php?sec=%s&sec2=godmode/users/user_list&user_del=1&pure=%s&delete_user=%s', + $sec, + $pure, + $user_info['id_user'] + ) + ), + 'image' => 'images/delete.svg', + 'title' => __('Delete'), + ], + true ); - $data[6] .= ''; if (is_metaconsole() === true) { $data[6] .= '
    '; @@ -907,11 +972,16 @@ foreach ($info as $user_id => $user_info) { true ); $data[6] .= '
    '; + } else { + $data[6] = implode('', $userListActionButtons); } } else { $data[6] .= ''; // Delete button not in this mode. } + + // TODO. Check this in META!!! + $data[6] = implode('', $userListActionButtons); } else { $data[6] .= ''; // Delete button not in this mode. @@ -922,24 +992,27 @@ foreach ($info as $user_id => $user_info) { } html_print_table($table); -ui_pagination(count($info), false, 0, 0, false, 'offset', true, 'pagination-bottom'); - -echo '
    '; unset($table); if ($is_management_allowed === true) { if ($config['admin_can_add_user'] !== false) { echo '
    '; + html_print_action_buttons( + html_print_submit_button( + __('Create user'), + 'crt', + false, + [ 'icon' => 'wand' ], + true + ), + ['type' => 'form_action'], + ); html_print_input_hidden('new_user', 1); - html_print_submit_button(__('Create user'), 'crt', false, 'class="sub next"'); echo '
    '; } else { echo ''.__("The current authentication scheme doesn't support creating users on %s", get_product_name()).''; } } - -echo '
    '; - enterprise_hook('close_meta_frame'); ?> diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index feab991df6..c729655e8f 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -3950,7 +3950,7 @@ function html_print_table(&$table, $return=false) } $output .= ''."\n"; - + hd($output, true); if ($return) { return $output; } diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 4f61b95064..a85fd6c322 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -4302,8 +4302,8 @@ span.log_zone_line_error { width: 50%; } -.rowPair:hover, -.rowOdd:hover { +tr.rowPair:hover, +tr.rowOdd:hover { background-color: #eee; } @@ -10769,6 +10769,7 @@ pre.external_tools_output { .fixed_filter_bar { position: sticky; top: 114px; + margin-bottom: 10px; border: 1px solid #e5e9ed; background-color: #fff; z-index: 1; From b88f26500b66ac5b2752865ef8a2994535de4bf7 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Tue, 31 Jan 2023 08:35:47 +0100 Subject: [PATCH 127/474] #9819 Change labels Accoustic console --- pandora_console/godmode/menu.php | 4 ++-- pandora_console/include/class/EventSound.class.php | 6 +++--- pandora_console/operation/events/events.php | 6 +++--- pandora_console/operation/events/sound_events.php | 4 ++-- pandora_console/operation/menu.php | 8 ++++---- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/pandora_console/godmode/menu.php b/pandora_console/godmode/menu.php index 9dc13b6abb..d4f903290e 100644 --- a/pandora_console/godmode/menu.php +++ b/pandora_console/godmode/menu.php @@ -435,8 +435,8 @@ if ((bool) check_acl($config['id_user'], 0, 'PM') === true || (bool) check_acl($ } } - $sub['godmode/events/configuration_sounds']['text'] = __('Configuration Sounds'); - $sub['godmode/events/configuration_sounds']['id'] = 'Configuration Sounds'; + $sub['godmode/events/configuration_sounds']['text'] = __('Accoustic console setup'); + $sub['godmode/events/configuration_sounds']['id'] = 'Accoustic console setup'; $sub['godmode/events/configuration_sounds']['pages'] = ['godmode/events/configuration_sounds']; $menu_godmode['gextensions']['sub'] = $sub; diff --git a/pandora_console/include/class/EventSound.class.php b/pandora_console/include/class/EventSound.class.php index 93f42ec7c4..b943e9cce1 100644 --- a/pandora_console/include/class/EventSound.class.php +++ b/pandora_console/include/class/EventSound.class.php @@ -209,7 +209,7 @@ class EventSound extends HTML $titleHeader = __('Add new sound'); } else { $helpHeader = 'servers_ha_clusters_tab'; - $titleHeader = __('Events sound list'); + $titleHeader = __('Accoustic console sound list'); } // Header. @@ -223,11 +223,11 @@ class EventSound extends HTML [ [ 'link' => '', - 'label' => __('Events'), + 'label' => __('Admin tools'), ], [ 'link' => '', - 'label' => __('Configuration Sounds'), + 'label' => __('Accoustic console setup'), ], ] ); diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index 648581a3a6..eb885bf479 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -1473,13 +1473,13 @@ if ($pure) { ] ).'
    '; - // Sound events. + // Accoustic console. $sound_event['active'] = false; $sound_event['text'] = ''.html_print_image( 'images/sound.png', true, [ - 'title' => __('Sound events'), + 'title' => __('Accoustic console'), 'class' => 'invert_filter', ] ).''; @@ -1529,7 +1529,7 @@ if ($pure) { switch ($section) { case 'sound_event': $onheader['sound_event']['active'] = true; - $section_string = __('Sound events'); + $section_string = __('Accoustic console'); break; case 'history': diff --git a/pandora_console/operation/events/sound_events.php b/pandora_console/operation/events/sound_events.php index 2f2b11e065..6ce7a31c3a 100644 --- a/pandora_console/operation/events/sound_events.php +++ b/pandora_console/operation/events/sound_events.php @@ -60,7 +60,7 @@ ob_start(); echo ''; echo ''; -echo ''.__('Sound Events').''; +echo ''.__('Accoustic console').''; ui_require_css_file('wizard'); ui_require_css_file('discovery'); ?> @@ -161,7 +161,7 @@ if ($config['style'] === 'pandora_black' && !is_metaconsole()) { echo ''; echo ""; -echo "

    ".__('Sound console').'

    '; +echo "

    ".__('Accoustic console').'

    '; // Connection lost alert. ui_require_css_file('register', 'include/styles/', true); diff --git a/pandora_console/operation/menu.php b/pandora_console/operation/menu.php index c777e1d97b..eed84a4d48 100644 --- a/pandora_console/operation/menu.php +++ b/pandora_console/operation/menu.php @@ -432,11 +432,11 @@ if ($access_console_node === true) { $sub['operation/events/events_rss.php?user='.$config['id_user'].'&hashup='.$hashup.'&fb64='.$fb64]['type'] = 'direct'; } - // Sound Events. + // Accoustic console. $data_sound = base64_encode( json_encode( [ - 'title' => __('Sound Console'), + 'title' => __('Accoustic console'), 'start' => __('Start'), 'stop' => __('Stop'), 'noAlert' => __('No alert'), @@ -449,8 +449,8 @@ if ($access_console_node === true) { ); $javascript = 'javascript: openSoundEventModal(`'.$data_sound.'`);'; - $sub[$javascript]['text'] = __('Sound Events'); - $sub[$javascript]['id'] = 'Sound Events Modal'; + $sub[$javascript]['text'] = __('Accoustic console'); + $sub[$javascript]['id'] = 'Accoustic console Modal'; $sub[$javascript]['type'] = 'direct'; echo ''; From c8b1d22c5d28b035c90f8bc9df34434539172a3e Mon Sep 17 00:00:00 2001 From: alejandro Date: Tue, 31 Jan 2023 10:23:42 +0100 Subject: [PATCH 128/474] change parameter --creds_Base64 --- pandora_plugins/google_sheets/pandora_googlesheet.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/pandora_plugins/google_sheets/pandora_googlesheet.py b/pandora_plugins/google_sheets/pandora_googlesheet.py index d02fc4cd3b..bfa346aa40 100644 --- a/pandora_plugins/google_sheets/pandora_googlesheet.py +++ b/pandora_plugins/google_sheets/pandora_googlesheet.py @@ -21,7 +21,7 @@ Version = {__version__} Manual execution -python3 pandora_googlesheets.py --creds_json/creds_base64 --row --column +python3 pandora_googlesheets.py --creds_json/creds_base64 --name --sheet --cell --row --column """ @@ -47,9 +47,7 @@ if args.creds_json is not None and args.creds_base64 == None: ## authenticate with base64 input elif args.creds_base64 is not None and args.creds_json== None: ## base64 to json - with open(args.creds_base64, 'r') as file: - data = file.read().replace('\n', '') - text=base64.b64decode(data).decode('utf-8') + text=base64.b64decode(args.creds_base64).decode('utf-8') with open("cred.json", "w") as outfile: outfile.write(text) creds = ServiceAccountCredentials.from_json_keyfile_name("cred.json", scope) From d49f1320f53474739a82e711fa07c04fe36a0385 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Tue, 31 Jan 2023 12:37:55 +0100 Subject: [PATCH 129/474] #10127 added param 'id_node' in set_validate_events for update from metaconsole --- pandora_console/include/functions_api.php | 47 ++++++++++++++++++++--- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/pandora_console/include/functions_api.php b/pandora_console/include/functions_api.php index 89e764aaaa..11149e86f8 100644 --- a/pandora_console/include/functions_api.php +++ b/pandora_console/include/functions_api.php @@ -11061,20 +11061,55 @@ function api_set_event_validate_filter($trash1, $trash2, $other, $trash3) function api_set_validate_events($id_event, $trash1, $other, $return_type, $user_in_db) { - $text = $other['data']; + $node_int = 0; + if ($other['type'] == 'string') { + returnError('Parameter error.'); + return; + } else if ($other['type'] == 'array') { + $text = $other['data'][0]; + if (is_metaconsole() === true) { + if (isset($other['data'][1]) === true + && empty($other['data'][1]) === false + ) { + $node_int = $other['data'][1]; + } + } + } - // Set off the standby mode when close an event - $event = events_get_event($id_event); - alerts_agent_module_standby($event['id_alert_am'], 0); + try { + if (is_metaconsole() === true + && (int) $node_int > 0 + ) { + $node = new Node($node_int); + $node->connect(); + } - $result = events_change_status($id_event, EVENT_VALIDATE); + // Set off the standby mode when close an event + $event = events_get_event($id_event); + alerts_agent_module_standby($event['id_alert_am'], 0); + $result = events_change_status($id_event, EVENT_VALIDATE); - if ($result) { if (!empty($text)) { // Set the comment for the validation events_comment($id_event, $text); } + } catch (\Exception $e) { + if (is_metaconsole() === true + && $node_int > 0 + ) { + $node->disconnect(); + } + $result = false; + } finally { + if (is_metaconsole() === true + && $node_int > 0 + ) { + $node->disconnect(); + } + } + + if ($result) { returnData( 'string', [ From fbdd91e4fff4997b05b74cc7c33c4a85dad3a869 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Tue, 31 Jan 2023 12:59:49 +0100 Subject: [PATCH 130/474] Improve user profile list view --- .../godmode/users/profile_list.php | 53 ++++++++++++------- 1 file changed, 35 insertions(+), 18 deletions(-) diff --git a/pandora_console/godmode/users/profile_list.php b/pandora_console/godmode/users/profile_list.php index f2094c87c3..c06e78f3aa 100644 --- a/pandora_console/godmode/users/profile_list.php +++ b/pandora_console/godmode/users/profile_list.php @@ -323,8 +323,8 @@ if ($is_management_allowed === true && $create_profile === true) { $table = new stdClass(); $table->cellpadding = 0; $table->cellspacing = 0; +$table->styleTable = 'margin: 10px'; $table->class = 'info_table profile_list'; -$table->width = '100%'; $table->head = []; $table->data = []; @@ -362,7 +362,7 @@ if ($is_management_allowed === true) { $table->align = array_fill(1, 11, 'center'); -$table->size['profiles'] = '200px'; +$table->size['profiles'] = '150px'; $table->size['AR'] = '10px'; $table->size['AW'] = '10px'; $table->size['AD'] = '10px'; @@ -387,7 +387,7 @@ $table->size['NW'] = '10px'; $table->size['NM'] = '10px'; $table->size['PM'] = '10px'; if ($is_management_allowed === true) { - $table->size['operations'] = '5%'; + $table->size['operations'] = '6%'; } $profiles = db_get_all_rows_in_table('tperfil'); @@ -396,11 +396,11 @@ if ($profiles === false) { } $img = html_print_image( - 'images/ok.png', + 'images/validate.svg', true, [ 'border' => 0, - 'class' => 'invert_filter', + 'class' => 'main_menu_icon', ] ); @@ -439,22 +439,29 @@ foreach ($profiles as $profile) { $table->cellclass[]['operations'] = 'table_action_buttons'; if ($is_management_allowed === true) { $data['operations'] = ''.html_print_image( - 'images/config.png', + 'images/edit.svg', true, [ 'title' => __('Edit'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon', ] ).''; - if (check_acl($config['id_user'], 0, 'PM') || users_is_admin()) { - $data['operations'] .= ''.html_print_image( - 'images/cross.png', - true, + if ((bool) check_acl($config['id_user'], 0, 'PM') === true || (bool) users_is_admin() === true) { + $data['operations'] .= html_print_anchor( [ - 'title' => __('Delete'), - 'class' => 'invert_filter', - ] - ).''; + 'href' => 'index.php?sec='.$sec.'&sec2=godmode/users/profile_list&delete_profile=1&id='.$profile['id_perfil'].'&pure='.$pure, + 'onClick' => 'if (!confirm(\' '.__('Are you sure?').'\')) return false;', + 'content' => html_print_image( + 'images/delete.svg', + true, + [ + 'title' => __('Delete'), + 'class' => 'main_menu_icon', + ] + ), + ], + true + ); } } @@ -469,10 +476,20 @@ if (isset($data) === true) { if ($is_management_allowed === true) { echo '
    '; - echo '
    '; html_print_input_hidden('new_profile', 1); - html_print_submit_button(__('Create'), 'crt', false, 'class="sub next"'); - echo '
    '; + html_print_action_buttons( + html_print_submit_button( + __('Create profile'), + 'crt', + false, + [ 'icon' => 'next' ], + true + ), + [ + 'type' => 'data_table', + 'class' => 'fixed_action_buttons', + ] + ); echo '
    '; } From 407ce7baa0156ee15ab18dbbd743a1330200ffe6 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Tue, 31 Jan 2023 13:33:02 +0100 Subject: [PATCH 131/474] #9003 changed command center name to Merging tool --- pandora_console/general/node_deactivated.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/general/node_deactivated.php b/pandora_console/general/node_deactivated.php index c88f4f599e..ae0e3b8f24 100644 --- a/pandora_console/general/node_deactivated.php +++ b/pandora_console/general/node_deactivated.php @@ -56,7 +56,7 @@ ui_require_css_file('maintenance'); 'Please navigate to %s to unify system', ''.__('command center').'' + ).'" target="_new">'.__('merging tool').'' ); ?>

    From dcc5f76166b6d7b764d49d47150f60819996f83c Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Wed, 1 Feb 2023 09:45:10 +0100 Subject: [PATCH 132/474] #9663 menu redesing 2 --- pandora_console/include/styles/menu2.css | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/pandora_console/include/styles/menu2.css b/pandora_console/include/styles/menu2.css index c5661f3ed2..88c4a7fb3f 100644 --- a/pandora_console/include/styles/menu2.css +++ b/pandora_console/include/styles/menu2.css @@ -31,7 +31,7 @@ .operation .menu_icon ul.submenu > li, .godmode .menu_icon ul.submenu > li { background-color: #f6f7fb; - padding-left: 1.5em; + padding-left: 3.5em !important; } .menu ul { @@ -77,7 +77,7 @@ .submenu2 { /* position: absolute; */ z-index: 999; - width: 262px; + width: 238px; } .sub_subMenu { @@ -115,24 +115,8 @@ .submenu_selected { margin-bottom: 0px; - box-shadow: inset 4px 0 #82b92e; - /* color: #1D7874 !important; - font-weight: bold; */ } -/* .selected.submenu_selected { - background-color: #202020; -} - -li.submenu_selected.selected { - background-color: #202020; - font-weight: 600; -} - -li.sub_subMenu.selected { - background-color: #161616; -} */ - .menu .menu_icon, .menu li.links { background-repeat: no-repeat; From f476538170d3d0f52cb66aadbdb8570b80ee5d8c Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 1 Feb 2023 10:27:11 +0100 Subject: [PATCH 133/474] #10282 disable button edit trap in open version --- pandora_console/include/class/SnmpConsole.class.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/class/SnmpConsole.class.php b/pandora_console/include/class/SnmpConsole.class.php index 9aae307bc5..843973152a 100644 --- a/pandora_console/include/class/SnmpConsole.class.php +++ b/pandora_console/include/class/SnmpConsole.class.php @@ -926,7 +926,10 @@ class SnmpConsole extends HTML 'class' => 'invert_filter', ] ).''; - $tmp->action .= ''.html_print_image('images/edit.png', true, ['alt' => __('SNMP trap editor'), 'title' => __('SNMP trap editor')]).''; + + if ($config['enterprise_installed']) { + $tmp->action .= ''.html_print_image('images/edit.png', true, ['alt' => __('SNMP trap editor'), 'title' => __('SNMP trap editor')]).''; + } $tmp->m = html_print_checkbox_extended('snmptrapid[]', $tmp->id_trap, false, false, '', 'class="chk"', true); From 2b9f7f9b09a3b76310c1bc30a0fa7a5c6458cb99 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 1 Feb 2023 10:47:36 +0100 Subject: [PATCH 134/474] #10267 limit entries in events list --- pandora_console/operation/events/events.php | 4 ---- 1 file changed, 4 deletions(-) diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index 18c928727a..ba27a38a6e 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -2413,8 +2413,6 @@ try { 100, 200, 500, - 1000, - -1, ], [ $config['block_size'], @@ -2423,8 +2421,6 @@ try { 100, 200, 500, - 1000, - 'All', ], ], 'order' => [ From 11e04e2f6ad577a39b8e5305375b938a87f672d9 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 1 Feb 2023 11:16:24 +0100 Subject: [PATCH 135/474] #10234 fixed js added when file download --- pandora_console/include/get_file.php | 1 + 1 file changed, 1 insertion(+) diff --git a/pandora_console/include/get_file.php b/pandora_console/include/get_file.php index f312340df5..8c9d849ea9 100644 --- a/pandora_console/include/get_file.php +++ b/pandora_console/include/get_file.php @@ -97,6 +97,7 @@ if (empty($file) === true || empty($hash) === true || $hash !== md5($file_raw.$c header('Content-Length: '.filesize($downloadable_file)); header('Content-Disposition: attachment; filename="'.basename($downloadable_file).'"'); readfile($downloadable_file); + return; } } From 2c8c1d45931e0e15d1ef1dfd002054365dfdaf18 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Wed, 1 Feb 2023 15:14:32 +0100 Subject: [PATCH 136/474] Minor fixes and improvements --- .../include/functions_treeview.php | 313 ++++++++---------- pandora_console/include/styles/tree.css | 2 + .../agentes/estado_generalagente.php | 9 +- .../operation/agentes/estado_monitores.php | 24 -- 4 files changed, 148 insertions(+), 200 deletions(-) diff --git a/pandora_console/include/functions_treeview.php b/pandora_console/include/functions_treeview.php index bf0874f407..153cca45e5 100755 --- a/pandora_console/include/functions_treeview.php +++ b/pandora_console/include/functions_treeview.php @@ -67,23 +67,16 @@ function treeview_printModuleTable($id_module, $server_data=false, $no_head=fals $row = []; $row['title'] = __('Name'); - $row['data'] = $cellName; - $table->data['name'] = $row; - - // Edit module button. - $row = []; - $row['title'] = html_print_button( - __('Edit module'), - 'edit_module_link', - false, - 'window.location.assign(\''.$console_url.'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente='.$module['id_agente'].'&tab=module&edit_module=1&id_agent_module='.$module['id_agente_modulo'].$url_hash.'\')', + $row['data'] = html_print_anchor( [ - 'mode' => 'link', - 'style' => 'float: right;justify-content: end;padding: 0;', + 'href' => $console_url.'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente='.$module['id_agente'].'&tab=module&edit_module=1&id_agent_module='.$module['id_agente_modulo'].$url_hash, + 'title' => __('Click here for view this module'), + 'class' => 'font_11', + 'content' => $cellName, ], true ); - $table->data['edit_button'] = $row; + $table->data['name'] = $row; // Interval. $row = []; @@ -601,26 +594,20 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $cellName .= ui_print_help_tip(__('Disabled'), true).'
    '; } + // Agent name. $row = []; $row['title'] = __('Agent name'); - $row['data'] = $cellName; - $table->data['name'] = $row; - - // Edit agent button. - $row = []; - $row['title'] = html_print_button( - __('Edit agent'), - 'edit_agent_link', - false, - $urlAgent, + $row['data'] = html_print_anchor( [ - 'mode' => 'link', - 'style' => 'float: right;justify-content: end;padding: 0;', + 'href' => $urlAgent, + 'title' => __('Click here for view this agent'), + 'class' => 'font_11', + 'content' => $cellName, ], true ); - $row['data'] = ''; - $table->data['edit_button'] = $row; + + $table->data['name'] = $row; // Addresses. $ips = []; @@ -699,134 +686,41 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) ); $table->data['next_contact'] = $row; - // End of table. - $agent_table = html_print_table($table, true); - /* - if ($user_access_node && check_acl($config['id_user'], $agent['id_grupo'], 'AW')) { - $go_to_agent = ''; - - $agent_table .= $go_to_agent; - } - */ // Title. echo ''; // Print agent data toggle. - echo $agent_table; + html_print_table($table); - // Advanced data. - $table = new StdClass(); - $table->width = '100%'; - $table->class = 'floating_form'; - $table->id = 'tree_view_agent_advanced'; - $table->style = []; - $table->style['title'] = 'height: 32px; width: 30%; padding-right: 5px; text-align: end;'; - $table->style['data'] = 'height: 32px; width: 70%; padding-left: 5px; font-family: \'Pandora-Regular\';'; - $table->head = []; - $table->data = []; + // Events graph toggle. + $eventsGraph = html_print_div( + [ + 'class' => 'graphic_agents', + 'content' => graph_graphic_agentevents( + $id_agente, + '500px;', + '100px', + SECONDS_1DAY, + '', + true, + false, + 550, + 1, + $server_id + ), + ], + true + ); - // Agent version. - $row = []; - $row['title'] = __('Agent Version'); - $row['data'] = $agent['agent_version']; - $table->data['agent_version'] = $row; - - // Position Information. - if ($config['activate_gis']) { - $dataPositionAgent = gis_get_data_last_position_agent($agent['id_agente']); - - if ($dataPositionAgent !== false) { - if (empty($dataPositionAgent['description']) === false) { - $positionContent .= $dataPositionAgent['description']; - } else { - $positionContent .= $dataPositionAgent['stored_longitude'].', '.$dataPositionAgent['stored_latitude']; - } - - $position = html_print_anchor( - [ - 'href' => $console_url.'index.php?sec=estado&sec2=operation/agentes/ver_agente&tab=gis&id_agente='.$id_agente, - 'content' => $positionContent, - ], - true - ); - - $row = []; - $row['title'] = __('Position (Long, Lat)'); - $row['data'] = $position; - $table->data['agent_position'] = $row; - } - } - - // If the url description is setted. - if (empty($agent['url_address']) === false) { - $row = []; - $row['title'] = __('Url address'); - $row['data'] = html_print_anchor( - [ - 'href' => $agent['url_address'], - 'content' => $agent['url_address'], - ], - true - ); - $table->data['agent_address'] = $row; - } - - // Timezone Offset. - if ($agent['timezone_offset'] != 0) { - $row = []; - $row['title'] = __('Timezone Offset'); - $row['data'] = $agent['timezone_offset']; - $table->data['agent_timezone_offset'] = $row; - } - - // Custom fields - $fields = db_get_all_rows_filter('tagent_custom_fields', ['display_on_front' => 1]); - if ($fields === false) { - $fields = []; - } - - if ($fields) { - foreach ($fields as $field) { - $custom_value = db_get_value_filter('description', 'tagent_custom_data', ['id_field' => $field['id_field'], 'id_agent' => $id_agente]); - if (!empty($custom_value)) { - $row = []; - $row['title'] = $field['name'].ui_print_help_tip(__('Custom field'), true); - if ($field['is_password_type']) { - $row['data'] = '••••••••'; - } else { - $row['data'] = ui_bbcode_to_html($custom_value); - } - - $table->data['custom_field_'.$field['id_field']] = $row; - } - } - } - - // End of table advanced. - $table_advanced = html_print_table($table, true); ui_toggle( - $table_advanced, - ''.__('Advanced information').'', + $eventsGraph, + ''.__('Events (24h)').'', '', '', - true, + false, false, '', - 'white-box-content border-bottom-gray', - 'white_table_graph margin-top-10 margin-bottom-10' + 'white-box-content', + 'white_table_graph margin-bottom-10 border-bottom-gray' ); if ($config['agentaccess']) { @@ -850,32 +744,6 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) ); } - $events_graph = '
    '; - $events_graph .= graph_graphic_agentevents( - $id_agente, - '340px;margin:0', - '60px', - SECONDS_1DAY, - '', - true, - false, - 550, - 1, - $server_id - ); - $events_graph .= '

    '; - ui_toggle( - $events_graph, - ''.__('Events (24h)').'', - '', - '', - true, - false, - '', - 'white-box-content', - 'white_table_graph margin-bottom-10 border-bottom-gray' - ); - // Table network interfaces. $network_interfaces_by_agents = agents_get_network_interfaces([$agent]); @@ -947,7 +815,108 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) ui_toggle($table_interfaces, __('Interface information').' (SNMP)'); } - if (!empty($server_data) && is_metaconsole()) { + // Advanced data. + $table_advanced = new StdClass(); + $table_advanced->width = '100%'; + $table_advanced->class = 'floating_form'; + $table_advanced->id = 'tree_view_agent_advanced'; + $table_advanced->style = []; + $table_advanced->style['title'] = 'height: 32px; width: 30%; padding-right: 5px; text-align: end;'; + $table_advanced->style['data'] = 'height: 32px; width: 70%; padding-left: 5px; font-family: \'Pandora-Regular\';'; + $table_advanced->head = []; + $table_advanced->data = []; + + // Agent version. + $row = []; + $row['title'] = __('Agent Version'); + $row['data'] = $agent['agent_version']; + $table_advanced->data['agent_version'] = $row; + + // Position Information. + if ($config['activate_gis']) { + $dataPositionAgent = gis_get_data_last_position_agent($agent['id_agente']); + + if ($dataPositionAgent !== false) { + if (empty($dataPositionAgent['description']) === false) { + $positionContent .= $dataPositionAgent['description']; + } else { + $positionContent .= $dataPositionAgent['stored_longitude'].', '.$dataPositionAgent['stored_latitude']; + } + + $position = html_print_anchor( + [ + 'href' => $console_url.'index.php?sec=estado&sec2=operation/agentes/ver_agente&tab=gis&id_agente='.$id_agente, + 'content' => $positionContent, + ], + true + ); + + $row = []; + $row['title'] = __('Position (Long, Lat)'); + $row['data'] = $position; + $table_advanced->data['agent_position'] = $row; + } + } + + // If the url description is setted. + if (empty($agent['url_address']) === false) { + $row = []; + $row['title'] = __('Url address'); + $row['data'] = html_print_anchor( + [ + 'href' => $agent['url_address'], + 'content' => $agent['url_address'], + ], + true + ); + $table_advanced->data['agent_address'] = $row; + } + + // Timezone Offset. + if ($agent['timezone_offset'] != 0) { + $row = []; + $row['title'] = __('Timezone Offset'); + $row['data'] = $agent['timezone_offset']; + $table_advanced->data['agent_timezone_offset'] = $row; + } + + // Custom fields. + $fields = db_get_all_rows_filter('tagent_custom_fields', ['display_on_front' => 1]); + if ($fields === false) { + $fields = []; + } + + if ($fields) { + foreach ($fields as $field) { + $custom_value = db_get_value_filter('description', 'tagent_custom_data', ['id_field' => $field['id_field'], 'id_agent' => $id_agente]); + if (empty($custom_value) === false) { + $row = []; + $row['title'] = $field['name'].ui_print_help_tip(__('Custom field'), true); + if ($field['is_password_type']) { + $row['data'] = '••••••••'; + } else { + $row['data'] = ui_bbcode_to_html($custom_value); + } + + $table_advanced->data['custom_field_'.$field['id_field']] = $row; + } + } + } + + // End of table advanced. + ui_toggle( + html_print_table($table_advanced, true), + ''.__('Advanced information').'', + '', + '', + true, + false, + '', + 'white-box-content border-bottom-gray', + 'white_table_graph margin-top-10 margin-bottom-10' + ); + + if (empty($server_data) === false && is_metaconsole() === true) { metaconsole_restore_db(); } diff --git a/pandora_console/include/styles/tree.css b/pandora_console/include/styles/tree.css index edab87260c..54bc3753df 100644 --- a/pandora_console/include/styles/tree.css +++ b/pandora_console/include/styles/tree.css @@ -8,10 +8,12 @@ flex-direction: row; flex-wrap: wrap; align-items: center; + /* width: calc(100% - 24px); border: 1px solid #eaeaea; border-radius: 4px; background-color: #fff; + */ margin-bottom: 8px; } diff --git a/pandora_console/operation/agentes/estado_generalagente.php b/pandora_console/operation/agentes/estado_generalagente.php index e6e8193134..e81839c02d 100755 --- a/pandora_console/operation/agentes/estado_generalagente.php +++ b/pandora_console/operation/agentes/estado_generalagente.php @@ -462,9 +462,9 @@ $data = []; $data[0] = __('Next contact'); $data[1] = ui_progress( $progress, - '97%', - 2.1, - '#BBB', + '80%', + '1.2', + '#ececec', true, $progressCaption, [ @@ -475,7 +475,8 @@ $data[1] = ui_progress( 'refresh_contact' => 1, ], - ] + ], + 'line-height: 13px;' ); $table_contact->data[] = $data; diff --git a/pandora_console/operation/agentes/estado_monitores.php b/pandora_console/operation/agentes/estado_monitores.php index 6d3c710ba7..150aaff728 100755 --- a/pandora_console/operation/agentes/estado_monitores.php +++ b/pandora_console/operation/agentes/estado_monitores.php @@ -521,30 +521,6 @@ function print_form_filter_monitors( AGENT_MODULE_STATUS_UNKNOWN => __('Unknown'), ]; - $table->data[0][1] = html_print_select( - $status_list, - 'status_filter_monitor', - $status_filter_monitor, - '', - '', - 0, - true - ); - - $table->data[0][2] = __('Free text for search (*):').ui_print_help_tip( - __('Search by module name or alert name, list matches.'), - true - ); - - $table->data[0][3] = html_print_input_text( - 'status_text_monitor', - $status_text_monitor, - '', - '', - 100, - true - ); - $table->data[0][4] = __('Module group'); $rows = db_get_all_rows_sql( sprintf( 'SELECT * From bd26aa8f8d6a108acd7c2589f24a3d9f15f5057f Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Wed, 1 Feb 2023 15:31:02 +0100 Subject: [PATCH 137/474] Minor fixes --- .../include/javascript/tree/TreeController.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pandora_console/include/javascript/tree/TreeController.js b/pandora_console/include/javascript/tree/TreeController.js index 3dd22194dc..51c69830cd 100644 --- a/pandora_console/include/javascript/tree/TreeController.js +++ b/pandora_console/include/javascript/tree/TreeController.js @@ -622,7 +622,6 @@ var TreeController = { data: postData, success: function(data, textStatus, xhr) { callback(null, data); - console.log(data); $("#fixed-bottom-box-head-title").html( $("#fixedBottomHeadTitle").html() ); @@ -1281,8 +1280,6 @@ var TreeController = { if (error) { // console.error(error); } else { - console.log(element.name); - console.log("1"); controller.detailRecipient .render(element.name, data) .open(); @@ -1312,14 +1309,15 @@ var TreeController = { // Add children var $children = _processGroup($node, element.children); $node.data("children", $children); - + /* if ( typeof element.searchChildren == "undefined" || !element.searchChildren ) { $leafIcon.click(function(e) { + console.log(e); e.preventDefault(); - + return; if ($node.hasClass("leaf-open")) { $node .removeClass("leaf-open") @@ -1335,6 +1333,7 @@ var TreeController = { } }); } + */ } if ( From e465fb67596758b1c039f34a91f3d70c71574688 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 1 Feb 2023 17:35:56 +0100 Subject: [PATCH 138/474] #9003 changed merging tool for command center in warning --- pandora_console/general/node_deactivated.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/general/node_deactivated.php b/pandora_console/general/node_deactivated.php index ae0e3b8f24..c88f4f599e 100644 --- a/pandora_console/general/node_deactivated.php +++ b/pandora_console/general/node_deactivated.php @@ -56,7 +56,7 @@ ui_require_css_file('maintenance'); 'Please navigate to %s to unify system', ''.__('merging tool').'' + ).'" target="_new">'.__('command center').'' ); ?>

    From 18f2cee2a7698e6b6e4624d72d14400109eea0ce Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Thu, 2 Feb 2023 11:18:47 +0100 Subject: [PATCH 139/474] #10283 fixed filter design in snmp console --- .../include/class/SnmpConsole.class.php | 105 +++++++++--------- pandora_console/include/styles/tables.css | 22 +++- 2 files changed, 74 insertions(+), 53 deletions(-) diff --git a/pandora_console/include/class/SnmpConsole.class.php b/pandora_console/include/class/SnmpConsole.class.php index 9aae307bc5..96553d2ac4 100644 --- a/pandora_console/include/class/SnmpConsole.class.php +++ b/pandora_console/include/class/SnmpConsole.class.php @@ -413,73 +413,74 @@ class SnmpConsole extends HTML 'class' => 'flex-row', 'inputs' => [ [ - 'label' => __('Alert'), - 'type' => 'select', - 'id' => 'filter_alert', - 'name' => 'filter_alert', - 'class' => 'w200px', - 'fields' => $show_alerts, - 'return' => true, - 'selected' => $this->filter_alert, + 'label' => __('Alert'), + 'type' => 'select', + 'id' => 'filter_alert', + 'input_class' => 'filter_input_datatable', + 'name' => 'filter_alert', + 'fields' => $show_alerts, + 'return' => true, + 'selected' => $this->filter_alert, ], [ - 'label' => __('Severity'), - 'type' => 'select', - 'id' => 'filter_severity', - 'name' => 'filter_severity', - 'class' => 'w200px', - 'fields' => $severities, - 'return' => true, - 'selected' => $this->filter_severity, + 'label' => __('Severity'), + 'type' => 'select', + 'id' => 'filter_severity', + 'input_class' => 'filter_input_datatable', + 'name' => 'filter_severity', + 'fields' => $severities, + 'return' => true, + 'selected' => $this->filter_severity, ], [ - 'label' => __('Free search'), - 'type' => 'text', - 'class' => 'w400px', - 'id' => 'filter_free_search', - 'name' => 'filter_free_search', - 'value' => $this->filter_free_search, + 'label' => __('Free search'), + 'type' => 'text', + 'id' => 'filter_free_search', + 'input_class' => 'filter_input_datatable', + 'name' => 'filter_free_search', + 'value' => $this->filter_free_search, ], [ - 'label' => __('Status'), - 'type' => 'select', - 'id' => 'filter_status', - 'name' => 'filter_status', - 'class' => 'w200px', - 'fields' => $status_array, - 'return' => true, - 'selected' => $this->filter_status, + 'label' => __('Status'), + 'type' => 'select', + 'id' => 'filter_status', + 'input_class' => 'filter_input_datatable', + 'name' => 'filter_status', + 'fields' => $status_array, + 'return' => true, + 'selected' => $this->filter_status, ], [ - 'label' => __('Group by Enterprise String/IP'), - 'type' => 'select', - 'name' => 'filter_group_by', - 'selected' => $this->filter_group_by, - 'disabled' => false, - 'return' => true, - 'id' => 'filter_group_by', - 'fields' => [ + 'label' => __('Group by Enterprise String/IP'), + 'type' => 'select', + 'name' => 'filter_group_by', + 'selected' => $this->filter_group_by, + 'disabled' => false, + 'return' => true, + 'id' => 'filter_group_by', + 'input_class' => 'filter_input_datatable', + 'fields' => [ 0 => __('No'), 1 => __('Yes'), ], ], [ - 'label' => __('Max. hours old'), - 'type' => 'text', - 'class' => 'w200px', - 'id' => 'filter_hours_ago', - 'name' => 'filter_hours_ago', - 'value' => $this->filter_hours_ago, + 'label' => __('Max. hours old'), + 'type' => 'text', + 'id' => 'filter_hours_ago', + 'input_class' => 'filter_input_datatable', + 'name' => 'filter_hours_ago', + 'value' => $this->filter_hours_ago, ], [ - 'label' => __('Trap type'), - 'type' => 'select', - 'id' => 'filter_trap_type', - 'name' => 'filter_trap_type', - 'class' => 'w200px', - 'fields' => $trap_types, - 'return' => true, - 'selected' => $this->filter_trap_type, + 'label' => __('Trap type'), + 'type' => 'select', + 'id' => 'filter_trap_type', + 'input_class' => 'filter_input_datatable', + 'name' => 'filter_trap_type', + 'fields' => $trap_types, + 'return' => true, + 'selected' => $this->filter_trap_type, ], ], ], diff --git a/pandora_console/include/styles/tables.css b/pandora_console/include/styles/tables.css index 40ecaf11ba..fca924b6e0 100644 --- a/pandora_console/include/styles/tables.css +++ b/pandora_console/include/styles/tables.css @@ -323,6 +323,25 @@ a.pandora_pagination.current:hover { cursor: default; } +.filter_input_datatable { + width: 45% !important; + display: flex; + flex-wrap: nowrap; + flex-direction: row; + max-width: 450px; + min-width: 400px; +} +.filter_input_datatable input { + flex: 1; +} +.filter_input_datatable label { + width: 93px; + max-width: 100%; +} +.filter_input_datatable .select2.select2-container { + flex: 1; +} + /* Default datatable filter style */ .datatable_filter.content { display: flex; @@ -336,7 +355,8 @@ a.pandora_pagination.current:hover { } .datatable_filter.content li { flex: 1 1 auto; - margin: 1em auto; + margin: 1em 0; + padding: 0px 10px; } .sorting_desc { background: url(../../images/sort_down_green.png) no-repeat; From c9ea46e219f58da0df3eacbec1b89933add280f0 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Thu, 2 Feb 2023 11:25:59 +0100 Subject: [PATCH 140/474] #10283 align left input only in datatable_filter --- pandora_console/include/styles/tables.css | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/styles/tables.css b/pandora_console/include/styles/tables.css index fca924b6e0..30592ed6db 100644 --- a/pandora_console/include/styles/tables.css +++ b/pandora_console/include/styles/tables.css @@ -341,7 +341,9 @@ a.pandora_pagination.current:hover { .filter_input_datatable .select2.select2-container { flex: 1; } - +.datatable_filter.content li.filter_input_datatable { + margin: 1em 0; +} /* Default datatable filter style */ .datatable_filter.content { display: flex; @@ -355,7 +357,7 @@ a.pandora_pagination.current:hover { } .datatable_filter.content li { flex: 1 1 auto; - margin: 1em 0; + margin: 1em auto; padding: 0px 10px; } .sorting_desc { From 1437c5a0e708e4c563dc5feccab87e8425752ff6 Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Thu, 2 Feb 2023 13:28:48 +0100 Subject: [PATCH 141/474] #9663 menu redesing 3 --- pandora_console/general/new_main_menu.php | 45 +++++++++----- pandora_console/include/functions_menu.php | 3 + pandora_console/include/styles/menu2.css | 70 ++++++++++++++++++---- pandora_console/include/styles/pandora.css | 1 - 4 files changed, 92 insertions(+), 27 deletions(-) diff --git a/pandora_console/general/new_main_menu.php b/pandora_console/general/new_main_menu.php index b60fa1fd0f..f41c42a77e 100644 --- a/pandora_console/general/new_main_menu.php +++ b/pandora_console/general/new_main_menu.php @@ -77,7 +77,7 @@ echo '
    '; require 'operation/menu.php'; echo '
    '; -echo ''; $('#div_management').css('display', 'block'); }) + const id_selected = ''; + if (id_selected != '') { + $(`ul#subicon_${id_selected}`).show(); + // Arrow. + $(`#icon_${id_selected}`).children().first().children().last().removeClass('arrow_menu_down'); + $(`#icon_${id_selected}`).children().first().children().last().addClass('arrow_menu_up'); + // Span. + $(`#icon_${id_selected}`).children().first().children().eq(1).addClass('span_selected'); + } + var click_display = ""; $('.title_menu_classic').click(function() { - if (typeof(table_hover) != 'undefined') { - $("ul#sub" + table_hover[0].id).hide(); + const table_hover = $(this).parent(); + const id = table_hover[0].id; + const classes = $(`#${id}`).attr('class'); + + if (classes.includes('selected') === true) { + $(`#${id}`).removeClass('selected'); + $(`ul#sub${id}`).hide(); // Arrow. table_hover.children().first().children().last().removeClass('arrow_menu_up'); table_hover.children().first().children().last().addClass('arrow_menu_down'); // Span. table_hover.children().first().children().eq(1).removeClass('span_selected'); - if (table_hover[0].id == $(this).parent()[0].id) { - table_hover = undefined; - return; - } + } else { + $(`#${id}`).addClass('selected'); + $(`ul#sub${id}`).show(); + // Arrow. + $(this).children().last().removeClass('arrow_menu_down'); + $(this).children().last().addClass('arrow_menu_up'); + // Span. + $(this).children().eq(1).addClass('span_selected'); } - - table_hover = $(this).parent(); - handsIn = 1; - $("ul#sub" + table_hover[0].id).show(); - // Arrow. - $(this).children().last().removeClass('arrow_menu_down'); - $(this).children().last().addClass('arrow_menu_up'); - // Span. - $(this).children().eq(1).addClass('span_selected'); }); $('.has_submenu').click(function() { if (typeof(table_hover2) != 'undefined') { + $(`#${table_hover2[0].id}`).css("background-color", ""); $("#sub" + table_hover2[0].id).hide(); // Arrow. table_hover2.children().first().children().last().removeClass('arrow_menu_up'); @@ -150,6 +161,8 @@ echo '
    '; table_hover2 = $(this); handsIn2 = 1; + + $(`#${table_hover2[0].id}`).css("background-color", "#eff2f2"); $("#sub" + table_hover2[0].id).show(); // Arrow. table_hover2.children().first().children().last().removeClass('arrow_menu_down'); diff --git a/pandora_console/include/functions_menu.php b/pandora_console/include/functions_menu.php index 3f882916b2..47e55624e6 100644 --- a/pandora_console/include/functions_menu.php +++ b/pandora_console/include/functions_menu.php @@ -48,6 +48,8 @@ function menu_print_menu(&$menu) global $config; global $menuTypeClass; global $tab_active; + global $menu1_selected; + global $menu2_selected; static $idcounter = 0; echo '
    '.$comments.'
    '; -html_print_div( - [ - 'class' => 'user_edit_third_row white_box', - 'content' => html_print_div( - [ - 'class' => 'edit_user_allowed_ip', - 'content' => $allowedIP, - ], - true - ), - ] -); - if (!empty($ehorus)) { echo '
    '.$ehorus.'
    '; } echo ''; -echo '
    '; if ($config['admin_can_add_user']) { html_print_csrf_hidden(); - if ($new_user) { - html_print_input_hidden('create_user', 1); - } else { - html_print_input_hidden('update_user', 1); - } + html_print_input_hidden((($new_user === true) ? 'create_user' : 'update_user'), 1); } echo '
    '; @@ -1857,40 +1840,38 @@ if ($new_user === true) { echo ''; -if ($is_err === true && $new_user === true) { - profile_print_profile_table($id, io_safe_output($json_profile), false, true); -} else { - profile_print_profile_table($id, io_safe_output($json_profile)); -} +$actionButtons = []; -echo '
    '; - -echo '
    '; -if ($config['admin_can_add_user']) { - if ($new_user) { - html_print_submit_button( - __('Create'), - 'crtbutton', - false, - [ - 'icon' => 'wand', - 'form' => 'user_profile_form', - ] - ); +if ((bool) $config['admin_can_add_user'] === true) { + if ($new_user === true) { + $submitButtonCaption = __('Create'); + $submitButtonName = 'crtbutton'; + $submitButtonIcon = 'wand'; } else { - html_print_submit_button( - __('Update'), - 'uptbutton', - false, - [ - 'icon' => 'update', - 'form' => 'user_profile_form', - ] - ); + $submitButtonCaption = __('Update'); + $submitButtonName = 'uptbutton'; + $submitButtonIcon = 'update'; } + + $actionButtons[] = html_print_submit_button( + $submitButtonCaption, + $submitButtonName, + false, + [ + 'icon' => $submitButtonIcon, + 'form' => 'user_profile_form', + ], + true + ); } -echo '
    '; +$actionButtons[] = html_print_go_back_button( + ui_get_full_url('index.php?sec=gusuarios&sec2=godmode/users/user_list&tab=user&pure=0'), + ['button_class' => ''], + true +); + +html_print_action_buttons(implode('', $actionButtons), ['type' => 'form_action']); echo ''; diff --git a/pandora_console/godmode/users/user_management.php b/pandora_console/godmode/users/user_management.php index 9acd4684b0..f9c96da433 100644 --- a/pandora_console/godmode/users/user_management.php +++ b/pandora_console/godmode/users/user_management.php @@ -585,6 +585,10 @@ $userManagementTable->data['title_additionalSettings'][1] = html_print_subtitle_ $userManagementTable->rowclass['captions_addSettings'] = 'field_half_width pdd_t_10px'; $userManagementTable->rowclass['fields_addSettings'] = 'field_half_width'; $userManagementTable->cellstyle['fields_addSettings'][1] = 'flex-wrap: wrap'; +$userManagementTable->cellstyle['captions_addSettings'][1] = 'width: 35%'; +$userManagementTable->cellstyle['captions_addSettings'][2] = 'width: 15%'; +$userManagementTable->cellstyle['fields_addSettings'][1] = 'width: 35%'; +$userManagementTable->cellstyle['fields_addSettings'][2] = 'width: 15%'; $userManagementTable->data['captions_addSettings'][0] = __('Comments'); $userManagementTable->data['fields_addSettings'][0] = html_print_textarea( 'comments', @@ -600,16 +604,23 @@ $userManagementTable->data['captions_addSettings'][1] .= ui_print_help_tip( __('Add the source IPs that will allow console access. Each IP must be separated only by comma. * allows all.'), true ); -$userManagementTable->data['fields_addSettings'][1] = html_print_textarea( - 'allowed_ip_list', - 2, - 65, - $user_info['allowed_ip_list'], - (((bool) $view_mode === true) ? 'readonly="readonly"' : ''), +$userManagementTable->data['fields_addSettings'][1] = html_print_div( + [ + 'class' => 'edit_user_allowed_ip', + 'content' => html_print_textarea( + 'allowed_ip_list', + 2, + 65, + $user_info['allowed_ip_list'], + (((bool) $view_mode === true) ? 'readonly="readonly"' : ''), + true + ), + ], true ); -$userManagementTable->data['fields_addSettings'][1] .= html_print_div( +$userManagementTable->data['captions_addSettings'][2] = __('Allow all IPs'); +$userManagementTable->data['fields_addSettings'][2] = html_print_div( [ 'class' => 'margin-top-10', 'content' => html_print_checkbox_switch( @@ -617,9 +628,60 @@ $userManagementTable->data['fields_addSettings'][1] .= html_print_div( 0, $user_info['allowed_ip_active'], true - ).''.__('Allow all IPs').'', + ), ], true ); + +$userManagementTable->rowclass['captions_loginErrorUser'] = 'field_half_width pdd_t_10px'; +$userManagementTable->rowclass['fields_loginErrorUser'] = 'field_half_width'; +$userManagementTable->cellstyle['captions_loginErrorUser'][0] = 'width: 25%'; +$userManagementTable->cellstyle['captions_loginErrorUser'][1] = 'width: 25%'; +$userManagementTable->cellstyle['fields_loginErrorUser'][0] = 'width: 25%'; +$userManagementTable->cellstyle['fields_loginErrorUser'][1] = 'width: 25%'; +$userManagementTable->data['captions_loginErrorUser'][0] = __('Not Login'); +$userManagementTable->data['captions_loginErrorUser'][0] .= ui_print_help_tip( + __('The user with not login set only can access to API.'), + true +); +$userManagementTable->data['fields_loginErrorUser'][0] = html_print_checkbox_switch( + 'not_login', + 1, + $user_info['not_login'], + true +); + +$userManagementTable->data['captions_loginErrorUser'][1] = __('Local user'); +$userManagementTable->data['captions_loginErrorUser'][1] .= ui_print_help_tip( + __('The user with local authentication enabled will always use local authentication.'), + true +); +$userManagementTable->data['fields_loginErrorUser'][1] = html_print_checkbox_switch( + 'local_user', + 1, + $user_info['local_user'], + true +); + +$userManagementTable->data['captions_loginErrorUser'][2] = __('Session time'); +$userManagementTable->data['captions_loginErrorUser'][2] .= ui_print_help_tip( + __('This is defined in minutes, If you wish a permanent session should putting -1 in this field.'), + true +); +$userManagementTable->data['fields_loginErrorUser'][2] = html_print_input_text( + 'session_time', + $user_info['session_time'], + '', + 5, + 5, + true.false, + false, + '', + 'class="input_line_small"' +); + html_print_table($userManagementTable); + +// User Profile definition table. +profile_print_profile_table($id, io_safe_output($json_profile), false, ($is_err === true && $new_user === true)); From 31acafc00feae644f72748fb9d355d67ad0ab724 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 6 Feb 2023 09:06:34 +0100 Subject: [PATCH 151/474] #10253 Enforcement options in setup visuals and general setup --- .../godmode/setup/setup_general.php | 18 +++--- .../godmode/setup/setup_visuals.php | 60 ++++++++++++------- 2 files changed, 50 insertions(+), 28 deletions(-) diff --git a/pandora_console/godmode/setup/setup_general.php b/pandora_console/godmode/setup/setup_general.php index fa889f3071..8e26dfee27 100644 --- a/pandora_console/godmode/setup/setup_general.php +++ b/pandora_console/godmode/setup/setup_general.php @@ -512,13 +512,17 @@ $table->data[$i++][1] = html_print_checkbox_switch( ); $table->data[$i][0] = __('Limit for bulk operations'); -$table->data[$i++][1] = html_print_input_text( - 'limit_parameters_massive', - $config['limit_parameters_massive'], - '', - 10, - 10, - true +$table->data[$i++][1] = html_print_input( + [ + 'type' => 'number', + 'size' => 5, + 'max' => 2000, + 'name' => 'limit_parameters_massive', + 'value' => $config['limit_parameters_massive'], + 'return' => true, + 'min' => 100, + 'style' => 'width:50px', + ] ); $table->data[$i][0] = __('Include agents manually disabled'); diff --git a/pandora_console/godmode/setup/setup_visuals.php b/pandora_console/godmode/setup/setup_visuals.php index afc79e3f01..918747a19f 100755 --- a/pandora_console/godmode/setup/setup_visuals.php +++ b/pandora_console/godmode/setup/setup_visuals.php @@ -64,7 +64,18 @@ $table_behaviour->size[0] = '50%'; $table_behaviour->data = []; $table_behaviour->data[$row][0] = __('Block size for pagination'); -$table_behaviour->data[$row][1] = html_print_input_text('block_size', $config['global_block_size'], '', 5, 5, true); +$table_behaviour->data[$row][1] = html_print_input( + [ + 'type' => 'number', + 'size' => 5, + 'max' => 200, + 'name' => 'block_size', + 'value' => $config['global_block_size'], + 'return' => true, + 'min' => 10, + 'style' => 'width:50px', + ] +); $row++; $values = []; @@ -823,16 +834,19 @@ if (enterprise_installed() === false) { } $table_chars->data[$row][0] = __('Data precision'); -$table_chars->data[$row][1] = html_print_input_text( - 'graph_precision', - $config['graph_precision'], - '', - 5, - 5, - true, - $disabled_graph_precision, - false, - 'onChange="change_precision()"' +$table_chars->data[$row][1] = html_print_input( + [ + 'type' => 'number', + 'size' => 5, + 'max' => 5, + 'name' => 'graph_precision', + 'value' => $config['graph_precision'], + 'return' => true, + 'min' => 1, + 'style' => 'width:50px', + ($disabled_graph_precision) ? 'readonly' : '' => 'readonly', + 'onchange' => 'change_precision()', + ] ); $row++; @@ -841,17 +855,21 @@ if (isset($config['short_module_graph_data']) === false) { } $table_chars->data[$row][0] = __('Data precision in graphs'); -$table_chars->data[$row][1] = html_print_input_text( - 'short_module_graph_data', - $config['short_module_graph_data'], - '', - 5, - 5, - true, - $disabled_graph_precision, - false, - 'onChange="change_precision()"' +$table_chars->data[$row][1] = html_print_input( + [ + 'type' => 'number', + 'size' => 5, + 'max' => 20, + 'name' => 'short_module_graph_data', + 'value' => $config['short_module_graph_data'], + 'return' => true, + 'min' => 1, + 'style' => 'width:50px', + ($disabled_graph_precision) ? 'readonly' : '' => 'readonly', + 'onchange' => 'change_precision()', + ] ); + $row++; $table_chars->data[$row][0] = __( From ac144de6d62e4292f2300271be96df8fd522c5d5 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 6 Feb 2023 10:17:51 +0100 Subject: [PATCH 152/474] WIP: Minor fixes --- .../godmode/users/configure_user.php | 4 +- .../godmode/users/user_management.php | 50 +++++++++---------- pandora_console/include/styles/pandora.css | 1 + 3 files changed, 27 insertions(+), 28 deletions(-) diff --git a/pandora_console/godmode/users/configure_user.php b/pandora_console/godmode/users/configure_user.php index 2b2f31eb30..865ab8eb9d 100644 --- a/pandora_console/godmode/users/configure_user.php +++ b/pandora_console/godmode/users/configure_user.php @@ -1101,7 +1101,7 @@ if (!$new_user) { !$new_user || $view_mode, '', [ - 'class' => 'input_line user_icon_input', + 'class' => 'input_line', 'placeholder' => __('User ID'), ], true @@ -1238,7 +1238,7 @@ $email = '
    '.html_print_input_text_extended( $view_mode, '', [ - 'class' => 'input input_line email_icon_input', + 'class' => 'input input_line', 'placeholder' => __('E-mail'), ], true diff --git a/pandora_console/godmode/users/user_management.php b/pandora_console/godmode/users/user_management.php index f9c96da433..c40cf6d349 100644 --- a/pandora_console/godmode/users/user_management.php +++ b/pandora_console/godmode/users/user_management.php @@ -150,7 +150,7 @@ $userManagementTable->data['title_profile_information'][1] = html_print_subtitle // Id user. if ($new_user === true) { - $userManagementTable->rowclass['captions_iduser'] = 'field_half_width pdd_t_10px'; + $userManagementTable->rowclass['captions_iduser'] = 'field_half_width'; $userManagementTable->rowclass['fields_iduser'] = 'field_half_width'; $userManagementTable->data['captions_iduser'][0] = __('User ID'); $userManagementTable->data['fields_iduser'][0] = html_print_input_text_extended( @@ -163,7 +163,7 @@ if ($new_user === true) { !$new_user || $view_mode, '', [ - 'class' => 'input_line user_icon_input', + 'class' => 'input', 'placeholder' => __('User ID'), ], true @@ -173,7 +173,7 @@ if ($new_user === true) { } // User Full name. -$userManagementTable->rowclass['captions_fullname'] = 'field_half_width pdd_t_10px'; +$userManagementTable->rowclass['captions_fullname'] = 'field_half_width'; $userManagementTable->rowclass['fields_fullname'] = 'field_half_width'; $userManagementTable->data['captions_fullname'][0] = __('Full name'); $userManagementTable->data['fields_fullname'][0] = html_print_input_text_extended( @@ -193,7 +193,7 @@ $userManagementTable->data['fields_fullname'][0] = html_print_input_text_extende ); // User Email. -$userManagementTable->rowclass['captions_email'] = 'field_half_width pdd_t_10px'; +$userManagementTable->rowclass['captions_email'] = 'field_half_width'; $userManagementTable->rowclass['fields_email'] = 'field_half_width'; $userManagementTable->data['captions_email'][0] = __('Email'); $userManagementTable->data['fields_email'][0] = html_print_input_text_extended( @@ -206,14 +206,14 @@ $userManagementTable->data['fields_email'][0] = html_print_input_text_extended( $view_mode, '', [ - 'class' => 'input input_line email_icon_input', + 'class' => 'input', 'placeholder' => __('E-mail'), ], true ); // User phone number. -$userManagementTable->rowclass['captions_phone'] = 'field_half_width pdd_t_10px'; +$userManagementTable->rowclass['captions_phone'] = 'field_half_width'; $userManagementTable->rowclass['fields_phone'] = 'field_half_width'; $userManagementTable->data['captions_phone'][0] = __('Phone number'); $userManagementTable->data['fields_phone'][0] = html_print_input_text_extended( @@ -226,7 +226,7 @@ $userManagementTable->data['fields_phone'][0] = html_print_input_text_extended( $view_mode, '', [ - 'class' => 'input input_line phone_icon_input', + 'class' => 'input', 'placeholder' => __('Phone number'), ], true @@ -377,7 +377,7 @@ $autorefreshControlsContent[] = html_print_anchor( 'id' => 'addAutorefreshPage', 'href' => 'javascript:', 'content' => html_print_image( - 'images/darrowright_green.png', + 'images/plus.svg', true, [ 'id' => 'right_autorefreshlist', @@ -393,7 +393,7 @@ $autorefreshControlsContent[] = html_print_anchor( 'id' => 'removeAutorefreshPage', 'href' => 'javascript:', 'content' => html_print_image( - 'images/darrowleft_green.png', + 'images/minus.svg', true, [ 'id' => 'left_autorefreshlist', @@ -441,12 +441,13 @@ $autorefreshTable = html_print_div( true ); -// $userManagementTable->rowclass['captions_autorefreshList'] = 'field_half_width pdd_t_10px'; -// $userManagementTable->rowclass['fields_autorefreshList'] = 'field_half_width'; +$userManagementTable->rowclass['captions_autorefreshList'] = 'field_half_width'; +$userManagementTable->rowclass['fields_autorefreshList'] = 'field_half_width'; +// $userManagementTable->cellclass['fields_autorefreshList'][0] = 'field_half_width'; $userManagementTable->data['captions_autorefreshList'] = __('Autorefresh pages'); $userManagementTable->data['fields_autorefreshList'] = $autorefreshTable; -$userManagementTable->rowclass['captions_autorefreshTime'] = 'field_half_width pdd_t_10px'; +$userManagementTable->rowclass['captions_autorefreshTime'] = 'field_half_width'; $userManagementTable->rowclass['fields_autorefreshTime'] = 'field_half_width'; $userManagementTable->data['captions_autorefreshTime'][0] = __('Time for autorefresh'); $userManagementTable->data['captions_autorefreshTime'][0] .= ui_print_help_tip( @@ -478,7 +479,7 @@ $userManagementTable->data['title_lookAndFeel'][0] = html_print_div( ); $userManagementTable->data['title_lookAndFeel'][1] = html_print_subtitle_table(__('Language and Appearance'), [], true); -$userManagementTable->rowclass['captions_lang_colorscheme'] = 'field_half_width pdd_t_10px'; +$userManagementTable->rowclass['captions_lang_colorscheme'] = 'field_half_width'; $userManagementTable->rowclass['fields_lang_colorscheme'] = 'field_half_width'; $userManagementTable->data['captions_lang_colorscheme'][0] = __('Language'); $userManagementTable->data['fields_lang_colorscheme'][0] = html_print_select_from_sql( @@ -494,7 +495,7 @@ $userManagementTable->data['fields_lang_colorscheme'][0] = html_print_select_fro $userManagementTable->data['captions_lang_colorscheme'][1] = __('User color scheme'); $userManagementTable->data['fields_lang_colorscheme'][1] = skins_print_select($id_usr, 'skin', $user_info['id_skin'], '', __('None'), 0, true); -$userManagementTable->rowclass['captions_blocksize_eventfilter'] = 'field_half_width pdd_t_10px'; +$userManagementTable->rowclass['captions_blocksize_eventfilter'] = 'field_half_width'; $userManagementTable->rowclass['fields_blocksize_eventfilter'] = 'field_half_width'; $userManagementTable->data['captions_blocksize_eventfilter'][0] = __('Block size for pagination'); $userManagementTable->data['fields_blocksize_eventfilter'][0] = html_print_input_text( @@ -530,9 +531,9 @@ $homeScreenTable->data = []; // Home screen. $homeScreenTable->data['captions_homescreen'][0] = __('Home screen'); $homeScreenTable->colspan['captions_homescreen'] = 2; -$homeScreenTable->rowclass['captions_homescreen'] = 'field_half_width pdd_t_10px'; +$homeScreenTable->rowclass['captions_homescreen'] = 'field_half_width'; $homeScreenTable->rowclass['fields_homescreen'] = 'field_half_width'; -// $homeScreenTable->rowclass['fields_homescreen'] = 'w540px'; +$homeScreenTable->rowclass['fields_homescreen'] = 'w540px'; $homeScreenTable->data['fields_homescreen'][0] = html_print_select( $homeScreenValues, 'section', @@ -550,9 +551,10 @@ $userManagementTable->rowclass['homescreen_table'] = 'table_section'; $userManagementTable->data['homescreen_table'] = html_print_table($homeScreenTable, true); // Timezone. -$userManagementTable->rowclass['captions_timezone'] = 'field_half_width pdd_t_10px'; +$userManagementTable->rowclass['captions_timezone'] = 'field_half_width'; $userManagementTable->rowclass['fields_timezone'] = 'field_half_width'; $userManagementTable->colspan['captions_timezone'][0] = 2; +$userManagementTable->cellstyle['fields_timezone'][0] = 'align-self: baseline;'; $userManagementTable->data['captions_timezone'][0] = __('Time zone'); $userManagementTable->data['fields_timezone'][0] = html_print_timezone_select('timezone', $user_info['timezone']); $userManagementTable->data['fields_timezone'][0] .= ui_print_help_tip( @@ -568,7 +570,6 @@ $userManagementTable->data['fields_timezone'][1] = html_print_div( true ); - // Title for Language and Appearance. $userManagementTable->rowclass['title_additionalSettings'] = 'w100p'; $userManagementTable->cellstyle['title_additionalSettings'][0] = 'width: 40px;'; @@ -582,7 +583,7 @@ $userManagementTable->data['title_additionalSettings'][0] = html_print_div( ); $userManagementTable->data['title_additionalSettings'][1] = html_print_subtitle_table(__('Additional settings'), [], true); -$userManagementTable->rowclass['captions_addSettings'] = 'field_half_width pdd_t_10px'; +$userManagementTable->rowclass['captions_addSettings'] = 'field_half_width'; $userManagementTable->rowclass['fields_addSettings'] = 'field_half_width'; $userManagementTable->cellstyle['fields_addSettings'][1] = 'flex-wrap: wrap'; $userManagementTable->cellstyle['captions_addSettings'][1] = 'width: 35%'; @@ -592,7 +593,7 @@ $userManagementTable->cellstyle['fields_addSettings'][2] = 'width: 15%'; $userManagementTable->data['captions_addSettings'][0] = __('Comments'); $userManagementTable->data['fields_addSettings'][0] = html_print_textarea( 'comments', - 2, + 5, 65, $user_info['comments'], ($view_mode ? 'readonly="readonly"' : ''), @@ -609,7 +610,7 @@ $userManagementTable->data['fields_addSettings'][1] = html_print_div( 'class' => 'edit_user_allowed_ip', 'content' => html_print_textarea( 'allowed_ip_list', - 2, + 5, 65, $user_info['allowed_ip_list'], (((bool) $view_mode === true) ? 'readonly="readonly"' : ''), @@ -634,7 +635,7 @@ $userManagementTable->data['fields_addSettings'][2] = html_print_div( ); -$userManagementTable->rowclass['captions_loginErrorUser'] = 'field_half_width pdd_t_10px'; +$userManagementTable->rowclass['captions_loginErrorUser'] = 'field_half_width'; $userManagementTable->rowclass['fields_loginErrorUser'] = 'field_half_width'; $userManagementTable->cellstyle['captions_loginErrorUser'][0] = 'width: 25%'; $userManagementTable->cellstyle['captions_loginErrorUser'][1] = 'width: 25%'; @@ -675,10 +676,7 @@ $userManagementTable->data['fields_loginErrorUser'][2] = html_print_input_text( '', 5, 5, - true.false, - false, - '', - 'class="input_line_small"' + true ); html_print_table($userManagementTable); diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 1a153156c7..5a30fbbe8f 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -5283,6 +5283,7 @@ input:checked + .p-slider:before { align-items: center; justify-content: center; margin-bottom: 15px; + width: 50%; } .autorefresh_select_text { From aaae7454fa4f73acb35a575cd00886a061f20e0c Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 6 Feb 2023 10:37:01 +0100 Subject: [PATCH 153/474] #10259 create control for token agentaccess if agents morte than 200 --- pandora_console/godmode/setup/performance.php | 5 ++- .../include/class/ConsoleSupervisor.php | 39 +++++++++++++++++++ .../include/functions_notifications.php | 1 + 3 files changed, 44 insertions(+), 1 deletion(-) diff --git a/pandora_console/godmode/setup/performance.php b/pandora_console/godmode/setup/performance.php index 969ff868c1..05b0bbdf26 100644 --- a/pandora_console/godmode/setup/performance.php +++ b/pandora_console/godmode/setup/performance.php @@ -151,6 +151,9 @@ if ($update_config == 1 && $config['history_db_enabled'] == 1) { } } +$total_agents = db_get_value('count(*)', 'tagente'); +$disable_agentaccess = ($total_agents >= 200) ? true : false; + $table_status = new StdClass(); $table_status->width = '100%'; $table_status->class = 'databox filters'; @@ -577,7 +580,7 @@ $table_other->data[$i++][1] = html_print_input_text( ); $table_other->data[$i][0] = __('Use agent access graph'); -$table_other->data[$i++][1] = html_print_checkbox_switch('agentaccess', 1, $config['agentaccess'], true); +$table_other->data[$i++][1] = html_print_checkbox_switch('agentaccess', 1, $config['agentaccess'], true, $disable_agentaccess); $table_other->data[$i][0] = __('Max. recommended number of files in attachment directory'); $table_other->data[$i++][1] = html_print_input_text( diff --git a/pandora_console/include/class/ConsoleSupervisor.php b/pandora_console/include/class/ConsoleSupervisor.php index b6a6d3df43..ce6d2df301 100644 --- a/pandora_console/include/class/ConsoleSupervisor.php +++ b/pandora_console/include/class/ConsoleSupervisor.php @@ -258,6 +258,11 @@ class ConsoleSupervisor $this->checkSyncQueueStatus(); } + /* + * Check number of agents is equals and more than 200. + * NOTIF.ACCESSSTASTICS.PERFORMANCE + */ + $this->checkAccessStatisticsPerformance(); } @@ -518,6 +523,12 @@ class ConsoleSupervisor $this->checkSyncQueueLength(); $this->checkSyncQueueStatus(); } + + /* + * Check number of agents is equals and more than 200. + * NOTIF.ACCESSSTASTICS.PERFORMANCE + */ + $this->checkAccessStatisticsPerformance(); } @@ -532,6 +543,34 @@ class ConsoleSupervisor } + /** + * Check number of agents and disable agentaccess token if number + * is equals and more than 200. + * + * @return void + */ + public function checkAccessStatisticsPerformance() + { + $total_agents = db_get_value('count(*)', 'tagente'); + + if ($total_agents >= 200) { + db_process_sql_update('tconfig', ['value' => 0], ['token' => 'agentaccess']); + $this->notify( + [ + 'type' => 'NOTIF.ACCESSSTASTICS.PERFORMANCE', + 'title' => __('Access statistics performance'), + 'message' => __( + 'Usage of agent access statistics IS NOT RECOMMENDED on systems with more than 200 agents due performance penalty' + ), + 'url' => '__url__/index.php?sec=general&sec2=godmode/setup/setup§ion=perf', + ] + ); + } else { + $this->cleanNotifications('NOTIF.ACCESSSTASTICS.PERFORMANCE'); + } + } + + /** * Update targets for given notification using object targets. * diff --git a/pandora_console/include/functions_notifications.php b/pandora_console/include/functions_notifications.php index 705d67ab3b..8ed023ddde 100644 --- a/pandora_console/include/functions_notifications.php +++ b/pandora_console/include/functions_notifications.php @@ -159,6 +159,7 @@ function notifications_get_subtypes(?string $source=null) 'NOTIF.SERVER.STATUS', 'NOTIF.SERVER.QUEUE', 'NOTIF.SERVER.MASTER', + 'NOTIF.ACCESSSTASTICS.PERFORMANCE', ], ]; From fecee4895f234509784eb023bb5c4412bc1685ce Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 6 Feb 2023 11:04:08 +0100 Subject: [PATCH 154/474] #10259 fixed bug in agentaccess token --- pandora_console/godmode/setup/performance.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/godmode/setup/performance.php b/pandora_console/godmode/setup/performance.php index 05b0bbdf26..1e0fc4df69 100644 --- a/pandora_console/godmode/setup/performance.php +++ b/pandora_console/godmode/setup/performance.php @@ -152,7 +152,7 @@ if ($update_config == 1 && $config['history_db_enabled'] == 1) { } $total_agents = db_get_value('count(*)', 'tagente'); -$disable_agentaccess = ($total_agents >= 200) ? true : false; +$disable_agentaccess = ($total_agents >= 200 && $config['agentaccess'] == 0) ? true : false; $table_status = new StdClass(); $table_status->width = '100%'; From 3e45b548b6e833aff67ea34a8d7608ab7e2ee2a5 Mon Sep 17 00:00:00 2001 From: Calvo Date: Mon, 6 Feb 2023 11:58:50 +0100 Subject: [PATCH 155/474] Pandora db delete /tmp/cron-session-cookies file --- pandora_server/util/pandora_db.pl | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index f0437a5bfb..84fdfb75d5 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -1067,12 +1067,18 @@ sub pandora_delete_old_session_data { $ulimit_timestamp = time() - $session_timeout; - log_message ('PURGE', "Deleting old session data from tsessions_php\n"); + log_message ('PURGE', "Deleting old session data from tsessions_php"); while(db_delete_limit ($dbh, 'tsessions_php', 'last_active < ?', $SMALL_OPERATION_STEP, $ulimit_timestamp) ne '0E0') { usleep (10000); }; db_do ($dbh, "DELETE FROM tsessions_php WHERE data IS NULL OR id_session REGEXP '^cron-'"); + + # Delete cron cookies file + my $cookie_file = '/tmp/cron-session-cookies'; + log_message ('PURGE', "Deleting cron session file"); + unlink($cookie_file) or die log_message ('PURGE', "Could not delete session file"); + } ############################################################################### From a7a0886e6ce7121299492edadd84f15d50bb5aea Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Mon, 6 Feb 2023 13:24:37 +0100 Subject: [PATCH 156/474] policy maintenance mode --- pandora_console/include/functions.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/pandora_console/include/functions.php b/pandora_console/include/functions.php index 7d4fee1d21..790df73e8a 100644 --- a/pandora_console/include/functions.php +++ b/pandora_console/include/functions.php @@ -6397,3 +6397,23 @@ function getBearerToken() return false; } + + +/** + * Check whether an instance of pandora_db is running. + * + * @return boolean Result. + */ +function is_pandora_db_running() +{ + $is_free_lock = mysql_db_process_sql( + 'SELECT IS_FREE_LOCK("pandora_pandora_db") AS "value"', + 'affected_rows', + '', + false + ); + + $is_free_lock = (bool) $is_free_lock[0]['value']; + + return !$is_free_lock; +} \ No newline at end of file From de3a74ae1ac61deadcfaaac4fe29ecb0dba14f26 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Mon, 6 Feb 2023 13:27:25 +0100 Subject: [PATCH 157/474] policy maintenance mode --- pandora_console/include/functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/functions.php b/pandora_console/include/functions.php index 790df73e8a..75e8e7ee58 100644 --- a/pandora_console/include/functions.php +++ b/pandora_console/include/functions.php @@ -6416,4 +6416,4 @@ function is_pandora_db_running() $is_free_lock = (bool) $is_free_lock[0]['value']; return !$is_free_lock; -} \ No newline at end of file +} From a1ccfc99eca99efe7b28a206adce400a3b3bb4af Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Mon, 6 Feb 2023 13:41:31 +0100 Subject: [PATCH 158/474] policy maintenance mode --- pandora_console/include/functions.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/functions.php b/pandora_console/include/functions.php index 75e8e7ee58..a4713b6f67 100644 --- a/pandora_console/include/functions.php +++ b/pandora_console/include/functions.php @@ -6406,8 +6406,11 @@ function getBearerToken() */ function is_pandora_db_running() { + // Get current DB name: useful for metaconsole connection to node. + $db_name = db_get_sql('SELECT DATABASE()'); + $is_free_lock = mysql_db_process_sql( - 'SELECT IS_FREE_LOCK("pandora_pandora_db") AS "value"', + 'SELECT IS_FREE_LOCK("'.$db_name.'_pandora_db") AS "value"', 'affected_rows', '', false From aedf6986b3899d769a3e905f1320b62a0d4d160e Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 6 Feb 2023 15:22:39 +0100 Subject: [PATCH 159/474] #10253 added console alert for control variables performance --- pandora_console/godmode/setup/performance.php | 66 +++++++------- .../godmode/setup/setup_general.php | 6 +- .../godmode/setup/setup_visuals.php | 14 +-- .../include/class/ConsoleSupervisor.php | 80 +++++++++++++++++ pandora_console/include/functions_config.php | 90 +++++++++++++++++++ .../include/functions_notifications.php | 1 + 6 files changed, 217 insertions(+), 40 deletions(-) diff --git a/pandora_console/godmode/setup/performance.php b/pandora_console/godmode/setup/performance.php index aa0f3d7c82..f616460e6d 100644 --- a/pandora_console/godmode/setup/performance.php +++ b/pandora_console/godmode/setup/performance.php @@ -151,6 +151,8 @@ if ($update_config == 1 && $config['history_db_enabled'] == 1) { } } +$performance_variables_control = (array) json_decode(io_safe_output($config['performance_variables_control'])); + $table_status = new StdClass(); $table_status->width = '100%'; $table_status->class = 'databox filters'; @@ -261,11 +263,11 @@ $table->data[1][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 45, + 'max' => $performance_variables_control['event_purge']->max, 'name' => 'event_purge', 'value' => $config['event_purge'], 'return' => true, - 'min' => 1, + 'min' => $performance_variables_control['event_purge']->min, 'style' => 'width:43px', ] ); @@ -275,11 +277,11 @@ $table->data[2][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 45, + 'max' => $performance_variables_control['trap_purge']->max, 'name' => 'trap_purge', 'value' => $config['trap_purge'], 'return' => true, - 'min' => 1, + 'min' => $performance_variables_control['trap_purge']->min, 'style' => 'width:43px', ] ); @@ -289,11 +291,11 @@ $table->data[3][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 365, + 'max' => $performance_variables_control['audit_purge']->max, 'name' => 'audit_purge', 'value' => $config['audit_purge'], 'return' => true, - 'min' => 7, + 'min' => $performance_variables_control['audit_purge']->min, 'style' => 'width:43px', ] ); @@ -303,11 +305,11 @@ $table->data[4][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 365, + 'max' => $performance_variables_control['string_purge']->max, 'name' => 'string_purge', 'value' => $config['string_purge'], 'return' => true, - 'min' => 7, + 'min' => $performance_variables_control['string_purge']->min, 'style' => 'width:43px', ] ); @@ -317,11 +319,11 @@ $table->data[5][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 365, + 'max' => $performance_variables_control['gis_purge']->max, 'name' => 'gis_purge', 'value' => $config['gis_purge'], 'return' => true, - 'min' => 7, + 'min' => $performance_variables_control['gis_purge']->min, 'style' => 'width:43px', ] ); @@ -331,11 +333,11 @@ $table->data[6][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 365, + 'max' => $performance_variables_control['days_purge']->max, 'name' => 'days_purge', 'value' => $config['days_purge'], 'return' => true, - 'min' => 7, + 'min' => $performance_variables_control['days_purge']->min, 'style' => 'width:43px', ] ); @@ -345,11 +347,11 @@ $table->data[7][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 365, + 'max' => $performance_variables_control['days_compact']->max, 'name' => 'days_compact', 'value' => $config['days_compact'], 'return' => true, - 'min' => 0, + 'min' => $performance_variables_control['days_compact']->min, 'style' => 'width:43px', ] ); @@ -359,11 +361,11 @@ $table->data[8][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 90, + 'max' => $performance_variables_control['days_delete_unknown']->max, 'name' => 'days_delete_unknown', 'value' => $config['days_delete_unknown'], 'return' => true, - 'min' => 0, + 'min' => $performance_variables_control['days_delete_unknown']->min, 'style' => 'width:43px', ] ); @@ -374,11 +376,11 @@ $table->data[9][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 90, + 'max' => $performance_variables_control['days_delete_not_initialized']->max, 'name' => 'days_delete_not_initialized', 'value' => $config['days_delete_not_initialized'], 'return' => true, - 'min' => 0, + 'min' => $performance_variables_control['days_delete_not_initialized']->min, 'style' => 'width:43px', ] ); @@ -388,11 +390,11 @@ $table->data[10][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 90, + 'max' => $performance_variables_control['days_autodisable_deletion']->max, 'name' => 'days_autodisable_deletion', 'value' => $config['days_autodisable_deletion'], 'return' => true, - 'min' => 0, + 'min' => $performance_variables_control['days_autodisable_deletion']->min, 'style' => 'width:43px', ] ); @@ -539,11 +541,11 @@ $table->data[] = [ [ 'type' => 'number', 'size' => 5, - 'max' => 30, + 'max' => $performance_variables_control['delete_old_network_matrix']->max, 'name' => 'delete_old_network_matrix', 'value' => $config['delete_old_network_matrix'], 'return' => true, - 'min' => 1, + 'min' => $performance_variables_control['delete_old_network_matrix']->min, 'style' => 'width:43px', ] ), @@ -563,11 +565,11 @@ $table_other->data[$i++][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 500, + 'max' => $performance_variables_control['report_limit']->max, 'name' => 'report_limit', 'value' => $config['report_limit'], 'return' => true, - 'min' => 1, + 'min' => $performance_variables_control['report_limit']->min, 'style' => 'width:43px', ] ); @@ -597,11 +599,11 @@ $table_other->data[$i++][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 360, + 'max' => $performance_variables_control['event_view_hr']->max, 'name' => 'event_view_hr', 'value' => $config['event_view_hr'], 'return' => true, - 'min' => 1, + 'min' => $performance_variables_control['event_view_hr']->min, 'style' => 'width:43px', ] ); @@ -645,11 +647,11 @@ $table_other->data[$i++][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 10000, + 'max' => $performance_variables_control['big_operation_step_datos_purge']->max, 'name' => 'big_operation_step_datos_purge', 'value' => $config['big_operation_step_datos_purge'], 'return' => true, - 'min' => 100, + 'min' => $performance_variables_control['big_operation_step_datos_purge']->min, 'style' => 'width:50px', ] ); @@ -661,11 +663,11 @@ $table_other->data[$i++][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 10000, + 'max' => $performance_variables_control['small_operation_step_datos_purge']->max, 'name' => 'small_operation_step_datos_purge', 'value' => $config['small_operation_step_datos_purge'], 'return' => true, - 'min' => 100, + 'min' => $performance_variables_control['small_operation_step_datos_purge']->min, 'style' => 'width:50px', ] ); @@ -695,11 +697,11 @@ $table_other->data[$i++][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 100000, + 'max' => $performance_variables_control['row_limit_csv']->max, 'name' => 'row_limit_csv', 'value' => $config['row_limit_csv'], 'return' => true, - 'min' => 1, + 'min' => $performance_variables_control['row_limit_csv']->min, 'style' => 'width:63px', ] ); diff --git a/pandora_console/godmode/setup/setup_general.php b/pandora_console/godmode/setup/setup_general.php index 8e26dfee27..987294185d 100644 --- a/pandora_console/godmode/setup/setup_general.php +++ b/pandora_console/godmode/setup/setup_general.php @@ -47,6 +47,8 @@ if (is_ajax()) { exit(); } +$performance_variables_control = (array) json_decode(io_safe_output($config['performance_variables_control'])); + $table = new StdClass(); $table->class = 'databox filters'; $table->id = 'setup_general'; @@ -516,11 +518,11 @@ $table->data[$i++][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 2000, + 'max' => $performance_variables_control['limit_parameters_massive']->max, 'name' => 'limit_parameters_massive', 'value' => $config['limit_parameters_massive'], 'return' => true, - 'min' => 100, + 'min' => $performance_variables_control['limit_parameters_massive']->min, 'style' => 'width:50px', ] ); diff --git a/pandora_console/godmode/setup/setup_visuals.php b/pandora_console/godmode/setup/setup_visuals.php index 918747a19f..e27e7b858d 100755 --- a/pandora_console/godmode/setup/setup_visuals.php +++ b/pandora_console/godmode/setup/setup_visuals.php @@ -53,6 +53,8 @@ $row = 0; echo '
    '; html_print_input_hidden('update_config', 1); +$performance_variables_control = (array) json_decode(io_safe_output($config['performance_variables_control'])); + // ---------------------------------------------------------------------- // BEHAVIOUR CONFIGURATION // ---------------------------------------------------------------------- @@ -68,11 +70,11 @@ $table_behaviour->data[$row][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 200, + 'max' => $performance_variables_control['block_size']->max, 'name' => 'block_size', 'value' => $config['global_block_size'], 'return' => true, - 'min' => 10, + 'min' => $performance_variables_control['block_size']->min, 'style' => 'width:50px', ] ); @@ -838,11 +840,11 @@ $table_chars->data[$row][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 5, + 'max' => $performance_variables_control['graph_precision']->max, 'name' => 'graph_precision', 'value' => $config['graph_precision'], 'return' => true, - 'min' => 1, + 'min' => $performance_variables_control['graph_precision']->min, 'style' => 'width:50px', ($disabled_graph_precision) ? 'readonly' : '' => 'readonly', 'onchange' => 'change_precision()', @@ -859,11 +861,11 @@ $table_chars->data[$row][1] = html_print_input( [ 'type' => 'number', 'size' => 5, - 'max' => 20, + 'max' => $performance_variables_control['short_module_graph_data']->max, 'name' => 'short_module_graph_data', 'value' => $config['short_module_graph_data'], 'return' => true, - 'min' => 1, + 'min' => $performance_variables_control['short_module_graph_data']->min, 'style' => 'width:50px', ($disabled_graph_precision) ? 'readonly' : '' => 'readonly', 'onchange' => 'change_precision()', diff --git a/pandora_console/include/class/ConsoleSupervisor.php b/pandora_console/include/class/ConsoleSupervisor.php index b6a6d3df43..e426858e8a 100644 --- a/pandora_console/include/class/ConsoleSupervisor.php +++ b/pandora_console/include/class/ConsoleSupervisor.php @@ -248,6 +248,11 @@ class ConsoleSupervisor $this->checkAuditLogOldLocation(); + /* + * Check if performance variables are corrects + */ + $this->checkPerformanceVariables(); + /* * Checks if sync queue is longer than limits. * NOTIF.SYNCQUEUE.LENGTH @@ -509,6 +514,11 @@ class ConsoleSupervisor $this->checkAuditLogOldLocation(); + /* + * Check if performance variables are corrects + */ + $this->checkPerformanceVariables(); + /* * Checks if sync queue is longer than limits. * NOTIF.SYNCQUEUE.LENGTH @@ -521,6 +531,76 @@ class ConsoleSupervisor } + /** + * Check if performance variables are corrects + * + * @return void + */ + public function checkPerformanceVariables() + { + global $config; + + $names = [ + 'event_purge' => 'Max. days before events are deleted', + 'trap_purge' => 'Max. days before traps are deleted', + 'audit_purge' => 'Max. days before audited events are deleted', + 'string_purge' => 'Max. days before string data is deleted', + 'gis_purge' => 'Max. days before GIS data is deleted', + 'days_purge' => 'Max. days before purge', + 'days_compact' => 'Max. days before data is compacted', + 'days_delete_unknown' => 'Max. days before unknown modules are deleted', + 'days_delete_not_initialized' => 'Max. days before delete not initialized modules', + 'days_autodisable_deletion' => 'Max. days before autodisabled agents are deleted', + 'delete_old_network_matrix' => 'Max. days before delete old network matrix data', + 'report_limit' => 'Item limit for real-time reports', + 'event_view_hr' => 'Default hours for event view', + 'big_operation_step_datos_purge' => 'Big Operation Step to purge old data', + 'small_operation_step_datos_purge' => 'Small Operation Step to purge old data', + 'row_limit_csv' => 'Row limit in csv log', + 'limit_parameters_massive' => 'Limit for bulk operations', + 'block_size' => 'Block size for pagination', + 'short_module_graph_data' => 'Data precision', + 'graph_precision' => 'Data precision in graphs', + ]; + + $variables = (array) json_decode(io_safe_output($config['performance_variables_control'])); + + foreach ($variables as $variable => $values) { + if (empty($config[$variable]) === true || $config[$variable] === '') { + continue; + } + + $message = ''; + $limit_value = ''; + if ($config[$variable] > $values->max) { + $message = 'Check the setting of %s, a value greater than %s is not recommended'; + $limit_value = $values->max; + } + + if ($config[$variable] < $values->min) { + $message = 'Check the setting of %s, a value less than %s is not recommended'; + $limit_value = $values->min; + } + + if ($limit_value !== '' && $message !== '') { + $this->notify( + [ + 'type' => 'NOTIF.VARIABLES.PERFORMANCE.'.$variable, + 'title' => __('Incorrect config value'), + 'message' => __( + $message, + $names[$variable], + $limit_value + ), + 'url' => '__url__/index.php?sec=general&sec2=godmode/setup/setup', + ] + ); + } + } + + } + + /** * Executes console maintenance operations. Executed ALWAYS through CRON. * diff --git a/pandora_console/include/functions_config.php b/pandora_console/include/functions_config.php index b0d15d5cef..ee42d68055 100644 --- a/pandora_console/include/functions_config.php +++ b/pandora_console/include/functions_config.php @@ -2293,6 +2293,96 @@ function config_process_config() config_update_value('2Fa_auth', ''); } + if (isset($config['performance_variables_control']) === false) { + config_update_value( + 'performance_variables_control', + json_encode( + [ + 'event_purge' => [ + 'max' => 45, + 'min' => 1, + ], + 'trap_purge' => [ + 'max' => 45, + 'min' => 1, + ], + 'audit_purge' => [ + 'max' => 365, + 'min' => 7, + ], + 'string_purge' => [ + 'max' => 365, + 'min' => 7, + ], + 'gis_purge' => [ + 'max' => 365, + 'min' => 7, + ], + 'days_purge' => [ + 'max' => 365, + 'min' => 7, + ], + 'days_compact' => [ + 'max' => 365, + 'min' => 0, + ], + 'days_delete_unknown' => [ + 'max' => 90, + 'min' => 0, + ], + 'days_delete_not_initialized' => [ + 'max' => 90, + 'min' => 0, + ], + 'days_autodisable_deletion' => [ + 'max' => 90, + 'min' => 0, + ], + 'delete_old_network_matrix' => [ + 'max' => 30, + 'min' => 1, + ], + 'report_limit' => [ + 'max' => 500, + 'min' => 1, + ], + 'event_view_hr' => [ + 'max' => 360, + 'min' => 1, + ], + 'big_operation_step_datos_purge' => [ + 'max' => 10000, + 'min' => 100, + ], + 'small_operation_step_datos_purge' => [ + 'max' => 10000, + 'min' => 100, + ], + 'row_limit_csv' => [ + 'max' => 1000000, + 'min' => 1, + ], + 'limit_parameters_massive' => [ + 'max' => 2000, + 'min' => 100, + ], + 'block_size' => [ + 'max' => 200, + 'min' => 10, + ], + 'short_module_graph_data' => [ + 'max' => 20, + 'min' => 1, + ], + 'graph_precision' => [ + 'max' => 5, + 'min' => 1, + ], + ] + ) + ); + } + if (isset($config['agent_wizard_defaults']) === false) { config_update_value( 'agent_wizard_defaults', diff --git a/pandora_console/include/functions_notifications.php b/pandora_console/include/functions_notifications.php index 705d67ab3b..1a4167d8c3 100644 --- a/pandora_console/include/functions_notifications.php +++ b/pandora_console/include/functions_notifications.php @@ -159,6 +159,7 @@ function notifications_get_subtypes(?string $source=null) 'NOTIF.SERVER.STATUS', 'NOTIF.SERVER.QUEUE', 'NOTIF.SERVER.MASTER', + 'NOTIF.VARIABLES.PERFORMANCE', ], ]; From 6d85b912e2c5f635a390ba4746a5deebe1b0f2f1 Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Mon, 6 Feb 2023 16:34:40 +0100 Subject: [PATCH 160/474] 9962-Omnishell in agent view --- pandora_console/images/omnishell.png | Bin 0 -> 606 bytes pandora_console/include/functions_html.php | 21 ++++++++++++++++++ pandora_console/include/functions_ui.php | 18 +++++++++++++++ .../operation/agentes/ver_agente.php | 21 ++++++++++++++++++ 4 files changed, 60 insertions(+) create mode 100644 pandora_console/images/omnishell.png diff --git a/pandora_console/images/omnishell.png b/pandora_console/images/omnishell.png new file mode 100644 index 0000000000000000000000000000000000000000..02c8f0e071e936d8b8fe8d83261e3d25a867b588 GIT binary patch literal 606 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHiZ6P)IEGjV&JEe^ z#q20jYPQ>R<$?vRQ4vcvbw+q9oOct>IU4m@w63XsLBi^#3nDlSIh)LqxYp|UDsYsA zRlcn{H$$@Q@tT_!8>-*WseX26=1ybfPe1>BE3nuz({Z!gx!G?%v`>5DpJF80-`85E zCwsm0`^y&s)~g~*S_Jx-QsO%`1X{MGXf<5>yeE~@Op5m*zsH6EjWhq5*qaY7mpAb{ z=^wDq&+gRMHB67ggm<=7?cLY8a``dOH`z%xa{g(XBgIc=CY|>>bAZ2Yrb}Z&cXq1! zn#LNDPKoZLWotaM&K%-;ZP~Uobcc$XP-p1z!e=5GnZ|?soj0C%zq!e{?UiazhH=Bx`-_bDH@tpRyg2jbm4)3^8tcBu)E|@nuV?he zZB#ZBaqcwgp3GH#az!7k0 zRZ*LF8HeNg2%TlW{?@%X%d=vk^7&@@C(W(K0ShJK`dvF>e>|T2r$NCbtf1ufj{MC6 zdk>%9ypW~hwBTg@m4`BlcgAq`Kizuh(6lv=F5fy=5x7kB!{=C$qVvy+n>6SD`D|0R j;0MdX+; literal 0 HcmV?d00001 diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index 31c2e5214a..44a8289b0d 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -84,6 +84,27 @@ function html_debug_print($var, $file='', $oneline=false) } +/** + * Console log. + */ +function jslog($var) +{ + $more_info = ''; + if (is_string($var)) { + $more_info = 'size: '.strlen($var); + } else if (is_bool($var)) { + $more_info = 'val: '.($var ? 'true' : 'false'); + } else if (is_null($var)) { + $more_info = 'is null'; + } else if (is_array($var)) { + $more_info = count($var); + } + + echo ''."\n"; + echo ''; +} + + // Alias for "html_debug_print" function html_debug($var, $file='', $oneline=false) { diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 6a658997f6..ce17086f02 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -7084,3 +7084,21 @@ function ui_get_inventory_module_add_form( } +function ui_print_status_div($status) +{ + switch ((int) $status) { + case 0: + $return = '
     
    '; + break; + + case 1: + $return = '
     
    '; + break; + + default: + $return = '
     
    '; + break; + } + + return $return; +} \ No newline at end of file diff --git a/pandora_console/operation/agentes/ver_agente.php b/pandora_console/operation/agentes/ver_agente.php index ece6ec2d6c..b5aa181e8b 100644 --- a/pandora_console/operation/agentes/ver_agente.php +++ b/pandora_console/operation/agentes/ver_agente.php @@ -37,6 +37,7 @@ require_once $config['homedir'].'/include/functions_groups.php'; require_once $config['homedir'].'/include/functions_modules.php'; require_once $config['homedir'].'/include/functions_users.php'; enterprise_include_once('include/functions_metaconsole.php'); +enterprise_include_once('include/functions_omnishell.php'); ui_require_javascript_file('openlayers.pandora'); ui_require_css_file('agent_view'); @@ -1485,6 +1486,17 @@ if ($policyTab == -1) { $policyTab = ''; } + +// Omnishell. +$tasks = count_tasks_agent($id_agente); + +if ($tasks === true) { + $omnishellTab = enterprise_hook('omnishell_tab'); + if ($omnishellTab == -1) { + $omnishellTab = ''; + } +} + // WUX Console. $modules_wux = enterprise_hook('get_wux_modules', [$id_agente]); if ($modules_wux) { @@ -1747,6 +1759,7 @@ $onheader = [ 'ncm_view' => ($ncm_tab ?? null), 'external_tools' => ($external_tools ?? null), 'incident' => ($incidenttab ?? null), + 'omnishell' => ($omnishellTab ?? null), ]; @@ -1871,6 +1884,10 @@ switch ($tab) { $tab_name = 'Policies'; break; + case 'omnishell': + $tab_name = 'Omnishell'; + break; + case 'ux_console_tab': $tab_name = 'UX Console'; break; @@ -2009,6 +2026,10 @@ switch ($tab) { enterprise_include('operation/agentes/policy_view.php'); break; + case 'omnishell': + enterprise_include('operation/agentes/omnishell_view.php'); + break; + case 'ux_console_tab': enterprise_include('operation/agentes/ux_console_view.php'); break; From a2d7573d30dbfb39514c79fcdf14ae42aa97f64f Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 6 Feb 2023 16:44:14 +0100 Subject: [PATCH 161/474] #9479 Create module and edit/delete on metaconsole --- .../include/functions_treeview.php | 2 + .../operation/agentes/status_monitor.php | 65 ++++++++++++------- 2 files changed, 42 insertions(+), 25 deletions(-) diff --git a/pandora_console/include/functions_treeview.php b/pandora_console/include/functions_treeview.php index 198d4a51c8..2062ccb8c8 100755 --- a/pandora_console/include/functions_treeview.php +++ b/pandora_console/include/functions_treeview.php @@ -696,6 +696,8 @@ function treeview_printTable($id_agente, $server_data=[], $no_head=false) $go_to_agent .= ''; $go_to_agent .= html_print_submit_button(__('Go to cluster edition'), 'upd_button', false, 'class="sub config"', true); } else { + $go_to_agent .= ''; + $go_to_agent .= html_print_submit_button(__('Go to module creation'), 'upd_button', false, 'class="sub config"', true); $go_to_agent .= ''; $go_to_agent .= html_print_submit_button(__('Go to agent edition'), 'upd_button', false, 'class="sub config"', true); } diff --git a/pandora_console/operation/agentes/status_monitor.php b/pandora_console/operation/agentes/status_monitor.php index 4770ac4687..8381dddb87 100644 --- a/pandora_console/operation/agentes/status_monitor.php +++ b/pandora_console/operation/agentes/status_monitor.php @@ -276,6 +276,7 @@ if ($loaded_filter['id_filter'] > 0) { if (is_array($tag_filter) === false) { $tag_filter = json_decode($tag_filter, true); } + if ($tag_filter === '') { $tag_filter = [0 => 0]; } @@ -1468,6 +1469,12 @@ if (!empty($result)) { $table->align[11] = 'left'; } + if (check_acl($config['id_user'], 0, 'AR')) { + $actions_list = true; + $table->head[12] = __('Actions'); + $table->align[12] = 'left'; + } + $id_type_web_content_string = db_get_value( 'id_tipo', 'ttipo_modulo', @@ -1588,31 +1595,6 @@ if (!empty($result)) { if (in_array('data_type', $show_fields) || is_metaconsole()) { $data[2] = html_print_image('images/'.modules_show_icon_type($row['module_type']), true, ['class' => 'invert_filter']); $agent_groups = is_metaconsole() ? $row['groups_in_server'] : agents_get_all_groups_agent($row['id_agent'], $row['id_group']); - if (check_acl_one_of_groups($config['id_user'], $agent_groups, 'AW')) { - $show_edit_icon = true; - if (defined('METACONSOLE')) { - if (!can_user_access_node()) { - $show_edit_icon = false; - } - - $url_edit_module = $row['server_url'].'index.php?'.'sec=gagente&'.'sec2=godmode/agentes/configurar_agente&'.'id_agente='.$row['id_agent'].'&'.'tab=module&'.'id_agent_module='.$row['id_agente_modulo'].'&'.'edit_module=1'.'&loginhash=auto&loginhash_data='.$row['hashdata'].'&loginhash_user='.str_rot13($row['user']); - } else { - $url_edit_module = 'index.php?'.'sec=gagente&'.'sec2=godmode/agentes/configurar_agente&'.'id_agente='.$row['id_agent'].'&'.'tab=module&'.'id_agent_module='.$row['id_agente_modulo'].'&'.'edit_module=1'; - } - - if ($show_edit_icon) { - $table->cellclass[][2] = 'action_buttons'; - $data[2] .= ''.html_print_image( - 'images/config.png', - true, - [ - 'alt' => '0', - 'border' => '', - 'title' => __('Edit'), - ] - ).''; - } - } } if (in_array('module_name', $show_fields) || is_metaconsole()) { @@ -2088,6 +2070,39 @@ if (!empty($result)) { $data[11] = ui_print_timestamp($row['utimestamp'], true, $option); } + if (check_acl_one_of_groups($config['id_user'], $agent_groups, 'AW')) { + if (defined('METACONSOLE')) { + $url_edit_module = $row['server_url'].'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&'; + $url_edit_module .= 'loginhash=auto&id_agente='.$row['id_agent']; + $url_edit_module .= '&tab=module&id_agent_module='.$row['id_agente_modulo'].'&edit_module=1&'; + $url_edit_module .= 'loginhash_data='.$row['hashdata'].'&loginhash_user='.str_rot13($row['user']); + + $url_delete_module = $row['server_url'].'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente'; + $url_delete_module .= '&id_agente='.$row['id_agent'].'&delete_module='.$row['id_agente_modulo']; + + $table->cellclass[][2] = 'action_buttons'; + $data[12] .= ''.html_print_image( + 'images/config.png', + true, + [ + 'alt' => '0', + 'border' => '', + 'title' => __('Edit'), + ] + ).''; + $onclick = 'onclick="javascript: if (!confirm(\''.__('Are you sure to delete?').'\')) return false;'; + $data[12] .= ''.html_print_image( + 'images/delete.png', + true, + [ + 'alt' => '0', + 'border' => '', + 'title' => __('Delete'), + ] + ).''; + } + } + array_push($table->data, $data); } From e5a18f67a7ada45f54ef11b35be4832f1f750523 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 6 Feb 2023 16:51:36 +0100 Subject: [PATCH 162/474] #10307 added user info in in progress status event --- pandora_console/include/functions_events.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/pandora_console/include/functions_events.php b/pandora_console/include/functions_events.php index 3740257717..ca35739891 100644 --- a/pandora_console/include/functions_events.php +++ b/pandora_console/include/functions_events.php @@ -2018,7 +2018,7 @@ function events_change_status( // Update ack info if the new status is validated. $ack_utimestamp = 0; $ack_user = $config['id_user']; - if ((int) $new_status === EVENT_STATUS_VALIDATED) { + if ((int) $new_status === EVENT_STATUS_VALIDATED || (int) $new_status === EVENT_STATUS_INPROCESS) { $ack_utimestamp = time(); } @@ -4814,7 +4814,7 @@ function events_page_general($event) $data = []; $data[0] = __('Acknowledged by'); - if ($event['estado'] == 1) { + if ($event['estado'] == 1 || $event['estado'] == 2) { if (empty($event['id_usuario']) === true) { $user_ack = __('Autovalidated'); } else { @@ -4948,8 +4948,7 @@ function events_page_general_acknowledged($event_id) global $config; $Acknowledged = ''; $event = db_get_row('tevento', 'id_evento', $event_id); - hd($event['ack_utimestamp'], true); - if ($event !== false && $event['estado'] == 1) { + if ($event !== false && ($event['estado'] == 1 || $event['estado'] == 2)) { $user_ack = db_get_value( 'fullname', 'tusuario', From dfdcb688d406ced8202636c77c643f02d4139482 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 6 Feb 2023 23:10:28 +0100 Subject: [PATCH 163/474] Improve code --- .../godmode/users/configure_profile.php | 37 +- .../godmode/users/configure_user.php | 390 +++++++++--------- .../godmode/users/user_management.php | 67 +-- pandora_console/include/functions_events.php | 2 +- pandora_console/include/functions_html.php | 12 +- pandora_console/include/functions_profile.php | 57 +-- .../include/functions_reporting.php | 2 +- pandora_console/include/functions_ui.php | 2 - pandora_console/include/styles/pandora.css | 13 +- 9 files changed, 310 insertions(+), 272 deletions(-) diff --git a/pandora_console/godmode/users/configure_profile.php b/pandora_console/godmode/users/configure_profile.php index 4cddff8932..82af2e5e8e 100644 --- a/pandora_console/godmode/users/configure_profile.php +++ b/pandora_console/godmode/users/configure_profile.php @@ -39,12 +39,13 @@ if (! check_acl($config['id_user'], 0, 'UM')) { } enterprise_include_once('meta/include/functions_users_meta.php'); - -$tab = get_parameter('tab', 'profile'); -$pure = get_parameter('pure', 0); - +// Get parameters. +$tab = get_parameter('tab', 'profile'); +$pure = get_parameter('pure', 0); +$new_profile = (bool) get_parameter('new_profile'); +$id_profile = (int) get_parameter('id'); // Header. -if (!is_metaconsole()) { +if (is_metaconsole() === false) { $buttons = [ 'user' => [ 'active' => false, @@ -72,13 +73,29 @@ if (!is_metaconsole()) { $buttons[$tab]['active'] = true; - ui_print_page_header( - __('User management').' » '.__('Profiles defined on %s', get_product_name()), + $profile = db_get_row('tperfil', 'id_perfil', $id_profile); + + ui_print_standard_header( + __('Edit profile %s', $profile['name']), 'images/gm_users.png', false, 'configure_profiles_tab', true, - $buttons + $buttons, + [ + [ + 'link' => '', + 'label' => __('Profiles'), + ], + [ + 'link' => '', + 'label' => __('Manage users'), + ], + [ + 'link' => ui_get_full_url('index.php?sec=gusuarios&sec2=godmode/users/profile_list&tab=profile'), + 'label' => __('User Profile management'), + ], + ] ); $sec2 = 'gusuarios'; } else { @@ -86,10 +103,6 @@ if (!is_metaconsole()) { $sec2 = 'advanced'; } - -$new_profile = (bool) get_parameter('new_profile'); -$id_profile = (int) get_parameter('id'); - // Edit profile. if ($id_profile || $new_profile) { if ($new_profile) { diff --git a/pandora_console/godmode/users/configure_user.php b/pandora_console/godmode/users/configure_user.php index 865ab8eb9d..fdfcfd1b3c 100644 --- a/pandora_console/godmode/users/configure_user.php +++ b/pandora_console/godmode/users/configure_user.php @@ -54,71 +54,27 @@ if ($enterprise_include === true) { enterprise_include_once('meta/include/functions_users_meta.php'); } -if (is_metaconsole() === false) { - date_default_timezone_set('UTC'); - include 'include/javascript/timezonepicker/includes/parser.inc'; - - // Read in options for map builder. - $bases = [ - 'gray' => 'Gray', - 'blue-marble' => 'Blue marble', - 'night-electric' => 'Night Electric', - 'living' => 'Living Earth', - ]; - - $local_file = 'include/javascript/timezonepicker/images/gray-400.png'; - - // Dimensions must always be exact since the imagemap does not scale. - $array_size = getimagesize($local_file); - - $map_width = $array_size[0]; - $map_height = $array_size[1]; - - $timezones = timezone_picker_parse_files( - $map_width, - $map_height, - 'include/javascript/timezonepicker/tz_world.txt', - 'include/javascript/timezonepicker/tz_islands.txt' - ); - - foreach ($timezones as $timezone_name => $tz) { - if ($timezone_name == 'America/Montreal') { - $timezone_name = 'America/Toronto'; - } else if ($timezone_name == 'Asia/Chongqing') { - $timezone_name = 'Asia/Shanghai'; - } - - $area_data_timezone_polys .= ''; - foreach ($tz['polys'] as $coords) { - $area_data_timezone_polys .= ''; - } - - $area_data_timezone_rects .= ''; - foreach ($tz['rects'] as $coords) { - $area_data_timezone_rects .= ''; - } - } -} - // This defines the working user. Beware with this, old code get confusses // and operates with current logged user (dangerous). $id = get_parameter('id', get_parameter('id_user', '')); +// Check if we are the same user for edit or we have a proper profile for edit users. +if ($id !== $config['id_user']) { + if ((bool) check_acl($config['id_user'], 0, 'UM') === false) { + db_pandora_audit( + AUDIT_LOG_ACL_VIOLATION, + 'Trying to access User Management' + ); + include 'general/noaccess.php'; + + return; + } +} + // ID given as parameter. $pure = get_parameter('pure', 0); - $user_info = get_user_info($id); $is_err = false; -if ((bool) check_acl($config['id_user'], 0, 'UM') === false) { - db_pandora_audit( - AUDIT_LOG_ACL_VIOLATION, - 'Trying to access User Management' - ); - include 'general/noaccess.php'; - - return; -} - if (is_ajax() === true) { $delete_profile = (bool) get_parameter('delete_profile'); $get_user_profile = (bool) get_parameter('get_user_profile'); @@ -270,7 +226,7 @@ enterprise_hook('open_meta_frame'); $tab = get_parameter('tab', 'user'); // Save autorefresh list. -$autorefresh_list = get_parameter_post('autorefresh_list'); +$autorefresh_list = (array) get_parameter_post('autorefresh_list'); $autorefresh_white_list = (($autorefresh_list[0] === '') || ($autorefresh_list[0] === '0')) ? '' : json_encode($autorefresh_list); // Header. @@ -338,6 +294,7 @@ if ((bool) $config['user_can_update_info'] === true) { $view_mode = true; } +$delete_profile = (is_ajax() === true) ? (bool) get_parameter('delete_profile') : false; $new_user = (bool) get_parameter('new_user'); $create_user = (bool) get_parameter('create_user'); $add_profile = (bool) get_parameter('add_profile'); @@ -564,6 +521,7 @@ if ($create_user === true) { $info ); + HD('patatas', true); ui_print_result_message( $result, __('Successfully created'), @@ -1002,7 +960,7 @@ if ($add_profile && empty($json_profile)) { ); } -if ($values) { +if (isset($values) === true && empty($values) === false) { $user_info = $values; } @@ -1530,7 +1488,7 @@ $default_event_filter .= html_print_select( false ).'
    '; -if ($config['ehorus_user_level_conf']) { +if (isset($config['ehorus_user_level_conf']) === true && (bool) $config['ehorus_user_level_conf'] === true) { $ehorus = '

    '.__('eHorus user access enabled').'

    '; $ehorus .= html_print_checkbox_switch( 'ehorus_user_level_enabled', @@ -1562,7 +1520,7 @@ if ($config['ehorus_user_level_conf']) { $double_auth_enabled = (bool) db_get_value('id', 'tuser_double_auth', 'id_user', $id); -if ($config['double_auth_enabled'] && check_acl($config['id_user'], 0, 'PM')) { +if (isset($config['double_auth_enabled']) === true && (bool) ($config['double_auth_enabled']) === true && check_acl($config['id_user'], 0, 'PM')) { $double_authentication = '

    '.__('Double authentication').'

    '; if (($config['2FA_all_users'] == '' && !$double_auth_enabled) || ($config['double_auth_enabled'] == '' && $double_auth_enabled) @@ -1678,14 +1636,10 @@ if (is_metaconsole() === true) { ).'
    '; } + +echo '
    '; echo ''; - -require_once 'user_management.php'; - - - - if (!$id) { $user_id_update_view = $user_id; $user_id_create = ''; @@ -1696,138 +1650,138 @@ if (!$id) { if (is_metaconsole() === true) { $access_or_pagination = $meta_access; + if ($id != '' && !$is_err) { + $div_user_info = ' + '; + } else { + $div_user_info = ' + '; + } + + echo '
    +
    + +

    Extra info

    '.$email.$phone.$not_login.$local_user.$session_time.'
    +
    +
    +
    '.$language.$access_or_pagination.$skin.$default_event_filter.$double_authentication.'
    + +
    '.$timezone; + + echo $search_custom_fields_view.$metaconsole_agents_manager.$metaconsole_access_node; + + $autorefresh_show = '

    '._('Autorefresh').ui_print_help_tip( + __('This will activate autorefresh in selected pages'), + true + ).'

    '; + $select_out = html_print_select( + $autorefresh_list_out, + 'autorefresh_list_out[]', + '', + '', + '', + '', + true, + true, + true, + '', + false, + 'width:100%' + ); + $arrows = ' '; + $select_in = html_print_select( + $autorefresh_list, + 'autorefresh_list[]', + '', + '', + '', + '', + true, + true, + true, + '', + false, + 'width:100%' + ); + + $table_ichanges = ''; + + $autorefresh_show .= $table_ichanges; + + // Time autorefresh. + $times = get_refresh_time_array(); + $time_autorefresh = '

    '.__('Time autorefresh'); + $time_autorefresh .= ui_print_help_tip( + __('Interval of autorefresh of the elements, by default they are 30 seconds, needing to enable the autorefresh first'), + true + ).'

    '; + $time_autorefresh .= html_print_select( + $times, + 'time_autorefresh', + $user_info['time_autorefresh'], + '', + '', + '', + true, + false, + false + ).'
    '; + + + echo '
    +
    +
    '.$autorefresh_show.$time_autorefresh.'
    +
    +
    '.$comments.'
    +
    '; + + if (empty($ehorus) === false) { + html_print_div( + [ + 'class' => 'user_edit_third_row white_box', + 'content' => $ehorus, + ], + true + ); + } } else { $access_or_pagination = $size_pagination; -} - -if ($id != '' && !$is_err) { - $div_user_info = ' - '; -} else { - $div_user_info = ' - '; -} - -echo '
    -
    - -

    Extra info

    '.$email.$phone.$not_login.$local_user.$session_time.'
    -
    -
    -
    '.$language.$access_or_pagination.$skin.$default_event_filter.$double_authentication.'
    - -
    '.$timezone; -if (is_metaconsole() === false) { - echo '
    - - - '.$area_data_timezone_polys.$area_data_timezone_rects.' -
    '; -} else { - echo $search_custom_fields_view.$metaconsole_agents_manager.$metaconsole_access_node; -} - -$autorefresh_show = '

    '._('Autorefresh').ui_print_help_tip( - __('This will activate autorefresh in selected pages'), - true -).'

    '; -$select_out = html_print_select( - $autorefresh_list_out, - 'autorefresh_list_out[]', - '', - '', - '', - '', - true, - true, - true, - '', - false, - 'width:100%' -); -$arrows = ' '; -$select_in = html_print_select( - $autorefresh_list, - 'autorefresh_list[]', - '', - '', - '', - '', - true, - true, - true, - '', - false, - 'width:100%' -); - -$table_ichanges = ''; - -$autorefresh_show .= $table_ichanges; - -// Time autorefresh. -$times = get_refresh_time_array(); -$time_autorefresh = '

    '.__('Time autorefresh'); -$time_autorefresh .= ui_print_help_tip( - __('Interval of autorefresh of the elements, by default they are 30 seconds, needing to enable the autorefresh first'), - true -).'

    '; -$time_autorefresh .= html_print_select( - $times, - 'time_autorefresh', - $user_info['time_autorefresh'], - '', - '', - '', - true, - false, - false -).'
    '; - - -echo '
    -
    -
    '.$autorefresh_show.$time_autorefresh.'
    -
    -
    '.$comments.'
    -
    '; - -if (!empty($ehorus)) { - echo '
    '.$ehorus.'
    '; + // WIP: Only for node. + include_once 'user_management.php'; } echo '
    '; -if ($config['admin_can_add_user']) { +if ((bool) $config['admin_can_add_user'] === true) { html_print_csrf_hidden(); html_print_input_hidden((($new_user === true) ? 'create_user' : 'update_user'), 1); } @@ -1837,8 +1791,8 @@ if ($new_user === true) { html_print_input_hidden('json_profile', $json_profile); } - echo ''; +echo '
    '; $actionButtons = []; @@ -1873,10 +1827,11 @@ $actionButtons[] = html_print_go_back_button( html_print_action_buttons(implode('', $actionButtons), ['type' => 'form_action']); - echo '
    '; enterprise_hook('close_meta_frame'); + +// This is an image generated for JS. $delete_image = html_print_input_image( 'del', 'images/cross.png', @@ -1889,7 +1844,7 @@ $delete_image = html_print_input_image( ] ); -if (!is_metaconsole()) { +if (is_metaconsole() === false) { ?> + $dialogContainer + .empty() + .append(message) + .append($button); + + var request; + + $button.click(function(e) { + e.preventDefault(); + + $dialogContainer.html($loadingSpinner); + + // Deactivate the double auth + request = $.ajax({ + url: "", + type: 'POST', + dataType: 'json', + data: { + page: 'include/ajax/double_auth.ajax', + id_user: userID, + FA_forced: 1, + deactivate_double_auth: 1 + }, + complete: function(xhr, textStatus) { + + }, + success: function(data, textStatus, xhr) { + if (data === -1) { + $dialogContainer.html("
    '.__('Authentication error').'
    '; ?>"); + } else if (data) { + $dialogContainer.html("
    '.__('The double autentication was deactivated successfully').'
    '; ?>"); + $("input#checkbox-double_auth").prop("checked", false); + } else { + $dialogContainer.html("
    '.__('There was an error deactivating the double autentication').'
    '; ?>"); + } + }, + error: function(xhr, textStatus, errorThrown) { + $dialogContainer.html("
    '.__('There was an error deactivating the double autentication').'
    '; ?>"); + } + }); + }); + + + $("div#dialog-double_auth").dialog({ + resizable: true, + draggable: true, + modal: true, + title: "", + overlay: { + opacity: 0.5, + background: "black" + }, + width: 300, + height: 150, + close: function(event, ui) { + // Abort the ajax request + if (typeof request != 'undefined') + request.abort(); + // Remove the contained html + $dialogContainer.empty(); + + } + }) + .show(); + } + + + /* ]]> */ + \ No newline at end of file diff --git a/pandora_console/godmode/users/user_management.php b/pandora_console/godmode/users/user_management.php index 206725a4b6..c7e4ab43ee 100644 --- a/pandora_console/godmode/users/user_management.php +++ b/pandora_console/godmode/users/user_management.php @@ -220,6 +220,9 @@ $userManagementTable->data['fields_phone'][0] = html_print_input_text_extended( true ); +$userManagementTable->rowclass['captions_fields_admin_user'] = 'field_half_width w50p'; +$userManagementTable->cellclass['captions_fields_admin_user'][0] = 'wrap'; +$userManagementTable->data['captions_fields_admin_user'][0] = $doubleAuthentication; if (users_is_admin() === true) { $globalProfileContent = []; $globalProfileContent[] = ''.__('Administrator user').''; @@ -230,8 +233,8 @@ if (users_is_admin() === true) { true ); - $userManagementTable->rowclass['captions_fields_admin_user'] = 'field_half_width'; - $userManagementTable->data['captions_fields_admin_user'][0] = html_print_div( + $userManagementTable->cellclass['captions_fields_admin_user'][1] = 'wrap'; + $userManagementTable->data['captions_fields_admin_user'][1] = html_print_div( [ 'class' => 'margin-top-10', 'style' => 'display: flex; flex-direction: row-reverse; align-items: center;', diff --git a/pandora_console/include/ajax/double_auth.ajax.php b/pandora_console/include/ajax/double_auth.ajax.php index 0f85c9c0f5..3a995ce43a 100644 --- a/pandora_console/include/ajax/double_auth.ajax.php +++ b/pandora_console/include/ajax/double_auth.ajax.php @@ -1,21 +1,39 @@ $id_user]; db_process_sql_delete('tuser_double_auth', $where); - // Insert the new value + // Insert the new value. $values = [ 'id_user' => $id_user, 'secret' => $secret, @@ -116,12 +134,12 @@ if ($save_double_auth_secret) { return; } -// Disable the double auth for the user +// Disable the double auth for the user. $deactivate_double_auth = (bool) get_parameter('deactivate_double_auth'); if ($deactivate_double_auth) { $result = false; - // Delete the actual value (if exists) + // Delete the actual value (if exists). $where = ['id_user' => $id_user]; $result = db_process_sql_delete('tuser_double_auth', $where); @@ -129,7 +147,7 @@ if ($deactivate_double_auth) { return; } -// Get the info page to the container dialog +// Get the info page to the container dialog. $get_double_auth_data_page = (bool) get_parameter('get_double_auth_data_page'); if ($get_double_auth_data_page) { $secret = db_get_value('secret', 'tuser_double_auth', 'id_user', $id_user); @@ -146,7 +164,7 @@ if ($get_double_auth_data_page) { $html .= '

    '; $html .= '
    '; $html .= '
    '; - $html .= __('Code').": $secret"; + $html .= __('Code').': '.$secret.''; $html .= '
    '; $html .= __('QR').':
    '; $html .= '
    '; @@ -161,7 +179,7 @@ if ($get_double_auth_data_page) { var secret = ""; var id_user_auth = ""; - // QR code with the secret to add it to the app + // QR code with the secret to add it to the app. paint_qrcode("otpauth://totp/"+id_user_auth+"?secret="+secret, $("div#qr-container").get(0), 200, 200); $("div#qr-container").attr("title", "").find("canvas").remove(); @@ -179,7 +197,7 @@ if ($get_double_auth_data_page) { return; } -// Get the info page to the container dialog +// Get the info page to the container dialog. $get_double_auth_info_page = (bool) get_parameter('get_double_auth_info_page'); if ($get_double_auth_info_page) { $container_id = (string) get_parameter('containerID'); @@ -209,14 +227,14 @@ if ($get_double_auth_info_page) { ob_clean(); ?> diff --git a/pandora_console/godmode/setup/setup_visuals.php b/pandora_console/godmode/setup/setup_visuals.php index 8f7654fa06..236378a301 100755 --- a/pandora_console/godmode/setup/setup_visuals.php +++ b/pandora_console/godmode/setup/setup_visuals.php @@ -449,8 +449,8 @@ if (enterprise_installed() === true) { 'custom_splash_login', $config['custom_splash_login'], '', - '', - '', + __('Default'), + 'default', true, false, true, @@ -663,6 +663,12 @@ if (enterprise_installed() === true) { $row++; } +if (enterprise_installed() === true) { + $table_styles->data[$row][0] = __('Background opacity % (login)'); + $table_styles->data[$row][1] = ""; + $row++; +} + if (enterprise_installed() === true) { $table_styles->data[$row][0] = __('Disable logo in graphs'); $table_styles->data[$row][1] = html_print_checkbox_switch( @@ -715,6 +721,16 @@ $table_styles->data[$row][1] = html_print_checkbox_switch( $config['visual_animation'], true ); +$row++; + +$table_styles->data[$row][0] = __('Random background (login)'); +$table_styles->data[$row][1] = html_print_checkbox_switch( + 'random_background', + 1, + $config['random_background'], + true +); +$row++; // ---------------------------------------------------------------------- @@ -1147,7 +1163,7 @@ $table_vc->data[$row][1] = html_print_select( $row++; $table_vc->data[$row][0] = __('Number of favorite visual consoles to show in the menu'); -$table_vc->data[$row][1] = ""; +$table_vc->data[$row][1] = ""; $row++; $table_vc->data[$row][0] = __('Default line thickness for the Visual Console'); @@ -1181,7 +1197,7 @@ $table_ser->size[0] = '50%'; $table_ser->data = []; $table_ser->data['number'][0] = __('Number of favorite services to show in the menu'); -$table_ser->data['number'][1] = ""; +$table_ser->data['number'][1] = ""; // ---------------------------------------------------------------------- // Reports @@ -1214,12 +1230,12 @@ $table_report->data[$row][1] = html_print_checkbox_switch( $row++; $table_report->data[$row][0] = __('PDF font size (px)'); -$table_report->data[$row][1] = ""; +$table_report->data[$row][1] = ""; $row++; $table_report->data[$row][0] = __('HTML font size for SLA (em)'); -$table_report->data[$row][1] = ""; +$table_report->data[$row][1] = ""; $row++; diff --git a/pandora_console/images/animated_login/line-1.svg b/pandora_console/images/animated_login/line-1.svg new file mode 100644 index 0000000000..abf8747c4d --- /dev/null +++ b/pandora_console/images/animated_login/line-1.svg @@ -0,0 +1,20 @@ + + + + C62A1795-794F-402A-9E97-F2BD4D8F847C + Created with sketchtool. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/images/animated_login/line-2.svg b/pandora_console/images/animated_login/line-2.svg new file mode 100644 index 0000000000..9c166ec688 --- /dev/null +++ b/pandora_console/images/animated_login/line-2.svg @@ -0,0 +1,20 @@ + + + + C3D4F6E9-4DEB-4120-925D-CC7B405F7455 + Created with sketchtool. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/images/animated_login/line-3.svg b/pandora_console/images/animated_login/line-3.svg new file mode 100644 index 0000000000..1db509a7b8 --- /dev/null +++ b/pandora_console/images/animated_login/line-3.svg @@ -0,0 +1,20 @@ + + + + 678B7C23-14BC-4AAB-804B-2042119A8C12 + Created with sketchtool. + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/images/animated_login/static.svg b/pandora_console/images/animated_login/static.svg new file mode 100644 index 0000000000..dfa1936eec --- /dev/null +++ b/pandora_console/images/animated_login/static.svg @@ -0,0 +1,93 @@ + + + + Img + Created with Sketch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/pandora_console/images/backgrounds/random_backgrounds/Abstract_data.jpeg b/pandora_console/images/backgrounds/random_backgrounds/Abstract_data.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..190cc3a387357f37a9782bac3a2265d6afb268ca GIT binary patch literal 286268 zcmbrli$Bx-|3Ch+YpzDRj3i2oYe{lek>j|Qh$~W*^W|JQh0q*Ek`xg#T(XIz98!cd z?7C7G!!Bt_GZHiB)8?>YzEAJp=Rf#uy49`QtzOUP^Yu8~50B^ex9uMg@~oAO6(k}8 zK_cJ_Z8M=1=vVOB_3JJKVwd=C@Rj^cLgF_`S)>&B%Bt*>-v@qF6w!(b;MYlYRaNzq zX2|fbA6FPm4}iGrkGk^9XkZj8zHzk^vsxohov;y2x6!_)JCRA zQ$1^3k5BejSk;(pg3pkk!8=v1`#jpt5dlF}A=vEQggCM>nQUYbGFVLAbKu4_qsqC} zb+H3^4-Ni#!Ow!u{Q)d;WAGrcd+tT1MtFyflpt|sbd$6`d|>4oqqc`o*F02d7w(e= zQ-i}wE;>LW81>4ek|(E+p5Av_v_xiKh+7U+W=#BkGPt1I(O0+QFxgZoY;Yyvx5qPb zAX=`qJJ-0bTrr{?WY3pQ|% zLhb~vnixj?k%PlgpGPH?rH?e7q-<=RLP}p;aqVI_YWufn-nhbop~jZI5SN|GI_d1Gf~SVIrH6c!ffxy3{e)Oyy$F80@Yw%+{kLLxvP zoSB_p!Gofh(7`6nLQdVFs$q9{u1wCAkGa2vEsP}asf!rDDjzfwO$dmY}c5H+^54DVzObiq&Rp-2U^op(LRg_FT_(?Wkg5O#*0_p!Mk zD2g^VhVkK>$i^fLDhZs6h(l@eeQ`C%ywjrUc}~}!zo|MaTgh-OuXJ!slY(KbMJ;97 z^|j=x=5^It7)C6oC!ZH8SNs`6B!YJzE|L#`Rqp;q7~FdS~QZwgwNB z>sHmXbL5ai=LTo#p*TNZUGT~}Y~(&sC9Y3wLzvcqiIIPUoWR?;kA#&cCyC35%E*)w z9+e+;y4L4(t+J-Fa-Z{~%JLUj=tHuy#9t55$`MS~RLn{k^LjtMliJ?ilaiu~fT6_E zw{kV=+%x=aR4hW>VvP*u2J4ONz?p>S_`J%M&uCW&Fzi%4Mqn`;XPLzAM37&8yiM3?#Cm-uk(k)e$7B8p%9kID*Ga6ho7N4 zg=wXmc~ma#4n2Uy)E~4#=h&d-o_5&iW}{EjG*)Ms^~R2N;Z%iyy<&30+O5)Ee8zJB zAvOf60{F=6JiT1Jnvn6_sqQnQ>gu)6kHkR}!lqbSz)|-x7(G$u^hO(}c1qyUDnC8W z-K1-GF2`pXTj^euR~ApozNaGb66dGun^Dl2k&?ZS=oU%SvCeQr8{*Htid9}(0b%v&^j5sO@n~X?Ch`^FdN=lj0 zH#WRZFT@HfYDNZ#ZRYx)mg7mkf8yd^JE=HzV8x{E{Bq^f$S3CqbG$PRLBaD)m3wv+ z?nFB*qJlMZy+3LD-wZB$D_aXX2iR>4uT+%IMGOPx+S00^$@7#KqctE)O zui_vq5`w|hptFb)kO-iLUa2fUdRBZl1cOlEclG2X_2fsI^u#BVtGuwe)z*=~uPdfn zEWS65!&f|WZwzM^C@VLHe(&R(K~+$(L3enAL(VjOIZPxHA29XpbQq}z8m9Z`W#?LN z+JUqA0X4hlDyZs-Stvu|jvvrD);1dkt5cgn>nE}gr8}fSC;(1GG2$>#9%M=%ImwiW zLgy_VL_kiuCO>l8XLrZ(Md*V4XP)VAtt=wt^^Bk`>&XB`Gk!?XKI`Xtn|)q;t-Nl5 z@9zrX1-_X_b$xYnd@}}g{VBB-Wo7uG8Hwxd5+`OD6;_#`fsU#gj;0z~*b-d6P$hJz z$Vy)%+{sBy1)C$aab~q|GkpC}_Mto<1cZc%{e=S6Tt@VA>3y}Mm?x*zV0jk)u9Z#> z>Un1yoGU*+s=D^oEy4awAJ1qlDt4G&1p<}jw%lHHyK~vZ{@|zO^@h=m0y{LQ0<{W$ zA60cT?4m{=4E8hnDfl_&F|gXv%mXV^9L_{vm2-;@RY7MUsfyTL_af71W%RyGoi0MO z($Pi?o%3tEi;A)Tb1aD5od2bcc=EcRn(;Mh%XRiwl9*p5y{$2vrk&0+`zYfCXrmwEGYr*tDrVB4B zDvU)A?aHw-9LsDqI)%Fdx}|4JIMuTS)f~*sQ`O(&y7W|K!$5dI~KYFp;NptrVw~JNR*w=rWXQ$Kdxu^Be9wXg8TG=^0Cz{4Az%uTQD^WKVm`(l` z;T^uUm&^^c&1w_`*WdfrIwRdzXL~;tj8!=!ozilVqW(v1?pqzrcy#}FndnDpFi{i+ z^S@LBZ%*W5xti1Yv(@+2LC2|zX!Z|vu5(f=*Q*Lq&y_tE>f+iII^W9Y)Yp%!wURFU zH$6FcJYtbQ9GK6!LM7#TJdXcKHaf<5&>TqY?mu+XSDv?Wg9l3ewZ_-E zo;3+g8sZ|3IReVPDFeHo~gxLz1M!k`3n z*9}I{O(q9w&uAN%6`Kg6MnRAT$%0k-<@i=P%Y9C>Lc(5L$+0eYos;zY-q(3(#6Fk6 z*O`Xcw8jq>;02e6oQ6Ph%FEWsGW~*=f#`-NntTc zT5oA(6=oFQ(1QT-2~1fD`wvp8nrbWXJsDAxY|a2cyY!xqJ)oSJ?2X7zHvm8fiR|1^MPxM>bm%)*>pGz_!l5@# z=p1yxdl@nGyaOaVH#Ijic-KHHL$|{UH%?XX13d|XU`gk#)hdr(8>(q=a{lTP%<5zG zQOYXHqPt&Y9(Xgg^UD6$CN8_>bpa^#Ge5{#gKT8f8uqN8vo4HIADI*2@4hBGZ$tLA zp>xe4-#R>4#*M)=Rl}gZmv&%FV?P1GXvs3(!{oA>&J=T&_(IP@$GUHSugnZQa8s3v z7$o*E*XHQPnJ*I#L|yHxl>o6Ww=WvNVINQ&oTV;W+x;b44!^fo?jfYA-{t^4^ElMX zYBdfedY+5d?QkPFWg3p{z?%2Is1)chq@Lt-)VYRcGS|o^g4W9<^so*MXN7s4W9m}( z#5M%A?{R$-89CWsC867{pj+tQG`Jf6^W6>q8$0wMsQpk|@4V-^GoRy%1o+#Ock#8o zxP=mdmwi8r$YQw(qFDr+^Z*g?<|>3| z02bl;%th7ETXv{!us)Q<)bj>(%C%uMRn9wA$E`kKs19HcP-eQEtaIf`HPxh4Y@{K0 zZe#NM+nUA0Suvhlg~z!OlTf{VLfyMzvi*d6d`ohF?maHFo!T7uFaTH1Tt*#gNR^5NV=BPk?X@2SD?K zUNZ;OZeLK*y)*8sV{@Q#wQS}4(vWg`<8yI|##qICu-j&xzFro+0ufkj1=_XqfmiJk zAVfQC;G#&!`=u|gM$BxT;U!kg_WGvQm<-_)izb%1zQnnW`nQwgJ3+>t=&JzuJX6lL zf0alr9=*v8ob;+mFcWGY>*AVd7rnh6Kaml|outNm-S99ni|bm&4}4uQnIE|{Fqmba z*tT${sv;_|j{;C~l}>*d39zu0X-3&O@qX&W^>A)@WQSW!DBa8aNFjSUDECk-Z)zYT zS1e5ma<=RMK(?UU$_4ClnfANH@o7dz8cePP_9z9LW(ir^TS9&f`vad$uC0a*5-%ub zZbN@0O5R~#%QwDo=%#m-CuneTd*yX(MA6yOG7hDAPWcrZyM`0A{oD7%9*!BR{v^>%Nxx_8JwPmF&ebY5Fc`u@N=kY+F|H|ekQk-Ye(u46SMO1la!IhXloUh~ zJeS#*@j}*z_r!cq z$;UL-ZrtF7Fp16}>J&CXzKkj(u_CZEYm5{mbz~^~I(PI|1kGf1j;@&C;dwVP4CoCj z8;X>wsi@%g-bMT$?L|$GH{-uY1%X_+|0eAsEnsfzkOzyYOYh|WCI&zK2GV5lwoDY_ zd_65_Vx@p52Lv<=~mQZ?Q_3 zRy^05rb8GLH$8XJ*SFlBy;PJu*!@q3b+dmYJz&9hrqxsX*o4WDAVJc1Qh2w%A~1bC zp2Il+yYmK>B<4TA7QYQ0kzNU#Y|pD-XuJKMPuwHtE6;Y^9q~!aWwy~y*Da!XXql$L zrJHb@{Xwq>Z1EU%4ENSHq>&lokjyA4=+r3~OO*q?1n6H9erXTyl&T<*kVWV)ab76w zE#8O;ynKyOMk*@G%}UQNIw!4yKvsSJ{~+`!EIJZ zp4_6_N7ovBTr!cAj2=3^h#QuC=&Zk2V>N7+m*7<*I7sKjd-crCtZY$A)&!00QJlHv zqG6$%i#tJF&EZZ-qg!?aPmht(fq4?qU^!GLUCF4fqifXB1I~FE);!U9Z+YL+5>#}# zXBvLK5MtwG&(BT2o10bSDV2tKehUa4 zkO+D!|77jniIyR)ICAXrGo!aHvmrE77JeIICdBl`Hgowx`>Y=~nQNo;34YtILcQwn z4mNQE2zrU$ZD?WmRC7RW*0x8lRrT9%PJ62~2O^ z96qA@yo;SjH!WJ5XJy@@zl6$<+B(@0>Y9#4G#$(9V)z3nPwXi=84M)OxV11oI1@7iOlXCRvT$pdW-UEiNrx z$8DOpe-HnFQb#63DiBP>S5s zP{;WS>?Z`=9E&l)WcD%QC5a!wX&zW&k`wI%W6Gvu&GIY2nYFeWbGhcnHV^i`7nP|x z+v(!;hITBErt#9n|Jr+Y9-tJs*+JsafN9}isI!=aYMU2vvBAdys8%RA9ECzaFeL1- zvI=^?CQDcWL;;VjgklflRrZOgiSeI5fBgLMgS#pG?Oeijln81k2{0Y_zM?a?x$bgx z^hD1sLeRw6mnID^lU!C?UyGj^3-_-NFiR}%N!D|TplLLQ0P=U48w8Y`t>T2?yX7O3 z(W_BWt1;0l3nNVdL-k!_6Y)nt2fBlD%t$|5?)U7H26vDc*EmPVZx!+>`l%wA^3#=W z&bQF*3V?QrKuJjtp+_Y!cp55AMFlC(6W}Q|JF6~kEsk6B8z{?9zk8d`U5}raG^UTT z2T;k5m?Rk3tc`iVyY)@&T}At70X@vj}b0u)HMcCr82DDE**>Lus*tbHIT3cueFv6ePcKuE=6F-ab+LTb}&Y+HUA=x3|Exz5zgbCTxWT$2TZ zUT({R0sUv+E%?#2Bsj1wRO~}`U5PZ>R1R}qaLKA0WWGb`o_Y} z@o5~7xW2f!xU|fjDFn#}_M|@o&Ui=T*Z{Z!(9jr#*8`cYa(2hZay=gdN>Q!L03dd{ zzrwTC-9+w(Ol3nzRY=wO5JrWJ#Z`wi3q%sMFT|-d4Si3=y5K1`TMCXq+7cH2V6JYF z-1>P5io$u;MuazrAh2?Zem6IM!Jvoxws|p4*%1U#5~P9^3~R;fid>N?MT(YdR^@8c z(*n9z0h^3DV|6)VX|k`U%=uUj`;x{yD1bPBK%q{$r7%*fPfQI|?1^3Sajnj~_L+%6 z-|=h6>l&(KHi4)*D2TZc#v;)-$KNh3UVC__BpH-Cr-r-+3^H3)&q^1aqhgJPK~mD} zzNt7O2dGr|{3nw!t6|I{&rDBk1KRQ?MZ25ZGGfp@I`J?3EU>;nPD`7*L$KsD=;&Gh z&`ZaPK{KS80NC>KrKjQ*N9M&(D!SP!pjqGvD~6bx7mIMK5gt#hy)b^%Ax_vD@eBLI4+H_6+gM-Hxb+TEoTCwA&2Q)(*$y~X(cLbCxWM^=O(B4Bi$zgo5If6UkbFhnq9SfuJ4vw zlCO227_A=w;|ghAjA0f z^T=C@^Dk=vY3lsQ0jtcLz~RG+CissPzWE>!Ks2<7Xi^Bjx3@V2EL27u#8Irg?%iIlNiCqCn{*J9hNl+OV8G5ScWUO;jR7&J`$F?+Q3wS&lvmlF z*R@ebi8=uds(A=N2reMdbL4jhE4+otDR7)Sy4|Ldj_SEpZ%_yo_@sPWB|15OQ)i94mApb>|UUi+?wxF;p0EQRza#?#63af%h? zBTV2iHTmu_dA!4Xac%#%JZgm;gt#RmQ(e8ld^RtbX;bx9CG6joW| z4*-7`n}C~Tk;|&8s>tz;0|jQjt3u5W6wQIsvwqqWGdJwM;-L8Q#1=V>_z&91L5nzGD?IliiT zAY2hXDN?_>wMqsuS5570$xT%icvi*@?(!l~H)FsVgSY>&2UJX?_`XZWfD77I+&o?| zT2+*vRrFgqFse!*kgANvp_jN|dO+OCxj_nWm7)XlXqvIdCnwmP@$rd&)EP2wG^8!X zT%4XD_c^(^*EQ=M?tKcf1?X>j^w6QkwWwL(Z_|1})9x7__~tzhB5(i67Vo3jjLRQj z^#DHivUPK`;!g5B0Ap3yNwi#UA4%0hUMJmd=dm9|~0yu2` z@qb}ymLg}Jx`x(3Hwtc0J-~|yj|iH2v=5R2X2ONTZaLq(*nqi$qRJgCE&xhLk=0|} z^A{a!5NQ_oLK?qIBO4jA?1--Kjo?}T@^UrLG!y!2PMxGgU) z25*BLD=-M@>Tx~QY`AU$+9|NmhRuQzqEe8EZKz%S>aX@eOe&!oWO(!}-&$ zvXwRJb&X$ktW;lE`BBT1v=mMMP`igYSWw+wgkI8kkJ*O|PEc+Q-HMJ(J zSWDc`Z|aSxQ#JHW4_%nnwq0CEAMLCCMPn_P3RZR>3)$w|$Gqm<1hV!Kvtrj*9sUfS z7jEF+AM0jeTE($TRCy_63WT)eP$-NQQ}aKX070IeH{xAk{~Y}R(1G#Yd{1RjM3Rhp zO_OHvp;q$ptBl3>_Rqm-W5(Qc8CIMtV6?>>P z!MKq_Fyc*4jQ!k!#EO4jhM**wN7Z?GgMF+)ih9RS(Dx)2Yr0Aa;=l!jtD_!TSYV!G z5so#@?kPFejxTZkAr}wRHF6K#oS$Yr`j`wX?-t$L(S{gzE>#Q-8`_{eZB?51Gp05x z%URFPwm$KzaP(jP2o)C_HAbosjP&9YsI_vwkVwpi`OB>)0}e&7vnLBYoe!(Vt+6?KsK%dSGRY6cgIx8daA8Jge}5u*u~pWT|9MS=-um% zP8Dc>V$Fs*b4h5kO!QK1(K$^gFPJTmX?)V-Wy5BmZ|T{VxwckbhHXP0(P49SWo6W)Qax)yEARjC-A; z*ShDRn@qTLa&4K$32&ZpTTmCfT|VPOO4=UQHWVc&nh@Gfw6uj>{_A7@nTl1jHS>Jn zeSJUSooYCi;ggL@Ln1NFpg@BPjbp3UxNi;(30{5JIdM@wKRF;$;lwD)@!PZB;(nkSI_W57IM=Yoh>CH zFm9`wiMlB~L!!|uoLj;Jn=1O|+w)21s&&A?2QYk7&`1=W$O~+W(eu z#mPU5C)tVja=tVZVitHMg|147h&nGTG*di)ISBaKF{ zg+CMr5+iwoeB%1lK<%EJzNtVL)^cm&#mocPr858o8_nKvu+$D4w2iWg3Icsh-2IAu16urfa{t8US=9M67r2_(mMIJK|Y&0Lg)?uA3jfKvicEi^T3>Ll8 z7#S9p{pR++c_`+eOmeJiP6QF6JE5M41(h_IR?A!X6mf5EYWX}0a+O^eOv&-qg=E^rN*_4IYAIMgXaE{7Q~@?B7~2grHNqeAsFV~e`X1U6i^U?7MN4v25KuZC z1&KJbfsH|q`1=ia3TTl}uB51lAf?$&Q^HOz$^73c1z&k-NL)>wIh%MEZ@;LBuM;_& zaF;fd(JEnBN_gocs35PuJl-^CMp>FLF9*KL(^wb&-_>cNP&qlmJM*Glc#}k zeP~Z}!!!dF7M%{HXcs#~3?Y+;NxKJ^wm_>`svsX?;FyO}HY%RL8r1UUs}ryk4ul;MZDa4fI)DG+%BiBXwyGoTBD zeqeFsjhclT9D}{3f&l&45)Q*)k$~IYg2de-USu|BSS=zgm7!nh7giR668E!5%sXop z9I>*nBpK(kAKpy>LJ>Gi%`>Y#JHdWME7~tT}Yg-2W zhk`_R7t4KUWM3)hM3y%@JKZD1Xe@W-%7bO-`g9;lKf;nBBo>3UM5ZOf5cjMtAY}-H zfjr&zQA104-_+giqm|YU_0iYX@=nWUOYxHMtzvcL&X8zs71ET^kiF1O$y+ zFlD$h5|b=-6oEiu(x7BW?C`zc(%>l&{0U)r;nn=&CjQUMSWuVY(*J-zBp(R+MWdc9_bEwSN+wY;%QMaZ8dAtYRL7Vj&E`SJ$Bv3{TeW>iQ3nUL^O*Ce)d|c9+Ogc<)t`4})SuDX59Hra zu>azOw!2|31oo^1?ZT?N_y>w>+U-J*pOF!hoCyx6uWV0jz$yQ1L}0Y4JTJJq?(J9w z7?6=oRe`Z1dcW8O=*#O`A|)&_FbMoWNf=ZTG6`u}ibNpgQr>>nI_2}0t$f*EjBuo+ z9D+k?&%w0Lb0<+zlm?j63#3%Vp7hM@8C;8wTEk}x?3P-!gruSb``-Bx7MbhSW%3dj znw}o9uY$c(H7<{3YScLpW^M9V&001(K#kGGVDHJer#qs3rS2nDcBV|Ez*|8e;V760 z91cI5Vk>5md3jK;qyN{-{`(c4^6p=BkcJ>-QE>;;Y)DZ{~Oz(rsH@}LfPJjC2{xa@A@pZ3CA?|rMP`!UWQsLCgitQvbhW)mX!TqRyb6JEXV^Um8x=w5yfuslFHpx^-Q6$>;eOtJ`o zYDr1ReQ=mu5)z4eg|dC{V!y(Y>gBQN=a8j{<)iaXXC2gFCD`nX<&`^gfS}XN6JNf3 zNw)`9R_W%5K~o2Pw(ZFGWwZYO_`~)EbAox#Z755y@W-N3%JSyCmZw<)GoZU+t}k=2 zVvqa!+_%Bx`s(ZNhjNiQHdkyTb`xCu#K0gxs-AT+0xgY%p`m09a1FrV7{KkIFe6}& z8h5BicZ(5@J&1KqgP_togrp>F#$QR&|3UlCIyJiyT;^DmvMS1#wZyWm`%9)uzr^(8 zzWGmV+~o3&O-6!pztQvg-0{s`vjlzT2N6TzC+e8}^`0%SnNha1jOKB@PSs{T6=?*j zl)%h$*(<+8F)gtV5or(>10wYnP<~-5P!b}g#B$7A!!J9Wrtp*|KcxpjuN>fFVp0gG z?xVO1rli~v=s%zvgjoq+j{GsO)wE!C#{5NFpjqvc$qB|Z&TQmCy_eNCWd5(9cDMFK z?GgGoyN_Na;gHejNAoOE^>Ay{FM35Sv!Y8XELYd~+4=d(A~2B4RcA2%cTetNnk5pM z0@NfF8us21t}LPsKWypZlXKZtO?r%gZu-v^f{mw6*ul-<-CPVk(El>&{6ks6w zv7Eo3iff<|7>DzJ0Z{Q!SsEq{CBre+ps=OEE+UmRUcn_I?%bzp=)WKG%tayKDk_%n zr;uZbxY~IOCvjIT9DZcY^ly`a(3?hE+I50US<|?`x6I6jwFAvOiGEArD=lG(xAUot zCVqb>cbyLgVls8%BBG~7K=ne3s)^_(J%wO0$}mKVCE^wwWr0LK2dRun`T+KQ(N;}a z@BPPEb>uBEDd30LSYTwpjN=`(O85Ff0-zYcs|b6+Gyfug!hfLuUuM0+st+SIzV$Lr z@lxO7b=)@OwaHl&dPyEJdjPyn3>-pW4uhbB&Wb=-6atVD71S;8WP~&vLg_-5FrwnvM%UjCNaj0+{xmS=w{la&eS2JfXflHBlKE@Q@HCYmZ0?~ zrGwIlOj3b>D+BGcU}Y3W8UbN+VX{bNQNrmw>9OF;buQO?Z6+;{X%E#!AC-tYfSK|) zKoA+6+91|O3q$SrxNkFKOZ?-G&dzm##JE_a*o_3GK*4TSJEh_-IZV5v?mwzRlsCQJ znWTUFpAE^0h5fg)^3PRY&zF_+J#?sf#@pz`wdrwAxBlmp_yZw|ojNOu#i_Bfl?GPH+g!D}T{K zSs9_4&8(u6egi4=M0@+Nn6kM5>!__E%Igz<6+Yi5Td-V!;1^ zgK{PfoxeZ!*C)G(oSoAHX;vwnvd@X&!f6WaerHCTHzR{N2Fa{-rL^^|;@t#Co77$* zO^5nyv?_<486Bv@D31%55Be69HADDDT) zlTc|03<~f&hoqg>lng&AeG3Hxd2snKR#vp5oT}kl3GEiOwGch)+C0moMANIbj_@QK zCn@{*Ye3N2^~v|zpOF=;k(Z&&iR&GaL>-UfLyGz54B14Fw!2jWBdnKg86wMj#Jzbb$MwDsS}Ix^pb9Bb5flameL&r^5f=kx68lO9{q|ek zXWvJMsj8+rP^0L5NQFTQ6#`|#UNA6Cm)zYeQE zw>H1R%4}rPtoG~dLSHdoXukipy`)xgaogS6jU%m7{9!^bzItNzkzEv*-B;GNcyemQ z`~de9|J18@jbUV6?s9)s*h$xx%!JD~0`r|sF~e^5966#xDnDFCSBQl6muxj;O;O zxWoObXx=KGv=KJc-S*3JSht~0yWDAk{fh<8vWcb<|At+ZZ}e;z%XN{-%J+0h2>h~6 zJW~8`PinRF(AtftXn`VS+N)|kK{#?Id+zFtT^DtCmZZVCZRqzVbA68azU7;zPQ9*f z7)w3m5&QaIl6~+*d-P?G_~ArSRlv|{VBcWGKxb7?f9i;Bl|&@GRG!U?kT`H)=7{w5+wp~I3xy1KM_HQ?>%t%kqzOLO?a0PO2ZXd>L7JBk~O~# zIVW_)nxi(oIK1h9B`O%g2Mae7b-A92yUg@Vf33lVGPA$6n4IFeFL%BCZN8@1cuzBH zYdEWdH}c=R7U9V6Wh0|3iXXvWx8Uk>f>teozYYDjv{}R@?WK)Q{QSwdzZ%*+KJ{mR z*|+xIiOAXc_PW3#MSFw0RyD<8ZYK4Nie7GjaYD!|4)^Bk>PCF)bUde(|OFvEcBW@6re(fB+CF#50Rh>q8^-LcBSmbWm6r3v*cf%XbM z@d5rQCvy6|ZzMes0JfLcg@H?81X#kTts=}^>9;=(1GQe-g*f*L*C*fint8(HPVo`hu9zfP42; zpOqiLXViy1VE{j3w3iqAuD;+p?y~QRkd=+kR~DOJ7nv%ir<%C7D!mremaoK*5csvZ z-0*>lb1mSqi6acD-iOBCgQtmz0H;4GDGAbr0B^gjfsh^x@p&7#Ut+0P?*-~SCi&J? z!aS)DAK2Aj@vFwWShEGe-pa5;Cs_^l3npuKpYBg?MpKBHag1V?hN&j}f!cxdY?zw@ zi#1Sjy#Hf|MA(z*wQ*u1iB>VN672!pvrIdKxQ%a1{Gszr^E?iRzJEOIBX}>ubz5df}aXI1K9EGr%pT(Y9Ue_6?UD7tltvyD%dkd!Tf{)@T=!BB`_kEe*8wei+??w>(ZcwMb`Lk4rv0qJrY2zJ4& zCeMQ)J%n|e?fly$+i7ECN}$kpjB!7K@?d=K@w$NI_A|cg<;bNfCG#Gd`jjA{IKge* zq@@VVm0fzlWX#02ZsE6~p-DECCfI)@zAy9Zh;iS*ZOK2_iAR=Ngo=A`Q)3)zRayT4 z+fWy$AZ-ADH3yx+t{kM{k_@CK^Y5WGC--I@$Su$Z2m~$ z*n0fIsB83CPn!y*gXa=FwuY_R;#<75JukD`N{8ZyjkG+8vjRiI2rAZiOY?6NB3}4- zHIB78uHA?}z?7_pT!Gl)v`*+D9oj!d?A6$c7B5_7!EqlGW{ zp)Ufbz4nb(I44?6#j6?|%b)aYBkeBww|`aX{0x6cc#`&W@l|Zw-E#|ZtQF%n>g-C0 z>g?nA*6)ph^+1Y@`w<_C_f(`HCOAvnXfVD#plTdIlCWz4$%MsasAn&l-C9HfC7oME@N!yfJ9Bqg5ZA_; zZPTysoLxM%nHk)g`7G=0nrT9OLR&r~R@n4ndP(5ANo>8j61}cSWC>c7vX@O1J?;3s zh_EFSrLfxH@RGl1W&QDWa5}UgaBP!vcbd~TGq?QeC;uM$h5*+x|7ZCAfmxh;(Hx_! zmK#P$9}A@0Q1$oz!#k+1$He3 zis^?W)?c0Tw*i%)1vUw zXF<;wG-zYdn>{u1Jjrb0D=vciDzHK0NX&e<)Tb&ouE5rCsM(t6*YB zu$k^bCT~%K&U9_g7Oq_zE%toriqoAQXn)3T3aeT*YSaJF?%w5{(yri_ri@gRz#;%Z z14=Fm0YhMR??0%H+^eDIGkqWK02jZgDepfeP?Vq^Bnas<^g5x(W_^*uYNBJJ_Egc@ zVr;Bo(Bu~BF0W-Pu_WG0!Jjl|W>1!KU##D*G@44wq`17*e^^X}+NHtq! zFgb%t7RMkl=@25#7V8pD+qd@sC~WGJkItTk?nCAB{?n^BRgaPE>$mo;FK}AcStR?7 zOWaiBmFd{{mS+2}6zzp&?Q)*^el53cD0qDvx}Cp5sovC|G4mSaXI>PT8>CV^*OiW} zf%j^n0EW_8Oo0)&{!N#40oTgx&58}}`?et~u9-d0{_*C)Rr?_@uD(b)x@<<~CH8JZ zrp1)!xJ2S4b((xCm%-r(SR~WMxAaTjc;ppf%*RYUeZjffUpy6Zh7uBkJ}w8}h~0eb z*+EiZPV)&ldoFr#*Doi3tfy zlseE82$vC-vZA&cy02apdO!a71%mG15xJ;GBMV1kl2a`z{jRI(W;+PsxN>2=p_LCEG)+qXb!jCd^aHng+6f)?;zAGUm_w;}y? z(6o21$&e%I8uv0=PJjUd`FSp$G-s|X@cOb1iL4~z`EB+kn={;|DKpC0UV#7T8T^=U zn+v=8XBUOc4hB!i=@rIh8cdT-+w6N*ymgf>^erdo=Ss~1B}KE>cj`vu$c2yN^#hEL zJeS3UmxiA4!s1F_psHtqnuc6tpj+0ICj-x|0x8tu=K-HIvxk^A4@?-I1^6;_C0mp-o_ z0xHJR0n?!Ni7WTlT9qV8Wxtu$+zcc&&unt?Qd`^vOYHaFRSJIDGGcHTB$tA8JPk*} zE+cG_qPCfr>pp1h(>m2@l!Pn=r{F}>qMzyb>gT>i`D!lD=*ei9j`rH`Y8N2?^9+sZ1&J%)z92sA1Bl9%Z1F|P-g8x|I?x7BxZ z@gqfJ6|b3N{L5YRDI+s{*pI&YpxyOT@60Y`?TOT?J^iutYCpJ&ptd7`py4VdkOj=; zujeV4CmOH)|B!g1M@3IU$qyZqWbz`KD2e&^BHY_<^UOO{5BLnk)U=QLhZh+|_RYpU zHrK!V`3BC+vzOAeVPCjT`F#q%Ft8pXNJz}@`}os;aEPWTKRZtgycAY{*{+kY$>-lV z>18mUunoOnQTg+vvJDM^&>YYzBmR&Xcg|dG@yP2nuYxgwEQ#(jQrgE(s7PmTooQY1 zN|}Do84yU;@bBiwhJ@hYI!nwy5zPRBnjj3r*swjbe3c)2XUUIF(x>Q_ibIt!~N z_9rwa1#ObQ2V|;^yz?F4#VeUtcp3zj&)X|yT{5e=*^RLVx}p#AEJn;4b2v{!S>trF z8_YkgS}*m~|0C(lqoL6M|36&r6)H)#6iKp;qOxVnwI$b`xkBw^#8ogT>l@!n=~1B^wOd(p>`@Z z0kxZWr6Z@5iYMbFswsys2SkZ>zK}WQ04X8iXs^%uD494DrPI>#KLj=`{^-mp$)|CP zdSNr{JJ^}FqwRIBZI2wD3~pdWu#lmeY}2!<(X`i~i|x8R_nGLkl_*KkQs3#W-z6(j zp3ql)K&-q5#Uxr`PVGw6uHLnMy1Uq32|F=g*?p;QO=ZgSyonLz`#L-Efj$4OZU%F8 z|HvOO96Bx~1L9T{p5zp$+Ht)}Ib@)8uJ}y$LF?y9nE;f`dAVJJE&Yx>b;Z}dpWc2R z)XwWZ+UutMV}ubCqoZ{G@xUMBkrgozP$U#7^9~rM`v!j zx4RJP|3}<)plybM60AEU+VM6}zs{*#%fCJ(dc#;!CIc5sFL(Jn1ZAGXh4Xx%Qx zuVcIK{XvXr^+56sY$oco7nW23(V#f?IYv+UI1&z%(d>?-9+gJJx#pgMr8hmpnalM) z3331dVMp^<==U^nijqT_6rw8KMvfav@Iz@w@nO1~SRUu8VzS&bBUo+v{h+y#M??St zloGyfwjOn0{#ez}YTj+_VW{5=jb{6bhtecM24N^^fk6r%VooovX*NXZo`1`njh8H4 zJ$U3oFrXI#;3sZ^PChIm1lGa;v6+aE61(FkY_6xtS zo*UfI)9K1~ug%G#CiX?e??l9X4rk?bs(0z6!T$qM=@W$5Edp>H#({426yr;DvP%s8yd zgkIY(&JIwyNvbfE;h|pk^?jjkx&2Lk-Yzu~Onw2vZ zv%L6|GOeZS?t<-)kyMOZjPoIBfg&|-@rYZPZZ_@J)=ok|*H7q0i}4s7ym9vpIXMtK zTvFb7!hG3QDfJzl%~FU4#49;o>mc{+EbV^>-r)z=#iH1^dy9G)i&_ij=iW7|`_9bH zcuxCaGs7ddqMMs`bzt~HbnSM3m6&VI$cTGt4~&QwOpVV6u1(IfMuUITadl5nKFxK1 zCblgxi@tUGLT}snOk*6j)BlqXhDndhdA{Qo<)s`<-sV5oM#!huGIrj@pFSN<)vH*> z6#l)h{5))AQ}5)Z-6i$E`Z0?EBO8)uUW9G6JsPiDYw#5F!`Bk}#>am4WxF)D>b+fD zO$eq$M275+pez7_q@~6&L9qfCWeOxf##BSeCepHc_yUT^XWO#f1H0$ z1mY|A^dkK5JNTA8oMZDo&zPqYo|bxBEDvBaA1gv6+Rg;mf9k| z?upAdT+Fy>d0NfXaa~8dahs%DTi(0V-IlX}n`}GDuX2gHfwFwMymOHvINYo|wYIO~ zo?WYh{Wq?rWN>0!%x}(TYGTXd>_h-b7n{*p%#w_x+zFZ_2JTs6R#!-^%!=)5chvJ= zofc*`H>2ZPp1pS2WqG_^{BNiB{F4&*7EdUs$Uwy6c*{krbuS4)i6Q z0G};L6-1NeoPBOdzqK7{o11$1F=Ao3FXdrFNyH%N{AlN#iz;Zo^XQ2z{ssH%itg1> z^+d+a((DARvD5P1827~(c9=ut;I4b&qltYBQ7@OJga<1U7}?UOE+?1W!ij(X^zf!q z6t|e%utIsv532Er!*NG6gIMZor?mDoe4PUKa!OapYamb? ze~d}IxkebBUEL4jU)x(sqDQirT|3X3qc8g4BZv1ZOS9c1!>DU55?XZ~sMv_D&D&Ey zr@qt534^-{7`>8}Z4jvCK}$0iglmtjIAFLV&+#9sc(Kg8&~|NA@2gVRY*h)0j^mm7 zNa3l{cF`o8YTEED#WLq*a`CRqR#5*$n3$Qp!8{WqocX%dN}=k_i!f$iiR?|CIOzBV zX71-)^{ZQ2k8vk=>$-e4_w@K<28G?y9HqrU3sU(z)o!1+*>$dJ|e0%~yW zMXmqL6oyEx*|>7blpSwOyk@f>mWp|I#hK5)nn6-Ty9k@PC{s(@-9c+h?VF)CqBUoJ ztkM}<5vbkY9?>S^It5j5v5D8_cCf#A6sHn7u|7GJx`!K@SKM*k+3c?1b z^SD-kyJ?_=mGE$UwT|~!7*dZ##bP3$6m0)2-JWK0x7erT>h%oml~daL&BVqa#$3!* z7nY=V&L@iAFYN+V8@hBt&QHzoyWT3fRU2(3Klk^2m1^Ji^c0%FQE`8ik(q~fiVyDb zs9%mNO`s&v{Fv9v;FP^@HTmjfAUqGrJydwv{EXS_s&8@9wJJndq-B zH1Wf)mp;@fk3j!eewIH1`+(th#lq(8PGLy2-C;wjGyXtsF5tXAd%O37xAg3lc5jm)^@M zyOaOkjlK&R9TW&JiRS&@zk9^8(EF_Hl1XppUc%JpjiA-{oxeu2D!V+0JGCc|{$7~B zuxD8~)~9waA!BDW%VlR{oPQT;U`G3MC5PELvwEe`YzN&2K6DRbwWqwqUc}Ebk+`_j zKN$rg^sK0MAxAlbxepB5rMDZRT7d)Zq9|csTQM) zhmX%`Cd860vDp`0>vyq=g$F&UCu5K5ev~Ba{daG+L@V(cRAepQ4R5z2OZEO3T-iN^ zwS#;EyTgvi{8KEDLGX>9ne2y7xnJ%2scgNIoj)e&sj4y@QYQr7CnF4m5g-uALVtG2 z@(!UL{|+!I8J=rGb}pf`t5>{1z}-kz7)aukBtsDU%CCWpYqNoUHEUR*@-*Q z=qaDu3N8-W@z894o+l%1q#7B^&<)5oO{bRs-PZx--}CLWJI_CK@uA%b75{nsP1YV8 z&`CUnrnPMUAwIZ~@L*XyoUqbu9J@=tzQ6UreRQc`H+CwnM#nMD1rRSN;8p0hgfa%E z_t=;o-N=l|&}n*RzP>0li*xl~T~k7!MTcZQe0z}^HJBaci>a=YJuW6?dd$cg#-)qB zaXe2EW$&5-Uq44wysWCWnIMz>Uf>ldWaCzynCR%s;}4K$P=MNTi6QOv6UvJMR~n<9 zN15e`<{CT-Zq?8>%sUaWSM=O3@juR?odi5);y(d>X0st5X%dVF9n-KHqM88QzxS(B!=F1 zsw5dA9;WG|znBSd3Vsw37de3*d#VD9P>}+BM*&k_t6T8dzxvbD5M{Ulnh%;in*BO@ZE+-pBqFRujJh{gYa!+$1(Vu7BHz~|mZM~HMU+Rg|469)7FR1$ zL7Os{2Cm*hn>H(K^^{iK4K(vb+-9cJ20Lq6+u6@S=o3F7c#rwuCrlM4T8_0a^^CdB z$~wWIPkes|?ST#}0ZSZ2w_UjK^=BVW!V6O4_l_ytrd$ZLU zWK}el2>?AK4*Qzeh$}OloJnH5s?6ehGf%CM4L0eoZQk11mdPmycJP#)YHJV9nS3Rs z?B*tZ`5w!%c#W~wlBFcgUr$|V3n;umUe@)qXt{ClNPDO~ce$!(x~+E=b8lrVlYi6o zZt+HpUgbXa{^Z@+R2BQ-&7hHQlRx{@=V#Y-uqJ_h9|5G%d~aMv|FaZt8blzRPM%z@ zp`EX7PGnmZd$m1LwDSilotO*)!DmZ|n1A0_Bb}u1RBoiTL_+f);eTwB-`;-t#@dLJ z`xa+q?MzQhoM>8-gNK7|7SoNk8f@uMnEBU3g5SX1?VWoGSvwI~j{Nu$c#JtJZ3E|7 z=f_&w0%M4c;~aUJ)X3m(khM;YdK6Pr9?NwB_XI{#Jmv!R>Xf^R?qoSxxV!Dm^)`8}Af2wgWm1zyP)tfz$uedyXOOg!pbmEPXX! zo%oA0siLexPT?tMhJoMAZu6$+sFwpPN9#si< z+ROQkT_V^Iccvhxr0-gGMh$-m4jbbVAg*t*D3R?j2EPp>E`XR&X?K@(X^ubYKnfh7 zwnKkru3Zdt=|Z^%UpO5P`J}v7%rdX*608G>-v`F@kPRcq2`2n9L9S`=rjb;xNh_0* zD^sXSpQS~p%W4rTgly7`P@?G@@pf~vSoiq=SBorks zqNn->X8@Jw4RgT{3XNMr@&$R$aSHI9GrFc!cgtQ4@>7D*+S zCkZHO_HI`fwVP9T5h7AmcB;&Nv?5+u+4WDMmv5YrRKJASwPt*COYapfeU6}MCeERJ zy@e_NfE1aNeMwACl~%jJ=0JPYvo$NRJjyVkVz6!DCQ8NQm*PC0P0(XCUJK-LP7w$& zGnBKU&HlsjOR`YUq%37$iZpDDQu=f74*qAbyC(e zxV3)57U>fDr3e6ne+fL~w&HCp^c}7n`wn1LGxxC$$k-de;}CJuZNzr|@%8m(V3@FmwM`5`J3u(Hc9*@!=qOy|$)tKg1xCGUE^5G*rUW|}6Yc16;oL8%MG`G=D0;zU# z*|`Ggy7$FKP#K!Ykk|S3hHZt2cKutRTR~tVnEaGi7^l0??{S0+VP|cm>SQKlr|_`M zStwl}fp9^&#YP8zkJw*I(aF*^Eb2-Vo~N!$W{ef1Si!4765IMzo&O;!*g@rnS*7m( zLwsk4bX58EcV(+ca}Mv45-7Nz`)uW)P%ncF{{hc4=n>Wk>uO-T|AP49yIS5*GGujZw=pawf`s`hLE#a-0Y%24i&yg^k>FN^3o@kt*re?+MU zA$w4GgA|?{;Sx%1UX9hW>{^w0t@|kQ(QEi?T`-BBAJ_hcVS~~g2esl~kR|^^m_uE| zLIvxPILpjixm}3E-V{pVCTX=wzHgt@h}wBy^u-Fc=2V5 zkc>dmF$B<3^iw|k({=8HU#cS`qYc>=Dre^z;fGhu77d`Md{+33C@WL7e#)3rK8*ql z8($!Q(#yB{b{w_{D{i6-zByp;NbT{TGncknXlmwOrj7(9R&e=tR@4M(VW0VIYJekR ziDj~OBwn=BO(zkbaJ7S);k)Q6ZNPzAthJmavLhc9V)<_&goi{w9|*|_IMkigns{yC z06`F{lp+8!bU|ngcZGbF`#?QVE<_r+1U2wK&d?#%1N1V0o_xa83{l2s>k<)D658e< ztDl_wO%+jLlh$A*uWtpSzH*Xe#rlV~O9f}v;^AT34P&Yh z-d>((Y*W=` zF2d>KWPR>^C#hQ;W;XZDIN$KXr$n-I`eGdSJ@PvqlcwV=#4-fW2odM^$j?{SJ4cxB z+1KFH@!`uiJgCH-<4L&$o*~aGYBNJe=asg+g&*b?m)z^wxW4qBmMM# zlJ;w@UmUH8HW}25&+A(3o4Y^#Eud4it67Olkmd56{nrfWh9#;%(=fjLb^dVJT$nr>avKdQOz?PRt?;IW=2Q^Qb-u)hiCUZ!g_XUONzdn$M>)OJ1%{O z%icwc4ITQdm=)4i0&Sb7_8bv7&H8O}|8&q@AkS?657D{bhO}R3R>_y*z%1rC477Ls znCiz#{CWRcex7KJ)6&c=6Yt}lD!y?C^ee4lVuEJ`QaBK1$v?cGIvQKwrSZSQd>0+R zm`?NwZRk{vR-ucbW=GJa0G#vWxWiM1c=@KPsxp|^JU+ft@mQbZhM6=vsY=Mj=~gc& z-7!l~cIF<4ip5*zO^nM*!!h1u(YparRUFLROZ*|Rdr^S6xREfvmJp=T>9R*Qpsg|W zu)?v8vz-Qqu3<*l*ta>@kLAWKDk+ExtH+8uCA(S?^SxcbF`OGXn2n+c%X1kD@Er1a zpFbY*+R*!{t7<2mbY+ghA0h_hvggc0{OWsR=tx%Vk{Vk4iZ^Gm3gVcVoV9(`kk3L4 zv0+;qX8s#q$=k}CDKJns);*kRMN(KpJ1f)NbTt%)K9^X1%-n zCRi+wSJNVMmoPE>?8*;lXuRF?8+SK3{TS`iFqWBuP-T$G{Vj1&xf;t%6HG@+<%JEB zD-(v--ezme(QEBnW0ry8YH)@}pX&{OXuG_Xc^v_Eg;+v*kJft%{}}*=td>iJP*IVm zM8C(M+S>@ZQEB|8+A$Fi`eN(MRDw+YW#PbCa;CXU3L{CuwM zXkO32@rMW?Na~w0PIrDx0*g0HpK^pzd8ldYrK*;!bS#|q$BQsz)Y;l zHAI6PBo+&dtw5SWK3rR#IG9a45Cd#gpMC>KLXIn!lZM!CVtX2#mQ$<6uSv}g#m**%FeZcQewBQg37;#%2Q`FuH z8X@RB1w23hUD#bPDC;XPAoE_TK>4gZZ@ad?PbS%xroD(c3z1niLP%c3EujiKg{q-0JKuN=!P3N+Mf83oqMU6h>2^qf zIM331^dHOw%UFlbZMAvxha{yW@z*mpcJ>o>MGJMam!|bTYLB{I67T{1%u>QHkBmi? zFB2?mT^_N>zN11!^C@7>$BWXxR#60b4AYkVX;KO4u zDw)TB{m(b&I)8w^8LjDsm)9l#xNkpS`QDmh<4XgBL`yj z&QFFDiQ!++8JHf8{B)ZnB(EKx!Qbd=7qeS(T&9Z1VyIt%SYi$UboU+n{@GvB75yTW z%PSVN$U3_^qE(j)PXc+J`DsV9(ObxM3lhBL=gk*8(7iQFeL6JieztNP|Egy;C;zn| zsxP~ma9HbLK>Can=Nm30(3fC>v-FD>An@BIt^kE(OeNO~t$g{3QlRUl+^$+}RrB|? zP5nLn{Uqe+L|Kj7{h6x7^*~QTgzIo~aqvdd&T~gb0dupB`EfaX)LqB%p$Ky5eey#g z&Z>uU&U^+{Z*7H?IBuXv$s_+mZ~?XYPn!uWJq|b_X$DfxDo~-F^FW9C(*>u#xuO%MO!154Z1E4910JOe^-T-4rLa3Ug^I0?6pR>xoT&{{p^FFFjS?Gf935{Y-D9GV>%)b6Ion)*mZXWN!nGV zoNgTgMKv*EcdflII{;s~j`<&gdS%Oh@(2Bx!35bt4+DzuT72$EVu4d%N$ZrJQk4YCaFfg=&k%swmi6TI$GDB zzc7)o%ly2r7QY|&yy#`}6d5Zhe@(xttb*IxR>;|!+a}2+B9K)M%zV9p)MJA5N?Pr} z^v=FYTFNyizYX{EM?|}uP^_>uOGOLOPe9&cF(%2%6BGRzfN$+-qb1Tp?@&%g+>2mU zLg}GvWp%dGC)6`DO`6*k&mjBSfVDu2tg4|tuN+4Z4R}mGX#13oY-FVE6Zdz%{EqLE zf7SfarBdvP=dbfoVf}{v3LvG{;?V8qqMkjp6eP9s^$c?a`mHcCyhN=jSln zMj3Z)tHC5*bu~zJT9`_cH@I)7UnQLUP0m?~*Q$(wBqhEiD{hxYc}m+crth}(|Jd-( zl-55eY0`Vc<~lG;%k|o?(d%Pr)L_ft1$N?3?dQ+#7JUVNJ*XBl+G|~X@a46$?3}Nl za=Kaq^P>RzH@tQY?X)yl>YdthWjtF&1|d`?2|Sgg zOKVZ8@(mHZLPkjNb@0PPFtQz~sWD@zxa{W*K5st# zF7X;l6#Nbn%hZ!0*f83p|J*LtL^t?+Cm^PkKPbDMiVmRu&1jzr^A2NfoJ{b@Ir)@Y zIZeK`Pa5BfkvP@^T`LV_kIB?h%32NKTC&My~u4!PiUBb`!N8z4$Mrig$H!{U>30s zvrXGfO(?D$3aa0iENSpT^i=TuSX8Yy?cji@!ULkxi z3AL7wD-WS#bxF7%@VT#t(kg2g^gQ5_DQi#Wfnn(&w4<#a-Hk_8)zf$E;h?42g?O8Bo+*-;Z#1HLWmLH(%Xht2OcuXg;|`JUz;g=2hUF2uAd z2TMM%uZdR`LAG8!UYSsHBoLlZ4Ew@y+pmPk1QK~wSCA7kTE*r!TP&19I;GyLQkAhcXyYIWr3DP_xGP=k5J9rs zAI(Zy?$AGntln-Hb-~2zTq?x6ewqR(`R%E*7x1NmiB>58>EO{OUV-Vn)tg!A2P}T zxrNPe^&6R;__;h5N~oM?!`LYwY7ymb{-+f+s6S2K2%+#sjI$4L`*KKXxx}q}X*q+5 zP#Th)xG8yPMQi1g8STaF+zK#&?{gE7ZKf)$4J#x37|mD_4L6KKsIPG2o_1o9c5I2*C)kUx~N&(*c4+ zSUZ}=6elyAB;JY>zn}3(PXNJ~cuS_8Up@ZxNZfGC@X)LLW1cs{ zs7P|~2KL;_^X;*7!3;8?cdT9PjDWI}d(VDcU)c0k!}jxS?{g5bkzLlYe&f1lX%l@o z1Ql7b)f+GBsT|v^V|f!LaoR(;)bTIVWPNLtQ()6$aIXl-dkoNzYfe6BfI$)GdcE-$ zBT?NUz5XLK{2%^L#L&&{I?>&JxIPA*>}`Ujq*gn65s)R9sESYf%Ei#^h5p`e_B4+< zEp}K3^>l)pDz^yo+46led42Ax6UGJySk+7Kpw`R_Jqf@RE1pyv>!DEJ$_Vg<(v;YQ z+5MwAKRW+}X2)RMXk5r+0ltEffk(2xM(?&JSRN7mk?PXi%x+)UNjN*HsoCJ2L_jiD zDaOx3ii1W5=Qgg~1viJrANsj6+`@o9v-1`m&+IhJO+p}$1fZd!?NUc##W!b$IT+?`|fAn7e)x@mwf?1+w8eAR>S+tnIJz>WkOIO;c{5m*rCTVuN|~&zp?y|cI|{o z_|PI2t929Jgc0yPtUEhmxfjo6x$~z2T~paY|eRoEEV9d zyYYLz*^+uC_M&Aff(QlRAq+fLDeAuEm1~PY2-m~6q58Id@IkjWKUSq0v*U+~XD$|p zP1X2RYM-4^4`PJ$wO6{oQ-SRhJpo*t_kN^ubv>2P5h$`txL-OYv3rYKIZ{H3*ZSa# ze0Q3s0kS^LQOMf1shW^z%*bv5hYVVesJDzEkfYpd`={32l|}1F>cJyD9d9#plZa|d zVRJY_-^j;~RMkJJ$PpcnKQ>RcT*zOIj^6Nm97;tEKWm)(h>mS$DZhK)*U?VH@g(b~ za5w;?wn`Sj4*B{5h=a@K>&S;diqZz^!6}!Wt(mUcP;<|@1Jm!)bB;I za>zNf{mNpXVX8v1j-qCZzt3z6URoS($7bX}rR7&?0R%zTLD3XEeez{sjNqF6)DzUz z!_CFlBc`YO@Dh=C^3}pn{o)aKKCTZ=T%3dkqX6WZPPRp!$~`5=-HTCd_6Q*-=M)%A zA#mpUQU{F{;HSUMmJ>n(JmL*+6D%!zw5NGv^pWIIUD(0-NC4*zZfIzuWMyNUFI-SQ zE}8@l7EHAYy0_<9^yTi54D@JrZSdS4jD}BcYc|Yw9)u{e;>)g0>suSX1LZkT{XfHV z4Drw>wCP)(OsBC5ACC~H;J~F4-{?QSQBTE7?A7^IMp)OvPI@*m#YolN_yBB@>|-bg z?RsO4A5`CHm4W1ixj822n=gVJ7^h9O7ec>E?&bGrAII)Lg`ArTuIck|GQvh+NVe5= zxMvWsb90}(Reo2hZ>z0-ls7eYj)vM&%d#<*a%K>a&MSVT*K2D56j8U5n5(*l)A-3{ z-NXl2ixwZ(O~0G&qTTqBK?X?)oFpdtY9$PLk_7+?X~zRxQJG^L`bk1xeQEL-b7j`a z_f#DntrhRm$?3_#Y_Z$LF`Hl}A#o#=IOMHTs9pc=Ugsz#iy^*q1-Rz?o<=s(Ne1av zNTTbj4g@bQl!mhZyG*o8`Wol=UdU~iT91pnc)A{ zc3xl>`mx5uOc`Ec;J@?~BFr@!XR34{2g&7s?|QgV$D&-dF3&>67-N?$3cnc}YL};+ zqlpc3p9GE_LIA|OBE?vvsLlZBYtr4X9gt54?*$Lksoxnat~|WYSijYeKb(+p*wOoO z=-1)2PF1Rc_X9uRVbS%}z-La3+s=?PncL2;>7U$(+FF1mb{%S)(N8ES<>CYDfZPLx;Kq6?yhR1DCIw* z%pHrBM;8eqr^}HHX9x_v5sEs+<|=L_q3y=+WRQ$L`ciDX=qmW;{HFU(#ueW?n5{v@ zz{(H09+)~9i+(x8lcZ4ZVk^)glMi@+rv^S*t{E8Tt#R~-n|S@u9g^m5bdzUlOk=nq zvZ~DPiz)-}>tr5&hhBRq&FB^Q05eVwpBmVX!rpXqH3*` zd>Jt@AIwc2lA0@+JU~4ncwL9-a4_Q42~pr75hVImr*dperei;&G zMG-E*pktS8xX+}5VO=&qB%ulWo1%C6Xf*JGO0dw?)zuMas09sTT+|k(=XVnu_l~~0 zzDho{%r?=Jys8}?wR3M=^&P%Mt8-mZQSxwoZ+D0vULKtC%;N5FHG9qfAoM6e>0{cm|l& z2lhm>04bH&e?B}E0@akP`hZU8XrR${iGvq8h}4; z-thlq3~{xe;}6;;{wvthkKS-*aW6v$<>`mZjL z^R%-PFinGlDr;KO=ZZ%EK?4~X(|l>GbhML=vZG6O)I45$JmBy?OI-DKu#auJvi(F* zLlKzaX#9mRIwxe4#>EY8Y{_pLgRJDLgsUrjfGagSGc!`!ZjTAl3IT{|^&p{qx@~Py zH^b%Awk0hN+G!X20cq-;UNw{#5%^(lAXUlS$hH2ZjY|MCNl`b>5U)MMRM4W%9kR5ev23{^}&f9B-Nb{tZ97uK#BAvTfiG{>Zo+)t_u zhQ5N9de?2rsi=TX11s=3Ekkhe%6;LrHmH7?4v4icuEna*M7Fdv{!Fhm&I;U|LOacm zEXDs1F~T|`GD+6kmK4FdoQeSuR;MywXwx~k!rI+iZsqc!@7?mb3CRinRyfe&Q?9t&POWUZR6;^b2(?{K*ARP&ZU@sBM9 zB+gdFJC&H326*FlatJGq6aEEYmG(C9<$XIlJD$ffX&m|A?dO5KPS$?iss-=s!6(#x zw0`u%`jybQ$WQxN+2aydLf8C184?upGL+`{q2ePaT>teS`3wn_R2TJofc8HrD-L{D z;=O>+jfUWQj2cq z)KB8(Mu58(Z&P*SZ2(<8tg31nYB0<F;_uyTyadgJU% zlN;CJ255$39Qrj6{GmiWQ%p09eS$b3i3URjpzBrdyzlR!f@2c@xdwybHJZ{}8F0OY z_%NSSU#O{C&HxM^j!E%oin&!?c_#c}Y36FY-I@X8^CtoWReb^zbv<$n1Pn7%GS zFChX1g>@M4l~EC%wZZ^;cYyQD9BpBHe2K&6QY64$XXcZaYVW&Z*Z-?aba4}1-`E&y zc)2!(M{I>J0Ug`qf+X}Kc==%dt@`ajvJcHQ0U3l{)6=rNV`ro~5q5|)o2rP30_$V& zf1%Nb;7lsB)^EIBmI6fI``66u(ogs^&^N9FADG)EltD_EUoG-}2z1}xU8cuIYtLyB zY8>qZ*xN)$-}6?%p>17Z&hBof7f>JHdS*y~uV>!~qmOVEXP=F-aMN1JGpGR)=@)RJ z4FUVrTtS3t2+-Rd8*RWukR?p%2WZ+<8482 z(1^yykal+?{j%W>hZ(SYW6}>@@n0vd9i*h~qMg4=aaIi>c~WFj((=5LQ<8omDZI%C zt3E0C9C8&_HunXjlb_l=6jHda|4PUpxoWt^9;%XQ@&|M;f_9NII7!sa#9Q`nT#06? zuZ_lnkyB_WIFvE;ODRGpz`X>p>wfskZyP#Cz-(&wau^tK(NmJ%75jyDnI0Ip zO5Dl?Fn!RwYEx5b8L$tqHq1ao3_(l;xeP=H&WQTlLk0?O?aZ8otPPTq5$Wkhc1^?8 zvZ~%(AR+`qUxfoxu-J$_ruB>;u8^|BRCL$cIFMMki&7PX2vV2cd=4t)r`D%>@LbY5#y9L@fV}{*;r9Po zH9~9)o(p!;2kw_4`KIYSCqRAT=B7E;L+!yy*zk1lOb4y1e*l$JK&;zJyNbqtZqTgEGI@I@&34To)&JU5`j zoQ!yH*;G|?q?_g{2{jETo8RIlPJxINW-*Kx_6Wi2v0FYk6OrPn&{;ap7!$Ac1L*il zv)=Heeez2GI#6{aCvqLzuS*@8ZqN9-+~zT<4ak-!K-kMph}U}m`60vuu1{fmWPURD zI`{D02iQ0DE3|Ck(2I zs(gJ5?3`V{p;#8<%4+ne!vko~{)m1q0mfj{U{(r+bTbe(G`*EMu+a6E;du=kvT+`) zJ|gYsa1Xjxv^~z#Ch3`6rlxrSAq#RY;6eyh36=41=v(KONu>zMmGL6D?;AXA8gTw% z_*h0tK8PrIT?So$P!hTyoP|1z0Fu1uBJN?MA;&Wsz*tx}mB1Rf0l=goZC zuh1xy&kNAk`9T6WFQXWdOH{E+EVeMmxYZFX8{E&qR=<%63JQ9r5gcveMy#aU?s*1F z5;xMCnr(TtYq`yP5_lAkfKd!*7OFWaK26}(jFtwQ>_aL^sHLrh4CV&w^l0@S{#jHU zR^;RIez5uzdx2xpGS>l}myY1rez|`C5CJ! z{yraba_w0|$j+$x!!-|epj3mYRyZg)EkwO}!F;6YP2R!tly5XLy+<}#*QHmE(818t zakj4uJY7dc9*jrF#e{r5B#4kW3Ro@w)8wyY55futm)wuks3>zMJ*SL7W z4%=4n?4itLxe6EmK53O)-mg!KJ|k(qJtdKw_ktLZRMcXPtE0TZDiXW{-+#sx*us^^ zF9jQq>btn)Fs(~n&@CKXkHLSKnHXE$5B?1XaL>}lp@f#Db=kjN)DF(M^Dn}{gU-Wx z)UA7%fXj1Xuse$c1gUb93r9=FqY{p0OsvdwatI1umy+`R!uvvBfcs^J+zBvZ2>{C` z*Xl0+Dkak=LiyMEZ<(g0a0`Q zXpM8kR`3yJ-G(d!vV7Mu1hUZizy zYkg_3!2I5U_XONUEgrvpUi}b0hIk-!T}9yEDj|pra4`9TKOk@8A!cgU(%QSa$2$6Z z-_p|D9ONYg-|n@q69y0uXNv+?$|6fEe5N0KeV;7@&A8gpTfq}@^>DBa2@MTh3xmx9 zT8Ec6&sklUy$JoG`%*^EFGN$F{P3t=Of};Y*z5L}JD=r;S5c+I$+bY`3IDCfPA=$Z zKqIlpReKj;nEZ5g;i;JDs5qKr`_9tQuVdgj3PQ{9xleKg#V|WgZ`n)8(zaUSy6#rp z%*GO<9PE{n=0Jp;EfQ zMTA!AN)h8Qdv#rqgIi93i_cbCdbkNJhb-+!is1lPS{ynH-74=CW&3ye;0^!jClsXJ zPQj3B{G;!CqqV5{Me)mUU=q|H{uebGDG62>m%%94{fq+ud(kgsiaOnNAK@2SzY%7) z))&D9g8#~Ga9W;DM>YI}WCnk|h&S7?DR4cUQqO$T&;uo;N4l(L-hV*VE@0)?3N3 zqnq){ZCS+=zM=sKzwO7L+ij9?>CNVH$(Y|t^>0AP8-drHdu1Q%(cgQgv5CPRmd3#C z2SYCh1-Rchd0qUDb6tfRpZWb77 zeg*K3-8;BpL8N^iJbPPwFQ#)G6V&ImdS!@oJ_f-i-p>S_BnB@+c=^`mAcxM(pSW#) z3#zR3MAtPYV~+J3J>HTuvx)lZSqq_F_iCITA7yQO{SF+zEUl2w3d8k8&-);v;!B|_BK%yR3;sAFOJFRBdP>)o8Fv($|vA$!-EEk5A?Nk9`LxK@VMCKn}>9O z0S)B&xW6~q*g4%t^u_5O@bnx1Z*@PBuVXDLx&fThurM|9sTlk~hj^~1WR)gh8<%3+ zC>34N`Lw5~_-)G}1u`f&E*lMoH1r5QnLSA`4e9bRP+5=~4jO^io~6Hg(AcCXfI z2we$Tg$IJ$R!~JBAtcCaXMM~mkfy`ZIeDoIY~89gxO7R)*^r$o8Sg))6FooldpC_DgRb1&9=U9wM?!rai>@&(`K4G2UaZiTDv66ZJ}$ z7letRH~JMe<$@F7xE{WaqG`clTc7JZD^z4I)szZ}%R`79;2}sTB*37Z_2O=63Djmx z)FqFCi~Xo&X&3lSR7(t99!p1q+y+^2e(HL;}XmWWl0Rjop#6=kJc7f;V+Q!>JT1+sS)s9 zBHBZB{GYwrmR(xn-_z71uuJv2SN0P{D6l-I!OZO7i4HM^oW7ue9}xP{zSmF4YK#Hk zJQGF)lBG-)>i@s<;{tP_ub-f1NI86Pwm!hoLI|1)*rae@^Uq5^$gkAbgK64D;9eYa zH~IR-qA$0gTJ_`v{G?7kB-}q+2_@6<*xxIIz;m^yYib9arYBdz?hI6#=;>zJoCtun zEJOdG;Bk^b_-B)~6fm&JBq&gznYFVGf$IgzN=waQ0c#s$rJ$|=S$jx>T!L;Yk^s>} zor7YlWkStS_%m@HCws=mC&8J_UG&H2bQd%Xd%@!!E!zUFYG5)+Q-I-$u!C#!;BLVg zzq{gDE0*~<-S9f1!Y2sg88sB#BqIc$x2Y|cr^o+;bUo>iG!Hind5FHDDQ(Wrz~AO@ z;6ZLd4y;4PJP_+@nSISa4}74*R)D!?k~I->r^EJ5-dQ#1Swrv6xx$W?7+kwf zHX5mm_eFRmOTt$Sf#ivs94Y|f)6?gAV#hMYFZ`6<>y zfFsA3mq&C%o@8Gg^#u}&F}~Y|6tT04poi61plKQDrv+Gz{Mwo{;=WTL014sm9dh9``-2=M-2Dgt$hT`?Nm$7EGK)2q3Px-wl0uZDtzx?(Z@C}}n#xF`F-Rp~B# z@<xo;xHf>Y1$`9Q<}+uZ>ntCur9J+428>O}!^mq5jr}UeiQK zqN|?T3gjcqsZq^4lD<)VLMA027~#@3=aL6dtgQUb6IX1Emz< z16_IJ?WqZ{(4w8~f&;4yGfNPj3`5K5eWzFcb^QvT1EU47i;dl!0wpA*c~Mb~o>Kph zr!S9(a(}~q%o*nlI;SC&j%sK~vV^1T4F|^{NyajR${Iq9N!H|0wqzaqlI&~t>=lu9 zDw#R59f^raVo0?7-rITK&s+cXX`XqWXTIP2d)?Q4-S>rwHsTd75=KSAzHB?a!Z;D% z1CHoxz46XqzH=ohLGE%|E7SJsd+5~+p4kizSj>Qla9{>I%Kg#`hDHqV$}2rkyh|0; z7z+X@6l{Q#v6JEXiZh!8de|%fos9QRjItjW;}hD`nywV_fZuhWqoqEm3#OVkV9L=( z*lNRa5ZIA?cCL4-gi~Q;UF+O0ecbI&6U$-wJJ#bt--E9xIYIV#WB0pL7`sQ(bFSKU zU@N@sbw4VMIaPKHuaE+pHHLPleJ%w=Owev*eP-|eQwN?~3Q8j92?7KGFy-D_naqSO z-Fd??y3a`|3b?mq`IZyjwyP_fos0nH%KH%jGrI@G{$HSTj_eN*eW~xb6=bR>{N$w7 zAoH@_fZ@)qD?y>z4W`$6046HzRUBOZ^2cQ_biz>98wAp@_&y>+;Ezbln_*mB(n+8F z-0A&ev~zpm%5Fg1MKw>iSF_ey5B(1*{gJyl!?^yTen|GYehLH|t7@&O4hOfpb2l9R z+I#xU=`&{(j~r2`0$rLgKLun}xrahSHBY%*?QzHz&k=81i@*?Z=Erqq%TNmq+S9*( zcJo$&c*W@xA}aMsH6D1IBDCObHMK?C31hV`Z>7VEKFz*gzmd4$5c3; z!PFQW%Rco8(0}|7p}hIrX*M!p=i0IBwY>e~V%p-`QhaLkhastAJv{7j&}81{M^!Ae zx4hZ8S+cX&hq<8vws}oS(gy(dKU=)<;}`?xkqqRwY|R#g9s|$B0I%JWHE_c*VAD|x zRH=iaO7ADFBgf)W^0T2reJ{nZLmGcxc(?QCzhAJ~Ehzy&;3Kt7Cqaunmr)V71gs*V z_J0*ZuB+hzI8_}^!We92`TNpJO7wR_vhZ#k?$xdAfY04Yz#_Z;eZY3Gc1^nts|+l5 zA2F>_f44aIjQ(-;!kf>byN?J6&@2z!Ucn0TqnC-hP=HJFEqqKom>NkKBXBIXu72DK z%U}8tH@We3r^SmQNjXs0?@+Ck7m)HcWOe99LqN~n2d*r zhvk=nM{AK9@M@mUbzqErzxXORtoHtRyVHTzDpTLSJ%9MY@J2>R`rwzGwKPV+MW2h- zhP!3A&mWgRtZrx@F#+H0m3HL;z)Uq^X0XkHJLrA8`-A}3M02hgA+q(Y?Cyq!u<2IY zgidnc7j;!9oFoyENBAowYXU#ac3&Un00IEvK`-31=o=zFMF=t;1zR7^M(4%9YP}7V zc2A~LcQu-Jzc;2VXkWlIoJ6@ZAXXI1Z#RZ*0=p8%qOYS?sPf=_t_5I7zzxMy4uulx^-yo5j zm}n0RwA~FI*Ze&DP)bHTR}j(N{*9I8$p$%Kl@2}}mlRAm@T|Ge)TS5C0#d6Nyh7M9 zcJu`xb+Uo~gM?09o%Z&)DOB+2*Z-lz33TJKbTBw4P#}6xfm8Q*Inv+5zUH^od;fJ& zGA>rQ3f5-wq*viM2}&(5Lfyu{D>f~CULC=K=Q1#eeCV-$_Lo`J^;s!yheq*kkJU;$ zSj*?Z7l5gJ@G0;A782#vho#9DO}LGexH}AP$G!c7yT2jGcYc$fyeZ#(%63-Ex4wt{sLnKXY5p);a$pV&VSDob9)Qsb?{rL_v6u;FIxAGrvIgLmmK)$2JNyW7Tr9V7kX%# z(#%fUjYv5fCvQne7VsDFo)>|t-;cYKe$W*REIVG(DM87W5AP)5ZLRU2W9auz05@`< zo%{dG{5;t6^Y30p#1^-Li#gd6@OIPOQTfiWd*w^ly&LxI5>)^T;?m6|D5?CiQ<;>s z0k4V*Ql*KB-^9dfXaMv3v6dyUeKj=&TjJ^r$Qy=zGcH%AkF4q3T`ty2I4g0=KB?~mPojcsULmxiwC()^Tra7;b=wYl615S>?( zAGxB^YMkP3wYt%j&*^&bKJ@0FmDi2zK-XUmT~P^YrYBi<&is--_ic9ITj{+KAh~us z8csr=K=yU-*>>;Y6meg-m(w4<|I#$kpqX&635?E%z&ShTO`|6;p@0AF027cw2I%AC z`h9|Jv&>=)Jb8eLlt8595h!ZrO;2lHe+P@R(m@d2cR9u?nW*Fl$sx?^TIH;8-cP`^ z%E|0sfx;cH%uk8Cmyd2tvz7zHK-0g)RhL<{2U-H$?k@%S3; z?W&u{o4nxotMscd-qRLZTeVYLy47j+<8G?}csB2nY(PjtryPW@dn0Qa{Ml;)ZXhewQ(Bg;xT|$ipTPMfbS(YasxYVIN@#yn9yxE z0%%^-^(6M#q)eXNq~_ewYZLsPJeB7 zv+*2za4*j6K%zcY*g$}=r^a^W{rkxV{4OFHkA?jHfR#Ql_`7L)RZZw2?OX~MO!y|R z0zsM^6!_)Km%yf2*-SU^<#o}|;EdH;CQ)Z6Kpatb64)>QT@z6jW_d`iz8Soco9Tf1 zCJ7P}KT|^Ymh7yS?ws*_3E2ZEc_&(2uY=qJN?f47+M`Nc+jiJL@~w7oJIEJ-$Agr_ zfBC5{6b6EocRjC9@8qr4vf4d7b_qN2jx4BaTirc;^XD9A0--6b{q)wR_hfw?P+AU$ zL;b*!1i5d?z(fE9iM{F!8@PXDRRIl1EmN1ZdX=TO@7$(t9Y2(9d5qjdYD4IG1){Cz`8>&$OZ5x zAZn%!vKt;ip7PxxHx0Cl;5<6=02uAkbNh1#BBRkFwsxOCfA*fubBBmIW!Ls85u_Z@ zAml=wXn}6AAE$edDCP= zr~4*Q7rQ*e)rkgWI37KBR|0u+L@UoNhMTXn?(mDksYx%2F07!SjVmu}h_N6{fT`}+ zf8^!=_0Q^LHf(Y*aJ+lKRF(5`WbxDTQzYCO;=29x@7&S4o{MLW9nQVs2u^T?Q3awv z{eJ)bvnw20;}yi8#FZjmLRsCkCeV&vJ^6ABw%RTtW$aOfQ1X}JFMAJXTFSJ5MWeR? zpir8}Q^%^$8#LO=fKmo{Ndkc|zrQqhaMBMv-rrTFMmk1I2nykcDkpbVE8!P|+EKHc z-+%q8UJTjGP!Zc$e)#~*Xvc>ZzvQcPk4SK}ZrH8ETLqg{XJE`#m)Q$rk$oqiCI-z1 zK0r{v56V@42RIzIPAT6m4u;l>FGPK$$&Ya}zzQZ{T3sGs`(0thV`5~4Wyrh=lvArq zlMP43K_0&65;5UGoD~tD@vPO&ucAf1^HAvT*RRfwz05uoL<95pXHR-YVqx+h$~m*|Y4CWJ=XCDc6m9wqodAX=t@#a_h>ea0yh)U{claMN5o$fQ3&Q+Y z0I2Tz?w-2(eD`n#%GU6%&1I++u7yz-y8e83Llv6s;ha zJqbF7FpBODE-r<+jtoP^jq&V)kw>3fD)qa^UKyTS*K z#UJzTw#GyLYNd?n7soXhK~W6SsS{Q;l(wLtQ&(qSj*iag4UkLO z%9@^p<*HT)wXC4i6nxgFF~$QcLG7#c6S+fjndFB_l7fU&zpY3@)&&#PU7-XB>~iY?I1op`%@h*{ zz+>er#Lkw67w;!*<|3ht9j|(2ZXLKnVKfY7^l|g~3v9S*KL%w3BF)@B^Am&pln<|K zAbdX&E=mc2uyZv7ibs3Q!IoMCaJ86%E&Q03;P7L%lHI1U_2Chm*j5QNK-ZnTpoiHAf<4(4CL;j%kF)#*}Bo|r? z`o#cje1-w?-ob5}JD;zbUW>oh$JA)N7HFs8D}Y$k1P6Wn+Ig;I=jP4vrLni)?mZ1@ z$$W4?DH&-@z3(Li`P0Xx*=~&th-p^JX!uPll0XF3%BCuxfItd4^-I>vZt2b-8n7(f zFY0yV0x>Xf@p=x0jR$5Om+Z5*RvEIOJ?XUDp$$8H9)>-2E0!pv9|J~^piuyi>SrkS z^v1=Do84zO4$t0ab!+V&pbgrYQ^`Pr0sjFo0YWek5-_cNZB~ly-pkuO#hq>mn+6D) zcRd~m`E*d(BuKe5Xf>}+w|IY?nVu->v%TA-O5OfponL}T#zGHaUU&D_#mgIq^R2Xw zsDHYc6T>(w5dG0 zTxwPmcJ9pI_w3093c&$hqhn$T2mL*tN>IVAceqbQT=mLWrSOhc!;q|g^6p<^d_P|T zn9oKh?sxO)-ki1HnEi7lNW1+rWI&)H4`iqPUqY$U3Um~Ub6hQ-?Co<2+di6BI4JS% zp1oTu(DqzESO<((51Tt5Nuh$iDr_Zt=WD=+1~FyjA()aCvU==}DTc=qIvi#%?EEzy zy7&HA;5VPRZ#{EbW_IU6uWDdk0O|e~)F&ov=AmX|@oX?=X#fSha;Zw&?40wnkL<#;@AXlm0Z`WpD`ca7;jStQ_gcMjE7)a zU5o$brq=)*&Kixrf!{O)JR*0;dnlLnIn}}>hQ~nrh_QjuQF9+JaojPq&X~<>GMHiD!$C9iv5fEh56<-F!^A+lq&x(5J{40BmG@Qo>2Nj{*vP zWwHfMcCSIe;??9EUv31hwa6Cz9Ncnsuqb(V!hxJI!+Rxj@+efWN-gi*2N^tkRs|Nj zI2fSC8X<_->ZVR9N2hj4yZc->WOHyltTRsNXMkEymDA&pXSNqAhFzWuI_I7)JVqiS zrfOz@lDP|GD+Uq(qvVKd_{ISR3!rj|vkbudF4Qsu)^AlRl8$Q#(H^J1hB#40m`bkQOLnqP-A;|(nNOnlBY!6d&2p{K(F4v8Pp{FMLe zzt@(d^%34Q10EQWvGR2tzKJ#;D`}`UU{$2#7&W*+Fl~T1{Ua~8eYXLkH2>Z`LsgH& zIQmGt@&hp?z{Jkbc#?Ph0YsOFeL4|Sx0QBp7XDo+N$4@OYEDkCez%4buzh(4F#2a8 z)m`X>3_#9%pueDhaa-pIBcy*Ygq>T6Lm?!Ez}1c2N@A5Ngy^?#UkiAX(io*J4G%y? zsG%7!rRu?6nERLgRK#40)ZVFB^Ic$B``36?zZ>00)*O!HS74(--i;auhwv@v0Jzp8 zCMZOVA@M2U?dmJAyT}sGyD1JVNLbz}hN@R^F!Cq!l{ApRMYn(<$Sq3|SLG!C5BXm& za**f${Xzc!A0E_CXx^Xy_Xff6pms&V8?PT$7(~Ees5lu=O*TBCE_GW>1n!o1lPt8uG@CBES6Ubmv3znb!$LlXiz28eE5<)kJOrCI2qvR7W{~;Ilsu2#w!)YjTPaM5-1+I zUQu}hqU#MLtdO3*RR!1#gmbCdUS;|s{I@I-UVbuJo+LYN5FUx)yY!Rb!C0i=Cvv&; zWkE@Td^C!XsP#qLES3*!-x2=Q^X??qRFbF^>}Q!+(*s#=Y|6-mqD_UaZpS5i6A{77 zk_dO6vJ_;lZ!X1SF2l=fk>+~K>M@Sb7%5CsQW^Cri7~H`i)v$5xT&)<@lBEj$SpyP z++4z>rm=*uP@H7AfQ($lamxa8DPCc4gC2J~urTV={Qj1)5v9{Rb2QMmH?B}6tx-=_ z4Ex)Gl~stQ|U86M+`<0KQ8)3)sX^y6LMJ+Kyq2JK6)lAY4C6I|L} zna3S?BXa)LZuQH>h$fnPHYR?Mh z9lm)=irMIA8#!!VrTW`D91nBjl)+raUy0D;Pi$zymo*wR8{tsN&xBr-#2J>;x^gu($BELmsYIcsas^VR&HSMK zhUZxyt&_}_K<+{gceG`)q}JZ)PWI3Ut+OO>kh!c+icqSU_M}4 zY8|Few^x?uaM_GJY9_u8?$;`c4!2>>acM`f1Ou$__hkv_s+od=Kxf;-Gnu;O>)4D^ zRV2~HbtKQ6wx#!**BN_^jYe(e#)28O&3@pQe5bT_?^%CN&mHx6R})svW?T03%$V|q z)17p>k)SDexH;L?u!)FBC8GF(j?4MfdQVFqYv?MO?4h}el!<9uQtrO`Ir6jK&9vTG^cy%snJ+NXA2jJO8syN z1TXqA>Gu^@^V-m%A9t=UnsV7ODmeo`JDxYue>dY+xS2D_qy;%K5~k|j%s-i3*@_(1 znhs{y+72C+xz)%aOVq)anwQsn#=<)mG0lT8;* z8*&DuqA|EVb9#U3qw7(wFgYN%GOYV%?Y(=8pInzGN!j-enkv0of@WIE$yJe(CMs<1 zQ>-M9;ANgf9yDJLqJKpQ!P0rRYprYQeqXAFj>G=+p~aq3uk_l|NzVNGHzgC59JWen zxjczdlEtjqs&?N`l}c8^$8WdN5gebKq`58+TF8wbP(ig%=2*#JC4wErRBC@^n zIiReK*~03!`_hrwd9bo`b2{GbK%Xx|ENbO_ng@26h#yWFTONEhD1u29<-y(J0kM`) zq3)fK0PZI2sqp8;g!l;**s;Fj7w}&a_7(&Zq|?vz^71%A!6K@1{~ z_vf%ey_{6EwjEtfd&gTy{+V$kYb%dcaX*xh4UU9)7=zctMM_H%MJLi;5YU95w3~&S ztLPN(rmoyzp!Gl)8RA}(%{u#Wc%7X?eJWsLwd5f>Jzdj8tC;_{R}L30^HK=9JoIr9 z2huY4TeXeIg;tZRaeZkln3etRllSs+Q6Duii`-n@JngakaWx=lR6^8m zVc{7TQ&B7kjhzw_DD(k3alfIpF2d)CaIPHJqjSi!XICjpV_`li1LaPCq&AV=y~f8C zI&~7Vos<_%o%Si^*-g+bgh@>pSJOT{LLvrBwQ{Cd*rO0#Q3H)PylEyRT4kr__2Iyd zPxTe!_8zODr)kwnd4X}Eom_P;TS-Yp0&Q$-P*Ft0XC`3@_%e*-W#=R>7k>gu!bxbk zogWov;?*WijgGA*wa@HapY?7_$v>>kWr!svso-T}>rkXdi{5%y(*|rfj~pRV8l60z z^a-9l>to@T|C{&?Zr&v7>0q;bEFCpTx@1(IGmxQ& z2=F9fq|vdq`}H59rHG7F=8k7IZ>p52dFrd>Wlqq{W}%ySUC!nBHV+XmvhF3`Hp*qu zflSrb99LI4371rKy!ha&XK;1wcdqtvh7&KY~iN8puZ*0gl423eZ+D+CUkzBz6j z6$Q>1FIA+os~p`zRTFG7ktms1qsT~}CEmcV|8qItA4CZ(##Bb=tUD5GWUICw#bLFD z^TO1G7JJps4+}#H>b;FJf+Riqq^BiOiRaC#oqBIh=Y`bc5fs7eMpied|6M`E1Ypd^Ww$&fp@>3Jdib01sY(wgbpt%BwXO8UL`+yPong|1or z;yL+EPxV_EwB6j*xT9o(-qQRYkH?9g3EEU;w`aAqQKN^Ea(0Vyd^B@}Xn2Dv#bLdWksTD4#7SX!-7lZ@ z)Td+zTR0t%GfP+IWiKx+4#y3R2eR*+Md^l6HV5#Ze5R|OV@-r&R1kYCqPy>&q(f&Y zKk6U;$Z(Wp!FYH(vnt6`b5$ZQFsa$cB>Gm(5elP6Zmiqe?px>Sj3O}7W)8abhqh-X z>dK*8Gf_*)~uY>eResVyyJKT7nf&uza}^M1#%1F5hcm-!l`Zd&bIaR%6d>; zPs^UD-5`y4S2Or%q#;C?UavBK};Cgh$A+8Cjf~uP@Np zR309K)&f9<+YJIk!RcMvluw&E^)IBBW^X(4wv3H4^5uF>I!8>07bF5YhM%05kVN71 zWl$L0QLVLHpOSWSoCM=gg$3$q{fw8ubnB>z;%^(1oNraM4(AsFVOpsNuv2K5%iuScxqojrvp(`5341^f4;%SbZ!inpbqy z>a|HHKK*LDXGrT?cYL^T6Q&Hb&XEK?3>{p4bWv!8pn)JsSIo~7cs#9x$CN2eect_M zS@VqJwyuvwU(@vqB6yP=3-nE-=r|mT5P_0RehiqnwR%n`%p^v^0eha zT_H9eYrou}l!?LL=aUr5luX8;5NwPEg2SO#2*!v-nd~cF1FLe{yJlemo^F^n7u|UNEWF!_eDsTy|cRHIKMA2CWh#ggX1si~OVmS6{uop> z7|9al6FhH4cU4Zth9?SP&^82&5E^Zsn((;bp(qY97a>))d8Vh7D*lyDtO;%1X@BB4 zAwZ+P@@uZn#7m{tS12dzLefrutWk^wCK|izmYs-0_%!KHEud;CBT6x;I$9HAHIYMEVkoet(+1=a z3_s2iXMhgZ#YW^{uD+aJqG9%4|n628-d1xr9Wb z5j{RfEC!t>RD?lLW^)LpjwDCo7p@p*)>JN7%e$qJa~rpIjw%a*YqKRC%_Dfp7)OYJ zPsE`J;mFZyoD`rik{c7wH0vfeA;W z(cw5O9}h#$7>g`XipE6zlGni&%ByW1mlXAbE1cfdjSd@@*;k@iEYPsnTWCQ9 zkATZ^I39)OlR?Z15EOmVRi&D9&|-R7Lq1FKUe9f6Qe{o+M(A&ozHE9!O=`Jvo1w3? zl>~+ld5#i-t?@JA7Q8-m{bA$QVM`%X-cF%A)1x7- z0rP8_qlOTU-|d{S>m9DFHgt85ceNRgt4?C5;PK)50+R3qXu72yx?Bcs1a+R$$;{|fnVh}%*Ndjgzr}{fXSnffi+Qp1<06zgr5Lz|%8!PV|hiay}(ivYnsR>^8{_QoyG28wV%&E0pni{oy#z`#Mpt)%DvIGiC zAn;iTV8KrayTX4<{$Om`=GXRK~sE-?OyX>ftiO(Ry$(O#N}Jo-C4@@S;qr%r-z(x+(A5_DIkpZZ0*u z*06P*?%CXu9d_|IR{!L|%uWs3PRl;NPXGAzw65GB-?^aHxoV%}t=Ypm?yM4(_(kLJ zI2YJ>d6>jzl-!5ueaW(vAeaya(Svuui z?JVwBn(SQYu|J02p!J`4vj)_ZJ^MhWGLnYDW3fDvNf^mQKK*6>hzR)>>;9ER<_Y_g zEYr(1HG!R)Gv7;fF8)&DD_v^0xen!-g83S|y6Q3d{!m(idfP_8+>l)VxpUs)J|_KI zf&NTt&H$1e!G}W2p=0sb*l=`1nT4@=>dazDS1W5^LR)LT`{#D2HX|U zhRZ0Iwlm%E)T<}|XwYcjh)?IjsQs$Se%rq9hrX=kmWuoJo8-JT5<-k`VbSO)Nw_NV z{$AY;) zU!=y=^C`<4nIru=-`m*vXU;gVMi$d+9qh;)<=oOeo;BaNr4FHsihE{!_o?IgpNA8$ z*fcB_i)bXl#VZr`-zin2eVEf2&G{pMP16=H^(Jqwt^2PoZnuw#?dS}C_O)!oSH4yuVkwNX; zaOqYoRXLpSD1$>Cq6Uo?Z(Q40W1J2AE(qcwj>C_UVcPuC3j5g{%VB0;h|+9JK0|tE zRQWUeG%HVy6HqI+IUn4zxHy@|mzh|PlLB`>7$$`g)c+8r7p_=(n=&$VD99;f2LiTP z$Euxs{<+^85qu zhv3o;%6iWUX*>uv8jX_DOKG&V2;Y4v)L+idQ91J?!P}dx)1?aEHdojD-ltNmyGz+S z9T{v+$7#kyPZ8@x)KWqqcjX=03Hot|7{=-v?D&u2u zBGseTr6*=J)|qcN=i+9~Y;(8fd#6%PMoSS0NF)}#gfyaJkwd5Za(y#va@86){Mc@x zzMX6bg>6Qq!;v%gwDG(!wH>jQp`iJiAKn>^2U_+WJEO%+UjfzuX6q)yEF>Ty!=JOD zeOjEReQ?cj30ys3XQQxaA@iRK$_jXbA=Mg^59qUYNC;`t4qo?p+0$^(o@0MHglQE# zsxe<3xEeTAdVG0)WHODVLKQRIf%$;srT&(mPv@+LYH=OX4~HJkxv^GF%#`GTmn?x0 z!qLkz{NWliCc)Gv!EP${+F}bG*EhFYgPb{x-&fqL8*+y)ac8YUe$4LAAFnxPMlHcJ z*G3Oc<`r>k zZu!d6Ji|MMJls=Lt&;oKiLpHGAA8SSJeMyxd%J0n9h~FH4!vPNU%UURZ}zB$&y9Dh ztn^>JXKM4=c1&lw&=7#$NF)M%U(*0V6x#ggoLb)W;$F|1t+>kNm3i*wtarA8iqBa$ zm3{G>9d>P7dG4BQ`WCz4zYD9MPUtw~gCTY`*-dq~| zG#|91GL~1@4+FFB$Z%MUsvWK1q2T$P8t=BXnV{{($@x9gJ__D2=9qoXr}W9f$Ph6V zfsx+?xW0)RBBvv z$;(wgJFl(j6yLVx|LIeT%5@`v=x7{T(Amozqm!{FUPIhFd`d~H?6NUF4x7ndylJtqBlitp_S1s`j_n> zXJ4te*1SW_%*|7_eJ!?$QZc$Hq2z)HIliC>k)m4$`o%3ZYr~XIuN;9&T1{H9e7|(t zP(tXbes$dJ%~Q@Q4=VF^w(AZl7KP`8**;9PkNn@Rtnl+s+$te`m^$t1YO(L-fXY8u{+ltJ+(Ei4F%?E zd>Zv`|IA+OQEM;9Vo_)e22=K1FSaB`CeDiAw)(o0pa+nh<-Sz~(EGPkqc$9^;qYi) zSwfY0*7J@!P5nCSxO81tP904pRJ?V8w(K{T9p7e|h(%!pFA>7`J&KTNGve`zN^RbF z->;lj*{NDddm!q&yqN4Ry=9%6jMi99H@xxhQeLQrZ?fm1(?h@7X{tSE*|++os53cu z30|CpEDr|d@Dy|3%Lw%*O1KSv!#n|lE2=VuuRAr&EF_6nZ+C|L8n`CiM&0%DR;k)p z>fcB1v478jQ2+!=A^&LgoTq&C|t(f+Dd|SUNlwk2e1RBGRtHW8yBl z_|nU#)V4CGUYNNyYcr$H#fe%*u^!Ot=WcbZzc+1wdl?ceKcuMjs}FghPv!SQY!psX zR1_D!@1>^s+(J?sZx~<)%?t=DE`8K8ZXc?A`fy-Xm_*@9||<(NJzK(&wP0&z|txpXBhe_H0h)3!PVaTN9FKAcZr*N-dLY#_L^=BcysxWsabUflP%( zMI5g!c_|kPn}Jm2-+MErBK}>Nm=ynae`TJ8R1uW0m`x;q6fSd`zH3;CIm6tuRSLQFsZ$f70F_w zmjgWRqajEBsY+h7q|x;01TX!H?95i4l(9vuMXbAH)a=#uYKwti+1b> z-8z?3>}d&siKG}Ir=#Si^C&bLihfVa#!VVCqv}y*$i{sTnG)BCzOhtuN?xTMlIy;h$^xUJ_FL_&sO=+GX zg$8kB7xJ7DeOFflPpd>-9@O)rO?Ev7=|v;VlDg;?+bGlvl6Baq9UTN4MlPc!S0oV2DAK@(lO$ z%(~Ys9fRx|8{8 z9YI-4X#>M1YG$fjSv`LAQl-~@6x1td#Z$xN7L~5nL#jS|OuV_MAwuzacaL(t3y1tf zzlPW*>dLzss(+RkvvY189jU`TWM*cLgxf@B7|B)CoxboRzI_I}Zt5~}0V<%Ucgk6=!(2)Q`29wFNA zD_M(JR`98~_Ik33>*(QGf|ExYi|ejf#L2TKWjYmG*l#hOwS17HSu=uSf<13b#d^FY zNH_TnL-~C;nU~@fSucl0@Ct9tmCd6xGlAWROs)B;jJ?VyXKxJ3qpd zb-RnXt(s1Gf884=`jp<$dZDVqBgIT6CZYs0Q+X)``pDo4qcm{zkoZP!sDn*PZRH(4 zld%lj0ujA350Y?Jx}D||FeL8p!ykkpe`khg&*?aB=iZtO3%MnqjESqp4~Jups^EE> zU!rk$hN}7O7}FYVZcwRKuHuRE+JFQ*r`q=PM0@W`7Pl-d zZbu3KVs?lx*njI=SDj>b5}VXuP}g*u*5W|$ncUYqJ^wY z=N-xi4@v)#y>(-uPcs;9%KIN-utX`Guq5eaE=lfaa-PKe6xR7gDYQ$D=oVL6DDcK_ z@SiB7B8^OhVVFLkPM35*efq0(#?m&&r+K zS68>El%rYaZpKBfb}LBbd<*Ne;FPF86S|TtB)eSVh(k;VBo6X7V$!d&Yp*(5EnW>+ zU8r~JuDpY(98(v42Id*^BJKFPOU#D-Vfk(Yz0sa6l~3YU*8O7C);8YT`{eN_x#RV% z%JGqikVr^hOBpXW`1&$ zNe`$H)|0`}~14)koqLk`Qpm z<9PV+(Uwj8MGaM1lY-tw8k=ubgPh_?Q_qhRNLE{uR|o7hf;5^K{p=wn(T$BjWmYL` zj=RXqVU6SlseMXP59~Z7uTY}$Knfix`#MsWUkIPXFGNoYP-s#)XqnAXa&2mnbFKM^ zSVWAGm&VjGg_&(T!DpRD`dpQ>mX_DKK4b4ceHu3IT+O3#*zaQ4^GnmkOlns0OGkZy zt0s8taY=k)9pSh}wyV5{%cKo`+Ecu!c~!j`+|k>oN0GwGpn#8KLqqCGs$h4X64sS> z*fzFA=0-(%vR)QZ@G=RbZ!9N7M3=K zW|Or0@hes(o3pQ07z0E5ls&_0v|PWF*L{=s+xw18YSqaxl7mjW!>VX>#!+PTadHv( zTO$0a9Is(=U4S2`uzbCfMIXykDhB0c?*BPQOtQEsB;j`q|^}I=@DR3WapFfl6oTD&ES5-L$)eOa4plsG^!R+E{G|_h+O4w ztC#TL)RZY_>ULW*K8J>7utR<*Tu`bt?D#T!f03b@t7d{ z6p!d*5+jP!>y8^%->!0#{O1;pzXB)Ea@hIRikcbU_x;R?+dulpJ4!;b z?)q` zNmrMqYVL$wRMGy?|AHYO*a1z?U{T++zidVps_KNtI{*{j{EfUhK}1XqxQqryF3N)xv?5`&+57O z`!wn)c522PBQ&7693SzbUhvX=G=@hAZ~WUJi7ap0YaT0q9`)kj=g@zic!r*yy|FO2 z_GxCzfBT~LMpxFk)Ak zO2MIv8^aIs)Z{&oh31Lwo7SOqi)-82as3P1!J!W8-1YTdpQ8Di7P<9{EqhvGW} zN@DQ5$I+-nTnxcT&p5sMyq73G6)pRM$ECoNB1&qW4%po3q~vsj*_JEDEzVD`z6yNA zRro~f*j^B5q&pg_uZ^~CyqXY1{qv9@fWm;OIxc}3XO)aEfc-}hjj~D=O+V`s#_%Z~ z8d|u0QKi4Tc)G^ns?me$eyw+&)}SEKdNi^*lNy5x$056kb)wlaiR7vWo;qdpaI%P3 zal{~Ld}(PbNb!s!CS`;h_*FZ*fia}~^3}Z9b7moaAVGX_$9w5K#vFryZL}mIrLEdL znO~PsWD#3TA(PNJ8)nP<&p|$lXT($(Jqs%zR!a}>lfFAOkF~c;QOa3coY^YIgrE1@ z{WRJ+VcZ>Xdx3z6aiw=GnMA@5M>bFIXosaA(NW0@^O4`!(QvQ}9Of8Su`?7Bhm)P? zP=c|PMBPH9q$Ckhv9g4wEA=>}fXAx3NmrQk$9VCmtKRfZXlUtgYNKk~T-F%V?T%c{ zUE6rxX60nFkoxwS*WeR@pwJewNQ}n&LMTw7D#omAoq1e}<=Z?Bsmf{9JDu7}J#;GL zcED^p)ji5u&_&p0ruM5~Fv#-^tm`bxeaX68`is#o+7S@m`nN7vR!_Vz4GvUopvsd4+)3y8- zDJ8Dw-2=C`-+3Hlouwc`(QPZQmQDTGxRNW8e-y|RJuD{68HX41;{*^=3%O1uW4}?d zCxuB>tgIP1>10o^yj6CD8dXTqwGo!+f2yy&jP$`KyeuEWf-tR`~zW^ycww zXZ!znxZFW!T2!@KRWhL%%O%sXG`0+_*lD5_#Y~kHMHNLXRYQv^wNoKzV@VpOMT`*c zOk0^2Nl7DvCPtMYB_)X^=>47fd>_C3m4}C%ymQ{?ea>rnE{)&A)YKK?dZHsy2S~Md zWi7|0DevY+h-R;zlmn=L_17MkLc~cB6#(XPAtVTuoga32Xa_?As8CW)1*BQc7^)D< zecEy}nqz&2fwEZ=a~!iS_X)pyf+|~1U>3XOh+D|Vvo$!q-q0>)gZ{6uZ;acWO|Gfs znFcv40`n4Q?U}&Ht3b^t1|2`X^xM2}*p8~{N}DRyZE}xE=R%ag7yDgw%=lGX=@$=E zKX5*jx+pd(zR?Q!Qz5R6^>eI|C-s{xX=sLB;_$x|ATc8!6u8j?0blCyXfYtw5gF|YpxenAXPTF zn2C?lZnZ%C{RDQ#%}oufnP2p};$cf~9QjUwwwm94=)_E78Ad;vyFA;HFw$UEmRlP8 z+ro%7m*p)^(lUG?6H&A$ZP)*6W^l$0f?C}WFHf=ZYH*b7W<_0x- zWaQayxBil0^DD&Cr+$m{bX{^od$h;d@G#LXZj0iq>H0ieBe}UJiQHJ3oWcR5fMYM| zToVYT-7wlBaO!8*+DiX#1Iq#*>!uFNI(s+l6y9SePHqVwAIeym|Y;v6eP%2o0^1JK(mwQ~#el~1Xr z#!8PG6;ZXOuZv!xfF42bMK{mm!PLtDp}9Z}QEI{@dOUrk)Lm|cbfeuz6<>y*;gM9d zEOxg9t3IJ&PWDfy&5R*!mwv5rH}!I3VcIBU4wmi`I76|MynGGT?W+T(1?ar5|0I`T z-bO!Jcu~QyzpnnsBc?NJX0jYeWFj$&*~Zx*M@7FTL`1hmb0>Sir!O&0zKP3zUZIvp zQK1*q_(QprBpf1RJHFLJRr{CBU76r10U@|fs=}&46#Zdk&g6@TtIbU@=t*f1Cay>_ zticG#CM#TN*IX)d@z>^D#8{1#=*D!0D5)Lb4Lxr8bW@UMmxFCo`BfET6yzKnIIly0 zSDUZgLt&_4=suS}j`5J$0nK-=KRf=U_J9T^mj5&nSnX!^x+f{n7p{ z(+G)L|Pgam=Lfx)!;yoaZ z{^mgk&RuQHBMW+Pj+av<411}PhZgU4SnNCD;=1HcGzbqOQILR6RL89E(w0xwZKv`P zp|I$i01Fw$GnVa`2GGfX;uNH%IgK(@`937(7OvVtw?!^%(r~j3^KGSCy%lvwo}TaNx&~`H$IgaM#@Ho3T8TBz7(*8ZB)y}|F87MD}UHbqFc!)~(_?q4;M z9oq==Mu@)O%Tbl8_LwLvod+13vhfl2$N9Qsu;oX}$331(SP@BFZRJL^@f-fPV9Afi zd&5VF7RMO$PcRd6%g0l*=WNpu+n(1T&H?Bb*64z0E;T5^oaa-&o7|C+nlRRqdUGTs z)~_Y)gOMDot=0I<{JF<8Tp1P|#h7AOTOjJw<8nQW?uCU>k{cYuEMT;3Xrn25bo4$< zdnWp=Y0sdbm|n}&^Xt;fLJd}WJl2&M3RV?!vM-oW&C1WXKJaIN0=xwxcy%%tNov`5 z9GtXE%OHHDWoK)v;jG==zX`@Ps)4{RCP-NH^rmE^IulJYvisQ2SGZCLDM-FvrsYnf zq=S>KT35iQYCx$+d%MP;Fza3qdtTG{N%1ah1eVi-wa6|!4yMPPjd+7AIe1gbCs$sm zO0?)DL)twcZ&seZ_5pe)r-4Fd&Yl`(QS!ICo7VSJ>2QhC^gq$PtFCRMMj!^3SZ^TgKzL4w?kwQ z;K~rRwnF~s-K!xMRrUJr+EH=zq|3vjiF3necy1mX+u;a0-}s0L@`BNHnM(k8x>JaH z8NadW<$h&a-3$hUqB|hC{wLj8TOHj3EBn?i#*@_Y)>AP!P|A0k1|+MmdeqD`$X+7kc3;H$|MygU~sE>_J$9cRZ4q{Jm{c5)|RNJoxRR*u3(x&T_6t#Pj zsfLpsiNZO8xTES1itge?JnfaTnulxfldAzgdQioHm<7N-@|6M&&vW~Z)K*8m(3=>D zdZQ6ELNkIAOKWM<&k1}G6BrWL>SSrgmtjr2iXuliXiT1(8_Wh(iaHRL+&5CRSOmuXPvq4PY5}^GNo$3zol0Dk(BF}qI8yln1 z(6!h4Pwrove7`LbzM7#?VQ%I}dpp~ULqn~x`t8n&k*G2lmWqAU2vhRL(t|tdx=PBc zPM-aqgccSZZCPq;@@qdpE>m{z@tly%v56*}A!lU3I3C|WRSb^K%AWwZ0nCRwncGfv zh9O^DR8o(&hQQ|~8+EG;V=~k1+g48`R!ej8Tz8q_rMs197~%I239MbIi3;V%)>cL> zh#zVJ)-NY0w^qN>JNS4bR23TI8B0x>T3iRY?PgB|hOPT!NKzZfJ03<)>G<8v5ns4x zc9SKSwW)mnIJ7}lbYq?{11&7Pq!?-Bu6*V?T|wn4%7zrpi=%!1{CT7^HaOzUX^R_- zWal2!-;u}BrLLZ_cj-R5&x!<$=p*{H`%9~|1mOZ97+3{qy4UKf(H^zCx>&nTlKH27 zc5kll{5qRSy&pAFVHtv^9X|lkoQ9cbkc{ZIH(7AJ^isRxczm2Z9FZzCNBTSatCn5O zHX&bwiABhn7q=fXMLyTQHik4K^DzgDGrIDZ=_+bL zal5gEL?IDyX;1wBTv`RN@BhEo|Krkr^?zjAf2o7Nt#`4FdOa>RLjcGlUq9bKUB8s@ zN7=mYwqzu;UzS9T13ZiucVRIg8t6#^eA}A(7C6B>zN2U~g3>}>DRnRB&n|wRWL&>; zu%gjeUr}EbjGzKjf&FZ#1oqeG%QJ)gj+B0@;?UcU(3sxPM^RKihzBh(Iox)XVIQ}M zvkM8v_P14h%U{}QNbkJLf`)LF4V9EGDL~Z?U>b@Bs@J66}Unbv}?W26qHo|F?+T4b+VhGQlq{CR7K@#u8TSp z_2^q`R4Fy6qbpdD*l;;x`wiIKqkCe>iji(Tr-O^a4~L}m!wE02XOijvGL&uZyr+ww z;;co^V3ssA%+y_B08$QzLXEB{KTeM$u`M#X2m*!;ust!)x#C9aVz4f~2(jt6vaVWr zG}#k`z7M}Cmw$e8w*q_~s-d9nn(tbm04qajXlR)~yA`-uD`XxQ0R1Ww`tk=i+JpCr zFM^jT1h4y)}JrO z6-W3{)q9MLu(Tz5G`Sb~ zAmx_}6@JY*1qF3+RLnc=(psa6kSMnb2S&-i)RiF+brl1sPN~K}pK;BFU}H>Zq%wNxXwdJp;+@S8@)% zHfd-1sj7YbH+`}vkUZ@VBOeHS`7=B0^+Bl4>-a3`YH;l28J-C zdwzL|_U@*5X<%TWyK3rR27waE=iifgytU1gnG)i^GR;P{vlXeGKHG_%2#m6_8sv_W zzN<4*-BlCj{v7IFhCFw5;Wg;vj4$y{SspoFih}h5yRnV5KDS$&`-hsA-w78!gw{R% zfSK^naHEI3_mI5u^TR?Q1}fR^&iVQIrJCU8yg_~aN2Jvo@zCR;%+DJe(5Xr~iXadS z3T_`Queh=W1|qG1a8Yt%xrYs1zWPLQCi;ah0;8DM?%M9GpPTLO3g}nvWw6?EYxe@U z!PRQrI-n~NaznB%tfO!c*wtwuy~l7mKfd^Rdpq(9K6B{D<@E0t7A5E8pV+qCAX9aV zjyo}IHDj|TKygDVxgwG7C{2_Ryw*Cu0Ire5y2-YSkCpK(PnW+gu3MhT=o53+#DF|C zUWl9{cydB@*GAl&#D|B#{6N z{CaR2{wA304hH5s_l~Kl7KuFy$p8TjRR^*yUarG-3G-Fd2`+&AS~2f|LEqb6P871M zAM;m4>{lOzMS^;I5WrIJKTi}6ouAtDwP8sl3ru2s%3HZ3RYe zQnutaBd-?Nj^3NgeM7$QWaYkWEH8@b7?nK0xFZAj*nbba z{mRLyyow(0TP@=1A&GU|I89Iv0Fe`3M| zOD$Zmv^$;Ot0VwNYo9u+yS+eTq&jf=nJX0P%C<s1fefy^M4TU_1lI!CFPv);)W3XS$yV+cZBug%eFrkC5vWhk^6dUk3`b~e!sZn z``VY{PtqjZJ==akM?%@mPp+oZZ;wk{RGF`Y3k?lL>%t;_@+z-mmCkKcd01feBDo>- z_My7*PlALKfVy}Fd>3kmShtQC`fhP+c{8gd-j~1c%iKE;L`ma)jM8@<^osXWaQB6u z=b1ILlwQx14tn+RLzyBx{m*Yf9EVd)?gz{`YNLKI203dSshg1%2j{G%g0{?TC?6l) z(Hm_+bx}R6+uL50mN8_xv@0}|P0Bc(!Mmp@+y8@AvPNKbTI9$)yAWtTAPYgtz{c&}ObVk4tQmYyyZJgEZ7lw&+`TrL<1QjLt|Ejcph2jk}k zTi<2*u4dg!xfi<27TIQ9)Xf~YeM%&z9B#?TusxT&D%<1-w;og~jWT5HJ3ff-^o;fB zZaPN~Hc2dqe%pNK+HqkKYGjNVO4vzD-UI~kKX+`mGQ-YoMZy}g#5SXQ!h5s3VZWlG zPlGoHh4TYL6;e6<%eSI0L`vRr`j^t8C&~iTFclpM{xa0+TJBzD~Cz+c`7U!-WEUJVjK+&*L939SxHAY)$cJa+jno% zHMPE?tn7U)*@y`%m+g1Zhhxi4YFI6a#i_#LRMvN)UtYs3I;c?;YRDO0%gS_KKn?)7 z7{rxpPHU4ugGre9CM_dqkl18p6p8pB6)dmD~Zj3G8biAj8?d z96HbQq(pORZDb6|ye+_(96DWgpg*C`tk`f1L*Xg>P1@eE!OkS+sZ(PO)pcXDYw1tCZmeg_T29D!gd;=VF|9r`%c&Ww z>Y&4eBFx*pG=jY=L&dnwj*EdjhvK-iUvnXi>GSlzG06pP_npa#f)rgsMn>|dHKwJ_ zy?a>$5@{yAlyDOmicX(t=VTT0llxOM);09YtUaD~=ctz%#-kNnoZp%`lfkPscJ#k7 z*ek#e)9*l9-(0b-&GI{@V`x^^gAM7{1d0$2R1NCwrOShiekr$$J>PDiJx%YAiCa%-1p5ng^Gd;gxX;n3Ss_mFzsErEz=QUHzr#J z%`PTuVKHrT81kz$2f zsO=xHAnR(k0;9yD#D&F0(d^J;yj`M@sr$?dDDWk7u#-LTtF^fA$S57J*I(iFdoZqO z6x4JkmP?y%u3&V0i;cAS^t+p4n{wC>`jP+jhk}`{w$RH8+5a-wl0cYmup;oqoj#8m zM{`GA0wS-3S6gK4;JCcbw|oN+KiAQRm4F~kr*Vz7>pKkjUcr?A1Zycb9?2+Ef~e}S z64(t^Y=RkQ-i{beYqIVdmFX)|t+Ysr0& zCd&^{tUx(St#<@wrmYCY*^RR7=1=bLn&yB772qX2CTz&qkt}mcs;giZf<>GbdD3Pw zSLq3im7oTy-PGtwa*i2UyZ$<>7a(YZ{%mZ7z9LJkAu3R>(Zz@q9<>?7L99eJ@gTx# zUbW`$6nEt>}y;Q6?5rg37UdV~|GZxsgs&bv2dz zvfyMiH1eNIVc$FC^!3lPoCQFAKSN=NL$rP^0A7G*Uaw)pSC3E181Yy#EyvZ+bedKl z5Q4r>#c8QEsap4&Oa7Z3pm@aP>(No%F=0`nkcG>1a3r43YA_p*2!K6QBcqJ2mU$J9 zPRf%6JyFrQWuS)0?Pgebws=Pi4RhYQmYc7PWPFDFs^IQg4yMQoRH0JAe@mBVI^!M< zYr{adLot_?sQ;|^LOOp=xXkN~{Y2`9)s`KIr7g#ra4wiWOKySYw5u8!^+a_d)F6-o zSZxhp^&q@Hc!@H1lUF$;FW^N=e%J(Kg&#->Vmti+%qLiSs-SmkbKSh#3J&$6^0`2T z*ProPksqk9J+1-2OYP}UhbX9khZNlDYLnwUa1tdyanCn@Y{rGc35!NRF(9e|F`&!H z5`5bEAH-o<{)LrePFH0gs|E#nUdt907{%p?q71NfR)l7|zfMhE6zPMTzItvMXjFumasfzy))r93Deh@|Lq|KOr4t$K>aG1paEn!vk6zpf5hpH7SKcob z$YRNAG1u~_m;Zj!t#su|+zk1Hv%0%$fhMY|mywG!<(6A(PZ3^@zPMofiqT6|X=QEP z*iEm-Gw+p5tOf}=w+d@EwyjpAo9`v5R${4)--FhoMk%h0er)SjuVtN}2B$WW}q>H38+6 z&HO$)a*$X4qTlVbg`VRV)}!#TznK%#q#i5;6Srd6ZVgc`dd*tlhuHq9uOEbQR&X)8 zNpHh7d=tz*KI>%EdlDaA%lfO1Y&F7^WDQZUy}DUn9qL@&{StO?wFw8RQVoMWh#{wY zLp&a~C(8LTiG-?kR#G)OPN)6$2Sg2{;@5QeSj;UA+YjP%Rw-E*LkIflE5B5A>b-l6 z*b6J)w|ToviL~1usFT-k->0>+VjYg&25YbD{m$7c2Slvz$N#y32jEwN(5jD&=d%`KX;K9mk_@X3Y zNj!t6)dEAtFGFFOT_5K-gIhq!E3mC8xjE9W5n^Q2LG7?MHf@KIOxtpahqA`+V zbAg`aWrMcg+=bNZu$dqWRF&U$P);f3b;>COt<}07jgZmcQimrqmVP@0_F|i?X0hc$k zD4pE5f#bC_tb5=`(Kxe7t9-hkC+SyU2aCZ30_b9Mp_XbA=V43s=}beMax7B`Yh7(R|Orc7m4;V2VQH~8^~4DI)DbCXg6Tc+vMqkCPS+49ejj^ z7(*`+HbyN7pZk9kR{J^#mu69QNeVwJ78sho{C9vk)*o#O?2iir?z9JVVBqIlZJvd>+nNOq7MUKE}n_+sD1uCyqxI6IHPsg?mRbJr))|LI!Kb}n3=xQv*Gz-h^{SY1?=mY1&}sh<7kyjr!-0 zM8rzcG8u!>r<$8S)KwO&;mZL1 z=IZR?rkJ%yH5>D(yJ8fV7pznk=_c5Uio&=BRJwMXW(T3WwK2*SO}<(X6_m?G55=IL zHQ+^Kk(u5bl3hDt=&jwoUmCi5iel?%SI7P$KW~D);YTlHVomd~g}|w_5(9!jvT>NM zK17?^sN|w}E`fEpv-4zzVC~j?hJD(=bS)QtCNP{ZsYe)n&h2h8g<>dio%9LK+Ws6{7v-)Dc{zgDCo3ukM^{z4 z1r!1!b<;|%rU=AMpb~@3%|oiVX#Qi|7}iASkbCXe$FsAtrs#g{Kare`ow1;07ufDW zHdm~4IhT(y)Mo3N1acvo3T9B1g5uN>#NaxEzlf_=?X0&*CK)ShDL5;8x*Y)^W7D>4 z?QX!b9j*0f{YZ4XyMjI-$?M>b{o&hLe@n<4OuYZ%*v{UG$#xH*gMd}M6JeTd;^OHN zol~Jj&I>R<1SL;{s*tN|&|$dk^Y@audtLmI-mr5rBfFa~eqT7)NAGE_@OSah^7Cs# zj+>GEt~FwmjhkHDHY%?{keaX`6HCg+Rsq4Zy9;i+$Znk)@ARP@n{NoU`*3B3;ZBRk z=QX#P0xS8P>~6(2b7SM?yeAlFg`_GQQlL{>i5QT}@rgwr%YbxV!K(aq$ClUpm}INt z6r8i1_PH;Z{Es>l#?6?d)|{uM*mlGNSil@P;!Kjfg(#tFbr{JbkKUtD4`Qn97Uv0> zhi>D1=qY48>Q2koA)ixN=_yMK#ToL=)s7!zVog4} zY7w(c!eC6$U`$VBDcDG>FbY2U6&@OPvvGS_0f^ZKk+gqn`Du9Y0@EgMnbuV#UKX{+ z(ca@;^Ky6e%+7V%T;2%HbVwH#n{SDWvAou(W1yBz9u4dvVZg5E-27JgnVacDa^Z#i zUlq|fM}BH*b4KTA<}7t-GU2K4m^3z@FtEeZ%N+6@8Ii^#!(T6fLl#K+Zmt1X)o^0x zxwOyayrsb`pD*=k?7)w_e{V5D{HcWvzhr1Mal%@*(Qw4ckxW9c?ByZ8PFqMa#m~_LA>K zv#|LW#_}&jggi9vy-nYXyN=(rhL#D5$9W`>6NNeT&o0ifxm-ITFJWj7t^vu z@$f68wPBPoig!FPg%!;Kzm?@a&o8(2e351I?8V}KJ&u?a=fiEtn8ynjnWr9a_AMrJ zN`TAU81diFa9&bT-_xDP9V&$_QOEuF@Y$>mLRx&wR&2MHR=0MZX_fI2 zPjk%*5A(kvg-}$jt#D~CK73KM^nPRY{-SgZmnR@(I3OI&ww3|D|A&2>4Er7Xw84`3 z!Q1hky_8NwB4==(sG4~Mkrf}f^&pwB7aA7dvBAbY?nQ*w38;Sl$UHx?e?XoI+R#|- zgMtoCRU_PXFvsD6X^h z@x?owrjl=mJX5dq6zkQqPt|cn1NHG)1fZ!EJyGZfwt;|x>!v_0(l{n3z(gy*d{hLq zE^K(Ro3my39!b_O-<)TE-UKvrJx6{|iuATOOL#(dV`bZ^VPi+)5V9XSc-aBFDZN?F zxjI+Oi?=xykH`Sg4cjqvbYm6QBAEmSPo)P0qewN;{-ceYr|s{fU+4ifLWI7T3D@oS z15-8}8wU1m*nEAKfC$)!}ef&eBTzG6`RCcbh07(KISCPRM)-u$h+M| z{K0|flDaOQ9^lcEg^c)9U)6nz!*$;4yuKA4+#4*QlEI;($UOp7E}s~iTqrd)4NxJT zve~lvF^(QZD3WX^${lRwj%-~Y`A+CJ;cSV0iu`MQ;>M0V zE8e$ngz0#XEI1|}FLCPB2~QU;&V3T4ZO%QI=O*6Ev|;eIv&m*h&}L1@cGrN4>OyTb z{h~c~7J=aepRpNf=;=HiyY*p?-B~_(I_qTOM@i<_QORQIjUk)+-@O@7NMO6M0TO_-;bVhYgEbq%neh}x)U^sS`Uu)s>j*}X zMDp>E$kYGU3BGjE$!zmarjNrwNP4mmkr_X>72ffi?6Wj!_z$G*ZiwUU+XbH%#2nq< zMAZ(vT_1&)eM4v{H?%rly8bBAdqK z23^TlXS22}GP0bWCCrP*El1@iEixFmUl{CG_G~qCGrprrRcB5p554Wp9NP>Z3Om~R zYKG|G8?rulx0@9waKf;^YW~c!UY&XTY9gL8_EFBz?T=~caV9H7=PBmh$0$B_^D+3@ z-Qe{7Ay=jl*wvx_UY-p~>)Y*VxSSsTakp=`l{i#>mmU-I@0*hOsTaHj>2@#YaTa1X zBP7v2ZkrLZ6@E04`Dx&?Ln^_hoYyz^X=yObhP#Z|rzZobUN*VOxsl{o(H}B1x-DMM(c-Ij@@({aihC}8F5QlX)f>RHz_26Imm!9Yw zWrX&ht`la)RXbYxtik8SvxllBLoV|>#PgZy>n|I!5O{i@m^sr66j<(0;9J?!tu#8W z+DB|IlX`~}qZXxo;#VT3&xy%rFWxinjn8!IZae6$rhU2H&zZq%0m!DBG1!H)G1Yfm z6cv4J*G6|v{n+ZdAzNWv8ZihqbK9qIydCky{_562#HW>n1^XD?-r3%|mI24HRL7y# zvA^ZF(&%=At?D}dyZ_9d1T@sp+vj8pQfBR^1j#K~Oo>ySG}HI!y=8p*S_SyJAQ$Hz zzh>+~fADpv#nl%0#+RquhS<&W>iTikUYHFpqan=qq|IQ*v9i!ky)=AAKX{0$<&IN3 zPM*{TM+q_Xk#IpOM-3#38XSvaKQ2#yUQM(OLvNgwUq*a6MVZw*==9_GEE;2W*{2;lHSzY*% zF^yVHNZ?zjWv8Io{NJ+C`IF_g>*;teo@rp}JkfzwtTVr`Et0 ze{|P^G)5s4D%-0M%(V}G1<`0hhP3*CpIy|d0^ zu6$0~iod)wKlOaXF8)M4K}R&0PK(@eaIoFkccj?vjiv8O*0(bS0)}aub{j~SNEL>M6#NJJqp;vb^{KO7FAiFF;6s~ej_CP&hro^o}5w#R$^ z((ume)bRO?*rzrnr+OCB@o*tnxicMMPWRr*ZgH{T>fH{Q=H$P%9Y3tOl8bUhjdfp6 zNa{8DCGCyJFaQR$U}x;&Gx}JAdVI(86h6;Os7Eai*x*!(TaPR(kI`9p_Nln{ws?j; zVIVXbRR_~ye}(d35YJ#aYwy?C&J-d^qGvszr!ff)&Xa5-%^{$2(h=Ra{{ zPQ*MYpq_Tpb_lIyE+)$L2K&1YpcN|=Cvr(g$2{`AJSjgF3DK|;Ct_A3;x8dSWC9^k zAFWyhw}z}S!&~Fj8tE@!fUHWA?0uWZtXooL4Yz=mldaxaK~e9 zsrF%fPw12PiHTlURmCqicNK34c)UAiT=j~+)(c^I3Z(1qyF$NAk& zn&HR!Dz2qS7|PN@FJg`ty!`XG2)i`gLB83^K-N2RtAYl! z+O?jy6+Zd=XAGY7YmS#B`JFoQ>XY1m;1){I?88-CXf`ne?{H$AXz3$r{h^oL0_R0W zb}cS^5=S*;Aii{7AeM||Iu6$LU?K{eKpd`y2r4_n2zJi(x;g8ilIwMD&OpgM-$fZ^ zVke4zA`#W|K)Opj-8y7Z$r1sLw)iVC2t)%ha2d|NyMKa!$go+F%IM|+rg_S0&BmQt zZ&1{=DQBo%qNqpHFrQ`Cq=Yn3F;HcNlA3SuPE4ju7JZH%XWzOay1bicKb|b)@|SGaV@7q5=A4IR%4GzQujm0xF`aj z=XCl6XDBmz+Rxv`1zm;ph2;aeIQ#2U?FZ~LGx}HlgoUx+`2{AXCb9_!BGW*xX zjB7RPazSy(*9#mlZ9GSMw~v!kXBVxl+XKqt`LPSBaUw=vwcG)HI9N+h_JE({CEcAv#R}ULcCrBbV z04~S%cLSyY+T~+#=)u$^Al?5?30D3Ky;LRQssVu6K~N3H*LT-KdSc;=vlmg1b#DCz zexqRZ>zx5TVpyzSt!GPW!bodey*Y^lA|ltGqi;sv9KO8cQ{UTctdBa(TDxRmc-2)^ z$yo{Kn1SQ#W?u9@tamE2=dmrr=D~;8lW!9~&rhxJm0ri_+TntiXKqcAOk7+%@}5Xw zqp%p_S3ZoSJQa_JwGv-ujVl zLI?Z*WffJ7h*;*d$O6fQW{qUE>NltwFTO;=V&JF8nhZ6ezTXb!m0nf4V_=qD<^zIR zSv+ybGq5FN_mgNOiEW-NIMd%B6i_#q zb$wGbT@Yxfp-~~ZDZMoYU{IxsDx)>qUuNSd4VlNu?L^DR9q9@D(4UmFV6{IsK9y>RH8X|~Snli~G=@RoKI6ByeAsD;Y?AR+rZYW&4ODp}2~ zyU=VW(>`u={=1Gul5jp{Sy14NG=LR{dhJrPoy(K}NK3N4Umx8N<|8#fZ4p}U^WG*p zVSf43t6>>Con(|D2yN(?AtOE7*$sgrESF0`x4WU6BDSZ+oD|#P;DJ`0kQzk7Kh#cGm!xVpOfHaMaT)Nse% z%uqo4n5#}`mQAeluph*WzG1YVPt*x!W zcJuHMyU&0G=1Y`@GVY#nH302V>-DtM^!=T&hoxq7r=udbn#0*5x^`KbZ1#e~_SzIt zFO#pkBba94qdWj#2QbOk-nyC)K4{NSL$G8t#jE?!gWpA~yz3h;>w6ZN9lq5ifOV}? zr=g^&aoEbTWKlXY#Q@rx>8tPo@s%`(lcwaNot~w4Abq0-rtZzQPYX*N_v0N_CTfKX z%((qC(SK+FkG{&-Nh%i;ga+5Xkos&{Dih%xy+pK(kX_d82D#W5|DP#!7ySYa7%n4K zGRClUxjHIXE!y6HMDB(Q8>m*xfAf8Ae>c1GZsDKW3rptVwJzzuwM=eA zX>lu+#TjH{K8&h|nEuJ%g8Y%|*`I<`M)@xI* zK5ng%Yj%dtr|me31E<(S!;`fO8(GB17w)~0?e<&q$wsN`^=IR;e)^g?=p&%)KBo5I zUnQqXK1g?Wp%jx3t0(KJEgbmbPm2$lj>up*xBzj|1os9(fagg?J#lju$ z6_8nu@txd(^&PxCvlmXqYK&A_$i;zGs;+SB198`N05Jwnt z+Um!hs@grwS#7?ugj7}1e~47dfsZt7O|UZdhJL&?Znrl}>H}eB>^srypZuEnIk`j4 z#@=k$xacPLt*db4Xsfpf`6?S$W=IQ;jeFZ|m$2jHH1t-y!g0JTUrzx)VQosd6W`_F zIITOQo@1Z{Q_q23s$rJ!IJkosd6XaZ;<7~SzxM^xr#q|7FX(xt(-!77GA%C##&R{g z*j34cb#$|4t67~bf>y*UmkGFp;x!A3{maCs@@Xs9G zv3l`B+Dl8_$=pAK4F7#qL_BngLa&qVv^>4JzA1}N8#ug#zg4yL@3h26fNbBW@U68U zxo(nL8OU}zRJtJD-PbE*RxU9w-v50wx#3jNKJHX}n{F>qF$F6$-^j(Cl|elFDVd|2 zn!a@nS6w&rG$Wp}#4Yasn~N){zoAw zv;J08m0VSo0=xA$qJZ#fU7t(`Mz=p9b@24Ey%;g@g+=3njQi**o7p8UF0&8!BaxW( z0C%qp-!H?EG;xGS{gc#7zaD`-bZ1e=@xj-3934X#`}Fq`;r*G6y*ioKp3~{+<&`BJ zwsXGo!!lge8IB(mw8(-NWm4Ki`0LOAgSgCIxMvwBL$e*T3fR9(@hh)6t`q+;y2)r-IP*%#rVz5wTbt6j$L5Oaxkd9fR}@tW;4gCLhQhp8 zTGBFnNo!qfhfMRY*LkRUURSbZ4Eu-Co9xh{w7&SExIB`o(aq?UmBLDsD=2;Ksg`<2 z?R30+GHo$Fu{b@3$dc@ymD|6IXw*=N47Y#lt^pcH0Ho^^IuyDUmsnD|EdL=*Ou_#< zRVqN#?;md;oD!PXd|aLYmBFmyezI|w-9tK^_NMI!6kap&I4Z@_lQVmL{y?vpxCId! zD(K*IVQ(v3U2Cc_sxYMT*TS(68)rwv;{FRx--UTz$dkpj!L*<{FGd49yJye2W4|< z1w@;-pZBgOud+F-%VeBzLmqPaz%rj=l$JEGEw}$vpF;2;tfvgDFWAgprL7b=W2?d??ypI&5IKxW+;(?j}uPuERzvv9yUh5$4z^Q|;0eTKcbxnJB6R`B<%PgZA~?84Z`%@jhzgQa%%*_-w9 z0GS}6EOCraNaIUI6m$QpWvE!%bW=cXOmR(wE||Y{C0TjFCTVx6L~{}D>v5VnHHAkR@%>7wL*)jg(`Z| zH1){0RseX1fxvH$RU1(r0nnDMuwHI2ay8B_Ggf!?JtPrv@PKwlG#UIdbbDeGl$Wf- zsIsu{7IdV$_Q4HV-g2?dY)hpPy!Gr1-dony5O5^~&W3}TC07Loxg^^U7?=@s@ia%|oFb!|*>IqJr8Xex}Cj%o0hl3Y- zz5NNo3r9OW;;D(OAXaibA_AYp$7lg@1YqC%lj?tt1_@!BUS4NrI@%zvT1XYBRnb!v zEHZH;E#o)Fegh$qKKMTfg(KV>jaZScJ!9iKW_IU|ly! z6IR9Xy!OoXU9D^75aJGDbfJTB3!+}AsGkFiP(lJ1-xB6x{eFn#eh2a5?8sv3`dR$e zlQJNw8{3ko8Cpk;?_nb%2<^pDAa@{R3pBNpFku8R2A7QzF9c7BJBkuV-vlPq#?j-Z{j3cFJMs*3n$HdVRdgR8 z_f`>-{jIe-L<6{w22+q;pEo|&(->#vTf&Wv1rBfKqFpsSBqbX6pO6*4>|OY=GBdVq zNYW(LPZM^nCn^vE4g2BheW2k1(N|KnzT<45`4R=UjtK<7_z{+jwkZ|eb3}A@awt|7 zk@C2Ate@k$c|KL6^E$|Ib^0>H-?>y7LkWbaNPgB9Vc!NoT>fPONEZNrz>2(xrNM;4 zxd&@8t>M*<@NrN-3kM4n3od1uDhslkH@P}&K#j+f6!gaetJ)M_`C3GT#GtjZ)se`6 zTqq=0A69O6hWs3$p}dFXNyBOD^?<9XiNYs$gUeWD*u>ZhOW{Rt=z_HhMOUo}E<|f1 zBCh9}RnLjcOfML);5$GO}N*xw~GixWrw zKeE08uIcWLcOocZ&?u541SFJ!g3{d$BBg?~1L+V@kP@WJ0n#a@2m?l`l$4~Pq|zZG zE$My6`@a8sKc9P;ESTHxob%-Oi9?su6<1dFWeD<0>v2mt9R^Uk@*&Nq{9^0<5_|97 ztZPk?wXVkcc2BPaV#AQ{rNR+NB#S=*QtpbXRGgrxT`Ob-i#WN~B-e{eG`yG>o7;oK z>EergB_gba+W4KQM4mfTmDuEHNI0VU78lVxBZyKCIP8mvkT^8#DFJaT8*@{&gkBnrk_lS2cCqRZ*?o<248hm*2>{b7}Qbg4Yh)`*0H zx7}G4jk0?h^2Xs8Z8f3WtXd2)^C1Mo6|_^Q7CSv5_7`1Tm${@sF&uL z^nK&Uz?apXopCr&)5KDa&aYME#fJuprhm=mqG-n5>O(MNInvS z5}l7~pRgnB;dT~D%mQ&&iWDI=0?f_nAC>Q4qKCYtL*V zoW`M`D-a<^`GB^vwnQI}RWo_}V#-v(s;b`pwn{7!Hjz>poyBS|_GeeDE@g8Y2OSdB zT1&UB%_Pje7XCIbB{FyLov+kT3qz;=-P!;+G12y8%)16YSDFt42e=;vvnv zCyK%1LN^@jrM|T|TDpZ648rNK(CEnLd4W{-nrMi`LQ>_}oN&F(=SP#-mDZxKyrC#x zl#1#q_7{XYpLO?e4d1oy-`ROn3w4zdtQ9T!0ookmD zRz~wGm4dK=h=QPUmmf15=3AR?rmhpe9@rbfF`&a$s;K9Wx73_Ipi-NSi^Lkvr_axY zXh3Vf+@H%t#zju?w8XKd%a4aj<4HIlz(H{r<|*aXKsNildzlQ!w&$0rYa>T;{i)gY zt&^CU({C;>j@$bRyKvNgQJd$lulVc)*o?i{?mbL%G;XNI%g-@9nB6fyf8kI-p3LY= ztIqoX)zQ*liLp&6(bj9J%B*rE*CI`zz8yn9X?B!$C~OmkO(56rpoR#w29;?&JzR?w z{m{>spWTMDG@K^;`sb5)vqdm`aK5MHt(H#FXZ>z4Zgt=Ec@} zM4xJrvtyv7SY+dax7*5OBU+12kAy}?<{Q*c1hE-B8bO)Syypy$|VA|J=iTe!yQkpEQ5)7s3Ci zc6oWv@2KUhy&$<{Xi>)cQ zx4rj7f6qa>ojh)Q`p0gAglG4p{xyl7Vsuen)TnMaXJ(wXL$U6u|zo`0aQ3p#vw`~F2Jez|8dEgBPj#ni!8 zKG5EnO3c%I{IR$%$P=*|=XR**z!s>@r-`n0+57IV>Llm|AUH)}bxd!$_Ah%YRT+WN zBev_3WO|r3u_GpuV=WrXUsaVf_eX4Ot`Y=a{Wy!6VJs!rfNTHL@V*Qvp%Y%+a#hAa zo0O(B`iVVLW2IONhF#}w*X4y}JAGS1m8aI}>75;p0NWMeVm$0cUVir6=o-FzyK1;f zK-Og^|WmGm~gmlJwA%cBAR~ALQ`T&CZ$|rw-Ai#x%_V63#EcfXHA1_fCAVZ-(D_q*nI9#f%)tb>2poM?5M}XK9WHPg-J~^Uf2Li zPoJ4{1vx9xt#Vhwg*0)rHlsYlvL1WNDRmBdu@F#*PD5F1dkHkcQep?AWu6|S*Bc`+ zWh|mnf*m!+?QeTOz*VNsSul7`tu~f@TUvzfdz99wtF_C;UJ{PaBKi0B8loDD6MS|* z@t1rlLLgQ9m-_EudKh+hwzoL2BQIb6nA=!)%y&r6d4qv+sr8}#z3XH$Cs?4B%?)lS z>E#>x8C+Uw#p%=*CE73%W&N&}$w4WOiqg1bv(AV4R@?K^v?#~E&97w=&ic5aL>)rq zRNSgjMyy4;fY_$H3%>fbe(4>mGb%3FVc#8>d1gADNyk3lZ@-{|g*R4Ltgi0r;xJH= zTGDN`DQmInwWPA_;pI)&Hl~X}rgH{W19#RBR!=jGZ*M<7e8paRAqe-Sf`Zb@%3A!f z{bNF9(e;hrNlco&%gfu|hvGN~2z~a<%uG6r3(LL5fKurkZuI^7nl~&k0FJ1Q^cbj8 zH5!jWf5GpF*fnpDE$@2q)VhN{PE=~iutri;ILNiC;l5ux+wwnNj20D1Q$hispylH7 zfEzaj*soFN{3K6bY?x?ttQucjMnkj1gH)r%#pTz8n6`7CrhB)3aqAP1&}x`DO5V_@ z_qc5gCbG5Y%lW3%VZWoY+rHBwB$R5_S0UiomNNgxv)i%p-Q?onT?vDwg6Aj{21RM@ zS6VOpppw0KV}5!zb+-;mfA>7L9v>bxj0`z7bKCn>)2db_(B^)lqh|z zt-bT+;%IJ(qwbZWoX_m@or#WSM^T#j#nba2**~M=j2HXbS~d>eHcX^@yvs4WXxC4Y z+SS!gseH>Dx2jYT4WfD@UqJGl*jtR-=)k65NKtNT-GrkAKW=BWg!Fl;*Y2FXU)oS& zC^<`yB=G&DS#42C4zxjhj_ORjw7RhAeQUzcLFvV`DD?Gn@M)B6>n^Q7Y?v4l>6B5v zhGK^{3*r)Kuk85blwWLYELk(`u1|L+@s18pZXVWOfJ%1Y>|5S9(5I{=CB+0B4lDSc zKJ|~3Fr(aD87i5`F?Pi?znuMSHW8(m-LTQr75cLEe(5XM+3&x9Cr>)wZtT-drQmdd z#gmI+`?jz+pjFXu8j*~C5Xn_qYk zQWn5r;m~ft-Z<7&_)asXjR6$a&Zc{+&sRBXh94fo*%F$k6HP$|9~y~%ibILUTCvBX zkdC91Wh#lIf|!@Hot+V@zSq^9f6V=eOp83M-R$8vaSE?@U0qm|SFq-1Sce0j2DPLB ztL<#H&v!_0t3{6MeZB}d+|H)Q>cqx|lZ=`L^f|K^^O2BnUu~@VRym7;`LK7v*|Uj^ zzOVLvB^k_FK_4)mG+%pThz7)o`5bwu+xwP^T3q;C3L5R^Yc|p8CQ4{Qpu&?OcV>Nk zcO4Eog~&OAg=PV>+Lvp8Jcsu7#b0UMfs>>!#;Ucy3}UQ* zwfE582+km$PCqXIft|gr)oihvuJ#f&m*ys;;k%mIdL*c(U{0L3_XvCoNt9$#oarrx z(k&}AZt$}U=e3Z#ihhTC8cYvkP?6388lw>J_WAZ@ad~^I^up%{7^sD{B7F@}McjZ9 zgq*vk8GIT9^@sNMZrQb7>!j>*X~y7&YQ1Ym2tSKBb?j`qX7v#wTcOp`?$EwlQOP&j zrLlQY>kBEH9xDq=v$M^zBJ-j3w_M*Pg>(l^7JZwTWO8B0Sc_t0Mlu(-+!w7%SHKLg za_a2)(IHa>im|jvtY%(hzK4>tv}*EOJsC-wpM%ptV^&`VJF&nRj$Dh)kI^q*c5omU{7M-6?r_)XlAy?Y0r7 z^#P`-D!bPAYUd-ASkk;nWzoKSoZik{ruO7=WTY#l0#;1Fg(Qs$lBOKLAhDx2F7T4Pw zzN!Dwh7|}Viqcm*h8td2hcy+8a(54Q=S5>jZPCz!u*zd-*@(X~=d+d7gSu&GPMXAP zA!48ZTa{!;LDqaWHi+bfLl*Ag=i( z>ayrbvFaA!D-AOZoz<%R%3ZOyu}h=Sk8-QtUe94^(WnAwywji3qG$d`XBu68{-Vc# z*sj+f=h^4N{mc39zGYBa1LmE&VQWjsekaZEE5USuQ^N*{&neZS2`&pT$AvIyq%{^U55DYSzMRw@-hiw3HJgZ~=X7ZR z@nNlMgQUE|P?t)-IBYPE=J?VFU$FXR^6`YH6UIN%WZCrQuXjz6=t;lf>FMiB%a12b z9eR25iVPBzDPBH6STjk|r3Bwt++$X?#Y9PlxAYiKl-<>QSFWmz8YqqH>9N;Co`IHQ z4enLL_HIQ`GG~1v)qY^|@!)i;T49=qaYJokTcXjh8E*GtH>}QZ-miFMP>GE`JA1Iy zNs-^4Vq=vHJBR$upPgoQ4+PZ59s8D6ALwxIIao*WjbzABwns@O+xxnqac{6gE`&|+ z$?u}XKIM6t<3G7G@wTb=^7NdkDI90-CUqj)h>uoA3ByI8A&L6XW?J8Pw=GwQoN>034FyEBU3hBuJGlTqKD$^YI85Ac8c ze_!#%f66}}j2*FZhbNeCq*z^!tYmf4X9^MOOc9i?@7!_HC{Z1G!1GN_SLhR(OGb+# zFWELzA(x1VgM&vURwpM~nvjbpNhMdOP_8e_`s*RpJ_WNLDK$6iYa14JcEqU+dmw~np{qrP|ltLfAr_^P{1uyP|&w1K2mHk)ITtn;J)25dG$Ln zOTbxrAzxjYkbb{Ehc-vNeh2b$-g0stOnnqEm`!| zs>b0?!wll@X{W{nFQ_V`iKP^hZKnrhB1ox&Se1125;&Aua+TqpD2RxFnpj9qQJZ2= zUe2#rPtFbhxfBRe>ad5`FOiTS2m?=)zE+9NDTL`NaZkpAd>hoVY3tMFE7=g&geEh3xp1 zhF)9b(uCx4dK47UAMM{|w}%aZ;YRcO{px&j0I@z#1iiSTjQ{Dvg;-yUzX%fMU7N7b zoaniIjrPau>d-5(VN`8TPK$)s{)kA`?f}bC(7@cCBW{=sG(* zt4(wUE4fv45)Jg!>4m(-nWx&cX(+Ur+PQS?(Kb3NDmLym{V*wg@(dX`0+xah_JCZv z02&0cW!<9YIw2)R5JZYNmxV;~uoXl$u-A(f9Thm2B|Cm%b?u=L!iKejGu|OKYpfT|4bMj?Lk*EE^3kPbwLYW!M})~Pu?CiLM74ilcJ-tz4WCg zIf62O5gUyH>*^nT8q5T^r7C?w zlu~Gv;a*l2505zVX6P2|S3ziKgd0id5+JHbHdD7D;bBv^|9dkWHZ{lp<#=ReiNkJ^ zt$T^3-G$~+v+E%z{cX83rP?_x?c6j|0(L!dCRe@|ytcBk^G?R3f2EcfSQbpk9TW>0 z^%V$tHgWfIba9b6v@cVq+Kl_@E#wy?6L);Uu3WySv-_5OXZrFr&)>d#EhjR26PdlM z4GYH6w z1&!_hYI9?Ht+0~S)~T|O!`Kn1sH>}6t*7pAKs+*}PdrW>-W)={#4Nj5ecr3C;V$QX z0u80Ipv_>~eBqYx$`pX&8%0%qcF)~3X#oG%p&~qd2L97)7HeG-JIRaC2r2c!?pmcyc0PEOPF=MjKV|0@JeWeg<)vue=BV+96Ah7{~ZNUeaY!} zl9M^@?5wPNbx!gLbw13DFTcP`YtS)btRXaQube$NxUad~(|?m$c}M&ctFn=)YN6{* z#&wv|%3HmzI23yqj5xWjK0#&F<-!ad5Rp34q=Y=~UkhLpvP#0RS0GwiHFbc#OZXS@ zJN<~}FXH3*_if*ue$zB|HU34&MZrIxkPXT0>0eQ$;z;opt%(vQy(~d?EBsRmN^)%GrBwx7(b)W^To8eF71f z+g!~+Mh5C)`^qR>9bO^atIsL2jm>%h3P&Z+N}5z9ARypl|C{=qv6>pQ*~bYqt2Hjp z<@3=szXJ|;SLnr=zecSpexU)1Vd@)`^Pr&^Q!G|2_NCI*Mcq8AuH(_Smb{Y6wVEA4Z_`niu-|EDfNo5CJVqCuPfcm3!*E9=6v zIV(5Yy#Cf{T{3PtXJ)&dhHj>|1r3=W)i%BM=fF>Z`JV^g z$FB^i3*qU`Fmzb!X@t;#DG+1;GD>k7gP#kYyWu*Yu(~_};)kigZKcLwRAUqkt9VOe z)Pa`a+-V=El}hTIKScx z*s4vOn_O#TUTb1HfBM;nAHV<9Nl^A#w@j~j9+(NxMYZJx(Zi(eK);vb0y*A%dT{Og zfpgo_@;iLA;g&>1gcLN)CP8TIz9UTPzsrCNgIU4Fz@?yArKKP5-T)rj|7D=34^)C3 zeW>}~Fa63v*`lAAWmVQI4&^R#^3g8=zwz@^#}%#_lg$m!xC;#`ir|#;SNd z#U#$34{5%$=2_<_$&^eD1Ln1yhg&Yxz%_%|D^M|(RYvo1l${TJ`<<7Tj3c()QjI%7 z$e3#|Cp0uH^cS9rFqofv$BW$KA}kT7`|n<$P{Jr7&G%;MM^O|MJ3U+TTbGBdtl*0O z8}R=yukvj%Bkm*rzGMwe*wf2FJ1mBU{m1VSGBTGeQ>;p2tWt!&y|Z<+YpFdW*rbN- zzjXG`;AlkMz{=S5eNF6!1FI7EusU9$3?WI~xVfPPD%@B?he+>*K8 z-}7H~-sxEY{=ucfM*K4m{QdFtVG3Za{xkNGYz4oNNQvX?4+D+&pWuZDGCIM=w%8Oj zF`BPpl-Lrh)o%oSM^5UWKH2UikoR38sej2J7D*gH%w`zM62KCGK2r`u3nfl4bPQ))xkqa&4Ixc{!sB`mOVLXB6f0{$fycAX=Pj5tHbW`9dDI=rx+-WJLxT>T!KHNF z+4VyS(_HPJV9?ViKYc|?s-mKImOj=!8B-8C7!b>%mDA5H6sC?yW=vON35bma)7S{? zVh(AkO>ZHa{V*lOxv2

    4n3XgN*~Ozlbh*#T+>~J;h=@MW=tHb14ol@PJMJH3Qxr z-!JARgKa5~H^~tFqfS-i3qBGl!Tg5RmfLBzGdGhcR}(Z!+6>my1O|T0ln|8%ymDjd z%hn;a8m`f%FIyq% zO{PppO}65yWRGMevzp#NCj25^AN@O+Vzl?J?X=a&OHrJxhAoaTXETM{Nf6KBAjSS{ z_5vLZo5F5KxE+(IIg;gk4p{aCt^=AEWMpU=&T|Y_cP4h2W6lh?f_o(N+KHcaD9v(? z0ehXZ#hvHf^{j3K`wCs2hZW?bN;WJvri}To=TwIfv}+smQxmha3n~|4zFm>&ttjT@ zWPaYPGJh-DGGceme}6F9Cr4MOmubsh*QEy3d*KP*ognrw@a4B zH4aM$C8uB+f;}pdbhb+N4)dTy+wN7w!>fk8iFn&L0#C^JD+MdKAT&zpaAAq9 zV2Q0CEH(V4<85IX83NFdZp3HFw9QlPoMb6em0Dgny}ceh_6|>LZwck(6y7q$oVZ3o z1EN(}{6vAnL<_W~?jUu08obg{Hht}dJ*m@V;0s+(f#1eWH$oKn>YN{{KYyzpizfeg zQC3+-hY(DgXzXC0#e2i+%T>DPu445DB5)zSIs^z36&;;7zYPsNZxV-wLhTYgMo1Z@ z%PQ^XC{j&_{B9EN|0t<{&-5Ho&@Vl`T(07Rg4gk|Cdop+12RG9dNQ+B_IoyZ7FrPT ztidb2ZPPqo+>5Gs6IJE2CZk&E&jufuNgi7Uz$V8Q^|5t5sOKBANJB%xcx-iR10Ut# z;0=p;IQvrnHyvn-NCid_>hBb7G5#79BIz4XPOphEQGSyK_q2dqn&woLLLMlQf`PUv z_yTV^SGBG%RgNr9`5SgAa(C`bVah!ie(_JWsL{rD(mpg~qx{TRB=AvW?rp>!&cQpJ zpNz<)K`Ayqdw)Td3(ZABLcj&g6*?>v8_po84 zKZYF~B1|D>tjzbozjwh^ENS3TQqzZ3f#~YoLOX43op@!==R(St$8>DG(*RHq@*6lj zxhKVn{U*z0$#?2N<-R*Cy?hy6c+=F{sb^*aB=_DJ{{9m#U;gbOR{L10*aNBmGZyha z$e^AcUaH91QI+DB0FAIO&3x;?tH5F3fx*yW93V5j2_- z%QHE8eV%wdmCm64HJ|!9{v@#!t+Q2Ve?@ASs8o;L*Ok0^-_*DXwX@|CXcDlAyoo{B zDQbGVHu@Cyuc(JDS?JLUzt+Eq3x~-iy)6kTv?az_gT}#>9fq>pmb}4r(q(i}G67!| z{8{w6+O@T{QGzOAgHx%-MMh(~9o0I6dLiWBxj9t%`xh-|x$Nnq<<){5^z`%$^r&f2 zw`ge8x_(mA(k4-^o1H&h*Yf3NK6N>atSoTZd|ODVZ;CVJ#QIGu?#^#YN!jvoRAjOc zF6mV8k=axj0_f|K_fL6lA5?XB{@hgF%<8n7<7R#-S~{L(SXD>@xNz(1v-IE%7q zN%@ZcP3YqjiHJNic}A0l!SR4C)a+U(&B!I^;RtRSt@x)%VwV0wd3jacFt6KJ8qDOq zIA)T3irzgkTYnhc%I#h%RPi)E_d*)qi>Z~V@p8Wp?sNtofVc=@9WH9~aM)YOG!s=xv6iPQu#y2`A6cSUPW*ViMhQhNj>=A7G{*B`G*g+u<7~tmtFDo{rV@$Hh#9obSsF7s{fdGDiZf(V{W>ZB z&Ot9k?~V56CpkKIw!4@!$fW!(hpH7NlA%~~IP?g(fnF#pm;2*-+Kp2)V=1|&JijMW zdb$ppT#MQq8F9{w9^ti4(?-Fv+&0%ws01vwh~=w1M=3;b6~yXeM}I0`E(9|Z&_w_U z57K1jW-aB7l~GFwB_$~-z|CMmNKZxWbW?0MyN20RsrQ5Y*DkQFRd_gBasB)c2d66! zvQ4ET+y(=Pg#ccXre6l#luK`aY!kqKde)fQi%>m8 z#p>^s(K+YR14@G*0dyL4sxAG{I8vF1hX?QF4<5P=?bKYuHKo3>pI>?J8BjUe)5yA-~7Eo2a>4E_CD_mvc^dgD~Rg>O*p8}3lB z&WMF<`Z%Anr)M2QLL?+-gP%!8{mJV2eeT+rcZ@c37LS$pslK1rHCh)_;=GHqF>PMA z#`-3_y^2z?t8wGbNiJdS_YIz&lKIj~N7?%)Re-QLIh+bQpy-zRF2ZOA2Ek+Rg7;+V#VA6zIg|PkdV$-dDP3&9%xfJNxK^sDu1?{nDXs9Z>y45v{cN!DkQ}FXz<|Gdg12=K1y6 z&Nt6`AuaC#cTu>;y#}xzTqI`q(h|9o6Hg7P_1*xpj`FQ!9&utt~muBYNW*pKeAIeF$|M;-9S4EQPYu@z?n z!C}z>DU_pQdgDr?2Y-W1ni~9Q;eSMLdU4GZ&OD1frwlHN=mmHbsp5sK;rQ%5&z^rB zJX$ic(R(G^q+hSxE5Tzi+hmjNv-~B)3~)@RTR#9XGyHU<9nUY<6z%~tA8Jv?Uk{G% zzoW`+%lpU24B2OcHP*F5qxncxV&$IP+s;dD8tO6TV|V8kijL=?|3Gv_nh(&cx{#A; zj^NxaKt2_g%f}SiUaZVtVS> z*r)w>>?ZnZ47i<;(* zkhl~zf*=TiAczA1(_fiXC+!B0XIB8t8-pMB@4uf1U}VFqZo+)g1!5cbO0a-{e--dO z0Hh>y@H}RZw zn&C0d;due%TnR}kUp#+2?wt7-)%nB#rXt|P<5~Gz20SHT>e$& zk`902T6F%4uDxcwc7Yhl+hREdyyC%Ded;i|`#Q`*i^@6tt$S_kYuhdjr_Roz{K1Tz zC0%l2aqtG1GF-VB^UZB`P}n0)E|0EbnCAN*9|?X*wsra5I=YX49#F+zWR1Ouit|32 zT2sXka$P|;rGxNcQ+p+sEVm{UX6NCS! zOB+6p>OX4rKfb!cgGnC_1wy+dtBxH&;}@>!{+r?ORwKT`%Inynpv-1IGMWAio4*J< zmfY4~Db>n9b!=Z#ixX@4#IgLOrVhHp|G^;m>zf?c@;^Q%oWCNF89@V^KN?ZufS@9u z0>)8faN!-gf_5l8&`O;%nfH?As7OaZ|N1ZfSH3?>`nzCtmh;lY@s9aFx3$IT0X*im z2@lqmGZp-A+Gc3rmJ3wx5KYjz3xiU^>u_o+u!iWHy^oh!3N)N!^993-CB5UI3~ufC-`TDX>OC_@(ocHkHoSa}p*v1I zW=BJXl6*(Ow8m^mtg2oC%-erS)z+2|Y+J!Tv^vlgc4(xxLL`KIiZ+2jvVw^3hWS!L zZ>DnIf*a%O^z5$-I<~oY%)UM-{0Z53!5}*amyEHh zvMnEHuMn}R$(g>K;KJm4Z?OEj&b8sG0cBkogXCf9-r-qEr#U7MVHaj)f!RMV5Nt4*X=Elyp1Mx4s^ z@r8_&EN!YyTlfjL0JOa z-__OA|0I^11bz1U0Q&l<4Vn)uKYF-E`COsA_>oZ~+7R+-2iE55gn;wgAsYI#raHCM z$u?n3uZtqHxDb>SYOlwaRrgK08*I#K9&L42oi{NtA>uHTsjS|QtlO^y>lQ)yG&(xW zAvy2$I9d|7d^xtZ263uMKL3)Bsc2$tPwB41Vt$l5f$$*v^%U2y`IM=oo=tW4=ep^W z!HL0RhsOgi6#!qXe#&w#3lW(?jL?FJAh%F5;YF};Fz}C>7@2eNl%0dVw`1z0bN$XF z2pj;2edo95x26k14|TWMg%YFt>Ct(;BbQ`tj<=t(&sLo;7mFQ3gWt^BERsZ7QNX-% zF7-z6LeX1gKI)hSmCm^=1cI>NmZ-9PL$k^`eDFb%=Sp|?qA!2$Dk#j^{VKC1o?A~5 z5MDijgO53%wbnJe!^X*_W02H{+UWcc`0etARCt$xcTBj^OILzQ8THx+0YGmKz0Q?@DErF_pnh>$}xk_WD8$af#CA*0oa`J-0rgv zzkx}~{GE1XewvZ}c(Oasc9hZaqH$mH*OPjvfCQ!GC2)A-Pe8D6MdTiX3(X5h){2X_4ri zEh;=Li^7K~P`3b}UOi@cFWHnJEv0)#;ndSq!51jnsG8f(GO!&{{zbf?Q=M=Wh!>wb z78H2uU-!B(X`42`2sm`yfym(}Jd1^f9(pZV`2`N#kAD-a)lV;L1Jj0Ie5dNb zHLl}{93;S!={X3$&?xRx;ZnVp^UW^z>Zm|OriayNoYR|{%auz@#~>j@b~3&$VDj8) z%2iBfOZ~Op0>d= zp=-Q6ZhzCbvraVLS6D!@7A*hz;VC{5Cw~SnvAajgV&Y;9kK}$+ANZt4_O10x+)!+_ z`P1cN74^dSPmAQm{AoQO*GNPfVdS|qrZlcJ{vEl z5RVRCa;qX=GLbEG)zTWT}TTt57E8lSmRn;25}ij zCBT$fhzHqW5C)$52>BJ<)M4_-IAv~bR_UIrxP#TL#tE@ppKm=ezsPAO+e{o+=~(GeZV(f|Zqp zFfcICzd$4N+Tc%>v91TAX(rDWCE`%1iY-AN>t)H~DCr`_ehfH=$7%-f3hh0rMPZb< zTF(NhydYoy$2+pz=(DU9Lg2Tl5D0N`88M)T#$^lK&T$Ol7|(^s`rnIMF4-Crcb#rd ze`ICl=dTOoIEn_++&Sk@&83w=Ne)^B{7Nn-0nQn-)XdKUaRM)EKEIkTbx9Hp*rhLD zsu7-ETLSBdfS4sGD^BSj;8{gRMoP=jRl*@y_0ZB8+866 zma=EF*Vh~FNnTBV8P#=pj%|H+_t62?&rp)*%FOh-CS;9EBAI+jAC{VVY0q@b+`cH@ z(SgOJfpIGX4G8h-_v{}$o)z8%ks(RuwV^&u7hTj=R}aMhB(sl~1h9x^ImJG4bx;9# zH2|Y$F$`9w=|psg5oBoa5sAQV0Y%rYbt|Ph&%f+UBmX*LA#Gnz_<*Fua)ZUy=n07PmDv&=ijRk&?BC&slWY6VnzIIO<+{aI+C#Po;zxjB)3M@Cp z;vKwDL8GuO5CVl=+&53j;~BfAc1jj}n}^paDG>z3Mh1+k?XF^s=TFOK_HNzM&}n>= z8z-47nT`5+li;bpOpub6mf<52ZR{REa6b;O ze6Sc`31Et|7KTH@BoMuTB!dXof!2$(AG<|n@2?+2c*pN6{uA&!ER44r*dSiz4x#G~{I`u* z;jzZU3sKcN++o-}?l3EeKxB-A)XBIhgfkV@2zfRLlNzX45!V=qFPm#t?0sVN#E>b^ z>cPbkD``S4R^wgj%IYf8=MZp4gZ{)vS~2OKPvLvC@X-zc z8@2QR`vaS5JI6F1^pK`1u5<3-nX^Mge<}5%!2k-i3YO?GCI>PDjI{^Gd0iH9 zp&Dly&|>-w$_?~sv}yE_43X?2IFXU7O3is6t`}Nzsc6gi)0E;Ci)pxjPRRUP?%XB# zY4##yFZ;Ua`9l`azi9?uMm5qi))FouSDmd{9R4EMzzG38udc4vhZ1IX-JvM9qsa5e z12mo=g+q5Ru%j^7?XP9N*em~r?b6F3UX>+Ly)Tc%T%Qg2@BjjY5Evv?5>&nds2up_ zuC*FTs<~5(cO+ZGLJ{mNY%<@Zr71SmHNS|f;X}|{DAeFH)UAiNj}@w8jlqDV8su#$ zWU}52Bm|q3rENO=z6~GI%X0P5x3t{l>REho4vDdWxg=;3%UasEd}}jKdcO}|mA{*W zz~k0m#CBU+dW>efB1j}ikI=i_(Xp$2ms?<_#V54EwbZ;+qj;&j4Ottz8eM~TXBvPj zAdJ2uu9)LXg;(t$ONAxg!cyaL(PexBOS2wc76ID3ifxfM{%LT##%xq=2c?TbZ6Et! za&mrMVbYcct>gFzZ(g`%?s4kaPr&<2G`PRqG~-VShZS(GzOA@R@RUS_fItYG9|*g$ zZE@!RO80_jF5bKJ&AJJ}TOj3Q@1#yTx+f6zF1wbIFeP+@(&ngSa zW-2rw^~xNXcO3aXW=t#Zv?*bbWW8+a=E&^c%j!sQ!_hm0#7h7tXO;hOX@{%=wH_Dt zIMg;ilMNuvwoysB{V-))gXJn?GE0!g*c?7GmHs!4tdB}mjmC_N+%%HnmtOHF=`B7g zF8GT$ZDdMr*84mPblnB9_7xOLcM+14;7e^w-_n5C zL7}8iJbmxLbv$3^3@V3ktv=-}m2g1+J!@<94h7Y^4z=l*!4*^hc`YaB>!K?G$rFNP zcKCRNQ$htc72P@}``n2?=UNo7Xf`mo-v(5^iU1}Ev@MpGlhOd_y;+(GAIY~Kvh$rEq)xo;fMu|3O+|y5 zN;!qMQ2t$omg?yuH;0lhbyWsSiTVdhjHF63S`dea2z?NTt&stZLe#iq4Nw7I9nvpR z<@ujD@#ZP`WK?)_l#8PGcFM*%QC|&KNNH8um4{OW!gsQQ)y;0O?)1&gG-)((ZD**3L|#^MVL--$WQ!Int)^(Wp9k z*w^c~JKG^tWSm}J7unb@(;YrH$-kyagO=!HdMBtkaDtWI20YHqA#ozYK#oj1Lmgsd z1f?n%vQfzXC=q{!4bFoPrCmlD;>f2N`# zFzT<(NG^>}L@MYz{IiXRxgifEbdLzkumEDMN8-EI?9THdF3X?Gc#GC|Zx0BIw-p}~ zEx1(`p{JS?sZI^swFWDQP zxy5kDy{vG5$63Q9VF)L$7LYuZYI|Y1*;24dl%`sF2eJVQF|pRmC%9CVEoq;G8F6v5 z^l|1%tFvBzxxMzw2-j3#C=T5fVvo%hmpvVBQrlL>`$J~7L*rNF;qGAP^ zRG`yGtg9nj&;HpQ!cKy~a;{0M90uFUaMjdxE%=$y?dbYBGUDH4j|LTWYn(Lc>T*98 zVv@r`BXg3|;tXCCIF&_?mv>t_*02q;55?%d)z%A0)^|#EQ2*KB`y0nT*o~k}6qDx+ z3&V0+`So6sp|5Ba4tDOIGbPQX%=+=Dxagkog;6qNqC1Uf*O0}Jcr+MnF^PA3-vffm zmj#42G_S8S$+mlnF`f4c@4)jm4nO6{>gC81J8j9PD7k)aoc#HW{=yFDB!#GzHtlV& z^&n#jJGu&vbH%>mFbV~`Skcu}K#w;Yb2NZ_Q`GhX15a%Zv6Z+EX!j~a>zUqQ(u%R+ zeL`n?Q0r=7c7q5S*>9?CNxY$=LJ9eD#u;3mjuiFuQk1+SM0uf4uDBph7p0tSqRD}& z=rCs@lO_aEWBT_nttNyKpJ<;5Ub~RuV}bQRo9aT}1AyW#XDSsrg<`P}MkkFY$bv*F zxnk|Co&<1nkl7BU*=|puHzkr{e|w703DCu_PZ*cpoG!h&9EqD6%z6?DyJ{CBTYgiV z9!xf!57`ILAsGhpcV6XLuO2&b@M}9l=A@rEj|XU;6tqMy<)yVnMuoSKSweIws4Coi z*Qb^Xt8mq#&T4+$ovU9p@B3JiN}e}$zus%iCgMhEi;E<{xea`^yE0#dGQKoUS1*l8 zg!F3Vq+M%A3l8UBepb^~SRN3n;?!kqxK3DCseLG|9xk`GZ-A+@zvAoRzBH)LtgTe! z60Bcynx*)e2XA!(djK&+l(wS2QIpb+mPiah^?vSV1M~Ua&e<)o{KWMMr+Fr)FC{9# zqd}Z8>ixu-eLpvCU1vpAj?Q%LY3hR0uRC}Y2z%KxKu!fb7-8+m>f)82M*s$TXhGrR zCzAS7`NX#Sob(s*hbzw#<)dGCucXg(i;M(93gb4ZywR0N ziT-t2j<9N3f2jbrH&p6Z$b9Xc9ZJV>H&_SxNFQe8>%0sDGam9IuIf~XjCR*S&cWUD zAqPj!duh6zUXCThj7Ec5z7|6~H$%50vm`#q#Hq)V+xecQEXO$~DDGH2P6LtdJG}tt z1OO5*3l`X~)1O_wwd)h4yV>kY&eu{cw=%<@L^@xCejB_7z<8lPm7_x&*>w$T#;zvM zo;Lld)wsK1`GY&UTVblvIj$$sBCB=2NPp4~&L*0l$||F$cbRTZa}eRfqVfbZ@0MwQCYnPQY(^pRjbp80y3ZjqM*_k(o9z3FX#WoelJ z|Kzmi+D555?VJ(khteU@CjBc01CWe=zg8kqV`xD6qK7R$AVC>;=ak-FscMUh?wC$O z+n=)&+z0!Sd-P3fgHD%zxp~EqRJ~CU9!nX1FmPdhwY~5VAzMou%WubXGpd3-r|hAh z1@ro)8v9^}tE=}J+Dc+0gofB^Fqm%wd0RIYYtNq!54`l`y#Ze*k#SHZOxi+3iJWJO83Xp&e%wK9dCuk=$#?{=njK?sYG# zvZ3ouCJ1M=Of9-;&?Hc4Gq*z~dm%m>7xJESx$TVN)#)Yk0f><318vJ}g7>Tsd#Nm1 z7~5`XNaTm*|9Tof>Pb$!kwm4vO8xHrpVO#aJ6BL(wO$#A@qfnzuz) zGM?K;`Z3m+k5-i^pxwT0nrjgD6QQG*WbAv2`a-#X1NJ+&PgW;qXL94Q_EyDx1_1M^F)ER;)&`X&)440)7Gh% z?7nib0o0a0{9{P9bv=BmTF!St<{{0as-^d1Y$M`Cq%ucVvS1anS`aRqXVVJ?iA!gR zOx(T_5w|zc&-~0x)`+$us@y6c9lPh?*C9cUAR zei;~4QCD)secR7p!Co)?2vlU)fVJAQ@_ilq?U$<6VL+cYv%Pz1qc$RM z)?Ln9^PUu`X4_u`$NbS1U%b;0=)$l=R9GbmI z0p6M9TPUCzR0P}a$@e*F$Ua`DNl1XeMc;P1@+M|0-ATFF`C&=&1L62L^|tSAw#1ny z7>&&?OYY7kJuH%aXdIcvHqvpl)b`~ZS^u|kBQ8!P58|W=dcSVX@Jbg;iQ8cIr5MLl z$+aU{nhTMJ+qc-Bre){|bkN;XbYfIo_~g>gB$x&!LESRgbR9_Xxd&GseRuIH_$tQV z^1Gf+dNClN{od#$i-(4Mv|B^StgK`224BqdpH9MH_Rg=g9dSyNjzSn&c}rqoOYJc0 zZQlDTnX=FF8bkyyA;}M%SbRd+Qj|@G?8gPu@K@mqgCi-<5f;6=q8vnDxtTKZR=cMU z^si9^%*SG9RM~!o?@!pr8rwcqTkJd=vVqUHjrU#S@)Z)dXKV#3jl8#~dB(Pw%UB%^jq7&`Cx!t)n?BhczkiskNS)y?My&2?#0t zZ}?i*{6%yh=RQm19L7mz@q8IG-4Nhe=J55rt&%;c_aC3g%jx;Xt=u{--!mIt#-ASX z$Ex>DCW+IH2}gqB!Ab4joN9hC|F;f&s!{+_+Gfalo!?YB$Lbk!DK=cJdRBVNDgOT5 zuH7fCkBKWZm0i|vtoaEh?@cd+ZoaA-8^YN#szKGojY$h_yj%PhQjr|7`)G+c?2)5n zdKc5W*Y!YMS4 zXJv&Cj#BmTwO-(pK_Vz@x?we4dcy7{8{PqXqOZJu+~&uLiAu8mAIw+OLn&Gk(IrQ?0JstnUd|;JF>}^8Bx};_sWc8 z&m5cM_+H+h@9+2c{q8*U=#M;{`@XO1dcB_Om0>@LXPaKo$aC4J?QVLf_s=y%K)+LH z{Ejb1k&_%xG#YtS;4$Mpr4LuSL67QYyl*6(fWNU#-SP%HmH+^Wod7=&U<2+4qFs@Ju5<{RG`#d1<#hrIQ*HDf%gJYof|9>x0P|}Ut7sA{Bq5}{> z$sU?(VzH+@=6Y_vjw1PI_DTQ#Tg2lx33+salmxhe3(6|YBf56AT6fvlUILBSp>Ht! za01TBz|WVpng8ZS`d5v^?y=6e6RCY@Lm|Nh} z{b8R_+m@DI_N&fd~=z(zP|9?f9|EGoi zkG2FuH2(L5oIBC#9cal8w0b+*48dia_j*8ee5gU+*958}! zyE0TS?^(6qaz4m!?P5I}_jPZDb4!RcF86gchMH3L!*(XyMx}3)7;}5Em=V`=*;kuU zw5FbuEs;ydzK1ceKgU|KDmAP^P?ymEmesx7<*k5sA}1Ld3g!UIZi-QlSI4Rq1O!Jq zY!c7_#|TYgTG??>XO^CdtAcv-|G91e;!Evq$=_)y@!DJJvVn>Zj~?8E#A@H1<^T8E ze4?-ezzv|D`49DRzL79sBT)e?s8$ZtHH7alK=cq;Bd#HemXhN@Gk&FhEIA6&O!^Ol zx6c+oVBWL`e0B*~x`qU~*mo9ZhP+{VS~>b4`03iB(^4U4>A@nkh39Cd`{s6ElMl;$ z-tvLWAyNEUAJ->Mqb)!6G8ISnts0$dAcUAJU}Y6uL+u*^u9yxE*cDLyapr%@5?a4s z)O`mn83eWKO6PMjoGb+Ad@evxUxa^Y&UEeud*R`^M+IO8{{Bm9_O>Uc{mG{-uD%Vh z$f4b#DT%R7iNkU5pje8xEUM)mjvv=#<^?L^=GxwPp2X=Tx-Xak59<$#U~v5>fEO4; z{12W7vb=3jE{(q@C8v?w_R511okqVEp*_OsWors(my6f`^p-f-g5cBH4B}ye`w)k{ z`veg&W0Z2rTW*nTRi`62dYbZrTdXT|xW)jj?YzWV z_A%3p`;f{L?HvM8aj!y+8FKCbp~F_uej~xG^%ANQ9K)pdVE{Z$0lM+fBY@L<7y_hV zOQ#OiCZGbSI^|>)pqFC+ik27~2PDBbCgJM)W#E-;pqje&xT7q#6r;N4xSX8A0RZxV z3+)(e0{?AjpmhfP>y6cCVC@hi)qsX~gRjH$<`${qqJz&k6-a;KI<=T;a`SmWXg;4P ze~5$doS8a*Wlh=5bv*wQV8_(*6da#_AnVZ{lmTx8eAg@$SMCL%|qw2<>^{bEr_L$17{DfDR_c#!ErY3h>8L9ejf)HhUG7{ zSCwFJ7ELW+HU867fNJTcA66ZLlHCTY{;DNaZp0fmWQix*AFN>jCwuw=$qEu9g!C6$#yn4(6fY?7TV^nM`L=QqF7+v! zP41~<^H`ZE!liD~;BgbUJeCt+yM@xC-bdBn zNEd=bUbZ1o1c};<;Jkc>wsHBm(Ssb#pU$V0$?)_d_#@nYLfJ%~ z@rH$J_h;-iL^EwH2`Y53Z!uSG5}y?DR$7EO?HXd@wf;TlV%{;&kb|^T)H82+;+<^% zHKbQa{tzV;D~(hA=Usil_ePJtl`=6??4EZy9)KtqBPIhPBIe6IY9cQ*#+ixKGl2TP zQtZIC)Xzl@G&Qsrjo?h(@=jqST(hzX^d^;JeBFZ)8$Z6m*#Q8O3I6x~f2xmb2;?;| zM+4}L!R={Q%c9kJ`0TqnA7vu?FO?k5kgM9Y}yT{ zTzu0kf1r5zoO6%Ie4Ttd-zP<|TY$9XyR)D2J4^*q{zy4+fW`>OX(H zh9sWLZx5~D#lVS>{vy_h$6jLju7+pL{^9~RzN#B}NBw^qpXL^m)3WymNzD@fnb)dr z8cnJWg=Sg5SlV+JJBIO;qv#yQ=&vMLDIcXUHGs>wA@hKmrRCDG24Ky67r;EX{R>dT zPr*pvPuT?7Nq_8-<&qX&%Z;_J90~5-#{7nz5?5U^zduL)oS69f!*FT0@}_;^5CI}G*|P7{Bl@}Zi13%ZPk0S+EacC&VHF5o$U>kUWDRxxHh z3l+d<49Gs^1HiEUUOJeZ-LDx36iz1)E{NY4ZNY6K4VRIaoV^im4x89{=A|ff=iS5Xn+j+!VooFK}@913&T45JNA5c9l7I7afcE+BcYEp$Z-H(n7+c(8E9{c_s}>D= z>P4RD>LErUYiMO&-pY>M+VKRGIr`zikOxY|FNKbEc%Urv4=n-~)|*Q__Zq@NMm(J3 z$DBi-7q%0qW{(>(dvm}4yRIQ0qn{q)(~1+NEuKsJ_D}~m)ta|1BM<{=9~r^5y=^N0S+D+Kjhv$ zWy6m{wuoetO^@3{2s(N1|ZPEfel6j!0B-y&A`asR(Cx}e{K$$)oH446wwzqyW4P_ zi}%v;$OebN^7U+}vH@B*%Th3E4aVI#u$u^Xjh=(5MAM&=h`nA;=-C4`*3J2PnS0Ks zz0bD^%98Kk*Wm*N#cE;h2%UFF4ADEskv;3i;$pCdvXn6QU(13W4j?)Q<=IKR_mEj& zS3PXU&7gnw68o9LJ&d;@9+B6;&`QCIaYWvH#N>W@i`{X=BAg4Q*KAeRYyT*HoKwIx zCl$g>Bwwq6XZS>h%*(g4GgEoy^pzOtAAa%SvkBC$o zq~FJW#*QEb2Th)=oWd9}?G$*e_N)Sqq1u|-Pr7f9%f6S56~GRqS4vAwOUqgTza}_p z0O40&B}ySy_Q&WTNkY(inGr1}!Q=Ber&AAaCE%p>3df9|XGN&78ntKqdR+boqUc7; zeIo~*<*aTO;~waLML`=`*PTmg)n4>YF!=o)sPfljW2;u;4*pp|J&z>2)}KF}06j*5 zm!y>QMa(RkO9x1o8}0S&HVr0VWLA3d6ms@&W_W1UX+SandjF7o2nzgNPdb6Wp7t6N zKk#slkM%EgX_=_UWtjB{^ zXx_IEin2hLouZ$X`9$54h9mxY`Wnh9nI#zeYc$|P_yN3E5405oHJ=}}d8+8y-T!F^ z9!JhZf!4Gl&9F3?`-KyJ65Aki@5G~>va)~8wcZ1Lro;e%IEP`#0{+(f|!G36P=lQpWm%(pMrT!LO;N`zgqY%<@GW41=e3;n95iQn12h8FUN-3-(A3p zet{sh4!wqCaPIPQbhX-izQtxO6?;UJJ(=``%OFifesuIaqGYc9{Eid38q>HXg2g$R zBbg(SN20lKh084R8Q}qiXXUcp^6I3Qg(Smw)Qp6MdM`t2dhRFJAd!Qntj8k1O_9+; zlMCuR@t(kAHk?CG_t4#ST?lgxxlm~saaSN|);qK5`Zfrn7mAMH=!9#C6|?m;wmE3L zL*uZb!`-K^A*_r~x$?ixXooL7Y7ORXr8MGYcVr-^DI>|vqhp?qiymnTkgXCQ!&p2R(gWF>ZZ&fajvziogE=cDUM%Di&Zlhc( z0}2uEtf+wVnX@-Y$EC{9mqkA)g-m(Gp$@3f4Iiqw>Kd+-MHRN*iIN`Zo1Bw@9iNnB zmk0pQ)q7r4wjTDjv3Gwh=3(H%Y<6RmfqH_ALUHBZ3P&q{jsNq5#U+kNp6Coap0pM4 zwmc<@GhPetIU56|N4UoaW2l}39PpLRlfe~O??7ZjF=1rIg*9vG2XBp`rNSo|yMxZS z|LcT4hF_i2(Hazy+9}=v8!g@Kd~j1Dg$UcwToKEw!|BP-7r87kHoeyGO3Ur6&2#F? zc7d}h%pRTOUC3?^DzpXkoxn%s=*zGl6w7Fn$59cIA!h+Wj>>oUMB!+VkKtsMN7xetx}MYx5-d8Z zuy{07>8^?*a*^T<<^^7Up#aL=di8SWQ(_{Z_Soc-iE7XG|7EP|i6AsrbWnTvi!miZ zd%y41k{_SHWL=YOTypAP!hQ56pobi7l*Y5p0Z(2$C%~ANE~Bi@=FXcJq~st8*{lV9 zuZ$WGj<3oksgw!gZC^TR;mP-aQ;|7JMiaK0h7MKxY|Yp%Jm}~L_1&FKw)>&|dtm*5 zkRPc#>{fCOIi-k${rwTdm7dpfV&a;U*xZooSuJ-7U?pnI*wV7x4BDz>np)S=_~^PO@>C5uKhzv zj)59av;@&Tdo|$hXBd?z!mwfby%E}Tsy@X0QjDN>0L6-c7wtasTF)@t?iz9xpZe3?EnSVEz-_7 zFcW-sOo95DV*7dPh9-(#B;bN&xQ)%ntf0F`kd^ zcHJcYa-<$!@1b!$hX*e-T{F6_w#xn!hP`_K4|PDyYI3T|w=UeMi~aGUqAij!{RC+4 zM{>mG06BL1Ud03X@7=F;bl+;o=CgcO@@vO2iGD>=T9h zrjlX92i9j_Itx0nKF`^UUPEM@2EzZnvS@y^lV9I6nZ<30PK!uyjo$NTZ$3LYeJmGj zl!Px=9Tb;xbr0mjoC3rZNFDarB?AMhS%)Q-qolLvJRk^wXz<$+9dt5gd+x_qHwXSG zREg)4X0`6@^cVl-G6#lJz#>Z97BV}{&qxl44)36>pRMVrFwY>+W4>!rr&w^rNQOaM zAZ&Y3B$1J@usCTqKJ*dKzt(PYwt8u`K98N1nO?rcrMYDK^mmqvHQhDI6(cBtf&t^Pdf80PrmxNO4FZgF95@DolzJQwgGUHoji!uye?@Df^ScC?b z2uTmb<>BR`XdnHlPM z7m?SHlqAxN=j$(AIlAM^zk=hoZcw1~AvJ6I&0fEmD1Q>?twk*YQT$CD2 zv+tF~00#Dt1uhvaAQ2NYs8+5UZT`IH`!ysr08VX@^nufQWFUm$pJ>+;q@9Zy#%Zgz z-f1zmBmqy%4I{k!fp^(<+^S2K?#~aK8N(Gvf7$ADP3lz4Ex&`{bqXCSuB6vJHed5X zuar(wF`NN!Xh0^IB5qE>iy$n99B>ZM6QQiE0>6?BW61?jx^RS?S8)Dp&MLvsO;dYkMwt0N`ZLRMy2sCdVScAPtBXf+T_B6_XU&0qGle8x&H zZuv6|U2fwhhrM8?@}%CuUe!{^pAuYXlqun>(r;ynAwJ}aY>gDA?$0^b#=K8>`!zen zZCfL8L5sEJNyv+k8@8?66^Y8~WnFdtrveNK`!2I1GHKdiX{LZ~eEae)a^9sE4&w|&ys7%CU4kKeVY}1ntd-^I1gLYcm z8mibwn3{*yF}LbKi6P6UE7mr&GQ@NZ=}JaRn};joTjm7C-3?+Wx?;odV)B%THK%X? z-m@tB3XTRkDz=a4$_JkWYs-FVD^-LX{CT`HsMD)eC1$mBiT?Q|esIAwPF=nsnnEa+ z9fr(tK}+)X=hi%Xkol~6eogi+c3l?~t1~v1qOZ=C)r+aibP7K0>k^H1MgZeSrME~$ z7GB(r*gx%Zq;Mz>>Kvk4F%@{4U~I^R&~5K-XsR`k>rEK@D^?&6pED?PZ&VH6;U+nr zJ(oODJJ)o%ZT$Feq082C>%V(TM77XV>llo4_=J$q(kYej9bxTh3M0I@r}YzAx+b+O zr29`ADzh}|4sH8uRk}8*xuH2Zp4`c_dciFbZ8y}?ZNb*nO>^z57cf!nXo`IzR2R`IOO{V7i z%#kC5>`To)`du5w0zQtR7UA`X^e*#8h(6TA{d9`|7wT~^=LgT>pH1~|2~C)`U+Rfi z|8qKch{)<8)Nip{9o;1k@rdTZ#;963q5}5r2N&3&oG;|oO)Gtnh!#P0iU8KkH?VF? zI+Ml()29nh+`34kyA>^BIbw2>KltF~9h2G{Ih&>a zm;wA`w%5XyN5BoiExegS7hyk^WGXy6>q>NSD=YxFAVSUferk<(Kc{dyoa=iMH5%qK z1h1xk7nH)Up&_5o#H&erVX;d_tc8O$TpSv@5vVQ`dOHfNVK(|d$qD)I*>K4I0XZ~( zTl{ZNxbP}5eG7pY8iY1}ro>-!(%jIa?m%a!Y~E#a+v7lp@GwUQtCKF{55B7!Lit3b zAuRqZvpXH8H6cvoBYYcTMQ36BVDVuM76oEE8zR^Sb6;kwU2L->EsK zop8ReUOxYxm#he;PFKcv9%Y)Sq=j^*u(g?TAGeluan8B766^ zxvFoy_`JuP&-}Y7+Y>rSFZ1#Dwowy}i&F(g@@G|0_;g;K9iFmz?uGS5`^K&Bnp>dA zBV`RN%0+*e`0jF8IKuS(z|@N+#n*4}c`tJwZI~HS|i2h<-d30hsIy!D))VzQg}dW`;}qE>=e(%D!~el}r%Zhe6ejXc|? z`0d0ugsyNyeLGj)qvSGPYQ%`f%nN6X(zwC}^9_-Y-7k9Zds^fAeLn{HFKfp+C(fdi z7JH+7(-t&bF0Ucc<-)EhUFTf&Vn+4UjC$pHx*p(|&xMQpYszRg}mb->!^V!@qCgrRHDDVe-f z)OtcVy;^qu1@Wl+;DVLyOE10~4i2fEBex$7^;;v&xrq@!Tfc7!Ct0jS%9N0Vm{f#+=^5G4k{8&{i+izr z#%5qOm;E;KJ}vJ#r7{?2&K5g}np@;jRE}HLP1e|=m1{FY zz#;G^}Ra{G6#p`)TJ$%r(R|Qv{mag=$KoT{fWM zGyH?Pz0S2uk@0WQMZuuxsHVT(-KAF#$yK~X;&?8(WVVF$)#wNJY{Q8_@@KVv5!GR? zMNv!pw12f<P3{|R=~lY-Wte2I7kDad z{!z3jN*sCimHbFGBJQo8b)bcc`<>QD`c6z#B4|hAyZBI-+aG zxzU|_^fX4_J<;^(%TjW)ehf~%eoNE$zJE{JK7b6kuV4S_zZauH0Z74o)1^Td1j=f& zHsFa_r=g3@br4=~7WwJO^~dK#oR@Xe#zP#-pJU3|P(u7mW3o^Q+aAs@Z8Qx9>Kx`| z_B{*8NlICm7=o}9Rl<>uj#fY(D&%oxzV2dcdF%Jv#AamA`}-4A5 z(H!y#x~JyV#l`cb(`4o~|1!*@0c+yRW`9O+>Tgu3o}|y6_%qXM2-2vDv?Vbwh!o^L znBMs69bW62RCZ3I73*m{8#_H&Bv*nG%5TpoilQzTBln#(BixtDTLf09kys-YQ9L-p zDc{A0-JD?qovTSiu_kZvTzqRwo=rOA%8u$-_R_TTr41cSU=w|#aPD@^@YLcVd*_E$ zJ!JJvdp>b>^}C0Jk$n?d-E$iqEm+3$*c*i)%0hESi==-@754d@VROt+P)MgMxHgwf z@oMIdBtu6*P(DY^K>5rmiI#>e_Uxu%neI4g0;xSQn(yl6$R4v*U^cjcxCJ@Pp|`{6 zgGmP$dq@es?`7N2#7ccc95$lO!_&2hV0MUSNEOEu?7Y1ElBg*sc@};crN03CBO2vq z9gG;Un&`)sSF5gO)Uoj%-H)U87mXS_8R&|!B zJa?K}-?>?u zBhTe0SU8Sub*>~1|hjrChM~R`hxbzP5im`cIt9WNc0fl5r zo43Iaqt~M(CjBwM^!M~r zppko@xLasrH5+Rj;ZFXwUjJ9+hV1ojBF_^?Nk9U1x}h)YBXvGR{igLD4vc}~TC1Fi~| zu&IH?K>3;9B92dd(jTOrhwU#DXk&zN$fXg({ZfX>ep5mjzOWW0r{5*Ghpk7zpk@u| z_C?^S<-q{}XB&>M(H(+k1tZicT{W7y`^lbR`EpMHc&8pb6NdG83 zp+$G74i$gBhh12l7N{)!VX{dHqp=$iVyGpK^+aBX<-F0DRl~qmaZ8TaGQn`6t5|@H zG$QcyLqr0M37LhAkQaSXn)=Il27972nXPh_;?eq<$u)$!wh@6&w-}s9!hOA+O}ne2 zOd|TJg^^R_mIN;*bqqQdNh3YZt?^vi=1e1Fdha(3fO~kkF5#NB9a+E5K=_{nmvvG= zsuP*&jJ06B8qMj)*nBhP1RU zH$MHy0=tP>yYD|%CQX*A4e;@*fBGe-ia&Mt^58wyeeK8Vg@AH668>llvGL`s*Yy(8 zZ>ZK%496*SsP55OVA|FZEC5NHL>T=G+1JN(4{wjtEZcy+G#Yt6AYt3(C-dQh{(^x| zm$6;YrkchMInT=yOWj`86Ff7uZfMM!Ba^S;I;~^(!?wU)6LeU#HUyf=by(3BhKYMEkTWipp|I)Ba1t?_%+R+A%$k=`$_z zkJDVuArTJE1FI7ekqNQVN+v&7%k>a$!QS&~AXr8ltn?@b5CAyd|DHAG=EaPAK}UjB zghv{X!AAJ>lxrNW@wGbL=yM~%BAK4lxd7KO|NJyNZtD{@H@-2wwbKLrZqYBCJdqfo zD-x$JK8$0RZALpKeuRA_N5=E^=+;b&RreN6=lBu|+x8&>QxfF;Qr@@HY=OZR zT|}67P_uKhbInc#z4E_2c!K{kTmlgs+=C-YA%PExHP&ZynJ;>KH^3}=I zW9X$>70UQF`5O+`282=%{d@~Hce%*p)R4^7BV~tY=c;9IpEVb<;<%`iO{(AD>H+tW zis10p7lYhAyA>i89b%baD9hd-`gntVDaXYjKBvplzbG*TwNKrTq3Zjy#tSnen<3P4 zKYN{Fp8mh@JpR)A7ffP(OgA1xI@{x;;x=KVib6qUB(*`f>iKA6(nm`8qdt%N1e?N6cynu;Jbq8RlyniGIOcMJzIs=9nBC4!0O}>ee zjH0MCe`y6_v5KqTo^g-w`wInTs|c}hdMR9uwbBP1CHRJWLEb>!(C?#ZF)H`-FEa+Z zbO!ZB4BCmJS_j4IuK=Oi`Y*X>sypMmspDlT%hcl#x%r6^v4F6Z#%F5KJ)yX!HuFXg zW&@UNCGw=`86)Ebv2QH%%i^3SKkc*i5sfO=1!I}H(_6p7>-{lPDT$gJGy*>H)v2A9 zBD(yb`pa;Fo#HA;eGDF2efCZHV^oX{LEzs*;!Ku z7PO=T*ueeP0Eim~0n$~gcO+PVqN18| zut;J0(7H9vmnlx1q{bv-c+)Zc6X;GBUhbR!L1ZWY{t0#bONQXmT194*02NTW9+EXO z!lQMIIwBcoG*RI1zcVoal9MmTy38ZJq|;o5OZ)yB-$IK^xI{p&U_5N*ULLWT?%psF->TZ z^%E+4b=%bq;4&H2FUYKo%i;QUq#TiCSo)X!osD@(^;MF6KuyrhEl%}l= z$nkqa6$+P;ig^*8gC!nw4>Ix~K%U`@KIY6zx5R$bJJo5Y#egez`su*eulej0EoOM7 zf5lh7_{ueG+-^EI|0|A_7wbL5V#Y4QD0)_epudW!FP*a5mg!#}hmA_6rqoPe%6_rnR+M@*I9|o ziuFs6^d}SMD1TF4CFVUuGCy0f_B~(r2m*2Of7stR@STDv&OiELSl_#$Y)YN?9Cw_% z_gE)dt+OX_cG6#dooV|)$`PfdhD}gO>TNUL_o~**&s+|h@S#vbM=^)YsKVE$N=AAF z&Bs4Rk#=gzx*>+%L+rEVRUYABg>uz021&lTh8Qy6&;n8*N<8#VH5UDc+zYTqF(kSX zZ8N(sLbH?z@09#97^TN?Zr)s$rpR3YG92{S|CGmNTJ_Pa*P{4SVs z35(Gx^}}dCB*lC6kT0#H=*7&aLS8VFW0T|itENyRJ84qV5YE>+FR9KRqlb*>-V78la;>0+K}~+p+acV8q%OE@RKHp_wY=K@<4p?Sxsm--h$g* zpdR2r2?(xrSIY*6d~7koA){dr@Ix*pE{JAZn_c3pDUl-rp#hVM+NX460ENW z$W{|Y$q-3R^cI^? z3DAE~uJRHqe-?h518#MWdl%HLihI&H>@vF*#`unkhIlrlW%UOBeXJqWcKhU4KV}R; zd$uR}??8M&`k5c3IJHcgA?HS}wyEwS>-RT^^=skL;{a4M?(bRC9PzjH+A(sY`oe`} zzH&k1uls{T1VhyjtLbU?@p;+>?NpD*R*AgY7o3?VK$`Ty=6`;T+yD9KYek(*fc>m# zx5=>(FOs+&9Cwo>16m$ z{|En7{(|_V?o8ZQ1q|*BI2cxwE2a9LH7#^9??#y_P)0kJx<>~e##_`1N`W_W)UO0= zQyVoqZaWt|C~#$Y=0uQwW)vZjJ0tz2NW;Z69SL2T`o$#|gTP>yDGP*NNN-vB@!!ws z0PR!fqpU-}9j)u}POv@LRJGx4{lCP&)7t-7I#EHZhMpV8-OF;2 zBz|-sE~yiaQgIK<@|Azm9}!KW{^nWYqf%4Jn8h^9h*`L%Ot7g2*{@oUYZ zX%XQODQ-RY`a+R)fbWYv-8KtusmkPPyt$*Xb*!$=fL_9bS%`G;-vQ5 zQ<$2YA|859e@uaRiV3d(tfPo_g056c0`F%rTWU8k**Dk}abhVb>qF~2d?(>W2(?Mc z2|0%Mb&I9PfU&!kbGu7tcOh{l>DiPbzxsJRrWS?^NgscGAp3iY2l7)Y%_GZ_Irp|@a- zN!9z1;kiS8Fp|D`TSV`YQ7|7-^~CxWGNBDbK<^?_>i`w;m-Oe z3Ix<@!ejzgI}*kWu}vs41S9|L{sCDz{kM+(LS!B&wdGsz6(wfB91gONM61uoeL}G( z2lsaHYHAxAnF=ypvNVTFNTVC%g@oc6r=D(T6rEF3@v||${+1{ouP~~m<&yeJC0ygH zMk%gQ3{ufAKko_>EV%JH&5-<$Djwd;vL@RAXLr)Ny;9m5Xg*zD=$7O^*G)S0yboJi z_aLWOCRFg37qGi}8d}<#w5pdlck*fqF5uNZSm_{j;#k|s#rX~OcaYI;J;^@y?37df zy_LqlyAI2VpI=dW22ZoW5oq3MKub*f->n2A}v;3oLa4-i7LG! zHnwu!*k0sofIl}3s*6TwnL5faOiJUu{GhF@3_9HpGPCXrTa#DZ4~~CMe2nC(rOSiw zbhszJ3AdKm?Z?fW-@iSU%})iiF3m9H4L0q|kVJ*=H1cP0>yk*a20=j?QQ7MPzmxp(%33zD4;F8u6S-7K}$4 zm(}GXjC5B>QgEGB#e)u3PIE@X9Ls2%nc+p7Y%W;FckX@ZXN?bYIv$gWH^xf84A$J_ z4__i>^E0B5KE}Z*bb5fa!;Wz*C)N|(2ifKlfm&KMMGq8>?3AA1fLR7Lt+ty+dgOZK zPS5Ll6&ZFV&+Y-Nlpc%T+-7_{Ei{N;QrGGohiy(!kT}DBLhI_(K|(ZgE6YVQz&S%K z(vn}7jM^L-O$|#+Jq`_r>u*^fA>LdnST~w?^@Z~tWT9PJ%p{uDPYrU4i{pSN-JIRQ zv&d8-)z1~6%a;~7LzADJ2_Qqg7e^zg8bEN zaXwv;@~Re z9E((S;MJIb#E9nG2zdz19-T;{UPcsjmYNuuGL5M?URv+WS%Tc5YY4gGZA4AXy<3f0=5z(@lIAuKzWy~PkAPmd3b1;h z1P}b_V~>XB`S|fYEQI-XVN)XZUiE2&{#c44RSozOW z<;HdYEB*C!B(#f%wD~Dgc?s`qX)$`Qfd>ty*gZR`k6txiYrSIfofx#iD3%`cJ=dw} z@42uj5rZP}T3c7dhbr$mHtDp~L#mcf=VH=*bmqBUt6l`M&qthI{CeBi_4ak{#K159 zG|TcgwIJ;?{4X1une#{G6D66-MnXOF92@ef=w`pBBpSyKR@x%cB34pXP30LaQg*GH z7kwvFWzD2{4Pz&8Bd~@GBpdAPn5}ZhV>q1hr~qWekn^SPBs`R!UDD7e=H-V!T;$i6K|HAH&VVCrgxEA6FjV|e4o zx$eVvhe=*2k-zJEhkcp$uDx0P9IVaZd+VkJR=}NURk*+|?%=}y>l#w!)?-n83Sml@ zdr@CP_L0KloXW0k4O6&58tW9youDyZ6fYjG22J-@g8cxEK7ETM5g>AGE`x$`%wfr- zHl%E|(B>?m6WM5MjgYN}ae#<$c=?*Z@UvI^tPk9uIFCbVYCK>*vr4J)}VeECa+$~p15^aH{ z+%GU^ZU>k<2`DDAhZ`Uhb@{HBUG9u6*}=b`%D*>rY%V`G7-&9E6s&vFv9P*BtujzV z`|TZR5gP{{|6dJ;ui&u_v{Tr=Cn29L6}3aEIOGLM)<5Lq{X-uH@SHo@Hxe@Kn(=Yq zB9&GG&Ya5+O1{Q+B|3b>v}I4~&bl9e#VPz-K2~(4bVUhf!-3CmWu$tG`nA#bZf+4B z)&66N5dy<8_!uW&*S?qLW`^H_dNIq!Ev%4%H95SRnl+(MMRDrpAvtdh2U$2;z{AN6j8bRUlu>4I^X-r8vuOGW3g5egnsM72<`E6=#k_qo*+ z^eVzVFbrAD0g;;-<%sNs)<`RF@KY)i*Th~me!uw{~)Yg_^ zC&t>bXympV7|`ODo>Z>2p@}E+zu!BLG?oT&{x_CSoA(bL3C=^lnqht^rl+#bQ=i0jrXU@mwQmT7QpJMy zc{hP?1q|buD9Zn-I~jFQ60Lzu_=K-g8p}6wL3dw*MLa%RreTk0MQk)YOd=;vxLh)6 z@mmy4Fmrl2cIgHzag?B2(j_lx$^j#B$OAW|akORF$}F({F6;4B5n7n~<7GBXX1MOl z+b;4y;C( z7f)^!mbHa3G`*{qRth)|WEAIisoN8Ud78l6__~!`fAtW%RTQ2lPCCg7tRC^AzVbhT zbNDLorTb`oK|9Ga9#lPrwjV0cZY?WBq2B=x(R&nb?ds2Ysw2dt_T8EE~k}bZ9`zc{z29 zXNc{4?>eK<%V6x8SyP6mE)x??p-?>aS#i}9@N|@*^)n4Gi;dIRw8%&Q7_mD5xgN+r zlcNff$_xX*4$$do;MRV;AR&_ip9x&NN3#BTNB2)ch!fBiZMsZ0Taq96#{EC_U#ea` zpTxTmP)XW+H8Of-QL&fO@U}xZ_}0k9`lx?kUKwG%%k1WRZZ$S`nOP$hTeSqz zSde?MKQtj8uc1a29>eVZKk+5j#yBQaLxb)}Lkmp)AVyQB?h@v5^2mk%E0F_PB~KJk z*2O14TNnE2si6GQEAz9z$Ykolt<%QuUFGLf*27oyU-c;4VE32A84V2&`|?M_PD#^9 zr*GyU1>-rTh%MpcKdF1odes(JFy#!jck^(#0 zHh#9eG#y%LMYd9N;N;Wf4}JkcOQe-!np6tRe$;#AXWM8gUKWlY6AypY0^_V=P{#PU zihv!ON!L~e^2`E;h9V5Ldg)EgeB&<^xY4E}T?P1a(t3uD<3gnk3FVX|$Y73T9G*&*Fm9Ww!f0 zk8Q3T6B8bov<3?MywDT)4BRFbV7vRIuUpHrQ_=4Az|_n?^=dy) zlnbnPNg>ocWEp+zVcAMsJs(wAHr41Ga7ekMZkCZ4V6rnT<_NJ_6N+EUQAxV6X;Ij^ zC)3)l=_b?FvBYJ>fyyZ^`hG+tSQIfWCzId zMrb(0sDDq+-EcgWVtp`j5KMx|`X>27K>U_%8g&#Qp(GS=NOtt}l2!i&5tC2q@8LB+ z&gf(69eBvM9o;^+`ntU5G8oGa!P3B=<4u|-5G%(GA7#6POka?G_e1ZSiY0qBY&YaV zrH@Po7!wKsH@9q5cbUf0M(cGPE9Nhoq4CQe7fw!gn;;N*h)4PdEP0S@vIQ@fC@L<> zkpdKKnHw7(sTA*XDMouHu!|{Z^Ao5;HA(J|lg4V1Cdd3`WGe~^`XlQzK#VrXNmu>o z+kTaWnrN?h_I+Gd0R;vfg4ti8<_klC_u0?)R1zUNU{2+yS#y|I);L5Dud2_CHM5gB z$|NUQVUzS@H}LA~b&ThZ0u(j2j=)IhY^7}~MSV%dytG>FsL}^Mq;WH4 zne{ry@u7z5QbBle3LAiHP&Ll))Gh;%a9&;z!x8iUq3KKDp z%93Oo#xjFqNY;w%j8GJ!Oo=#}v4^tGU}9t)Yn@Uea;(YPA~_;Tp+)-s@3-^&znssJ z7Vop&&%Iptb;W{0s8xBWI%v9Rl0>OgTU!=jb^?I6vU4P6UoF9>aLp2R*?Iv9ZH)ID zXFS-CCJ<3}Vv}8RU4~c1Kq!xeH?YLT2oL>*=gWXo!6@7{%yGrlQiPyH;2$sA&Y9&Vj1bxZRpo2#z*`~F5KxeE0HAL9^X zZ>cY$_*p{RNY)X+-R$ zbD|(9HSI=eZ|CJt10M_?4@%b*%&CEmL{9FF8Ghrvo_hlT&m~}{*{}&bdr^|81&c1Y zO3%bFS*i|d#e^u@hspK@S?Hc{2rc;K9lFf! z+ZlN~4mx*{Gz-W&C_2##E3Bmpo^XGXs&JZ1Kg%Nf)YV(C#~$B5{O+WD`M`nLxFMSp ztxD-XiqlW-Zp>9Fna?HqKP%arl_^qai`PG`(X*d`A+Mk@vc<*bb*3hpM(XU>>lmq z^piV9lKOVq)Vw2nH(7YMyXwT3htk&l#Z}UenhOqUk(D+SD-|{FUphq%eA`&Zt%CSE zL-xiOw}1KTAvnO|36$!wJynPNZ569+OJ8(q9$a%)4NT#p&ViuYl@jMnb zgGq{AiH9xwpqd-EsvrjlDNAIP6-4Y-J1ov>LeJ->{jN5a$EgqvjI^S~fb|sH6c56c zxG3Q`I2DC#GGw3n3#I*ySGEm_jJxCWCQuw@OBZbVDnFL>KfVKSQwI2gmPCLS|0}sy z>PHVA?ZSQ6x_HOX1(7Y^@IFas{jAsge)ewIaYL^s z%oWUaQ<0nUQeaSZj2Zu!$9njyQLYME)|f^3=lysyk7}t{WL!kMoAPh%&4qQz-7bRj z#A3k>F(TPMn0*S8%kfGOU5*+KVzJQSACF$toFs{%V4*=!9<4V|iWXax?j)`F@f*({ zR)7tSyBrnI8l?E~Vcco{3RpqI;yCgLF5m!zSnR=O;*nC= za3)b~1IYSvm_RxUS#cg>9+}ZVko+ z6u8A?Tjl5oJ6k+3ILw(z$W{G6D~}YH~w)Wjp~;~#8O#Y17J*j&VHl>SdGaJFPX-!QH)7OJlj%neoIEd2jI5( zkK+dsJQ@Chv2hW}d$_M;RX9Gh`i|Bm3PGgUZ_j4NpG5-0SiHcMup6O|GbA#V7?Ef~ z$INF5h7Oe|O>vk=IefMEm5WzRuvR_ZfUYM;H~i#O}o+J!-*whgISRrNf3hm85srQK9Zd7|+; zhA54bE4>^FH)dR8xYm~=I#JTB+NHfq>wDJmRI5Z6?9Cr>X!5UT8}^z%_~Qx9(Nv{h%o*eSqldzP79L2g94hPbxDyK}K7f*XjN`N^l zkh3L4ik^ETg)DAhDK58Dn#kpiTW*mPSHfM-wRJbLJXXu(r<|Y-GyMi1u3^*YxGOdp z@kJh|*3$j%osrTCh(hlZiJb~-^Sq*tSJJ<-nzRM_qkAx@{Hl*MD zQPFsD6h=-e@x}wC&9*oulYlWP6s4FX5sT#=TAB)J4$qYdR@YmICFZx-(Mdr!vi`sq zOIuxDBRqfnd?-*_c+mC&ch-DhjT5h*u%l*8{>Z-n@u}iOiEnOo=7bar%57}t`fFkQ zSOXiIOe(9~{b#%6Rxn32<+FID@Uuh@5!CGkz&6I8*H1v$F7|AlFFwG2VX z&#-jk-)g$PdK=7@h%clQhyvwCY#^hwJr0fs+`<+gyX1+;L)~uON4i>mH8;g_uNT`U zi3%8%U&DXOl6dKV8{)YwQQ z7p>&S3#Z%UD~1$x?Xs;q*6!aQTkWp}MH^TstVYt$gdW3#T11pZord1aril+Dhup=! zLJ3Hvry{)Y$}nAcv*zu`90Dqeo+(c|+!4u8n9d#%)`5FUv03~8wqxXl#2reUv?VT7 zrMkQ5#pt~!T(BKWzU3QoCZMEN3fjgH@5w%3BEO=~`h_bc+40?^bG3oU9c_swD`4Zy zl%*Ds8?7I;P>F@)YKciAM#~;U9bU$E?6(;xBYe&@Pf^db7_~pA=f2-r<3n)P<&_p1IqG zuFd2pm|qTV8r+wy7VamlwIN$=@31Jl#F)Se+UnkVqLTaXFYVY#Q0;!+Xo-I^^Ksdy z?|p4T04IEU#P+L)E?4EQ-F zMDMPXKJ``K)n|lV>U_sjh!tF_ybNTMNYpdmATs%s{S3G6)XGtI$B5K=r0L^kvS2AsT4T~_^m_B)BRMUbrj@3 z{A!-MJF687malI@?T&5~{UT6pLa%YYbxnIsP+OoM%MsR@-F-0eAD?eaRy%lEgG^GC zC4gi825D$f3*&hCCsXxZ@#St~20<+RmXhWba3%{O84FtyW%0=eHYA-V5NbbQyVKr0 z<0{vWk`#cwT$?6GH^G`%YV9Z%uphi^w-X%x<5tecbn+Yu=s5jqX6L zhUp0uwI!3KN*f|Jmct}w1@pgZROFykq%)g5XP?m(o0-)5!-41H-!*QV)h$WU9fXZI zybD8n%~qyiJEUOURCxFNzlSz{a6_sRYjLpiz!|11emfv27auI#&MLQa_pgfc%*f#S zp;FB7wPPhG3?!&@MXJeGAk{S!O*6yD?MS=qV5W578r_nbv2de26LcIu@Eb46Ygr|` zFi!nBj=S^jQNJ|bc*q|s&0QaRbr506*oR~xqZf%crWFp0Z!$`99ijr?LcfFpdibJ$d^1L9d*dw)#SOXqP5sM5=gVeGseJl#1#OIyn^5_6i~j)Q@7gA zM;V~i1YNEUP#mL@sDtB)*0^gUg&<%rh+->Up;ARoXGs_@*BqjX0@HzW1LzAxx^o(UZN4S$&-gZdtGo{`$QDrU=utl=qKysk{DH9qOMK& z&@?@i#7WP!+1`;vg%S=_%MyYPT)0nq8+l}Zs1Je-B+6XwqPnGF$J0q9HrYkG@t$cd z>t4`mZ9n8l3I>=aaXDWT=|)%N7ByRrydE|VOQd97RZT+MJb7n^H_6!HH%P6`8U{|_ zAwN8-)GrCorMsH?8)LWH-_UE=;Xq#Hvn?9sWUA(0rU_aST&tq^GRB;%8S3_OXgq~F zd~^iGvG~4UhPh+6M0>x>x5l4!v1e@losB&{^UGpJh|w+SxpJ~h;TAo(+%-#|{_SK! zW>8ze2Z`YTd!R;&0zpW%X2z`As~O$Qsd!QZRvO*fsCK*2=wd%ERK001b(kJsbFm(B zh5-gd%0#%ZXY=9Xk`d0rdT)jNX&IfYE~=xXGK8Gc{F&^a$+|EJf17(j?^>8ti$zO$ z4`IyAl&)>cLYjmUigFfdy;y)T_pWmmI)6d zD5L-?kR{nux6!xf2fQ!}Pi}e0L4g#Dzl-$Pg!e(QwP)~U8Y}!jf>aCDy^(4;H!uhB zwO&Ha_x0$8(y!akr`W@BRcziuq_oe_)6x{!DwOdi|4%J=*I-vJ8;XbUvx!hGOf=|R z>IEm+oW7=&$-z1EJzLajVDBr;-eVf9ruNtjFJ?tk_9M$BDO{E&Q?sU@D&>@y^YJMT zQm$(Q(;Zq|&1-d&>O}pZdEaCj*(J;2=yU$-`&N8cJo!yFdmN6mV#fdlGz1BY#_X9B z%5Tqni?eJKa?f3^XdEu1Dwa%kIjqty(eguEZz+zv{E&Y z{dQ#P9IGyj$i#PW%t-0O4#s@pO6dlCJJ4jpaSxzevSmg@ydI!tvBhKR)|bVku3jB^ z*Iw)6%lUyYW5cK7LjEif8!taHxm?xLuAUxJDtW`bh>X_DutOXC^B`Vp{Sd3|m)gRP z!_0cF3e~ZlX)y(%!C)SK4y&8Md6G3L_FpLrx(^o*9QY!6Gdfwh9;%;;)o>~2!o~+q z^t_nH!RF#j9vooABLT)=zcNu`u&le-XvS-ptbKhR*o&a%pa13B|8)~_@O)zA?rDb`Ym~t` zXUZ5=5IB@esnso1K@M63&E#by7V9xh(x&%#ud7a+-<$8buw$cm0(x33jKR4P0a08m z=!89QcN5A)EBm>s_!X9xtj-dbeBVPU_vyw~ZB3$iTAgu1gs>!aGA)BUGU3vnWdG78 z`Ke2S6-_9VrOGPlIUMA`1{i{!9aeyqu7!f*XsleXm7(O=6CS(+#&&dAuVCu3cG5&l z*@~I+roz62halvpF9Vf-MA7Zy2{n-80)Ep(2GJzd<_7vvLA(3U=;-B?|M6knYy1j% zt=cZ%?Zc?=lCub2kPwDupHY0p?3t{DpglZAP(?2?Blug&G42GIT)7N3lxTV08;yjy zU0{*aT~E4r4bETTebsGTlo-sT3NFE_ZYfMuEHq&*oKg0mnxvJEbmvk9lZ?2)z_Vsy zQNHn%lZ(-k*iOO_Sn;}7)gH^`nCxXg+3^OY)HJ>)bgLUqqRd;he0U8NZQV->$NH7u z1O-++Uw9n@}p(t?FC({|gO zdZ7Vz_yog@%yvd_DGpK?k zuA9(j=vVB?p(<=;@P7u0LZ*pPL-;dMdu+p#Z=D_qgff)aoS>~HBt4Uug)IF9llD6h zlYs;(UC^jOQ*-t4dD*)LvgE=NSM)y}{izfelPMa;i9ZR%-gF6;$M9QSx$+&wSE?Nx zY-C=G`2TpyC$DxjZkW^2M7Fat>Hv!kRdElKv>nXLDWKj4pW3ED9)Ca3-As2BcVav3 z_WUPx68Np3xZo18x&DqHPee=qztSYk>1LF4i-DN9JlO>*9jAt&9G7QrCMMgUxh7_3_qCv3db4&pKaXIe_GHj8 zBS~GkImaFsPA+sDmw4+JGC1fAXfVZX8PjZO5mc&fT6lobsV3 zySJL;MM~mY%@!G|wcii)%Txc?^g?x>VsK1N7sy|4y}fnKJCN*kFP?% z?pJl#KzAo$Ptl$n{X}1LH!mYxivtUv`Dex1fL3o;!c;`?X}8B3qHR$(3k&NjapweW zBM;(Q0)9No8NHZy`k8Anvkd(|zO7vs120{%xAN$rj-FGqsd^sKO$q?@DS68#v&Wo< zYL*N=?KP5Hvj=aZ%VAio-xg}Ycs#@h^-T%1k7I3CwXCL|wWBU-fHy2_#^ijs@epHr z-3cZD1;9L}Em8KaHps;-uXI-a=;QDWh>0m1i?f1pcIR|dJoPQZEdlC8ne-QyvOl3K z%Ms-h6`+zqeylvF;8o%ZD0;jEVOWV|kYZ*W%mb0T?-%orYGils`4ahPdhy`TjE_DAs9!pCuFj04RD)pJOoCnX;N|D6oMYvG}2+_?d?tK`&9P*3$UI7T|8Wt^>+*D9_*C3m+n7SZ}kiI07ROq zQ#^jty>=X5tT<>=RtuR#LJ|dIS+er%irf$DUU*4V6dKKb5G&|(4viKg#T?ky$GS3xf?EQh zBhGCBZ`9)lC=;OxG&gU6Fyzn1UN(VjRap}qDKV8Zp6CC&qF7$Ons~i@b&Dd`kGZed zn2^GMZd8qIdJWRJl;Hx2DUo7B&h4b6>jgiRq8ol$dmvi{r$zDc%pbDF9sM-Q!&i!L&HUHAo84xX%_T zBzpp~)c5<&_i|GFDFDyZ)G~1_%-(*ahvK%Dl*B0Z${`R4doQ*Au4z}2%*?D;HQ@m_ zY_a}XUnTInViA1_5NvqX1v#06KkX_U7fQ?P(&Aeq<5e6jys=>YE^9>nc<=n91oV9VAVCIxbih&g|niP(p%pVNHsyeD*)S z6TXAKOF21d6jn~bJc+bPOeP%>HiJ)1!!IkKmj(KYzbUZMi@^213J^D7$!&u--DCB> z+3L;f8Kx^v@l-WDg{2z%e@;Kj+&jbZYwdUyvQQ~z6UZ^i1%rc6EMM@?FOJJEWU*L` zVqgCs-KYEU1XJ#0(TuL-pHvpUp_+#sGq0Ikr(F%g8iE7k7ukAMKbt>J-V$QQ zAa1;tt-W+#eHWa{N>F1HLpemtPFsA2av$hfXc`SM?tn%2iShjb-$15Kb2yM=4GS4B zu;a74@OK?8TM~HlSaF-?)7>AMrA`P@-95iBrj{FbqgaJSHr)6L4q6)-aGw{v$Ya>c zSB$L1Abw?W8}nj>l}#FO_P{61VON7IS09jT~W}3_dpa$z9Mvi|MxHka(}BFlr@cj z^bdH={c|CzGAtaJZJhlPm$1WbwI`-5L-X3a{}H1-1gJ)7R{I!k1h)%ng;0%v`Uy-z zsqZ}e!!|luc7bPT(0PE55O!$}=0OBu5B@dCN!wB_2DIhq+xpr>iK0Z=DxB>m`RW%} z>uv4De(Ybb1IlfqZpIY69iv#mC>Zbo1o%%u5l#W1VvB)Q(+4uJkK!Iwa|+?Sr?Dz= zLP58A{*s1f)bXg7|L#~!g$o^Um97}@?yhJb5Hw%{E`um*3@q9xlF5#CRn?l&9=Cw~ zRi5hA*?)9aPV!s{2qH<|hKsx%Df$XkP_AzPC59pbUe_4K7WCh?cVhV%_-NIDFI}HD z3iB!TT`E{0k)kceAS$qid4&h=OE7!LV=<{jh--GF)Y_hkrRPDAPc^70S0ONkPur4uqCBn9{yE zKH}XSb3d)|=L@IK$|;_!%71grVe7ySs0a6=_h`Qv$&3_JoR&4=okh!OgxB?&h*kJ- zyC$|{VISAc!xI1F^oWt)t{-JTmc>?&R`!BCiM`Q-oGt&ov@c}I6B*UJCj9eXCo;&K zQK(a@g1g6_(Svuk#kr_6zowtHGMNaQ>M`S)q#=f^o&^^oUEF|a&IT0JS*>luKazqg zGq0VMS}Y!;1|HLSD?I-9>F|`cNA9Oj)JKdxafJ3p1o|~R4n17RC9p1)q%9^&#FAo+ zb+TL={jcrv;E8rSZHqmyC|%oB(^M1NJKbXMWa4s`@*vVuMD@R z|L-pu&ddlQA)!&cy8McMJiB)W>#jWYRf`3=?RT}~atQ9mK7e#yTU)L#1g01m=0P5D zl(jp2`flj?wc`v)VYw^27|BfrI#alGOjV@kH4Fi;E=#Yb_ zP|^fon&0n^y!?_O7_S15)k4I{gfLbqlZ_$Srg6~}^&M}xDQX0hG@j#A1dqVM1SKv7 z5cB)sHnWc23_BX*AJO-=_QJD{e6!>yRn(Nb%2GF6)iSkg;l)kz zsDR#B&CMzFiA|iN%Ox_{S{<%JcEQ(dugVJ=8(aLvK*WilO9;07ZNP6pGtUwX07&zf^yngI4}&#L;2*4a zQ<%})BZSFlla@=TU?}bVyd+D+^;AoRY1cFWV`Xi@>a||M6Z}WiX$St8T)c5&d?Szd z$|_F^?;7a6aQs76P2HT2VR&wR&3W`(M4wvWUjoa9T zmowP%@={o}#$8ck>xc7H^7bvtG`doVvewa^zy6HP_)U=y`K+Z5Fe!l`gaLJIYh(jj zgo1Im*L*KFFX#y7#XnSX`y{*nwUYz8|IL;Z9G-x}gB>A~i9uz9K3=jW3WA`5SL#F0 z3(w1oo>1i-KIEIxc;Dx}h;o=8o7VJb1UaX{%g1%Ua^2tsXqK?yA%OsBXA9PFm$s1` z+^x12o~hQyxGv8dv~8&PO?-Se@zCfv9-6QitXdURrTVHNG?PcQ7?P=3Pu=i?jRI4y z*p#@w_y6omX;l7fDQu*|fcoo{n?-L+>{;#I$ zsOKXRgRuQ!?wKqs(}LA!OxG(Y9}p!)VQdc2Qi{35PlNMVRJ@!6AU2r1N$-jCi@`90 zg8HbjCmD1j6C<`PM;y?l@PL#v_~77)`~ROaUIQACh-?r@Qydur=L=DY09{BiG1+sl zGJULYFjMswtbTB#Jv{s(CAWsFqn~{Qdfq!)QCe^k;AB`-c4^KL!Gn@XH-M_6Wq8Fk z^~D2DKc})BfA1z?G{o)`;R#%r*qRp?UVNBpaD_A-4hO3O^8uz~3uGDT1i8fbS_3@y zimZQJVYAs;;)}*maK-fVro0z?7uEl7P2>{SJsB&CE6CZ^;c0%sO@0?xH}a3#SnSA0h~ZAd49TfHnog zr*M|Qn%yXw&nd8EkfGEDOIWX;F!Y z?%^3}2Bvzhwr1!{*09ll4+vi6c4Us|E$rDS;Vt;X-a}Rok5&>})RucTydg?*5EI2? zynB4PCwVamyIj5Dx1eNbYwNPde?+#SslK^Bc3@Uw96*|>KcVOEw;4FM46;}nqJ9T< zZHv`yL}a3qLxa`gt9cUi$EVG49_E|$gF?NQ_dn_s-t%WjQM-lU|M;%Mr@qE7)lZKe z9Tn9#bF*AN7JBx{rP-rW`a#P>mmRk{ole$$>j_$m&M--_2KuoET0@Y8T}3qRK!w8+ zHaO&xqrlFT^>4sV0Z#(pO#s$n4}<60KI;{amM0s?y#5^_Do&hnLNF9?9n!OR$0WD9 zu5au3zkOg87v@j&3oYZms&B4o>2w>t7q9?Hbm+B)vxxyP&w$)BMAqH7DCpjqvw`8X zuty(S5_Z&=tN1Go0E8+HoK)x7m(wHD|4a`ooZm$iG%5x?tHTVZ#NmB5{F^-ryH5T2 z2hgSbr50b_AVGiTR3>%Hn+3&KojMv;~Wn zusb|^v5KZnlLbUhVd7UtsZpj_xux-$$5Pw2pqqFS?ay_Jdvye#l!*Sd`y%Z=?v-$0 zd_(*Ao8D!eZ|%CD|4e*TCUMKJT0)`A`IlV%&y!DnUJ`&Kww&Q#L?i=(*@Rv`$Z_xo z1=bP>^azirngM#yz^`#D@m)rRKZ}ck5Akx zL|f)QzF*^*h1J#d`q?J!4>?*;9mK9bgosh5PII0pF1Cb|LJQH>)EDo52wRJ^3S0}G zh*6J!S_~P^1r1jt|Ffshp89>rEU6f5raa6{8U!x+W%G%Ng;ZXF=hFDv$d8w+d8Mzc zI3YNKPl}X0kxbn~dy?<5?wV|seEcRfIm)_$Z}VD7PU{ckR0-Mn}cm1MA zl~SKbV4~*Zyy?Z|;Zvyz=4!e#qkA7a3laU`?48>GX8FR(ph61yuy|&+Q2gNg3vDNl zwO846R~Ta9+;Kd<~q0*prxM* z-Xj<#2wvpqB4eUZEctz#1};R;s*g7V{2r%rDhlo`09lxV_qg^#qEX`RMAKlpEC{e& z5=F7MD@;k0SD%r1DORQXLee)$^YQp}Z)j=t_BUeJ&G+lBjP8A^<6kdPJo@J!+b=wd zT97`{;qBf2{=)s>?N3_{2DBafQA>DQL8xr0v+C1eR;1odS4qE{QIV+uA1WCY88Szz ztg9>|cg>t!xdb1lQ!fob6B~S9y7%jK?_XWd_NgA=bZ<-i`{zJ}dVFX0)0qic3s@nw ztjyqwV`Ehv5kj3BQf*-$G9D6-)X0{|mKhaku3kZ!?S@+boq3c5nVF!n(E%*D1EZRY zCYW=(?aZ40^4#bqFh6?J14N zY8Q|Dyo2r7N$7{@(O&Fp=f`Iob@Ijl0WEqA{tWa5n5419=A*TUV(%4SLN{|HlL(Hp zVaHUyc@Lfz+c9w-e@-KeYzwx_B{BgqKWZ|Kp={Vo?B9kf@hd1R*BbCMzZ_R}pExn` zvL@nrH`18mN-i-^5rr)$th0Vl;)O)tL`!$S#e&GhWj>mOqwX{9YkNl?<|#Rs_Uh0_ z|J;RatHA%;Ru?CCXS!Fd9$)CXOK9t9{x?#wjlJaZQT=>YYxkZRtKPeW%CuU{{e#y& zOy&W>*{!w{UnG<7pWK)J6jU!kZtXtg#wOs4k4-1jpMnae>3!Qz&63yuK4P=W!P_pw z-0aY%i|QR+mwN6G`a$*!%|1{n9^86d6-vx$InW_>qip_0$x^}n=z`(^B#f^|wwUz* z3icRLx-S&a_k~6zxc#-jX|QSQc+OqTq7H$TKZv_7LjyMI{sNQ$ zOqI)jHr}{PbNEMR2uX~J+^D4*w2wF2eBL)Q=fE-1@*AYn2cZ?|+23bEgEm@w)ljk5 zH_8(eFN-Go)Hse#M4SKNU&T+4*(vQ{ms+2nysI#K?AcKB*JhPT&XVI- z-1*ezTW3|$IK^#m6pqx7d+@0V$=fo` zfvx#f>Gy;5IV0e1H~@W}^Z|eCs;M5y{XKQ|W>R9(eJ^BNHJ4(1h|I$J7N|bPLC63` zn*2i!K;Psa3W~#0Od^w|hg@GdyRC0Gd^t$FpKY?H>~IG*&+f?V#U-@@UU)oGh5x@> zj}9WvqEQ8}Hj= zxXJF%$z6o+$CFwPqCYR6Yo1X-^m6?m#{{ZV5cDQ)Y|R0sKi;d5*B9JM7Y}mo+036w zk5cb=5dHN2dYf|fd)7Wqv^@HY+n~f^g98z-RBCvA zOF(Rs9GyVrz4V-a`T6B?GB4N`TIVo1N)YiuCr@Hz*=SQ^lgCIF-EeM0H*r`=Zl7^V z_~ndi9fci^`s18<9ag1Am%9ex&2d7@v4!j1(|` zul$QKz<=Lx068x{yd+Ba`sr`~_DgMnyIu_tq-GFCa0u42g^3CVz9j=tgCuiu0JEtX zdggo}v*GW?djao6l>7ERzLTP=ew#K6H~0CQq3j|uOdU492uk1Y!JY`p(P2l_g>*c> z_wL@?gKCBeJF2;?9IZRHPRRV-@A+W(hzsZAYLo?JwSKF$#Z{8{a8$x`r_Lboxjoii ziR8tD5jnr)b-Tyl)+OfOPfyO={VY(Y?kySH`tAgXq@X{)54jt|1E!ztCLj&m1_8%! zSy5AkNta}z@3)ij-;AyX{Vntm;@+g-||#KqQhR z{Seehezq5D%rGDO!_jbR-<;s>C^WoU!X3-`OPfPdQngjZx#G_hnrrfyZ% znN!q{b3M90JTNBk5-qBCP}V9gI*rVx4o*wM?0Ap30ZtsPOrWII;|b7;abR1oNENb8 z-X5(9KNET8LdVe2qW)?wFU^LKftA=}#cdnOjT`|0twWWocrjypl-x^HjjkM7=lDs;Z{R@icPCzQ=Yt91zV zIvtE%;5Ivx~$-^i1zSe_iqeYHY$Sck20aS!q8p!q<{jIsu zWorw5E`NL69Ly4xmHJWIVnSxfFda{o_L+Y9c}V`hYy3g&y`<~zs=DAdo;mPET?>HQ znaX4r3259?oD?&@Vz7A?Jo0nciOR`|sfnqYbI;qQVOnW5ds7G*5_@0+4Sl%Z!{sQ& zd_tMmi0;^lM9HgkaJ@%fjN}Afe9+t4B|CHU-~4BX(@qf2_p}~+da=b#W!!gxPZ?)r z>CtLlv*jriRx+L{Z1WkCI32M5Roq;YHZ23Nqp0GP4C3ow_R^LQ|>0;O}cyi zZjwe4&&$ufr zOK!cOw+EA-M8VPr$HJcWnCXx%IU%rYtLrX~+aPzv%E;(!7Dt5}S<4jb<>t(LVb#hO zm$+xRcb!^jE3GrHJWD8S>Z8Q)#@z61DHkjqniQ1%fDrA6mqU^O0Qd#x@WNW_l8#@4 z-0Q*;(q21Gi0`0q915$a-Axw_hkA7(W*vzh7Tmh^cLw%7lq(~Igq7Ep2GSgD&M(|M zHeTiM{almdG0m^WTTNVP*Mb(8D^ELjHZsf&bod{Ax+L()hF-JK*~~be#7Papyae;KNWMSvZ7<9t?0ks^DL1B(i0D z5RKQswSxoKX|bgE(l1<&4jdAb6DM3xfTz-aLO9sbflOd0?11Aoa*GB{t5D`p_5->! zL#A&bVv+UGD*m(Tw58D&&o_-}P#o+ar6H39mtbCGnJe_RpI&%jdovLPqt>9lSmU_< z-SpxA_>6A0xV`d3MA-RIMLefk-jj*9In_QL6%vbL0cvJv@`*Z+AvKlgNt~ZZg_%i9SMELqgH2>`W zh=BTI5Rn8_m^mXZa^11!Gd7k+~F)idih;lR)Alr!M+8f z$6F#G2(K^S1~ycuL|8vo9Gzj#&{rtktJ_&T~)JHPtuq zB86P?e`ZXMyLm`=R!u?6jLfv)3wH`4!SeLf#GU7kfi-8P)^`0m9NO{f?a|kho$3RQ z6%EH~xyJ)ql}D?dI(GX3xa?yNN}ApX-LNfY-R{By{A)Mm$v8D`Hcc{^1s!F06b`Sh z>_N2ujb8vaW397()qr1+Dlzm7=yLXh{Wu{ka8QK+<@8!wBO>4w z@GNZX$^qjcWcKL1UyQl{KfSaNhyw!sdya!}9^*Yfv{t!5BhpbXBt0uj7Mt7<8;%0W zabq^Et)utegrtp|{Oj5EOfV5i?;)`ZJzFd$mBoR+yh4lT(ASzU07+509@%6p>LtMX zf~6wW(TfMjN_R4?gq4T&6I{bFgC?PozjqUFHeH& z%4?Uh@;5fmo!?p20_~wtTj7xVhuFu%5gGUgn?9N5w@2Sd*SNPVj>OhmBWF~ z-6`+&=q&ZzCet^4d*4Ni?;x|`c(`CQ`7sWezc$?qe^V+n#P!{oDVhZ>nNiS-N66=$y>ZK5zL_{;Wj( zR&f~lZ*XDJ{mqh_K7BfO=>Cv4Y?THro@7w#@gVg-zq*C}%ecpIZy9wJ^00_W1o10hr0?odJjoCYM@x!G!t0|MXb*7zab@kjVB{NQ%B=#Nrt{%S;85jjQ2 zChUrV1$O~^(YJR!Gjm7r9jD)C!xqwGj`2nQfaCNbt_#Xt8O6IEsa=;;b<+XYcEVpN zQ=Iy~J6xSTte45UQP#W)5CTn2-Vmr|hXN{ip(;))u-v@m>Q!Z4PD4X&T|<2%&u6OC zcFh1Ztt}@(T?V5gl2lLP9 zzohLt=e?6@Gaua1)g+Q|F)sQ8xftUxp6e>q81ejP_z3?3-!FrR1!O+7N^doW^+t4{ zm7uNx7l}kdUb9uv<4OWi4iQieg4$&lV-C)YrHjM1HDa+Kj8Ly&U`yQGIYGSZQO%Iv zM@OOTaRLMg94H(Q5l#yX3zM zQVGezmdb(%a&rIqGtq(PgQsnRB%4BXVY{7?pE1mSH2vC5C@xGrJ?d7{fyIBNX10fI zsY`j6nr4Q~$whtXS7F6AqAazB+IOwI7ZL}ZtZr%YlDuu8np&DMl=TldYJ!ZG03WEY znf6Y}_g7Clikl~bHS)IC^!Z=F?oQG zfN~r_aPA~h9l>Lh`)xwmr#1@Vj}}5z8+s>nAao9SwAhmQ@qh!^j_lvlkr}^v1%yTc?|OdZezduqy^k{_<>O<{(>( zW#4&7-Bsdnwp!3o2c4Ay zDHkjal1w&(iFm8==emZ@+=)Rj8pU_q4;^6x7sclHhR6}o{EAEi^r@MH4V4Bj`vL2k zYn^9rvbkE0cWHkHDo*+_9|~&U028n^xpF;HQf;a(>iOFdS~kw!J*{>4LtjO}BU(q^W((wh z23h4G0t36jWUvU#t(HMa2}#tCL8jz|mbpZh*}it{ppxwfD(s=S$CWr)a(<~#?9If@ zwzp5aBUNN5h(o^UH)v)P-diHbdB0C@T~HBAPH7V$;mR$o11o{>s)_~WVm82x)TLTH z*Ixd5z9umc)L3-Xp7-l04t$F*Fb&Hgd8r}ln;*WO3xVnQe(~ic-PXW;v;y9Ys`tRf zyqdHBYDhXXh-aeNey+jwtLc?U{+Y$Wn5G=|<0Uc%a-gBFvHvr0TF~Q)1%DfeDN8^e zU7`g1P7pu|4iJ{8n7xVXjQUl@eq^q8heJgL4LBq50XCGq(Ms`X_G8^ly5R#z>LLYd zk#aovD@GL;Y^#T_e+1_|b@g4WTl5;bpdR0MtIds|>;TmcwMH(|w1@+=42&Oc1^{P! zVVfZ61WJ#%xp<`_ztGHjs>O$+@4MvU<;k|1P#%Ql{B(;2ttg`la`4-YfWc7#C#`%J zoCiQT!qENUK#0_f5(Vb8{EY`n<}uib6uqJHP?gd0@-(ut*}0YwRh;Y{7&ZhS$fD01 zAca(98opvj>&?<55*w`K!FMoF;Dcu?_-2AoZBK+e-6DT>4E~$mB`plVxa6!b$FbQ1Pupzzn?xedBU2B3V~M~( zo`KLi0M5g`0q7xC_WFsk^e3K%s$fu3NZ!*mxS9oRLz-)JoTx2q?wH^9P${OfWXWKV zS~_WZ9Xb1O71+WcgeC?=6WIH%p(;XfJCf~`9a@~AtGvya z4^Rh)s>V<-E1`;^)OF`IR>5 z&*Hf9JDCvK=)5J6!IvVKFc(`ZnWPw?S%r{tE|fr_mnO;q4ltC>Bg)=0aw-J(gpx*$ zx&br4UG_q;Vab}!QC7UXpNj;P6qJzA0omyMf=EvAdMH8GPc8{%yGGwGN-X(+ahynL zO4xCal}5R4cZ`rFffctH=S%VAODu<#h88JpSaSwI8{zSy2246D^y*yaZM%xYJDG z{Pha=yd7YW2MNd2Gp*QY0bu!%N0M_AL%i-Fy5ajJFMK2OvtuUO8ct+p(UVC(7UNwn zun&>t7$&f*MTWL8#$)0|h%kisB0neam(tRHp|=;wX#cPPFC`d@f}<$|X>g4|h_;Iq0OEdoCmT5Vw16Mu2gMm$Slv z!2uuKpD*e*XvC~R4If}C3fg!mI+jXw=PBsHaq;kowgfV3#{^MGNWD^i{gGK&&T$~K z?J#5;NIFuOZ;!fiQL!0xJb?ynu54rY0SLKZH7`j}@jI*(JyYq**p?Jg;tw0yA(<<4 zNY4oiFguWH0F9s!#}BJ0VEg-E!r$dM_@z_SCGSjE&3}58 zomHlflytfzLBva36T#_LwPaxNY*%jDO$EIiW+C#hzLMjXtDl>6wSPTV$z-mG*5E&|b11??IU5L`?<)FR?VPLpsrLL#Jth$d-;K2hoBDTHiF$-Ew);N_c_ zQ;8))dnCIrrSxe6Gjy`FzEL&<9`@c9mfUd>?EC zS8$tLz!3*i3tSlhn2o$k#sOqQBOtaj--|MrI5Vf5iq``5<|+VUCDOU_Ck32sG$q!c zc3$O`!9B~jPTN!E&YzZd-Ms6IoBalbC`flRzpzlp1FNADki0k^YORl6+?hHfCIGON zK5(gkTv8@5tU>E;np2YQfi)7i<}PWnUnCd^+&nhEw+=7My@k)gj)w<4J1$+SM8}78 zhC7phpF0Q(+%*J}>0qxA6X9dWp~5=BL<3v>bufE_Au=R+0Kozc7sUt?I?~#CtjZbF zd$~}Z*5{61J_hE@e6JA5nwOr66d-m!)&L|bs%5s+eM;d4V;dN+YWZiK`umSBmD2YqiJ!%-iUBl0)nHqT_@5qUkIu_U zP%XNwHyG>`xyZ0(R~M>{R!L$H|L_0YqYHgxfO`lK3@I`eK{Igh}^M_PwO84#&{$V8xr)*D+Ogc z?pykzqN<0NBa{tT@ApLiDOfOi(7{QLM#dm?0i*|BN-5?xd{=B1mH*G&3b<9@nEmMiL2~8U=lR}B8C{0Y#g}lJIOf$$Ib1V zKp>&G2l#GvX?`rQnI4JODTjgJ5@C+-8FpG+NBGL6?_#8KrmF`u9f46hwb(H|Jx=I8djJ-ICrWBMEU}x2%bnOF|;XGGvkW~nR7|A z6wzdN$wWnO#cO5584Vf5v~u537Cko>XtLPcOWa4C^8i)SR?cNtEo3K->kegVb+BE*Pprd-lXjSaDYj_D(a+;`tgZ1EpYD&z;G00^PNz(dO; zP!af2B1a434b`LA+>{fvKybk*_+~Bw*prY*QBeap9k+pDgDI$}qYkL&Qn2GpQJ*=1Qrw&6uVcpoJ;|jKP4l7kCukkx~rjAtM*+K`qU-7R1kGcqzl8CDPJjBF90+riRJtJyn7 z{WE6vfI}$(SE4_C8zgyFy>GYreAl1*o4kOC<4jAHhNJhFv5?xa zIZy$o$VBZ303GyOusuH`rhpTQ%U!cgP)$)##HbNmIpT@P)&f=S0rC_meZ1CTMz&1M zSR^FHrewkffMA7TAa5&(GaFG10g)R!cXj%(2DW2`PbOp^N>Vf$F6}X#n*3AzK>W$& zJ3Cm=qxOMvyc#tiLI2b#pe0>yJeTpqS5m}$-;Pg{XciPaZTr<8kW-fwcWnEoJTwu=?IuMsJW zSc-x8V7sJYk>1zRJM-Q6=CuDE@bZE~WPRc;H!JvqAeR1nQT9KV|G)d(_~x_IXa46~ z|LZh(j%~iz_XO$}6N`g`5Hfw}6GIO&DIdf;jnS&etzto@^(=%;qnW2D21dlu_d>uxHM z%=$~=kOe5qditw`&sDKXL}K8NRz*`qQHlE180|UD+qhBIa8~2Lc(Z69!~l+M=K;-M zyk54WL-jPU<~-LIh_A##dKWBG#$2*cs*w8d58rQO{lBrfS%R=roTi4dheO6`m(a{e zpFB)T3YxrtJy=B%>UMrZzMVRZm{jn}!~{a=W=`y#1KB%`-2(|iHT#3GSp?%s&&6qY z;3k*(d)S>pg}-8~IzmSO5Zk%JRB)jQk$3~Yj`pnY3>MtHNCXP)|NcH|YsIXL4 z=f>W{=hRR)_)=<@*y%vaL*KpiDEv$FiX7~T6QSZcgjtk44f2A{hkZUpyOq0KZf%A3 z#SO8Tzj$8ESlDSn;6)Qd;ELVh=$7{7v;@<1-(npcctdufmjfmSvVu&iTUU4#S;;@+ zcb2f8_PgA+CaFOnc-9URazO}hRcFS^T7i`jX74=xgQPC;CEJj@8)3YjQGh+Zvc7ky zc}TXtZM0HG?B6;K*4SNV^i)u1&f%>f?e-D`J<^721xZDw%o6qPs{;jYL)Kqd2KVxf zO45zgAHU^IxMEcw^B5>rX)*k^ZOzgxF-l(I2yQp-a~b9Qg$Ez z*{g4@ACCr9{wPpgoGKg(o9uPEg8R5n1+Ltna*}h{bX}jlC%P1s8}=hg+00v5ZQ(B- zcjsTcl?r!3N(vplFGF|S%@Wh1yIdo+eZR?Rz7c&O@iIyyyaXgMY+KdHbFTHzWN|%k z4Oh7(oA4K}F7S`GGbXTh4m0rk1<2{Dg0`nrII#6lCiCdY8Zq;~=>cnG`23`fyRKM{ zYfOehK8EF~?;ei!P!T7yb#M-r5QUFFd^?x@7w_~9`1<-;x$7-aikk>>~Zd&$--!Iut_o4Yt4hq@PSw6wRwF*pl-$8baq*<>t`h-?VabGXK zi8e+C1pUQx{4vZn?f4hZtntmCd58!23+P)Iu!(*723NjGde8pm8M_?|M~;Vj+_BN` zmS^W;bgW?wW}!{dET@{6zv<{Jb(AU=C7tz7UxvwOqHZ*#l$bikds>>y=Y`8NW(kH= zdUN=YdFLNV{;%gcUq2e!P9r7vl5Ry$#_jsm*Uuf@%sha4c3==VnW~&K=7*Xa+c+66 z48uI<#Z};<_jgR_Z<#Teqbh&j*!T<*{x7QIogq8ceARf|2G%59-h#B5w-9;BLfY_?Sg$m6t) zx_Ah(p3|Gx73UF3vO;^{_L)UXqmb8K_Uf1qZ$bhpe+YDJ^a{yJ+jopmd}XgErg+z) z*A;Y5QXRV_M;no-qAi&RNi?Io>FLdN@3NzJivAzDrD13;ch}8G=*2rZyTu%NJA+Jd z9dEwjRSsPxNwn=;N(!yw^E+EK2HGjs2}Wg#*%Oaql!m2=AG^dN``zsw6otu4r>?sv zohJ-WVkFsR#}~+>=8`4ZQ^JV|2tWLXwJ?&rIcxr%7+u`DBN3pf-ALI$nAf`j&5l7K z4yQGWEj7I~hfF3CgH7c7akXVF{_m2uY9 z)m4M|7UxUTmgcQ-bA@e39dorg#6C#w4kCEog7%LPQi_}*SB-Oh9aL^y^BMm-c`1W~ zJ}mBI=j~)T6TzDb*aoAf^|WH|%Km~K3jbBjtBW3zmDufq?$zs0)Mdv%k!YnSE|3@4 zvS{L@vbu;C_zDZ0`8Rs=Ib$HGc&0m{Mbjns$P8w7iJw_pxk_BoC0G%%m|@nQFxnsz zlQ%XkjJodiH2ak05uGA6hr>*pnY(j6c@|c2f$l-)E+r~8EMX3|Ao;JD4<|{R!cR)I|&TspF2DAFAJzPgcIbA0_kfi^a()+={MZ)GjHsm8dL$ znH$^fAzZ$onq~}d{G{iSf5ngZPOS4)1WK9=fluMGDdc-~w!?1B(dh$zy&g)3l**&p zywjp8yGpx2CxuBv4j-;8MRLn^lH|v--EI)a@)UFA#1opi7uj#0{$}`rDi<>iR_&fH zA#;TDOzOC#Flg4^VaPew)R%qsJOOw1Jp9o zdUVey>-fm}wC77Td=7qMxG-nzdIBZ|%T!Iz^sBE_B20Yvh4DqvRxW_~dV6wE^ED$$ z)38feruJ9Q+Y}}0`MpjzZ_T&KZc~6EeBW9696*q2*w z_H!h!qRJSl*12?M+|&H0It^}&1lD1%k<51~G>|wDR z(R}FBf?owMkH{7v!k)p12Jw(v-A;(GPxN=DD2n(CPB#m7o+Fz!C<0CrKqDQ7tCl{- z9mk8p%Ll|AFec8l4v`I`KP#ez$!>7U^^%0nvIi53*Y#a}5qDi#DlPby0H!7kE%`Yh zERBK)FPQudkZ85IqQJ zCPgpNXp3m1?E;X7T;NMhUwlbHzOJPvoJJ(CuPidU^Tg%zTsV;!6<5}~Y#>Nglo7Lj zoDto0Mzi3ziFep&#gKG}i^HPJ2MW0Q!u6#Db}wn#39l14tBtdcw{5)g(N@8Jf~SAhsJ6?W81OZOfx0unEi?YJrpnYOZ;B{vPG{;Zw8qut>axtla`~$*P9(F=Q<|#IH*;h_5geQc4eh0 zAr&VF+aOhojvFPjWnr!ra3qf*lCC2YNnq`~?}US5Ude$q$(!vOndzukoqD5suU4qB z_nH*4ds+9lzr9YXelS+SXhSkxX7ag`ILkUldR)--+hydXS8L#->>o!tFxT_UW93nn{aBb|Z2 zljoyEY>m2IX$)u0K*@)?EFLB@+Dt^ zJRWBOCzWROkH_U|NS#2;d9u=kdy0Xh_N}>eF2yYkO`!U?;lwD<%rnX_!mcass)(t7 zDxIK?u*6BNg8^D1<~a0Vo;lXcXrksye?w&>3zKIXm85D>#BU)p$%y+=x^GfLZ{sA@ z%tMzQlS)2R^UNG86)mo$n5-6^;IC?E0lxCK_jBXAj6`1d`I z$BLqRYtOK>Kg`y6kNYvaNtvgNgfdVoV0zyniPcbs2N*YQ_O@|M) zwz`9Hpe|^Z9GIq8EYQyYcLJ)3#dx?l+9K*0LEBPN%(qOw*M16i#0Ve{c8^YA_atV`2 zw&LnAi7A(qP&%P@Crb4gG4ahf^k%YUmZ4q(rU_nN&KTuh_LP+OU1B^up`D$dlCg+= zgctgCbv9S`{m$Z3_Kkl;=D*tKW$gr7sAaU>eFGtv>f`X?atkZ;>{-*cC$5r=a782Q zDG^nb3U?KE#goySSypAfru0@$>jB4MCl&#SnRk&Kfn1G&z~+*G22fJ`Ts zxcoiwPoIGo#ki_??OKo39PxI`l z)%3BxnR)>H@vk|29SLIfEt?dl6b3*_mAlLZ&*ZPFh`Y;%TMY`-IDP(RJDqREVZxJ$ z3(+63IHr&wm{PA;LRB^Hc^+o4m~QsGO$7Q0Fe`k+WXCA}&|OS#gP{Y7{*Z6#_P?t{ z&By0&7oPJ6Py|pskv2%**y!uUq`Yqv1)@#Z^~X>jVp3u}CJ5J%z88umHfu3^F?%}? z56iw1!s?Xcp{Ke5#bUA}`Fi&+f5L->RA~$ly>q%u)rV!3yQZEJs-|+GoI;*V zVG)S>$EyoXlXDY$DfKlt83Hm}Jm$%!=2rx%kI81r3hjdJT%Y|SI(ttUqew(@NOCy& zI^hYCwIr_s4_}5>W8C=zZ88s7g1$vx&k(ncm+~rVCsy{Hfqf^j((f&FC-H;HK&kyx z!TUT8GK7zRnVWIl(=(w}qT&E12t{Cm0BJ7`kGCGAKv5&2V3I!{n4cvgU2qLfU+^ z?$lC9U1fYuwA6agDF+?y#%uUXaE`M{SqGvc1NU|vvHVY&3>mEfJG zNA?}2l_Y|4t;!S1^Ks$^l8-G7Vz3k>Z;~OxcErI5-JW_8kV4=g{hoEsx*Q$mG!RG^ zXBz*V^p{h60f<08dHXs$JZ|LanD?DLZWQu3#4(sp5R3AxoiI{ID9ln(_DA8lCGxmE zZzoI}9BX9I-*)8JE2Vhj4@Cvur@uZ~gYdV#Ji76-J!hv#ek^B){|S5nvxkskA{P8| zrB8Y#9)Sy(dWwCj>e-`E{$8k9z8bI0w@HAr>F_SkFI~OoRrEuB4eR3Bzz8ANo5@j$ zZ>m*J4?9Ub;iLYP2TR;VO3UsEyy6$FDPnC8rJ+}r{e)q)4|Ud$>c85cED6;}fv60T zhq${CEs$}HKSq3CFuvfH+B;zV6V`|i2%JhJn1>qfyL|KLoNd@#e(UD^uAvzwa5w3J z7qag>*UGGr`(h$8J<;ILW_Nn!%ZKwOr_

    yXIJ!$f+@(-o-=C)qA!2((b_0fEGx4 z`h;=S^e-MogOYOlM&VF6p(neWLojKu-sQHGvy=n&nOzEzfavh+@~d(B0`jxV*Efeu zsL%FJ^iu=o)%8#UFxZI1VroN#V6x%db=$Pc{VT-@pJiNf62835f0L57?7qWthGzy2 z-Wwkf0P;ug>EGAXZVxI+Ay1y3I82^Kr@jJ)bDbtIX|Shui2x}Uzd7op=!VI?wI?kO zR8OUeZx6RNXc>y;28?;Il7R`IInA%zhRnozH=r(%7yYHP9PVWbimR_+>)M?oqk^c5 z8zxo1yGzVM82J4t>E!(wxQ?O>dmOV2FYJrXR)tR~K29@Z7f$>pBo6#HBlKNOjMHzJ z+#auar1D#ofk>gfyZp`{2Jv8;A8vkcN#+yd{N9p%{Q>sW3hf%ZCQ=}M4qJmI*Ar2> zfh$aW)4L|FfAOfh!lPpEAfjSx3}~sCOCDb7*gFyd494kMGR#Fmlc35@@Mpf6m zxubrwBpfAn!u~P{%wCR(3hhug);H!P`~o%DAsKfT^G zs$+;EwVYn$r*baqBh>OB_)r+0TzHO;1XGgrlm0QmtLIrjk=+hmAajL(!?> zdqt?R#wtGA}Ujxo=!p&f)5+CPI}gCL?7Au1l^T+ z7$gWkx6j<}GgRmr*8H^oT>B}}=NfTwNi-uV;%!Ji5HPzWtLaG7z~slAbr-pm zJ#9hMIjP8P(bx?aDfqVc{Hnj$B6FUp6{JtKp8`G2S4_yZbiZ8PU&KTpAns9zZ@c;@ zL%iv$sF26hsE*%E<7NeEIrHIRrcKmVopqM`C1##P0ypPXD0)r|6dUd}GJ5t07Ui24 z!HA_UlKQI-V`HYwOJV#baysT^3d`ZUVf}mOfuDqpGWXZ!uJfnYUG-fRtz9w@Ml?Bd z^RJTs#Vg4>De>9qw7FP~O0N$E*0JJE;=JOd6}#K6z1_94*SSi-kRDg{dt_s?9X2jS%arOgD;v$wpFr!rTk5 zLTH$hUO}_M`taB!>o4B5)mKeU_a?kAvi=;QcB)zzauqc9e7&9e=CjfEm%5;~3E}=K|Y)xFTo-gq-C%5iJhr zWV(7wmlk&KOPB|O7(-}e`*M3fC;P|u;uh1=+Y~AR!9Z4op_(2)0R$t-^o+BZCb{UG z1C>ExT{EP2_Nl%XyRfR)Tx6&!JE1E7hM(gQj5ye}|!m;6$A|aISJW+?O`#gPSzAnf9GB#Y%js*}s z>?&b4?J|xL7N@(Nf2^Ih9nmvYG~Dl41QwjbBd-^yGhx|p1| zc9>e{589f1uKg%d!L^JM@uN37YdbHlGvBi|lsM}%VwSakuiZxa=2ZI=Y4Xn<^NdG- z@w^+`RkXqyBg%Du9epT5BIzLZ!u_u+Ar?W|3_l2BDzOYzNEioI2jC)Oxc6P^va4i2 z+w+-h9-*xNJ43P+d^?zGb6-=q{CZi!?tizPG{b*@l1Y4mY^sMJJ}NEhDXlwyZ{HAB zm|Ps)d!vHxyNDoSJ}k0ngrcZm!Sr4W9zp|yI8d5M=N+3~pQ`md_l0@T=ssQl6m9}~ zOOZVinyCAy1Uo9ng@Yby^UZ<5{KLQt)siGV)m}6*N`HS3%U^vOSur15RM${sU9+D4 zL4Pl{$YR$$YeBEYGQ>f)Vh=@u zEt`wnz9*5@B%`b!YkyVFnI|;VT{kI~FO6(IHewHmv*O)|?4&j0fdM}PSRtYtH2 zCw<|FZ64L1-4uG1>#djpp{j=d24a=b8Ma zGqK^S9HU?&L$MPX^+4JLa|4FnHCFSVmiO zwTnDUnOgcAW;uO3Sq`5Vx7rui3?!PE)}W#uEopzcSw|bQWXx;!N0trA+#vRKUr)YZ z4!q~So4#qD=G>w0uVbFc#9n+c`4`VHco$oAB5tYjgjl1QUufz@#u3A|)SrXE)bJRG zq<~H6q@WkFyJF38oH8+bT8i~kgU(;P{bBH~y?55F)=%oxX>(HYXy-%f$y=VCn)rYN zusZj{^M2!BV+mW(vBrtSG78qgtXRV} z$)>vGlIBw z=rrp|(4{+VLhp4}d!E>|MN?74CR3@VEHSQKp11QNe5PD|=S`;lC(}O=Hain8Fa4e! zN;2nuXsf5bWLHkiiE`d0-@fG5G{uy=p@>Rs45?4t4h`(O@19Dey$fWR925h-UA721 z2?s4(0oCx~Y6Couh;}`ccAbTowR&An#1x! zvl~o@8itwqG3LhZ-cJ-NQTczIoVdXG!uS@m2S0x6ispe&3OEzmvgU6j&tQ zcN|bmQ50B{WpF`_2f&NX*7b5SxvFaoDu+IDv`6of28?|Yr~DKw2i}cLov8=hFuuLQ zAeG*NC>Jx?>lPCu$(JbgYh(_j;5w=1lXcWG`;=LP!6C6GyG2hEO9V`1591t{ry zMzcrwy;db)*5L^i3ngF_PRrQo*KksFf-}XcXo5w9JRmO$&K_D#V{M``tu*u$%2@#O z@Fqe=y6LLsK@$nxgPs?$_J>yj*_h%^Jax( z-6bbluVXn)0|zT@q+nC%jw*5bTmjDoRJps7jR$J{F%?yr8m3C^r+FuF*x{Fq1F z-ypH%PUF7HJgq>N_Ghf~v82Cw{^U|_U=&wON!if?+J$Ibl1S`?t9gBIBNU8bTDVF! zLQPs4;)_p2s)-$kc(7ssnMad(M0zW0INHbVz?qO{O^OTXNAS7G=fEHa(JH5S`g)pV z2k!hSNRb_44IpvdLtkz-0q7C$XsXzi#)?TNGk<28*N0W|ujREbe*`DK9zG_=c~k%V40 z?JJp~y^g4}gU{vg?JmTykd^}Cmr=Q%9?WDzAA4x{c8EzfL_sUMRrDCbv#-OX9qQz& zFF8zsm)cMSAEe0HHgx{kU!`w7o6dVxZ|# z`x<3@6sUTg#+Z#Ud2(ledx} zRztRU&}qMVVnPX~>=#Cb4{LhU*AGe6rb?O*F+Zu~k04iHE!z|;PSIJDEcIvHRbggc z6%75J=JE_6jJ%KZU~kJ-WSX|g52g~ksa_Qe`11G9++|gIzhUDq{r>QWN+doNSozl* z;QPxhkQZ+_#xvf7!s6(FUdoe&$xchp!D24$Z{ZNJ%Q{d2bG`N(C{DxGAUz71__L;$ zs!WHxfU0)`+>@Hsn~m7)L40^WMPF+9te(^IiI=cYX`07hyrI4dkvnlUrG#y^40wX_ z=$*GVKhxvh8w_ejq+lbE+Ri8OA25d`A-EqXk9s&4qeSOe;X3qtVQSYSL!Z}a#M2Dl zLzM>CPEg!x( zb;j=5TX^@I2naT^*KOrs^&CUhc|pOH`sVDyVZ$NoRqu4%Hk)uCziO)N9@`IY_yQ23#DL9kv{8= z5bcTO=kYG``c;t+>#|Cp-A?oBO_q#L2Hf3tD)RY4#6qMTWkvypmL*VP5oKU$P%dRr zDX9D*fd~;Ur6Kwd#?%rlX&j*@kF2`IMPAwxC--Y{!o`YKUs53l&Sr3 ziI6K1o7n3D)}?i`0w1bKpNM+Z$7Z9~Cc4KY^J;l&+mCf}UwK6eOP|Wy?~-TV7)o%w z3%4fc>}R;{W2_sSO0-R?$yz zraldKw}qy&V)_>|GHQ^??1+P#u2 zi=;-#pV&LE9B-2^y9=Zghkf~(z(PmHd8|_umE$v{mJ_maieaX+ASA#e;t3x7h|7)G zd-j4oZOjurJN~^y8ShRmB>^qI166?ynsl^w-TTPTSMu=Dn9She(_@JX&gfWL@z{1CU{kieW9X`^-(HOnFDYmdT(MzUdRSk;A7ZZZprfKgq%c3v&srwBR?TRv<idSe9L%U$jBe&EV50Q?zFPT;wFrH`-TYFCu4% z^c-D0V+Bc0hy+4Xs2iicDAGM%d^Hy-qnpaBszgT1cu*78*7)(LM2tqml!eHn=`dYV zV{CG>>Y!pn8QEWH3n$MaLL3le>;&bf0XuJuLs^zf0%;|$pg-M$%cC)# zT?7?6a^J>lTpp1=+5PH<7^01Cj33*L7mYirK}^_usol&l+ft{pkBE_VmDgquf zYb=sH7y-XYv=pJyOFl(6yakNt4WMmh}gojZxeZQ#l1CY_)(C^Jw4rv zw{vS$yI$W*%o5F4g(#`0S;|G&(vw5~;TChJCJU^L#c+xuY1c8WBy9=hV36O3QJQcoL0!^0u<7!}f$7-OH_1pmykERJm5 zklVZo<3={Q$2=>^VG_(^x{sW#30GXkV8;`Y-G_%r6t6?#rF-tIVnKXT1p2x}RrmpI^fXig|*UA7Syq?`zrP zXYHpq%es5VzVGABg&Dp+pv3!tVLa4{tI{iM+pc1MS+KDZnwc$A`)%>(pmk?fle2|4 zed=D#HFU&On81_TtXKy=JCT{fWmfu{`#u)euU~t%{`mb%D|kG@=fP)Y>}~_2^Z?eY zSy)!3n@v7#Q-G+6B)G)}o#iATu%iafd|tjPqI__tp8Z*TO(lCSDFXoVur>SXL^DRAwOmKmONbS zDySKtoMi0Z=~4AK9j zf3+I8Cb?HyXFm(7&~@mQQ#vGu3w*dzX8(R#d-f!Z=%Z(%-XiL$6)Z7WO29ML=v!&W zra7Z^>s_#X$5MXob84567ikh6IhIZ4%9H&@;+ye$^j+btA~|(IDi>;UFNZA|HFUS= z+Kc27FTcR=37@Dh&7QFG)mK{y8!Y0CWF}8hifSSz^#1dqOG}deYQ{l()^CNB0|MgC zT56+g&U@6sm+jTy#Ae@OU8lZ%3PW29Iw|mp5Y$Y?MAF*PKcRRhWIeyKCla3>0%n^>5pW8EYP<}77G=tgEYT33m4ezYeg*l$ai++Sbhy3CFwLdHD#h8bwE-deaffemWD|2 zKss8eaX5rV33MHxDUoFRdaQ0p8fi_sx*D+^`&R`c8FVy6Y02Bm$>7Q|$8vps9p{(~Z=~xK3S)NvPxH90JVY^oIZ3ou^ZQx5yyF}B zSw5zku&Yf4c6%o2H>$;N6IS_!(W@KQJKlBkBf);8BuqUL7ghGVOIh^#0l8JOe~(R( zl|=mY>XR_XR~0ylx4aP?af7ad45`8hB{FojkzvP2=^57RT>G4G8y2}M;Ujr6+pUZ4 z9YvxYZvCde?%r$vi}!3&R4sLb+ja-vE7R6wl9BSJKnL|C^Njza5{Bl#c!3?EdS|_| zZ0HVtaxp0^4T+98bH#l`$(hDmuNm>wJ@TQxAui1Kw6t8#5&Vv33xn2fhh)Dh^6<{2 z{4eow=+&2V9w(`ATquEOwXs1@xcgv*T?LfpCJ}o6r?_*ahv?teJW=s z>3)xW-sD%`u{-F%u=M3p@dES4RSZvFUe>4_A?8p+2MZ8D;K`{Zen*@-2-qfo9WOfW zJTM^nb0#J~FQD3`&fPl5@gwT~?13<;^i@C?+P(y{Oz zk#h)XcRp)-!N_Q{pP@jl=C>^h(WSu&k$rQT!v2P)G>w+4XT6O6Z&ABvl6B+GSlF$) z65i9?{Bcy&40U`{b-fF}(YBkeyy$)ZNWxk+x5_-&!dExAyx`FBO70x~5mTZ1Bt#>n zDONG>he6Mh_VHQdhevhtOHxdpg1m zFlNtIP@&zJr-&s<94_g1>l)3oApI&CLHAF)0nHkxVbPlp_6G1SGa z7-VskItplVixtgziqX-4PSiVl98iy3Nq(jMHD+ z>({8lTxpHCw+Hnq^k@G&AG@Pa>Zz2hg?4)BsUGFv{xw-~;q~YO^B0V01v;cT`4d%VL#{{Ms2;2PixrwP zjQqJmOcC|J3g@)ml09y<3kono-G!}*{P_CmKmk^AbCUD#b?o8~d6IlBA7a zNefG#LGDs7Dx4v2e>0G41@M|7yy2j3Uz~7hc*Lo_kQGXOM2i~SUvf3SkLI$}W9o-( z`$vSYw}&31EvMNv+=ykL=Sn$igeS2E;Xs>LjWUu1uZHiuT4%X#w5g=ZfvY4oeW(kT z#43{u^!*oZw99vq%S+Eo&u-w&>td_&!cyI=@RA-T%CeU}I#*z|tUo8OqSvRS%;dkI)+let~K=x}wd2L;% zknKx2EbM-kEXptAl9w+2>58uPVOF+TN4dfq3p&bq+N=i{L*YaEz8GD~?#0U~i< zb6&bFIT{|KOY5|hY4mR$C)KJcGB6jRCl1A)zx3|^=D}n>Q1-L+S6N0axIVf zU1VZokV%BK5%2d+UWD_%8d-8ml0|RdIcE+6A}e1VU-wdu^JL<;nq1Z+5b`ALW((gg zIR6a07fhD#s>Yg{>^zpcfY=Tl+NL0^DN5X>NGs6o$zzG83|5l{JL$lPJ6JF+C-ZVT!7{cbpsvwTSh|9a-SZVd^d_)lBCd<`i1^so(f~Lhnn1-VAADzs0`Bc~Ggt zgA_uS`b<+%4)p8v*weV`c&w1aK3}Kt*^Q|A9ru+B;?Nr^_j<;(#pm}tCrguiyLMvh zb=N}JhQnFXMumS7Ykqn53_0@c%~5*Yw8!_mqDpFmQmI?lHv=g;H>~6DZ<@Wmk`5X6 z@!n2~T$(9+S(Y8y@#xAk?N#YXCv~2_`(NqX_hG*nxFPO$OT>p5zNfL2EWsv8-`pfN zV(s8*UlPA{EM<~MyY|gJYEDr zJGLkM)-|Q5HSdOgxnW=1GwU7l*<7nsufpTP?y0#ni8>8;p9STF>hxxUloy|{Fq3Rq zBy~^Tar>gOZ(Nfwz2cd1VfPqK39m~;_*9m>xYRMfq?08@+$`&2itPP-fHSy67zUa) zcA8b!^p}1Vm*V^ADU`%iT1trS$aIMRYJ#Ge5Va^B?c1DH3f^&E~(G+C@bS0k%ul;JZ=SJC`$*4I^48A z4KsUvXM9xY7995Ex&nQ;erCcuxcE@o$=VP8B4w_uoYw0w_Nx&eGJLp1quw?kzw~Yv z-jP%E7Vjj9reGxhK=oAKi$UIiw5&_J-+MrFvSnGM-Tm0q@O9)HPA8+ZxsIx-Ehv8* zBsnW;d3|AUf^PP}cXPe-q|Oq~b?-e-MP0}@hD;yi@AOf_t0J!KHH$D|(#Q^hhoa?u znR+5_Ewbpri$p&DC%J{z+3&+8q)bK9a`8?IMJM9I3@N9B&JB?P!TmNnQ5{oh64jxL zkDg!6(;&hJJ7VM=!fTKh4&fCVH8m8u zwc~};CrLgv8DGrC4fSiQh2%TE$BLdUt1cF>)O7mJl%M!RS-Z5obSG|33ut>SQ6xVv zviwfZ{!=^FneV(E0CdcB0L%hDr$A8xp^@3q!EHq2*AIHpcnBg-nlpj`>I? zrTnfk#WXw|Qrv~h+Zj%!Bkk6+xVvYDTT({5y7U)C8Y=GlR({P${~Egp8L@npCb60x zr1tiez4+dl2J>5b^_!5RooBVz@BhV%?@0SJ#rrB=mW0ru5L4S6`xtXeF;%luOMJDeGm1uUAa?$T6riTAn7rpIa$(1@>Zk`?m zoa@)MQK6^pz~97R>Mt*_}xvB3Y3KkCE@Y#0FKz{RZ|f+q5C_ zGxfV)P}$7Ots-g8u%x?0y=%npH29Tv&b1}$9LwxV#CaLaipk|! z)vLAI_8$=85L$|TC3U*WEK;`r^4|*rU+3D^R-q8JPWjbe=hvlqT=JXMyPdF-6qY}@ zZUmRTf|RH}qviQh5ps1k_a}T#Q{CWE3fTR54!SVYYPCmmQ6nD@B=ANYDuB_<+eIv$ zx?i?S$SM3!0_L=wUlO}SF*6L7{x97LBffsW;5zNY5D6H03`^+!2OpmmtVlOR zSYg2)!}uT&Y_BK3%+^uGgxh1UqSQfA_pqmg5I>7c7DmLg;kyBE{mf; zMujDA=H+|xLnm#S3qP6uwf)%x6GbS+^2}!QdGC*dPJK?@>*du3F-nD&&cXV+Xo^moR@+1|=dE6DBnnoR z1e)p*idmKm?N$%s6Ikw&f)-+qzL|A-!bzUjO|1|`any3>nrR5AXLxkWFmM(MvNy-| z)!&ZE>>pnRRsYC_-}2C9tf~5ScytP>l&&JJa&|_D2vEkcim9-wU-nR{+CYd{23PUB z8=`sd<_*G#=mQCdvP%q!27Ih#h_+DcgJ*&!FeS)ZtnAtdb_R7M+ggK-jI-e~-u&=QlVa0nP9ZgyCkiMx-P65tV@_c!XiP1P?yjOC@ zi(Gl1ewzF&De;y0GM4#aIR6Z2UNL=#dmC)KydA%rn~OiZf88!50-F|LGQDKOe zN!I_K$F4ec*fwN!ul|B)q8;2&(a@)Hyo?>LW;RZ`eBXb?SifMqscmq=NLX;5lCuw~ z5{}D$X*9M$M>=oF)N7xmW{{p*h65Lpbn7o~FoZYe3~|fZH6OHF>c?uu{OX!s{m^VT z2sA&U`f2|amAPTsV&54yb?3CV3|g)2K5_&v;MCvM4O4htv_lHqMUgf_PsHNe=sF3F zSQ(=WIwGbL%N~L2OnAAZkuHo+HKU@gb_JCYdH$Rj-dD|E=~gR*lCg>~U_^gA(egQh z3y_VfE=|Eek&6*?rxOC!9WN=+zb}uiXlyCCBLwA5RrCqZwu}9MY{#fw>ClqHlj`z7 z_yK!XG2v-19rl#@9Vb5^?Jw)0=N~K-wZvwauuHDmxEEDY6#amynZ0mOl;$=zer428 zG5nC>%K%xo&yn34s}mb9ho#ls=QVXUvLt@VEh=}TfY#-@qvT3M5)Q|zfxzHWyai5k z7hIy6%JAmm9vk{;kIDFsoNa7!12FYwLuHzrJci#M?0Q{uF`mMVDJ163gN4DP@BI|x zHgJ)Y?8FByVdRH;$f-KHq}q0wEn=+;oq5F;t(Nfxrg(3Vz#*Lqlc0PZtQ_DQ_@&Jl zfd8B#q%Vb!?gT_Guk@!w^FqqA3tS-Zs;eE0T;3)4Q34E@1sYv9Jrk2i#rWC5x0S2i z6iFzA|0YZLL~ZxYNelKP!cR_aLxe>QVLU?3AMY|(b$Qq}=29L;?f>yc*o1{&nbi(Z zH7S2*Wk>u^gCgpr4r6htQ2qguEoA=~>6s`n#|h=h!IS|1Z5k*Us6SA;{FftnAFt$d z7)=5(qL0V?M6L*ALkrPmT2OX!g}D^G5OK?sY>oUs0+?vGOzX~dl36+Yj7~D7ZWJGT zNLO1B13&3@7kZEWdOyA4*e9zsEI(ss*Kt8(By*H^DO{Ie2L3krlOmzf?`9!lS7U%~ z53h;5E-OqLzIlxHM+Q!swc1$rV$;4CG^!L|hHqHc@t%dwor>a6(5q|`@;GYiGy-f< zt)R@yof;K|T}xyNtEr%*psb4U63Z_2KeD9*uO?c z5D!qxvN_?5a(6H1bS#0)_~z%q=-)V&;F7c2LXi$Ob44FmJ_NXq2UdA?Y4a~8-S3%0 z+07yHzGRvLSkXMs{4Xht4?*4i+ANG$)E23vUNLm?RYF?n02_DNTLx&J$H&)s0x#i) zrnt4_F*>90EpL_vfbr{zW?Myu6JMrOxh=ie60kmfA$9kW9IqZFhc%0RvT%k2ZZN^F z%DOt#7_|+Fk$RGa628EXv%SV+>~NLx%!L^2w6s`6%)hYUL)5a-+O3kV zh`c6@@(%_HdFcE?8?{@ya(}k|(sppRz~JEU717pP-?1~L%a@-&6Dz^Ym?F(FvyLlR+=+112{ie(+<^O5e6gfUdx-}|^Y|HG?} z|BH-D?7PUTeglp_2^I#k@*KPW6wegHIu|;|m3lF+NNanKe&O^`aYCtS@F7TLR_5b5 zjn9y|_MMX-wkx*4Lf2QjNBZ-43sbQpyIqRA@bv=DrKo?%oikGE!nS4sh7kAf+s5oN)?iyU)P*`kHfa|^@qL(Xn zJ8AX*r6EJf>aiZXAKudI@KI`s9N&sJ)!Ec`!P87uj$LzSt6g)6(z}G6&aE^!FQYv2 zhlVwuQ{5xq5Gy=;lm3!4ZsNQ=6aPKAD>hnTbQ@0|Bl+r@zCGChyI9pdMr3zC z0VGWO_gJ`ws9;WpyT))`x>)^c4Zw&xkSPB!3GN1!ynYZE6qw`b+3iR8QQ%1RXD=Z9 zn@BKOyff#3uT3Z8=xGa){QBBI0QZ;R+=-L6m@8m&^#Y;R$#RT6IiyO#{U2a+U-VYm z64r(~^=g~Cqi5mYIh$HIHcIwuoG^=WqtfUv?(~63(R0H4%st<2*R{&^-H?*K+7RP% z$dE4spp27$yaHnNf2lbDUh z^Gm`<9yQ#mAL6QqnB%){muUFcod{mm_VIi5*IwzI{G}cs6DO*?Fs;5R+~F$6DemV( zyrp+2YE-UTm*rDZc~U+kVRY1lYto#TmA|BY6G2 zj(di%*>7W6O2v{5@>T9+V)_p#gk|ghYpU{V{``+F1i@4pyAd*fX21c9TlvB=tj8UQ zxXlPUHnU|v7eNyNc1+zH-;~OoR(+7GOK_WuS56OB-3Y>Z>zwG_l&0XFT917? zcO*-wJ`l3Q_D%$eFT}chd|c@So=^lGetoXG7w9LP!6~A5KbdU4TL#Tg*C*5e>B-3v zP*68Sq?u*!sv4fgh=&U2u1TqE-=|iJdX?1y#t1fUnx0(V)+shPR~5;v{V}S1N@$wf6TH4VlEs zAb^iW)XL!oFPL9y!@M7>mJm~0f=dM5fQQX_GmeT$MjGAzFqD`_n>uBA08zUlKOKOUis6PD$SEjbE3fg*iY@*)+>z?c8CVG&%w zS?!kIzl&dk>4G$1Ow4ziJEBf-N8apOyO<8K znLFF0lIL`>Zg!qSxIFWM;f4FvZ&m%)Xq;w%+lb#Xb$hi6yLv&? zbpwh}XR&QxuPAl!KthUgG=Y!PwHw+1ATn;qAU}w(jnBv zWOtY!n@S@(9bP+|G(JsEMoKu3kh%4}P0T`6xVM*$pC!L=k5S4g)LPfY@+^`ZH`sg* z9-_l1`lY2jg@j+ha9P{u78YMu_+j!LWcy>sfk-4~pFQUK$0i$YBG#z}^|Pm>5&M%i zxm~PMwN~g#MV9}kT=tgjgL{~}DQW39R^bNQ+c1JK);8z|11#PUalBryAG@7jo_r;D z#OA-)g0JJ`AZ|O6B91Dktt=fEhCmkn z0m{q-81JJV*@Q}32hrPBvcwKdr>^%ayvlhw)LUP~40?8X0~y9TFQs9IHo?GiL)bL+ z$En0o!fR#HgJ%u7j-cP)e}L6?Ay+%JAI^{0{{YQyU(UM_wQHPj_x{0HH@2+{o`;u* ze}I!ZgTOY$e*oSpn!vAKFa3430$2~7sSyXSL(vIugF_0Q8ZzbQFuB?uIFP=g#*!?d zyUJ%j8mEs(AGO4>z z%VnA*`_Sn^OSDyc*lK zJL@)fD~U!{CgM`&i)$vMx1aXx%AT!cDNW;I;4MhI+WQ`F+t#hOUIm$=P%U=#y&!=@ zx+mtZ*PbfF&(sTLSS^$qs0<*!XNs$)lazlM6~@Z4?U5SI4ceM(=xFFb3DvRriJboh zUg1Cc9cva6UOkKBl&0Ecf4?r!jsgL~ZpIYIyWQ@{KS?F`(0*oj5cA?qlW?uF5YsB0 ztrY)Zt)mx~o&RzG#=JxN2N3u$cgN8FrX#i$6ttDPbX)_taK{@w6lo@V_e#)_Wm8_2Zk*szn_E=4eLt`bvu8Xv!Pk8Sg7H$C*h|l^htdx6ZfX(2ksYg^oLsw zi+pZ17G8VWxnn4hqEU{Ta(a{BlwIl^;KA_{0FdsWvZ9`Cgvz|af7lZqCl~Xg*j>5W8V?>q0GOT>{oq8 zu!$b&6vimI$S%BMLDnVSb)skl^)SXuo z+%Yf0gzLIFUs`rxaf0|YMzf^I*N{gQT2zA-_OkXnCc|j8LHH8cac<@#ahu9+hF7Vp zrmLnigY25B2-SkS>HYK1@T;6Q7UWEDh^rdPm9|EkFw4FfaXl8T1s1-&?zGS1iK16> z)m&SZ-n^FBZS!!3pcExJic|M`wG|9aZwi`?POk%bV{Dy8KmHZQ&tT)1>0cxOTQ<75r_} z88_|0v!#vrPqgO9D=#x=lC69c=x%5E++ zF<<6pzrYs>&KCF0*caTBV3k!}q@2oG;PZ7`hLr**~NNmf_l-~0s{n#FBtZu$*pb>rF zq^JYqxK7mzYZAk}nD~(c!QVO6EgJOYi?Dasg<*5<{a~!uS$$<{Gw~5uN3F$K<%xT4 zjUM)<4{H=N=J;CUtTzX2Vhr2I!*m8^Uf6cK_oe=yG+*r!TELVic?}21mgTK-Amq7H z>_X|2)O)EC5tf+?Xu3n0*9G)v1F~;w;6maBB*F5zzm`J&95K@K{8`eR+T=wNwx(Q_ zh|;xsz296g`3Lak1x}#vvWxHkz4E@>Uvh8kDEIIur!B{X*Zaxco3sWYWOfxj?^{Me zQFipo!W{RUKArHcPS*LMPj)lmqK;uNQ~b5mv{lH1VY)H6PQLQ+j875y>qi;YNUGxB zOab-2LDw1%HTD^&1j8)?#FXX^1HM2uedLxJq7EGhv2)9wOJNBv3fnN}dX{0T%A4M7 zE7)!ZeVXO5x#OUOEWjfb8HM}E(Mm8(A(%hFrObB~F_s$h0j$aF;HZwTFCsro#E$T@| z`!9{(?DrMasEYDWm$Uoc?+G0+zkmBR0m}$m2G!7r6}h*CMK{lO>i$BOQH;Hf|H0R? zVy+fnk^oKYFI>N`Zx5(wYX>@hu^}USZ)TB+%sor#YTt=jf=Y5ohNkK6+nmOV^*MCr zqlW?!?x2^tqon((03YWnBK02 zQE!hrUt$W1-^Yi{bxauRJgoll!!x%&Zy?#Xp<+0Z~jTdI+LG%-Nn*2m z#Cvp7)dF3HK7qT<;F!%)(VlCm#MUkqoBKYMEfDn})aWi`xnCPew<>vs@E;(v|E3ET zYP*qtI|#M<^7#B_8F&HV*Bu0k{O_Gu*y+jty_0y|0d3vVJymh8y?ujeb^9AiO8c3O zYRCrg9geJ;zzwjL35x~zL1G&~ zbw=~(CJph`cl|9(2m?Kp@OJGj)ydV#9C1}iAy?VGB@fsSRj=KDrE+M=1EU-qI-|Hx`*x5;3@KJKTU zW0Qi4uT8>vp_4tbgn{Kl)W|O&=RNc!LSo)^=%))t0U)WwM!PzGmutwQm_^7PNh(42 zeU0ugwhzqLi0ge5DxW3Z`&A!f}Hbn3a4M z%=b%JJjyV4m+=&WTy{jAe{01py&}W1>VH`0K>RiP6QpLxvOX3QB5jE{pxY$Crg@o@ zC^?;>SIfkII7-H*I%X?MXuuK%s@Nwul%^Jgdhm^81pr%EEW?#-4d}=y?uowXV|mev z1WO$FH<^ehk_+<#k3+G(Hj2lJ;e6HBcK%gTl4j!)7k0GWZf|1FIRG!>-o~Y^05`~0 zD!+kYb(%ylNEQV>NkEp+@Xcsvl5|csP05eDux@|o_&xc_!4boB9WgjQmxn=C#-*{9 zE=0bwM%JwNHsg%DryjsVy$vzcB?-V4J!<6{l-{XoH_}2WjZRDLgiLw)ZnkSjZXH0T zKtb!&xgV|o4cu-#0ISg}SMrza4``0+sWc?v_^gHcZ#pfh($lnp6%{sxj zdmHTII#1k6f(y!hpw8c>uTSG}O9Y%xRmJc6({N$(4)VWjRHb2&#=BnF+QEbBe=7og zbjdeM4e$TTg1evQNBu3!@N?$2HP2FR{G_02qq+XkZD*zF4@!frnySxX<`FNjpF^7t z>py^5-UHguMk99KgVIo3Pn+rmq_L4eUHl+E+3e$4%X$-s2CsmATt4NY91t3>GXIkY zlw%K=JaFB_wA4Xp@!ZxQg_#+yvi3h_9u=siw$e zJ1$7Hu6bH+(Pa#-9Sa`H8ofvpER~wSTwz(}ViDez3fhGK?)1DNs|vU1pE>s($TT)H zr&=@b$7rNI_*jCC3<(yD0ak1n@~}tulH=yIGKuG!Uy|`3o{uo_CM!L%uvocgt8T6l zjNn&?fvg26O-7-*-pik;!(~IsPv?{ahug*dK0%S22!naxzdC`D%Y4LxL8B zI(1MU=debr@2OL+IADb}O(V!b^5~kc#;_(~FC8<4YQ{UXKp~&N~p1lTVwg zLRsh^AEkwQ4fm@2Kn@KM)-cV*3Z$b9$E?A>2WG;Fw~(0T$RBsR?4K@(=uuog-Xn$|j$Zu(Fh&b2{``#ln*bEN2kVJj;!y|e(0Pu36nfg) z3Zd74&4)_U(XupN>4uBMF14K+uT?Y?T`lPhYveWbhC_e#G>gP^qopNrQSynp@-z&G zCj|Q@Vtnuo(MKE;0T{;iUoZ?=q`pRe;Ce$ucUu2|!ts2E-Fj8;Hs8I|_O&!26t_8# zV!e{Jm|I(Wisy%xXy*$^W1Sa9!3)wve_ta}8U$h%l_qW$c*H63<)}aee=tx8{o2Km z->7zL=RrQTx6ZhVYk?q`ln>DR?9nZ#jXMB|yiV+?qYuzq#*d%BVrs*JQJuTQcd(I8 z!lHKjRw!X8&$0ElhmJmw0CPE+$QXyV#huIW7D#H)*ttf&95{0ByC8iZk*ELd{AHFj zJ>g5NKaB=S`Mn_V%Z^PPCP%W>=?$@76LN*bwU#R6U9j?0BUVM4fan`uUjb8=mq`w3*u+ zMX2-4Dj`j+?~agk-!a*oqjlT2h$~Gh?x?>%P*n~o+>eb#aBzVQ#x&8>XPkpVhKOsd zu@8F`tGe^U(sx93e+#fKNKLqY5BP>cyS%^}Xgl)Ap(lQ5tO;uUwL}=5MV6}*R ze;w+kqMCLP!qo*zE?>%u-}6vdp;!X*LRN>QerNowZgle0kpH$?0GFR^UgRQNT$x3? z0C&U~d(oVeoT^AaDBn~;N^Ks6v3fb2zifK5w~E~dV*=>4ykfO9zG0_s_o0;3JdyyC~#v$ zu)(8{xh7I%{df%42mdtw?YY+?jLaWGvm?)U{Z$pyDk7-q2G*4%^AfIoa%Wp(#|hh? zL;eBEtLWEq`cHN*9n${+K)Otn&e>Hq)p1_?QhggvPMrxOq|~XuvF)diAoyvKqBlN`y3hryXHIzj!Qt()`$M17zIxM!F+pFVR$(hxayf^r}`i9*xf%5tM%8s0{ z@me_*y(nGZE8?J>k3;0bsbZrX(bCIxd&k+R|AXI@Oji zBx%^wk%dDE-1Omw^*R4?PAA=fQy*8$rJA zn|AUDyitbC_7@tPkms3(k(1`EusKPY>7Q?3WaG{Ev*igZDiF3bFNME8@In~l_A4)B zit<0BRh9EcBX>R^#%tS5xm(0UqqX>ER+%0B;I12;3AN66@TS#@EzG}fAB3JK4iA6HBzpf3KvtKa*}7l*G~P<6 zFjeCUR$cDTC#UHk&$mm-&Ooj==e8p8s;?w*cRCWPzNBHH`oO_NE)vC{F}z{38|S*c zm^!9I9KC#Mk{)c~E@zMC_?Rh>_^|a#fHSQ3nyhr$d74!6Yrzsnev<_CAvH#*qq^GH zps&Swzujy+`d(vh7r(2oWN0QOTyCzjMn~04d7RA1>D8_Ds5a^*{%i-qQ~aSuLEt6e zeV}8^ALmd}@fJOX?Ukd}zRb!$;NIDF{;>5A__;muyfp3of(1y5o0#iL<}{QtWgXa8pQS zFX5vR5KJeaW`>tH9Sofm*~=bqV_N2#|a~dAz?tdCn%eZq}j=E77b14J?&IiqeeGH=1%1)B3g3Q z4y$9GJsky~TYG|gu_*?!M;ZglH{uC=zYW*)cCfJio|tADqaa@{V&f)sOz!)-> ztvUKskD|6qMcLEkrdaC|?Vwk^k*tGvR&j0jw_(PpwWkf59vSNg{nRFajYZadRha`l zatn`I+Lbdw)E^!-0Lg;v(fN&}&!#FV5O>;m6dY@9A`+rl2?9^+kg51hnYQaPB0Y>r zdC1Ol;i#wFsC8xrpqGP$V|smuwkJjWqv=i0msVjaYAwv8Bb(MX4~h`RGi#=RiQpJo zL>WA)-&rqb_1_&Uu;x~6A(H^&-j~1pu+>vlBy11;P5?)$asxd&2Zo51I`wbY6Ya0I zN1PKzlBcT~{rw8GChum>TQ_)RE0{3Bin%vD+}bUtbhJ|>-=yz3B!p+5T+o)0k4AY5 zQ&YegqNnq0X{cCWSRk08_Cv40gmnd);_GDd6_yA;FdWB-7C7Ki&$JrQu}OcES2w>LTatP zf~hZ-XZSXFG+jlfd8C=pJDaK;tVh3p*!EQ#s&JmsQ0p74TM@K`XwGdF^eGNeo}=dJ z5Xie~=ETdpqV5PfQgX*9mB#fp$n(a9k^|F%5oYRFIiOzw-P^`67ga|Gy~p5hy;h*XTOw3ZBhnL;id9cbe|o)|e4riiA5F+gyKu)m-0|N;vj==DQ?* zzi8{oeae658wt!u&)9I{haqpWRIsA?{fFYhNa=zB*@Y%O*N;^*g)y6C!^DF70AdEW z5CV*(lHhRoZb`4i^`Ws?YVE_k10L++to{cCGI+==U=-nqQD%U?)}Ca}?Fa`zxnHAb zCOjFPzoaG}k1^7G#4v6*Wv$6gMnpAK?B7Ga;7R*I%s`J%`uTqap~mYw@fElBb&xRs|5StOJj>GBm!n*y#~(DEfT5BaGOcO)ylc6rZ5c_1K^ zrJ7L%`NpK|d5N_874^_|xkV5J0%~m}cfZ=uRvEPteUB{HggmBvU)}kH7Sj{X$+gIBC zLNH3p4m0+6rdDN#G76^ua6ZGK#U6fgJn;bwZKm$sNBjX(>vG=Vl&g&~Qa7L#!#1-D z5@wnggY2gksUj`9vUxZ=FNxm5%>?nSZ*=63E6O>0u#}eVOLPiF#TYCLY<69kDdDZo z->lNVangVT&w2#c&TDw!VN6~z!?$-i+z&m##x5!IZ0?TBKRD6oY#R#&W!7 z{%{V5335}BcdF3xeIXdBuGE5YddPL&z;E^>*JGrPnX_$y#i@E#23W#NK@B(JB5!x; zKoYj`J{r#ppMW-}-HiC|unh8tpr5<27P zQgMFTiNu?;s_)rw=KE*iv%6IniwHm;I4*Ne+`pO76}J`0DVr|$DEx?f5TweO4`bjS zt=z1!z*pUyR$*fh7;d0_LA0$6l5IbNCN_nffz~M!ZwqZ7LKks7jORr@G(`Tr5q#r^ zrED_?ire0&u5*mY1)yUl?MrzDK&|saQVHX$ZutjhqG3tWqzoquXj$_89d`S@_H_il z%Cms2bEr6)P8Jc4Z@)Jz9gwO`9L1A$!VejIH&vOo&QXtSl4HqZ;w(gNSivYE5vrBT z@U`)VHMwC~QC<^wk0Sqtf|%*BRUl@J`g2|0RA{NvT3@uLf-j@0^o4&K=WsfIynK_h z=@QlbhK}^pxUIpdE$Uhy8B!Ad-=a>0pNGujX1CwY5i~c25vlTz>AobkHjaXqJ_yc-I!lH$fTIc0um`%D?jsyM^y}S z0l$#>+K+l(0IZezd?fIxDWvqXY($1;>W%Q~)`58kBw?1|YtP(MlQviIoc%zM#%<~S zqsoK5SS;j1gf@U7Qjxh^Gq%XNq5x?hhYa{TU4J30SDlZ%SX3$XjZRuBSGAVq z$Ud5xCim95E~%bWb`l#tYD}K`)W#I7dFJY7Dvn^+VuB~&`)+W*o=eaqUdi6*R&GlV z97~+kmD^jVFzi0Mx4saO#gE2f>4gXGsQw2iBIz6YeeMz{q)JLbLixC%ute3ZQxM{|bEJ=hn6!@c6!&1fxV_(`nP zn?uN046z~jq6@r0_%6{)(y2${r>?PXl6X7 zf(P=eqZM672l#?G>~pF%uQM0zts^7eO*{?HRsbo+gGi3hJuguNh`y4CkN$MJ!F}Wc zByJLfOTb-VkxQy0+=icvpdr!tCX?;veq_`AM9-Ly!%XY@=~A+YyX*JGHi0X=GwRrs ztNo5+lvFPBoq@k!Sg;Q!N5J`4pikfrwTJre!Y>NoFIO4H%6-H{_2NwS-)Bcy6Ibdza%prJF}4C$dB?QJ7-+Wass?;ygai z?LJU&FSPdv1v%O=#S1qCYLuh!`-8A{64AaL0xj?BH8&6CL>4I)6q&DA&XTq=!0L2I z=l)Mq5{as1?k4JyND`6mnNkO4uwjNzx%Y(e8#VL+a{nVoQ)W!HajDGgB^Z-NHAFUT zjc<|_Io%{XKPSSoIOH*GYz1{8w?VXF(L#M+8{;dH`4r`}MXD9oV#(kxy{9F+1UZL+ zfCjgI6dT8efnw4D1KeURs=;7;SPTi#qP?-8P(IW)?xgO->soXf`L9De9bagM{jzuc zAcumQgpnq8lPKFeDW7cH+_I)nOZzD?N70T>$|3XmQ)7JV)%z)3X_vpoVrF38wJf0Z zxf$vUT6vjglU7$mj3PQdCMKUc4SCFA3DQNh02P1hfmI|xU$MUV!sF6;#6y{VN|ntG zzej`jdCh9<@x@N@eUG{F+VXZgAFEm^1FzFMH3{8cuzGvxpl!)EU$gp<`P7QiZwchE zM>Z)MiYL-l0lfYg^=PT?{+uBlP|~q=V#GyTSi(q4i~O4e`mHwB_!pq9@1!YpaIc-j zrpt)@7I`|uiKtS$x!5CA9)=U`{<^#nu!WQp$Hk?%njxCw1au_nJgsVy>uc=H(tR1Y z?!*&*ivGR)(6!Cai9%L7+WPvF0QNv08vo*(CXM)Uk0Nhzg0#42oO3)appR~oz^k$5 zXKxH+PAH5-y`l53SO@(rD~zz>36A55Cc_Gb-8F0K(fS-*Ra+L^vVlM;lqWNU4780+ zz{HL_C*GA>gy)l&RC&rA50^$qTz|*{G<+t(AlkU8kRPhj{+p@{wTG6Jr##+}Ker(| zl`0x9?^)zNkRvr2Ce=f?$LfjE1ih)zKxc+oeRO#IiSh34JgPR-@segKnR8lozZ4%- zGhph`%Eco)8HcB~7o38GLF*qs?%AYVq1NoqNc;FXS=nmezAkHfSPZcI-lBtX3N+-k zdZOU-t*ULM{T3>=BV}EhZ9e_7Zznr{?P)0oV1H~y!kKZB54rCOVmI}B15p@E=e+9` zX)pOTc$mxgoQHINFn*g`e>ZrdR_+(k#uD*7*_Ri!@*F%sE7YynWsIW1`7%Y0ynB_Z ze2=rG0Vnpx6Ls7!q;QrwuS3V)%wi<~Gi-AZ2MSQ{`5HW?5_lb53qxMjK1lSU^%hO5 z=*U0FBmM*Y(r;%#sV}U}Sy!ow^$k(#bG#*?a1=FROL#L=#cBFXpb9&iFt5YJ_)%`A zzn6#uCPYq309DmfE+hv$YC8+~%f#Qcr5t%rGhm^XGZysm8u0$Y(L0kBZiNdfdGJHd z^eT4%?JOsVku<5V^&i>AH=rD_-Q(8PSR32k2&R)a8MxW-`=Os=_6c&HO7v~NiydC< zDt1DBdYVgyo{y^<2h#3g{ZXs`!r$moZ<;eJGhOU&*1( z+CXbG!OsO5grGV|9>S69khG+tZj=gNELYpG(G^t#sMvS&$S~Q>DRNmU!y$2CwNh^U zJ94wR#C;ibUx zZ>`7J2$J1Ta7b?R0W~(FS+YIJskBH=-XAc1mIcnU{=QlnpPt&y`RY^4-Km~=s9+0Y z$KvvR)>c^b(5@?1Vdh?lqBicDF;i>UQ1VD7sEsb)RmQHg<{-SR59fM~>dQojP#a(Q7HdUKR7pfT3r;PQY?fPUmVV zGA7_RP?!7H-}R54Dnoh5dgf{jBm2o)woTkDe4?TxN&MYnuCG%0ALz26A#JPbuhGcp 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%0D5=QVKAY<-Sf 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

    '; -$filters = '
    '; -$table2->colspan[2][0] = 7; -$table2->cellstyle[2][0] = 'padding-left: 10px;'; -$table2->data[2][0] = ui_toggle( +// End Build SQL sentences. +// +// Start Build Search Form. +// +$table = new stdClass(); +$tableFilter = new StdClass(); +$tableFilter->width = '100%'; +$tableFilter->cellspacing = 0; +$tableFilter->cellpadding = 0; +$tableFilter->id = 'main_status_monitor_filter'; +$tableFilter->class = 'filter_table'; +$tableFilter->cellclass['inputs_second_line'][2] = 'flex flex_column wrap'; +// Defined styles. +$tableFilter->style[0] = 'padding-right: 10px'; +$tableFilter->style[1] = 'padding-right: 10px'; +$tableFilter->style[2] = 'padding-right: 10px'; +// Captions for first line. +$tableFilter->data['captions_first_line'][0] = __('Group'); +$tableFilter->data['captions_first_line'][1] = __('Module group'); +$tableFilter->data['captions_first_line'][2] = __('Recursion'); +$tableFilter->data['captions_first_line'][3] = __('Search'); +// Inputs for first line. +$tableFilter->data['inputs_first_line'][0] = html_print_select_groups( + $config['id_user'], + 'AR', + true, + 'ag_group', + $ag_group, + '', + '', + '0', + true, + false, + false, + '', + false, + '', + false, + false, + 'id_grupo', + false, + false, + false, + false, + false, + false, + $not_condition +); +$tableFilter->data['inputs_first_line'][1] = html_print_select( + $rows_select, + 'modulegroup', + $modulegroup, + '', + __($is_none), + -1, + true, + false, + true, + '', + false, + 'width: 100%;' +); +$tableFilter->data['inputs_first_line'][2] = html_print_checkbox_switch( + 'recursion', + 1, + ($recursion === true || $recursion === 'true' || $recursion === '1') ? 'checked' : false, + true +); +$tableFilter->data['inputs_first_line'][3] = html_print_input_text( + 'ag_freestring', + $ag_freestring, + '', + 40, + 30, + true +); +// Captions for second line. +$tableFilter->data['captions_second_line'][0] = __('Monitor status'); +$tableFilter->data['captions_second_line'][1] = __('Module name'); +$tableFilter->data['captions_second_line'][2] = __('Tags'); +// Inputs for second line. +$tableFilter->rowstyle['inputs_second_line'] = 'vertical-align: top;'; +$tableFilter->data['inputs_second_line'][0] = html_print_select( + $fields, + 'status', + $status, + '', + __($is_none), + -1, + true, + false, + true, + '', + false, + 'width: 150px;' +); + +$tableFilter->data['inputs_second_line'][1] = html_print_autocomplete_modules( + 'ag_modulename', + $ag_modulename, + false, + true, + '', + [], + true +); + +$tableFilter->data['inputs_second_line'][2] = $tagsElement; + +// Advanced filter. +$tableAdvancedFilter = new StdClass(); +$tableAdvancedFilter->width = '100%'; +$tableAdvancedFilter->class = 'filters'; +$tableAdvancedFilter->style = []; +// $tableAdvancedFilter->style[0] = 'font-weight: bold;'; +$tableAdvancedFilter->cellclass['fields_advancedField_1'][4] = 'flex flex_column wrap'; +$tableAdvancedFilter->rowstyle['fields_advancedField_1'] = 'vertical-align: top;'; +// $tableAdvancedFilter->style[1] = 'font-weight: bold;'; +$tableAdvancedFilter->data['captions_advancedField_1'][0] = ''.__('Server type').''; +$tableAdvancedFilter->data['captions_advancedField_1'][1] = ''.__('Show monitors...').''; +$tableAdvancedFilter->data['captions_advancedField_1'][2] = ''.__('Min. hours in current status').''; +$tableAdvancedFilter->data['captions_advancedField_1'][3] = ''.__('Data type').''; +$tableAdvancedFilter->data['captions_advancedField_1'][4] = ''.__('Not condition').''; + +$tableAdvancedFilter->data['fields_advancedField_1'][0] = html_print_select($typemodules, 'moduletype', $moduletype, '', __($is_none), '', true, false, true, '', false, 'width: 150px;'); +$tableAdvancedFilter->data['fields_advancedField_1'][1] = html_print_select($monitor_options, 'module_option', $module_option, '', '', '', true, false, true, '', false, 'width: 150px;'); +$tableAdvancedFilter->data['fields_advancedField_1'][2] = html_print_input_text('min_hours_status', $min_hours_val, '', 12, 20, true); +$tableAdvancedFilter->data['fields_advancedField_1'][3] = html_print_select_from_sql($sqlModuleType, 'datatype', '', '', __('All'), 0, true); +$tableAdvancedFilter->data['fields_advancedField_1'][4] = html_print_div( + [ + 'class' => 'w120px mrgn_5px mrgn_lft_0px mrgn_right_0px flex wrap', + 'content' => html_print_input( + [ + 'type' => 'switch', + 'name' => 'not_condition', + 'return' => false, + 'checked' => ($check_not_condition === true || $check_not_condition === 'true' || $check_not_condition === '1') ? 'checked' : false, + 'value' => 'NOT', + 'id' => 'not_condition_switch', + 'onclick' => 'changeNotConditionStatus(this)', + ] + ).ui_print_input_placeholder(__('If you check this option, those elements that do NOT meet any of the requirements will be shown'), true), + ], + true +); +/* + '
    '; + + $a = db_get_all_rows_sql($sql); + + $tableAdvancedFilter->data[1][1] .= ''; + $tableAdvancedFilter->data[1][1] .= '
    '; +*/ +$tableAdvancedFilter->colspan[2][0] = 7; +$tableAdvancedFilter->cellstyle[2][0] = 'padding-left: 10px;'; +$tableAdvancedFilter->data[2][0] = ui_toggle( $div_custom_fields, __('Agent custom fields'), '', @@ -905,14 +921,14 @@ $table2->data[2][0] = ui_toggle( 'white_table_graph' ); -$table->colspan[3][0] = 7; -$table->cellstyle[3][0] = 'padding-left: 10px;padding-bottom: 0px;'; -$table->data[3][0] = ui_toggle( +$tableFilter->colspan[3][0] = 7; +$tableFilter->cellstyle[3][0] = 'padding-left: 10px;padding-bottom: 0px;'; +$tableFilter->data[3][0] = ui_toggle( html_print_table( - $table2, + $tableAdvancedFilter, true ), - __('Advanced options'), + ''.__('Advanced options').'', '', '', true, @@ -922,45 +938,50 @@ $table->data[3][0] = ui_toggle( 'white_table_graph' ); -$table->colspan[4][0] = 2; -$table->cellstyle[4][0] = 'padding-top: 0px;'; -$table->data[4][0] = html_print_button( +// $tableFilter->colspan[4][0] = 2; +$tableFilter->cellstyle[4][0] = 'padding-top: 0px;'; +$tableFilter->data[4][0] = html_print_button( __('Load filter'), 'load-filter', false, '', - 'class="float-left margin-right-2 sub config"', + [ + 'icon' => 'wand', + 'mode' => 'mini secondary', + ], true ); -$table->cellstyle[4][0] .= 'padding-top: 0px;'; -$table->data[4][0] .= html_print_button( + +$tableFilter->data[4][1] = html_print_button( __('Save filter'), 'save-filter', false, '', - 'class="float-left margin-right-2 sub wand"', + [ + 'icon' => 'wand', + 'mode' => 'mini secondary', + ], true ); -$table->colspan[4][2] = 5; -$table->cellstyle[4][2] = 'padding-top: 0px;'; -$table->data[4][2] = html_print_submit_button( - __('Show'), +$tableFilter->colspan[4][2] = 5; +$tableFilter->cellstyle[4][2] = 'padding-top: 0px;'; +$tableFilter->data[4][2] = html_print_submit_button( + __('Filter'), 'uptbutton', false, - 'class="sub search mgn_tp_0 right"', + [ + 'icon' => 'next', + 'mode' => 'mini', + ], true ); -$filters .= html_print_table($table, true); +$filters = ''; +$filters .= html_print_table($tableFilter, true); $filters .= '
    '; - -if (is_metaconsole() === true) { - ui_toggle($filters, __('Show filters'), '', '', false); -} else { - echo $filters; -} +ui_toggle($filters, ''.__('Filters').''); unset($table); // End Build Search Form. @@ -1249,13 +1270,13 @@ switch ($sortField) { // We do not show the modules until the user searches with the filter. if ($autosearch) { - if (! defined('METACONSOLE')) { + if (is_metaconsole() === false) { $result = db_get_all_rows_sql($sql); if ($result === false) { $result = []; } else { - ui_pagination($count, false, $offset, 0, false, 'offset', true); + $tablePagination = ui_pagination($count, false, $offset, 0, true, 'offset', false); } } else { // For each server defined and not disabled. @@ -1272,7 +1293,7 @@ if ($autosearch) { $count_modules = 0; foreach ($servers as $server) { // If connection was good then retrieve all data server. - if (metaconsole_connect($server) == NOERR) { + if (metaconsole_connect($server) === NOERR) { $connection = true; } else { $connection = false; @@ -1280,7 +1301,7 @@ if ($autosearch) { $result_server = db_get_all_rows_sql($sql); - if (!empty($result_server)) { + if (empty($result_server) === false) { // Create HASH login info. $pwd = $server['auth_token']; $auth_serialized = json_decode($pwd, true); @@ -1321,7 +1342,7 @@ if ($autosearch) { } if ($count_modules > $config['block_size']) { - ui_pagination($count_modules, false, $offset); + $tablePagination = ui_pagination($count_modules, false, $offset, 0, true); } // Get number of elements of the pagination. @@ -1329,13 +1350,12 @@ if ($autosearch) { } } -if (($config['dbtype'] == 'oracle') && ($result !== false)) { - for ($i = 0; $i < count($result); $i++) { - unset($result[$i]['rnum']); - } -} - - +// Oracle legacy code. +// if (($config['dbtype'] == 'oracle') && ($result !== false)) { +// for ($i = 0; $i < count($result); $i++) { +// unset($result[$i]['rnum']); +// } +// } // Urls to sort the table. $url_agent_name = 'index.php?sec='.$section.'&sec2=operation/agentes/status_monitor'; $url_type = 'index.php?sec='.$section.'&sec2=operation/agentes/status_monitor'; @@ -1384,12 +1404,13 @@ if (($config['dbtype'] == 'oracle') && ($result !== false)) { $url_timestamp_down .= '&sort_field=timestamp&sort=down'; // Start Build List Result. -if (!empty($result)) { +if (empty($result) === false) { $table = new StdClass(); $table->cellpadding = 0; $table->cellspacing = 0; - $table->width = '100%'; - $table->class = 'info_table'; + $table->styleTable = 'margin: 0 10px; width: -webkit-fill-available; width: -moz-available'; + $table->class = 'info_table tactical_table'; + $table->id = 'monitors_view'; $table->head = []; $table->data = []; $table->size = []; @@ -1405,56 +1426,61 @@ if (!empty($result)) { } if (in_array('agent', $show_fields) || is_metaconsole()) { - $table->head[1] = __('Agent'); + $table->head[1] = ''.__('Agent').''; $table->head[1] .= ui_get_sorting_arrows($url_agent_name.'up', $url_agent_name.'down', $selectAgentNameUp, $selectAgentNameDown); } if (in_array('data_type', $show_fields) || is_metaconsole()) { - $table->head[2] = __('Data Type'); + $table->head[2] = ''.__('Data Type').''; $table->head[2] .= ui_get_sorting_arrows($url_type.'up', $url_type.'down', $selectDataTypeUp, $selectDataTypeDown); - $table->align[2] = 'left'; + $table->headstyle[2] = 'text-align: center'; + $table->align[2] = 'center'; } if (in_array('module_name', $show_fields) || is_metaconsole()) { - $table->head[3] = __('Module name'); + $table->head[3] = ''.__('Module name').''; $table->head[3] .= ui_get_sorting_arrows($url_module_name.'up', $url_module_name.'down', $selectModuleNameUp, $selectModuleNameDown); } if (in_array('server_type', $show_fields) || is_metaconsole()) { - $table->head[4] = __('Server type'); + $table->head[4] = ''.__('Server type').''; $table->head[4] .= ui_get_sorting_arrows($url_server_type.'up', $url_server_type.'down', $selectTypeUp, $selectTypeDown); + $table->headstyle[4] = 'text-align: center'; + $table->align[4] = 'center'; } if (in_array('interval', $show_fields) || is_metaconsole()) { - $table->head[5] = __('Interval'); + $table->head[5] = ''.__('Interval').''; $table->head[5] .= ui_get_sorting_arrows($url_interval.'up', $url_interval.'down', $selectIntervalUp, $selectIntervalDown); $table->align[5] = 'left'; } if (in_array('status', $show_fields) || is_metaconsole()) { - $table->head[6] = __('Status'); + $table->head[6] = ''.__('Status').''; $table->head[6] .= ui_get_sorting_arrows($url_status.'up', $url_status.'down', $selectStatusUp, $selectStatusDown); $table->align[6] = 'left'; } if (in_array('last_status_change', $show_fields)) { - $table->head[7] = __('Last status change'); + $table->head[7] = ''.__('Last status change').''; $table->head[7] .= ui_get_sorting_arrows($url_status.'up', $url_status.'down', $selectStatusUp, $selectStatusDown); - $table->align[7] = 'left'; + $table->headstyle[7] = 'text-align: center'; + $table->align[7] = 'center'; } if (in_array('graph', $show_fields) || is_metaconsole()) { - $table->head[8] = __('Graph'); - $table->align[8] = 'left'; + $table->head[8] = ''.__('Graph').''; + $table->headstyle[8] = 'text-align: center'; + $table->align[8] = 'center'; } if (in_array('warn', $show_fields) || is_metaconsole()) { - $table->head[9] = __('Warn'); + $table->head[9] = ''.__('W/C').''; $table->align[9] = 'left'; } if (in_array('data', $show_fields) || is_metaconsole()) { - $table->head[10] = __('Data'); + $table->head[10] = ''.__('Data').''; $table->align[10] = 'left'; if (is_metaconsole()) { $table->head[10] .= ui_get_sorting_arrows($url_data.'up', $url_data.'down', $selectDataUp, $selectDataDown); @@ -1462,7 +1488,7 @@ if (!empty($result)) { } if (in_array('timestamp', $show_fields) || is_metaconsole()) { - $table->head[11] = __('Timestamp'); + $table->head[11] = ''.__('Timestamp').''; $table->head[11] .= ui_get_sorting_arrows($url_timestamp_up, $url_timestamp_down, $selectTimestampUp, $selectTimestampDown); $table->align[11] = 'left'; } @@ -1476,7 +1502,7 @@ if (!empty($result)) { foreach ($result as $row) { // Avoid unset, null and false value. - if (empty($row['server_name'])) { + if (empty($row['server_name']) === true) { $row['server_name'] = ''; } @@ -1585,71 +1611,42 @@ if (!empty($result)) { } if (in_array('data_type', $show_fields) || is_metaconsole()) { - $data[2] = html_print_image('images/'.modules_show_icon_type($row['module_type']), true, ['class' => 'invert_filter']); + $data[2] = html_print_image('images/'.modules_show_icon_type($row['module_type']), true, ['class' => 'invert_filter main_menu_icon']); $agent_groups = is_metaconsole() ? $row['groups_in_server'] : agents_get_all_groups_agent($row['id_agent'], $row['id_group']); if (check_acl_one_of_groups($config['id_user'], $agent_groups, 'AW')) { $show_edit_icon = true; - if (defined('METACONSOLE')) { + if (is_metaconsole() === true) { if (!can_user_access_node()) { $show_edit_icon = false; } - $url_edit_module = $row['server_url'].'index.php?'.'sec=gagente&'.'sec2=godmode/agentes/configurar_agente&'.'id_agente='.$row['id_agent'].'&'.'tab=module&'.'id_agent_module='.$row['id_agente_modulo'].'&'.'edit_module=1'.'&loginhash=auto&loginhash_data='.$row['hashdata'].'&loginhash_user='.str_rot13($row['user']); + $url_edit_module = $row['server_url'].'index.php?sec=gagente&sec2=godmode/agentes/configurar_agente&id_agente='.$row['id_agent'].'&'.'tab=module&'.'id_agent_module='.$row['id_agente_modulo'].'&'.'edit_module=1'.'&loginhash=auto&loginhash_data='.$row['hashdata'].'&loginhash_user='.str_rot13($row['user']); } else { $url_edit_module = 'index.php?'.'sec=gagente&'.'sec2=godmode/agentes/configurar_agente&'.'id_agente='.$row['id_agent'].'&'.'tab=module&'.'id_agent_module='.$row['id_agente_modulo'].'&'.'edit_module=1'; } - - if ($show_edit_icon) { - $table->cellclass[][2] = 'table_action_buttons'; - $data[2] .= ''.html_print_image( - 'images/config.png', - true, - [ - 'alt' => '0', - 'border' => '', - 'title' => __('Edit'), - ] - ).''; - } } } - if (in_array('module_name', $show_fields) || is_metaconsole()) { - $data[3] = ui_print_truncate_text($row['module_name'], 'module_small', false, true, true); - if ($row['extended_info'] != '') { + if (in_array('module_name', $show_fields) === true || is_metaconsole() === true) { + $data[3] = html_print_anchor( + [ + 'href' => ($url_edit_module ?? '#'), + 'content' => ui_print_truncate_text($row['module_name'], 'module_small', false, true, true), + ], + true + ); + + if (empty($row['extended_info']) === false) { $data[3] .= ui_print_help_tip($row['extended_info'], true, '/images/default_list.png'); } - if ($row['tags'] != '') { + if (empty($row['tags']) === false) { $data[3] .= html_print_image( - '/images/tag_red.png', + '/images/tag@svg.svg', true, [ 'title' => $row['tags'], - 'class' => 'tag_row', - ] - ); - } - } - - if (in_array('server_type', $show_fields) || is_metaconsole()) { - $data[4] = ui_print_servertype_icon((int) $row['id_modulo']); - } - - - if (in_array('module_name', $show_fields) || is_metaconsole()) { - $data[3] = ui_print_truncate_text($row['module_name'], 'module_small', false, true, true); - if ($row['extended_info'] != '') { - $data[3] .= ui_print_help_tip($row['extended_info'], true, '/images/default_list.png'); - } - - if ($row['tags'] != '') { - $data[3] .= html_print_image( - '/images/tag_red.png', - true, - [ - 'title' => $row['tags'], - 'class' => 'tag_row invert_filter', + 'class' => 'inverse_filter main_menu_icon', ] ); } @@ -1660,12 +1657,14 @@ if (!empty($result)) { } - if (in_array('interval', $show_fields) || is_metaconsole()) { - $data[5] = ($row['module_interval'] == 0) ? human_time_description_raw($row['agent_interval']) : human_time_description_raw($row['module_interval']); + if (in_array('interval', $show_fields) === true || is_metaconsole() === true) { + $data[5] = ((int) $row['module_interval'] === 0) ? human_time_description_raw($row['agent_interval']) : human_time_description_raw($row['module_interval']); } if (in_array('status', $show_fields) || is_metaconsole()) { - if ($row['utimestamp'] == 0 && (($row['module_type'] < 21 + hd($row['utimestamp'], true); + hd($row['module_type'], true); + if ($row['utimestamp'] === 0 && (($row['module_type'] < 21 || $row['module_type'] > 23) && $row['module_type'] != 100) ) { $data[6] = ui_print_status_image( @@ -1775,6 +1774,7 @@ if (!empty($result)) { $last_status = modules_get_agentmodule_last_status( $row['id_agente_modulo'] ); + hd('pues por aqui tambien', true); switch ($last_status) { case 0: if (is_numeric($row['datos'])) { @@ -1873,7 +1873,7 @@ if (!empty($result)) { $graph_params['histogram'] = 1; } - if (is_metaconsole() && isset($row['server_id'])) { + if (is_metaconsole() === true && isset($row['server_id']) === true) { // Set the server id. $graph_params['server'] = $row['server_id']; } @@ -1882,21 +1882,28 @@ if (!empty($result)) { $link = 'winopeng_var(\''.$url.'?'.$graph_params_str.'\',\''.$win_handle.'\', 800, 480)'; - $data[8] = get_module_realtime_link_graph($row); + $graphIconsContent = []; + $graphIconsContent[] = get_module_realtime_link_graph($row); if ($tresholds === true || $graph_type === 'boolean') { - $data[8] .= ''.html_print_image( - 'images/histograma.png', - true, + $graphIconsContent[] = html_print_anchor( [ - 'border' => '0', - 'alt' => '', - 'class' => 'invert_filter', - ] - ).''; + 'href' => 'javascript:'.$link, + 'content' => html_print_image( + 'images/event-history.svg', + true, + [ + 'border' => '0', + 'alt' => '', + 'class' => 'invert_filter main_menu_icon', + ] + ), + ], + true + ); } - if (!is_snapshot_data($row['datos'])) { + if (is_snapshot_data($row['datos']) === false) { if ($tresholds === true || $graph_type === 'boolean') { unset($graph_params['histogram']); } @@ -1904,21 +1911,41 @@ if (!empty($result)) { $graph_params_str = http_build_query($graph_params); $link = 'winopeng_var(\''.$url.'?'.$graph_params_str.'\',\''.$win_handle.'\', 800, 480)'; - $data[8] .= ''.html_print_image('images/chart.png', true, ['border' => '0', 'alt' => '', 'class' => 'invert_filter']).''; + $graphIconsContent[] = html_print_anchor( + [ + 'href' => 'javascript:'.$link, + 'content' => html_print_image('images/module-graph.svg', true, ['border' => '0', 'alt' => '', 'class' => 'invert_filter main_menu_icon']), + ], + true + ); } - $data[8] .= ''.html_print_image( - 'images/binary.png', - true, + $graphIconsContent[] = html_print_anchor( [ - 'border' => '0', - 'alt' => '', - 'class' => 'invert_filter', - ] - ).''; + 'href' => 'javascript: show_module_detail_dialog('.$row['id_agente_modulo'].', '.$row['id_agent'].', \''.$row['server_name'].'\', 0, '.SECONDS_1DAY.', \''.$row['module_name'].'\')', + 'content' => html_print_image( + 'images/simple-value.svg', + true, + [ + 'border' => '0', + 'alt' => '', + 'class' => 'invert_filter main_menu_icon', + ] + ), + ], + true + ); - $data[8] .= ''.$row['module_name'].''; + + $data[8] = html_print_div( + [ + 'class' => 'table_action_buttons', + 'content' => implode('', $graphIconsContent), + ], + true + ); } } @@ -2092,9 +2119,9 @@ if (!empty($result)) { html_print_table($table); - if ($count_modules > $config['block_size']) { - ui_pagination($count_modules, false, $offset, 0, false, 'offset', true, 'pagination-bottom'); + hd('patata'); + $tablePagination = ui_pagination($count_modules, false, $offset, 0, true, 'offset', false); } } else { if ($first_interaction) { @@ -2104,6 +2131,13 @@ if (!empty($result)) { } } +html_print_action_buttons( + html_print_div(['style' => 'float:left; height: 55px;'], true), + [ + 'type' => 'form_action', + 'right_content' => $tablePagination, + ] +); // End Build List Result. echo "
    "; From a1bf42c9f9f7d87c3e1ec76cdba8e4e2371c8dc4 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Fri, 17 Feb 2023 14:21:29 +0100 Subject: [PATCH 268/474] Ticket 10470 Agent improvements --- pandora_console/godmode/agentes/configurar_agente.php | 2 +- pandora_console/operation/agentes/estado_generalagente.php | 7 +++++-- pandora_console/operation/agentes/ver_agente.php | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/pandora_console/godmode/agentes/configurar_agente.php b/pandora_console/godmode/agentes/configurar_agente.php index 7023afd98e..27f3b7ea3a 100644 --- a/pandora_console/godmode/agentes/configurar_agente.php +++ b/pandora_console/godmode/agentes/configurar_agente.php @@ -813,7 +813,7 @@ if ($id_agente) { $pure = (int) get_parameter('pure'); if ($pure === 0) { ui_print_standard_header( - agents_get_alias($id_agente), + __('Agent setup view'), 'images/agent.png', false, $helper, diff --git a/pandora_console/operation/agentes/estado_generalagente.php b/pandora_console/operation/agentes/estado_generalagente.php index 50e80fd16c..2bdfc11690 100755 --- a/pandora_console/operation/agentes/estado_generalagente.php +++ b/pandora_console/operation/agentes/estado_generalagente.php @@ -80,7 +80,7 @@ $alive_animation = agents_get_starmap($id_agente, 200, 50); * START: TABLE AGENT BUILD. */ $agentCaptionAddedMessage = []; -$agentCaption = ''.__('Agent status').''; +$agentCaption = ''.ucfirst(agents_get_alias($agent['id_agente'])).''; $in_planned_downtime = (bool) db_get_sql( 'SELECT executed FROM tplanned_downtime INNER JOIN tplanned_downtime_agents @@ -209,7 +209,10 @@ $table_agent_graph .= '';*/ */ $table_status->data['agent_os'][0] = __('OS'); -$table_status->data['agent_os'][1] = (empty($agent['os_version']) === true) ? get_os_name((int) $agent['id_os']) : $agent['os_version']; +$agentOS = []; +$agentOS[] = html_print_div([ 'content' => (empty($agent['os_version']) === true) ? get_os_name((int) $agent['id_os']) : $agent['os_version']], true); +$agentOS[] = html_print_div([ 'style' => 'width: 32px', 'content' => ui_print_os_icon($agent['id_os'], false, true)], true); +$table_status->data['agent_os'][1] = html_print_div(['class' => 'agent_details_agent_data', 'content' => implode('', $agentOS)], true); // $table_agent_os .= (empty($agent['os_version']) === true) ? get_os_name((int) $agent['id_os']) : $agent['os_version'].'

    '; $addresses = agents_get_addresses($id_agente); diff --git a/pandora_console/operation/agentes/ver_agente.php b/pandora_console/operation/agentes/ver_agente.php index b5420643a2..2ba1eff6b2 100644 --- a/pandora_console/operation/agentes/ver_agente.php +++ b/pandora_console/operation/agentes/ver_agente.php @@ -1904,7 +1904,7 @@ switch ($tab) { if ((bool) $config['pure'] === false) { ui_print_standard_header( - agents_get_alias($id_agente), + __('Agent main view'), $icon, false, ($help_header ?? ''), From b0ee4a203abff01ba2dd02a9878eba03c14945b7 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Fri, 17 Feb 2023 14:26:41 +0100 Subject: [PATCH 269/474] Ticket 10470 Agent improvements bis --- pandora_console/operation/agentes/estado_generalagente.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/operation/agentes/estado_generalagente.php b/pandora_console/operation/agentes/estado_generalagente.php index 2bdfc11690..a66fd5063c 100755 --- a/pandora_console/operation/agentes/estado_generalagente.php +++ b/pandora_console/operation/agentes/estado_generalagente.php @@ -211,7 +211,7 @@ $table_agent_graph .= '';*/ $table_status->data['agent_os'][0] = __('OS'); $agentOS = []; $agentOS[] = html_print_div([ 'content' => (empty($agent['os_version']) === true) ? get_os_name((int) $agent['id_os']) : $agent['os_version']], true); -$agentOS[] = html_print_div([ 'style' => 'width: 32px', 'content' => ui_print_os_icon($agent['id_os'], false, true)], true); +$agentOS[] = html_print_div([ 'style' => 'width: 16px;padding-left: 5px', 'content' => ui_print_os_icon($agent['id_os'], false, true, true, false, false, false, ['width' => '16px'])], true); $table_status->data['agent_os'][1] = html_print_div(['class' => 'agent_details_agent_data', 'content' => implode('', $agentOS)], true); // $table_agent_os .= (empty($agent['os_version']) === true) ? get_os_name((int) $agent['id_os']) : $agent['os_version'].'

    '; From 69f08cc027d9d95989125365ce4b43bcd0bb2f5f Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Fri, 17 Feb 2023 14:44:26 +0100 Subject: [PATCH 270/474] Ticket 10460 Improve menu buttons --- pandora_console/include/functions_menu.php | 40 ++++++++++++++++++---- pandora_console/include/styles/pandora.css | 4 +++ 2 files changed, 38 insertions(+), 6 deletions(-) diff --git a/pandora_console/include/functions_menu.php b/pandora_console/include/functions_menu.php index 61940ea1b9..b9774ae800 100644 --- a/pandora_console/include/functions_menu.php +++ b/pandora_console/include/functions_menu.php @@ -875,12 +875,40 @@ if (is_ajax()) {

    '.__('Build').' '.$build_version.'

    '.__('Support expires').' 2023/04/26

    '; if ((bool) check_acl($config['id_user'], 0, 'PM') === true) { - $dialog .= ' -
    - - -
    - '; + $dialogButtons = []; + + $dialogButtons[] = html_print_button( + __('Update manager'), + 'update_manager', + false, + 'location.href=\''.ui_get_full_url('/index.php?sec=gsetup&sec2=godmode/update_manager/update_manager&tab=history', false, false, false).'\'', + [ + 'icon' => 'cog', + 'mode' => 'mini secondary', + ], + true + ); + + $dialogButtons[] = html_print_button( + __('System report'), + 'system_report', + false, + 'location.href=\''.ui_get_full_url('/index.php?sec=gextensions&sec2=tools/diagnostics', false, false, false).'\'', + [ + 'icon' => 'info', + 'mode' => 'mini secondary', + ], + true + ); + + $dialog .= html_print_div( + [ + 'style' => 'flex-direction: row;', + 'class' => 'action-buttons', + 'content' => implode('', $dialogButtons), + ], + true + ); } $dialog .= ' diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 82774a5aa5..e81f4d4c6d 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -10347,6 +10347,10 @@ button div.cog { contain; } +button div.info { + mask: url(../../images/info@svg.svg) no-repeat center / contain; + -webkit-mask: url(../../images/info@svg.svg) no-repeat center / contain; +} button div.signin { mask: url(../../images/signin.svg) no-repeat center / contain; -webkit-mask: url(../../images/signin.svg) no-repeat center / contain; From 8db5ef0789187be300839f98ec92245d2d0839e1 Mon Sep 17 00:00:00 2001 From: artica Date: Sat, 18 Feb 2023 01:01:14 +0100 Subject: [PATCH 271/474] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 5f29343d22..c6285e9055 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.769-230217 +Version: 7.0NG.769-230218 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 07e42a8119..d98a0a0745 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230217" +pandora_version="7.0NG.769-230218" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 33f9b75177..7ecb45a3d7 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1023,7 +1023,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.769'; -use constant AGENT_BUILD => '230217'; +use constant AGENT_BUILD => '230218'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 982080d877..e03f30f3a1 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230217 +%define release 230218 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index bff8999226..c26329c1e8 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230217 +%define release 230218 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 0955293f59..e28c1a7b86 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230217" +PI_BUILD="230218" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 9d180788d6..8dc3194732 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{230217} +{230218} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index b6a69e5783..3737dad91a 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.769 Build 230217") +#define PANDORA_VERSION ("7.0NG.769 Build 230218") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 61bf76a879..1f650a737a 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.769(Build 230217))" + VALUE "ProductVersion", "(7.0NG.769(Build 230218))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 7eaf7524ea..8089e40024 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.769-230217 +Version: 7.0NG.769-230218 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index d6e24860e3..0e36ebcd8f 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230217" +pandora_version="7.0NG.769-230218" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 6b8c7c25fa..3f9824106a 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC230217'; +$build_version = 'PC230218'; $pandora_version = 'v7.0NG.769'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 64d39e5054..b3495001ca 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -131,7 +131,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 81140cd2e6..dfe72969d2 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230217 +%define release 230218 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index e834877aaa..4dd0423865 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230217 +%define release 230218 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index f81e4030b3..3e7a00c99e 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230217" +PI_BUILD="230218" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index ac725d1a10..1dee961de0 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.769 Build 230217"; +my $version = "7.0NG.769 Build 230218"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index ea21a3610f..0c75ecd044 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.769 Build 230217"; +my $version = "7.0NG.769 Build 230218"; # save program name for logging my $progname = basename($0); From 5a56dc01213bafc03cedbc1aeed926f9407cee78 Mon Sep 17 00:00:00 2001 From: artica Date: Sun, 19 Feb 2023 01:02:04 +0100 Subject: [PATCH 272/474] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index c6285e9055..7259a4624f 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.769-230218 +Version: 7.0NG.769-230219 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index d98a0a0745..05a2fdd102 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230218" +pandora_version="7.0NG.769-230219" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 7ecb45a3d7..046ea7a7ea 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1023,7 +1023,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.769'; -use constant AGENT_BUILD => '230218'; +use constant AGENT_BUILD => '230219'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index e03f30f3a1..2efa397c6f 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230218 +%define release 230219 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index c26329c1e8..62f7e0a23c 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230218 +%define release 230219 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index e28c1a7b86..b37e0eedea 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230218" +PI_BUILD="230219" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 8dc3194732..7534dfdf45 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{230218} +{230219} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 3737dad91a..59c0e1f2e2 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.769 Build 230218") +#define PANDORA_VERSION ("7.0NG.769 Build 230219") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 1f650a737a..995a3d436e 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.769(Build 230218))" + VALUE "ProductVersion", "(7.0NG.769(Build 230219))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 8089e40024..7e8b4a29f0 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.769-230218 +Version: 7.0NG.769-230219 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 0e36ebcd8f..d00729681d 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230218" +pandora_version="7.0NG.769-230219" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 3f9824106a..4c14e2dd2b 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC230218'; +$build_version = 'PC230219'; $pandora_version = 'v7.0NG.769'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index b3495001ca..3544aaab85 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -131,7 +131,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index dfe72969d2..88c7d7ba97 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230218 +%define release 230219 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 4dd0423865..964fab20b2 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230218 +%define release 230219 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 3e7a00c99e..5ed07b9a84 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230218" +PI_BUILD="230219" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 1dee961de0..8d2e18337b 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.769 Build 230218"; +my $version = "7.0NG.769 Build 230219"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 0c75ecd044..f2353801cf 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.769 Build 230218"; +my $version = "7.0NG.769 Build 230219"; # save program name for logging my $progname = basename($0); From c24bf70cc2104484702538c38b8b3658c98ec451 Mon Sep 17 00:00:00 2001 From: artica Date: Mon, 20 Feb 2023 01:01:37 +0100 Subject: [PATCH 273/474] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 7259a4624f..bc6b5f0a61 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.769-230219 +Version: 7.0NG.769-230220 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 05a2fdd102..dff687f821 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230219" +pandora_version="7.0NG.769-230220" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 046ea7a7ea..254bcd2bb7 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1023,7 +1023,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.769'; -use constant AGENT_BUILD => '230219'; +use constant AGENT_BUILD => '230220'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 2efa397c6f..e79f2fbb48 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230219 +%define release 230220 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 62f7e0a23c..3807bddd44 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230219 +%define release 230220 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index b37e0eedea..24e9feb2ad 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230219" +PI_BUILD="230220" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index 7534dfdf45..e18d90153f 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{230219} +{230220} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 59c0e1f2e2..354f282757 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.769 Build 230219") +#define PANDORA_VERSION ("7.0NG.769 Build 230220") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 995a3d436e..98564615ba 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.769(Build 230219))" + VALUE "ProductVersion", "(7.0NG.769(Build 230220))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 7e8b4a29f0..34e0cb2453 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.769-230219 +Version: 7.0NG.769-230220 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index d00729681d..654c9a5d97 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230219" +pandora_version="7.0NG.769-230220" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index 4c14e2dd2b..e0058687db 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC230219'; +$build_version = 'PC230220'; $pandora_version = 'v7.0NG.769'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 3544aaab85..9a64b90539 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -131,7 +131,7 @@
    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 88c7d7ba97..6fbeb80a2f 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230219 +%define release 230220 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 964fab20b2..0395fe8616 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230219 +%define release 230220 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 5ed07b9a84..40b85fefa1 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230219" +PI_BUILD="230220" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 8d2e18337b..276c0f4d20 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.769 Build 230219"; +my $version = "7.0NG.769 Build 230220"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index f2353801cf..d50993673a 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.769 Build 230219"; +my $version = "7.0NG.769 Build 230220"; # save program name for logging my $progname = basename($0); From 521f7ad0ce6cf8061f33cf1357585c5d1d506daf Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 20 Feb 2023 08:57:04 +0100 Subject: [PATCH 274/474] Menu go to images correction --- pandora_console/include/class/OrderInterpreter.class.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/class/OrderInterpreter.class.php b/pandora_console/include/class/OrderInterpreter.class.php index dab6c7d4fb..534eb6e45e 100644 --- a/pandora_console/include/class/OrderInterpreter.class.php +++ b/pandora_console/include/class/OrderInterpreter.class.php @@ -294,7 +294,7 @@ class OrderInterpreter extends Wizard [ 'name' => __('Task List'), 'icon' => ui_get_full_url( - 'images/menu/discovery.menu.png' + 'images/menu/discovery.svg' ), 'url' => ui_get_full_url( 'index.php?sec=discovery&sec2=godmode/servers/discovery&wiz=tasklist' @@ -338,7 +338,7 @@ class OrderInterpreter extends Wizard [ 'name' => __('Warp Update'), 'icon' => ui_get_full_url( - 'images/menu/um_messages.svg' + 'images/menu/warp_update.svg' ), 'url' => ui_get_full_url( 'index.php?sec=messages&sec2=godmode/update_manager/update_manager&tab=setup' From 4ee6cf7e2819bf37675cc6d104235593d840ce9d Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Mon, 20 Feb 2023 09:54:48 +0100 Subject: [PATCH 275/474] 9662-Fix login meta --- pandora_console/general/login_page.php | 53 +++--- pandora_console/general/mysqlerr.php | 218 +++++++---------------- pandora_console/images/icono_support.png | Bin 750 -> 254 bytes pandora_console/include/styles/login.css | 33 +++- 4 files changed, 121 insertions(+), 183 deletions(-) diff --git a/pandora_console/general/login_page.php b/pandora_console/general/login_page.php index eb924227d0..bbdd8ba76c 100755 --- a/pandora_console/general/login_page.php +++ b/pandora_console/general/login_page.php @@ -171,11 +171,11 @@ if (isset($config['custom_support_url'])) { echo '
  • '.__('Support').'
  • '; } else { echo '
  • support
  • '; - echo '
  • '.__('Support').'
  • '; + echo '
  • '.__('Support').'
  • '; } } else if (!$custom_conf_enabled) { echo '
  • support
  • '; - echo '
  • '.__('Docs').'
  • '; + echo '
  • '.__('Support').'
  • '; } echo '
    '; @@ -370,17 +370,18 @@ if ($config['enterprise_installed']) { echo ''.__('Forgot your password?'); echo ''; - echo ''; echo '
    '; echo '
    '; } else if (isset($process_error_message) && !empty($process_error_message)) { - echo '
    '; + echo '
    '; echo '
    '; echo '
    '; - echo html_print_image('images/icono_stop.png', true, ['alt' => __('Password reset'), 'border' => 0]); + echo html_print_image('images/icono_stop.png', true, ['alt' => __('Forbidden'), 'border' => 0]); echo '
    '; echo '
    '; echo '
    '; echo '

    '.__('ERROR').'

    '; echo '

    '.$process_error_message.'

    '; + echo '
    '; echo '
    '; + echo '
    '; echo '
    '; - html_print_submit_button('Ok', 'reset_correct_button', false); + html_print_submit_button('Ok', 'reset_correct_button', false, ['class' => 'mini float-right']); echo '
    '; echo '
    '; echo '
    '; @@ -529,8 +533,9 @@ if (isset($correct_reset_pass_process)) { echo '

    '.__('SUCCESS').'

    '; echo '

    '.$correct_reset_pass_process.'

    '; echo '
    '; + echo '
    '; echo '
    '; - html_print_submit_button('Ok', 'final_process_correct_button', false); + html_print_submit_button('Ok', 'final_process_correct_button', false, ['class' => 'mini float-right']); echo '
    '; echo '
    '; echo ''; @@ -557,8 +562,9 @@ if (isset($login_failed)) { echo ''; } + echo '
    '; echo '
    '; - html_print_submit_button('Ok', 'hide-login-error', false, ['class' => ' mini']); + html_print_submit_button('Ok', 'hide-login-error', false, ['class' => ' mini float-right']); echo '
    '; echo ''; echo ''; @@ -581,8 +587,9 @@ if ($login_screen == 'logout') { } echo ''; + echo '
    '; echo '
    '; - html_print_submit_button('Ok', 'hide-login-logout', false, ['class' => ' mini']); + html_print_submit_button('Ok', 'hide-login-logout', false, ['class' => ' mini float-right']); echo '
    '; echo ''; echo ''; @@ -600,8 +607,9 @@ if ($login_screen === 'disabled_access_node') { echo '

    '.__('Centralized user in metaconsole').'

    '; echo '

    '.__('This user does not have access on node, please enable node access on this user from metaconsole.').'

    '; echo ''; + echo '
    '; echo '
    '; - html_print_submit_button('Ok', 'hide-login-logout', false); + html_print_submit_button('Ok', 'hide-login-logout', false, ['class' => 'mini float-right']); echo '
    '; echo ''; echo ''; @@ -708,8 +716,9 @@ if ($login_screen == 'error_authconfig' || $login_screen == 'error_emptyconfig' echo '

    '.$title.'

    '; echo '

    '.$message.''; echo ''; + echo '
    '; echo '

    '; - html_print_submit_button('Ok', 'hide-login-error', false); + html_print_submit_button('Ok', 'hide-login-error', false, ['class' => 'mini float-right']); echo '
    '; echo ''; echo ''; @@ -779,19 +788,23 @@ html_print_div(['id' => 'forced_title_layer', 'class' => 'forced_title_layer', ' resizable: true, draggable: true, modal: true, - height: 220, width: 528, clickOutside: true, overlay: { opacity: 0.5, background: "black" + }, + open: function (event, ui) { + $(".ui-widget-overlay").click(function () { + $('#login_logout').dialog('close'); + }); } }); }); $("#button-hide-login-logout").click (function () { - document.location = ""; - }); + $( "#login_logout" ).dialog( "close" ); + }); }); break; @@ -802,7 +815,6 @@ html_print_div(['id' => 'forced_title_layer', 'class' => 'forced_title_layer', ' resizable: true, draggable: true, modal: true, - height: 220, width: 528, clickOutside: true, overlay: { @@ -826,7 +838,6 @@ html_print_div(['id' => 'forced_title_layer', 'class' => 'forced_title_layer', ' resizable: true, draggable: true, modal: true, - height: 400, width: 700, overlay: { opacity: 0.5, @@ -844,7 +855,6 @@ html_print_div(['id' => 'forced_title_layer', 'class' => 'forced_title_layer', ' resizable: true, draggable: true, modal: true, - height: 220, width: 528, overlay: { opacity: 0.5, @@ -869,7 +879,6 @@ html_print_div(['id' => 'forced_title_layer', 'class' => 'forced_title_layer', ' resizable: true, draggable: true, modal: true, - height: 220, width: 528, clickOutside: true, overlay: { @@ -890,7 +899,6 @@ html_print_div(['id' => 'forced_title_layer', 'class' => 'forced_title_layer', ' resizable: true, draggable: true, modal: true, - height: 220, width: 528, clickOutside: true, overlay: { @@ -910,7 +918,6 @@ html_print_div(['id' => 'forced_title_layer', 'class' => 'forced_title_layer', ' resizable: true, draggable: true, modal: true, - height: 220, width: 528, overlay: { opacity: 0.5, diff --git a/pandora_console/general/mysqlerr.php b/pandora_console/general/mysqlerr.php index fe24117d3a..6368122da3 100644 --- a/pandora_console/general/mysqlerr.php +++ b/pandora_console/general/mysqlerr.php @@ -1,167 +1,77 @@ - - - - - - -
    - -
    - - - - /images/icono_cerrar.png'> -
    - -
    - /images/mysqlerr.png'> -
    - -
    -
    - $value) { - if (preg_match('/._alt/i', $key)) { - $custom_conf_enabled = true; - break; - } +$custom_conf_enabled = false; +foreach ($config as $key => $value) { + if (preg_match('/._alt/i', $key)) { + $custom_conf_enabled = true; + break; } +} - if (!$custom_conf_enabled || isset($config['custom_docs_url_alt'])) { - if (isset($config['custom_docs_url_alt'])) { - $docs_url = $config['custom_docs_url_alt']; - } else { - $docs_url = 'https://pandorafms.com/manual/en/documentation/02_installation/04_configuration'; - } - - echo ' - -
    - '.__('Documentation').' - -
    -
    - '; +if (empty($custom_conf_enabled) === true || isset($config['custom_docs_url_alt']) === true) { + if (isset($config['custom_docs_url_alt']) === true) { + $docs_url = $config['custom_docs_url_alt']; + } else { + $docs_url = 'https://pandorafms.com/manual/en/documentation/02_installation/04_configuration'; } +} + +echo '
    '; + echo '
    '; + echo '
    '; + echo html_print_image('images/mysqlerr.png', true, ['alt' => __('Mysql error'), 'border' => 0]); + echo '
    '; + echo '
    '; + echo '
    '; + echo '

    '.__('Database error').'

    '; + echo '

    '.$message.'

    '; + echo '
    '; + echo '
    '; + echo '
    '; + html_print_submit_button( + __('Documentation'), + 'mysqlerr_button', + false, + ['class' => 'mini float-right'] + ); + echo '
    '; + echo '
    '; + echo '
    '; + echo '
    '; + ?> - ?> - - - -
    - -
    - - - diff --git a/pandora_console/images/icono_support.png b/pandora_console/images/icono_support.png index 6db6d32b528d041ddbad081f2a80fc471eb68b8f..302e245ebcd20025a43c8aa45e132fc093504b6e 100644 GIT binary patch literal 254 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAd3?%E9GuQzs#^NA%Cx&(BWL^R}x&b~Ru0XnR z;@ZXuYnvvnZ=SfmX(EuZ4vHqMYXYK4>zaXrlYp}8?yq}44XA;?B*-tAq2Yg7{nCoX z2lhAC)z(z2pDE`BN~L(ZIEHY{Oio~6R8&o6<46bz5^6A-J4Ixnj+p9F293#_XHuGt zLK~tM`lzzIsY(Rz`qmRr3G< literal 750 zcmVw9Lma1BmaV3%&;kAY_gK5dX*Lll}i8Ac28c08)(XLPi3L8-SEO zKmak21PHnbD5-!mI?xoZhna{=!F=SXB4jNLfP%n)kizr$;~E-YpyWeLki3Uk2@pWE zMbJ8#W5x1WbLj;i0&3WYF zhp3#3X3%-OMG~%J3RadO8;UE7AOj{e{zhnh^&gl#1fgOZi1rdbXOrrs|7hiSKP;K! zGl&sKeH;(v9)!~UAn$<;MDiw4u0k#n9H6cgAg3fufEofTPXA-AvWYYZgzrO3#rw$V zh}1Nc01e~>Xx1ynkK}RPu%!G`+id0pU{@12v~*C5yeaS4blLw5GMtr@gWN=>aB~{-{!?8PoNs zfyo0`7{*N2`8|q~YGgp&Y`%A;pk&70Y3&@ZHh!%8THtR+Hrstm7Gy zVe&AuoeM?|{y-17Lq~Mp$g)7}AojspmJ2(vw914<-Z#GdJ^Q=XtWTzksEWU`aj z+(9LqQIuusshU8=#hjVIsWWAi@}$Bvl{xehEAiYwi>%UMl_wo}Etf{cvll3N Date: Mon, 20 Feb 2023 10:07:10 +0100 Subject: [PATCH 276/474] #10459 activate Apply password policy to admin users default by default --- pandora_console/pandoradb_data.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/pandoradb_data.sql b/pandora_console/pandoradb_data.sql index db55df207d..21fd247902 100644 --- a/pandora_console/pandoradb_data.sql +++ b/pandora_console/pandoradb_data.sql @@ -97,7 +97,7 @@ INSERT INTO `tconfig` (`token`, `value`) VALUES ('first_login', 0), ('mins_fail_pass', 5), ('number_attempts', 5), -('enable_pass_policy_admin', 0), +('enable_pass_policy_admin', 1), ('enable_pass_history', 0), ('compare_pass', 3), ('meta_style', 'meta_pandora'), From bf307adb01a67acf6b056a1195a89cccc7f3b711 Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Mon, 20 Feb 2023 10:47:00 +0100 Subject: [PATCH 277/474] 10483-Fixed csrf token on login after logout --- pandora_console/general/login_page.php | 4 ++++ pandora_console/index.php | 1 + 2 files changed, 5 insertions(+) diff --git a/pandora_console/general/login_page.php b/pandora_console/general/login_page.php index bb9fa19185..cd45f34f48 100755 --- a/pandora_console/general/login_page.php +++ b/pandora_console/general/login_page.php @@ -359,6 +359,10 @@ if ($config['enterprise_installed']) { } // CSRF validation. +if (isset($_SESSION['csrf_code']) === true) { + unset($_SESSION['csrf_code']); +} + html_print_csrf_hidden(); echo ''; diff --git a/pandora_console/index.php b/pandora_console/index.php index 1826dbe789..d7f124575b 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -1049,6 +1049,7 @@ if (isset($_GET['bye'])) { header_remove('Set-Cookie'); setcookie(session_name(), $_COOKIE[session_name()], (time() - 4800), '/'); + generate_csrf_code(); // Process logout. include 'general/logoff.php'; From fd77ee1a14c7e5bca460c6b4eec30ddc59185459 Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Mon, 20 Feb 2023 11:16:07 +0100 Subject: [PATCH 278/474] 9662-Fix double authentication login --- pandora_console/general/login_page.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/general/login_page.php b/pandora_console/general/login_page.php index bbdd8ba76c..9f2f0aabf2 100755 --- a/pandora_console/general/login_page.php +++ b/pandora_console/general/login_page.php @@ -334,7 +334,7 @@ switch ($login_screen) { echo ''; From e95e6acd0c087645e38ec1377c52ecad7e823f6d Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Mon, 20 Feb 2023 11:27:20 +0100 Subject: [PATCH 279/474] 9662-Fix double authentication login --- pandora_console/general/login_page.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/general/login_page.php b/pandora_console/general/login_page.php index 9f2f0aabf2..397c67755f 100755 --- a/pandora_console/general/login_page.php +++ b/pandora_console/general/login_page.php @@ -334,7 +334,7 @@ switch ($login_screen) { echo ''; From 333a93fad2071fb870cfbcd9670387f3c12b4309 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 20 Feb 2023 11:45:59 +0100 Subject: [PATCH 280/474] Added MR --- pandora_console/extras/mr/62.sql | 63 ++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 pandora_console/extras/mr/62.sql diff --git a/pandora_console/extras/mr/62.sql b/pandora_console/extras/mr/62.sql new file mode 100644 index 0000000000..30760cd6b6 --- /dev/null +++ b/pandora_console/extras/mr/62.sql @@ -0,0 +1,63 @@ +START TRANSACTION; + +UPDATE tconfig_os SET `icon_name` = 'linux@svg.svg' WHERE `id_os` = 1; +UPDATE tconfig_os SET `icon_name` = 'solaris@svg.svg' WHERE `id_os` = 2; +UPDATE tconfig_os SET `icon_name` = 'aix@svg.svg' WHERE `id_os` = 3; +UPDATE tconfig_os SET `icon_name` = 'freebsd@svg.svg' WHERE `id_os` = 4; +UPDATE tconfig_os SET `icon_name` = 'HP@svg.svg' WHERE `id_os` = 5; +UPDATE tconfig_os SET `icon_name` = 'cisco@svg.svg' WHERE `id_os` = 7; +UPDATE tconfig_os SET `icon_name` = 'apple@svg.svg' WHERE `id_os` = 8; +UPDATE tconfig_os SET `icon_name` = 'windows@svg.svg' WHERE `id_os` = 9; +UPDATE tconfig_os SET `icon_name` = 'other-OS@svg.svg' WHERE `id_os` = 10; +UPDATE tconfig_os SET `icon_name` = 'network-server@svg.svg' WHERE `id_os` = 11; +UPDATE tconfig_os SET `icon_name` = 'network-server@svg.svg' WHERE `id_os` = 12; +UPDATE tconfig_os SET `icon_name` = 'network-server@svg.svg' WHERE `id_os` = 13; +UPDATE tconfig_os SET `icon_name` = 'embedded@svg.svg' WHERE `id_os` = 14; +UPDATE tconfig_os SET `icon_name` = 'android@svg.svg' WHERE `id_os` = 15; +UPDATE tconfig_os SET `icon_name` = 'vmware@svg.svg' WHERE `id_os` = 16; +UPDATE tconfig_os SET `icon_name` = 'routers@svg.svg' WHERE `id_os` = 17; +UPDATE tconfig_os SET `icon_name` = 'switch@svg.svg' WHERE `id_os` = 18; +UPDATE tconfig_os SET `icon_name` = 'satellite@svg.svg' WHERE `id_os` = 19; +UPDATE tconfig_os SET `icon_name` = 'mainframe@svg.svg' WHERE `id_os` = 20; +UPDATE tconfig_os SET `icon_name` = 'cluster@svg.svg' WHERE `id_os` = 100; + +UPDATE tgrupo SET `icon` = 'servers@groups.svg' WHERE `id_grupo` = 2; +UPDATE tgrupo SET `icon` = 'firewall@groups.svg' WHERE `id_grupo` = 4; +UPDATE tgrupo SET `icon` = 'database@groups.svg' WHERE `id_grupo` = 8; +UPDATE tgrupo SET `icon` = 'network@groups.svg' WHERE `id_grupo` = 9; +UPDATE tgrupo SET `icon` = 'unknown@groups.svg' WHERE `id_grupo` = 10; +UPDATE tgrupo SET `icon` = 'workstation@groups.svg' WHERE `id_grupo` = 11; +UPDATE tgrupo SET `icon` = 'applications@groups.svg' WHERE `id_grupo` = 12; +UPDATE tgrupo SET `icon` = 'web@groups.svg' WHERE `id_grupo` = 13; + +UPDATE `ttipo_modulo` SET `icon` = 'data-server@svg.svg' WHERE `id_tipo` = 1; +UPDATE `ttipo_modulo` SET `icon` = 'generic-boolean@svg.svg' WHERE `id_tipo` = 2; +UPDATE `ttipo_modulo` SET `icon` = 'generic-string@svg.svg' WHERE `id_tipo` = 3; +UPDATE `ttipo_modulo` SET `icon` = 'data-server@svg.svg' WHERE `id_tipo` = 4; +UPDATE `ttipo_modulo` SET `icon` = 'data-server@svg.svg' WHERE `id_tipo` = 5; +UPDATE `ttipo_modulo` SET `icon` = 'ICMP-network-boolean-data@svg.svg' WHERE `id_tipo` = 6; +UPDATE `ttipo_modulo` SET `icon` = 'ICMP-network-latency@svg.svg' WHERE `id_tipo` = 7; +UPDATE `ttipo_modulo` SET `icon` = 'TCP-network-numeric-data@svg.svg' WHERE `id_tipo` = 8; +UPDATE `ttipo_modulo` SET `icon` = 'TCP-network-boolean-data@svg.svg' WHERE `id_tipo` = 9; +UPDATE `ttipo_modulo` SET `icon` = 'TCP-network-alphanumeric-data@svg.svg' WHERE `id_tipo` = 10; +UPDATE `ttipo_modulo` SET `icon` = 'TCP-network-incremental-data@svg.svg' WHERE `id_tipo` = 11; +UPDATE `ttipo_modulo` SET `icon` = 'SNMP-network-numeric-data@svg.svg' WHERE `id_tipo` = 15; +UPDATE `ttipo_modulo` SET `icon` = 'SNMP-network-incremental-data@svg.svg' WHERE `id_tipo` = 16; +UPDATE `ttipo_modulo` SET `icon` = 'SNMP-network-alphanumeric-data@svg.svg' WHERE `id_tipo` = 17; +UPDATE `ttipo_modulo` SET `icon` = 'SNMP-network-incremental-data@svg.svg' WHERE `id_tipo` = 18; +UPDATE `ttipo_modulo` SET `icon` = 'asynchronus-data@svg.svg' WHERE `id_tipo` = 21; +UPDATE `ttipo_modulo` SET `icon` = 'asynchronus-data@svg.svg' WHERE `id_tipo` = 22; +UPDATE `ttipo_modulo` SET `icon` = 'asynchronus-data@svg.svg' WHERE `id_tipo` = 23; +UPDATE `ttipo_modulo` SET `icon` = 'wux@svg.svg' WHERE `id_tipo` = 25; +UPDATE `ttipo_modulo` SET `icon` = 'server-web@svg.svg' WHERE `id_tipo` = 30; +UPDATE `ttipo_modulo` SET `icon` = 'web-analisys-data@svg.svg' WHERE `id_tipo` = 31; +UPDATE `ttipo_modulo` SET `icon` = 'server-web@svg.svg' WHERE `id_tipo` = 32; +UPDATE `ttipo_modulo` SET `icon` = 'server-web@svg.svg' WHERE `id_tipo` = 33; +UPDATE `ttipo_modulo` SET `icon` = 'remote-execution-numeric-data@svg.svg' WHERE `id_tipo` = 34; +UPDATE `ttipo_modulo` SET `icon` = 'remote-execution-boolean-data@svg.svg' WHERE `id_tipo` = 35; +UPDATE `ttipo_modulo` SET `icon` = 'remote-execution-alphanumeric-data@svg.svg' WHERE `id_tipo` = 36; +UPDATE `ttipo_modulo` SET `icon` = 'remote-execution-incremental-data@svg.svg' WHERE `id_tipo` = 37; +UPDATE `ttipo_modulo` SET `icon` = 'server-web@svg.svg' WHERE `id_tipo` = 38; +UPDATE `ttipo_modulo` SET `icon` = 'keepalive@svg.svg' WHERE `id_tipo` = 100; + +COMMIT; From 47c2b620292b50f63a20b56bacbe3e5b50916454 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 20 Feb 2023 11:47:56 +0100 Subject: [PATCH 281/474] Improve login page --- pandora_console/general/login_page.php | 13 ------------- pandora_console/include/styles/login.css | 1 - 2 files changed, 14 deletions(-) diff --git a/pandora_console/general/login_page.php b/pandora_console/general/login_page.php index eb924227d0..402dc7293f 100755 --- a/pandora_console/general/login_page.php +++ b/pandora_console/general/login_page.php @@ -309,7 +309,6 @@ switch ($login_screen) { false, true ); - echo '
    '; echo ''; echo ''; - if ($return) { + if ($return === true) { return $output; } else { echo $output; diff --git a/pandora_console/include/javascript/pandora.js b/pandora_console/include/javascript/pandora.js index 49afd629f6..03c7308faf 100644 --- a/pandora_console/include/javascript/pandora.js +++ b/pandora_console/include/javascript/pandora.js @@ -2340,3 +2340,15 @@ function autoclose_info_box(id, autoCloseTime) { close_info_box(id); }, autoCloseTime); } + +function show_hide_password(e, url) { + let inputPass = e.target.previousElementSibling; + + if (inputPass.type === "password") { + inputPass.type = "text"; + inputPass.style.backgroundImage = "url(" + url + "/images/disable.svg)"; + } else { + inputPass.type = "password"; + inputPass.style.backgroundImage = "url(" + url + "/images/enable.svg)"; + } +} diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index e81f4d4c6d..2745ca7f00 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -9908,9 +9908,9 @@ input, textarea, select { background-color: #f6f7fb; - height: 42px; - border: 1px solid #c0ccdc; - border-radius: 8px; + height: 38px; + border: 2px solid #c0ccdc; + border-radius: 6px; padding-left: 12px; font: normal normal normal 14px Pandora-Light; color: #2b3332; @@ -9937,7 +9937,7 @@ select:disabled, input:not([type="image"]):focus, textarea:focus, select:focus { - border: 1px solid #8a96a6; + border: 2px solid #8a96a6; } :focus { @@ -10424,15 +10424,15 @@ button.ui-button.ui-widget.submit-cancel:active { } .moduleIdBox { - height: 40px; - border-top-right-radius: 8px; - border-bottom-right-radius: 8px; + height: 36px; + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; margin-left: -56px; - border: 1px solid #c0ccdc; + border: 2px solid #c0ccdc; background-color: #f6f7fb; padding: 0 16px; z-index: 0; - line-height: 42px; + line-height: 40px; } /* Custom Checkbox Style */ @@ -10567,14 +10567,14 @@ tr.bring_next_field { vertical-align: middle; text-align: left; min-width: 150px !important; - z-index: 10002; + z-index: 60; } .select2-container .select2-selection--single, .select2-container .select2-selection--multiple { background-color: #f6f7fb !important; - border: 1px solid #c0ccdc !important; - border-radius: 8px !important; + border: 2px solid #c0ccdc !important; + border-radius: 6px !important; color: #2b3332 !important; -webkit-box-sizing: border-box !important; -moz-box-sizing: border-box !important; @@ -10584,7 +10584,7 @@ tr.bring_next_field { } .select2-container .select2-selection--single { - height: 42px !important; + height: 38px !important; padding-left: 4px !important; display: block; user-select: none; @@ -10592,7 +10592,7 @@ tr.bring_next_field { } .select2-container .select2-selection--multiple { - height: 42px !important; + height: 38px !important; padding-left: 0px !important; } @@ -10621,7 +10621,7 @@ tr.bring_next_field { border: 0 !important; height: 20px !important; margin-left: -8px !important; - margin-top: 10px !important; + margin-top: 8px !important; position: absolute !important; width: 20px !important; background: url(../../images/dropdown-down.svg) no-repeat content-box !important; @@ -10642,7 +10642,7 @@ tr.bring_next_field { text-overflow: ellipsis; white-space: nowrap; color: #444 !important; - line-height: 42px !important; + line-height: 36px !important; } .select2-container--default.select2-container--open.select2-container--below @@ -10808,7 +10808,7 @@ tr.bring_next_field { position: absolute; left: 0; top: 0; - height: 58px; + height: 62px; border: 1px solid #e5e9ed; background-color: #fff; /*z-index: 10000;*/ @@ -11214,3 +11214,22 @@ form#satellite_conf_edit > fieldset.full-column { .inputs_date_details > input { margin: 5px; } + +.show-hide-pass { + position: relative; + right: 38px; + top: 0px; + border: 0; + outline: none; + margin: 0; + height: 40px; + width: 40px; + cursor: pointer; +} + +.show-hide-pass-background { + background-position: center right 15px; + background-repeat: no-repeat; + background-size: 24px; + background-image: url("../../images/enable.svg"); +} From da58e4b9e0e123eca323b6ee1594e7757f763889 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 20 Feb 2023 13:02:24 +0100 Subject: [PATCH 283/474] Ticket 10484 Fixed List Operating Systems --- pandora_console/extras/mr/62.sql | 40 +++---- pandora_console/godmode/setup/os.builder.php | 100 ++++++++++++------ pandora_console/godmode/setup/os.list.php | 25 +++-- pandora_console/godmode/setup/os.php | 16 +-- .../images/{HP@svg.svg => HP@os.svg} | 0 .../images/{aix@svg.svg => aix@os.svg} | 0 .../{android@svg.svg => android@os.svg} | 0 .../images/{apple@svg.svg => apple@os.svg} | 0 .../images/{cisco@svg.svg => cisco@os.svg} | 0 .../{cluster@svg.svg => cluster@os.svg} | 0 .../{embedded@svg.svg => embedded@os.svg} | 0 pandora_console/images/example_qr.png | Bin 0 -> 2275 bytes .../{freebsd@svg.svg => freebsd@os.svg} | 0 .../images/{linux@svg.svg => linux@os.svg} | 0 .../{mainframe@svg.svg => mainframe@os.svg} | 0 ...k-server@svg.svg => network-server@os.svg} | 0 .../{other-OS@svg.svg => other-OS@os.svg} | 0 .../{routers@svg.svg => routers@os.svg} | 0 .../{satellite@svg.svg => satellite@os.svg} | 0 .../{solaris@svg.svg => solaris@os.svg} | 0 .../images/{switch@svg.svg => switch@os.svg} | 0 .../images/{vmware@svg.svg => vmware@os.svg} | 0 .../{windows@svg.svg => windows@os.svg} | 0 .../include/styles/agent_manager.css | 2 + .../operation/agentes/estado_agente.php | 2 +- pandora_console/pandoradb_data.sql | 40 +++---- 26 files changed, 136 insertions(+), 89 deletions(-) rename pandora_console/images/{HP@svg.svg => HP@os.svg} (100%) rename pandora_console/images/{aix@svg.svg => aix@os.svg} (100%) rename pandora_console/images/{android@svg.svg => android@os.svg} (100%) rename pandora_console/images/{apple@svg.svg => apple@os.svg} (100%) rename pandora_console/images/{cisco@svg.svg => cisco@os.svg} (100%) rename pandora_console/images/{cluster@svg.svg => cluster@os.svg} (100%) rename pandora_console/images/{embedded@svg.svg => embedded@os.svg} (100%) create mode 100644 pandora_console/images/example_qr.png rename pandora_console/images/{freebsd@svg.svg => freebsd@os.svg} (100%) rename pandora_console/images/{linux@svg.svg => linux@os.svg} (100%) rename pandora_console/images/{mainframe@svg.svg => mainframe@os.svg} (100%) rename pandora_console/images/{network-server@svg.svg => network-server@os.svg} (100%) rename pandora_console/images/{other-OS@svg.svg => other-OS@os.svg} (100%) rename pandora_console/images/{routers@svg.svg => routers@os.svg} (100%) rename pandora_console/images/{satellite@svg.svg => satellite@os.svg} (100%) rename pandora_console/images/{solaris@svg.svg => solaris@os.svg} (100%) rename pandora_console/images/{switch@svg.svg => switch@os.svg} (100%) rename pandora_console/images/{vmware@svg.svg => vmware@os.svg} (100%) rename pandora_console/images/{windows@svg.svg => windows@os.svg} (100%) diff --git a/pandora_console/extras/mr/62.sql b/pandora_console/extras/mr/62.sql index 30760cd6b6..4d21f9bb2a 100644 --- a/pandora_console/extras/mr/62.sql +++ b/pandora_console/extras/mr/62.sql @@ -1,25 +1,25 @@ START TRANSACTION; -UPDATE tconfig_os SET `icon_name` = 'linux@svg.svg' WHERE `id_os` = 1; -UPDATE tconfig_os SET `icon_name` = 'solaris@svg.svg' WHERE `id_os` = 2; -UPDATE tconfig_os SET `icon_name` = 'aix@svg.svg' WHERE `id_os` = 3; -UPDATE tconfig_os SET `icon_name` = 'freebsd@svg.svg' WHERE `id_os` = 4; -UPDATE tconfig_os SET `icon_name` = 'HP@svg.svg' WHERE `id_os` = 5; -UPDATE tconfig_os SET `icon_name` = 'cisco@svg.svg' WHERE `id_os` = 7; -UPDATE tconfig_os SET `icon_name` = 'apple@svg.svg' WHERE `id_os` = 8; -UPDATE tconfig_os SET `icon_name` = 'windows@svg.svg' WHERE `id_os` = 9; -UPDATE tconfig_os SET `icon_name` = 'other-OS@svg.svg' WHERE `id_os` = 10; -UPDATE tconfig_os SET `icon_name` = 'network-server@svg.svg' WHERE `id_os` = 11; -UPDATE tconfig_os SET `icon_name` = 'network-server@svg.svg' WHERE `id_os` = 12; -UPDATE tconfig_os SET `icon_name` = 'network-server@svg.svg' WHERE `id_os` = 13; -UPDATE tconfig_os SET `icon_name` = 'embedded@svg.svg' WHERE `id_os` = 14; -UPDATE tconfig_os SET `icon_name` = 'android@svg.svg' WHERE `id_os` = 15; -UPDATE tconfig_os SET `icon_name` = 'vmware@svg.svg' WHERE `id_os` = 16; -UPDATE tconfig_os SET `icon_name` = 'routers@svg.svg' WHERE `id_os` = 17; -UPDATE tconfig_os SET `icon_name` = 'switch@svg.svg' WHERE `id_os` = 18; -UPDATE tconfig_os SET `icon_name` = 'satellite@svg.svg' WHERE `id_os` = 19; -UPDATE tconfig_os SET `icon_name` = 'mainframe@svg.svg' WHERE `id_os` = 20; -UPDATE tconfig_os SET `icon_name` = 'cluster@svg.svg' WHERE `id_os` = 100; +UPDATE tconfig_os SET `icon_name` = 'linux@os.svg' WHERE `id_os` = 1; +UPDATE tconfig_os SET `icon_name` = 'solaris@os.svg' WHERE `id_os` = 2; +UPDATE tconfig_os SET `icon_name` = 'aix@os.svg' WHERE `id_os` = 3; +UPDATE tconfig_os SET `icon_name` = 'freebsd@os.svg' WHERE `id_os` = 4; +UPDATE tconfig_os SET `icon_name` = 'HP@os.svg' WHERE `id_os` = 5; +UPDATE tconfig_os SET `icon_name` = 'cisco@os.svg' WHERE `id_os` = 7; +UPDATE tconfig_os SET `icon_name` = 'apple@os.svg' WHERE `id_os` = 8; +UPDATE tconfig_os SET `icon_name` = 'windows@os.svg' WHERE `id_os` = 9; +UPDATE tconfig_os SET `icon_name` = 'other-OS@os.svg' WHERE `id_os` = 10; +UPDATE tconfig_os SET `icon_name` = 'network-server@os.svg' WHERE `id_os` = 11; +UPDATE tconfig_os SET `icon_name` = 'network-server@os.svg' WHERE `id_os` = 12; +UPDATE tconfig_os SET `icon_name` = 'network-server@os.svg' WHERE `id_os` = 13; +UPDATE tconfig_os SET `icon_name` = 'embedded@os.svg' WHERE `id_os` = 14; +UPDATE tconfig_os SET `icon_name` = 'android@os.svg' WHERE `id_os` = 15; +UPDATE tconfig_os SET `icon_name` = 'vmware@os.svg' WHERE `id_os` = 16; +UPDATE tconfig_os SET `icon_name` = 'routers@os.svg' WHERE `id_os` = 17; +UPDATE tconfig_os SET `icon_name` = 'switch@os.svg' WHERE `id_os` = 18; +UPDATE tconfig_os SET `icon_name` = 'satellite@os.svg' WHERE `id_os` = 19; +UPDATE tconfig_os SET `icon_name` = 'mainframe@os.svg' WHERE `id_os` = 20; +UPDATE tconfig_os SET `icon_name` = 'cluster@os.svg' WHERE `id_os` = 100; UPDATE tgrupo SET `icon` = 'servers@groups.svg' WHERE `id_grupo` = 2; UPDATE tgrupo SET `icon` = 'firewall@groups.svg' WHERE `id_grupo` = 4; diff --git a/pandora_console/godmode/setup/os.builder.php b/pandora_console/godmode/setup/os.builder.php index 83b79e95a4..ac2026d0e6 100644 --- a/pandora_console/godmode/setup/os.builder.php +++ b/pandora_console/godmode/setup/os.builder.php @@ -1,17 +1,32 @@ '; $table = new stdClass(); $table->width = '100%'; $table->class = 'databox filters'; -$table->style[0] = 'font-weight: bolder;'; +$table->style[0] = 'width: 15%'; $table->data[0][0] = __('Name:'); -$table->data[0][1] = html_print_input_text('name', $name, __('Name'), 20, 30, true); +$table->data[0][1] = html_print_input_text('name', $name, __('Name'), 20, 30, true, false, false, '', 'w250px'); $table->data[1][0] = __('Description'); -$table->data[1][1] = html_print_textarea('description', 5, 10, $description, '', true); -$icons = get_list_os_icons_dir(); +$table->data[1][1] = html_print_textarea('description', 5, 20, $description, '', true, 'w250px'); $table->data[2][0] = __('Icon'); -$table->data[2][1] = html_print_select($icons, 'icon', $icon, 'show_icon_OS();', __('None'), 0, true); -$table->data[2][1] .= ' '.ui_print_os_icon($idOS, false, true).''; + +$iconData = []; +$iconData[] = html_print_select( + $icons, + 'icon', + $icon, + 'show_icon_OS();', + __('None'), + 0, + true +); +$iconData[] = html_print_div( + [ + 'id' => 'icon_image', + 'class' => 'inverse_filter main_menu_icon', + 'style' => 'margin-left: 10px', + 'content' => ui_print_os_icon($idOS, false, true), + ], + true +); + +$table->data[2][1] = html_print_div( + [ + 'style' => 'display: flex;align-items: center;', + 'content' => implode('', $iconData), + ], + true +); html_print_table($table); @@ -47,9 +89,11 @@ html_print_table($table); html_print_input_hidden('id_os', $idOS); html_print_input_hidden('action', $actionHidden); -echo '
    '; -html_print_submit_button($textButton, 'update_button', false, $classButton); -echo '
    '; +html_print_action_buttons( + html_print_submit_button($textButton, 'update_button', false, $classButton, true), + ['type' => 'form_action'] +); + echo ''; @@ -59,18 +103,10 @@ function get_list_os_icons_dir() $return = []; - $items = scandir($config['homedir'].'/images/os_icons'); + $items = scandir($config['homedir'].'/images/'); foreach ($items as $item) { - if (strstr($item, '_small.png') || strstr($item, '_small.gif') - || strstr($item, '_small.jpg') - ) { - continue; - } - - if (strstr($item, '.png') || strstr($item, '.gif') - || strstr($item, '.jpg') - ) { + if (strstr($item, '@os.svg')) { $return[$item] = $item; } } @@ -86,7 +122,7 @@ function show_icon_OS() { var params = []; params.push("get_image_path=1"); - params.push('img_src=images/os_icons/' + $("#icon").val()); + params.push('img_src=images/' + $("#icon").val()); params.push("page=include/ajax/skins.ajax"); jQuery.ajax ({ data: params.join ("&"), diff --git a/pandora_console/godmode/setup/os.list.php b/pandora_console/godmode/setup/os.list.php index 48a8b9b534..f8ba6a865a 100644 --- a/pandora_console/godmode/setup/os.list.php +++ b/pandora_console/godmode/setup/os.list.php @@ -1,6 +1,6 @@ width = '100%'; +// $table->width = '100%'; +$table->styleTable = 'margin: 10px 10px 0'; $table->class = 'info_table'; $table->head[0] = ''; @@ -102,7 +103,7 @@ if ($osList === false) { $table->data = []; foreach ($osList as $os) { $data = []; - $data[] = ui_print_os_icon($os['id_os'], false, true); + $data[] = html_print_div(['class' => 'main_menu_icon', 'content' => ui_print_os_icon($os['id_os'], false, true)], true); $data[] = $os['id_os']; if ($is_management_allowed === true) { if (is_metaconsole() === true) { @@ -119,11 +120,20 @@ foreach ($osList as $os) { if ($is_management_allowed === true) { $table->cellclass[][4] = 'table_action_buttons'; if ($os['id_os'] > 16) { - if (is_metaconsole()) { - $data[] = ''.html_print_image('images/cross.png', true).''; + if (is_metaconsole() === true) { + $hrefDelete = 'index.php?sec=advanced&sec2=advanced/component_management&tab=os_manage&action=delete&tab2=list&id_os='.$os['id_os']; } else { - $data[] = ''.html_print_image('images/cross.png', true, ['class' => 'invert_filter']).''; + $hrefDelete = 'index.php?sec=gsetup&sec2=godmode/setup/os&action=delete&tab=list&id_os='.$os['id_os']; } + + $data[] = html_print_anchor( + [ + 'href' => $hrefDelete, + 'class' => 'inverse_filter main_menu_icon', + 'content' => html_print_image('images/delete.svg', true), + ], + true + ); } else { // The original icons of pandora don't delete. $data[] = ''; @@ -134,7 +144,6 @@ foreach ($osList as $os) { } if (isset($data) === true) { - ui_pagination($count_osList, ui_get_url_refresh(['message' => false]), $offset); html_print_table($table); ui_pagination($count_osList, ui_get_url_refresh(['message' => false]), $offset, 0, false, 'offset', true, 'pagination-bottom'); } else { diff --git a/pandora_console/godmode/setup/os.php b/pandora_console/godmode/setup/os.php index dafdfe0730..8ced483492 100644 --- a/pandora_console/godmode/setup/os.php +++ b/pandora_console/godmode/setup/os.php @@ -71,7 +71,7 @@ if ($is_management_allowed === true) { case 'edit': $actionHidden = 'update'; $textButton = __('Update'); - $classButton = 'class="sub upd"'; + $classButton = ['icon' => 'wand']; break; case 'save': @@ -93,7 +93,7 @@ if ($is_management_allowed === true) { $tab = 'builder'; $actionHidden = 'save'; $textButton = __('Create'); - $classButton = 'class="sub next"'; + $classButton = ['icon' => 'wand']; } else { $tab = 'list'; $message = 1; @@ -140,7 +140,7 @@ if ($is_management_allowed === true) { $actionHidden = 'update'; $textButton = __('Update'); - $classButton = 'class="sub upd"'; + $classButton = ['icon' => 'wand']; if (is_metaconsole() === true) { header('Location:'.$config['homeurl'].'index.php?sec=advanced&sec2=advanced/component_management&tab=os_manage&tab2='.$tab.'&message='.$message); } else { @@ -175,7 +175,7 @@ if ($is_management_allowed === true) { case 'new': $actionHidden = 'save'; $textButton = __('Create'); - $classButton = 'class="sub next"'; + $classButton = ['icon' => 'next']; break; } } @@ -184,11 +184,11 @@ $buttons = []; $buttons['list'] = [ 'active' => false, 'text' => ''.html_print_image( - 'images/list.png', + 'images/logs@svg.svg', true, [ 'title' => __('List OS'), - 'class' => 'invert_filter', + 'class' => 'invert_filter main_menu_icon', ] ).'', ]; @@ -196,11 +196,11 @@ if ($is_management_allowed === true) { $buttons['builder'] = [ 'active' => false, 'text' => ''.html_print_image( - 'images/builder.png', + 'images/edit.svg', true, [ 'title' => __('Builder OS'), - 'class' => 'invert_filter', + 'class' => 'invert_filter main_menu_icon', ] ).'', ]; diff --git a/pandora_console/images/HP@svg.svg b/pandora_console/images/HP@os.svg similarity index 100% rename from pandora_console/images/HP@svg.svg rename to pandora_console/images/HP@os.svg diff --git a/pandora_console/images/aix@svg.svg b/pandora_console/images/aix@os.svg similarity index 100% rename from pandora_console/images/aix@svg.svg rename to pandora_console/images/aix@os.svg diff --git a/pandora_console/images/android@svg.svg b/pandora_console/images/android@os.svg similarity index 100% rename from pandora_console/images/android@svg.svg rename to pandora_console/images/android@os.svg diff --git a/pandora_console/images/apple@svg.svg b/pandora_console/images/apple@os.svg similarity index 100% rename from pandora_console/images/apple@svg.svg rename to pandora_console/images/apple@os.svg diff --git a/pandora_console/images/cisco@svg.svg b/pandora_console/images/cisco@os.svg similarity index 100% rename from pandora_console/images/cisco@svg.svg rename to pandora_console/images/cisco@os.svg diff --git a/pandora_console/images/cluster@svg.svg b/pandora_console/images/cluster@os.svg similarity index 100% rename from pandora_console/images/cluster@svg.svg rename to pandora_console/images/cluster@os.svg diff --git a/pandora_console/images/embedded@svg.svg b/pandora_console/images/embedded@os.svg similarity index 100% rename from pandora_console/images/embedded@svg.svg rename to pandora_console/images/embedded@os.svg diff --git a/pandora_console/images/example_qr.png b/pandora_console/images/example_qr.png new file mode 100644 index 0000000000000000000000000000000000000000..e20000cb3c1a752d1acf5dc0c68596eaf7029f6e GIT binary patch literal 2275 zcmV<92pso`P)Px-ok>JNRCr$PooiO(N(_WyPs9Efz@oT^lQ7q`ZS_|bbuxkCZ`%EkN~Mzg;Pua+ zKOZj(|K8u<|IYsQ_IC41+xb2xtLCI@S95m#c6RV_|8&nc8}d5AYXI=_(&gl>Gsigt zfJwAcM27*WrP#P{3_wv^O|4KGU9Tf`Fmv>ca?e(!06M4Qp8%lG=ig?c&RP*L0l*@s zD$_na02JDFY0D8!3c4#NRBLzat9y>mbGsEnb=_$S2mmfnqmeuUGXS_+#En9QZokG> z`BZUGxAQtc6b1l@2mp?a^v|RK*FoE3QAU~JWwmah8e`li-B(wNzN-cZ050x!+t*Jo z0t0|w4gjTuI~(iv?YpSfjlx+<`uhDxr+@%p4ub$-Vxus?JdG%9cUKV@26!R{m~ZuX zgd+5|Gf-u$?29&Z+>(kmm%41?Hk2wm-}P>w%K+}d1Ax87M=%Be;)5!*5kbNk#!99O^BZq?Vp9a9k$H&t50%)m6ky{yEX@FGgIjL#P-}Kxa!j9VRXxwW6 zus2Hpa0{f0Yn6t}*)(B*Ugub?V8sdB?b4h%6Jpc^v=Kx*dUV}tzFDb9*+ZM0Iv2*3b+`8(!6pLiI%QA2G~{su1KTQq{R&z zOU^0DI~V0IsN@ z6zbA7o!^bLj``j6V5b0D4!P_wV+&>DWUNBH6&q2_LH0B&M_n=J1_HhtND-|VfgV)s3MXkdKZZ5xf+N#dx_B^UN0{{_C9f2S& z`FD5#;9BmWQ%3Xrk7t0hn?Wn`ry{)0M5h~pE6!7a!(HzNj2|+^48T?=P;q3H=PSh? z0QgW)z!v}rpKO`AgqF%Ki_O;m`aJ-6KuP$y~ryMgMyYZqrt}Os7PCFbmb`~ zH{H?5?l|l2c5nbtn?C@!+NUFLDXbC(*aLG31Dw4Xq$vGrV=i#c0HDlA8z%}dDP21N zrgI;SQ-t64`qP_10l+Qp;2)V*0IldNsz(BV$=ks$48j06YKNo%4SIG8SX~9sJiLP5 zs0q82zH?T}6tg~qlCr;PfB-=Iw{cZ&4FDz`I9Kqv^cDuVSO7l|LJj89b#7D(EuwuSx+< zD|j?erGC3pf|B28>Zr~${zm)puHJDf3HO|z*IAvw0AQ}J1Awaq!T@_H(56jCWi(?4 z{E;Y^=H0`(z&Sf`^y|LU zB0xV)3UIy>MjH}iJRU6?MK+8{b18IQ|8&bobypz&uN7 zN^0DW#Setg+EoFLV;IG$%Gj!L;~MwtI_I3TZf4h<0lSe$;j`;qo49PMq}p}{a1To6S-kRFznk^#WQ zQllLLfX3Iu!vK@8R;Vxxus0^PiIf7i4}?&fR1~#K(PxM4ssd&y=<9c7Jx80+eH_s@ zy|w}bZUj*cKtVJUR{_A@y$XZUzzYB-Vf5n}praG$*0~hXZtkOOw4$t~j7e#HHjds5 zDyx8sHmEUY8{PgM04Ua~#|8j5yyY7PH~^QD`;r2*lFhXjZL&#a;F$*KBd7mosz615 z>qg4f2t_Y+NGmh(6@7|7d*9!n9>F>ug0DU#g zWdN#9JEB$D;|j-8=AhM_Dwc z*DKNr-HR*ADtmRB_JQr8$wMlv^|+SM)q6P?Ymf?NC)U0RW(U*LkY}9RN&H zOjkW00Nn7HltQO&WzlgRO%DpFoM#xi+QKeq@uy;`pb7vkmb$l?3jjn~2m@RU76zDn zDKsenMAkj&PPuna>t9m8z~+N5@Su(%E_x>;V8s0d5`ZUKap7 zpbQKHT#W8&p}VF4H$ql)0;$0iwOyUBqe)byscL?@Hnqvvl^oBFUk#&x2mtn$Qh*r% z93YLNT`_bR;6MY=C|AbOyhWLVD({i{-0Q}(Qu?Mgx<`dj?d74*1X6HRB_W+7062z0 x0Pui!3aLP(EHY!eFu'.__('Filters').'', 'filter_form' ); diff --git a/pandora_console/pandoradb_data.sql b/pandora_console/pandoradb_data.sql index 7d13eb5379..bde4538077 100644 --- a/pandora_console/pandoradb_data.sql +++ b/pandora_console/pandoradb_data.sql @@ -155,26 +155,26 @@ UNLOCK TABLES; LOCK TABLES `tconfig_os` WRITE; INSERT INTO `tconfig_os` (`id_os`, `name`, `description`, `icon_name`, `previous_name`) VALUES -(1,'Linux','Linux: All versions','linux@svg.svg', ''), -(2,'Solaris','Sun Solaris','solaris@svg.svg', ''), -(3,'AIX','IBM AIX','aix@svg.svg', ''), -(4,'BSD','OpenBSD, FreeBSD and Others','freebsd@svg.svg', ''), -(5,'HP-UX','HP-UX Unix OS','HP@svg.svg', ''), -(7,'Cisco','CISCO IOS','cisco@svg.svg', ''), -(8,'MacOS','MAC OS','apple@svg.svg', ''), -(9,'Windows','Microsoft Windows OS','windows@svg.svg', ''), -(10,'Other','Other SO','other-OS@svg.svg', ''), -(11,'Network','Network Agent','network-server@svg.svg', ''), -(12,'Web Server','Web Server/Application','network-server@svg.svg', ''), -(13,'Sensor','Hardware Agent (Sensor)','network-server@svg.svg', ''), -(14,'Embedded','Embedded device running an agent','embedded@svg.svg', ''), -(15,'Android','Android agent','android@svg.svg', ''), -(16, 'VMware', 'VMware Architecture', 'vmware@svg.svg', ''), -(17, 'Router', 'Generic router', 'routers@svg.svg', ''), -(18, 'Switch', 'Generic switch', 'switch@svg.svg', ''), -(19, 'Satellite', 'Satellite agent', 'satellite@svg.svg', ''), -(20, 'Mainframe', 'Mainframe agent', 'mainframe@svg.svg', ''), -(100, 'Cluster', 'Cluster agent', 'cluster@svg.svg', ''); +(1,'Linux','Linux: All versions','linux@os.svg', ''), +(2,'Solaris','Sun Solaris','solaris@os.svg', ''), +(3,'AIX','IBM AIX','aix@os.svg', ''), +(4,'BSD','OpenBSD, FreeBSD and Others','freebsd@os.svg', ''), +(5,'HP-UX','HP-UX Unix OS','HP@os.svg', ''), +(7,'Cisco','CISCO IOS','cisco@os.svg', ''), +(8,'MacOS','MAC OS','apple@os.svg', ''), +(9,'Windows','Microsoft Windows OS','windows@os.svg', ''), +(10,'Other','Other SO','other-OS@os.svg', ''), +(11,'Network','Network Agent','network-server@os.svg', ''), +(12,'Web Server','Web Server/Application','network-server@os.svg', ''), +(13,'Sensor','Hardware Agent (Sensor)','network-server@os.svg', ''), +(14,'Embedded','Embedded device running an agent','embedded@os.svg', ''), +(15,'Android','Android agent','android@os.svg', ''), +(16, 'VMware', 'VMware Architecture', 'vmware@os.svg', ''), +(17, 'Router', 'Generic router', 'routers@os.svg', ''), +(18, 'Switch', 'Generic switch', 'switch@os.svg', ''), +(19, 'Satellite', 'Satellite agent', 'satellite@os.svg', ''), +(20, 'Mainframe', 'Mainframe agent', 'mainframe@os.svg', ''), +(100, 'Cluster', 'Cluster agent', 'cluster@os.svg', ''); UNLOCK TABLES; From f67bf4d084db8c2af4c343ec2d98af9009a75591 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Mon, 20 Feb 2023 13:10:00 +0100 Subject: [PATCH 284/474] #10416 added name agent in filter event --- pandora_console/operation/events/events.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index 6777ced4c3..7dffeeb9b6 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -239,6 +239,13 @@ $server_id = get_parameter( ($filter['server_id'] ?? '') ); +if (empty($id_agent) === true) { + $id_agent = get_parameter( + 'id_agent', + ($filter['id_agent'] ?? '') + ); +} + if (is_metaconsole() === true) { $servers = metaconsole_get_servers(); if (is_array($servers) === true) { From 4bbf750944b9d5e7960503dcaa9cddf73cdaaba8 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 20 Feb 2023 14:35:32 +0100 Subject: [PATCH 285/474] Monitor view meta fix --- .../operation/agentes/status_monitor.php | 37 +++++++++++++------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/pandora_console/operation/agentes/status_monitor.php b/pandora_console/operation/agentes/status_monitor.php index 839bd50846..cf8c322ee5 100644 --- a/pandora_console/operation/agentes/status_monitor.php +++ b/pandora_console/operation/agentes/status_monitor.php @@ -946,8 +946,9 @@ $tableFilter->data[4][0] = html_print_button( false, '', [ - 'icon' => 'wand', - 'mode' => 'mini secondary', + 'icon' => 'wand', + 'mode' => 'mini secondary', + 'class' => 'float-left margin-right-2 sub config', ], true ); @@ -959,8 +960,9 @@ $tableFilter->data[4][1] = html_print_button( false, '', [ - 'icon' => 'wand', - 'mode' => 'mini secondary', + 'icon' => 'wand', + 'mode' => 'mini secondary', + 'class' => 'float-left margin-right-2 sub wand', ], true ); @@ -1405,6 +1407,16 @@ if ($autosearch) { // Start Build List Result. if (empty($result) === false) { + if (is_metaconsole() === true) { + html_print_action_buttons( + html_print_div(['style' => 'float:left; height: 55px;', 'class' => 'mrgn_top_15px'], true), + [ + 'type' => 'form_action', + 'right_content' => $tablePagination, + ] + ); + } + $table = new StdClass(); $table->cellpadding = 0; $table->cellspacing = 0; @@ -2120,7 +2132,6 @@ if (empty($result) === false) { html_print_table($table); if ($count_modules > $config['block_size']) { - hd('patata'); $tablePagination = ui_pagination($count_modules, false, $offset, 0, true, 'offset', false); } } else { @@ -2131,13 +2142,15 @@ if (empty($result) === false) { } } -html_print_action_buttons( - html_print_div(['style' => 'float:left; height: 55px;'], true), - [ - 'type' => 'form_action', - 'right_content' => $tablePagination, - ] -); +if (is_metaconsole() !== true) { + html_print_action_buttons( + html_print_div(['style' => 'float:left; height: 55px;'], true), + [ + 'type' => 'form_action', + 'right_content' => $tablePagination, + ] + ); +} // End Build List Result. echo "
    "; From 8f212292468760af426adb978db2cfe23ac070b7 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 20 Feb 2023 14:50:17 +0100 Subject: [PATCH 286/474] Ticket 10467 Improve External Tools view --- .../include/class/ExternalTools.class.php | 38 ++++++++++--------- pandora_console/include/styles/pandora.css | 19 +++++++--- pandora_console/index.php | 6 +-- .../operation/agentes/external_tools.php | 2 +- 4 files changed, 38 insertions(+), 27 deletions(-) diff --git a/pandora_console/include/class/ExternalTools.class.php b/pandora_console/include/class/ExternalTools.class.php index 002642c5a9..67345a61f8 100644 --- a/pandora_console/include/class/ExternalTools.class.php +++ b/pandora_console/include/class/ExternalTools.class.php @@ -528,14 +528,16 @@ class ExternalTools extends HTML // Form table. $table = new StdClass(); - $table->class = 'databox filters w100p'; + $table->class = 'fixed_filter_bar'; $table->id = 'externalToolTable'; - + $table->cellstyle['captions'][0] = 'width: 0'; + $table->cellstyle['captions'][1] = 'width: 0'; + $table->cellstyle['captions'][2] = 'width: 0'; $table->data = []; - $table->data[0][0] = __('Operation'); + $table->data['captions'][0] = __('Operation'); - $table->data[0][1] = html_print_select( + $table->data['inputs'][0] = html_print_select( $commandList, 'operation', $this->operation, @@ -545,8 +547,8 @@ class ExternalTools extends HTML true ); - $table->data[0][2] = __('IP Adress'); - $table->data[0][3] = html_print_select( + $table->data['captions'][1] = __('IP Adress'); + $table->data['inputs'][1] = html_print_select( $ipsSelect, 'select_ips', $principal_ip, @@ -556,10 +558,10 @@ class ExternalTools extends HTML true ); - $table->cellclass[0][4] = 'snmpcolumn'; - $table->data[0][4] = __('SNMP Version'); - $table->data[0][4] .= ' '; - $table->data[0][4] .= html_print_select( + $table->cellclass['captions'][2] = 'snmpcolumn'; + $table->cellclass['inputs'][2] = 'snmpcolumn'; + $table->data['captions'][2] = __('SNMP Version'); + $table->data['inputs'][2] = html_print_select( [ '1' => 'v1', '2c' => 'v2c', @@ -572,10 +574,10 @@ class ExternalTools extends HTML true ); - $table->cellclass[0][5] = 'snmpcolumn'; - $table->data[0][5] = __('SNMP Community'); - $table->data[0][5] .= ' '; - $table->data[0][5] .= html_print_input_text( + $table->cellclass['captions'][3] = 'snmpcolumn'; + $table->cellclass['inputs'][3] = 'snmpcolumn'; + $table->data['captions'][3] = __('SNMP Community'); + $table->data['inputs'][3] = html_print_input_text( 'community', $this->community, '', @@ -584,7 +586,7 @@ class ExternalTools extends HTML true ); - $table->data[0][6] = html_print_div( + $table->data['inputs'][4] = html_print_div( [ 'class' => 'action-buttons', 'content' => html_print_submit_button( @@ -719,7 +721,7 @@ class ExternalTools extends HTML try { // If caption is not added, don't show anything. if (empty($caption) === false) { - $output .= sprintf('

    %s

    ', $caption); + $output .= sprintf('

    %s

    ', $caption); } $output .= '
    ';
    @@ -787,7 +789,7 @@ class ExternalTools extends HTML
                         'format'         => '-Oqn',
                     ];
     
    -                echo '

    '.__('SNMP information for ').$ip.'

    '; + echo '

    '.__('SNMP information for ').$ip.'

    '; $snmp_obj['base_oid'] = '.1.3.6.1.2.1.1.3.0'; $result = get_h_snmpwalk($snmp_obj); @@ -849,7 +851,7 @@ class ExternalTools extends HTML html_print_table($table); } else if ((int) $operation === COMMAND_DIGWHOIS) { - echo '

    '.__('Domain and IP information for ').$ip.'

    '; + echo '

    '.__('Domain and IP information for ').$ip.'

    '; // Dig execution. $dig = $this->whereIsTheCommand('dig'); diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 2745ca7f00..9a5bd7af27 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -153,7 +153,7 @@ html { } body { - background-color: #fbfbfb; + background-color: #f6f7fb; margin: 0 auto; display: flex; flex-direction: column; @@ -1080,14 +1080,14 @@ div#page { } body.pure { - background-color: #fbfbfb; + background-color: #f6f7fb; } div#container { margin: 0 auto; min-width: 960px; text-align: left; - background: #fbfbfb; + background: #f6f7fb; width: 100%; } @@ -1096,7 +1096,7 @@ div#main { /* width: 100%; */ /* margin-left: 3em; */ background-color: #f6f7fb; - margin-bottom: 3em; + padding-bottom: 3em; position: relative; /* margin-top: 8.8em; */ flex-direction: column; @@ -10818,18 +10818,23 @@ tr.bring_next_field { left: -95px !important; } +.external_tools_title { + padding: 0 10px; +} pre.external_tools_output { + padding: 0 10px; + /* border: 1px solid #e5e9ed; -moz-box-shadow: 0 3px 6px 0 rgb(0 0 0 / 13%); -webkit-box-shadow: 0 3px 6px 0 rgb(0 0 0 / 13%); box-shadow: 0 3px 6px 0 rgb(0 0 0 / 13%); border-radius: 8px; color: #cacaca; - padding: 10px; background-color: #000; background-image: radial-gradient(rgba(0, 150, 0, 0.75), #000 120%); font-size: 11pt; text-shadow: 0 0 5px #000; + */ } .dialog_table_form td:first-child { @@ -10919,6 +10924,10 @@ table.table_modal_alternate .select2-selection__arrow { top: -4px !important; } +.fixed_filter_bar .select2-selection__arrow b, +.filter_table .select2-selection__arrow b { + margin-top: 11px !important; +} .filter_table .select2-container .select2-selection--single diff --git a/pandora_console/index.php b/pandora_console/index.php index 39956244a9..5bf027ec61 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -1456,10 +1456,10 @@ if (__PAN_XHPROF__ === 1) { } if ($config['pure'] == 0) { - echo '
    '; + // echo '
    '; echo ''; // Main. - echo '
     
    '; + // echo '
     
    '; echo ''; // Page (id = page). } else { @@ -1488,7 +1488,7 @@ if ($config['pure'] == 0) { echo ''; // Container div. echo ''; - echo '
    '; + // echo '
    '; echo ''; } diff --git a/pandora_console/operation/agentes/external_tools.php b/pandora_console/operation/agentes/external_tools.php index 1d57c06f81..eb2fbd835b 100644 --- a/pandora_console/operation/agentes/external_tools.php +++ b/pandora_console/operation/agentes/external_tools.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2021 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 Artica Soluciones Tecnologicas * Please see http://pandorafms.org for full contribution list * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License From 49fc725cdcc7f6e0b6c0ce9d4057d1afdbaeb7aa Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 20 Feb 2023 15:16:27 +0100 Subject: [PATCH 287/474] Cog animations --- pandora_console/include/styles/pandora.css | 13 +++++++++++++ pandora_console/index.php | 7 +++++++ 2 files changed, 20 insertions(+) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 9a5bd7af27..58a8cc6653 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -10361,6 +10361,19 @@ button div.fail { -webkit-mask: url(../../images/fail@svg.svg) no-repeat center / contain; } +button div.cog.rotation { + animation: rotation 4s infinite linear; +} + +@keyframes rotation { + from { + transform: rotate(0deg); + } + + to { + transform: rotate(359deg); + } +} .ui-dialog-buttonset { width: 100%; display: flex; diff --git a/pandora_console/index.php b/pandora_console/index.php index 5bf027ec61..4e69b273bc 100755 --- a/pandora_console/index.php +++ b/pandora_console/index.php @@ -1670,4 +1670,11 @@ require 'include/php_to_js_values.php'; } ); }); + + // Cog animations. + $(document).ready(function() { + $(".submitButton").click(function(){ + $("#"+this.id+" > .subIcon.cog").addClass("rotation"); + }); + }); From fc68e6ead103d39210c0774af70a216bef1f703e Mon Sep 17 00:00:00 2001 From: Jonathan Date: Mon, 20 Feb 2023 15:58:41 +0100 Subject: [PATCH 288/474] Monitor view meta fix status --- .../operation/agentes/status_monitor.php | 41 ++++++++++--------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/pandora_console/operation/agentes/status_monitor.php b/pandora_console/operation/agentes/status_monitor.php index cf8c322ee5..e2db157682 100644 --- a/pandora_console/operation/agentes/status_monitor.php +++ b/pandora_console/operation/agentes/status_monitor.php @@ -1674,25 +1674,24 @@ if (empty($result) === false) { } if (in_array('status', $show_fields) || is_metaconsole()) { - hd($row['utimestamp'], true); - hd($row['module_type'], true); + $data[6] = '
    '; if ($row['utimestamp'] === 0 && (($row['module_type'] < 21 || $row['module_type'] > 23) && $row['module_type'] != 100) ) { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_NO_DATA, __('NOT INIT'), true ); } else if ($row['estado'] == 0) { if (is_numeric($row['datos'])) { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_OK, __('NORMAL').': '.remove_right_zeros(number_format($row['datos'], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])), true ); } else { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_OK, __('NORMAL').': '.htmlspecialchars($row['datos']), true @@ -1700,7 +1699,7 @@ if (empty($result) === false) { } } else if ($row['estado'] == 1) { if (is_numeric($row['datos'])) { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_CRITICAL, __('CRITICAL').': '.remove_right_zeros( number_format( @@ -1713,7 +1712,7 @@ if (empty($result) === false) { true ); } else { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_CRITICAL, __('CRITICAL').': '.htmlspecialchars($row['datos']), true @@ -1721,7 +1720,7 @@ if (empty($result) === false) { } } else if ($row['estado'] == 2) { if (is_numeric($row['datos'])) { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_WARNING, __('WARNING').': '.remove_right_zeros( number_format( @@ -1734,7 +1733,7 @@ if (empty($result) === false) { true ); } else { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_WARNING, __('WARNING').': '.htmlspecialchars($row['datos']), true @@ -1742,7 +1741,7 @@ if (empty($result) === false) { } } else if ($row['estado'] == 3) { if (is_numeric($row['datos'])) { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_UNKNOWN, __('UNKNOWN').': '.remove_right_zeros( number_format( @@ -1755,7 +1754,7 @@ if (empty($result) === false) { true ); } else { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_UNKNOWN, __('UNKNOWN').': '.htmlspecialchars($row['datos']), true @@ -1763,7 +1762,7 @@ if (empty($result) === false) { } } else if ($row['estado'] == 4) { if (is_numeric($row['datos'])) { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_NO_DATA, __('NO DATA').': '.remove_right_zeros( number_format( @@ -1776,7 +1775,7 @@ if (empty($result) === false) { true ); } else { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_NO_DATA, __('NO DATA').': '.htmlspecialchars($row['datos']), true @@ -1786,17 +1785,17 @@ if (empty($result) === false) { $last_status = modules_get_agentmodule_last_status( $row['id_agente_modulo'] ); - hd('pues por aqui tambien', true); + switch ($last_status) { case 0: if (is_numeric($row['datos'])) { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_UNKNOWN, __('UNKNOWN').' - '.__('Last status').' '.__('NORMAL').': '.remove_right_zeros(number_format($row['datos'], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])), true ); } else { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_UNKNOWN, __('UNKNOWN').' - '.__('Last status').' '.__('NORMAL').': '.htmlspecialchars($row['datos']), true @@ -1806,13 +1805,13 @@ if (empty($result) === false) { case 1: if (is_numeric($row['datos'])) { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_UNKNOWN, __('UNKNOWN').' - '.__('Last status').' '.__('CRITICAL').': '.remove_right_zeros(number_format($row['datos'], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])), true ); } else { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_UNKNOWN, __('UNKNOWN').' - '.__('Last status').' '.__('CRITICAL').': '.htmlspecialchars($row['datos']), true @@ -1822,13 +1821,13 @@ if (empty($result) === false) { case 2: if (is_numeric($row['datos'])) { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_UNKNOWN, __('UNKNOWN').' - '.__('Last status').' '.__('WARNING').': '.remove_right_zeros(number_format($row['datos'], $config['graph_precision'], $config['decimal_separator'], $config['thousand_separator'])), true ); } else { - $data[6] = ui_print_status_image( + $data[6] .= ui_print_status_image( STATUS_MODULE_UNKNOWN, __('UNKNOWN').' - '.__('Last status').' '.__('WARNING').': '.htmlspecialchars($row['datos']), true @@ -1837,6 +1836,8 @@ if (empty($result) === false) { break; } } + + $data[6] .= '
    '; } if (in_array('last_status_change', $show_fields) || is_metaconsole()) { From c6e32e278be4447a8f22c953ec796bcbab24bfb4 Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Mon, 20 Feb 2023 16:41:54 +0100 Subject: [PATCH 289/474] #9662 fixed favourites --- pandora_console/general/main_menu.php | 2 +- pandora_console/include/functions_menu.php | 25 ++++++++++++++ pandora_console/include/styles/pandora.css | 2 +- pandora_console/operation/menu.php | 39 ++++++++++++++++------ 4 files changed, 56 insertions(+), 12 deletions(-) diff --git a/pandora_console/general/main_menu.php b/pandora_console/general/main_menu.php index af93f5f0b7..efa2fc5c96 100644 --- a/pandora_console/general/main_menu.php +++ b/pandora_console/general/main_menu.php @@ -444,7 +444,7 @@ echo ''; */ function menu_calculate_top(index, item_height) { const result = index * item_height; - return 140 + result; + return 136 + result; } }); diff --git a/pandora_console/include/functions_menu.php b/pandora_console/include/functions_menu.php index b9774ae800..af3071809d 100644 --- a/pandora_console/include/functions_menu.php +++ b/pandora_console/include/functions_menu.php @@ -79,6 +79,31 @@ function menu_print_menu(&$menu) } else if ($sec2 === 'godmode/events/events') { $section = (string) get_parameter('section'); $sec2 = 'godmode/events/events§ion='.$section; + } else if ($sec2 === 'operation/dashboard/dashboard') { + $id = (int) get_parameter('dashboardId', 0); + if (empty($id) === false) { + $sec2 = 'operation/dashboard/dashboard&dashboardId='.$id; + } + } else if ($sec2 === 'enterprise/operation/services/services') { + $tab = (string) get_parameter('tab', ''); + $action = (string) get_parameter('action', ''); + $id_service = (int) get_parameter('id_service', 0); + if (empty($tab) === false + && empty($action) === false + && empty($id_service) === false + ) { + $sec2 = sprintf( + 'enterprise/operation/services/services&tab=%s&action=%s&id_service=%d', + $tab, + $action, + $id_service + ); + } + } else if ($sec2 === 'operation/visual_console/render_view') { + $id = (int) get_parameter('id', 0); + if (empty($id) === false) { + $sec2 = 'operation/visual_console/render_view&id='.$id; + } } else { $sec2 = (string) get_parameter('sec2'); } diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 58a8cc6653..ec8b02fff0 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -9886,7 +9886,7 @@ div#err_msg_centralised { .inputFile { background-color: #f6f7fb; - height: 28px; + height: 16px; font: normal normal normal 13px Pandora-Light; padding: 5.5pt 20pt; cursor: pointer; diff --git a/pandora_console/operation/menu.php b/pandora_console/operation/menu.php index 4531432d6e..b89ca1d8f5 100644 --- a/pandora_console/operation/menu.php +++ b/pandora_console/operation/menu.php @@ -307,14 +307,21 @@ if ($access_console_node === true) { if (check_acl($config['id_user'], 0, 'VR') || check_acl($config['id_user'], 0, 'VW') || check_acl($config['id_user'], 0, 'VM')) { + $url_visual_console = ''; if (!isset($config['vc_favourite_view']) || $config['vc_favourite_view'] == 0) { // Visual console. $sub['godmode/reporting/map_builder']['text'] = __('Visual console'); $sub['godmode/reporting/map_builder']['id'] = 'Visual_console'; + $sub['godmode/reporting/map_builder']['type'] = 'direct'; + $sub['godmode/reporting/map_builder']['subtype'] = 'nolink'; + $url_visual_console = 'godmode/reporting/map_builder'; } else { // Visual console favorite. $sub['godmode/reporting/visual_console_favorite']['text'] = __('Visual console'); $sub['godmode/reporting/visual_console_favorite']['id'] = 'Visual_console'; + $sub['godmode/reporting/visual_console_favorite']['type'] = 'direct'; + $sub['godmode/reporting/visual_console_favorite']['subtype'] = 'nolink'; + $url_visual_console = 'godmode/reporting/visual_console_favorite'; } if ($config['vc_menu_items'] != 0) { @@ -341,6 +348,12 @@ if ($access_console_node === true) { $layouts = visual_map_get_user_layouts($config['id_user'], false, false, $returnAllGroups, true); $sub2 = []; + $sub2[$url_visual_console] = [ + 'text' => __('Visual console list'), + 'title' => __('Visual console list'), + 'refr' => 0, + ]; + if ($layouts === false) { $layouts = []; } else { @@ -364,15 +377,15 @@ if ($access_console_node === true) { $name = io_safe_output($layout['name']); - $sub2['operation/visual_console/render_view&id='.$layout['id']]['text'] = ui_print_truncate_text($name, MENU_SIZE_TEXT, false, true, false); - $sub2['operation/visual_console/render_view&id='.$layout['id']]['id'] = mb_substr($name, 0, 19); - $sub2['operation/visual_console/render_view&id='.$layout['id']]['title'] = $name; + $sub2['operation/visual_console/render_view&id='.$layout['id']]['text'] = ui_print_truncate_text($name, MENU_SIZE_TEXT, false, true, false); + $sub2['operation/visual_console/render_view&id='.$layout['id']]['id'] = mb_substr($name, 0, 19); + $sub2['operation/visual_console/render_view&id='.$layout['id']]['title'] = $name; if (!empty($config['vc_refr'])) { - $sub2['operation/visual_console/render_view&id='.$layout['id']]['refr'] = $config['vc_refr']; + $sub2['operation/visual_console/render_view&id='.$layout['id']]['refr'] = $config['vc_refr']; } else if (((int) get_parameter('refr', 0)) > 0) { - $sub2['operation/visual_console/render_view&id='.$layout['id']]['refr'] = (int) get_parameter('refr', 0); + $sub2['operation/visual_console/render_view&id='.$layout['id']]['refr'] = (int) get_parameter('refr', 0); } else { - $sub2['operation/visual_console/render_view&id='.$layout['id']]['refr'] = 0; + $sub2['operation/visual_console/render_view&id='.$layout['id']]['refr'] = 0; } } @@ -424,10 +437,10 @@ if ($access_console_node === true) { continue; } - $sub2['operation/gis_maps/render_view&map_id='.$gisMap['id_tgis_map']]['text'] = ui_print_truncate_text(io_safe_output($gisMap['map_name']), MENU_SIZE_TEXT, false, true, false); - $sub2['operation/gis_maps/render_view&map_id='.$gisMap['id_tgis_map']]['id'] = mb_substr(io_safe_output($gisMap['map_name']), 0, 15); - $sub2['operation/gis_maps/render_view&map_id='.$gisMap['id_tgis_map']]['title'] = io_safe_output($gisMap['map_name']); - $sub2['operation/gis_maps/render_view&map_id='.$gisMap['id_tgis_map']]['refr'] = 0; + $sub2['operation/gis_maps/render_view&map_id='.$gisMap['id_tgis_map']]['text'] = ui_print_truncate_text(io_safe_output($gisMap['map_name']), MENU_SIZE_TEXT, false, true, false); + $sub2['operation/gis_maps/render_view&map_id='.$gisMap['id_tgis_map']]['id'] = mb_substr(io_safe_output($gisMap['map_name']), 0, 15); + $sub2['operation/gis_maps/render_view&map_id='.$gisMap['id_tgis_map']]['title'] = io_safe_output($gisMap['map_name']); + $sub2['operation/gis_maps/render_view&map_id='.$gisMap['id_tgis_map']]['refr'] = 0; } $sub['gismaps']['sub2'] = $sub2; @@ -480,10 +493,16 @@ if ($access_console_node === true) { $sub['operation/dashboard/dashboard']['id'] = 'Dashboard'; $sub['operation/dashboard/dashboard']['refr'] = 0; $sub['operation/dashboard/dashboard']['subsecs'] = ['operation/dashboard/dashboard']; + $sub['operation/dashboard/dashboard']['type'] = 'direct'; + $sub['operation/dashboard/dashboard']['subtype'] = 'nolink'; $dashboards = Manager::getDashboards(-1, -1, true); $sub2 = []; + $sub2['operation/dashboard/dashboard'] = [ + 'text' => __('Dashboard list'), + 'title' => __('Dashboard list'), + ]; foreach ($dashboards as $dashboard) { $name = io_safe_output($dashboard['name']); From a615d2d98f490ae1ba6c7686173b6266d9d8a5f8 Mon Sep 17 00:00:00 2001 From: Daniel Maya Date: Mon, 20 Feb 2023 17:08:36 +0100 Subject: [PATCH 290/474] #9662 minor fixed --- pandora_console/general/main_menu.php | 2 +- pandora_console/include/functions_menu.php | 5 +++++ pandora_console/operation/menu.php | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) diff --git a/pandora_console/general/main_menu.php b/pandora_console/general/main_menu.php index efa2fc5c96..72fa391aa7 100644 --- a/pandora_console/general/main_menu.php +++ b/pandora_console/general/main_menu.php @@ -444,7 +444,7 @@ echo ''; */ function menu_calculate_top(index, item_height) { const result = index * item_height; - return 136 + result; + return 133 + result; } }); diff --git a/pandora_console/include/functions_menu.php b/pandora_console/include/functions_menu.php index af3071809d..d0baa614c8 100644 --- a/pandora_console/include/functions_menu.php +++ b/pandora_console/include/functions_menu.php @@ -104,6 +104,11 @@ function menu_print_menu(&$menu) if (empty($id) === false) { $sec2 = 'operation/visual_console/render_view&id='.$id; } + } else if ($sec2 === 'operation/messages/message_edit') { + $new_msg = (int) get_parameter('new_msg', 0); + if (empty($new_msg) === false) { + $sec2 = 'operation/messages/message_edit&new_msg='.$new_msg; + } } else { $sec2 = (string) get_parameter('sec2'); } diff --git a/pandora_console/operation/menu.php b/pandora_console/operation/menu.php index b89ca1d8f5..cb9ce7321a 100644 --- a/pandora_console/operation/menu.php +++ b/pandora_console/operation/menu.php @@ -656,7 +656,7 @@ if ($access_console_node === true) { $sub['message_list']['subtype'] = 'nolink'; $sub2 = []; $sub2['operation/messages/message_list']['text'] = __('Messages List'); - $sub2['operation/messages/message_edit&new_msg=1']['text'] = __('New message'); + $sub2['operation/messages/message_edit&new_msg=1']['text'] = __('New message'); $sub['message_list']['sub2'] = $sub2; } From 91393d7ce530e8a71538965ad79fe1df3bfd96d0 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 20 Feb 2023 17:22:42 +0100 Subject: [PATCH 291/474] Ticket 10431 Header icons added --- pandora_console/general/header.php | 64 ++++++++++-------- pandora_console/images/Header icons v1.zip | Bin 0 -> 38450 bytes .../images/Header icons v1/Auto refresh.png | Bin 0 -> 825 bytes .../Header icons v1/Auto refresh@2x.png | Bin 0 -> 1838 bytes .../images/Header icons v1/Documentation.png | Bin 0 -> 466 bytes .../Header icons v1/Documentation@2x.png | Bin 0 -> 851 bytes .../images/Header icons v1/Edit User.png | Bin 0 -> 826 bytes .../images/Header icons v1/Edit User@2x.png | Bin 0 -> 1795 bytes .../Header discovery error.png | Bin 0 -> 544 bytes .../Header discovery error@2x.png | Bin 0 -> 1019 bytes .../Header icons v1/Header discovery ok.png | Bin 0 -> 558 bytes .../Header discovery ok@2x.png | Bin 0 -> 1022 bytes .../Header discovery warning.png | Bin 0 -> 524 bytes .../Header discovery warning@2x.png | Bin 0 -> 1006 bytes .../images/Header icons v1/Send feedbacks.png | Bin 0 -> 645 bytes .../Header icons v1/Send feedbacks@2x.png | Bin 0 -> 1310 bytes .../images/Header icons v1/Sign out.png | Bin 0 -> 646 bytes .../images/Header icons v1/Sign out@2x.png | Bin 0 -> 1202 bytes .../images/Header icons v1/Support.png | Bin 0 -> 869 bytes .../images/Header icons v1/Support@2x.png | Bin 0 -> 1920 bytes .../images/Header icons v1/Systems error.png | Bin 0 -> 521 bytes .../Header icons v1/Systems error@2x.png | Bin 0 -> 945 bytes .../images/Header icons v1/Systems ok.png | Bin 0 -> 543 bytes .../images/Header icons v1/Systems ok@2x.png | Bin 0 -> 982 bytes .../Header icons v1/Systems warning.png | Bin 0 -> 492 bytes .../Header icons v1/Systems warning@2x.png | Bin 0 -> 918 bytes .../images/auto_refresh@header.svg | 11 +++ .../images/discovery_error@header.svg | 9 +++ .../images/discovery_ok@header.svg | 9 +++ .../images/discovery_warning@header.svg | 9 +++ .../images/documentation@header.svg | 9 +++ pandora_console/images/edit_user@header.svg | 9 +++ .../images/send_feedback@header.svg | 9 +++ pandora_console/images/sign_out@header.svg | 9 +++ pandora_console/images/support@header.svg | 9 +++ .../images/system_error@header.svg | 9 +++ pandora_console/images/system_ok@header.svg | 9 +++ .../images/system_warning@header.svg | 9 +++ pandora_console/include/styles/pandora.css | 19 +++--- 39 files changed, 157 insertions(+), 36 deletions(-) create mode 100644 pandora_console/images/Header icons v1.zip create mode 100644 pandora_console/images/Header icons v1/Auto refresh.png create mode 100644 pandora_console/images/Header icons v1/Auto refresh@2x.png create mode 100644 pandora_console/images/Header icons v1/Documentation.png create mode 100644 pandora_console/images/Header icons v1/Documentation@2x.png create mode 100644 pandora_console/images/Header icons v1/Edit User.png create mode 100644 pandora_console/images/Header icons v1/Edit User@2x.png create mode 100644 pandora_console/images/Header icons v1/Header discovery error.png create mode 100644 pandora_console/images/Header icons v1/Header discovery error@2x.png create mode 100644 pandora_console/images/Header icons v1/Header discovery ok.png create mode 100644 pandora_console/images/Header icons v1/Header discovery ok@2x.png create mode 100644 pandora_console/images/Header icons v1/Header discovery warning.png create mode 100644 pandora_console/images/Header icons v1/Header discovery warning@2x.png create mode 100644 pandora_console/images/Header icons v1/Send feedbacks.png create mode 100644 pandora_console/images/Header icons v1/Send feedbacks@2x.png create mode 100644 pandora_console/images/Header icons v1/Sign out.png create mode 100644 pandora_console/images/Header icons v1/Sign out@2x.png create mode 100644 pandora_console/images/Header icons v1/Support.png create mode 100644 pandora_console/images/Header icons v1/Support@2x.png create mode 100644 pandora_console/images/Header icons v1/Systems error.png create mode 100644 pandora_console/images/Header icons v1/Systems error@2x.png create mode 100644 pandora_console/images/Header icons v1/Systems ok.png create mode 100644 pandora_console/images/Header icons v1/Systems ok@2x.png create mode 100644 pandora_console/images/Header icons v1/Systems warning.png create mode 100644 pandora_console/images/Header icons v1/Systems warning@2x.png create mode 100644 pandora_console/images/auto_refresh@header.svg create mode 100644 pandora_console/images/discovery_error@header.svg create mode 100644 pandora_console/images/discovery_ok@header.svg create mode 100644 pandora_console/images/discovery_warning@header.svg create mode 100644 pandora_console/images/documentation@header.svg create mode 100644 pandora_console/images/edit_user@header.svg create mode 100644 pandora_console/images/send_feedback@header.svg create mode 100644 pandora_console/images/sign_out@header.svg create mode 100644 pandora_console/images/support@header.svg create mode 100644 pandora_console/images/system_error@header.svg create mode 100644 pandora_console/images/system_ok@header.svg create mode 100644 pandora_console/images/system_warning@header.svg diff --git a/pandora_console/general/header.php b/pandora_console/general/header.php index fc666af8b0..d82f1a0be2 100644 --- a/pandora_console/general/header.php +++ b/pandora_console/general/header.php @@ -26,7 +26,7 @@ config_check(); echo sprintf('
    ', $menuTypeClass); ?> -
    +
    ', $menuTypeClass); // ======= Servers List =============================================== if ((bool) check_acl($config['id_user'], 0, 'AW') !== false) { - $servers_list = '
    '; $servers = []; $servers['all'] = (int) db_get_value('COUNT(id_server)', 'tserver'); if ($servers['all'] != 0) { @@ -45,22 +44,33 @@ echo sprintf('
    ', $menuTypeClass); $servers['down'] = ($servers['all'] - $servers['up']); if ($servers['up'] == 0) { // All Servers down or no servers at all. - $servers_check_img = html_print_image('images/header_down_gray.png', true, ['alt' => 'cross', 'class' => 'bot', 'title' => __('All systems').': '.__('Down')]); + $servers_check_img = html_print_image('images/system_error@header.svg', true, ['alt' => 'cross', 'class' => 'main_menu_icon bot', 'title' => __('All systems').': '.__('Down')]); } else if ($servers['down'] != 0) { // Some servers down. - $servers_check_img = html_print_image('images/header_warning_gray.png', true, ['alt' => 'error', 'class' => 'bot', 'title' => $servers['down'].' '.__('servers down')]); + $servers_check_img = html_print_image('images/system_warning@header.svg', true, ['alt' => 'error', 'class' => 'main_menu_icon bot', 'title' => $servers['down'].' '.__('servers down')]); } else { // All servers up. - $servers_check_img = html_print_image('images/header_ready_gray.png', true, ['alt' => 'ok', 'class' => 'bot', 'title' => __('All systems').': '.__('Ready')]); + $servers_check_img = html_print_image('images/system_ok@header.svg', true, ['alt' => 'ok', 'class' => 'main_menu_icon bot', 'title' => __('All systems').': '.__('Ready')]); } unset($servers); // Since this is the header, we don't like to trickle down variables. - $servers_check_img_link = ''; - $servers_check_img_link .= $servers_check_img; - $servers_check_img_link .= ''; + $servers_check_img_link = html_print_anchor( + [ + 'href' => 'index.php?sec=gservers&sec2=godmode/servers/modificar_server&refr=60', + 'content' => $servers_check_img, + ], + true + ); }; - $servers_list .= $servers_check_img_link.'
    '; + + $servers_list = html_print_div( + [ + 'id' => 'servers_list', + 'content' => $servers_check_img_link, + ], + true + ); } @@ -71,9 +81,9 @@ echo sprintf('
    ', $menuTypeClass); $check_minor_release_available = db_check_minor_relase_available(); - if ($check_minor_release_available) { + if ($check_minor_release_available === true) { if (users_is_admin($config['id_user'])) { - if ($config['language'] == 'es') { + if ($config['language'] === 'es') { set_pandora_error_for_header('Hay una o mas revisiones menores en espera para ser actualizadas. '.__('Sobre actualización de revisión menor').'', 'Revisión/es menor/es disponible/s'); } else { set_pandora_error_for_header('There are one or more minor releases waiting for update. '.__('About minor release update').'', 'minor release/s available'); @@ -227,10 +237,10 @@ echo sprintf('
    ', $menuTypeClass); if ($do_refresh) { $autorefresh_img = html_print_image( - 'images/header_refresh_gray.png', + 'images/auto_refresh@header.svg', true, [ - 'class' => 'bot', + 'class' => 'main_menu_icon bot', 'alt' => 'lightning', 'title' => __('Configure autorefresh'), ] @@ -293,10 +303,10 @@ echo sprintf('
    ', $menuTypeClass); $display_counter = 'display:block'; } else { $autorefresh_img = html_print_image( - 'images/header_refresh_disabled_gray.png', + 'images/auto_refresh@header.svg', true, [ - 'class' => 'bot autorefresh_disabled invert_filter', + 'class' => 'main_menu_icon bot autorefresh_disabled invert_filter', 'alt' => 'lightning', 'title' => __('Disabled autorefresh'), ] @@ -312,10 +322,10 @@ echo sprintf('
    ', $menuTypeClass); } } else { $autorefresh_img = html_print_image( - 'images/header_refresh_disabled_gray.png', + 'images/auto_refresh@header.svg', true, [ - 'class' => 'bot autorefresh_disabled invert_filter', + 'class' => 'main_menu_icon bot autorefresh_disabled invert_filter', 'alt' => 'lightning', 'title' => __('Disabled autorefresh'), ] @@ -350,9 +360,10 @@ echo sprintf('
    ', $menuTypeClass); $header_feedback .= ''; $header_feedback .= ''; $header_feedback .= html_print_image( - 'images/feedback-header.png', + 'images/send_feedback@header.svg', true, [ + 'class' => 'main_menu_icon', 'title' => __('Feedback'), 'id' => 'feedback-header', 'alt' => __('Feedback'), @@ -373,11 +384,11 @@ echo sprintf('
    ', $menuTypeClass); $header_support = '
    '; $header_support .= ''; $header_support .= html_print_image( - 'images/header_support.png', + 'images/support@header.svg', true, [ 'title' => __('Go to support'), - 'class' => 'bot invert_filter', + 'class' => 'main_menu_icon bot invert_filter', 'alt' => 'user', ] ); @@ -387,11 +398,11 @@ echo sprintf('
    ', $menuTypeClass); $header_docu = '
    '; $header_docu .= ''; $header_docu .= html_print_image( - 'images/header_docu.png', + 'images/documentation@header.svg', true, [ 'title' => __('Go to documentation'), - 'class' => 'bot invert_filter', + 'class' => 'main_menu_icon bot invert_filter', 'alt' => 'user', ] ); @@ -399,15 +410,14 @@ echo sprintf('
    ', $menuTypeClass); // User. - $headerUserImage = (is_user_admin($config['id_user']) === true) ? 'images/header_user_admin_green.png' : 'images/header_user_green.png'; - + // $headerUserImage = (is_user_admin($config['id_user']) === true) ? 'images/header_user_admin_green.png' : 'images/header_user_green.png'; $headerUser = []; $headerUser[] = html_print_image( - $headerUserImage, + 'images/edit_user@header.svg', true, [ 'title' => __('Edit my user'), - 'class' => 'bot', + 'class' => 'main_menu_icon bot', 'alt' => 'user', ] ); @@ -431,7 +441,7 @@ echo sprintf('
    ', $menuTypeClass); // Logout. $header_logout = '
    '; $header_logout .= html_print_image( - 'images/header_logout_gray.png', + 'images/sign_out@header.svg', true, [ 'alt' => __('Logout'), diff --git a/pandora_console/images/Header icons v1.zip b/pandora_console/images/Header icons v1.zip new file mode 100644 index 0000000000000000000000000000000000000000..22a9a12dfa2c2155b0f7aad869015fb753617c08 GIT binary patch literal 38450 zcmc$_18}9`wk;alHafO#c5K_WZ6_VuwrzE6Tb*=lJ9+7|&%5W`efrefRj=;3EA`h} ze^T|=s>&F1jxpx^Q~>_{MFI$5ixUP}a8Z}57{wSdM^iY{?$@`QINzi@ML;)K4vsAm1t}=g`DKX<*kVLeQQQ?T#&I;>2uTf!n1-+;fJu2>tCLWw2 zY1lyc7L&}^=_W!Un9i2@xvHBFNrVny{H0xWwf277{_lrRw8u~L*JRdJl6 zSa^0QSWDN8lR=o^YcsH?k7*1_QXKj}8b}$Z4_&Gu%SH|3;}@ zqL!{g#Tus{@Mo$jawq<12I{|gZVIYwP%*<;8l_GIPQ!mw`@b*Pz&9Z43Qh_ z5>zW1$_)w%yID}PMW<+3qKfI_FWlKO0FvL24X|_^%#3zLN<;m*l-T5u2L>CCqxP-s zSGABQET%k>UA`=lNDW~u2d>J=!32E2Y;6vt#8fTWd7DUU3L4zElcsnr5omDhFqCY` zn)xueHPs0S_!iYu1do7a2rB)?NKGTTL9Ad+)K?cu)CVHYbSIH(o1WCSoOL?U&&>@V zh8JJ!o>Z-L7oD&VfniB>?t}}i52$q)MbuFKeYY*%iq|KS3S*?0MZ2g3pl$c-s>T;^ zIZ1Gc{8;AqP#^$+KTwwYE6D3X007|sGsqd;XzgtNKQRti4k9yUQ3n9)>jD4($_4sgzah^B{*TXp{-{nXoc#4j5^-SxB{j%FH6AGx0Th$R+Kvc? z!a4r4b9nL}3;~2l=9Se6a8yuGR21jcj0_lwxy0!+*YoQc9RmS=E=p#2gM%_CSRYoGSXU@Y;BD|s%Fg^S0y9CqQn{D;NgiL81RO7{H#4ZUNR??P9I-c z7`M%;`DbQB&<6DG`rM>QucB8==;7huNTt5ZX-SyRp{&_z*8*$ZXi0uU0Q0b~RzoND zz99@9?<3bnCZ0rAmyl0gBZ$Z!RAAslXw~4SHk~xNP0xLKk3H3>V(n>ZdF)fg(P*$~ zdCiu%vXiBPr-(p6ekwH0DH8*p(n+KXBTokygG3b;)6mE#hk2-v4!cFHw@TQPT4rKm zf)@!NDtN0~`}p`^eWEodkC|O+%5Podo|`hTwx$6STt;`0A{fb5XN(*cr{lkxLbA|N z5!MK0KGcFZz}9z`t+m@5S)gquZ?ZXPegeSJL}365F?nIm z^jYK6txrL7F1{(3E?sLVcF(_#fD&{ zUp}oe^Ph=bys~&O(pvbwq~uLRRpyP0IsDNc&i@$rsNKMLJP|n6;8r~>g-t!!c>swE zmD+w?XTGO)Yfah$AdU}3{!;y&lsX>Zsu*4aGPXt?&5VR!GzHWmoAoMt!X3RWLvuiK<6D6?5UP@pS|0F=}f_i3Rr;}o2-q#tf z{Q}mpHG-3Yk+y~FYS`fH^mLDJPV$#Sf6ki5T7vB_m310efZ| z!~NSR*^5j7!aW8_L&-kMI!Jn3Jjx(CE@_chjoiD|8^=!FC{?Mf^=8%N7P0G9DyJzV zHDeWvr}xYBHcFs!E`}u~C2TR#(Ho)BySfoZ6vLbc3IqmH)OqiCCG!k#tr4&uZ)OU46x-IA8Ct~d|D@8q&_83Jp_tP{Tq9xFGHkWesI+r%3Vbs_pb~2f zisu4XN4=d!M$0C#%A&M3d##~7EzDo?hy76S0Km)P5<5Cg+^apIM9%iF8sg7A;>z=TGJPdrb`as+chUsV4p_1@RQ- z%JFbNe%C-xZ|DBb4iaeY8^J{1P;c*3g{&)U?9cd%qtlVz+Pa)q*>6;_wsBa$(hg3? zb3u(9>FJwI8EXO5qxh)@0f3~SQ+K|7gHA=Xiv2A-D>>}Hk&{guO^6myMY!Y>iVM>G zFs0MKWqwAlXr13blq(jkNy;#3{c(=TrDm+GorvZbH$`$?!gPImsg^^InT`GJ<|O>1Tmty4Ko_GycjeR-

    bR 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 DfCpVl literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Auto refresh@2x.png b/pandora_console/images/Header icons v1/Auto refresh@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..73aec57365e65a0ef3c2860aa1aac8a848ad0925 GIT binary patch literal 1838 zcmV+}2hsS6P)pQ1f zwrtstW<;Kt#?MYuSeZijRu$)A+C+sJ@w_0pzP|pU6qRvRN=izGR9?Dtsa=>asWLG! zF;8V@XJ<(YkCkeqqM~AklzP&FrIE zn-Q$#&Lj3CauHP=F=7lVVFbtz!lfhbWT>H|9B^KQ^H+#xak$Td(4SH&+@t1sMoUXe zZ=G;907EioX#ckBHK}IM@Pp%UKG#hrnXj9Z*T9g zfa&@|a+$-{i^(fS5(~30VAiY%fP1D-pMLA^-Mfe52>7kVZ=3XN6b)bVm`?=IlqzA{ zMzO)ydGb*jTuDzZ?+bx(Qb5@OeVITpz86L(DZei(D|>C)fcA;)6v1p%9ynrZlL7=ZJUo1Ycc$zlyer8s zu1jRd$e#!351b9GmAP3P4^FBJ@Td$--nE{?EXlBH)rbPN*|X&pO8}~2;<{rX-*m`} z;u%x4-lGXA9pE|po9A1U=yC|CyGFoNH!dx!f=^>(<199b(zs(d%A70LvvvK2!yG`h zx2+=uTjBwn<1@Hc{W3B#Qo}2=+hEKuQjwBw_rvr?bI4bcsz>PE=e|!4pp4DU%`=CF zhK>Nd$agjwpf-RqR`<(9K;OZaVP8XCC*CT`JA7Lq84|~d`N7txqHv2qNMBfD02K^F2QkFVe|( z%gf8(o65Je1s5tyXsgS>INy%qZz^hF8JSs@LCON9yY8mTup^eRML6M1peGUkA*=R*|CWj>H&97Si8f z-%ExMv-cvWHEy%|qy)`Dr7ja}DK9eo zFHrT*Y~QUY8B$t!Z*%{9rpl?AGGDudNj`0G5`Po07*qoM6N<$g7JQ4YXATM literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Documentation.png b/pandora_console/images/Header icons v1/Documentation.png new file mode 100644 index 0000000000000000000000000000000000000000..78bccad52a55abd56bd045beed0ad5438f280029 GIT binary patch literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHid{Wj978MwpHBAm zJ8U4(n#|4D$kH+UNjme2x1tfx`0lzoJ#rCIH1pIusI*(FJ8qHZuX&d{-(2z9>l(4j z_VLd&t9dh5aA@~EcFg{}Xl23I+W)3r&tp|RFYz5NSif_ow^d-k9hZeYSN$it)!xxR zv1{Gb={)@gM+HhAeT}~?A#e6ri1{AQKu6{1-oD!Mq)i~Ei0^ODD zdF;&D+1c5L?QWqpo6Qf?>GTEhrBdnPZDLqK{CGSbdL;?6sY-89uh(bN(vcvQyLTu#9^S+-DF*a09Nz^K7*0J(1g!c5*{Ca7^6#h%8olS&dM& zG%5=~W1=$5iX3Jn$Jn)s91i4IxdF@N@)HTD?qzvkN@EM3JHmL7;KYtj8T~kk5O9n= z$8qF$35-9LqtWOqF|SBEZa-;j(4%*Qk}gRvn%5(19(%gXcM z602WU24f6*A>8=g&0xS_)5U9 zcN)kI^+WibRjbvv?RJ~~+)!IqfD?FZvRAEE+e(szbbqyFZIVwil77GcvDIp&K8vL7 zD*52eFM;vuaQJ_-4f<5-*TJKF2Ke2ut6`@uF`VdK^o#<<8}1PD0r#002ovPDHLkV1o8(d2s*$ literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Edit User.png b/pandora_console/images/Header icons v1/Edit User.png new file mode 100644 index 0000000000000000000000000000000000000000..ad2d1c5abb8e7bfd49c1cbf5f1771a039cd7548c GIT binary patch literal 826 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 literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Header discovery error@2x.png b/pandora_console/images/Header icons v1/Header discovery error@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9f45175ea80e2efae483e5f9895cab1872f56910 GIT binary patch literal 1019 zcmV4s8Yf15DId z&)sorNq-W4sBQI#@$rm3N6r7Y;y zlcLc{XRbO)do!QDbVdZ2OWIVV!4p-=ka>6}ih2;P@b!a$i-C)41#=8s+f>kWc*XYF zEF!`qZ5cGG=2+a{j0kCP(8{l@y&xc){dc$%1*yrm7%>FYZ|1^26F1daZx=%{ zRycE7HM7={-(PfK;!Nm-26;HFCC0o9X_C`luu`_ zdj$75!H<~yKpNq7Lv!Qs(Xp|dmhS=-ft&z*pbQasJ)HZUNOX)4q^|v7@q7Lp-o#s5 zp5W-H%k!dV8*n++N~?qKhhYYMK_d` zo!x6y&fy#BQaqb|r~Dcw*H6CeR1ULcA=lf)OxCZb+Z9_xKL-ZdH-Bx60Kvtw;D{>< z;dXp_>Y=Gy1ZWC`mId7P!mvlw%V$ehsDrB%BxuggaAlfTh?7=RY{Wd|O4W-T%=h=V z(R$%7J9CX|WuysEx^U@y>lM;tY>M59kB={Fx$j`!wmZm!xhU=q8n~8G5)c}!ZplAn z=Pr0IysZUrzij0ft|Av7?AHRd;)-vIZy@Jt1==rr@$IjE2-R$)?qD@hGi~Y-G^0@s zU5{WjQ8R50Lj-Zv^!Q-WxXL#k96MM}?RX=;`L~&^AKj4N5&e6L9h*+fW^La=aYy>J zQ1IrW=nmAfJ^m%K2r<?zc(M!jHiWhpiIEGjVUJX6# z%@imwzq0O%?qrn}vnx5BUP?)NJvlCad1-h1g%d}e!(Zp0?C0Zhy>76mTd72YgZZu4 zG+*O9?R7JLH|gy?Ty6dN_u2PvXV0wdKA;@WYwu$F&-6_AAr(GJF2Ukw$_!#!vtKgu z@R<8QcdlT0sy$JSp;hO&c~*IcaH^5kM4|T^4_}MayLjTpH<2cuRK0JJ_dAcKRjs>T zSF@S>hAxYaw)&(Nfq<-6_sVQ92kBVPVDtGEVs^8@_-BI9h8&lQzN)|T60c=#o$>qA z-e`tJv3^gi6!t1S+{+Yd<8yC{3dh+iL8pRdZ2Q%;`m>jx39roeuebcmXDwegLG5Gv zp}zcV+y849iMaX;K8)bqeD3DbLJ5 zy}3=o9)m%&FAADVdAsaa8-=$^}pBmGS(fN&`>WR^5C@ff!^IFOFo7k$-VaQ0iWWX kT^?7r@8K4|bYa>V@d)mEJ+)s_CZI_3boFyt=akR{0KoLzb^rhX literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Header discovery ok@2x.png b/pandora_console/images/Header icons v1/Header discovery ok@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..d5f1f8901c8b86508e47702743b98d7c57716bdd GIT binary patch literal 1022 zcmV-D+m-pclR6L z`*fD^bJE$q&r;Yu?0fU(z2CffJM+Hxy=83clSqcY_9w$LG=%$mxo+jY zNr8^qtLj3oQ#Rj>&RQos6o?cfo%4#!vg4=-7~YprydE8@%z$6_`2&qTm(m|e*XZ0D zfNrV)dkc7_mziKy#zuQ6axcMXE#m{RhhxR*!vUBs`s)F+b!;L_m=!{9@q#>1v*Yyl zry{qQB?d83SMRj|=Cq`bS9INLnf)bocL35vA{D7;7V88M&6v|d4B$8(uT^|H`~(KG zLcmmQ?97u+7%NC1NsEAklhJd9e2$)3K{;tc(aW*ESf*3z+JJb67x50ClES~C6u<7) z^mmR|?~Pk9azJKu<7btL*SP)Xp57F}#5GR=DbaWfh;bc^Jw67rX-{K_ zrS=_8X~$q?0~N^jw#~igl*6d}L<`HnN~=QUEmo*@J}qW!(!4*>aI9dhjbMI^X)P5Y z8ZI*qJ$FR05iDyYadjMs1G@(&9)ss zoT@vrk`n{Cc#qtQlMQQ#`H;K=18~pMJ}E+rfd!`Wh>5O?y#0NMLsqvO(@| zqVop>!G@ zASDmW5iB`m4ueAwL0~Hmrw`5$edG8_{_@~>wA~Z(&8}wXr5kI$%iE{_^9UPp@z{KO zu^yy8ZBFE;z32|O*&5b_O9AjVQ>jHbMF&+-YOq*^d^b9K73C#0SyUWDejS~9#eM!E z*%MXmv<|8YlBZVr=ZS?dv*0|omrmo62nk>zEOJjEUx|CI#O)%*54D`Aoeo6d2MCr$ sK8x+AMf}I(Lv731d0h+2wsm}M0Pf%mak8u|t^fc407*qoM6N<$g7u@p(EtDd literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Header discovery warning.png b/pandora_console/images/Header icons v1/Header discovery warning.png new file mode 100644 index 0000000000000000000000000000000000000000..b329f4d755140c10467692f6013e5d2396d7ac86 GIT binary patch literal 524 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHit9aH978MwuZ9@< z9d;17W6Rz+MNO=)f+2H4z#-u#0U;ZO^9vR(R1$I#$$Tie%ugq9g1!nXZ>Gjt2}j}1 zL*ERu3xs5%Em?$;q}QiEPkUchljh{I?(dR0$IROET)7n%&RFqxqR_^&w~uF(EEk#h zPW5S|W|4M(M5uS;l3A>2M=xyseQ~X=>-lvJ@m0%ormA)O7f&c%zfI1!dHd0)r!A{@ zo}Jz);U+hu{p6KJdz{3A!(MMavc_+7>laz4eNW%4edxL5{p_U{5^;*w3eRLOi6k81 z7rSV>J?__`gNZpRzdYi)4ry6SyDfLSz47A8qnXN!a$fd#Bz0xJ=Kg9~x<8}sk<^{n zXXaMQ&7IJ9-k@vkBG*a_mYSrip|ihA-;;0YSzW?6@wCmSa>I`8t_Cd%c9ZA38y&eX zH2H1Ew3XV&ZvSU*l6Z3ChmCf}qNO1>Zyx>oJ*Wj+U}0u^V)E`uvtQ^v#xGTcUn^NEoIz3I>FVdQ&MBb@04$l# A@&Et; literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Header discovery warning@2x.png b/pandora_console/images/Header icons v1/Header discovery warning@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..579c5fa6bb44d30db08dfea39df63b3eac8a5a6c GIT binary patch literal 1006 zcmV6#o5Z>8$Xo!mMG^qrW_yYtL zi!>%62nI!x%cTg|3Klk2ik1piHX>GnsHE`j45BEAV6+J+v9LEe1uG+W5)C2V?l`k% z!`}0GZ@qgl3EYEZc6VmK`F7sk?7k6V#d<}RpW_AVlxwn~;VI$#D}3)_}~ z6a%(XCsk?J8FKU!i`@rU0kuMibr#f-(E;xJ4+5LV;qthB$Y?IsxixTQtZ&!Aw*3t= z`6|$J)6R^OK_<+a#jp}FAL!zX`_vqwzeNG!PB2=z$U1%iA7}TfCH(li8~@*UO$v>j z>c1E}BS~%wM2=CTg^*I4IJ!o)LiPc@qr5wo)Fz;1DKq_$n}5f)#;fnkNdgxD&p;Kj z3n*}VqOqreOcRWKdT$6%f|~)5Uh|Caa(wK}wxOIlhbVe|CN#1MI-th@x<;xLo)ZXH zDgWs*O z!EJV+@y9qKoFKz~uY)TJ64Pfgl+>pI@QH+N6Ye1wHLoLxlf9u<->%S#&k{hY8zAa9 z+9x8KZiBaEu=6qum#bE92x2Mh(I}?UxI0+jRwQpgxfKR@{{fLZqO^F`3gBAJR zwYa`k4qC-!ZggK4hgt<%tNG0Bzy1)KSxB2;Gf{Krv?J(7qnUO)g3UzDowM;H2m-#l zj5ku7xk;){O>QJobzF#>xy|rLH(jxg*D2S#Lxs4^Xl2L{WG-B%)k`=<=U?A?aw9@> zvI7SBs>M833A&`Xz@oIe00K`D;eRZ$xJb!uBCw1C9tASEW^1DEtXP7sfo*fCT$HBv zYfy(N-uncVmxz2XEux!BOPyrbN#7JKNlhguQ%=W4a{h&!lqnQtipQ+P;H}6FzK<(G c@zm(^3&V8{Vl6Vo(*OVf07*qoM6N<$f`?zX3IG5A literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Send feedbacks.png b/pandora_console/images/Header icons v1/Send feedbacks.png new file mode 100644 index 0000000000000000000000000000000000000000..858e790ddb2102fdd9912c5cc744be8df358e872 GIT binary patch literal 645 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHihp>zIEGjV&JD5k zW_A?V+pi(^uT3C8NayXFPZ!--r)vCQ{=`4&lv3+d&9_0Bf`YERinlm^zBqbm0<-7z zV?owCk9^mgS)BiV(S+vYwEMGX-mSIX-PWi-*N;D=mi@qyIgG;nGkIU}d=$7`?o`OI z#z(E#chU9Nm8~zT=$@}kl_Y~l*#6D^p^o9^E8S|rYqdv1ZRr^D5z%?nT6IPW|*g(th# zGnldVY+4zTHB)r{VvmD2M7Bn~ojqHVdqs3v`tG}R3UX2WrL8|g*JS(pha9(wI}CjKs|5mP?^U`4@Be<$v)XDF;d6Y{%vY4jKG-O*#YXAOk0nXF*58Y4 z-EH(!ETMEY*NzRRk997*!LG%^<+irqTo=>i#n(Evr?PKfDw!ZAFLUeg!wU!376v>{ z_-J)`y3qO~vhue@-~6q)n3N-F$9JiJ4`cKXW+^w(yRMP)4Km{h$t75MkFx@3Ca0= zn|qVJ*}2=zUVa9aH#6_O?|u8`?au7RD)OzhwRNz$xj8XAJNwDv942z2bR{jklkD4Q zU&Kn3W_Ph_YinDSz6Fr zFpT^d{u$o3l`p^2ogtdSHB7-G2rrjgFLP)qK;XL{|wGPhQ%1^zLw)S z_So3iny!d4#>!8-i_+EAb#Qrk`EL{u@nJ2ZgbusUN;aDv6h#ynkH>2XMql@F#%f*I z3J`Cts;cVj$jHco?xzY{S8&|k-hL0kE~0x9G6Ojoi^Y0IM@N59Z)!e3tmXk2&H;e3 zXah?Jx0%!p3IHQKF*$(70Iptc3J?YU3emdth+)P6wFT5&W#sB|R4@j_ovAvGaiX!Y z@hfE+&1!0Ds=%3Hf-la#GJupT7SZ9rxLY6}zAZ+1<~zvw5V~F7d6ZO(+Eu&?B)MR} z^6I3Iptq$j68mtkk)aqwkl&3ABLIm@z56W7NTex;rkshrNcc?|8Jcov%9#L(gv~qV z@FymY%49i`o0MHsQ*){u5b*^&cYn6i>GT{1^P(t2*3(yVs7}FA071w>-ZvN$0FO;e z6rj9M3Sdd`=YjW$47MtHgqI_T__7Xf$RMl)P#?D59+SO#!J3r%TxVxze06p8E>d&} z*9l!;YK%Nj<9btBS^3PgxfSybB*>RJ$UMhYR}3V|JS!E~9c1oxDSsou?(XjW3kwS` z;TUPlDiyGZE`_tl%~UFt)%8At5jJKWGx8W2<>Qw00w{tY#$(6Kb}ywjSeQPS9(FAS z?*$e=CV4j6);bGANVmyzn9Fn8coVLyth|S!&mS^X{2DW7rm*0}^iyEL0Kww)w zQG$Yo)yoOT{TRbX)Cc@dI|P!a!vgH29mFw|R2g;<| UtzpKMwEzGB07*qoM6N<$g6jN3S^xk5 literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Sign out.png b/pandora_console/images/Header icons v1/Sign out.png new file mode 100644 index 0000000000000000000000000000000000000000..186cb46d3c4eec36fe5998f67883deebc9dc6e40 GIT binary patch literal 646 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHihp{#IEGjVwuV^y z9d;1d+B|m8ubx~T>F{i;r%4-Lc$Ath@-wl=d zZ*QJiWV$Bh{QI+K&YgS1))VaCy3nb%c&^`a z#i?R$ji+7SegAEpkmnuxvwzy@r_48MyA13mUb?GyYG>kC&Q(t&bIt{F~h&DNhC9Ck&`aFM%CL3IcDZN{EK}$KJZS^ zH1Aq8S?9Fg5ziG2m04>o`q&?T{1MnQ%V=w_8}otPb_SO%)q582TE@(DC!F2;BCDkD z)ijYpi}~m6S>Cv;ZfM&O6sD7KTQ6jHd)E7oNyRKDEE@0qsqDKX>X(+A)sV)MeoXwz zGBe9l^Ust=zii^TT)#?W&Kzdd=xZfvo|7KioIk(Nbko+PCjn1pu3yUac!SQYT(k0n z8+RPqkms(qX3fw23112gZm{Sl&hB?ue9_}cm|#TpEt6}yZ?+v)Trju!z_*i6Dt@nN zcWyd0p(DmQ{a%CJh8VBh$LqwpUBg6Wi22X6 adWPK2D|aUSU%v>H7(8A5T-G@yGywn|FA*sK literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Sign out@2x.png b/pandora_console/images/Header icons v1/Sign out@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..e666a1fbea0ade31e05e989ea149f607049e54ca GIT binary patch literal 1202 zcmV;j1Wo&iP) zf*}%Vtge#|D+&rLDebN@F&LDfB%09i)7zW7#Dai!R9Go@=l6~GmbY_ncV`#HN%rQ= z`}y9RnYS}?H-ZF+k8oXk|~_xm+6-)OEt(9wn# z#9;KncuXenj@hR$4-O6{Oh-^$N@>y*+HYO316=Z4OCk^kdU38;7bJc1A&1MsC|wgI z%@bKlQJC5wilW6*F**>qT0ksk&1UnOp!)rg>sqZgzqhyd!B-qwvu?Nho=Wg=Pb&{8 ziVzd{q-US0NCVDZlrM-VngGfP6+}o{TB0Zn_OgzM^AWOaljBU+Gcz*}MTy3v{IS~p z{{A-jE@>!_(bl!1xYaz;&SGtCEe1l@7jjG>$evj;i^oYXK=95IYF<`ET8A{}TnOeH zVRcWiaO23-F19GOZsxZ5032Hp0{EPVg9gq5+y%g04QwTemXjuM7NDz({>c7KftVq0#OfOvMKKP(6*zKlapiZcKfGh`ZSz=)jULVLyt9` zyb80kvvYDdhysCNd`re5eFDhy3z5D8$bBrqcNni?r?)~tw2lMB8~&o#>#b;k(2&*e zYW8GY)JN7-eIqNWeH|Ic{cq&o z)bXwjg`S$4dLndD?+)0!q%B+9xLxKHtVmg@mMN4NeR8MBRCt2pXj;d@-xQwJGXO-t zVwJ|0epOx)VBS4d1YUNTi}18O;%(gNbiNd=m^QL#t|)4d+pSjXmnE;ttJUlE*D!8W z1yFWlr>CbkkB*MqhmPW3iexFrI_6R!VoWTd{T`>&G5olS4SM|ASmK@J>-pmtMy2XZ zA3%@uu#l(AgTQ!|*YNN<=LhsqouDy;uP1GkN9UcAv>ODp!5{@EZ$+;>KnW@|(Ek=- zXrRFXVjG6)CUK(sylYA8h0yT%Ew}(d&a|*Cncqzz4$J5;FYzn~uV5&6(MzInLh>-Q zp3%6Mrb7Y~Cs!I^nZT|*Km?cEBy`RkLsxj4a0NSfQeT4@S8c>H8*Y*&%DC1*_!QUN zj;ZJ|8Q?0O(*JjPI5H%b*-$s`LNH+pbC@ySx-C|^IXXciVh}4xxrCBC2U!*K&l47& zC2XB4ZD{+iD(j@8)`1QFQhER$pF2qC>y+cL=HE-7@$BHsXXkGhr}W{s-=Po{UTO3T8z7a32B^} zKIiuCbKXPi!hQFg@A;k|_nh};0s&T6S659=Z5~?p3t*ILwK}epdM<`QcX#)7?QnBC z7!3Ad&L}b22qMeU>2&&*2sqzlFN^H1dbX-pVANngl-$2Up-|Fsnc>U|7^_q&BLc$G zwOZ|21Hvk0lm*0Npj945Xi^N1B_PcUoNa^z^h*CRWV8# zmL#Vcm<1r6v9kYEM7ay$5(b&OCyFIYbnTD?6Vj4^tQ+iAOQeN!8eq@?)*u~p8lH~F z<7S4~OSCX0eS9KB8r=!$wa5&hy-+C3i_Cf{5BIge^E-qkuy%F~$D@?BU`R^cX+SWS zfV3A`wpo_ss1I~37Tb+77KudmIiNX+_(-1b3GFM4X264V(GS&?lH& zzu1HFAlO-sE9|i7todXzS;pZLa>O8;5B$}B0*+D9kOQ|Q5{V!AeEx&HiISyllkb&q z&QbYoetnin(1f*tK*OA!UM6=|YR*piK28_>g#YNC&sBy-n=ZRO+{&3&tdOY1XIo)V v2Yi^TdVWb<)DgJCs2`(}zkd;agQNceqhK(Fm=&zF00000NkvXXu0mjf23UPI literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Support@2x.png b/pandora_console/images/Header icons v1/Support@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f3c95c28530c6b5cec7e93752c000e61f972d833 GIT binary patch literal 1920 zcmV-`2Y>j9P)1i$6vuh5D`3Gwil_+~6fi6r zJ}4*>T9%-#vPm&fFbEpKCDGs)H$tu8^=e;VqPrkufm= z?1Nrz;1PjYSy{!9JP&McZayHerKM#yS<0>Gp*2nxtKuk(7>+#DQ^z6_=BfbD5|+h*~Ncn;A)0 zhHJi(26;N6OwuI@ZZz>!U;!z-AH*$-ATHV83(o79%gqR0DX%rzrRd%;dD5gw*K$3M zn(SqW!JlN3YhW0S$K#v0-(K(4tJm>{hK6a_ZwuN{qoJ8ZuSyk+Ah%UlSAQ)>7OmxW zJV>xs#9xBJBopUnzlJ!>1lW-M>#k1f^$dw7)BP>+HLc7#@hFe|z8WL=UDM{U{ zNx~s1m~7l5zC>lod3m{a&bhep zon@F5OiuLSJ?0!nI}6yshnCU`K1+ujg0zJv>iFj+0Ap-aK3_sz_7o&C3a1TrTmU)wy;9#L8-ZLPv zC0E~K!8kx?DVUVlE#NM>Iq|@A?ZwZ<=MKNI6DNyjWVcpHNlAWVW209a$GZi6Hrs!f zjF$*!t1~&yc6z*H*ntfRCYvl4FXMr_+;Qk{yw``EWy1_G3O3dF5IXMCrAq@1C)1~l zkCFOY0FN6W$`+PV;8n2mpdY$A@zgR4Tqk*fs{`*D4+fI~SQ!o(3P$izw9XLdBIdY6 zeZLF_lOOi`)rY&_?-1}$hZa-YMBeOOSY(B4y^F%$OB0UmZ0kN`uN@+S{mSz>7rQUa zhQwYF@Asi8T`@Z>z*X?yHsjQ(Qx6bx1$ehw!HIWRH;LXS);M4!t7Ws;bWLqyz=B;6fH$Zw5wj z9Ejs@CW}(B4Uqd?EEP|pXLt>|p|Y~_B!wvA`@&a2TMDp<0=(zqVdvl(*T8rxoAkgW zxqax;N=`AjD*ZWHwu{fs&i+m`WOP{DPml#m)k9S8;}AzJuu&g(q~pfg4Y?)EE()WH z<toy@&=>`<%pz&6Zw5^y_x^bPYg$ux7^Tn#po z_;aDNNi6bXOK>SZycByk301rf(e;6K|juLn5+j^yR#^<&`^ zsTRjcUwrd>vgvTlP|ZzLay*7x(XUtXZZQ4X=7@M6>?zc(M!jHifcSw978Mw*M{!( zV{#OjcaxcSVuVL)Z|kue(KjPGcOGu~!C=>7wy$gH*0~->%0DnZVBF#)Y&c6{=fl}k zTfY`rzHjmUmR44`Z|2;&cOQQ*+imt!=6mPUT_!)J?sItdwyf*vXfctt$!XbsrX-^2 zfltecA6jeb`*&Uw{~T>>)&5@9@U8Pll_TO^bI#j}8i&s4dYS&H;vwtK;*Ynt0$ zZwc_6c{b2{vGK|;*LOM@f8P6k%E{+WAuO{Oi~U;v`0}~4I$K_qMjVkh`#szGc+QMg zv+^gc-e&3F*QlLQyH)j~WbV&w<*rS$&fQdfd20I{o(*55uB*OzILCjQTM)xC_s0je zw5>Z?voAnF#mru0Vnv-|%{~Ezp78r-uNklIPcA;7vfEHi?v?G7MD~Mbinkr?Lp_&p zb?F@nKJvwIvGO0Yc^{|oeMsO*GWuJz)Mf^g-jx;$t7-jnK=I+}>gTe~DWM4f-Zt0j literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Systems error@2x.png b/pandora_console/images/Header icons v1/Systems error@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fafe9217567aa5ca0a02ea09d2bdc7e0b2c6d145 GIT binary patch literal 945 zcmV;i15W&jP)1gh5T4nCI6p=ZKp;XQA*G-p z5|2QEl=zGzhliksk}i*cL=^;&0HledbaY5=oyJs=2+-g-$b#4g-!OAwkCpGvzO&cT zA+nOSb2Gc&&d!c!b_ao5vrsB~UT+H!x=KL_8>=pfz-)@8hbBX41q6#>Wx*c&;c3AjKmD47=%B2MolkW*{h)Z4B2R;zqBBpc+94kmoHJL`;{lT_C*Y5!_+HZ35zWhIx)>7dYi~fv6?%5rOI)f<7QP?;+>Bo8R6( z)+qmg4YjJadh4eg1P5{I+1)omX6F=L;e#lo)jZJ91QU>HHT@_pn2gW(DMws}M%m?L z=dcZnp8#mV#xjVi$fs-vOcavX8n})4p#)YDn6!MSX#t@4q4qtKP6H-mGwz41VX)=2 zTZ2U#3{Qi^HZkb+u} zl|FRDSy4>uai*ZQ#Hc;{esrVFO?6zYE+IL~J)mXuXqgbMA`zFBxU>W?$7QBGm!0zb zM40n=r!plaCmz@3UP|g*e!>=C;Tt@s!Mv}C#HA?w!jG&2z}^8&O&yq}C{v@~R}2*n TnPoGs00000NkvXXu0mjfh?zc(M!jHiYIxxIEGjVt_|Jm z$K)t5@22%dmn7%bUe;p~oX3u|oZ}L@c#8dl;+BmU4#~?MIu&u7Q%zy(+|G@Y*)Omk za8lm>c>8PJIKAng1w2mFeBONj&l{tH&D$e6z8vSCxa$k!I@c8rOZr6)n6=8=y`7TZ zU|yqi)7VY4iesH=Vb^5k^~Mq>pU*wDZ-Y$N39c{h_doO1`2Omu<6L!Ep~Ayv-rX4y zL0g2{bybb8`@cH>Msw?9ng7$wwkC3I$+Mh!BrSNh!s8Mn%?Y#je$85t8t#&x*x`ET zfRZt9!~Ftx{jMKjl{>Fh#Hugtx}DRTX7WtB-0f@5%9*z>I9FZ8kv|J=JMQ?os6xg`*!pj}@$}icb$t87 zJYNfK)JlA+lkBd~d6G%&pv|ObhI4FgO)L=Id)TZY>)IvlXV=`5YvT?7MWp?@@7OlG U{C-PMB`B6WUHx3vIVCg!0LQ@Gq5uE@ literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Systems ok@2x.png b/pandora_console/images/Header icons v1/Systems ok@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c1484d1ddb317cf1d172ce1fa2d124c507bab3d5 GIT binary patch literal 982 zcmV;{11bE8P){|NDHPa7BZ|!t#p~vZ8sW1+n6m zzX)Pn90joETlD_{OHb!=xvm+lQs8fU(NV&+lGYeq@Ch8?&%k8GC|BLX&th zaaLk!i4lDtCFrqGHKHA2GbF=HjA#^gY7;NaPC$m=VLJG?y`CCf88_p(rHeh1p=O-4 zO?}Eq4JVf4nS5?s>*}k-8qEcZ$_GOX{Ui(an*)ToJ*meq^|Voky1Gv@t6R*p0RP?a z9FmMtnttQ=)M4jxU0t2c=W?3qlGge>fX<=qBjzk?I*L4XQQJ09=Srk`4RW7Z@%yYp z?_b>=1Al;pro3>yg-}bBQ zhio^q+aDdC&JTUXsqRb~=1>!^skFevA*ro?+IYnkg;f~AzKm@?A5ikp{XO2yJiON%da&K?#bwce6Y{m%q?(yYigdEI&zVV6Sqi z*Z#da6xLS`IdZRS$FoSW=3Ch3gRxZvaHkzAqKcoj(%LU!=5M$ox2bay1RQ=NWk%|t zdD-&Lnzd*(qPIGj(J~`147GbxMe3cokTs&W*u$uUEjDNiA6a5sfL6;NIJnmc*F7Tz z!L+`wX5YT-)ql47NvVGP<@>=ufj>1^kvD0b?ZKTmS$707*qoM6N<$ Eg53wY9smFU literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Systems warning.png b/pandora_console/images/Header icons v1/Systems warning.png new file mode 100644 index 0000000000000000000000000000000000000000..f1cbc64f6faec500766f3e8c6d497b1135e5fef0 GIT binary patch literal 492 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHisL<9978Mw*M@HN zV>aaZ>fOiK6|gWkF+s!WjZcn`0^?i(V|hmI{fAC?U2QcwVE=(}FMosR$_p#SljqM` z>~T?*-K8t%X65<5+K-Lx(X!9&jvv`^mdkvv@-jZb`w~fZ3x6KUxggh&VK4mMvioYy z?svDder(iwzbMpG&vA#?vskq~5#8Enf*v}aTVQx%=Zwzl-dj|Q=fv(gEH$U{`1(}I zsF_^HmGzx-PFgm#OS7+guutTtz=L%q36mX!mG&5ZjJP4cCbM^vWV0#v(+IgMmtOG6 ze%N;8LdBPc6+S6*>f57UMEo}DT^ZYX)KAa9sBdG(z4O&7LbZLXPWw8PrW^0xbY-dL zd(mTGAM8+HobLXQ^ESgZmK&3Pt?Rm?Tf9fcReq8G3|IF3O%pd8?riN_{`3zw*Sn5` TYk3*Zfr8xA)z4*}Q$iB}*B-(n literal 0 HcmV?d00001 diff --git a/pandora_console/images/Header icons v1/Systems warning@2x.png b/pandora_console/images/Header icons v1/Systems warning@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..03e18ec79d0e79d247801bc0d38055f5879cc32d GIT binary patch literal 918 zcmV;H18Mw;P)1gh5T4mJLL!c^ArKJ~$&!mS zvBV=#(8MSbDDVo@P}1=Tk*E^E6WEDGL1^iaXq_fhmI%<`kSG+RE>Oo*{Q3#*myKroGKQcosMODr!nqP0<+ z9t$;OWgRU*`Ur)_hea$3cy<&fId zrbqNK^@uTolJArSV;|ZebLlYv;V#LQx%)8puu=NPwR?#0lEdbZ^Uq~?8fm@}@SHK; zYtWBI@+x)iJn((*A&|epIc%MUYFvQIoYxkm{BUl&;I>ad$4K~1q51-P@iRW{of*ad zfe($Td9}H(vP}*W)VO_WEBl~bJp`i7td?5~T`&RBh%d5&iTrG@a@=NUl35lz2EA7G z2meYdd8pxqd|ce31j&^Xt61vNSuG!lLlb)vlZMU;SlpDeT9PDhr<^2^m7hPL)@qY$ z!drfivs&ZGe?_HUX?=Ye>0tRTc!P$I-UbUah@ipX>m2MiodJcDQs{zOh0tYXT}Ao` zbg7$r)Z{&r+}C(+VBQ{>7SGmr0~D_HhVQnM9u8cLv~(l}dAGewAC?l!RbU*^URnjy z%FX^?tO1*|xEB$d#I|WyU_M^x)zW@LL literal 0 HcmV?d00001 diff --git a/pandora_console/images/auto_refresh@header.svg b/pandora_console/images/auto_refresh@header.svg new file mode 100644 index 0000000000..4c9de8f3aa --- /dev/null +++ b/pandora_console/images/auto_refresh@header.svg @@ -0,0 +1,11 @@ + + + + Dark / 20 / Auto refresh@svg + Created with Sketch. + + + + + + \ No newline at end of file diff --git a/pandora_console/images/discovery_error@header.svg b/pandora_console/images/discovery_error@header.svg new file mode 100644 index 0000000000..cb323bfbb2 --- /dev/null +++ b/pandora_console/images/discovery_error@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Header discovery error@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/images/discovery_ok@header.svg b/pandora_console/images/discovery_ok@header.svg new file mode 100644 index 0000000000..2b9ca237ac --- /dev/null +++ b/pandora_console/images/discovery_ok@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Header discovery ok@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/images/discovery_warning@header.svg b/pandora_console/images/discovery_warning@header.svg new file mode 100644 index 0000000000..c85e425eec --- /dev/null +++ b/pandora_console/images/discovery_warning@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Header discovery warning@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/images/documentation@header.svg b/pandora_console/images/documentation@header.svg new file mode 100644 index 0000000000..3e7cbb0889 --- /dev/null +++ b/pandora_console/images/documentation@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Documentation@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/images/edit_user@header.svg b/pandora_console/images/edit_user@header.svg new file mode 100644 index 0000000000..f1cc04deb7 --- /dev/null +++ b/pandora_console/images/edit_user@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Edit User@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/images/send_feedback@header.svg b/pandora_console/images/send_feedback@header.svg new file mode 100644 index 0000000000..cd4ef7e83b --- /dev/null +++ b/pandora_console/images/send_feedback@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Send feedbacks@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/images/sign_out@header.svg b/pandora_console/images/sign_out@header.svg new file mode 100644 index 0000000000..7d23d328f1 --- /dev/null +++ b/pandora_console/images/sign_out@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Sign out@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/images/support@header.svg b/pandora_console/images/support@header.svg new file mode 100644 index 0000000000..3b9cf3e31a --- /dev/null +++ b/pandora_console/images/support@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Support@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/images/system_error@header.svg b/pandora_console/images/system_error@header.svg new file mode 100644 index 0000000000..d1318690cf --- /dev/null +++ b/pandora_console/images/system_error@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Systems error@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/images/system_ok@header.svg b/pandora_console/images/system_ok@header.svg new file mode 100644 index 0000000000..cead9354b0 --- /dev/null +++ b/pandora_console/images/system_ok@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Systems ok@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/images/system_warning@header.svg b/pandora_console/images/system_warning@header.svg new file mode 100644 index 0000000000..681915d0c6 --- /dev/null +++ b/pandora_console/images/system_warning@header.svg @@ -0,0 +1,9 @@ + + + + Dark / 20 / Systems warning@svg + Created with Sketch. + + + + \ No newline at end of file diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 58a8cc6653..4a5136ba52 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -2612,6 +2612,7 @@ div#header_autorefresh_counter { } .autorefresh_disabled { + opacity: 0.5; cursor: not-allowed; } @@ -4757,17 +4758,16 @@ div#dialog_messages table th:last-child { font-weight: bold; } -.notification-ball.notification-ball-new-messages:hover { - box-shadow: 0 0 3px #888; -} - .notification-ball-no-messages { - background-color: #82b92e; - cursor: pointer; + background-image: url(../../images/discovery_ok@header.svg); + background-repeat: no-repeat; + background-position: center; } .notification-ball-new-messages { - background-color: #e63c52; + background-image: url(../../images/discovery_error@header.svg); + background-repeat: no-repeat; + background-position: center; } #notification-wrapper { @@ -11239,14 +11239,15 @@ form#satellite_conf_edit > fieldset.full-column { .show-hide-pass { position: relative; - right: 38px; - top: 0px; + right: 48px; + top: 14px; border: 0; outline: none; margin: 0; height: 40px; width: 40px; cursor: pointer; + display: inline-block; } .show-hide-pass-background { From 82ab2af20a6e73ff435f164c0edbea8441de1ecd Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 20 Feb 2023 17:26:58 +0100 Subject: [PATCH 292/474] Fix header title and subtitle --- pandora_console/include/styles/pandora.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 10f219d81a..88eb27d931 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -2545,14 +2545,14 @@ div#pandora_logo_header { } .header_title { + font-size: 12px; + color: #161628; font-weight: 600; - font-size: 10.5pt; - color: #303030; } .header_subtitle { - font-size: 10pt; - color: #606060; + font-size: 15px; + color: #8a96a6; font-weight: 300; } From 3ba9b752fe514fab0b8549fb42b0ea0687711e5e Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 20 Feb 2023 17:43:42 +0100 Subject: [PATCH 293/474] Clean unused items --- pandora_console/images/Header icons v1.zip | Bin 38450 -> 0 bytes .../images/Header icons v1/Auto refresh.png | Bin 825 -> 0 bytes .../images/Header icons v1/Auto refresh@2x.png | Bin 1838 -> 0 bytes .../images/Header icons v1/Documentation.png | Bin 466 -> 0 bytes .../images/Header icons v1/Documentation@2x.png | Bin 851 -> 0 bytes .../images/Header icons v1/Edit User.png | Bin 826 -> 0 bytes .../images/Header icons v1/Edit User@2x.png | Bin 1795 -> 0 bytes .../Header icons v1/Header discovery error.png | Bin 544 -> 0 bytes .../Header discovery error@2x.png | Bin 1019 -> 0 bytes .../Header icons v1/Header discovery ok.png | Bin 558 -> 0 bytes .../Header icons v1/Header discovery ok@2x.png | Bin 1022 -> 0 bytes .../Header discovery warning.png | Bin 524 -> 0 bytes .../Header discovery warning@2x.png | Bin 1006 -> 0 bytes .../images/Header icons v1/Send feedbacks.png | Bin 645 -> 0 bytes .../Header icons v1/Send feedbacks@2x.png | Bin 1310 -> 0 bytes .../images/Header icons v1/Sign out.png | Bin 646 -> 0 bytes .../images/Header icons v1/Sign out@2x.png | Bin 1202 -> 0 bytes .../images/Header icons v1/Support.png | Bin 869 -> 0 bytes .../images/Header icons v1/Support@2x.png | Bin 1920 -> 0 bytes .../images/Header icons v1/Systems error.png | Bin 521 -> 0 bytes .../images/Header icons v1/Systems error@2x.png | Bin 945 -> 0 bytes .../images/Header icons v1/Systems ok.png | Bin 543 -> 0 bytes .../images/Header icons v1/Systems ok@2x.png | Bin 982 -> 0 bytes .../images/Header icons v1/Systems warning.png | Bin 492 -> 0 bytes .../Header icons v1/Systems warning@2x.png | Bin 918 -> 0 bytes pandora_console/images/svg/add.svg | 1 - pandora_console/images/svg/arrow.svg | 1 - pandora_console/images/svg/bell.svg | 1 - pandora_console/images/svg/bubble.svg | 1 - pandora_console/images/svg/device.svg | 1 - pandora_console/images/svg/display.svg | 1 - pandora_console/images/svg/down.svg | 1 - pandora_console/images/svg/dropdown-down.svg | 9 --------- pandora_console/images/svg/dropdown-up.svg | 9 --------- pandora_console/images/svg/duplicate.svg | 1 - pandora_console/images/svg/envelope.svg | 1 - pandora_console/images/svg/exit.svg | 1 - pandora_console/images/svg/eye.svg | 1 - pandora_console/images/svg/fail.svg | 1 - pandora_console/images/svg/file.svg | 1 - pandora_console/images/svg/house.svg | 1 - pandora_console/images/svg/iconos-27.svg | 1 - pandora_console/images/svg/info.svg | 1 - pandora_console/images/svg/left.svg | 1 - pandora_console/images/svg/menu_horizontal.svg | 1 - pandora_console/images/svg/menu_vertical.svg | 1 - pandora_console/images/svg/ok.svg | 1 - pandora_console/images/svg/picture.svg | 1 - pandora_console/images/svg/plus.svg | 1 - pandora_console/images/svg/protected.svg | 1 - pandora_console/images/svg/radial-disabled.svg | 11 ----------- pandora_console/images/svg/radial-off.svg | 11 ----------- pandora_console/images/svg/radial-on.svg | 13 ------------- pandora_console/images/svg/right.svg | 1 - pandora_console/images/svg/search.svg | 1 - pandora_console/images/svg/settings.svg | 1 - pandora_console/images/svg/sound.svg | 1 - pandora_console/images/svg/star.svg | 1 - pandora_console/images/svg/success.svg | 1 - pandora_console/images/svg/trash.svg | 1 - pandora_console/images/svg/up.svg | 1 - pandora_console/images/svg/user_a.svg | 1 - 62 files changed, 85 deletions(-) delete mode 100644 pandora_console/images/Header icons v1.zip delete mode 100644 pandora_console/images/Header icons v1/Auto refresh.png delete mode 100644 pandora_console/images/Header icons v1/Auto refresh@2x.png delete mode 100644 pandora_console/images/Header icons v1/Documentation.png delete mode 100644 pandora_console/images/Header icons v1/Documentation@2x.png delete mode 100644 pandora_console/images/Header icons v1/Edit User.png delete mode 100644 pandora_console/images/Header icons v1/Edit User@2x.png delete mode 100644 pandora_console/images/Header icons v1/Header discovery error.png delete mode 100644 pandora_console/images/Header icons v1/Header discovery error@2x.png delete mode 100644 pandora_console/images/Header icons v1/Header discovery ok.png delete mode 100644 pandora_console/images/Header icons v1/Header discovery ok@2x.png delete mode 100644 pandora_console/images/Header icons v1/Header discovery warning.png delete mode 100644 pandora_console/images/Header icons v1/Header discovery warning@2x.png delete mode 100644 pandora_console/images/Header icons v1/Send feedbacks.png delete mode 100644 pandora_console/images/Header icons v1/Send feedbacks@2x.png delete mode 100644 pandora_console/images/Header icons v1/Sign out.png delete mode 100644 pandora_console/images/Header icons v1/Sign out@2x.png delete mode 100644 pandora_console/images/Header icons v1/Support.png delete mode 100644 pandora_console/images/Header icons v1/Support@2x.png delete mode 100644 pandora_console/images/Header icons v1/Systems error.png delete mode 100644 pandora_console/images/Header icons v1/Systems error@2x.png delete mode 100644 pandora_console/images/Header icons v1/Systems ok.png delete mode 100644 pandora_console/images/Header icons v1/Systems ok@2x.png delete mode 100644 pandora_console/images/Header icons v1/Systems warning.png delete mode 100644 pandora_console/images/Header icons v1/Systems warning@2x.png delete mode 100644 pandora_console/images/svg/add.svg delete mode 100644 pandora_console/images/svg/arrow.svg delete mode 100644 pandora_console/images/svg/bell.svg delete mode 100644 pandora_console/images/svg/bubble.svg delete mode 100644 pandora_console/images/svg/device.svg delete mode 100644 pandora_console/images/svg/display.svg delete mode 100644 pandora_console/images/svg/down.svg delete mode 100644 pandora_console/images/svg/dropdown-down.svg delete mode 100644 pandora_console/images/svg/dropdown-up.svg delete mode 100644 pandora_console/images/svg/duplicate.svg delete mode 100644 pandora_console/images/svg/envelope.svg delete mode 100644 pandora_console/images/svg/exit.svg delete mode 100644 pandora_console/images/svg/eye.svg delete mode 100644 pandora_console/images/svg/fail.svg delete mode 100644 pandora_console/images/svg/file.svg delete mode 100644 pandora_console/images/svg/house.svg delete mode 100644 pandora_console/images/svg/iconos-27.svg delete mode 100644 pandora_console/images/svg/info.svg delete mode 100644 pandora_console/images/svg/left.svg delete mode 100644 pandora_console/images/svg/menu_horizontal.svg delete mode 100644 pandora_console/images/svg/menu_vertical.svg delete mode 100644 pandora_console/images/svg/ok.svg delete mode 100644 pandora_console/images/svg/picture.svg delete mode 100644 pandora_console/images/svg/plus.svg delete mode 100644 pandora_console/images/svg/protected.svg delete mode 100644 pandora_console/images/svg/radial-disabled.svg delete mode 100644 pandora_console/images/svg/radial-off.svg delete mode 100644 pandora_console/images/svg/radial-on.svg delete mode 100644 pandora_console/images/svg/right.svg delete mode 100644 pandora_console/images/svg/search.svg delete mode 100644 pandora_console/images/svg/settings.svg delete mode 100644 pandora_console/images/svg/sound.svg delete mode 100644 pandora_console/images/svg/star.svg delete mode 100644 pandora_console/images/svg/success.svg delete mode 100644 pandora_console/images/svg/trash.svg delete mode 100644 pandora_console/images/svg/up.svg delete mode 100644 pandora_console/images/svg/user_a.svg diff --git a/pandora_console/images/Header icons v1.zip b/pandora_console/images/Header icons v1.zip deleted file mode 100644 index 22a9a12dfa2c2155b0f7aad869015fb753617c08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38450 zcmc$_18}9`wk;alHafO#c5K_WZ6_VuwrzE6Tb*=lJ9+7|&%5W`efrefRj=;3EA`h} ze^T|=s>&F1jxpx^Q~>_{MFI$5ixUP}a8Z}57{wSdM^iY{?$@`QINzi@ML;)K4vsAm1t}=g`DKX<*kVLeQQQ?T#&I;>2uTf!n1-+;fJu2>tCLWw2 zY1lyc7L&}^=_W!Un9i2@xvHBFNrVny{H0xWwf277{_lrRw8u~L*JRdJl6 zSa^0QSWDN8lR=o^YcsH?k7*1_QXKj}8b}$Z4_&Gu%SH|3;}@ zqL!{g#Tus{@Mo$jawq<12I{|gZVIYwP%*<;8l_GIPQ!mw`@b*Pz&9Z43Qh_ z5>zW1$_)w%yID}PMW<+3qKfI_FWlKO0FvL24X|_^%#3zLN<;m*l-T5u2L>CCqxP-s zSGABQET%k>UA`=lNDW~u2d>J=!32E2Y;6vt#8fTWd7DUU3L4zElcsnr5omDhFqCY` zn)xueHPs0S_!iYu1do7a2rB)?NKGTTL9Ad+)K?cu)CVHYbSIH(o1WCSoOL?U&&>@V zh8JJ!o>Z-L7oD&VfniB>?t}}i52$q)MbuFKeYY*%iq|KS3S*?0MZ2g3pl$c-s>T;^ zIZ1Gc{8;AqP#^$+KTwwYE6D3X007|sGsqd;XzgtNKQRti4k9yUQ3n9)>jD4($_4sgzah^B{*TXp{-{nXoc#4j5^-SxB{j%FH6AGx0Th$R+Kvc? z!a4r4b9nL}3;~2l=9Se6a8yuGR21jcj0_lwxy0!+*YoQc9RmS=E=p#2gM%_CSRYoGSXU@Y;BD|s%Fg^S0y9CqQn{D;NgiL81RO7{H#4ZUNR??P9I-c z7`M%;`DbQB&<6DG`rM>QucB8==;7huNTt5ZX-SyRp{&_z*8*$ZXi0uU0Q0b~RzoND zz99@9?<3bnCZ0rAmyl0gBZ$Z!RAAslXw~4SHk~xNP0xLKk3H3>V(n>ZdF)fg(P*$~ zdCiu%vXiBPr-(p6ekwH0DH8*p(n+KXBTokygG3b;)6mE#hk2-v4!cFHw@TQPT4rKm zf)@!NDtN0~`}p`^eWEodkC|O+%5Podo|`hTwx$6STt;`0A{fb5XN(*cr{lkxLbA|N z5!MK0KGcFZz}9z`t+m@5S)gquZ?ZXPegeSJL}365F?nIm z^jYK6txrL7F1{(3E?sLVcF(_#fD&{ zUp}oe^Ph=bys~&O(pvbwq~uLRRpyP0IsDNc&i@$rsNKMLJP|n6;8r~>g-t!!c>swE zmD+w?XTGO)Yfah$AdU}3{!;y&lsX>Zsu*4aGPXt?&5VR!GzHWmoAoMt!X3RWLvuiK<6D6?5UP@pS|0F=}f_i3Rr;}o2-q#tf z{Q}mpHG-3Yk+y~FYS`fH^mLDJPV$#Sf6ki5T7vB_m310efZ| z!~NSR*^5j7!aW8_L&-kMI!Jn3Jjx(CE@_chjoiD|8^=!FC{?Mf^=8%N7P0G9DyJzV zHDeWvr}xYBHcFs!E`}u~C2TR#(Ho)BySfoZ6vLbc3IqmH)OqiCCG!k#tr4&uZ)OU46x-IA8Ct~d|D@8q&_83Jp_tP{Tq9xFGHkWesI+r%3Vbs_pb~2f zisu4XN4=d!M$0C#%A&M3d##~7EzDo?hy76S0Km)P5<5Cg+^apIM9%iF8sg7A;>z=TGJPdrb`as+chUsV4p_1@RQ- z%JFbNe%C-xZ|DBb4iaeY8^J{1P;c*3g{&)U?9cd%qtlVz+Pa)q*>6;_wsBa$(hg3? zb3u(9>FJwI8EXO5qxh)@0f3~SQ+K|7gHA=Xiv2A-D>>}Hk&{guO^6myMY!Y>iVM>G zFs0MKWqwAlXr13blq(jkNy;#3{c(=TrDm+GorvZbH$`$?!gPImsg^^InT`GJ<|O>1Tmty4Ko_GycjeR-

    bR z3_jdFli6r1u-8~Yf{%$emY`QRv+uhN6&S`LBZoYFDPL*BUyAlkSPHKT@sWG#Cnjzd z-kA1h=`z@9muryHm_pTAUNpkf4-1D`52xvvHyc@w#d{OdPE#CswsM)MmMhE5{^kz&YukN-};$gmDYMW3+dy*mG$5V38!mX#qR zeH3Od)3dDCLO4YAc+FX7vrHdXFkjr6L-YP{t*Gp;So}k_8ZyV+?Q>76q2yG($k4-9 z#~wF*s$|#Y&`~6?NqR5eIXXEc2B*EA%tXY8Hlw!v4SKkaehI1tbn8)-&fw#=GMljF zb}UQ$bD0i^1WZh5-rfD&KFy-47n-deR=?mXYG=>g!t;v@?G?{yol}V-_({z|;(2?je4;^L!oD5||Lu^V1ER^xV2B`^QcSWCd$Bnij&;MQ@1??+&FI@1IEF zY2ys(G}Zh*4e%m>eC5R_OG4|~Kc~G}xG#DW=B_B}T@RR0VxjI8%J2(L>bwK;Q=wq) z?Ml(Mmp1Xnh&zHVGd%oWyHC2q3f0|Z*vV|mKkVzy%J1c@2O{;^5X;p$LZ;L;OWAIz zlc>i83t-BO;v`IF;I%ty4%Fva7pW*oH3ti}?|)rkNnMIO9ullB)>*7gnw)qTx$8i8 zU2Py9Kv1aw!qzu&PzpmWfg!K<&5^Ti)e*|X`6bIYF!{Bql;VQ#srf0+axkaURML}G zjA%Ug>rs$XHk#wA1Qch;iK4+>id_OPzi0>4%rG87(dkl29#jpE0dh_6&kLH zlNf0O9azB(&XJtP*vCoD($Ut;dP^|^QPY^?Q;({`bS?J1?+EL&Q4sTiz0uAE7a05{ z!MCx=Wx_mBV#OY!!?Rd1=BBt-g%F8`MGJ63&E|>YUGb#X6c}!-Y9wEP4ev&FNuD-x z^2pH%z75i}*$NtB&?<~Zy_Y29mRzx$(#?U|)!*n!yNx^3*Yg?eIk#&*zAm3$&u$cx zX-Fl2LFfA`wvR|lL-D}^8RA<0D-~Z zp8hY1U@(_|7s098R!Sl$!yW6%g64#vkr5ILBfunJi37qv@){w`CA|CcZHL5y##%56 z!0@BC!xO^@Af&wrkPKOd2+CNk^XM$z!pxwK0#gZm3Tdp>H2EnseLqjL#y3_yJ33&G zh+CKrPkpB*GC7#m1AuyHv|6v!oSp9v@kaHU5L0S6a62azO#Dx##P z0L%ujf{xBsx&Bga%N@FXL>LzAX(*=X@n15to+2rl$K#p-?z)@E(Fj zZc*`wuC6ZMGPX%&=C>%`LULEppBa9HM?wq__xBW_G5vhT$8JJ&iYvjO#Qkj52rnSI zm_xx^0hTX_5+N*N81sT$fqnC0x{O#H4?XCpsGDo6tL_>v)rZg|BqXTk=jT5;0?cD{ zL>|R;eY+04U<}|&&Rt~ITWArucv8GPV%(<%m-3^WorN>@A)+%nV0qCay37Xo+;B{hF`>D6c>!ld-a}w1kfK z0n6o2WONz_tS;#B_aRl}7TT8lB+ZEf}VIslAAeNk*EHmiV3`IS34hE2cp182!LpQ7ZW4Yf;2ntA_ zavEdbil^Cl1uj>WTH97}A}-HhqQJl_2bNd@E`-$>XxmW0VAvlq_@XUI*dZRXQV*=W zG7s#N7HVXfet8IwXUQlazr^~tVt}gt0qrNeSH{^}%0!U{>@A2}*1>`UZm z2w7@rCk4TXSVLIBjW_{!@^wF~_JBajNRVJns0ri;mbj64Zm?n#)cB*8ME#1-*SRRi z2;d8XfP!o24p~VFj_VR}HU?bD!b-$;Y=%zlnGHP6%*@F5ua$bEroIC?aIzXcVIAwQ zQ`A-HF%#nF*UP~#=VdZRFCJ(3~;0K?xq28U2mgVMCMLW1+)Dt=7+AWJ0SWtZ3|_ zv95kQl~H|T!C5WVTY&XQWRBs)5~keE?%-lPTK=~)UHGU{Aav*JqG7x0?%<^Q-9sAk`pnV#M$8bXpSdg579VYb{hMUj!O|7rzl z1bhPsSTi1{9aaN8;bZaO^!TAbpX1>?Fk=(*=HVt=CowiCp^7K;SeO37atpOmV&DYz z8(T}$ODkA|tuF)Z5$98-eZ4!>(!!#84{9!neR~f3F;*|ePA~cEpLo2w&%)O_O^~>) zBUCfm!2;ocn|aQ=4RK%ZnFjKDmAPS%{>Dsr=fBA04CKFp_*yIYboSrT4{{HT% zUKaXe?sFDd4caFILIyhVSr4_Lx!HyDvT1Qb>hZj3SG!D<-*?B93qE)g93BtH=^cdX z2rB<*FcN*5@M;|(^T!*ScT~wQBgVbasKwJA*gi>tlB4OXcbH4?BYe!q--;d|fOXKF zhNiruo&W5r(B8P?AinzOpI-X+F3So06%+ku;rYMWs{gLVasm&&{iVhJ$yrhUEoXX( zrpfra`TvtMq5P+u>Cb}!;!x*?zoMwBKP{FWF)L}>Qc(b5_;yPYW>+?m_#0}xmQpEO zoDMN$xZs7Tl`UQsN>eUd9svZJcvskWI)lC^a3wLZ05Qp!-M&m1HS93+tM4+TlebLk zEt9+~JgrxZOxtPC7Z(#3qzHP2^T)E)ry6}ql)+BG$;NFm-{Q=6I^(5CwW%^Db#P$7 zVu-m3^jXEJ#st-sBd!g9GLpEECb*0D1|3De=_T%7KRI^4PntAP8aeLH2#q8~*O$S@ zHRs-Yyc6daeS50Af)TOcFJ$aosA;y|h6ols{blD?v3!~}=L@mBGBtOY#)&%v0p{J27h*uuEMo+R?`fN2Hdt9ptLZe!-h&g{~ zXw=Td4o@&$=PwSKXu?0Em?5Cv+eQHA=+^_-6O}m|`irR7oM~jH#(`aeQjT9jjzF=U ziMDS9x9m6bNE@9|fJWsrRxhIm{-GB!lDi6JQuB9;y(YoDoyPTZ^_vJgkhpolC*(bX z;T^L!tq+^xy$k}gxbavtEe-xNo=r8}jPd>GyVrNyfeRFQoR_&Hg0@2hY0LG*Pm7F9 ztnllmX{osiMuw`(eQe2*8#?}(MdFY%4_;ubvc9;J6o>zX~$)a-KHcJ;_%+} zA=FBFWiz_R@vyNigjSedg7OFuUyoseQ=n1+bq^cUG*g0oF?>o2FxTLN8q0lDU~J}~ z$EH=e2iIPYFAr)q-^69{@O*Msg>*}XJ&7(|=D9)BrZX_7^7UI&+eE8TeA(Thq5Mu% zbXg2j_i6j`Ydv?)^lntXc}r2eLNf7o$A&JPa@S`LQ4qqI)&4D)XwPwIzTUP0?z-}F z^|QUG zWocY+rMvSYo%b@h(7x0MkyjUjOScH;hSj^p!vr1GM4+sD+(w8kY+&S3G`(OL2#NG? zN*WEuoCC=9 zEUw7zcWN`p36*2f5=RS+&2EzS7`#lFlgx{)=I9rA z4tvR=j40gvKuXUW3%jXm%o|0!(^thkLd^+Tq&JrWi3nT61F1pTPKaCwtDk@0ryWYZ z5LI_5ckv7e!aiOQ@fL+nml(I}yl2t2+@VTsmp$wL@qkjlzT4z|dB8tN|2qd1zu1BD zUpVkD`anhC%D*+K|A}D;(9l18;JI3d%~z8$mfr;zfhvRm6ptICK|;+s?+=(M-jy$e z`s^*yk{6EH0p{;-6+eRtk6uDWVx_nNUJ-Sfs^q>tGr3q~Uls-0OgeKvn^^sNg`V5w zv1Clbe_1Nf>mr5YU)Ba{0&i~IcpfB>^<@&aay84Qb8~S7NnJYAWfv|*13gpYeXT9C zW@oiNfl0#ZqwT9!h+S9+*b)}3Fd<<529=;2erh=^2D?vQC5}IBS~`R}ZHT93h){ZkCE>@GWS=aIAp~r4F&HF^d3xV* z@>ASz3FEbcxbzB`%SEsN>WPZ)k%y>hMJA!GMQ8x3(xA?!ico59Ksj6FSv|=!@aJa6 zbWw@9arraC=MpYysMA0sE!43`uK>tmRmhW>n~b{NJfS?4`I{*h6(} zS3SgFahqQOydgb~aIaB?Ma9*$ra#WQUG7`!MDG&0O{ z0Z`OOo#WbXdQF=wv3vM9?po`**Nr-k{?$8Spw?_`H_I4@5je(caSP{Rlp2kJP0?Q zHYfFZ^_GMuF`4tK`br__Z51M6&@d-5{5wBHU_a3@B(|N?t3`O^QDt$&ELQ_wibb|1H#7(IY2GdmK`opjI9v;s!a|)NP-#KgTX!a>mKEpe znj1hJO=kfxFQ}UROId45@mC#JHzzTnM(z^bRhrhT&OF(DuG%uvxnhsg>e8b+E`Ya7 z7j1f`ZRca^EX_G^v~S7i_=_PSFZeg7-YXgj*Sl#8n_QW)l{9oYPo!4EJ?FF~V44Z8 zm7E=#eYY4{98*>rpRj0F%ZX;v5A5#0^3-Iu4yIwxkS_T)WLBE#mI(@@CSTqT*T)$z zy}5Hf-~0^pH$%%xGP}*5SWya{PDNCRNf_a}+W7@dFjtBmv;JaSwh-A!NUvNr5^?Lt2);J#inF zd@OsiuTQt)qk;jzc!(5Q#^OEup^~=l+ui##_@njbn}e@gr&jQ2&Bn*|_^*SH>j#JX zbzk4DyG2=5d|I9E%`X9yvA4NT`BHL8<=WEI)5Vp&<=wH}^YME1?y#TbD(|a$DD!j7 zesXVo|K!5W>!o$GySrPa#+;LT+os^rC-QZFWcU*PF-F(di9U*<`QiBFByjI=*EZwF ztMO;6?}ryRx35!9_eG5Eg%+%$)8|n^@||ppy~ABV3Hqzki^J2rHEU$x-utz_?|shn zwC<*gzU^j7Pj)uk^sq1D%%IDM8?Q%$@3TXb=aw(;g>C7;wN0B%`^wt)+cHg8U&pri zpOY@gJUwWkRF4i`yk48S)p+nRuk#&~3JNE;!|y+T9t(ACaev2G|@BKP38C|(> zdzskZxUn=-geF{^S?cS^+Io@qg6qsupx#`!f2fqHxUEq9b}TI;x>T9rubv*AYX=t`)^zPscdKHf()D6ODJv zxlopcL-jjTlv4R1Zpe&Ua3@GQhaGm;Q`VzQ#8CSW1FPWG73k!J9cwtKXXLpK<%fPyY(PtkkURO z==QLe+e}dEWDQ**;whGuHk*j5hNOtCtCQaE9UazCQEpV#k%!Feb;f+ z7&kNwV+GSyy^%gT@!I=NlCv@T>TuhwLrG?l&27f+ZCx~hAI;!$AKIE^6RK%4@a++a|skcDChuq=V}9Vt7Rw#1BLCtJvG zUG_CoOzKfOZkZnYU&Zox!Cib(`@8_B$?# z#$vo+{azNZji~2s(lTOg;Xi}Hf8OjwPPH&E5S6(N&=~v$()r7<3Y1EOvY_~EO0Il} zwoW@of9cPTvqMOG;IVpbW~FE@)d7PhVLfMMRZue@x%j~Ry8j2w@&D!f-QtXgv3aqI7ZxL z&`(wt?-xEr(P54$8>hvHL1a|6R-}HZ0zJQrCHm$|31_xNp*d*m^d@nQM6!atwTYS0 zs~+)2Qz%6y{bm=T%ZJMvFYYKskJ~Ea{1L!KJ)kZH>luJP0E~XZ=y*_UO))C)3=-Di z%vkOaQMD!K&qe7JK>)*x5L64~W0I~&uVygy1W94(K}#2pCxamuJ-E9GzOkyNoaI|= z8iOfZ*<@?zywUd&H-u5I5bxThY9qXq0x9JlKzWZyU@^eW>8(R2#xhru&S0f;Ax#r6EE}rzQ}|OS6V)ONbri9=jD*1El`k zrF|f$vJN!Ca!bOO4(F%wQ~_y}gOyqY;VTqycB&UQ?l-Uo8jdBGvuAN{i!_7GlN|wB z7i}8hWS8Cqbc$(9;+-x8^r??PHUtJ!0qY}Vqar4c8l8q@JHW%8djs?$Ow|lqK82B( z#?U88XtMj3V?2;i$}^Vk zt3i#g!UbT^089obxT36t!l*G<{HFmCtNzZzVA`Y9)49~z^&MzYUf?~-WY4U)DXOt> z7RDs*Bclk3N%c%nFK2|cS};GR*7#M_mN;G{-sYHqj4C_uBcm2Vmsa{!mV?8yj!ZKb z!8I)Neo7e7ki)tS!H@t~B8s1|xLP97pzuJqp9?6m?X#Cj0X~@#ofysMHKf&5p%n`m z1F$F(a|HLOVb96V=C|nyGM4W6%&4~rqLRGuIP^g7fHNoAgR(sMonIk7OrZdGB0 z8F-z0*?kd#xM45TsA`H4Lyh{eo{s^l)X(vWUh5#8%wnKOu9^7Q0_iYW*R>fn!-ge` zqu|PG;-aQ>ny{k|`Gr#0amabgktAwPOAiZu)$H!V8B>wcr>3fKde6}YAd4S{ShWGK zN{YA6K4^x}GYKK26gNN)twFZ+ZXxC3qEDM+Dvh?+^!bDFQ1tF0g-iXaLV?om4x~O6 z0Lapw#hf8@-JD4Ky8_UhCV)twg5{2NbKky;=JCudW3tc5LQDk|nQAQ|CIsNezCI@L6#2HlzBTgkxP9`xSMpUJJ{ngdg2V=S6t!!*~32KXqj9JwuZsO7P zergM~VdGIzQc~JjTE0$z8`Mp*u&~_PlM~Ht7V@n)@zCp-#R*%F^2Cl8S6ncx10R76k%_&&!P+`hHN@ zxhI@%>lf8}SM@bzNV+oA-k^hDwzadgJf;7pn(i+T3eg;#KD~EoL5Z1xDXtn~*&Pq&&Y34QM*?ZXe66GhNYRNuKodzoySfcM zb(%Up386z#!?Id*v_0FQau^=W?-P`8p&d#C*jT zdQH9{FHN{c0yT=DMOjtVm*zWK)xHb2Sgp!{Za^O~@}X%@2>S%cN*q0PiOl?9!;bh! z666LEwNk%e$AU+QruI7)l2tH;_-2K8KOse`)do?o7pZJEw_qpdwPz_=DkDF9!;6>; zJ$NUbqoj$+fwC2!)B092vfiKDvFfM-7lU498oUlmA=sAIbibrD_{pepHxQU zF@gqRpV23Ptl+G*VeFNz{^N#OqnZ%E;nwtJj8r(1c@;0l$t4SH(Jw4xZ)2BNt!{8Mz`nRzF~i4+qoQ? zY5Wt09*TAG34!xsu1FFXmTbNxDkknl6CehgU<@r;VMn?4HW$C0^Ll|1T8qrxzXJFY z6CNx9Pz@6f6H4?-zHtiS=-WZ7uy+p(SOWgT>tblf&LzT?Y$%%Iy71PSwwh6}Raa#H zmLziYxz#DJQ4Q|5fcLRm4)hMXiI4#ugv-Y~3ayie;$I*f{J=2`9AaHCfqIEjzm#ti z3&sH{#Ep7KXiB7jLEpKuAJ(vq4LQe{{TYjlEqO&dIt?9(+ZsE5fXp{HJ&AT?>8YX> z(Y0sk&5<0;9(EI0AX^hF^l7DJWW1UyD$aN5c~qQS`H<~Rf!WI>oH5Fz|KJ8Pu|vfh zD2Y8jU`WxN@@08I-7ugtXpMUI#h?q|UFn)j+zQvN})r0^hb&JH4-E_No5^wO(*wavP>P^Jiv;0Ws0qR|)bs>T++MYhDQ zM_ggSKvvtaW#fRuHKZ%X~w0=hrP0JQc)E*~n&-QDeQwJOSs!fe5n{Vm{+n!fne?uHhzWds* zDxe8f8wS*QxT}A-gSp)6MwxNfOWfvtG$$d$&`SBvq0t;UJvH?q!))ZFwk{hBD!C}6 zbh(G{ou*bE-?eaWXbrZFWP%o|AYy+`x7AMHJ~eBJ)P=|~``8)%v|@r8IG-Fk^Lr2G zYp8K(XYePn?z0KVauB6ay^r) zxa(z|a6z);^1g$;WgcaA+|Yt$jel~?YY?ZtF_g5U;O#{5WP?=hgxeZbEKSTFHSs zM02)A^~Q$&ef1#B4et!{j8RLQlDDpHd8S8#n+NS(pi^K#6Czg@)^nEcHtxOwMyTK!t*$K;3<8c|3@aR zEB~0Z1}9BRD#@b^A8y&3qzXV4G6ay9_~(jbh-LBHFO2aKgcBgVw%IQ-T2Tmepn=X_ zexsLDg-kGsY6zPUHk*fM#wpN<>hOm&&rIVze7JDj5<2boe$2dl&c=Vtd^7<9R8dt` zm6ox_(|Cl|OSEX>tWNZx4dHineRMvzbL7N;dC;FCXIO>!Ha>Uk^pXt0zHLMoc~CKG;=c}cwn*+i%0T(X4=L~ZRDeush`E4JjFsJl;dPat;hSvSv zU8DSOF2Ikv^7W;#d1lO)%7##KB7%Em1_{h$;u6eMP=c(w`cEa{Ht1hSU}+s>5hRjM z=dmEjbMbza*k{U;g~5(kdNY7a1h`IE+0ny$CLt@5jr1hmUf+bVHX)CjMqqNg3lf|3#3VM&`RP;q8qw98)sugh!aGr;t^Z&|3m1Oi$mIxo z5<8G7u1Rd!F$ZUn`N>Hr<@=LI7`gnye-Gtklv8X#73A8Gb`Yd6r-T1s<&xqQZ+rFd z$B!R~7micL9>FDA$5@#{oo?uDqMFQD){{nzmgOxiEvSK=Kh{+wSvhzxLtcW0mqZNiA|znmfhM%xz{0jF+n?Kql?({7 z;I3Ldz-}wV^GEV?fw(5W31^1f!e%^A&5)&P^{fQm5Ui+2Q=QcwRX!Urst^4_b{HVY zfPY)`0g9HNjRkHYMheG&_WB6y4396ePPk06o05OF_VG>@p9yO6=l_|Rr9pU30k$8=#j_#NS5W+MJEM676t8@vYzXw#GMf*Hk&*Kn4)+4*! zC4;(yIR0cIwXccY3X()FpnO^;;8A|4n^0Bu)*Q){Cv{ zj@hWKi0?I3-hPvS9s^u#-jz7K=Y;WKfBPzC=6j>8jbixeUDg6?o@)>@(!`%qoEBZ0 zfO@mQPE!eqCrvz=h+szKw4u&fACVs>Dv{_dClLsz5`e8Am9*;D)Nfuw1Ch@(msdv_ z6!$d8TUjM3Z%o@Cg{{QcKvDULENW90#Twn8uBp_YdoGDp_Puqtzf4IS0a2p7pfSEn zh$mdk-k8Rs>{okaDGy?BG|RGr$yi8irr~}pUNRM!iQTGVtTy~O6Zafg9D7*;AgY#d zz1DrB`K5S3kg;GNHz91L(K6{u5+0K{W1B~IktZpSX-)y66#c1yl3dBRbnHosa*<$X zqZ*37@qXcas{pw(x{WxYkf1i#cAU=fBk`^4soG>=^*NM6?uL(kUq0*Tx=fqP;XB^9 z6^FPWNlqWE(dZB9{>Sb&;6G`5ex^&l>enpw4?zD8UA%waC-^7m{);XX5A@f|Up9XJ zCx)pYasP0cUnk4VzD|}+U8La$nz=IQO^|?5NkR{P;}fLM59X7vtZYP}vSzs;`4Mm| zOq?Zx1&@M=M62i1C`Wi4kSiQUjvg;c%m5BK`s|(Inb5V`wmzxj1D4FjblG+3{d#ad zbv8tKQ`OYuT-(;h!NA4!I=YKP>X7e5LerUWwr-|7AdzU|TKBbishQXfn&J$j1up}1 z5kXgvEv7}TOmH0LU|`U%pvKvZp`N@S6%#`yIger~hAlRpZ9i*cHsCEncmuTs(Q#tJ ze)P3-+uYpD8iYNv1GdINHpw!v?|?Qp9`&LDn4itInLboUK*X76U~pp6TLIYV<2egr zG7J~B4NJx*AwFIRz7s=mFweTp&(%iaK`L+!&1g!5LgNY5Aq za4H62G_Fn@$O!WGegvh+0*W3+d4K=1u=fh9M7x(h>J8%qbE`Rtt`}392WH>hx>^qc z>ARh34-_fG&W(2?rCX$!DW07Tpj9DYLp)jBp% z2%sNOv+eg``a=LspbOf@zfT;L=)nfE$~dF#^Xuxasf;lvEi5d`d(-p-=%%_E{Sv9r zW`FgzY7*dg(}=nsaE&}8v}Y)Om{FFO9KcGn&djTA|s6+GvbKPNYqwTbS%d~xCZ5N z^=4{$-`ag!lG*h|=Eb2x7E^@YJj*c!jpG z;RCcCYLYssj?`;mM8K3-T1IiVo&0j&czk~O4n9`6UZp>j)b!5+0=rEUo#?C1{;9Qp zufoA!H5%!^2#9~h3j7}%jBnuo<1Cw_kX2V2F6hI9W!SqVG6ce$`|H8H2-{K_7GEmg zwJc}R0;lq=wOny-E>+DgO>_=jv`%{O8OOU??EMtc_Pq((VUI3z9tX$y*O@j~%PQ9v zmXqoGz3Eb8K07100=rMCEmdxOP}&qORL06{d8!9(r*~)L(@2YFNiC>{&F}b-3>SQC zgHeYM&6lH$co4(RkbAEbq}Yk+QsyF)ZhXof)dUt|8r>rOfadt%A?O(8V{!9gm%8 z;f}wvHFr*r?V8MQ`xV)yxM|Aao{&m3IJZxhh9h`RgMHPd?p73^HVf{l6TYOTdY8mu?jaJ{om{js)sDv0zqGa`~?CrqDRmt0$PA~n| zLDWv}eznO8&_eMwKaH7TS?&HH9Jbz_3X*o!og>`MK!L6XN9t=ljpoO6rZcUfBdHDiv5lvNv=KFWcc&gFbmqY*0Rp7t%`})+nf;4P&e1r4ts=u!(7%&EzS3^6Sw(%pZ^38gd&DWBabYE=kTKi=C zC&qiA`k1uSb08ItYwKrSSELo(<;qil(8;^4C`~c6Kf3MNC$I!`cC`=fX(m$o7ox!- z6!1nS0=_W(2giR$c5}}Y^T@g``6ZsjJ zyNJ4IyLM7V+&*XKi0H7b2PjHF2jMGR(1zBpebU8o97eQC9N+^C-x((N!RtPoEG|ys za$kD4Z26mTgibG+lXUZg0hWpsvQ{6QzM$4y0UV88>>O^ZPU1!IclaH)G~d?HWU5LB zBYBA!%;(FVwpe*}WYb~woVd~r3Y35nk%{mHF zSg?Dv)uu~~87@HDv_i;R2GcL~#m__Tz2^uKWSz3ZwC|y$j)?G)mSPn2(K=li@dZ#J zFuS$$GB@JNy4`F9F^89t?{$*cWcKX9v@?ghQzRS zZ`4MWJcCrzuc6-fU|HRVfX-fIG?dz%w!|U&L1jC6cm|MsA_hR~YLr72EU^aEFg-K_ ztse|&#p7WFiZjfb{J;IQoPOuqw3a$$M2Jy>s7Gi42V1~JN4+$HJh{2?2hnmi zuE?i80sjzW2Hn!T^NSpRXz+J}B!9WffAf(4M38?`i6;Y_|1A;vpHSk!kpEEP=W1Ox z$N~u2t1N=wqH75e5RpdXBbn<4h~#Dl$dSmepcdrjt|8(|k@}EV!bJqkj$_TTNR^Ty zW_Du9QR6N{(h^*oy73REx)Y*)C&+NIalKBSoo!59e7h1lUzhc|asj+jIG#g;(?E@f zdz24z+hq(=5pKlN55au!oT+x|R59LZqPh&itQm>m3UV-$9AY$NI7bMD5Vb5?l9-;B z(uon zk#xyV|HD#2mQ+TPnvNyENj?(~n#IUO2q)C&MS&< z(brP>+k#h#wPTKh#$efg?Al`S_dACBFouBm%S2E^{51l{V+Mdh_V|)5Itg?bFwEV_0m(hye>})!A znq~Qizhr3M3y{Y(6YqHz=HRD4{EssCrnZ`TX*i^XR&NWc*IaELko?KYWKC#odcfH* zy83|dH>(9ilaa=i^>Ai&G(hLaCO>p50W%s}(GfESn$1=9cy%7^$g~VDrt_&<-`$yCO42Pzep{D2p(+7Qt$U!QeBk2$T9}lg z8eEh4J36vvA@mM3=J;0G6W`wlSRWtdLm`NVH~GQMZMrLBx9;H?T>J`K3NI98{ht+} z#l@LX#uvf=ko@oTKLZ2+K>n}&@&B#_bo<9{WK$mYdn&AZx5p!c3n(>=jMR*s$6mr- zK`*;%uUdAT=Vu)+1}Xr5Y1#;(U>ZR+mbH4lb{o{eXY z9edwhGWQv`D>|cOueycfH~Vu!9cV{bj8>q1Th6*Q8eTWgEAg?Lw&hYU#+vKi`^n+!`GG87_(Gh!o zc&HA!;N8#P(w+Q2#k~bkUE8uQj0SfLuEE{iB|vc35ZocSYj6U=-QC^YT@x%=2=4Co z7U$f&OR{rb?UTRi-(wX8lUdchs%MWL-yEa+>-pLDR;|NQ8`)A48t}!#p2%&7X7>-7 zZ00SVALUC&WH<=)cBXr+)9ab-_d9u}70!xqukl+4k))cNWG$8pKexi?Z1*;?X{i-n zYoE=|KyZD*$ZL9BZ62}yxZa!ncDJ!~3;i(Seazc6zOEQ|&(GZ>{#+Wjv3&PkBj=^7 z-_*5xZPN)Z?apo0HlxSE{)MnQE`&a=0DR=hPk!$~$$+KhsWRjT!ZNV2vHB}vz<TqYyUMPMg7Q4(_5H4^;Xv1&<=50&Yg)ENOHphhDG}1v}ZzV_-t;hzM6Opyvc7F{=bcvE8oHCA$6UC$_0 z1rUwXe%r3uzmtS%HQCufnM_1?mv4KwI)Cmqaiz4$mM>O^9lY_Gi1u7fgPe^CS*MC< z6?FtCNkkRIV&;o0AF-0w^~BH%XSpK2^%Z(rf9L5t9-Ugg>%t{-|FZCyFsf{?8oY!g z`WG-8Ha+!dgD)_6$f7g-v*KWi3bMIHQ@;6!Al4{D>fuszq|h%ta)3=XgmtBJNqYxr zp6U6RGGOfqZc1Me*MlIfTEENc$dx1Z-cSzZVi=BQO4h4UHOHhPhObk!$x0cEhg!&H zc_SIt8y=9I!vxYaMAz|;-%P5n^P)J5_sVZ<`_J zDPekw{MMCB2-;a5bL~kv^R1d~J6IT0$XgTyf02ao)(*cc=3z2;T;_b zL8vU%J+n$40{;z&_sd~o>dtE@kOCw)B8ugx#*?{}=Br8+c6P=EcvimMv8^eDJPXjd z44kPMh#%{GlDxu1v&3WIziKaj151g@6t^^v_Ax@n_et|uEGgXYFbcW3N<2RHX?wg- z!n#fv&J(Hc>spmFKW>0S_<8NZC3Q*~P z3|o=>f~|bn`9u-<2?U7X~VsQ(ZIrivV*eh>|R@@^eRRG zpcQ++&+Ln3dfRv5F^8kARWp->m60{JOijz9qhUr45Z)S9vXrjcRxpT-5&}@zMYKWf z=D|4uq(a8vU?J}e`NTZ&OB$`hr-R$D%zENFL)2a)u(=qF17i+^cEjer{J`fbDn+L? zSCoDSJ7=8TR!xxVv>)#C(m>2R4DGCJclQf*9GzU=Z8SIaG2w!s5B%kA;E{`mSksU!Y){k}+)yoC-09#Y|fm zFIp&$dSgR>(GxB{D#QLN3i2Xp3!9+TMt0HY#>%YmK#QPx6KUaHhXu%YCx7QKBMkO+ zJMa8g$4K5gI6k}t?1zM#%}L8kywl{5UT`&qwJy7PIA9R(cjgw^1PnJ(wN`w|v!}Sn z$H7oOnXufG)5M34T~UZ>`isu3>u;9Bg`@!)cl0s_7WU_vL%czaoW-jDc$ERBj1*t( zmS+N-ewA^-6D18ws>gH?Q2efZy;>s#n-7>D0yTq);h;EVYIXDush z>AAE=DdHv)f{EWUAyqOHds=(X3jc-Z>rCQyPOIWvNHaIGWk^S&gPCzU!I@O+PxaAX}Ji=h6&}Oy?xYG3>&H- zt8e|-q-S=jM)sD?%tdp?zhpxIFGagCe2 zJNax(bbWg@YM8g6YlF;n|V9F7Nzeak}*N%zs$OV@UB12P4-IH@f(yDpsS zZ?Y|H)N9iyf{b0heYW`?Fr9ewkTTQFCx)$2)271WwtFYH9_Tcad|I2?o59qmoy%9~ zM8l;g@NIYU*=Q@ZAF9R(9-_rj|>9Pq-U{X7OF0`BI;W8$PmAWatArO-({awqs6Dr>XiQj;xzg z<4r@ct%Nbizd%{=LDV%cz=NK===c5=3s{lZ!iFE#qrJ+e&vT1wnNDtJE{7un zt{1C$ELJov8y7>ZU78VRuWg!kMGqBkPWAo_k==j#Uqm+c1Cd1m5ZTx>MCSJ^BD*fx zzcYh5e}J(8;4#s(mg9YwR^z+EQ*6|%c{sFF6QsDCVw&hAOsIIZi1)#U?ZZ1f-nC{s zEol*jrFUBfzUBFoX(!e%F}k?T9`NYr)7+G-Si2ni82iws`vhf%rC$1i+cxMfKpXgm zq@qa3bxjQUO)1LbWl39ii3F-seW-wsO_qLn_=p3tt=ac(95=6BnD&N2Amt^TLxwHc zEs~~p;QRXW37w|=2!30t-jtVygP5Zg>eRKNF-QR#lnoQ3M#Es1lUTX0`WAUEuOc|6 z!xDAi6T&7%#7M%3*Dw1i)h{;>#ek*f^*z8E1TuqrPC7!$TB0 z^{qebBQD`Sf%-sz97aT`3e9YyfL424h|0-Xtr%V>pewmN_6g4t{PRoPG1^8rUN+5`r>Tw+jl-RBoIL z7B(yGB{%w&BswQRUylgiL1**(j^&cjOt*DLN_eU@4x(x^Qx{T z6-x_~ZM7jMgeNk?Fu7XFeNY^ZEOs@)%~ErBr>Gli1UzIALJ0Pr1m+?M^g{zrK_C5j zwOl}BqYP7##&9*zL5+qZ#|e8`Nf;!QA$8 z^Q^L)64}mhHfd_dx5Yw-q++q2m|c(jupf&|Y6{9K-{O!IScSVCIbLkveFHJUsybh| zq=zIWSWHPss?{M{z9`xYFlVcp$Hz?_MR4yaICz7#A&XL4P~F~5SWx2e)u{)~Pw8bx zYp4Y;zU;~Pns&JrC~2idTEILR%e)Co)TQ3+n|}Yi*$f6!kI)vK5m5$mnEP;vf&thG z3XgJjr%3~&bcxFFE#T;4;641xG#nVpnnpToT=TLH2jB*I+3q4Om!few(i;Jnq9u$2V3K+AhMIv@Copr*{*zF8dhT% zfI1B?9%As0>ee#D<<`9^&)OUD0*|}(+YUZ&J}GpW*J|W=0=WIAp>?;> zF=S*%@6|7t>el88KzJ~$w6WQH<76i#*uOr4wPeS)ff{KkncQ2Gl|ZCr`gq)d-^Jns z>ydoZ{1vbr&D;&l17gEdeE5Cjzz4*Yf0aZ0-v#xbMQh^!J|#61y1ZfFfF5o#ai4fK z&`=Y1t_rqUK}@q*|A97D_c6WRVAW6P#3n#mWMM;5VV1Mbc2)lZW)C7cx{hz@L7h$7 z>c$9gD94hX$gu^@r!J+uF6- zcEwcJN6pYGb|jlDH_vhtxT9ztZxgF*HughCsc5oeSiE#GcJ$U)PdsP>Yf>EKm_Fy% zvnjlyf0#=M8BJhoU8f&`bZ=hO7&s-pcl_F-v5>~+qIf28SzkVuI2JK~h-0q4?dtDm zB9*jM2XV(_L|ZHkReh|$Y2GNgHs&)Q#^pg<_~|`z?L(3!w|lK6?(zfu*o+`{4RYEJ zNz<-vsy;H8G1GR!3Qm#+3XJe29;;b@ql5VE9Lwd}SEnvdB$KuSuG$gWw&h6$sNh#W zad5h!JUpNQT&j0lZro2>m(!aP@o_5%R z`9ReIy)5EP>jL%)_H)?4XjRME87*Hwx(9?S7Ap>6xt0E=lv+=UCV$_GY+PM{?Kwm%8XkU;hztz!rFtM%5t%>1 z!3P*&&2rCc7vhjg0^sx-1V=mChwV;}hQ$|}+OTl?Rj;s{XQtqcS3Yi=Od+JbY zhHJZZLZP&Np=*i38>Dt@JZcm)bF12^`Y<*wujE@G&qyIF9n)S;KJE!^r$j*SWTcT2 zxpZ+8J27QvcNDkXh|RuOaJ%@frgdvcd1_~X+J)8{E7~223$xr8QV6q4d{3}8+?ODd z$P0%My*ESg5*nl#{8(Vnn2aA9HjiV2QQsS~hc^+Z#zM|&R@$^ET1M?dihx}i(d?)E z1Z|o-r!{PYH_O!)n4Xbyy>Yt6R=mxggM54v0+kb2JVNK4dNci@E{@LknRh zC4hV(5;>FuISY->svH~(t;|ZK?315;bO4)49;j0dMP5TK2G$^fdH~@YT^7E&yK2IITy~Oz{+P1U z_L7TO+!9(iOfJjslYA0;qiBub1#nANGgs^v(sTm~ru$Dxo_)2wMTbM;AQ(Vn{AiUh zCFR;fzENj6Q{MQ-{X4~e?#F9`TEk}Q9x(IOKa`J3D#(o8!<_9G_jZ!C~7o# zr41UQq!vU?sT4{-deK>wZ2uaS-t;t3p&+{?zq>;@rpb55$`kQP@tbNTdQu&x#!I#J zu0;4$*X@ThS=c=2{vc8%et1djaU)yiT9dx=_imBZ(I$rSA2XuAH?LI#SbfD12nIhD zwZ`&un6KXyxRdtI9i6kjEJ<`TMJ{IP3~+UzYGD^}{Ho`$XBEkhzV*5ub*+$1Gl`R5 zrNhD@{kV^vD4C$kqs*5I8u_ykWAv9i;G>`q7AOaV7%XMPfl)0P%FCtW!DGn$h1di; z>|e=<5-ok}^vh2fVdILFtsr$N_9n=4C+oRXzbTVg@i(BoaC!ue;L5Canu7kOKC(`y zSx{5ostm8*1E8~dixHp>u3mIKyx;bKn5gzTNry?!cC(szOEfFNfy-w^cqFCjm>3eI zwJDTMKB+;xP+H28MBZLAFsWhWNQ_OZB5a0Yrb)=Je%RQcA5ouHGjB?gU1am^vWpF| zplv1Si|fK3Ze^&(?E3c1>P8?C8Kf0Y>dN}p0~SQ(p&)qRjP-_QnFqzHKBe9kwgsBe zxff=#0TfHOU@>ulZge!6NfMGN`ZMCosMO+8ugDan`$TLW{F0+7Pz{3nio3s+^ux7= zQwbb@**b;kvWL^9VeI+*E5?~=)KfVHM3AQ_^85G#3y3^8|Bv|c&mta|fA3Ef5&A!I zoFB|qvPsLK>=xx^pef9VFF||y87euwtaC7_phCG*uKskK zt!od2Fu_<7J%eQXe0%KkQruKFM?>*#ll~|})djbTrJo;@@?8pfb;aKPD(0&p5z_vQ}oyB^6bhED$FdCk3HO+QiJhX(|rWjKSOcx(|P$XuoqE0QAJkGXFhIUen z@*E}V2S$wfoDC-M$SS^-&uD}fAI~q`h)kO-e`YhoccFFWb1m=_PR^|9WSWyCf)cyx zp-r?5zqQ}e(G44<3$HH~QlFl*99p!rYOX&q&OOOYj=RSd*GedBXj6|p7&CSyvEMvT zXo#_~B|A%D+fr}pubK48A>B6J+AEv9T+?t-jysa#wm2wZLhifU zt8rrmwg+^rP(1v7mRBHP`P*a~`6PfgA90brx2F-O?{VhpjU4hDkOi%~%P9KHjBYMU zgrAU&5&+qF3~))TBpsZ~I&tBwG)%RceS_rK(zgN~bXT zjrCvway_;64ZgI6WczhTE$6G2{d1bkqN%NUtIzgq?>RrO$OO#YWV&i76`|O+*?Rlx z^pRCW0dob?M>8aM)9T-{LlRMd^vmhK!;!ErBWPDZ#Lo_O0LgA&XD(}iRU;6r2qzV= zko-dRRosGWT>QrYR&9YtZkON5{7pdf01Et%0h;&!18CG_UPlX{ zrm@|MA^K%DZlI&4I@G-Cki^=SKo*AJfz) z`NM<$S_0zt#$=Mg6cCMk)7PoC8)lK9;@d?Oi6?Fo)M>@P$5UNJPnrXt>WHcUyF7GOBGm`Lr2xgxKIO8iBnF4hbvd}Azv=V$u;BQ z77ly8y}Snf$P+h-FFv!ifaPUb2;>UmloOYrqtq+vN^V2fVNA0MS`nbvv)u(8PkXZq zTxD-gBpHt;XnE|zEnBsEc9}<17ys%7gPh7?4bVn)cDRb&qFKWID|<(vNns+i0weTY zFvOAg&w{Yu*zwAg+&J&RUQ`LTD_ZOgM@he=dQBi6;^iAPVe97>mZ~PeVInv&RMD!M ztFZIc%P9ck7(Oksvn>O)?O^)MF-+y~qXxYVzoFf#QB2TG{rzU@5^6^`iwrQugcD5Q zdkWA*oUldvL52k$-WOFSGI{|1LR@K+J{<#4wEm0Qk(SNquKYV;n4xxwBEfYU<$MQT z8bkBRX1)pQVx5wYIv$}WG-!lav`p|k?j;Fg!A@1G^5B$KbOh6l^dXw>1ep`L>lJVL zj%%5KnCfrL@D)Sz5jgTjYH|6J3%M#IQ9$cglk&H=fvstaF*U9fxJ#k=5BEdTJcgX- zJG=*Ou&Au0T;;f4>o}rT3LIEvo-VjAMM^*a13K)JT8;pCfB^&-m2 zNU7mg4z^kA(0tzGDJ1s$<5@S?3cPGy3+c7ImM!@DIjrdqlE6o73I!tUA`nWlrsb-B zZfu;cXzQ<7)D&@qJaAK7dfXof=TMaPtKkcwBlDE6H-r4>tG;p9#!0V6KtkydQrpN7 zybW?K>E0*mL8wX2Pk|R+fq;w^;SJf(6S?bK6|xwbbJl_xthINu06O>v^S-i}`Y)$$ zSQ7iXpn!s-r-1VNP(up{LQl!Se|e|2GW%z-jo-g_b5w-JT$sS2hs%naGP%?YdiErw z^Wx+qwPnJF-fDkc^jPVZ+dP`NCcC|^*DS-P-chEU_@?7Q#X2&>F5|iwx-8}5ilCz5 z`QUzWKR?H0)`URbclxzy_JN59#pAV~Or&J_RRW`L{PbR2C^z@U!&nNHYO1M>qMq>- zhh?hL5@E7wHjCWWeQ(zc(K&5u{jpSb5Sh}U#@hX8mWk4C>CBY*Mr+1UW>yJrfd~P? z?oZK{a7tPG;H8VRN^cnugKcLp59CJGtUz6e_hyn`sW zPm{LHeq1yZ`6Rd2z2-E>D`sGT>p?(P;9zi(0-Wv1;ePLmQ-C{ozjMX^E`9151lo)Q zKp>W;a*)W_>XCQ0rmov?-k|7UWuZ;xkM6^L%EHiswPJ_EOsgtkhjf6{@0k6XZRBn! zq4dVi=*A-Cv)dU*oXp!Z(t|NH*hV{hA22R0#4i#mHBF*MCH`d_kpwSbyRWiXqKS_z z8hHh3Z1X^Ky68W>lMF4%*9nyie=83kr|dW)7Q`J)#92Vz0{qyMM(>YbsKDyji}%ea zOH-~Z3YDVJ1fZ%mRSb$W1%!cKN z`s5r0CfDAh?R7?mxzCQk2Frdr^j@6_4{-pb7EVl{ShAbzt6VXcfgb9O1m=MVBvoMi zk?zJVjfVZjN>e4vF+$=Sx6#{;ov!^lv4*&}vRI#w8$;%*PY&(e#J91Z{9z;%yDb}l zf}WoG@BQHx5VUarvp@VzAan}~_KyJ}%O60fMFv$4G0hn}EIfS$-U9p{^vxI5amX0Q zItXZRRFYa!z{U<14NFBOL+@aBe#R#dSZlA3#zL7Bo!a~wEj&bEEB%0dovUw)6)P79 z=zdP~&CaLCuBV1Zn=MJ8SEuX+!*QB}sc{sX1xrT4OK3FFaxsi1Z9-aGog?NXUf!o4r&MS`FIrUu3Q4@6% zTVOI5Zm2FSheDcIj}Mj=w-68{t=9HpJ0->^H0QugZ0~XjfL|6Ff_;1_To=rO>#`En zh{i?$&+IlX`*>t_ddHq9(V)2T3K1@`*@hVu4Yi=Ob}mRJ6Pwa%$lH{|SIXAINSWPM zouz6zV)?C|&i6N4A0T(H34zuS0B1b=A0|#e_lnPj2#;g->d@has^Rjc7evb#mAZmm zvUh~X-|=Iu*bCXN9!*qKB*z|tpn4|*xuwG*Iq@Xlro6TbMa(X}*Ex25z**|n&`ABZ zl|OWvX@qUfG3PifWR)7ID}uF78kn`uq#&d|0$~@K0A5;3#!{6i_dPB?{wnwC)6g_D zDg0J2-c2#|Dodsd-gaE)F@7MbEVNX&*P~GlR1|#7)|a;uuO_~hP)+eozRVP1i;hlN zG*cQ~!QPhVPIAw?!y=uLY28zVuQDK4)E!3 z(mK&Lmw;QhnXhA%5@F!)&4AQ=54H-nBG@zq|4Qe2ykF)4Ic1)Gpu-}^WU+(9oFxaR z75=XacpTF@RLdT1 zWNyKKspNThRSC&3MXW;8G3PK27V{z`WJwBLyR?2l7sN09ng#u;%}WKn;I@&>G!dNB zn9^8XeSN41I}d8%^jil-Yo#NybqLf7JKcEaDLM&e!uME|!<2dH^4_>_hmh6Xr>`uf zXbDvDzp7*NLDZyo*PdO&A&H~lAgo;frFC7mZcWQmN6e>y^7~Lj00=_Aec}4o((}&( zp@APj=wHQu8%uU`Cw_-pE!a5XgO+hzsKK1``%13vHK~ch3##YK2J)951B*c|#lnuQ zzBSCYe6jz$%4ExTAeYcSc(*k^zv^1M8JFX!XBO&FF2qMYR>|?0teUr4obJC9LIgV! zF!-`=i{_I0Z4UYB!sUEN2K#iwYSNd8FiGt5O&CoSC+GF~ogA8nV7v|tvSyC?-HDrg z-43@V@i$~538h*L@zJN&=O`C%J<2p|G`Kc6Ig2k_8m6cujz=(Z!{sLpT&8s`TUc)# z9ZRCDID6+E$3%_8C;FU|ByBwM4u?4O%X2nFyE|{Hr;OA|#XapW&Ms=(=$zRG$!A2? z%32~-WM$sGAHFQ0wMAGy(@_XIZLZy@nvpSEyicRZXfvipJc!~8$v5W?L)5%NU+_zlz1yiJ} z-zL>_c}~?0MR}>uz(k^cqS>{{GJQk`_}7z<{oebk0faP98LeSiRYpE`y!w%T5 zhA~7Ic1qx_ztW)?js(AfMjlRtD~19vSMbFQ0lFyLe5oXCh%V^+e9din!fDo;GSJu@ zt<_tTa~hh@3n@C5JqJa=0!dIos{51sQMzZx2W{M{+uIMxd-UTK$7yI&7FYw zgSf8VoyS~iALV0y>k*rG>74Su-Xb?$R6Vys$fBGqk%xSI?B)1D?dA!s5XfOh0avY} z;n&n~Beu;dY#;p^@_KvTz3fjmX!(`oEsUwm@;;2B>#94Ob8SJX2k!Ff|3K9On9C^G-djZ)4 zHDsJ4p{9Y68p5h2zWRrzfsFK&#ZjXLTi!k!r6I_A5WzvAE`2iQy7~$N47?{nK?pIy z86g$Zp0e6ZyUVe+e9$@yiHjU&*&_p)y-6p0WFg}WkLB<02*T#ooW(1;bK~;OgBiu% zg+_7v6Creht$=h%Ob7u_vV6>!mF#VXlV_BORexEeH0Z3<0kKM4hM*qxSX~C+6xckC zwStL*Lk~*1k{tM%w?2KoL)}|Y64$~NqdbT$_>?u%7h*OZvj-|?h#!kG5{Y}P;qxH2 znOAU;FXS|1{>RKRBUyI3Xr<81FH7TaH9;7_;zIh|Use^9u5;7R@@{TT{U6zyQ#awZ zvC@t9RjfoW4P}ky%~>B>CDD7lwY%;zHSb}bKy4ngOmQ$^m3f-czn|;0fICmcML*5; zzX@e&AtwGYBFT(@L)o5q3*#7rmwk(KY84D9B_kQRRncm)_`w9PCt2Q?R1gdy2way` z@}i0#vhxU0+{jA21>2Sc$HYRNP4v%&0juB@o`f-8aZ9jGQa77dv#`B?a2z{#;u~{z z7)_wyIZD25EQ@=*Z!5b!=g9f&V|0D8j!&ano}OD&w9A#JUTZ!VZYZ1@-#aF)pqe0f zrHr=u?yImL=5aGYLu>0p25QWEB?$=$e?{#^y8^9vx&lT91_l`e0BM6bba;$uc4nro zf3(YFb3g@agZhzzE?W4ct?(iLBh;sl{g{KHr>Dt8_S^eXQAtR}>!ZXM#5PDuI1IY5 zl<&a$5jt~-5A^dhvT&@mKb)!r8ojR{^BGT*r(DR|a2A!6l(fpqn-UcZ+|m*x&dPaT z{tdv=I5%zfaYPtE9qEV3!WucXFgvRnzD;Z_uO5{lL}08F;?ggQu}Z1z#15d&PvssTWo7XK+V$kBm9?y>sSNuvIE`|F8SfW^62b-el?aT(p4QV zIPIW6oCTv%Sz_YiYRT}xsIoJC5A#S#bra{=ORHtdCzCb!;oQR$0l)>ag5v`$o_vp=&y1fJzh@ zrixByx){>SHCHChWA|XODPR@ys-(v%>C7Az?(J#34A^)y<-2*&ijEoQ6FDqRaT(e} z81MJ;{BywW3H%JL7@}kpZFE#rt`^I!?rj4Hd{?RBIr1{=0Irdi#^$oJG7K*XJ_1^l z=Ai4B7yQ?8GWvQ%Y}hR9FJ3h90C>oN2W^&muF6(NC_lwaLig9l7VlhqfYk%7Ot`B~ zRA`2EVc_qwj5Th=6oPng&InLbo@URe8ig(kXvl;bWBZL3w3fylT zw@I5C(OWi<`AwqjifptrMLsfmdaKl|L6h}*?1RZvGgbEYeqA{HHFYJ#;2Ph7lUJGQ zmG2oD8RfgEs^)cu>Et6KEib#yL~Z+3A`8W~7B^dE;L}4#Mn;$d{Qbj#n)@ADG1FPS z7?m%Fg!z{{;@-U#(jr@;9OQD-AjCxO3%ZTRo>y+Fc-1rRzX+v&K>PZWSD*C)$Q4@J zy|^%e8{R#N{-{>TFj+i;@<;f3lLW1q^UKS&v4)H6?P4%hg|?4X))0AB%B~%GIXO8` zt)MY=-)3ZC`Sts@wiFhcPL*mkJphD;T7Z$P5(8O>!MquIxW8RA%C~AlR!f7h^B}8; z@C|aH^<;X{zJdsWa{Y4c4sB8@_rPbiK~UJ|{17WU;|PWLEzUrGk4HSKk<7;C1$YED z4i2|>l&4*DN9)nFzBkkjJvMVZ(_6i$Wxv%pAQYvB6j==*)3jvPl7demnWSG9N*HE4 zQHI3}Ep-z=!;Vy)ku0RWOl>JHPR3<{dPmv#ZEz#(LqRu%Z$!+Xu5l7{d(8z}$14xw z1v1Zz-N(9OkrS@6riMV+)lwyDtq!r7d~?=YZUy0Gu$eV+rcL;Xc0nOBU#f^YwM9C; z4~8~0rz50qbrQKPV;#D&q zC?(f`#P`2pk0iXXPo^d0~D1pR;pu!bUBEYcl!+z`JyiqNQT^C8`vahaE2ThBg5-!9ao+`H&R*%DW6S-E(a zeA~)jrDLLSW?4sUXJ;qY5->gO7(<19Y^L8r40k9;WbTA@zkH28xvaA+=?~zLy)C~y z4J%g~>0wQ4x5qTtbd1 zukK`J`{du^>cX^|%(p;(E8Ef(7NsZUe`$-h%#(SV7RPl6MYYZU81!}uwcBbF#4g24&P z5|KAKGo$!lUOzlSb2nW|z;7_Mf4EcUbJjs;z#(A$_DUPv{z7?jCk(MUa4^#|(BZ@Igu6}ZT_rWs{1Co3x%$(IV zIx6P=y^D6i%x=@#sn_6wX$_vd!;5xD-BYhrNZ}rpMrf_WbHl0zi8iY#Ix@au(85=* z2W$vqx>tD89L%Z$eWhTir$5HMH^=lJPW&uUE{GjM{AgxtMBD|re=)Dj#-r{F>Q{mn zjrZw|B#v>H{UVdVrwWc^Ms6=4L> zgg1x-!D(Ic-ru=j3ua1^xR3@mMxG&muMg7lnsMF{&VJ-J?5U06VIn=t|nY z%%6rLeOfXxHIqU@4|5a-;!!!Z|5DEkYgp*^{p9%~k5?3TUypjpg&3o^kMQ?I|MSZE{i`sX?5C-ldW zB&}kVZaZc-`CeM2n!aQyE0$Z?a(S?i#Q8=W_h4|!9?Hf_@+E{0XmTr%H}VdzIe+p$iX2QtN5A=EunP z-pBq`#h=;dc|)e3A8sE0FB<;DM$a1@{Os~WgaEJn?|MA_YMtlg%1=cBKSs9qSIYkt z{%3Z1&ieX9&-`O#dp7}A`~Ugke`1m6oSaXDKR-scw+Aag@E=jg{%V-#jB`JGCI`n~ zbo`lpo>P83RXF|_+1_ouzpD5XGd*Waddd~}F|xfg1OW1XVM(%eFro$gC@I1LLHwA# zPrvP*V1R(Z&Vd0iSUv&J5rJl1N z{QR&%CI45!e|4VytDT+~QvV!=2&8{i@n=?gUP}9O7-EEI_&+ht^LmG;LYE&S+gn{5=&va{|0QwX zuZDV_{rprz@nd9rTj=~hwEdaco~OS)B~}38?e+psG z&tsnwJbsL9Z*iOdsO!&c_x$kf=Vw&y@SjxuiTR#y{Qn%48J&TC-t7Ow_3`;O#?NaP pp8GEv{>)U*-^G5${*@noR`B->1peabxsm`rqkwk@>AljY1Okbnas2`2&{#0 zJeC9Fvkf>>NOF8I7~FRpXDhNI#6SULWh4h~BodjD0UgxRXfzzR*X!kkP9zc$IYlnK zjbhxkIr&h2Dq5;S8(dS0p5>$~LhfXduzwH{J- z2Ecb>^MIZRM8#LS3SIB@X0y3Uzi-tqCqJwMswGItav_z(;XR*rYqN-hO$#j6jhAt3 z8HUW7(@L;H8;c|VYjbBK!wBv6+g3L{T7v_HtsayfkW5P)Xv1~gGeMBCIq@<)J2n_} zsxQD7{C>58|FZRY7mjlUXVL~Fb)VI0^@Vf~C__Z%BZvhqdZ%&xefdJ7OC)+Gh`N&W z65_atU4Ykl>OwpozpDWkC`iR((Pa$IQ&f8eGmII-Tvv56Y+~ z=F>UF%wECVEg$q|C^lbR?rmNWK8B}uWSPj9B%9+JuIYEAyMy;_o@y91udGqw=z9Kj zk{sYJm;Pn*IE*(oB-D#90Mh7)K9c+%yr|z_x7+P=iXE_C_Z;{sPPc&`XEJ_hgUCxb zG>5B33GEns2;R$P{SEa6f1|)V>@suuoH<>?_Z$5Lb6+My-B5V700000NkvXXu0mjf DfCpVl diff --git a/pandora_console/images/Header icons v1/Auto refresh@2x.png b/pandora_console/images/Header icons v1/Auto refresh@2x.png deleted file mode 100644 index 73aec57365e65a0ef3c2860aa1aac8a848ad0925..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1838 zcmV+}2hsS6P)pQ1f zwrtstW<;Kt#?MYuSeZijRu$)A+C+sJ@w_0pzP|pU6qRvRN=izGR9?Dtsa=>asWLG! zF;8V@XJ<(YkCkeqqM~AklzP&FrIE zn-Q$#&Lj3CauHP=F=7lVVFbtz!lfhbWT>H|9B^KQ^H+#xak$Td(4SH&+@t1sMoUXe zZ=G;907EioX#ckBHK}IM@Pp%UKG#hrnXj9Z*T9g zfa&@|a+$-{i^(fS5(~30VAiY%fP1D-pMLA^-Mfe52>7kVZ=3XN6b)bVm`?=IlqzA{ zMzO)ydGb*jTuDzZ?+bx(Qb5@OeVITpz86L(DZei(D|>C)fcA;)6v1p%9ynrZlL7=ZJUo1Ycc$zlyer8s zu1jRd$e#!351b9GmAP3P4^FBJ@Td$--nE{?EXlBH)rbPN*|X&pO8}~2;<{rX-*m`} z;u%x4-lGXA9pE|po9A1U=yC|CyGFoNH!dx!f=^>(<199b(zs(d%A70LvvvK2!yG`h zx2+=uTjBwn<1@Hc{W3B#Qo}2=+hEKuQjwBw_rvr?bI4bcsz>PE=e|!4pp4DU%`=CF zhK>Nd$agjwpf-RqR`<(9K;OZaVP8XCC*CT`JA7Lq84|~d`N7txqHv2qNMBfD02K^F2QkFVe|( z%gf8(o65Je1s5tyXsgS>INy%qZz^hF8JSs@LCON9yY8mTup^eRML6M1peGUkA*=R*|CWj>H&97Si8f z-%ExMv-cvWHEy%|qy)`Dr7ja}DK9eo zFHrT*Y~QUY8B$t!Z*%{9rpl?AGGDudNj`0G5`Po07*qoM6N<$g7JQ4YXATM diff --git a/pandora_console/images/Header icons v1/Documentation.png b/pandora_console/images/Header icons v1/Documentation.png deleted file mode 100644 index 78bccad52a55abd56bd045beed0ad5438f280029..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 466 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHid{Wj978MwpHBAm zJ8U4(n#|4D$kH+UNjme2x1tfx`0lzoJ#rCIH1pIusI*(FJ8qHZuX&d{-(2z9>l(4j z_VLd&t9dh5aA@~EcFg{}Xl23I+W)3r&tp|RFYz5NSif_ow^d-k9hZeYSN$it)!xxR zv1{Gb={)@gM+HhAeT}~?A#e6ri1{AQKu6{1-oD!Mq)i~Ei0^ODD zdF;&D+1c5L?QWqpo6Qf?>GTEhrBdnPZDLqK{CGSbdL;?6sY-89uh(bN(vcvQyLTu#9^S+-DF*a09Nz^K7*0J(1g!c5*{Ca7^6#h%8olS&dM& zG%5=~W1=$5iX3Jn$Jn)s91i4IxdF@N@)HTD?qzvkN@EM3JHmL7;KYtj8T~kk5O9n= z$8qF$35-9LqtWOqF|SBEZa-;j(4%*Qk}gRvn%5(19(%gXcM z602WU24f6*A>8=g&0xS_)5U9 zcN)kI^+WibRjbvv?RJ~~+)!IqfD?FZvRAEE+e(szbbqyFZIVwil77GcvDIp&K8vL7 zD*52eFM;vuaQJ_-4f<5-*TJKF2Ke2ut6`@uF`VdK^o#<<8}1PD0r#002ovPDHLkV1o8(d2s*$ diff --git a/pandora_console/images/Header icons v1/Edit User.png b/pandora_console/images/Header icons v1/Edit User.png deleted file mode 100644 index ad2d1c5abb8e7bfd49c1cbf5f1771a039cd7548c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 826 zcmV-A1I7G_P)35i1PMr>~$trWGOH=!U17D>H`M=xT*_y<%-NPAYnF1E6PGyRf_Rr!!jjyCX;zdz=Y_I{9u&g@%VGT{mo{xDr9rw&_l?Tj)~*CtJmwD#eZ`+99{=sl57`Bl_1Mx z*`Gb8F8FcLcjxvTQk_MuBaaz+z{c6j=ktdJgzX{r2h<;YMZxsYYb*e~(x53xY}9JC zGb#`!i&8#7W(YdZw?V*r$8n04O69F2+5{BYgp}h1&RfxF^bkAGpueDZuf2-w>_{@k z4FcyNTJ@C&aEk=BTNqEVwhbZpt2{bLoUC_Uq#mk=+At;EsQGNukm;~n1T9yq)fv<0 zV`REJI1eDtv4Kemlx9HCQ=36qz_}m}bAZ1Azl@yGhv6f@X*0;suW~p_Do{X5P#{yf zGcLi%9jW9r$hj|Mf?BNk8o)AoALo1|5_wiCm9|GIfsR6Ixo6F^n^!xp9#O@SP9QxAeAi3udO>5hf|7x3@ z8j10>&rH&*GBK_1mg0gGMcJzvg!jwlFb^ zdi^24ggJ>FL&lgnh8{w;kYA9S;PRKT0?9k6603!VMQMUOYj6&&bHgM~KUl$>iIClChSN z`D~u&+c1cDn;E-(5_jht8yhD{aQN`yO}NpDq;S2|R`wQS(V|7m)9Lj4w!j`U+k~fR zm>BHGU>ROg@b=>2IU`FDR}o8lK@8kJQeIx(no6Z6L#~0pMSLM<%vu7w;bopy!QNUK zb)r-wMRvEOwYBx{Lx&E12frY+JVr^1y}iAEsW;74H2jP{q$qbr!<&F1=tD8~_4O$Q zkHSA?>3BmgQ`m(CB*HhY5c&jP8ODX)f@}H_N`^H^7}G*KgTd2CUosjw_P-Yu72Vp| z*?C&}uICFSB_$Q@?d`)kf@zOlMfXWxf4$~>3}Oza?RHMvw=NJnJ(qlXk9p5R)}oAc zbwr!x2#%Y(4L(p$lrg+C`h~X40EYJ2Rv=-&uxV!;YZohEYUK_{Kr;QE0pScn3FgTD zJx(q&3oXC{d=0F@R@P;+^mTUW2AOu5=%_}NPcVzEuFOjt0Cr)VQL|m;Y_v8ul-M!= zTt&N?;mm9Rs;d(xPHbvxYYUEk2B1KcGIYxUuA{$!ekM~qL*GmPC0`o_X1{dZ768`Q z*H;V=4qgOB<%yGBh+aV1fO~bYAAGW=boU2jv&k)dMDqhfrY4J1kqhBjpa z-(x{y$AJ-r?zxpja*`RWU&YG15Z~He>i2>0#R`v8!M-As?czFu;I4?<;nyIP_tB6^vdE_tl()pBUfl zD~#C@(M?1>&Aemu)b{G3j@X!%xe50W&?;}2y|R-?cyE*3Y{Oba+9)t_gNiLe1%bEP z9+u!C(OKGW$TtGiYU_mnZGpyhb#*0Y&z`-Hb*f`S^zzPnak&^#G&A}Yeg|J$Wo6}u zdIU%5iI))|n|?nt-h-?n&ge?;3HmhODoX1IHhvHwiSrhMM{S`$PO*aT@a-epzA~vC zp_da&cjLgoz#U*|+aF{xrn-g%x*I=D;wLbeM4tSD;&h{kLO)mFlBnmb(Yc&G1!DpJ zKXqeZ`)BDKe~h5sa@b6wdQUow_n!<2w3%GD3-Ql{nwh8~2c4 zk8og?b#-;=+2u7qxX&Pz-(Ewn$-6ZOavhxQKHmuSvVWaV|HRO$UG_!*TFrOC-$3vE zXg5xftz)%!1lO9LLH+&xds(T6jne?zc(M!jHiYI%zIEGjVUJbGJ zW_A>qd(&mh7rvwSZg3RhvJSW%ImW+%=VJF# z*G-Sl%>B4WWdbYnqeE|x@7bPTmi~>cG5Wy{{jfaC=KOPFosP4D8mcdfFf<=3W89** z+_QX@qKtFjZwH6sSm%y!Qb#&2ZPcGHa82Olm2az;w)iW01Yex+=4`J=>!XSV^X(=v zofKudcEw;)&coGD*nj!Ga@B6_nCs}U-uLEKuPDVgUzk2hNtfwai@EjM=-=J7PQK|F zZ{Ix|p*=<)=WQ;@`JKKm=a9jcni~-d>(f@BX_+Mb)!EbA+y1`f-6*467m>gAN?t)d zF~u?8r@G8NeA9zXCC>BOn$KQ8t&QJ@e_f=e^D%m6XQrBQj>eM3C$GNYtcsJ4?%Tb( zk%8{@=F)w@g`@Ccb1& zufrO#%)bF$UgyuMIi$}$eO}4=@~1+{SwgqMHM2f#;q1y|44QuJ)TLINjDt&SnfAzopr0I*BhbpQYW diff --git a/pandora_console/images/Header icons v1/Header discovery error@2x.png b/pandora_console/images/Header icons v1/Header discovery error@2x.png deleted file mode 100644 index 9f45175ea80e2efae483e5f9895cab1872f56910..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1019 zcmV4s8Yf15DId z&)sorNq-W4sBQI#@$rm3N6r7Y;y zlcLc{XRbO)do!QDbVdZ2OWIVV!4p-=ka>6}ih2;P@b!a$i-C)41#=8s+f>kWc*XYF zEF!`qZ5cGG=2+a{j0kCP(8{l@y&xc){dc$%1*yrm7%>FYZ|1^26F1daZx=%{ zRycE7HM7={-(PfK;!Nm-26;HFCC0o9X_C`luu`_ zdj$75!H<~yKpNq7Lv!Qs(Xp|dmhS=-ft&z*pbQasJ)HZUNOX)4q^|v7@q7Lp-o#s5 zp5W-H%k!dV8*n++N~?qKhhYYMK_d` zo!x6y&fy#BQaqb|r~Dcw*H6CeR1ULcA=lf)OxCZb+Z9_xKL-ZdH-Bx60Kvtw;D{>< z;dXp_>Y=Gy1ZWC`mId7P!mvlw%V$ehsDrB%BxuggaAlfTh?7=RY{Wd|O4W-T%=h=V z(R$%7J9CX|WuysEx^U@y>lM;tY>M59kB={Fx$j`!wmZm!xhU=q8n~8G5)c}!ZplAn z=Pr0IysZUrzij0ft|Av7?AHRd;)-vIZy@Jt1==rr@$IjE2-R$)?qD@hGi~Y-G^0@s zU5{WjQ8R50Lj-Zv^!Q-WxXL#k96MM}?RX=;`L~&^AKj4N5&e6L9h*+fW^La=aYy>J zQ1IrW=nmAfJ^m%K2r<?zc(M!jHiWhpiIEGjVUJX6# z%@imwzq0O%?qrn}vnx5BUP?)NJvlCad1-h1g%d}e!(Zp0?C0Zhy>76mTd72YgZZu4 zG+*O9?R7JLH|gy?Ty6dN_u2PvXV0wdKA;@WYwu$F&-6_AAr(GJF2Ukw$_!#!vtKgu z@R<8QcdlT0sy$JSp;hO&c~*IcaH^5kM4|T^4_}MayLjTpH<2cuRK0JJ_dAcKRjs>T zSF@S>hAxYaw)&(Nfq<-6_sVQ92kBVPVDtGEVs^8@_-BI9h8&lQzN)|T60c=#o$>qA z-e`tJv3^gi6!t1S+{+Yd<8yC{3dh+iL8pRdZ2Q%;`m>jx39roeuebcmXDwegLG5Gv zp}zcV+y849iMaX;K8)bqeD3DbLJ5 zy}3=o9)m%&FAADVdAsaa8-=$^}pBmGS(fN&`>WR^5C@ff!^IFOFo7k$-VaQ0iWWX kT^?7r@8K4|bYa>V@d)mEJ+)s_CZI_3boFyt=akR{0KoLzb^rhX diff --git a/pandora_console/images/Header icons v1/Header discovery ok@2x.png b/pandora_console/images/Header icons v1/Header discovery ok@2x.png deleted file mode 100644 index d5f1f8901c8b86508e47702743b98d7c57716bdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1022 zcmV-D+m-pclR6L z`*fD^bJE$q&r;Yu?0fU(z2CffJM+Hxy=83clSqcY_9w$LG=%$mxo+jY zNr8^qtLj3oQ#Rj>&RQos6o?cfo%4#!vg4=-7~YprydE8@%z$6_`2&qTm(m|e*XZ0D zfNrV)dkc7_mziKy#zuQ6axcMXE#m{RhhxR*!vUBs`s)F+b!;L_m=!{9@q#>1v*Yyl zry{qQB?d83SMRj|=Cq`bS9INLnf)bocL35vA{D7;7V88M&6v|d4B$8(uT^|H`~(KG zLcmmQ?97u+7%NC1NsEAklhJd9e2$)3K{;tc(aW*ESf*3z+JJb67x50ClES~C6u<7) z^mmR|?~Pk9azJKu<7btL*SP)Xp57F}#5GR=DbaWfh;bc^Jw67rX-{K_ zrS=_8X~$q?0~N^jw#~igl*6d}L<`HnN~=QUEmo*@J}qW!(!4*>aI9dhjbMI^X)P5Y z8ZI*qJ$FR05iDyYadjMs1G@(&9)ss zoT@vrk`n{Cc#qtQlMQQ#`H;K=18~pMJ}E+rfd!`Wh>5O?y#0NMLsqvO(@| zqVop>!G@ zASDmW5iB`m4ueAwL0~Hmrw`5$edG8_{_@~>wA~Z(&8}wXr5kI$%iE{_^9UPp@z{KO zu^yy8ZBFE;z32|O*&5b_O9AjVQ>jHbMF&+-YOq*^d^b9K73C#0SyUWDejS~9#eM!E z*%MXmv<|8YlBZVr=ZS?dv*0|omrmo62nk>zEOJjEUx|CI#O)%*54D`Aoeo6d2MCr$ sK8x+AMf}I(Lv731d0h+2wsm}M0Pf%mak8u|t^fc407*qoM6N<$g7u@p(EtDd diff --git a/pandora_console/images/Header icons v1/Header discovery warning.png b/pandora_console/images/Header icons v1/Header discovery warning.png deleted file mode 100644 index b329f4d755140c10467692f6013e5d2396d7ac86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 524 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHit9aH978MwuZ9@< z9d;17W6Rz+MNO=)f+2H4z#-u#0U;ZO^9vR(R1$I#$$Tie%ugq9g1!nXZ>Gjt2}j}1 zL*ERu3xs5%Em?$;q}QiEPkUchljh{I?(dR0$IROET)7n%&RFqxqR_^&w~uF(EEk#h zPW5S|W|4M(M5uS;l3A>2M=xyseQ~X=>-lvJ@m0%ormA)O7f&c%zfI1!dHd0)r!A{@ zo}Jz);U+hu{p6KJdz{3A!(MMavc_+7>laz4eNW%4edxL5{p_U{5^;*w3eRLOi6k81 z7rSV>J?__`gNZpRzdYi)4ry6SyDfLSz47A8qnXN!a$fd#Bz0xJ=Kg9~x<8}sk<^{n zXXaMQ&7IJ9-k@vkBG*a_mYSrip|ihA-;;0YSzW?6@wCmSa>I`8t_Cd%c9ZA38y&eX zH2H1Ew3XV&ZvSU*l6Z3ChmCf}qNO1>Zyx>oJ*Wj+U}0u^V)E`uvtQ^v#xGTcUn^NEoIz3I>FVdQ&MBb@04$l# A@&Et; diff --git a/pandora_console/images/Header icons v1/Header discovery warning@2x.png b/pandora_console/images/Header icons v1/Header discovery warning@2x.png deleted file mode 100644 index 579c5fa6bb44d30db08dfea39df63b3eac8a5a6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1006 zcmV6#o5Z>8$Xo!mMG^qrW_yYtL zi!>%62nI!x%cTg|3Klk2ik1piHX>GnsHE`j45BEAV6+J+v9LEe1uG+W5)C2V?l`k% z!`}0GZ@qgl3EYEZc6VmK`F7sk?7k6V#d<}RpW_AVlxwn~;VI$#D}3)_}~ z6a%(XCsk?J8FKU!i`@rU0kuMibr#f-(E;xJ4+5LV;qthB$Y?IsxixTQtZ&!Aw*3t= z`6|$J)6R^OK_<+a#jp}FAL!zX`_vqwzeNG!PB2=z$U1%iA7}TfCH(li8~@*UO$v>j z>c1E}BS~%wM2=CTg^*I4IJ!o)LiPc@qr5wo)Fz;1DKq_$n}5f)#;fnkNdgxD&p;Kj z3n*}VqOqreOcRWKdT$6%f|~)5Uh|Caa(wK}wxOIlhbVe|CN#1MI-th@x<;xLo)ZXH zDgWs*O z!EJV+@y9qKoFKz~uY)TJ64Pfgl+>pI@QH+N6Ye1wHLoLxlf9u<->%S#&k{hY8zAa9 z+9x8KZiBaEu=6qum#bE92x2Mh(I}?UxI0+jRwQpgxfKR@{{fLZqO^F`3gBAJR zwYa`k4qC-!ZggK4hgt<%tNG0Bzy1)KSxB2;Gf{Krv?J(7qnUO)g3UzDowM;H2m-#l zj5ku7xk;){O>QJobzF#>xy|rLH(jxg*D2S#Lxs4^Xl2L{WG-B%)k`=<=U?A?aw9@> zvI7SBs>M833A&`Xz@oIe00K`D;eRZ$xJb!uBCw1C9tASEW^1DEtXP7sfo*fCT$HBv zYfy(N-uncVmxz2XEux!BOPyrbN#7JKNlhguQ%=W4a{h&!lqnQtipQ+P;H}6FzK<(G c@zm(^3&V8{Vl6Vo(*OVf07*qoM6N<$f`?zX3IG5A diff --git a/pandora_console/images/Header icons v1/Send feedbacks.png b/pandora_console/images/Header icons v1/Send feedbacks.png deleted file mode 100644 index 858e790ddb2102fdd9912c5cc744be8df358e872..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 645 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHihp>zIEGjV&JD5k zW_A?V+pi(^uT3C8NayXFPZ!--r)vCQ{=`4&lv3+d&9_0Bf`YERinlm^zBqbm0<-7z zV?owCk9^mgS)BiV(S+vYwEMGX-mSIX-PWi-*N;D=mi@qyIgG;nGkIU}d=$7`?o`OI z#z(E#chU9Nm8~zT=$@}kl_Y~l*#6D^p^o9^E8S|rYqdv1ZRr^D5z%?nT6IPW|*g(th# zGnldVY+4zTHB)r{VvmD2M7Bn~ojqHVdqs3v`tG}R3UX2WrL8|g*JS(pha9(wI}CjKs|5mP?^U`4@Be<$v)XDF;d6Y{%vY4jKG-O*#YXAOk0nXF*58Y4 z-EH(!ETMEY*NzRRk997*!LG%^<+irqTo=>i#n(Evr?PKfDw!ZAFLUeg!wU!376v>{ z_-J)`y3qO~vhue@-~6q)n3N-F$9JiJ4`cKXW+^w(yRMP)4Km{h$t75MkFx@3Ca0= zn|qVJ*}2=zUVa9aH#6_O?|u8`?au7RD)OzhwRNz$xj8XAJNwDv942z2bR{jklkD4Q zU&Kn3W_Ph_YinDSz6Fr zFpT^d{u$o3l`p^2ogtdSHB7-G2rrjgFLP)qK;XL{|wGPhQ%1^zLw)S z_So3iny!d4#>!8-i_+EAb#Qrk`EL{u@nJ2ZgbusUN;aDv6h#ynkH>2XMql@F#%f*I z3J`Cts;cVj$jHco?xzY{S8&|k-hL0kE~0x9G6Ojoi^Y0IM@N59Z)!e3tmXk2&H;e3 zXah?Jx0%!p3IHQKF*$(70Iptc3J?YU3emdth+)P6wFT5&W#sB|R4@j_ovAvGaiX!Y z@hfE+&1!0Ds=%3Hf-la#GJupT7SZ9rxLY6}zAZ+1<~zvw5V~F7d6ZO(+Eu&?B)MR} z^6I3Iptq$j68mtkk)aqwkl&3ABLIm@z56W7NTex;rkshrNcc?|8Jcov%9#L(gv~qV z@FymY%49i`o0MHsQ*){u5b*^&cYn6i>GT{1^P(t2*3(yVs7}FA071w>-ZvN$0FO;e z6rj9M3Sdd`=YjW$47MtHgqI_T__7Xf$RMl)P#?D59+SO#!J3r%TxVxze06p8E>d&} z*9l!;YK%Nj<9btBS^3PgxfSybB*>RJ$UMhYR}3V|JS!E~9c1oxDSsou?(XjW3kwS` z;TUPlDiyGZE`_tl%~UFt)%8At5jJKWGx8W2<>Qw00w{tY#$(6Kb}ywjSeQPS9(FAS z?*$e=CV4j6);bGANVmyzn9Fn8coVLyth|S!&mS^X{2DW7rm*0}^iyEL0Kww)w zQG$Yo)yoOT{TRbX)Cc@dI|P!a!vgH29mFw|R2g;<| UtzpKMwEzGB07*qoM6N<$g6jN3S^xk5 diff --git a/pandora_console/images/Header icons v1/Sign out.png b/pandora_console/images/Header icons v1/Sign out.png deleted file mode 100644 index 186cb46d3c4eec36fe5998f67883deebc9dc6e40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 646 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHihp{#IEGjVwuV^y z9d;1d+B|m8ubx~T>F{i;r%4-Lc$Ath@-wl=d zZ*QJiWV$Bh{QI+K&YgS1))VaCy3nb%c&^`a z#i?R$ji+7SegAEpkmnuxvwzy@r_48MyA13mUb?GyYG>kC&Q(t&bIt{F~h&DNhC9Ck&`aFM%CL3IcDZN{EK}$KJZS^ zH1Aq8S?9Fg5ziG2m04>o`q&?T{1MnQ%V=w_8}otPb_SO%)q582TE@(DC!F2;BCDkD z)ijYpi}~m6S>Cv;ZfM&O6sD7KTQ6jHd)E7oNyRKDEE@0qsqDKX>X(+A)sV)MeoXwz zGBe9l^Ust=zii^TT)#?W&Kzdd=xZfvo|7KioIk(Nbko+PCjn1pu3yUac!SQYT(k0n z8+RPqkms(qX3fw23112gZm{Sl&hB?ue9_}cm|#TpEt6}yZ?+v)Trju!z_*i6Dt@nN zcWyd0p(DmQ{a%CJh8VBh$LqwpUBg6Wi22X6 adWPK2D|aUSU%v>H7(8A5T-G@yGywn|FA*sK diff --git a/pandora_console/images/Header icons v1/Sign out@2x.png b/pandora_console/images/Header icons v1/Sign out@2x.png deleted file mode 100644 index e666a1fbea0ade31e05e989ea149f607049e54ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1202 zcmV;j1Wo&iP) zf*}%Vtge#|D+&rLDebN@F&LDfB%09i)7zW7#Dai!R9Go@=l6~GmbY_ncV`#HN%rQ= z`}y9RnYS}?H-ZF+k8oXk|~_xm+6-)OEt(9wn# z#9;KncuXenj@hR$4-O6{Oh-^$N@>y*+HYO316=Z4OCk^kdU38;7bJc1A&1MsC|wgI z%@bKlQJC5wilW6*F**>qT0ksk&1UnOp!)rg>sqZgzqhyd!B-qwvu?Nho=Wg=Pb&{8 ziVzd{q-US0NCVDZlrM-VngGfP6+}o{TB0Zn_OgzM^AWOaljBU+Gcz*}MTy3v{IS~p z{{A-jE@>!_(bl!1xYaz;&SGtCEe1l@7jjG>$evj;i^oYXK=95IYF<`ET8A{}TnOeH zVRcWiaO23-F19GOZsxZ5032Hp0{EPVg9gq5+y%g04QwTemXjuM7NDz({>c7KftVq0#OfOvMKKP(6*zKlapiZcKfGh`ZSz=)jULVLyt9` zyb80kvvYDdhysCNd`re5eFDhy3z5D8$bBrqcNni?r?)~tw2lMB8~&o#>#b;k(2&*e zYW8GY)JN7-eIqNWeH|Ic{cq&o z)bXwjg`S$4dLndD?+)0!q%B+9xLxKHtVmg@mMN4NeR8MBRCt2pXj;d@-xQwJGXO-t zVwJ|0epOx)VBS4d1YUNTi}18O;%(gNbiNd=m^QL#t|)4d+pSjXmnE;ttJUlE*D!8W z1yFWlr>CbkkB*MqhmPW3iexFrI_6R!VoWTd{T`>&G5olS4SM|ASmK@J>-pmtMy2XZ zA3%@uu#l(AgTQ!|*YNN<=LhsqouDy;uP1GkN9UcAv>ODp!5{@EZ$+;>KnW@|(Ek=- zXrRFXVjG6)CUK(sylYA8h0yT%Ew}(d&a|*Cncqzz4$J5;FYzn~uV5&6(MzInLh>-Q zp3%6Mrb7Y~Cs!I^nZT|*Km?cEBy`RkLsxj4a0NSfQeT4@S8c>H8*Y*&%DC1*_!QUN zj;ZJ|8Q?0O(*JjPI5H%b*-$s`LNH+pbC@ySx-C|^IXXciVh}4xxrCBC2U!*K&l47& zC2XB4ZD{+iD(j@8)`1QFQhER$pF2qC>y+cL=HE-7@$BHsXXkGhr}W{s-=Po{UTO3T8z7a32B^} zKIiuCbKXPi!hQFg@A;k|_nh};0s&T6S659=Z5~?p3t*ILwK}epdM<`QcX#)7?QnBC z7!3Ad&L}b22qMeU>2&&*2sqzlFN^H1dbX-pVANngl-$2Up-|Fsnc>U|7^_q&BLc$G zwOZ|21Hvk0lm*0Npj945Xi^N1B_PcUoNa^z^h*CRWV8# zmL#Vcm<1r6v9kYEM7ay$5(b&OCyFIYbnTD?6Vj4^tQ+iAOQeN!8eq@?)*u~p8lH~F z<7S4~OSCX0eS9KB8r=!$wa5&hy-+C3i_Cf{5BIge^E-qkuy%F~$D@?BU`R^cX+SWS zfV3A`wpo_ss1I~37Tb+77KudmIiNX+_(-1b3GFM4X264V(GS&?lH& zzu1HFAlO-sE9|i7todXzS;pZLa>O8;5B$}B0*+D9kOQ|Q5{V!AeEx&HiISyllkb&q z&QbYoetnin(1f*tK*OA!UM6=|YR*piK28_>g#YNC&sBy-n=ZRO+{&3&tdOY1XIo)V v2Yi^TdVWb<)DgJCs2`(}zkd;agQNceqhK(Fm=&zF00000NkvXXu0mjf23UPI diff --git a/pandora_console/images/Header icons v1/Support@2x.png b/pandora_console/images/Header icons v1/Support@2x.png deleted file mode 100644 index f3c95c28530c6b5cec7e93752c000e61f972d833..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1920 zcmV-`2Y>j9P)1i$6vuh5D`3Gwil_+~6fi6r zJ}4*>T9%-#vPm&fFbEpKCDGs)H$tu8^=e;VqPrkufm= z?1Nrz;1PjYSy{!9JP&McZayHerKM#yS<0>Gp*2nxtKuk(7>+#DQ^z6_=BfbD5|+h*~Ncn;A)0 zhHJi(26;N6OwuI@ZZz>!U;!z-AH*$-ATHV83(o79%gqR0DX%rzrRd%;dD5gw*K$3M zn(SqW!JlN3YhW0S$K#v0-(K(4tJm>{hK6a_ZwuN{qoJ8ZuSyk+Ah%UlSAQ)>7OmxW zJV>xs#9xBJBopUnzlJ!>1lW-M>#k1f^$dw7)BP>+HLc7#@hFe|z8WL=UDM{U{ zNx~s1m~7l5zC>lod3m{a&bhep zon@F5OiuLSJ?0!nI}6yshnCU`K1+ujg0zJv>iFj+0Ap-aK3_sz_7o&C3a1TrTmU)wy;9#L8-ZLPv zC0E~K!8kx?DVUVlE#NM>Iq|@A?ZwZ<=MKNI6DNyjWVcpHNlAWVW209a$GZi6Hrs!f zjF$*!t1~&yc6z*H*ntfRCYvl4FXMr_+;Qk{yw``EWy1_G3O3dF5IXMCrAq@1C)1~l zkCFOY0FN6W$`+PV;8n2mpdY$A@zgR4Tqk*fs{`*D4+fI~SQ!o(3P$izw9XLdBIdY6 zeZLF_lOOi`)rY&_?-1}$hZa-YMBeOOSY(B4y^F%$OB0UmZ0kN`uN@+S{mSz>7rQUa zhQwYF@Asi8T`@Z>z*X?yHsjQ(Qx6bx1$ehw!HIWRH;LXS);M4!t7Ws;bWLqyz=B;6fH$Zw5wj z9Ejs@CW}(B4Uqd?EEP|pXLt>|p|Y~_B!wvA`@&a2TMDp<0=(zqVdvl(*T8rxoAkgW zxqax;N=`AjD*ZWHwu{fs&i+m`WOP{DPml#m)k9S8;}AzJuu&g(q~pfg4Y?)EE()WH z<toy@&=>`<%pz&6Zw5^y_x^bPYg$ux7^Tn#po z_;aDNNi6bXOK>SZycByk301rf(e;6K|juLn5+j^yR#^<&`^ zsTRjcUwrd>vgvTlP|ZzLay*7x(XUtXZZQ4X=7@M6>?zc(M!jHifcSw978Mw*M{!( zV{#OjcaxcSVuVL)Z|kue(KjPGcOGu~!C=>7wy$gH*0~->%0DnZVBF#)Y&c6{=fl}k zTfY`rzHjmUmR44`Z|2;&cOQQ*+imt!=6mPUT_!)J?sItdwyf*vXfctt$!XbsrX-^2 zfltecA6jeb`*&Uw{~T>>)&5@9@U8Pll_TO^bI#j}8i&s4dYS&H;vwtK;*Ynt0$ zZwc_6c{b2{vGK|;*LOM@f8P6k%E{+WAuO{Oi~U;v`0}~4I$K_qMjVkh`#szGc+QMg zv+^gc-e&3F*QlLQyH)j~WbV&w<*rS$&fQdfd20I{o(*55uB*OzILCjQTM)xC_s0je zw5>Z?voAnF#mru0Vnv-|%{~Ezp78r-uNklIPcA;7vfEHi?v?G7MD~Mbinkr?Lp_&p zb?F@nKJvwIvGO0Yc^{|oeMsO*GWuJz)Mf^g-jx;$t7-jnK=I+}>gTe~DWM4f-Zt0j diff --git a/pandora_console/images/Header icons v1/Systems error@2x.png b/pandora_console/images/Header icons v1/Systems error@2x.png deleted file mode 100644 index fafe9217567aa5ca0a02ea09d2bdc7e0b2c6d145..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 945 zcmV;i15W&jP)1gh5T4nCI6p=ZKp;XQA*G-p z5|2QEl=zGzhliksk}i*cL=^;&0HledbaY5=oyJs=2+-g-$b#4g-!OAwkCpGvzO&cT zA+nOSb2Gc&&d!c!b_ao5vrsB~UT+H!x=KL_8>=pfz-)@8hbBX41q6#>Wx*c&;c3AjKmD47=%B2MolkW*{h)Z4B2R;zqBBpc+94kmoHJL`;{lT_C*Y5!_+HZ35zWhIx)>7dYi~fv6?%5rOI)f<7QP?;+>Bo8R6( z)+qmg4YjJadh4eg1P5{I+1)omX6F=L;e#lo)jZJ91QU>HHT@_pn2gW(DMws}M%m?L z=dcZnp8#mV#xjVi$fs-vOcavX8n})4p#)YDn6!MSX#t@4q4qtKP6H-mGwz41VX)=2 zTZ2U#3{Qi^HZkb+u} zl|FRDSy4>uai*ZQ#Hc;{esrVFO?6zYE+IL~J)mXuXqgbMA`zFBxU>W?$7QBGm!0zb zM40n=r!plaCmz@3UP|g*e!>=C;Tt@s!Mv}C#HA?w!jG&2z}^8&O&yq}C{v@~R}2*n TnPoGs00000NkvXXu0mjfh?zc(M!jHiYIxxIEGjVt_|Jm z$K)t5@22%dmn7%bUe;p~oX3u|oZ}L@c#8dl;+BmU4#~?MIu&u7Q%zy(+|G@Y*)Omk za8lm>c>8PJIKAng1w2mFeBONj&l{tH&D$e6z8vSCxa$k!I@c8rOZr6)n6=8=y`7TZ zU|yqi)7VY4iesH=Vb^5k^~Mq>pU*wDZ-Y$N39c{h_doO1`2Omu<6L!Ep~Ayv-rX4y zL0g2{bybb8`@cH>Msw?9ng7$wwkC3I$+Mh!BrSNh!s8Mn%?Y#je$85t8t#&x*x`ET zfRZt9!~Ftx{jMKjl{>Fh#Hugtx}DRTX7WtB-0f@5%9*z>I9FZ8kv|J=JMQ?os6xg`*!pj}@$}icb$t87 zJYNfK)JlA+lkBd~d6G%&pv|ObhI4FgO)L=Id)TZY>)IvlXV=`5YvT?7MWp?@@7OlG U{C-PMB`B6WUHx3vIVCg!0LQ@Gq5uE@ diff --git a/pandora_console/images/Header icons v1/Systems ok@2x.png b/pandora_console/images/Header icons v1/Systems ok@2x.png deleted file mode 100644 index c1484d1ddb317cf1d172ce1fa2d124c507bab3d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 982 zcmV;{11bE8P){|NDHPa7BZ|!t#p~vZ8sW1+n6m zzX)Pn90joETlD_{OHb!=xvm+lQs8fU(NV&+lGYeq@Ch8?&%k8GC|BLX&th zaaLk!i4lDtCFrqGHKHA2GbF=HjA#^gY7;NaPC$m=VLJG?y`CCf88_p(rHeh1p=O-4 zO?}Eq4JVf4nS5?s>*}k-8qEcZ$_GOX{Ui(an*)ToJ*meq^|Voky1Gv@t6R*p0RP?a z9FmMtnttQ=)M4jxU0t2c=W?3qlGge>fX<=qBjzk?I*L4XQQJ09=Srk`4RW7Z@%yYp z?_b>=1Al;pro3>yg-}bBQ zhio^q+aDdC&JTUXsqRb~=1>!^skFevA*ro?+IYnkg;f~AzKm@?A5ikp{XO2yJiON%da&K?#bwce6Y{m%q?(yYigdEI&zVV6Sqi z*Z#da6xLS`IdZRS$FoSW=3Ch3gRxZvaHkzAqKcoj(%LU!=5M$ox2bay1RQ=NWk%|t zdD-&Lnzd*(qPIGj(J~`147GbxMe3cokTs&W*u$uUEjDNiA6a5sfL6;NIJnmc*F7Tz z!L+`wX5YT-)ql47NvVGP<@>=ufj>1^kvD0b?ZKTmS$707*qoM6N<$ Eg53wY9smFU diff --git a/pandora_console/images/Header icons v1/Systems warning.png b/pandora_console/images/Header icons v1/Systems warning.png deleted file mode 100644 index f1cbc64f6faec500766f3e8c6d497b1135e5fef0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 492 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAc#=yY%t50_}ki(Mh=?zc(M!jHisL<9978Mw*M@HN zV>aaZ>fOiK6|gWkF+s!WjZcn`0^?i(V|hmI{fAC?U2QcwVE=(}FMosR$_p#SljqM` z>~T?*-K8t%X65<5+K-Lx(X!9&jvv`^mdkvv@-jZb`w~fZ3x6KUxggh&VK4mMvioYy z?svDder(iwzbMpG&vA#?vskq~5#8Enf*v}aTVQx%=Zwzl-dj|Q=fv(gEH$U{`1(}I zsF_^HmGzx-PFgm#OS7+guutTtz=L%q36mX!mG&5ZjJP4cCbM^vWV0#v(+IgMmtOG6 ze%N;8LdBPc6+S6*>f57UMEo}DT^ZYX)KAa9sBdG(z4O&7LbZLXPWw8PrW^0xbY-dL zd(mTGAM8+HobLXQ^ESgZmK&3Pt?Rm?Tf9fcReq8G3|IF3O%pd8?riN_{`3zw*Sn5` TYk3*Zfr8xA)z4*}Q$iB}*B-(n diff --git a/pandora_console/images/Header icons v1/Systems warning@2x.png b/pandora_console/images/Header icons v1/Systems warning@2x.png deleted file mode 100644 index 03e18ec79d0e79d247801bc0d38055f5879cc32d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 918 zcmV;H18Mw;P)1gh5T4mJLL!c^ArKJ~$&!mS zvBV=#(8MSbDDVo@P}1=Tk*E^E6WEDGL1^iaXq_fhmI%<`kSG+RE>Oo*{Q3#*myKroGKQcosMODr!nqP0<+ z9t$;OWgRU*`Ur)_hea$3cy<&fId zrbqNK^@uTolJArSV;|ZebLlYv;V#LQx%)8puu=NPwR?#0lEdbZ^Uq~?8fm@}@SHK; zYtWBI@+x)iJn((*A&|epIc%MUYFvQIoYxkm{BUl&;I>ad$4K~1q51-P@iRW{of*ad zfe($Td9}H(vP}*W)VO_WEBl~bJp`i7td?5~T`&RBh%d5&iTrG@a@=NUl35lz2EA7G z2meYdd8pxqd|ce31j&^Xt61vNSuG!lLlb)vlZMU;SlpDeT9PDhr<^2^m7hPL)@qY$ z!drfivs&ZGe?_HUX?=Ye>0tRTc!P$I-UbUah@ipX>m2MiodJcDQs{zOh0tYXT}Ao` zbg7$r)Z{&r+}C(+VBQ{>7SGmr0~D_HhVQnM9u8cLv~(l}dAGewAC?l!RbU*^URnjy z%FX^?tO1*|xEB$d#I|WyU_M^x)zW@LL diff --git a/pandora_console/images/svg/add.svg b/pandora_console/images/svg/add.svg deleted file mode 100644 index 3530cc8203..0000000000 --- a/pandora_console/images/svg/add.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/arrow.svg b/pandora_console/images/svg/arrow.svg deleted file mode 100644 index 7fb5d31ac4..0000000000 --- a/pandora_console/images/svg/arrow.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/bell.svg b/pandora_console/images/svg/bell.svg deleted file mode 100644 index eec47bd762..0000000000 --- a/pandora_console/images/svg/bell.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/bubble.svg b/pandora_console/images/svg/bubble.svg deleted file mode 100644 index 08bf0727fb..0000000000 --- a/pandora_console/images/svg/bubble.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/device.svg b/pandora_console/images/svg/device.svg deleted file mode 100644 index 46ea97ad8c..0000000000 --- a/pandora_console/images/svg/device.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/display.svg b/pandora_console/images/svg/display.svg deleted file mode 100644 index 38e3a84fa4..0000000000 --- a/pandora_console/images/svg/display.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/down.svg b/pandora_console/images/svg/down.svg deleted file mode 100644 index b515cd5102..0000000000 --- a/pandora_console/images/svg/down.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/dropdown-down.svg b/pandora_console/images/svg/dropdown-down.svg deleted file mode 100644 index 20da85c0d7..0000000000 --- a/pandora_console/images/svg/dropdown-down.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - Dark / 20 / dropdown-down - Created with Sketch. - - - - \ No newline at end of file diff --git a/pandora_console/images/svg/dropdown-up.svg b/pandora_console/images/svg/dropdown-up.svg deleted file mode 100644 index c8e9add524..0000000000 --- a/pandora_console/images/svg/dropdown-up.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - - Dark / 20 / dropdown-up - Created with Sketch. - - - - \ No newline at end of file diff --git a/pandora_console/images/svg/duplicate.svg b/pandora_console/images/svg/duplicate.svg deleted file mode 100644 index 54b78c2aad..0000000000 --- a/pandora_console/images/svg/duplicate.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/envelope.svg b/pandora_console/images/svg/envelope.svg deleted file mode 100644 index b50e20e331..0000000000 --- a/pandora_console/images/svg/envelope.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/exit.svg b/pandora_console/images/svg/exit.svg deleted file mode 100644 index 16e0eae613..0000000000 --- a/pandora_console/images/svg/exit.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/eye.svg b/pandora_console/images/svg/eye.svg deleted file mode 100644 index 5f9c897222..0000000000 --- a/pandora_console/images/svg/eye.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/fail.svg b/pandora_console/images/svg/fail.svg deleted file mode 100644 index f6a60f9276..0000000000 --- a/pandora_console/images/svg/fail.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/file.svg b/pandora_console/images/svg/file.svg deleted file mode 100644 index 6ef321521c..0000000000 --- a/pandora_console/images/svg/file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/house.svg b/pandora_console/images/svg/house.svg deleted file mode 100644 index 1361d98cdc..0000000000 --- a/pandora_console/images/svg/house.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/iconos-27.svg b/pandora_console/images/svg/iconos-27.svg deleted file mode 100644 index 9eb41e512d..0000000000 --- a/pandora_console/images/svg/iconos-27.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/info.svg b/pandora_console/images/svg/info.svg deleted file mode 100644 index a7b23d52d4..0000000000 --- a/pandora_console/images/svg/info.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/left.svg b/pandora_console/images/svg/left.svg deleted file mode 100644 index d74cf540b3..0000000000 --- a/pandora_console/images/svg/left.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/menu_horizontal.svg b/pandora_console/images/svg/menu_horizontal.svg deleted file mode 100644 index bcd2f124cb..0000000000 --- a/pandora_console/images/svg/menu_horizontal.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/menu_vertical.svg b/pandora_console/images/svg/menu_vertical.svg deleted file mode 100644 index 1b5e468eb1..0000000000 --- a/pandora_console/images/svg/menu_vertical.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/ok.svg b/pandora_console/images/svg/ok.svg deleted file mode 100644 index af6c3850cd..0000000000 --- a/pandora_console/images/svg/ok.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/picture.svg b/pandora_console/images/svg/picture.svg deleted file mode 100644 index 978557a383..0000000000 --- a/pandora_console/images/svg/picture.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/plus.svg b/pandora_console/images/svg/plus.svg deleted file mode 100644 index 18736fde28..0000000000 --- a/pandora_console/images/svg/plus.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/protected.svg b/pandora_console/images/svg/protected.svg deleted file mode 100644 index 39f9c69aa1..0000000000 --- a/pandora_console/images/svg/protected.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/radial-disabled.svg b/pandora_console/images/svg/radial-disabled.svg deleted file mode 100644 index 1b38fe43c0..0000000000 --- a/pandora_console/images/svg/radial-disabled.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - Dark / 20 / radial-disable@svg - Created with Sketch. - - - - - - \ No newline at end of file diff --git a/pandora_console/images/svg/radial-off.svg b/pandora_console/images/svg/radial-off.svg deleted file mode 100644 index 68d23663ca..0000000000 --- a/pandora_console/images/svg/radial-off.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - Dark / 20 / radial-off@svg - Created with Sketch. - - - - - - \ No newline at end of file diff --git a/pandora_console/images/svg/radial-on.svg b/pandora_console/images/svg/radial-on.svg deleted file mode 100644 index 7e17258abb..0000000000 --- a/pandora_console/images/svg/radial-on.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - Dark / 20 / radial-on@svg - Created with Sketch. - - - - - - - - \ No newline at end of file diff --git a/pandora_console/images/svg/right.svg b/pandora_console/images/svg/right.svg deleted file mode 100644 index e74f4abeb8..0000000000 --- a/pandora_console/images/svg/right.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/search.svg b/pandora_console/images/svg/search.svg deleted file mode 100644 index 14f8f5fd8e..0000000000 --- a/pandora_console/images/svg/search.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/settings.svg b/pandora_console/images/svg/settings.svg deleted file mode 100644 index 16858510e1..0000000000 --- a/pandora_console/images/svg/settings.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/sound.svg b/pandora_console/images/svg/sound.svg deleted file mode 100644 index 1ff57a311f..0000000000 --- a/pandora_console/images/svg/sound.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/star.svg b/pandora_console/images/svg/star.svg deleted file mode 100644 index 1ba2f60041..0000000000 --- a/pandora_console/images/svg/star.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/success.svg b/pandora_console/images/svg/success.svg deleted file mode 100644 index 26e83ff1f7..0000000000 --- a/pandora_console/images/svg/success.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/trash.svg b/pandora_console/images/svg/trash.svg deleted file mode 100644 index 0dc58d9e0f..0000000000 --- a/pandora_console/images/svg/trash.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/up.svg b/pandora_console/images/svg/up.svg deleted file mode 100644 index 88fe9cb5be..0000000000 --- a/pandora_console/images/svg/up.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/pandora_console/images/svg/user_a.svg b/pandora_console/images/svg/user_a.svg deleted file mode 100644 index 797b4e04a0..0000000000 --- a/pandora_console/images/svg/user_a.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From 13aa4e77f105da486d461f7669bb6c0e68f75f8b Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Mon, 20 Feb 2023 17:49:02 +0100 Subject: [PATCH 294/474] Fix minor issues --- .../godmode/agentes/module_manager_editor_common.php | 2 +- pandora_console/include/styles/js/jquery-ui_custom.css | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pandora_console/godmode/agentes/module_manager_editor_common.php b/pandora_console/godmode/agentes/module_manager_editor_common.php index c538bea600..e3d67c77c4 100644 --- a/pandora_console/godmode/agentes/module_manager_editor_common.php +++ b/pandora_console/godmode/agentes/module_manager_editor_common.php @@ -860,7 +860,7 @@ if (tags_has_user_acl_tags($config['id_user']) === false) { } $tagsAvailableData .= html_print_image( - 'images/svg/plus.svg', + 'images/plus.svg', true, [ 'id' => 'right', diff --git a/pandora_console/include/styles/js/jquery-ui_custom.css b/pandora_console/include/styles/js/jquery-ui_custom.css index 53f76eccf5..b0c0fce92e 100644 --- a/pandora_console/include/styles/js/jquery-ui_custom.css +++ b/pandora_console/include/styles/js/jquery-ui_custom.css @@ -187,8 +187,8 @@ .ui-button.ui-corner-all.ui-widget.ui-button-icon-only.ui-dialog-titlebar-close, .ui-button.ui-corner-all.ui-widget.ui-button-icon-only.ui-dialog-titlebar-close:hover { background-color: rgb(51, 51, 51); - mask: url(../../../images/svg/fail.svg) no-repeat right / contain; - -webkit-mask: url(../../../images/svg/fail.svg) no-repeat right / contain; + mask: url(../../../images/close@svg.svg) no-repeat right / contain; + -webkit-mask: url(../../../images/close@svg.svg) no-repeat right / contain; } .ui-dialog-title { From 03c40fe582d92f37686f28ce3c27737b41ea2683 Mon Sep 17 00:00:00 2001 From: rafael Date: Mon, 20 Feb 2023 18:52:35 +0100 Subject: [PATCH 295/474] 10435 adding features to online installers --- .../deploy-scripts/deploy_ext_database_el8.sh | 2 ++ .../deploy_ext_database_ubuntu_2204.sh | 4 +-- .../pandora_deploy_community_el8.sh | 15 +++++++- .../pandora_deploy_community_ubuntu_2204.sh | 34 ++++++++++++++++--- 4 files changed, 47 insertions(+), 8 deletions(-) diff --git a/extras/deploy-scripts/deploy_ext_database_el8.sh b/extras/deploy-scripts/deploy_ext_database_el8.sh index 422887b0e2..93dc1c561c 100644 --- a/extras/deploy-scripts/deploy_ext_database_el8.sh +++ b/extras/deploy-scripts/deploy_ext_database_el8.sh @@ -275,6 +275,8 @@ EO_CONFIG_F if [ "$MYVER" -eq '80' ] ; then sed -i -e "/query_cache.*/ s/^#*/#/g" /etc/my.cnf sed -i -e "s/#skip-log-bin/skip-log-bin/g" /etc/my.cnf + sed -i -e "s/character-set-server=utf8/character-set-server=utf8mb4/g" /etc/my.cnf + fi execute_cmd "systemctl restart mysqld" "Configuring database engine" diff --git a/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh b/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh index a82244c3b6..22349ea5ce 100644 --- a/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh +++ b/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh @@ -181,7 +181,7 @@ cat > /etc/mysql/my.cnf << EOF_DB [mysqld] datadir=/var/lib/mysql user=mysql -character-set-server=utf8 +character-set-server=utf8mb4 skip-character-set-client-handshake # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 @@ -196,7 +196,7 @@ innodb_flush_log_at_trx_commit = 0 innodb_flush_method = O_DIRECT innodb_log_file_size = 64M innodb_log_buffer_size = 16M -innodb_io_capacity = 100 +innodb_io_capacity = 300 thread_cache_size = 8 thread_stack = 256K max_connections = 100 diff --git a/extras/deploy-scripts/pandora_deploy_community_el8.sh b/extras/deploy-scripts/pandora_deploy_community_el8.sh index 13f90fcf85..4fa0814d59 100644 --- a/extras/deploy-scripts/pandora_deploy_community_el8.sh +++ b/extras/deploy-scripts/pandora_deploy_community_el8.sh @@ -107,6 +107,17 @@ check_root_permissions () { fi } +installing_docker () { + #Installing docker for debug + echo "Start installig docker" &>> "$LOGFILE" + dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo &>> "$LOGFILE" + dnf install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin &>> "$LOGFILE" + systemctl disable --now docker &>> "$LOGFILE" + systemctl disable docker.socket --now &>> "$LOGFILE" + echo "End installig docker" &>> "$LOGFILE" +} + + ## Main echo "Starting PandoraFMS Community deployment EL8 ver. $S_VERSION" @@ -207,6 +218,7 @@ else execute_cmd "dnf config-manager --set-enabled powertools" "Configuring Powertools" fi +execute_cmd "installing_docker" "Installing Docker for debug" #Installing wget execute_cmd "dnf install -y wget" "Installing wget" @@ -454,7 +466,7 @@ innodb_flush_log_at_trx_commit = 0 innodb_flush_method = O_DIRECT innodb_log_file_size = 64M innodb_log_buffer_size = 16M -innodb_io_capacity = 100 +innodb_io_capacity = 300 thread_cache_size = 8 thread_stack = 256K max_connections = 100 @@ -483,6 +495,7 @@ EO_CONFIG_F if [ "$MYVER" -eq '80' ] ; then sed -i -e "/query_cache.*/ s/^#*/#/g" /etc/my.cnf sed -i -e "s/#skip-log-bin/skip-log-bin/g" /etc/my.cnf + sed -i -e "s/character-set-server=utf8/character-set-server=utf8mb4/g" /etc/my.cnf fi execute_cmd "systemctl restart mysqld" "Configuring database engine" diff --git a/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh b/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh index b22d5d163f..5ac47ca60b 100644 --- a/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh +++ b/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh @@ -106,6 +106,21 @@ check_root_permissions () { fi } +installing_docker () { + #Installing docker for debug + echo "Start installig docker" &>> "$LOGFILE" + mkdir -m 0755 -p /etc/apt/keyrings &>> "$LOGFILE" + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --yes --dearmor -o /etc/apt/keyrings/docker.gpg &>> "$LOGFILE" + echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ + $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list &>> "$LOGFILE" + apt update -y &>> "$LOGFILE" + apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin &>> "$LOGFILE" + systemctl disable docker --now &>> "$LOGFILE" + systemctl disable docker.socket --now &>> "$LOGFILE" + echo "End installig docker" &>> "$LOGFILE" +} + ## Main echo "Starting PandoraFMS Community deployment Ubuntu 22.04 ver. $S_VERSION" @@ -173,7 +188,7 @@ execute_cmd "cd $WORKDIR" "Moving to workdir: $WORKDIR" ## Install utils execute_cmd "apt update" "Updating repos" -execute_cmd "apt install -y net-tools vim curl wget software-properties-common apt-transport-https" "Installing utils" +execute_cmd "apt install -y net-tools vim curl wget software-properties-common apt-transport-https ca-certificates gnupg lsb-release" "Installing utils" #Installing Apache and php-fpm [ -e "/etc/apt/sources.list.d/ondrej-ubuntu-php-jammy.list" ] || execute_cmd "add-apt-repository ppa:ondrej/php -y" "Enable ppa:ondrej/php repo" @@ -221,7 +236,8 @@ systemctl restart php$PHPVER-fpm &>> "$LOGFILE" php$PHPVER-xml \ php$PHPVER-yaml \ libnet-telnet-perl \ - whois" + whois \ + cron" execute_cmd "apt install -y $console_dependencies" "Installing Pandora FMS Console dependencies" # Server dependencies @@ -254,10 +270,13 @@ server_dependencies=" \ libnet-telnet-perl \ libjson-perl \ libencode-perl \ + cron \ libgeo-ip-perl \ openjdk-8-jdk " execute_cmd "apt install -y $server_dependencies" "Installing Pandora FMS Server dependencies" +execute_cmd "installing_docker" "Installing Docker for debug" + # wmic and pandorawmic execute_cmd "curl -O https://firefly.artica.es/pandorafms/utils/bin/wmic" "Downloading wmic" execute_cmd "curl -O https://firefly.artica.es/pandorafms/utils/bin/pandorawmic" "Downloading pandorawmic" @@ -393,7 +412,7 @@ cat > /etc/mysql/my.cnf << EOF_DB [mysqld] datadir=/var/lib/mysql user=mysql -character-set-server=utf8 +character-set-server=utf8mb4 skip-character-set-client-handshake # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 @@ -408,7 +427,7 @@ innodb_flush_log_at_trx_commit = 0 innodb_flush_method = O_DIRECT innodb_log_file_size = 64M innodb_log_buffer_size = 16M -innodb_io_capacity = 100 +innodb_io_capacity = 300 thread_cache_size = 8 thread_stack = 256K max_connections = 100 @@ -731,10 +750,15 @@ systemctl enable pandora_server &>> "$LOGFILE" execute_cmd "service tentacle_serverd start" "Starting Tentacle Server" systemctl enable tentacle_serverd &>> "$LOGFILE" -# Enabling condole cron +# Enabling console cron execute_cmd "echo \"* * * * * root wget -q -O - --no-check-certificate --load-cookies /tmp/cron-session-cookies --save-cookies /tmp/cron-session-cookies --keep-session-cookies http://127.0.0.1/pandora_console/enterprise/cron.php >> $PANDORA_CONSOLE/log/cron.log\" >> /etc/crontab" "Enabling Pandora FMS Console cron" echo "* * * * * root wget -q -O - --no-check-certificate --load-cookies /tmp/cron-session-cookies --save-cookies /tmp/cron-session-cookies --keep-session-cookies http://127.0.0.1/pandora_console/enterprise/cron.php >> $PANDORA_CONSOLE/log/cron.log" >> /etc/crontab +# Enabling pandoradb cron +execute_cmd "echo 'enabling pandoradb cron' >> $PANDORA_CONSOLE/log/cron.log\" >> /etc/crontab" "Enabling Pandora FMS pandoradb cron" +echo "@hourly root bash -c /etc/cron.hourly/pandora_db" >> /etc/crontab + + ## Enabling agent adn configuring Agente sed -i "s/^remote_config.*$/remote_config 1/g" $PANDORA_AGENT_CONF &>> "$LOGFILE" execute_cmd "/etc/init.d/pandora_agent_daemon start" "Starting PandoraFSM Agent" From 490d3db08625650f0ce6c4828b2633ca43e144ca Mon Sep 17 00:00:00 2001 From: artica Date: Tue, 21 Feb 2023 01:01:52 +0100 Subject: [PATCH 296/474] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index bc6b5f0a61..5a537cea8d 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.769-230220 +Version: 7.0NG.769-230221 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index dff687f821..3bdb964eb0 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230220" +pandora_version="7.0NG.769-230221" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index 254bcd2bb7..cd0fdd0989 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1023,7 +1023,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.769'; -use constant AGENT_BUILD => '230220'; +use constant AGENT_BUILD => '230221'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index e79f2fbb48..1a82c15221 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230220 +%define release 230221 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 3807bddd44..4015375532 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230220 +%define release 230221 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 24e9feb2ad..6d8458b318 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230220" +PI_BUILD="230221" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index e18d90153f..bd75795838 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{230220} +{230221} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index 354f282757..f38933f5b9 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.769 Build 230220") +#define PANDORA_VERSION ("7.0NG.769 Build 230221") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 98564615ba..21f5675492 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.769(Build 230220))" + VALUE "ProductVersion", "(7.0NG.769(Build 230221))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 34e0cb2453..919f840961 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.769-230220 +Version: 7.0NG.769-230221 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 654c9a5d97..524fd6c38c 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230220" +pandora_version="7.0NG.769-230221" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index e0058687db..af73bd3842 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC230220'; +$build_version = 'PC230221'; $pandora_version = 'v7.0NG.769'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 9a64b90539..5976f2c24e 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -131,7 +131,7 @@

    [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index 6fbeb80a2f..e972b323a3 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230220 +%define release 230221 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 0395fe8616..3412365986 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230220 +%define release 230221 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index 40b85fefa1..cd73c5e77f 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230220" +PI_BUILD="230221" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index 276c0f4d20..b54b653594 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.769 Build 230220"; +my $version = "7.0NG.769 Build 230221"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index d50993673a..37b388fb73 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.769 Build 230220"; +my $version = "7.0NG.769 Build 230221"; # save program name for logging my $progname = basename($0); From 005fbd27c168972883092061f70af6c1e64a78e6 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Tue, 21 Feb 2023 11:20:17 +0100 Subject: [PATCH 297/474] Tree view meta fix --- .../javascript/tree/TreeControllerMeta.js | 1503 +++++++++++++++++ .../lib/Dashboard/Widgets/tree_view.php | 32 +- pandora_console/include/styles/tree_meta.css | 195 +++ pandora_console/operation/tree.php | 14 +- 4 files changed, 1735 insertions(+), 9 deletions(-) create mode 100644 pandora_console/include/javascript/tree/TreeControllerMeta.js create mode 100644 pandora_console/include/styles/tree_meta.css diff --git a/pandora_console/include/javascript/tree/TreeControllerMeta.js b/pandora_console/include/javascript/tree/TreeControllerMeta.js new file mode 100644 index 0000000000..ab56ab73f0 --- /dev/null +++ b/pandora_console/include/javascript/tree/TreeControllerMeta.js @@ -0,0 +1,1503 @@ +// Pandora FMS - http://pandorafms.com +// ================================================== +// Copyright (c) 2005-2021 Artica Soluciones Tecnologicas +// Please see http://pandorafms.org for full contribution list + +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public License +// as published by the Free Software Foundation; version 2 + +// 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. + +/*global $, _*/ + +var TreeController = { + controllers: [], + getController: function() { + var controller = { + index: -1, + recipient: "", + tree: [], + emptyMessage: "No data found.", + foundMessage: "Groups found", + errorMessage: "Error", + baseURL: "", + ajaxURL: "ajax.php", + ajaxPage: "include/ajax/tree.ajax", + detailRecipient: "", + filter: {}, + counterTitles: {}, + shouldHaveCounters: true, + reload: function() { + // Bad recipient + if ( + typeof this.recipient == "undefined" || + this.recipient.length == 0 + ) { + return; + } + + function _recursiveGroupsCount(elements, childGroupsLength) { + if (typeof childGroupsLength === "undefined") { + childGroupsLength = 0; + } + + _.each(elements, function(element) { + if (typeof element.children !== "undefined") { + childGroupsLength = _recursiveGroupsCount( + element.children, + childGroupsLength + ); + childGroupsLength += element.children.length; + } + }); + return childGroupsLength; + } + + // Load branch + function _processGroup(container, elements, rootGroup) { + var $group = $("
      "); + var childGroupsLength = _recursiveGroupsCount(elements); + + // First group. + if (typeof rootGroup != "undefined" && rootGroup == true) { + var messageLength = controller.tree.length; + if (childGroupsLength > 0) { + messageLength = childGroupsLength + controller.tree.length; + } + + group_message = controller.foundMessage + ": " + messageLength; + if (controller.foundMessage == "") { + group_message = ""; + } + $group + .addClass("tree-root") + .hide() + .prepend( + '
      ' + + '' + + "" + + (controller.tree.length > 0 ? group_message : "") + + "
      " + ); + } else { + // Normal group. + $group.addClass("tree-group").hide(); + } + + container.append($group); + + _.each(elements, function(element) { + element.jqObject = _processNode($group, element); + }); + + return $group; + } + + // Load leaf counters + function _processNodeCounters(container, counters, type) { + var hasCounters = false; + + if (typeof counters != "undefined") { + function _processNodeCounterTitle( + container, + elementType, + counterType + ) { + var defaultCounterTitles = { + total: { + agents: "Total agents", + modules: "Total modules", + none: "Total" + }, + alerts: { + agents: "Alerts fired", + modules: "Alerts fired", + none: "Alerts fired" + }, + critical: { + agents: "Critical agents", + modules: "Critical modules", + none: "Critical" + }, + warning: { + agents: "Warning agents", + modules: "Warning modules", + none: "Warning" + }, + unknown: { + agents: "Unknown agents", + modules: "Unknown modules", + none: "Unknown" + }, + not_init: { + agents: "Not init agents", + modules: "Not init modules", + none: "Not init" + }, + ok: { + agents: "Normal agents", + modules: "Normal modules", + none: "Normal" + } + }; + + var serviceCounterTitles = { + total_services: { + totals: "Services" + }, + total_agents: { + totals: "Agents" + }, + total_modules: { + totals: "Modules" + } + }; + + var IPAMSupernetCounterTitles = { + total_networks: { + totals: "Networks" + } + }; + + var IPAMNetworkCounterTitles = { + alive_ips: { + totals: "Alive IPs" + }, + total_ips: { + totals: "Total IPs" + } + }; + + try { + var title = ""; + + switch (elementType) { + case "group": + if ( + typeof controller.counterTitles != "undefined" && + typeof controller.counterTitles[counterType] != + "undefined" && + typeof controller.counterTitles[counterType].agents != + "undefined" + ) { + title = controller.counterTitles[counterType].agents; + } else { + title = defaultCounterTitles[counterType].agents; + } + break; + case "agent": + if ( + typeof controller.counterTitles != "undefined" && + typeof controller.counterTitles[counterType] != + "undefined" && + typeof controller.counterTitles[counterType].modules != + "undefined" + ) { + title = controller.counterTitles[counterType].modules; + } else { + title = defaultCounterTitles[counterType].modules; + } + break; + case "services": + title = serviceCounterTitles[counterType].totals; + break; + case "IPAM_supernets": + title = IPAMSupernetCounterTitles[counterType].totals; + break; + case "IPAM_networks": + title = IPAMNetworkCounterTitles[counterType].totals; + break; + default: + if ( + typeof controller.counterTitles != "undefined" && + typeof controller.counterTitles[counterType] != + "undefined" && + typeof controller.counterTitles[counterType].none != + "undefined" + ) { + title = controller.counterTitles[counterType].none; + } else { + title = defaultCounterTitles[counterType].none; + } + break; + } + if (title.length > 0) { + container + .data("title", title) + .addClass("forced_title") + .data("use_title_for_force_title", 1); // Trick to make easier the 'force title' output + } + } catch (error) { + // console.log(error); + } + } + + if (type == "services") { + var $counters = $("
      "); + $counters.addClass("tree-node-counters"); + + if ( + counters.total_services + + counters.total_agents + + counters.total_modules > + 0 + ) { + // Open the parentheses + $counters.append(" ("); + + if ( + typeof counters.total_services != "undefined" && + counters.total_services >= 0 + ) { + var $servicesCounter = $("
      "); + $servicesCounter + .addClass("tree-node-counter") + .addClass("total") + .html(counters.total_services); + + _processNodeCounterTitle( + $servicesCounter, + type, + "total_services" + ); + + $counters.append($servicesCounter); + } else { + var $servicesCounter = $("
      "); + $servicesCounter + .addClass("tree-node-counter") + .addClass("total") + .html("0"); + + _processNodeCounterTitle( + $servicesCounter, + type, + "total_services" + ); + + $counters.append($servicesCounter); + } + + if ( + typeof counters.total_agents != "undefined" && + counters.total_agents > 0 + ) { + var $agentsCounter = $("
      "); + $agentsCounter + .addClass("tree-node-counter") + .html(counters.total_agents); + + _processNodeCounterTitle( + $agentsCounter, + type, + "total_agents" + ); + + $counters.append(" : ").append($agentsCounter); + } else { + var $agentsCounter = $("
      "); + $agentsCounter + .addClass("tree-node-counter") + .addClass("total") + .html("0"); + + _processNodeCounterTitle( + $agentsCounter, + type, + "total_agents" + ); + + $counters.append(" : ").append($agentsCounter); + } + + if ( + typeof counters.total_modules != "undefined" && + counters.total_modules > 0 + ) { + var $modulesCounter = $("
      "); + $modulesCounter + .addClass("tree-node-counter") + .addClass("total") + .html(counters.total_modules); + + _processNodeCounterTitle( + $modulesCounter, + type, + "total_modules" + ); + + $counters.append(" : ").append($modulesCounter); + } else { + var $modulesCounter = $("
      "); + $modulesCounter + .addClass("tree-node-counter") + .addClass("total") + .html("0"); + + _processNodeCounterTitle( + $modulesCounter, + type, + "total_modules" + ); + + $counters.append(" : ").append($modulesCounter); + } + + // Close the parentheses + $counters.append(")"); + + hasCounters = true; + } + } else if (type == "IPAM_supernets") { + var $counters = $("
      "); + $counters.addClass("tree-node-counters"); + + if (counters.total_networks > 0) { + // Open the parentheses + $counters.append(" ("); + + if ( + typeof counters.total_networks !== "undefined" && + counters.total_networks >= 0 + ) { + var $networksCounter = $("
      "); + $networksCounter + .addClass("tree-node-counter") + .addClass("total") + .html(counters.total_networks); + + _processNodeCounterTitle( + $networksCounter, + type, + "total_networks" + ); + + $counters.append($networksCounter); + } else { + var $networksCounter = $("
      "); + $networksCounter + .addClass("tree-node-counter") + .addClass("total") + .html("0"); + + _processNodeCounterTitle( + $networksCounter, + type, + "total_networks" + ); + + $counters.append($networksCounter); + } + + // Close the parentheses + $counters.append(")"); + + hasCounters = true; + } + } else if (type == "IPAM_networks") { + var $counters = $("
      "); + $counters.addClass("tree-node-counters"); + + // Open the parentheses + $counters.append(" ("); + + if ( + typeof counters.alive_ips !== "undefined" && + counters.alive_ips >= 0 + ) { + var $aliveCounter = $("
      "); + $aliveCounter + .addClass("tree-node-counter") + .addClass("total") + .html(counters.alive_ips); + + _processNodeCounterTitle($aliveCounter, type, "alive_ips"); + + $counters.append($aliveCounter); + } else { + var $aliveCounter = $("
      "); + $aliveCounter + .addClass("tree-node-counter") + .addClass("total") + .html("0"); + + _processNodeCounterTitle($aliveCounter, type, "alive_ips"); + + $counters.append($aliveCounter); + } + + if ( + typeof counters.total_ips !== "undefined" && + counters.total_ips >= 0 + ) { + var $totalCounter = $("
      "); + $totalCounter + .addClass("tree-node-counter") + .addClass("total") + .html(counters.total_ips); + + _processNodeCounterTitle($totalCounter, type, "total_ips"); + + $counters.append(" : ").append($totalCounter); + } else { + var $totalCounter = $("
      "); + $totalCounter + .addClass("tree-node-counter") + .addClass("total") + .html("0"); + + _processNodeCounterTitle($totalCounter, type, "total_ips"); + + $counters.append(" : ").append($totalCounter); + } + + // Close the parentheses + $counters.append(")"); + + hasCounters = true; + } else { + var $counters = $("
      "); + $counters.addClass("tree-node-counters"); + + if (typeof counters.total != "undefined" && counters.total >= 0) { + var $totalCounter = $("
      "); + $totalCounter + .addClass("tree-node-counter") + .addClass("total") + .html(counters.total); + + _processNodeCounterTitle($totalCounter, type, "total"); + + // Open the parentheses + $counters.append("      [ "); + + $counters.append($totalCounter); + + if ( + typeof counters.alerts != "undefined" && + counters.alerts > 0 + ) { + var $firedCounter = $("
      "); + $firedCounter + .addClass("tree-node-counter") + .addClass("alerts") + .addClass("orange") + .html(counters.alerts); + + _processNodeCounterTitle($firedCounter, type, "alerts"); + + $counters.append(" : ").append($firedCounter); + } + if ( + typeof counters.critical != "undefined" && + counters.critical > 0 + ) { + var $criticalCounter = $("
      "); + $criticalCounter + .addClass("tree-node-counter") + .addClass("critical") + .addClass("red") + .html(counters.critical); + + _processNodeCounterTitle($criticalCounter, type, "critical"); + + $counters.append(" : ").append($criticalCounter); + } + if ( + typeof counters.warning != "undefined" && + counters.warning > 0 + ) { + var $warningCounter = $("
      "); + $warningCounter + .addClass("tree-node-counter") + .addClass("warning") + .addClass("yellow") + .html(counters.warning); + + _processNodeCounterTitle($warningCounter, type, "warning"); + + $counters.append(" : ").append($warningCounter); + } + if ( + typeof counters.unknown != "undefined" && + counters.unknown > 0 + ) { + var $unknownCounter = $("
      "); + $unknownCounter + .addClass("tree-node-counter") + .addClass("unknown") + .addClass("grey") + .html(counters.unknown); + + _processNodeCounterTitle($unknownCounter, type, "unknown"); + + $counters.append(" : ").append($unknownCounter); + } + if ( + typeof counters.not_init != "undefined" && + counters.not_init > 0 + ) { + var $notInitCounter = $("
      "); + $notInitCounter + .addClass("tree-node-counter") + .addClass("not_init") + .addClass("blue") + .html(counters.not_init); + + _processNodeCounterTitle($notInitCounter, type, "not_init"); + + $counters.append(" : ").append($notInitCounter); + } + if (typeof counters.ok != "undefined" && counters.ok > 0) { + var $okCounter = $("
      "); + $okCounter + .addClass("tree-node-counter") + .addClass("ok") + .addClass("green") + .html(counters.ok); + + _processNodeCounterTitle($okCounter, type, "ok"); + + $counters.append(" : ").append($okCounter); + } + } + + // Close the parentheses + $counters.append(" ]"); + + hasCounters = true; + } + + // Add the counters html to the container + container.append($counters); + } + + return hasCounters; + } + + // Load leaf + function _processNode(container, element) { + // type, [id], [serverID], callback + function _getTreeDetailData(type, id, serverID, callback) { + var lastParam = arguments[arguments.length - 1]; + var callback; + if (typeof lastParam === "function") callback = lastParam; + + var serverID; + if (arguments.length >= 4) serverID = arguments[2]; + var id; + if (arguments.length >= 3) id = arguments[1]; + var type; + if (arguments.length >= 2) type = arguments[0]; + + if (typeof type === "undefined") + throw new TypeError("Type required"); + if (typeof callback === "undefined") + throw new TypeError("Callback required"); + + var postData = { + page: controller.ajaxPage, + getDetail: 1, + type: type, + auth_class: controller.auth_class, + id_user: controller.id_user, + auth_hash: controller.auth_hash + }; + + if (typeof id !== "undefined") postData.id = id; + if (typeof serverID !== "undefined") postData.serverID = serverID; + + $.ajax({ + url: controller.ajaxURL, + type: "POST", + dataType: "html", + data: postData, + success: function(data, textStatus, xhr) { + callback(null, data); + }, + error: function(xhr, textStatus, errorThrown) { + callback(errorThrown); + } + }); + } + + var $node = $("
    • "); + var $leafIcon = $("
      "); + var $content = $("
      "); + + // Leaf icon + $leafIcon.addClass("leaf-icon invert_filter"); + + // Content + $content.addClass("node-content"); + var disabled = false; + if (element.disabled == true) { + disabled = true; + $content.addClass("disabled"); + } + switch (element.type) { + case "group": + if ( + typeof element.icon != "undefined" && + element.icon.length > 0 + ) { + $content.append( + ' ' + ); + } else if ( + typeof element.iconHTML != "undefined" && + element.iconHTML.length > 0 + ) { + $content.append(element.iconHTML + " "); + } + $content.append(element.name); + + if (typeof element.edit != "undefined") { + var url_edit = + controller.baseURL + + "index.php?sec=gagente&sec2=godmode/groups/configure_group&tab=tree&id_group=" + + element.id; + var $updateicon = $( + '' + ); + var $updatebtn = $('
      ').append( + $updateicon + ); + $content.append($updatebtn); + } + + if (typeof element.delete != "undefined") { + var url_delete = + controller.baseURL + + "index.php?sec=gagente&sec2=godmode/groups/group_list&tab=tree&delete_group=1&id_group=" + + element.id; + var $deleteBtn = $( + '' + ); + $deleteBtn.click(function(event) { + var ok_function = function() { + window.location.replace(url_delete); + }; + display_confirm_dialog( + element.delete.messages.messg, + element.delete.messages.confirm, + element.delete.messages.cancel, + ok_function + ); + }); + $content.append($deleteBtn); + } + + if (typeof element.alerts != "undefined") { + $content.append(element.alerts); + } + + break; + case "agent": + // Is quiet + + if ( + typeof element.quietImageHTML != "undefined" && + element.quietImageHTML.length > 0 + ) { + var $quietImage = $(element.quietImageHTML); + $quietImage.addClass("agent-quiet"); + + $content.append($quietImage); + } + // Status image + if ( + typeof element.statusImageHTML != "undefined" && + element.statusImageHTML.length > 0 + ) { + var $statusImage = $(element.statusImageHTML); + $statusImage.addClass("agent-status"); + + $content.append($statusImage); + } + + // Events by agent + if (element.showEventsBtn == 1) { + if (typeof element.eventAgent != "undefined") { + $content.append( + '' + ); + var $eventImage = $( + ' ' + ); + $eventImage.addClass("agent-alerts-fired"); + $eventImage + .click(function(e) { + e.preventDefault(); + + document + .getElementById( + "hiddenAgentsEventsForm-" + element.eventAgent + ) + .submit(); + }) + .css("cursor", "pointer"); + + $content.append($eventImage); + } + } + + $content.append(" " + element.alias); + break; + case "IPAM_supernets": + var IPAMSupernetDetailImage = $( + ' ' + ); + + if (typeof element.id !== "undefined") { + IPAMSupernetDetailImage.click(function(e) { + e.preventDefault(); + + var postData = { + page: "enterprise/include/ajax/ipam.ajax", + show_networkmap_statistics: 1, + "node_data[id_net]": element.id, + "node_data[type_net]": "supernet" + }; + + $.ajax({ + url: controller.ajaxURL, + type: "POST", + dataType: "html", + data: postData, + success: function(data, textStatus, xhr) { + controller.detailRecipient + .render("IPAMsupernets", data) + .open(); + } + }); + }).css("cursor", "pointer"); + + $content.append(IPAMSupernetDetailImage); + } + + if (element.name !== null) { + $content.append("   " + element.name); + } + + break; + case "IPAM_networks": + $content.addClass("ipam-network"); + + var IPAMNetworkDetailImage = $( + ' ' + ); + + if (typeof element.id !== "undefined") { + IPAMNetworkDetailImage.click(function(e) { + e.preventDefault(); + + //window.location.href = element.IPAMNetworkDetail; + var postData = { + page: "enterprise/include/ajax/ipam.ajax", + show_networkmap_statistics: 1, + "node_data[id_net]": element.id, + "node_data[type_net]": "network" + }; + + $.ajax({ + url: controller.ajaxURL, + type: "POST", + dataType: "html", + data: postData, + success: function(data, textStatus, xhr) { + controller.detailRecipient + .render("IPAMnetwork", data) + .open(); + } + }); + }).css("cursor", "pointer"); + + $content.append(IPAMNetworkDetailImage); + } + + if (element.name !== null) { + $content.append("   " + element.name); + } + + break; + case "services": + if ( + typeof element.statusImageHTML != "undefined" && + element.statusImageHTML.length > 0 + ) { + var $statusImage = $(element.statusImageHTML); + $statusImage.addClass("agent-status"); + + $content.append($statusImage); + } + var image_tooltip = + '' +
+                element.name +
+                ' '; + + var $serviceDetailImage = $( + ' ' + ); + + if ( + typeof element.serviceDetail != "undefined" && + element.name != null + ) { + $serviceDetailImage + .click(function(e) { + e.preventDefault(); + + window.location.href = element.serviceDetail; + }) + .css("cursor", "pointer"); + $content.append($serviceDetailImage); + $content.append(" " + image_tooltip); + + if ( + typeof element.elementDescription !== "undefined" && + element.elementDescription != "" + ) { + $content.append(" " + element.elementDescription); + } else if ( + typeof element.description !== "undefined" && + element.description != "" + ) { + $content.append(" " + element.description); + } else { + $content.append(" " + element.name); + } + } else { + $content.remove($node); + } + + break; + case "modules": + if ( + typeof element.statusImageHTML != "undefined" && + element.statusImageHTML.length > 0 + ) { + var $statusImage = $(element.statusImageHTML); + $statusImage.addClass("agent-status"); + + $content.append($statusImage); + } + + // Events by module + if (element.showEventsBtn == 1) { + if (typeof element.eventModule != "undefined") { + $content.append( + '' + ); + var $moduleImage = $( + ' ' + ); + $moduleImage + .click(function(e) { + e.preventDefault(); + + document + .getElementById( + "hiddenModulesEventsForm-" + element.eventModule + ) + .submit(); + }) + .css("cursor", "pointer"); + + $content.append($moduleImage); + } + } + + $content.append(" " + element.name); + break; + case "module": + $content.addClass("module"); + + // Status image + if ( + typeof element.statusImageHTML != "undefined" && + element.statusImageHTML.length > 0 + ) { + var $statusImage = $(element.statusImageHTML); + $statusImage.addClass("module-status"); + + $content.append($statusImage); + } + + element.name = htmlDecode(element.name); + // Name max 42 chars. + $content.append( + '' + + element.name.substring(0, 42) + + (element.name.length > 42 ? "..." : "") + + "" + ); + + // Avoiding 'undefined' text. + if (typeof element.value === "undefined") { + element.value = ""; + } + + // Value. + $content.append( + '' + element.value + "" + ); + + if ( + typeof element.showGraphs != "undefined" && + element.showGraphs != 0 + ) { + // Graph histogram pop-up + if (typeof element.histogramGraph != "undefined") { + var graphImageHistogram = $( + ' ' + ); + + graphImageHistogram + .addClass("module-graph") + .click(function(e) { + e.stopPropagation(); + try { + winopeng_var( + element.histogramGraph.url, + element.histogramGraph.handle, + 800, + 480 + ); + } catch (error) { + // console.log(error); + } + }); + + $content.append(graphImageHistogram); + } + + // Graph pop-up + if (typeof element.moduleGraph != "undefined") { + if (element.statusImageHTML.indexOf("data:image") != -1) { + var $graphImage = $( + ' ' + ); + } else { + var $graphImage = $( + ' ' + ); + } + + $graphImage.addClass("module-graph").click(function(e) { + e.stopPropagation(); + if (element.statusImageHTML.indexOf("data:image") != -1) { + try { + winopeng_var( + decodeURI(element.snapshot[0]), + element.snapshot[1], + element.snapshot[2], + element.snapshot[3] + ); + } catch (error) { + // console.log(error); + } + } else { + try { + winopeng_var( + element.moduleGraph.url, + element.moduleGraph.handle, + 800, + 480 + ); + } catch (error) { + // console.log(error); + } + } + }); + + $content.append($graphImage); + } + + // Data pop-up + if (typeof element.id != "undefined" && !isNaN(element.id)) { + if (isNaN(element.metaID)) { + var $dataImage = $( + ' ' + ); + $dataImage.addClass("module-data").click(function(e) { + e.stopPropagation(); + + try { + var serverName = + element.serverName.length > 0 + ? element.serverName + : ""; + if ($("#module_details_window").length > 0) + show_module_detail_dialog( + element.id, + "", + serverName, + 0, + 86400, + element.name.replace(/ /g, " ") + ); + } catch (error) { + // console.log(error); + } + }); + + $content.append($dataImage); + } + } + } + + // Alerts + if ( + typeof element.alertsImageHTML != "undefined" && + element.alertsImageHTML.length > 0 + ) { + var $alertsImage = $(element.alertsImageHTML); + + $alertsImage + .addClass("module-alerts") + .click(function(e) { + _getTreeDetailData( + "alert", + element.id, + element.serverID, + function(error, data) { + if (error) { + // console.error(error); + } else { + controller.detailRecipient + .render(element.name, data) + .open(); + } + } + ); + + // Avoid the execution of the module detail event + e.stopPropagation(); + }) + .css("cursor", "pointer"); + + $content.append($alertsImage); + } + + break; + case "os": + if ( + typeof element.icon != "undefined" && + element.icon.length > 0 + ) { + $content.append( + ' ' + ); + } + $content.append(element.name); + break; + case "tag": + if ( + typeof element.icon != "undefined" && + element.icon.length > 0 + ) { + $content.append( + ' ' + ); + } else { + $content.append( + ' ' + ); + } + $content.append(element.name); + break; + case "services": + // Status image + if ( + typeof element.statusImageHTML != "undefined" && + element.statusImageHTML.length > 0 + ) { + var $statusImage = $(element.statusImageHTML); + $statusImage.addClass("agent-status"); + + $content.append($statusImage); + } + $content.append(element.name); + break; + default: + $content.append(element.name); + break; + } + + // Load the status counters + var hasCounters = _processNodeCounters( + $content, + element.counters, + element.type + ); + //Don't show empty groups + if (element.type == "agent") { + if (!hasCounters) { + return; + } + } + // If detail container exists, show the data. + if ( + typeof controller.detailRecipient !== "undefined" || + disabled == false + ) { + if (element.type == "agent" || element.type == "module") { + if (typeof element.noAcl === "undefined") { + $content + .click(function(e) { + _getTreeDetailData( + element.type, + element.id, + element.serverID, + function(error, data) { + if (error) { + // console.error(error); + } else { + controller.detailRecipient + .render(element.name, data) + .open(); + } + } + ); + }) + .css("cursor", "pointer"); + } + } + } + + $node + .addClass("tree-node") + .append($leafIcon) + .append($content); + + container.append($node); + + $node.addClass("leaf-empty"); + + if ( + (typeof element.children != "undefined" && + element.children.length > 0) || + element.disabled == false + ) { + // Add children + var $children = _processGroup($node, element.children); + $node.data("children", $children); + + if ( + typeof element.searchChildren == "undefined" || + !element.searchChildren + ) { + $leafIcon.click(function(e) { + e.preventDefault(); + + if ($node.hasClass("leaf-open")) { + $node + .removeClass("leaf-open") + .addClass("leaf-closed") + .data("children") + .slideUp(); + } else { + $node + .removeClass("leaf-closed") + .addClass("leaf-open") + .data("children") + .slideDown(); + } + }); + } + } + + if ( + typeof element.searchChildren != "undefined" && + element.searchChildren + ) { + if ( + element.rootType == "group_edition" && + typeof element.children == "undefined" + ) { + $node.addClass("leaf-empty"); + } else { + $node.removeClass("leaf-empty").addClass("leaf-closed"); + $leafIcon.click(function(e) { + e.preventDefault(); + + if ( + !$node.hasClass("leaf-loading") && + !$node.hasClass("children-loaded") && + !$node.hasClass("leaf-empty") + ) { + $node + .removeClass("leaf-closed") + .removeClass("leaf-error") + .addClass("leaf-loading"); + + $.ajax({ + url: controller.ajaxURL, + type: "POST", + dataType: "json", + data: { + page: controller.ajaxPage, + getChildren: 1, + id: element.id, + type: element.type, + rootID: element.rootID, + serverID: element.serverID, + rootType: element.rootType, + metaID: element.metaID, + title: element.title, + filter: controller.filter, + auth_class: controller.auth_class, + id_user: controller.id_user, + auth_hash: controller.auth_hash + }, + complete: function(xhr, textStatus) { + $node.removeClass("leaf-loading"); + $node.addClass("children-loaded"); + }, + success: function(data, textStatus, xhr) { + if (data.success) { + var $group = $node.children("ul.tree-group"); + if ( + (typeof data.tree != "undefined" && + data.tree.length > 0) || + $group.length > 0 + ) { + $node.addClass("leaf-open"); + + if ($group.length <= 0) { + $group = $("
        "); + $group.addClass("tree-group").hide(); + $node.append($group); + } + + // Get the main values of the tree. + var rawTree = Object.values(data.tree); + // Sorting tree by description (services.treeview_services.php). + rawTree.sort(function(a, b) { + // Only the services are ordered since only they have the elementDescription property. + if (a.elementDescription && b.elementDescription) { + var x = a.elementDescription.toLowerCase(); + var y = b.elementDescription.toLowerCase(); + if (x < y) { + return -1; + } + if (x > y) { + return 1; + } + } + return 0; + }); + + _.each(rawTree, function(element) { + element.jqObject = _processNode($group, element); + }); + + $group.slideDown(); + + $node.data("children", $group); + + // Add again the hover event to the 'force_callback' elements + forced_title_callback(); + } else { + $node.addClass("leaf-empty"); + } + } else { + $node.addClass("leaf-error"); + } + }, + error: function(xhr, textStatus, errorThrown) { + $node.addClass("leaf-error"); + } + }); + } else if (!$node.hasClass("leaf-empty")) { + if ($node.hasClass("leaf-open")) { + $node + .removeClass("leaf-open") + .addClass("leaf-closed") + .data("children") + .slideUp(); + } else { + $node + .removeClass("leaf-closed") + .addClass("leaf-open") + .data("children") + .slideDown(); + } + } + }); + } + } + + return $node; + } + + if (controller.recipient.length == 0) { + return; + } else if (controller.tree.length == 0) { + controller.recipient.empty(); + controller.recipient.html( + "
        " + controller.emptyMessage + "
        " + ); + return; + } + + controller.recipient.empty(); + var $children = _processGroup(this.recipient, this.tree, true); + $children.show(); + + controller.recipient.data("children", $children); + + // Add again the hover event to the 'force_callback' elements + forced_title_callback(); + }, + load: function() { + this.reload(); + }, + changeTree: function(tree) { + this.tree = tree; + this.reload(); + }, + init: function(data) { + if ( + typeof data.recipient !== "undefined" && + data.recipient.length > 0 + ) { + this.recipient = data.recipient; + } + if (typeof data.detailRecipient !== "undefined") { + this.detailRecipient = data.detailRecipient; + } + if (typeof data.tree !== "undefined") { + this.tree = data.tree; + } + if ( + typeof data.emptyMessage !== "undefined" && + data.emptyMessage.length > 0 + ) { + this.emptyMessage = data.emptyMessage; + } + if ( + typeof data.foundMessage !== "undefined" && + data.foundMessage.length > 0 + ) { + this.foundMessage = data.foundMessage; + } + if ( + typeof data.errorMessage !== "undefined" && + data.errorMessage.length > 0 + ) { + this.errorMessage = data.errorMessage; + } + if (typeof data.baseURL !== "undefined" && data.baseURL.length > 0) { + this.baseURL = data.baseURL; + } + if (typeof data.ajaxURL !== "undefined" && data.ajaxURL.length > 0) { + this.ajaxURL = data.ajaxURL; + } + if (typeof data.ajaxPage !== "undefined" && data.ajaxPage.length > 0) { + this.ajaxPage = data.ajaxPage; + } + if (typeof data.filter !== "undefined") { + this.filter = data.filter; + } + + if (typeof data.auth_class !== "undefined") { + this.auth_class = data.auth_class; + } + if (typeof data.id_user !== "undefined") { + this.id_user = data.id_user; + } + if (typeof data.auth_hash !== "undefined") { + this.auth_hash = data.auth_hash; + } + if ( + typeof data.tree !== "undefined" && + Array.isArray(data.tree) && + data.tree.length > 0 && + data.tree[0]["rootType"] == "services" + ) { + this.foundMessage = ""; + } + this.load(); + }, + remove: function() { + if (typeof this.recipient != "undefined" && this.recipient.length > 0) { + this.recipient.empty(); + } + + if (this.index > -1) { + TreeController.controllers.splice(this.index, 1); + } + } + }; + controller.index = TreeController.controllers.push(controller) - 1; + + return controller; + } +}; diff --git a/pandora_console/include/lib/Dashboard/Widgets/tree_view.php b/pandora_console/include/lib/Dashboard/Widgets/tree_view.php index bdb30b16ce..373e70c1f6 100644 --- a/pandora_console/include/lib/Dashboard/Widgets/tree_view.php +++ b/pandora_console/include/lib/Dashboard/Widgets/tree_view.php @@ -134,7 +134,12 @@ class TreeViewWidget extends Widget ) { global $config; - ui_require_css_file('tree'); + if (is_metaconsole() === true) { + ui_require_css_file('tree_meta'); + } else { + ui_require_css_file('tree'); + } + ui_require_css_file('fixed-bottom-box'); // WARNING: Do not edit. This chunk must be in the constructor. @@ -544,7 +549,12 @@ class TreeViewWidget extends Widget $height = $size['height']; // Css Files. - \ui_require_css_file('tree', 'include/styles/', true); + if (is_metaconsole() === true) { + \ui_require_css_file('tree_meta', 'include/styles/', true); + } else { + \ui_require_css_file('tree', 'include/styles/', true); + } + if ($config['style'] == 'pandora_black' && !is_metaconsole()) { \ui_require_css_file('pandora_black', 'include/styles/', true); } @@ -556,11 +566,19 @@ class TreeViewWidget extends Widget 'include/javascript/i18n/' ); - \ui_require_javascript_file( - 'TreeController', - 'include/javascript/tree/', - true - ); + if (is_metaconsole() === true) { + \ui_require_javascript_file( + 'TreeControllerMeta', + 'include/javascript/tree/', + true + ); + } else { + \ui_require_javascript_file( + 'TreeController', + 'include/javascript/tree/', + true + ); + } \ui_require_javascript_file( 'fixed-bottom-box', diff --git a/pandora_console/include/styles/tree_meta.css b/pandora_console/include/styles/tree_meta.css new file mode 100644 index 0000000000..08b1d635ed --- /dev/null +++ b/pandora_console/include/styles/tree_meta.css @@ -0,0 +1,195 @@ +.tree-root { + margin-top: 0px; + margin-bottom: 0px; +} + +.tree-group { + margin-left: 24px; + padding-top: 1px; +} + +.tree-node { + white-space: nowrap; + + background-image: url(../../images/tree/branch.png); + background-position: 0px 0px; + background-repeat: repeat-y; + + min-height: 26px; +} + +div.tree-node { + background: 0 0; +} + +div.tree-node span { + font-size: 1.2em; +} + +.tree-node:last-child { + background: 0 0; +} +.node-content { + height: 26px; + font-size: 1.2em; + display: flex; + flex-direction: row; + flex-wrap: wrap; + align-items: center; +} + +.node-content > img { + position: relative; + top: -2px; +} + +.node-content:hover { + background-color: #fff; + + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; +} + +.leaf-icon { + width: 18px; + height: 20px; +} + +.node-content, +.leaf-icon { + display: inline-block; +} + +.node-content > img, +.node-content > div { + display: inline; +} + +.tree-node.leaf-open > .leaf-icon { + background-image: url(../../images/tree/last_expanded.png); + cursor: pointer; +} + +.tree-node.tree-first.leaf-open > .leaf-icon { + background-image: url(../../images/tree/first_expanded.png); + cursor: pointer; +} + +.tree-node.leaf-closed > .leaf-icon { + background-image: url(../../images/tree/last_closed.png); + cursor: pointer; +} + +.tree-node.tree-first.leaf-closed > .leaf-icon { + background-image: url(../../images/tree/first_closed.png); + cursor: pointer; +} + +.tree-node.leaf-loading > .leaf-icon { + background-image: url(../../images/tree/last_expanded.png); +} + +.tree-node.leaf-empty > .leaf-icon { + background-image: url(../../images/tree/last_leaf.png); +} + +.tree-node.tree-first.leaf-empty > .leaf-icon { + background-image: url(../../images/tree/first_leaf.png); +} + +.tree-node.leaf-error > .leaf-icon { + background-image: url(../../images/tree/last_leaf.png); +} + +.tree-node > .leaf-icon { + background-position: 0px 0px; + background-repeat: no-repeat; +} + +.tree-node > .node-content > img { + max-height: 20px; + /*max-width: 20px;*/ +} + +.tree-node > .node-content > img.module-data, +.tree-node > .node-content > img.module-graph { + cursor: pointer; + padding-right: 3px; +} + +.tree-node > .node-content > .agent-status.status_balls, +.tree-node > .node-content > .status_small_balls { + width: 0.6em; + height: 1.5em; + margin-bottom: -0.4em; + border-radius: 0; +} +.tree-node > .node-content > .module-status.status_small_balls { + width: 0.4em; +} + +.tree-node > .node-content > .module-name { + margin: 0 0 0 1em; + width: 250px; + display: inline-block; +} + +.tree-node > .node-content > .module-value { + width: 120px; + display: inline-block; + text-align: right; + margin: 0 1em; +} + +.tree-node > .node-content > img.module-server-type, +.tree-node > .node-content > img.agent-status, +.tree-node > .node-content > img.agent-alerts-fired, +.tree-node > .node-content > img.agent-quiet, +.tree-node > .node-content > img.module-status, +.tree-node > .node-content > img.module-alerts { + padding-right: 3px; +} + +.tree-node > .node-content > .tree-node-counters, +.tree-node > .node-content > .tree-node-counters > .tree-node-counter { + display: inline; +} + +.tree-node > .node-content > .tree-node-counters { + font-size: 1.2em; +} + +.tree-node > .node-content > img { + vertical-align: middle; +} + +.tree-node > .node-content > .tree-node-counters > .tree-node-counter { + font-weight: bold; + font-size: 0.9em; + cursor: default; +} + +div#tree-controller-recipient { + text-align: left; + width: 98%; + margin-top: 10px; +} + +.tree-controller-recipient { + text-align: left; + width: 98%; + margin-top: 10px; +} + +.tree-node > .node-content > div + div:not(.tree-node-counters) { + margin-left: 3px; +} + +.tree-node .disabled { + filter: opacity(0.3); +} + +.ipam-network { + font-size: 9pt; +} diff --git a/pandora_console/operation/tree.php b/pandora_console/operation/tree.php index 29d4c95b78..a662da4d99 100755 --- a/pandora_console/operation/tree.php +++ b/pandora_console/operation/tree.php @@ -27,7 +27,12 @@ */ // Begin. -ui_require_css_file('tree'); +if (is_metaconsole() === true) { + ui_require_css_file('tree_meta'); +} else { + ui_require_css_file('tree'); +} + ui_require_css_file('fixed-bottom-box'); global $config; @@ -309,7 +314,12 @@ html_print_input_hidden('tag-id', $tag_id); ui_include_time_picker(); ui_require_jquery_file('ui.datepicker-'.get_user_language(), 'include/javascript/i18n/'); -ui_require_javascript_file('TreeController', 'include/javascript/tree/'); +if (is_metaconsole() === true) { + ui_require_javascript_file('TreeControllerMeta', 'include/javascript/tree/'); +} else { + ui_require_javascript_file('TreeController', 'include/javascript/tree/'); +} + ui_print_spinner(__('Loading')); /* html_print_image( From 7ac794f5ffb1c11496110352a350d8dd685aa358 Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Tue, 21 Feb 2023 11:28:26 +0100 Subject: [PATCH 298/474] 10469-Fix omnishell view --- pandora_console/include/functions_ui.php | 2 +- .../tiny_mce/plugins/table/css/table.css | 6 +- pandora_console/include/styles/omnishell.css | 195 +++++++++++------- pandora_console/include/styles/tables.css | 2 +- 4 files changed, 129 insertions(+), 76 deletions(-) diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index e0790db4e7..4675737c57 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -3559,7 +3559,7 @@ function ui_print_datatable(array $parameters) $filter .= $parameters['form']['html']; } - $filter .= '
          '; + $filter .= '
            '; foreach ($parameters['form']['inputs'] as $input) { $filter .= html_print_input(($input + ['return' => true]), 'li'); diff --git a/pandora_console/include/javascript/tiny_mce/plugins/table/css/table.css b/pandora_console/include/javascript/tiny_mce/plugins/table/css/table.css index d11c3f69cb..f11a6c13a1 100644 --- a/pandora_console/include/javascript/tiny_mce/plugins/table/css/table.css +++ b/pandora_console/include/javascript/tiny_mce/plugins/table/css/table.css @@ -1,13 +1,13 @@ /* CSS file for table dialog in the table plugin */ .panel_wrapper div.current { - height: 245px; + height: 245px; } .advfield { - width: 200px; + width: 200px; } #class { - width: 150px; + width: 150px; } diff --git a/pandora_console/include/styles/omnishell.css b/pandora_console/include/styles/omnishell.css index 803c790660..03810e9a89 100644 --- a/pandora_console/include/styles/omnishell.css +++ b/pandora_console/include/styles/omnishell.css @@ -180,7 +180,7 @@ ul.wizard { display: flex; } -.no-class.action-buttons.mw120px.textright.sorting_disabled, +.textright.sorting_disabled, .textright { text-align: right; padding-right: 2em; @@ -306,56 +306,8 @@ div.arrow_box:before { /* * Breadcrum */ - -#menu_tab_frame_view_bc { - display: flex; - justify-content: space-between; - border-bottom: 2px solid #82b92e; - max-height: 70px; - min-height: 55px; - width: 100%; - padding-right: 0px; - margin-left: 0px; - margin-bottom: 20px; - height: 55px; - box-sizing: border-box; - background-color: #fafafa; - border-top-right-radius: 7px; - border-top-left-radius: 7px; - box-shadow: 0px 0px 2px rgba(0, 0, 0, 0.1); -} - -#menu_tab_frame_view_bc .breadcrumbs_container { - align-self: flex-start; -} - -.breadcrumbs_container { - padding-top: 4px; - text-indent: 0.25em; - padding-left: 2.5em; -} - -.breadcrumb_link { - color: #848484; - font-size: 10pt; - text-decoration: none; -} - -span.breadcrumb_link { - color: #d0d0d0; - font-size: 12pt; -} - -.breadcrumb_link.selected { - color: #95b750; -} - -.breadcrumb_link.selected:hover { - color: #95b750; -} - -.breadcrumb_link:hover { - color: #95b750; +#menu_tab_frame_view > #menu_tab_left { + margin-left: 20px; } /* @@ -398,26 +350,8 @@ label { width: 100%; } -li > input[type="text"], -li > input[type="email"], -li > input[type="password"], -li > input[type="email"], -.discovery_text_input > input[type="password"], -.discovery_text_input > input[type="text"], -#interval_manual > input[type="text"] { - background-color: transparent; - border: none; - border-radius: 0; - border-bottom: 1px solid #ccc; - padding: 0px 0px 2px 0px; - box-sizing: border-box; - margin-bottom: 4px; -} - -#interval_manual > input[type="text"] { - width: 50px; - margin-left: 10px; - margin-right: 10px; +li .select2 { + max-width: 400px !important; } .discovery_list_input { @@ -518,3 +452,122 @@ div.ui-tooltip.ui-corner-all.ui-widget-shadow.ui-widget.ui-widget-content.uitool bottom: -20px; top: auto; } + +form > .white_box { + padding: 20px; + margin: 20px; +} + +.white_box { + margin: 20px; +} + +button[type="submit"] { + margin-left: 20px; +} + +li > input[type="text"] { + max-width: 428px; +} + +div.edit_discovery_input > div { + margin-bottom: 8px !important; +} + +div.discovery_text_input > input { + width: 100% !important; +} + +li > .select2, +li > .selection, +li > .select2-selection { + min-width: 428px !important; +} + +.edit_discovery_info { + margin: 0px !important; + padding: 0px !important; +} + +.box-flat { + margin: 20px; +} + +.mrgn_20px { + margin: 20px !important; +} + +.omnishell_results_wrapper { + max-width: 100% !important; +} + +.no-text-imp { + padding: 0px !important; + margin: 0px !important; +} + +.candeleted { + margin: 0px 10px !important; +} + +.dataTables_length, +.dt-buttons { + margin-left: 20px; +} + +table { + max-width: calc(100% - 40px) !important; +} + +/* Filter */ +li > .action-buttons { + padding: 0px; +} + +ul.wizard > li, +ul.datatable_filter > li { + display: grid; +} + +ul.wizard > li > label, +ul.datatable_filter > li > label { + margin-bottom: 8px !important; +} + +ul.datatable_filter > li:has(div.action-buttons) { + margin-bottom: 0; +} + +ul.datatable_filter > li > div.action-buttons > button { + margin-bottom: 0px !important; +} + +#backgroundMaskId { + bottom: 0px !important; + height: auto !important; +} + +.action_buttons_right_content { + padding-left: 20px; +} + +#image-1, +#image-2 { + padding-left: 0px !important; +} + +.flex-column { + margin-bottom: 10px !important; +} + +.dataTables_length { + margin-bottom: 50px !important; +} + +.item_status_tree_view { + position: initial; +} + +.ui-dialog.ui-corner-all.ui-widget.ui-widget-content { + z-index: 10000 !important; +} diff --git a/pandora_console/include/styles/tables.css b/pandora_console/include/styles/tables.css index a726e6ecb9..04225827bf 100644 --- a/pandora_console/include/styles/tables.css +++ b/pandora_console/include/styles/tables.css @@ -461,7 +461,7 @@ a.pandora_pagination.current:hover { } .table_action_buttons a:hover { - background-color: #fff; + background-color: transparent; border-radius: 4px; } From 77f4f4a68001f534afd304f85870445f426dc08d Mon Sep 17 00:00:00 2001 From: rafael Date: Tue, 21 Feb 2023 12:34:11 +0100 Subject: [PATCH 299/474] 10435 set new version number --- extras/deploy-scripts/deploy_ext_database_el8.sh | 2 +- extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh | 2 +- extras/deploy-scripts/pandora_deploy_community_el8.sh | 2 +- extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extras/deploy-scripts/deploy_ext_database_el8.sh b/extras/deploy-scripts/deploy_ext_database_el8.sh index 93dc1c561c..52bad444fe 100644 --- a/extras/deploy-scripts/deploy_ext_database_el8.sh +++ b/extras/deploy-scripts/deploy_ext_database_el8.sh @@ -9,7 +9,7 @@ # RedHat 8.5 #Constants -S_VERSION='202302081' +S_VERSION='202302201' LOGFILE="/tmp/deploy-ext-db-$(date +%F).log" diff --git a/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh b/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh index 22349ea5ce..dba6aa2773 100644 --- a/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh +++ b/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh @@ -16,7 +16,7 @@ PANDORA_AGENT_CONF=/etc/pandora/pandora_agent.conf WORKDIR=/opt/pandora/deploy -S_VERSION='202302081' +S_VERSION='202302201' LOGFILE="/tmp/deploy-ext-db-$(date +%F).log" rm -f $LOGFILE &> /dev/null # remove last log before start diff --git a/extras/deploy-scripts/pandora_deploy_community_el8.sh b/extras/deploy-scripts/pandora_deploy_community_el8.sh index 4fa0814d59..721d60ffb5 100644 --- a/extras/deploy-scripts/pandora_deploy_community_el8.sh +++ b/extras/deploy-scripts/pandora_deploy_community_el8.sh @@ -14,7 +14,7 @@ PANDORA_SERVER_CONF=/etc/pandora/pandora_server.conf PANDORA_AGENT_CONF=/etc/pandora/pandora_agent.conf -S_VERSION='202301251' +S_VERSION='202302201' LOGFILE="/tmp/pandora-deploy-community-$(date +%F).log" # define default variables diff --git a/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh b/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh index 5ac47ca60b..06f23804db 100644 --- a/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh +++ b/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh @@ -16,7 +16,7 @@ PANDORA_AGENT_CONF=/etc/pandora/pandora_agent.conf WORKDIR=/opt/pandora/deploy -S_VERSION='202301251' +S_VERSION='202302201' LOGFILE="/tmp/pandora-deploy-community-$(date +%F).log" rm -f $LOGFILE &> /dev/null # remove last log before start From 47bd0081ef72e14aeb90f25518b091112b583263 Mon Sep 17 00:00:00 2001 From: Calvo Date: Tue, 21 Feb 2023 12:56:26 +0100 Subject: [PATCH 300/474] Core: Fix and optimized lag calculaton. Console: optimized and unified queries with server --- pandora_console/include/functions_servers.php | 79 +++++++++++-------- pandora_server/lib/PandoraFMS/Core.pm | 67 +++++++++------- 2 files changed, 87 insertions(+), 59 deletions(-) diff --git a/pandora_console/include/functions_servers.php b/pandora_console/include/functions_servers.php index 3f9fe1a6b2..a1dfc32197 100644 --- a/pandora_console/include/functions_servers.php +++ b/pandora_console/include/functions_servers.php @@ -1,4 +1,5 @@ 0 - AND tagente.disabled = 0 - AND tagente.id_agente = tagente_estado.id_agente - AND tagente_modulo.disabled = 0 - AND tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo - AND current_interval > 0 - AND running_by = '.$server['id_server'].' - AND (UNIX_TIMESTAMP() - utimestamp) < ( current_interval * 10) - AND (UNIX_TIMESTAMP() - utimestamp) > current_interval' + $sql = sprintf( + 'SELECT COUNT(tam.id_agente_modulo) AS module_lag, + AVG(UNIX_TIMESTAMP() - tae.last_execution_try - tae.current_interval) AS "lag" + FROM ( + SELECT tagente_estado.last_execution_try, tagente_estado.current_interval, tagente_estado.id_agente_modulo + FROM tagente_estado + WHERE tagente_estado.current_interval > 0 + AND tagente_estado.last_execution_try > 0 + AND tagente_estado.running_by = %d + ) tae + JOIN ( + SELECT tagente_modulo.id_agente_modulo + FROM tagente_modulo LEFT JOIN tagente + ON tagente_modulo.id_agente = tagente.id_agente + WHERE tagente.disabled = 0 + AND tagente_modulo.disabled = 0 + ) tam + ON tae.id_agente_modulo = tam.id_agente_modulo + WHERE (UNIX_TIMESTAMP() - tae.last_execution_try) > (tae.current_interval) + AND (UNIX_TIMESTAMP() - tae.last_execution_try) < ( tae.current_interval * 10)', + $server['id_server'] ); } else { // Local/Dataserver server LAG calculation. // MySQL 8.0 has function lag(). So, lag must be enclosed in quotations. - $result = db_get_row_sql( - 'SELECT COUNT(tagente_modulo.id_agente_modulo) AS module_lag, - AVG(UNIX_TIMESTAMP() - utimestamp - current_interval) AS "lag" - FROM tagente_estado, tagente_modulo, tagente - WHERE utimestamp > 0 - AND tagente.disabled = 0 - AND tagente.id_agente = tagente_estado.id_agente - AND tagente_modulo.disabled = 0 - AND tagente_modulo.id_tipo_modulo < 5 - AND tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo - AND current_interval > 0 - AND (UNIX_TIMESTAMP() - utimestamp) < ( current_interval * 10) - AND running_by = '.$server['id_server'].' - AND (UNIX_TIMESTAMP() - utimestamp) > (current_interval * 1.1)' + $sql = sprintf( + 'SELECT COUNT(tam.id_agente_modulo) AS module_lag, + AVG(UNIX_TIMESTAMP() - tae.last_execution_try - tae.current_interval) AS "lag" + FROM ( + SELECT tagente_estado.last_execution_try, tagente_estado.current_interval, tagente_estado.id_agente_modulo + FROM tagente_estado + WHERE tagente_estado.current_interval > 0 + AND tagente_estado.last_execution_try > 0 + AND tagente_estado.running_by = %d + ) tae + JOIN ( + SELECT tagente_modulo.id_agente_modulo + FROM tagente_modulo LEFT JOIN tagente + ON tagente_modulo.id_agente = tagente.id_agente + WHERE tagente.disabled = 0 + AND tagente_modulo.disabled = 0 + AND tagente_modulo.id_tipo_modulo < 5 + ) tam + ON tae.id_agente_modulo = tam.id_agente_modulo + WHERE (UNIX_TIMESTAMP() - tae.last_execution_try) > (tae.current_interval * 1.1) + AND (UNIX_TIMESTAMP() - tae.last_execution_try) < ( tae.current_interval * 10)', + $server['id_server'] ); } + $result = db_get_row_sql($sql); // Lag over current_interval * 2 is not lag, // it's a timed out module. if (!empty($result['lag'])) { @@ -1137,11 +1154,11 @@ function servers_check_remote_config($server_name) $config['remote_config'] ).'/conf/'.$server_md5.'.srv.conf'; - if (! isset($filenames['conf'])) { + if (!isset($filenames['conf'])) { return false; } - if (! isset($filenames['md5'])) { + if (!isset($filenames['md5'])) { return false; } diff --git a/pandora_server/lib/PandoraFMS/Core.pm b/pandora_server/lib/PandoraFMS/Core.pm index 04fd172019..234229b5c1 100644 --- a/pandora_server/lib/PandoraFMS/Core.pm +++ b/pandora_server/lib/PandoraFMS/Core.pm @@ -5629,37 +5629,48 @@ sub pandora_server_statistics ($$) { if ($server->{"server_type"} != DATASERVER){ $lag_row = get_db_single_row ($dbh, - "SELECT COUNT(tam.id_agente_modulo) AS module_lag, AVG(UNIX_TIMESTAMP() - tae.last_execution_try - tae.current_interval) AS lag - FROM ( - SELECT tagente_estado.last_execution_try, tagente_estado.current_interval, tagente_estado.id_agente_modulo - FROM tagente_estado - WHERE tagente_estado.current_interval > 0 - AND tagente_estado.last_execution_try > 0 - AND tagente_estado.running_by = ? - ) tae - JOIN ( - SELECT tagente_modulo.id_agente_modulo, tagente_modulo.flag - FROM tagente_modulo LEFT JOIN tagente - ON tagente_modulo.id_agente = tagente.id_agente - WHERE tagente.disabled = 0 - AND tagente_modulo.disabled = 0 - AND tagente_modulo.id_tipo_modulo < 5 - ) tam - ON tae.id_agente_modulo = tam.id_agente_modulo - WHERE (UNIX_TIMESTAMP() - tae.last_execution_try) < ( tae.current_interval * 10) - AND (tam.flag = 1 OR (UNIX_TIMESTAMP() - tae.last_execution_try) > tae.current_interval)", $server->{"id_server"}); + "SELECT COUNT(tam.id_agente_modulo) AS module_lag, + AVG(UNIX_TIMESTAMP() - tae.last_execution_try - tae.current_interval) AS "lag" + FROM ( + SELECT tagente_estado.last_execution_try, tagente_estado.current_interval, tagente_estado.id_agente_modulo + FROM tagente_estado + WHERE tagente_estado.current_interval > 0 + AND tagente_estado.last_execution_try > 0 + AND tagente_estado.running_by = ? + ) tae + JOIN ( + SELECT tagente_modulo.id_agente_modulo + FROM tagente_modulo LEFT JOIN tagente + ON tagente_modulo.id_agente = tagente.id_agente + WHERE tagente.disabled = 0 + AND tagente_modulo.disabled = 0 + ) tam + ON tae.id_agente_modulo = tam.id_agente_modulo + WHERE (UNIX_TIMESTAMP() - tae.last_execution_try) > (tae.current_interval) + AND (UNIX_TIMESTAMP() - tae.last_execution_try) < ( tae.current_interval * 10)", $server->{"id_server"}); } # Dataserver LAG calculation: else { - $lag_row = get_db_single_row ($dbh, "SELECT COUNT(tagente_modulo.id_agente_modulo) AS module_lag, AVG(UNIX_TIMESTAMP() - utimestamp - current_interval) AS lag - FROM tagente_estado, tagente_modulo - WHERE utimestamp > 0 - AND tagente_modulo.disabled = 0 - AND tagente_modulo.id_agente_modulo = tagente_estado.id_agente_modulo - AND current_interval > 0 - AND running_by = ? - AND (UNIX_TIMESTAMP() - utimestamp) < ( current_interval * 10) - AND (UNIX_TIMESTAMP() - utimestamp) > current_interval", $server->{"id_server"}); + $lag_row = get_db_single_row ($dbh, "SELECT COUNT(tam.id_agente_modulo) AS module_lag, + AVG(UNIX_TIMESTAMP() - tae.last_execution_try - tae.current_interval) AS "lag" + FROM ( + SELECT tagente_estado.last_execution_try, tagente_estado.current_interval, tagente_estado.id_agente_modulo + FROM tagente_estado + WHERE tagente_estado.current_interval > 0 + AND tagente_estado.last_execution_try > 0 + AND tagente_estado.running_by = ? + ) tae + JOIN ( + SELECT tagente_modulo.id_agente_modulo + FROM tagente_modulo LEFT JOIN tagente + ON tagente_modulo.id_agente = tagente.id_agente + WHERE tagente.disabled = 0 + AND tagente_modulo.disabled = 0 + AND tagente_modulo.id_tipo_modulo < 5 + ) tam + ON tae.id_agente_modulo = tam.id_agente_modulo + WHERE (UNIX_TIMESTAMP() - tae.last_execution_try) > (tae.current_interval * 1.1) + AND (UNIX_TIMESTAMP() - tae.last_execution_try) < ( tae.current_interval * 10)", $server->{"id_server"}); } $server->{"module_lag"} = $lag_row->{'module_lag'}; From 80818d7b6eb6226e2061d12f1b6510be5b806add Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Tue, 21 Feb 2023 13:18:44 +0100 Subject: [PATCH 301/474] 10489-Fix alerts edition and event response --- .../alerts/configure_alert_template.php | 29 +++++++++++-------- .../godmode/events/event_responses.editor.php | 3 +- pandora_console/include/styles/events.css | 5 ++++ 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/pandora_console/godmode/alerts/configure_alert_template.php b/pandora_console/godmode/alerts/configure_alert_template.php index 8838c5c458..670f48d939 100644 --- a/pandora_console/godmode/alerts/configure_alert_template.php +++ b/pandora_console/godmode/alerts/configure_alert_template.php @@ -938,7 +938,7 @@ if ($step == 2) { false, (!$is_management_allowed | $disabled), "removeTinyMCE('textarea_field".$i."')", - '', + 'style="height: 15px !important;"', true ); // Advanced. @@ -951,7 +951,7 @@ if ($step == 2) { true, (!$is_management_allowed | $disabled), "addTinyMCE('textarea_field".$i."')", - '', + 'style="height: 15px !important;"', true ); $table->data['field'.$i][1] .= '
        '; @@ -962,7 +962,7 @@ if ($step == 2) { 1, 1, isset($fields[$i]) ? $fields[$i] : '', - 'class="fields" min-height-40px', + 'class="fields w100p" style="min-height: 100px !important;"', true, '', (!$is_management_allowed | $disabled) @@ -979,7 +979,7 @@ if ($step == 2) { false, (!$is_management_allowed | $disabled), "removeTinyMCE('textarea_field".$i."_recovery')", - '', + 'style="height: 15px !important;"', true ); // Advanced. @@ -992,7 +992,7 @@ if ($step == 2) { true, (!$is_management_allowed | $disabled), "addTinyMCE('textarea_field".$i."_recovery')", - '', + 'style="height: 15px !important;"', true ); $table->data['field'.$i][2] .= '
        '; @@ -1003,7 +1003,7 @@ if ($step == 2) { 1, 1, isset($fields_recovery[$i]) ? $fields_recovery[$i] : '', - 'class="fields min-height-40px"', + 'class="fields w100p" style="min-height: 100px !important;"', true, '', (!$is_management_allowed | $disabled) @@ -1167,32 +1167,37 @@ if ($id) { if (!$disabled) { if ($is_management_allowed === true) { if ($step >= LAST_STEP) { - html_print_submit_button( + $actionButtons = html_print_submit_button( __('Finish'), 'finish', false, - 'class="sub upd"' + 'class="submitButton"', + true ); } else { html_print_input_hidden('step', ($step + 1)); if ($step == 2) { // Javascript onsubmit to avoid min = 0 and max = 0. - html_print_submit_button( + $actionButtons = html_print_submit_button( __('Next'), 'next', false, - 'class="sub next" onclick="return check_fields_step2();"' + 'class="submitButton" onclick="return check_fields_step2();"', + true ); } else { - html_print_submit_button( + $actionButtons = html_print_submit_button( __('Next'), 'next', false, - 'class="sub next"' + 'class="submitButton"', + true ); } } } + + html_print_action_buttons($actionButtons, ['type' => 'form_action']); } echo '
        '; diff --git a/pandora_console/godmode/events/event_responses.editor.php b/pandora_console/godmode/events/event_responses.editor.php index 1e85796740..5d802fbf49 100644 --- a/pandora_console/godmode/events/event_responses.editor.php +++ b/pandora_console/godmode/events/event_responses.editor.php @@ -84,6 +84,7 @@ if ($event_response_id > 0) { $table = new stdClass(); $table->styleTable = 'margin: 10px 10px 0'; $table->class = 'databox filters'; +$table->colspan[4][1] = 3; if (is_metaconsole()) { $table->head[0] = __('Edit event responses'); @@ -183,7 +184,7 @@ $data[1] = html_print_textarea( 3, 1, $event_response['target'], - 'class="mh_initial"', + 'class="mh_initial w100p"', true ); diff --git a/pandora_console/include/styles/events.css b/pandora_console/include/styles/events.css index 5ce82260d8..dc1f7415b7 100644 --- a/pandora_console/include/styles/events.css +++ b/pandora_console/include/styles/events.css @@ -483,3 +483,8 @@ div.multi-response-buttons { flex-direction: row-reverse; justify-content: flex-start; } + +td:has(div#server_to_exec_label), +td:has(div#server_to_exec_value) { + padding: 0px; +} From 2fd52eff484753415dfe2f0ae637ee9d5e5e50b6 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Tue, 21 Feb 2023 14:14:13 +0100 Subject: [PATCH 302/474] Sprint 2025Feb Improve UI-UX and Resources views --- pandora_console/extensions/insert_data.php | 134 +++++++++------ .../extensions/resource_registration.php | 160 ++++++++++-------- .../godmode/agentes/configure_field.php | 126 +++++++++----- .../godmode/agentes/fields_manager.php | 140 ++++++++++----- .../godmode/agentes/modificar_agente.php | 3 +- .../godmode/agentes/module_manager.php | 2 +- pandora_console/godmode/category/category.php | 157 ++++++++++------- .../godmode/category/edit_category.php | 151 ++++++++--------- .../godmode/groups/configure_modu_group.php | 62 +++++-- .../godmode/groups/modu_group_list.php | 49 +++--- .../godmode/modules/manage_nc_groups.php | 141 ++++++++++----- .../godmode/modules/manage_nc_groups_form.php | 103 ++++++----- .../godmode/modules/module_list.php | 111 +++++++----- pandora_console/godmode/setup/os.list.php | 26 ++- pandora_console/include/styles/pandora.css | 46 +++-- pandora_console/include/styles/tables.css | 25 +-- 16 files changed, 886 insertions(+), 550 deletions(-) diff --git a/pandora_console/extensions/insert_data.php b/pandora_console/extensions/insert_data.php index 034f97997b..6fa0672f84 100644 --- a/pandora_console/extensions/insert_data.php +++ b/pandora_console/extensions/insert_data.php @@ -1,16 +1,32 @@ '', + 'label' => __('Resources'), + ], + [ + 'link' => '', + 'label' => __('Insert Data'), + ], + ] + ); if (! check_acl($config['id_user'], 0, 'AW') && ! is_user_admin($config['id_user'])) { db_pandora_audit( @@ -84,6 +117,13 @@ function mainInsertData() $csv = false; } + ui_print_warning_message( + sprintf( + __('Please check that the directory "%s" is writeable by the apache user.

        The CSV file format is date;value<newline>date;value<newline>... The date in CSV is in format Y/m/d H:i:s.'), + $config['remote_config'] + ) + ); + if ($save) { if (!check_acl($config['id_user'], agents_get_agent_group($agent_id), 'AW')) { ui_print_error_message(__('You haven\'t privileges for insert data in the agent.')); @@ -140,27 +180,25 @@ function mainInsertData() } } - echo '
        '; - echo sprintf( - __('Please check that the directory "%s" is writeable by the apache user.

        The CSV file format is date;value<newline>date;value<newline>... The date in CSV is in format Y/m/d H:i:s.'), - $config['remote_config'] - ); - echo '
        '; + $modules = []; + if ($agent_id > 0) { + $modules = agents_get_modules($agent_id, false, ['delete_pending' => 0]); + } $table = new stdClass(); - $table->width = '100%'; - $table->class = 'databox filters'; + $table->class = 'databox m2020'; $table->style = []; - $table->style[0] = 'font-weight: bolder;'; - + $table->cellstyle[0][0] = 'width: 0'; + $table->cellstyle[0][1] = 'width: 0'; $table->data = []; - $table->data[0][0] = __('Agent'); + $table->data[0][1] = __('Module'); + $table->data[0][2] = __('Date'); $params = []; $params['return'] = true; $params['show_helptip'] = true; $params['input_name'] = 'agent_name'; - $params['value'] = $agent_name; + $params['value'] = ($save === true) ? '' : $agent_name; $params['javascript_is_function_select'] = true; $params['javascript_name_function_select'] = 'custom_select_function'; $params['javascript_code_function_select'] = ''; @@ -170,18 +208,12 @@ function mainInsertData() $params['hidden_input_idagent_name'] = 'agent_id'; $params['hidden_input_idagent_value'] = $agent_id; - $table->data[0][1] = ui_print_agent_autocomplete_input($params); - - $table->data[1][0] = __('Module'); - $modules = []; - if ($agent_id) { - $modules = agents_get_modules($agent_id, false, ['delete_pending' => 0]); - } + $table->data[1][0] = html_print_div(['class' => 'flex flex-items-center', 'content' => ui_print_agent_autocomplete_input($params)], true); $table->data[1][1] = html_print_select( $modules, 'id_agent_module', - $id_agent_module, + ($save === true) ? '' : $id_agent_module, true, __('Select'), 0, @@ -191,13 +223,14 @@ function mainInsertData() '', empty($agent_id) ); + $table->data[1][2] = html_print_input_text('data', ($save === true) ? date(DATE_FORMAT) : $data, __('Data'), 10, 60, true); + $table->data[1][2] .= ' '; + $table->data[1][2] .= html_print_input_text('time', ($save === true) ? date(TIME_FORMAT) : $time, '', 10, 7, true); + $table->data[2][0] = __('Data'); - $table->data[2][1] = html_print_input_text('data', $data, __('Data'), 40, 60, true); - $table->data[3][0] = __('Date'); - $table->data[3][1] = html_print_input_text('date', $date, '', 11, 11, true).' '; - $table->data[3][1] .= html_print_input_text('time', $time, '', 7, 7, true); - $table->data[4][0] = __('CSV'); - $table->data[4][1] = html_print_input_file('csv', true); + $table->data[2][1] = __('CSV'); + $table->data[3][0] = html_print_input_text('data', $data, __('Data'), 40, 60, true); + $table->data[3][1] = html_print_input_file('csv', true); echo "
        "; @@ -205,17 +238,16 @@ function mainInsertData() html_print_input_hidden('save', 1); - html_print_div( - [ - 'class' => 'action-buttons', - 'content' => html_print_submit_button( - __('Save'), - 'submit', - (empty($id_agent) === true), - [ 'icon' => 'next' ], - true - ), - ] + html_print_action_buttons( + html_print_submit_button( + __('Save'), + 'submit', + // (empty($id_agent) === true), + false, + [ 'icon' => 'next' ], + true + ), + ['type' => 'form_action'] ); echo '
        '; @@ -267,8 +299,8 @@ function mainInsertData() $('#id_agent_module').enable(); $('#id_agent_module').fadeIn ('normal'); - $('#submit-submit').enable(); - $('#submit-submit').fadeIn ('normal'); + $('button [name="submit"]').removeClass('disabled_action_button'); + $('button [name="submit"]').fadeIn ('normal'); } }); } diff --git a/pandora_console/extensions/resource_registration.php b/pandora_console/extensions/resource_registration.php index 732c0151ea..1473fcdc38 100755 --- a/pandora_console/extensions/resource_registration.php +++ b/pandora_console/extensions/resource_registration.php @@ -1,4 +1,5 @@ group)); break; - case 'event_report_module': - break; - - case 'alert_report_module': - break; - - case 'alert_report_agent': - break; - - case 'alert_report_group': - break; - case 'url': $values['external_source'] = io_safe_input($item['url']); break; @@ -426,9 +384,32 @@ function process_upload_xml_report($xml, $group_filter=0) $values['line_separator'] = io_safe_input($item['line_separator']); $values['column_separator'] = io_safe_input($item['column_separator']); break; + + case 1: + case 'simple_graph': + case 'simple_baseline_graph': + case 6: + case 'monitor_report': + case 7: + case 'avg_value': + case 8: + case 'max_value': + case 9: + case 'min_value': + case 10: + case 'sumatory': + case 'event_report_module': + case 'alert_report_module': + case 'alert_report_agent': + case 'alert_report_group': + case 'agent_detailed_event': + case 'event_report_agent': + default: + // Do nothing. + break; } - if (empty($agents_item)) { + if (empty($agents_item) === true) { $id_content = db_process_sql_insert('treport_content', $values); ui_print_result_message( $id_content, @@ -782,7 +763,7 @@ function process_upload_xml_visualmap($xml, $filter_group=0) function process_upload_xml_component($xml) { - // Extract components + // Extract components. $components = []; foreach ($xml->xpath('/component') as $componentElement) { $name = io_safe_input((string) $componentElement->name); @@ -838,7 +819,7 @@ function process_upload_xml_component($xml) $idComponent = false; switch ((int) $componentElement->module_source) { case 1: - // Local component + // Local component. $values = [ 'description' => $description, 'id_network_component_group' => $group, @@ -854,12 +835,12 @@ function process_upload_xml_component($xml) // Network component // for modules // 15 = remote_snmp, 16 = remote_snmp_inc, - // 17 = remote_snmp_string, 18 = remote_snmp_proc + // 17 = remote_snmp_string, 18 = remote_snmp_proc. $custom_string_1 = ''; $custom_string_2 = ''; $custom_string_3 = ''; if ($type >= 15 && $type <= 18) { - // New support for snmp v3 + // New support for snmp v3. $tcp_send = $snmp_version; $plugin_user = $auth_user; $plugin_pass = $auth_password; @@ -909,13 +890,13 @@ function process_upload_xml_component($xml) 'post_process' => $post_process, ] ); - if ((bool) $idComponent) { + if ((bool) $idComponent === true) { $components[] = $idComponent; } break; case 4: - // Plugin component + // Plugin component. $idComponent = network_components_create_network_component( $name, $type, @@ -956,17 +937,13 @@ function process_upload_xml_component($xml) 'post_process' => $post_process, ] ); - if ((bool) $idComponent) { + if ((bool) $idComponent === true) { $components[] = $idComponent; } break; - case 5: - // Prediction component - break; - case 6: - // WMI component + // WMI component. $idComponent = network_components_create_network_component( $name, $type, @@ -1013,13 +990,17 @@ function process_upload_xml_component($xml) 'post_process' => $post_process, ] ); - if ((bool) $idComponent) { + if ((bool) $idComponent === true) { $components[] = $idComponent; } break; + case 5: + // Prediction component. case 7: - // Web component + // Web component. + default: + // Do nothing. break; } @@ -1030,9 +1011,9 @@ function process_upload_xml_component($xml) ); } - // Extract the template + // Extract the template. $templateElement = $xml->xpath('//template'); - if (!empty($templateElement)) { + if (empty($templateElement) === false) { $templateElement = $templateElement[0]; $templateName = (string) $templateElement->name; @@ -1092,9 +1073,26 @@ function resource_registration_extension_main() include_once $config['homedir'].'/include/functions_db.php'; enterprise_include_once('include/functions_local_components.php'); - ui_print_page_header(__('Resource registration'), 'images/extensions.png', false, '', true, ''); + ui_print_standard_header( + __('Resource registration'), + 'images/extensions.png', + false, + '', + true, + [], + [ + [ + 'link' => '', + 'label' => __('Resources'), + ], + [ + 'link' => '', + 'label' => __('Resource registration'), + ], + ] + ); - if (!extension_loaded('libxml')) { + if (extension_loaded('libxml') === false) { ui_print_error_message(_('Error, please install the PHP libXML in the system.')); return; @@ -1119,15 +1117,36 @@ function resource_registration_extension_main() return; } - echo '
        '; - echo __('This extension makes registering resource templates easier.').' '.__('Here you can upload a resource template in .ptr format.').' '.__('Please refer to our documentation for more information on how to obtain and use %s resources.', get_product_name()).' '.'

        '.__('You can get more resurces in our Public Resource Library'); - echo '
        '; + ui_print_warning_message( + __('This extension makes registering resource templates easier.').'
        '.__('Here you can upload a resource template in .ptr format.').'
        '.__('Please refer to our documentation for more information on how to obtain and use %s resources.', get_product_name()).' '.'

        '.__('You can get more resurces in our Public Resource Library') + ); - echo '

        '; + $table = new stdClass(); + $table->class = 'databox m2020'; + $table->id = 'resource_registration_table'; + + $table->data = []; + $table->data[0][0] = __('File to upload'); + $table->data[0][1] = __('Group filter'); + $table->data[1][0] = html_print_input_file('resource_upload', true); + $table->data[1][1] = html_print_select_groups(false, 'AW', true, 'group', '', '', __('All'), 0, true); // Upload form. - echo "
        "; - echo ''; + echo ''; + html_print_table($table); + html_print_action_buttons( + html_print_submit_button( + __('Upload'), + 'upload', + false, + [ 'icon' => 'wand' ], + true + ), + ['type' => 'form_action'] + ); + echo ''; + /* + echo '
        '; echo ''; echo "'; @@ -1136,8 +1155,7 @@ function resource_registration_extension_main() echo ''; echo "'; - echo '
        "; echo ''.__('Group filter: ').'"; echo '
        '; - echo ''; + echo '';*/ if (isset($_FILES['resource_upload']['tmp_name']) === false) { return; diff --git a/pandora_console/godmode/agentes/configure_field.php b/pandora_console/godmode/agentes/configure_field.php index f7c80c832c..ca518d5056 100755 --- a/pandora_console/godmode/agentes/configure_field.php +++ b/pandora_console/godmode/agentes/configure_field.php @@ -1,16 +1,32 @@ width = '100%'; -$table->class = 'databox filters'; +$table->class = 'databox m2020'; $table->id = 'configure_field'; -$table->style[0] = 'font-weight: bold'; -$table->style[2] = 'font-weight: bold'; -$table->style[4] = 'font-weight: bold'; -$table->style[6] = 'font-weight: bold'; echo "'; $table->data = []; $table->data[0][0] = __('Name'); -$table->data[0][1] = html_print_input_text( +$table->data[1][0] = html_print_input_text( 'name', $name, '', @@ -84,30 +95,39 @@ $table->data[0][1] = html_print_input_text( true ); -$table->data[1][0] = __('Pass type').ui_print_help_tip( +$table->data[2][0] = __('Pass type').ui_print_help_tip( __('The fields with pass type enabled will be displayed like html input type pass in html'), true ); -$table->data[1][1] = html_print_checkbox_switch( +$table->data[2][1] = __('Display on front').ui_print_help_tip( + __('The fields with display on front enabled will be displayed into the agent details'), + true +); +$table->data[2][2] = __('Link type'); + +$table->data[3][0] = html_print_checkbox_switch( 'is_password_type', 1, $is_password_type, true ); - -$table->data[2][0] = __('Display on front').ui_print_help_tip( - __('The fields with display on front enabled will be displayed into the agent details'), - true -); -$table->data[2][1] = html_print_checkbox_switch( +$table->data[3][1] = html_print_checkbox_switch( 'display_on_front', 1, $display_on_front, true ); - -$table->data[3][0] = __('Enabled combo'); -$table->data[3][1] = html_print_checkbox_switch_extended( +$table->data[3][2] = html_print_checkbox_switch_extended( + 'is_link_enabled', + 1, + $is_link_enabled, + false, + '', + '', + true +); +$table->data[4][0] = __('Enabled combo'); +$table->data[5][0] = html_print_checkbox_switch_extended( 'is_combo_enable', 0, $config['is_combo_enable'], @@ -117,12 +137,15 @@ $table->data[3][1] = html_print_checkbox_switch_extended( true ); -$table->rowstyle[4] = 'display: none;'; -$table->data[4][0] = __('Combo values').ui_print_help_tip( + +$table->cellstyle[4][1] = 'display: none;'; +$table->cellstyle[5][1] = 'display: none;'; + +$table->data[4][1] = __('Combo values').ui_print_help_tip( __('Set values separated by comma'), true ); -$table->data[4][1] = html_print_textarea( +$table->data[5][1] = html_print_textarea( 'combo_values', 3, 65, @@ -131,31 +154,40 @@ $table->data[4][1] = html_print_textarea( true ); -$table->data[5][0] = __('Link type'); -$table->data[5][1] = html_print_checkbox_switch_extended( - 'is_link_enabled', - 1, - $is_link_enabled, - false, - '', - '', - true -); echo '
        '; html_print_table($table); -echo '
        '; -if ($id_field) { +if ($id_field > 0) { html_print_input_hidden('update_field', 1); html_print_input_hidden('id_field', $id_field); - html_print_submit_button(__('Update'), 'updbutton', false, 'class="sub upd"'); + $buttonCaption = __('Update'); + $buttonName = 'updbutton'; } else { html_print_input_hidden('create_field', 1); - html_print_submit_button(__('Create'), 'crtbutton', false, 'class="sub wand"'); + $buttonCaption = __('Create'); + $buttonName = 'crtbutton'; } -echo '
        '; +$actionButtons = []; +$actionButtons[] = html_print_submit_button( + $buttonCaption, + $buttonName, + false, + [ 'icon' => 'wand' ], + true +); +$actionButtons[] = html_print_go_back_button( + 'index.php?sec=gagente&sec2=godmode/agentes/fields_manager', + ['button_class' => ''], + true +); + +html_print_action_buttons( + implode('', $actionButtons), + ['type' => 'form_action'], +); + echo '
        '; ?> diff --git a/pandora_console/godmode/agentes/fields_manager.php b/pandora_console/godmode/agentes/fields_manager.php index f7f61c4af4..49f6661c81 100644 --- a/pandora_console/godmode/agentes/fields_manager.php +++ b/pandora_console/godmode/agentes/fields_manager.php @@ -1,22 +1,37 @@ '', + 'label' => __('Resources'), + ], + [ + 'link' => '', + 'label' => __('Custom fields'), + ], + ] +); $create_field = (bool) get_parameter('create_field'); $update_field = (bool) get_parameter('update_field'); @@ -114,8 +146,7 @@ $fields = db_get_all_rows_filter( ); $table = new stdClass(); -$table->width = '100%'; -$table->class = 'info_table'; +$table->class = 'info_table m2020'; if ($fields) { $table->head = []; $table->head[0] = __('ID'); @@ -140,43 +171,66 @@ if ($fields === false) { foreach ($fields as $field) { $data[0] = $field['id_field']; + $data[1] = $field['name']; - $data[1] = ''.$field['name'].''; - - if ($field['display_on_front']) { - $data[2] = html_print_image('images/tick.png', true, ['class' => 'invert_filter']); - } else { - $data[2] = html_print_image( - 'images/icono_stop.png', - true, - ['style' => 'width:21px;height:21px;'] - ); - } + $data[2] = html_print_image( + ((bool) $field['display_on_front'] === true) ? 'images/validate.svg' : 'images/icono_stop.png', + true, + ['class' => 'main_menu_icon invert_filter'] + ); $table->cellclass[][3] = 'table_action_buttons'; - $data[3] = ''.html_print_image('images/config.png', true, ['alt' => __('Edit'), 'title' => __('Edit'), 'border' => '0', 'class' => 'invert_filter']).''; - $data[3] .= ''.html_print_image('images/cross.png', true, ['alt' => __('Delete'), 'title' => __('Delete'), 'border' => '0', 'class' => 'invert_filter']).''; + $tableActionButtons = []; + $tableActionButtons[] = html_print_anchor( + [ + 'href' => 'index.php?sec=gagente&sec2=godmode/agentes/configure_field&id_field='.$field['id_field'], + 'content' => html_print_image( + 'images/edit.svg', + true, + [ + 'title' => __('Edit'), + 'class' => 'main_menu_icon invert_filter', + ] + ), + ], + true + ); + + $tableActionButtons[] = html_print_anchor( + [ + 'href' => 'index.php?sec=gagente&sec2=godmode/agentes/fields_manager&delete_field=1&id_field='.$field['id_field'], + 'content' => html_print_image( + 'images/delete.svg', + true, + [ + 'title' => __('Delete'), + 'class' => 'main_menu_icon invert_filter', + ] + ), + 'onClick' => 'if (!confirm(\' '.__('Are you sure?').'\')) return false;', + ], + true + ); + + $data[3] = implode('', $tableActionButtons); array_push($table->data, $data); } if ($fields) { - ui_pagination($count_fields, false, $offset); html_print_table($table); - ui_pagination($count_fields, false, $offset, 0, false, 'offset', true, 'pagination-bottom'); + $tablePagination = ui_pagination($count_fields, false, $offset, 0, true, 'offset', false); } -echo '
        '; -html_print_div( - [ - 'class' => 'action-buttons', - 'content' => html_print_submit_button( - __('Create field'), - 'crt', - false, - [ 'icon' => 'next' ], - true - ), - ] +echo ''; +html_print_action_buttons( + html_print_submit_button( + __('Create field'), + 'crt', + false, + [ 'icon' => 'next' ], + true + ), + ['type' => 'form_action'] ); echo '
        '; diff --git a/pandora_console/godmode/agentes/modificar_agente.php b/pandora_console/godmode/agentes/modificar_agente.php index ce58dc58a9..e854a9ee23 100644 --- a/pandora_console/godmode/agentes/modificar_agente.php +++ b/pandora_console/godmode/agentes/modificar_agente.php @@ -654,8 +654,7 @@ if ($agents !== false) { $tableAgents = new stdClass(); $tableAgents->id = 'agent_list'; - $tableAgents->class = 'info_table tactical_table'; - $tableAgents->styleTable = 'margin: 0 10px'; + $tableAgents->class = 'info_table tactical_table m2020'; $tableAgents->head = []; $tableAgents->data = []; // Header. diff --git a/pandora_console/godmode/agentes/module_manager.php b/pandora_console/godmode/agentes/module_manager.php index 102bea4ba4..317346749e 100644 --- a/pandora_console/godmode/agentes/module_manager.php +++ b/pandora_console/godmode/agentes/module_manager.php @@ -1168,7 +1168,7 @@ if ($modules !== false) { [ 'href' => 'index.php?sec=gmodules&sec2=godmode/modules/manage_network_components&create_network_from_module=1&id_agente='.$id_agente.'&create_module_from='.$module['id_agente_modulo'], 'onClick' => "if (!confirm(\' '.__('Are you sure?').'\')) return false;", - 'image' => 'images/cluster@svg.svg', + 'image' => 'images/cluster@os.svg', 'title' => __('Create network component'), 'disabled' => ((is_user_admin($config['id_user']) === true) && (int) $module['id_modulo'] === MODULE_NETWORK) === false, 'disabled_title' => ' ('.__('Disabled').')', diff --git a/pandora_console/godmode/category/category.php b/pandora_console/godmode/category/category.php index b20bbc85b5..2a4f7d29af 100755 --- a/pandora_console/godmode/category/category.php +++ b/pandora_console/godmode/category/category.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2022 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 Artica Soluciones Tecnologicas * Please see http://pandorafms.org for full contribution list * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -52,35 +52,21 @@ $search = (int) get_parameter('search_category', 0); $category_name = (string) get_parameter('category_name', ''); $tab = (string) get_parameter('tab', 'list'); -if (is_metaconsole() === true) { - $buttons = [ - 'list' => [ - 'active' => false, - 'text' => ''.html_print_image( - 'images/list.png', - true, - [ - 'title' => __('List categories'), - 'class' => 'invert_filter', - ] - ).'', - ], - ]; -} else { - $buttons = [ - 'list' => [ - 'active' => false, - 'text' => ''.html_print_image( - 'images/list.png', - true, - [ - 'title' => __('List categories'), - 'class' => 'invert_filter', - ] - ).'', - ], - ]; -} +$sec = (is_metaconsole() === true) ? 'advanced' : 'galertas'; + +$buttons = [ + 'list' => [ + 'active' => false, + 'text' => ''.html_print_image( + 'images/logs@svg.svg', + true, + [ + 'title' => __('List categories'), + 'class' => 'main_menu_icon invert_filter', + ] + ).'', + ], +]; $buttons[$tab]['active'] = true; @@ -88,7 +74,24 @@ $buttons[$tab]['active'] = true; if (is_metaconsole() === true) { ui_meta_print_header(__('Categories configuration'), __('List'), $buttons); } else { - ui_print_page_header(__('Categories configuration'), 'images/gm_modules.png', false, '', true, $buttons); + ui_print_standard_header( + __('Categories configuration'), + 'images/gm_modules.png', + false, + '', + true, + $buttons, + [ + [ + 'link' => '', + 'label' => __('Resources'), + ], + [ + 'link' => '', + 'label' => __('Module categories'), + ], + ] + ); } @@ -152,12 +155,8 @@ $rowPair = true; $iterator = 0; if (empty($result) === false) { - // Prepare pagination. - ui_pagination($total_categories, $url); - $table = new stdClass(); - $table->width = '100%'; - $table->class = 'info_table'; + $table->class = 'info_table m2020'; $table->data = []; $table->head = []; @@ -185,14 +184,20 @@ if (empty($result) === false) { if (is_metaconsole() === true) { $data[0] = "".$category['name'].''; $data[1] = "".html_print_image( - 'images/config.png', + 'images/edit.svg', true, - ['title' => 'Edit'] + [ + 'title' => __('Edit'), + 'class' => 'main_menu_icon', + ] ).'  '; $data[1] .= ''.html_print_image( - 'images/cross.png', + 'images/delet.svg', true, - ['title' => 'Delete'] + [ + 'title' => __('Delete'), + 'class' => 'main_menu_icon', + ] ).''; } else { if ($is_management_allowed === true) { @@ -203,16 +208,39 @@ if (empty($result) === false) { if ($is_management_allowed === true) { $table->cellclass[][1] = 'table_action_buttons'; - $data[1] = "".html_print_image( - 'images/config.png', - true, - ['title' => 'Edit'] - ).''; - $data[1] .= ''.html_print_image( - 'images/cross.png', - true, - ['title' => 'Delete'] - ).''; + $tableActionButtonsContent = []; + $tableActionButtonsContent[] = html_print_anchor( + [ + 'href' => 'index.php?sec=gmodules&sec2=godmode/category/edit_category&action=update&id_category='.$category['id'].'&pure='.(int) $config['pure'], + 'content' => html_print_image( + 'images/edit.svg', + true, + [ + 'title' => __('Edit'), + 'class' => 'main_menu_icon', + ] + ), + ], + true + ); + + $tableActionButtonsContent[] = html_print_anchor( + [ + 'href' => 'index.php?sec=gmodules&sec2=godmode/category/category&delete_category='.$category['id'].'&pure='.(int) $config['pure'], + 'onClick' => 'if (! confirm (\''.__('Are you sure?').'\')) return false', + 'content' => html_print_image( + 'images/delete.svg', + true, + [ + 'title' => __('Delete'), + 'class' => 'main_menu_icon', + ] + ), + ], + true + ); + + $data[1] = implode('', $tableActionButtonsContent); } } @@ -220,7 +248,7 @@ if (empty($result) === false) { } html_print_table($table); - ui_pagination($total_categories, $url, $offset, 0, false, 'offset', true, 'pagination-bottom'); + $tablePagination = ui_pagination($total_categories, $url, $offset, 0, true, 'offset', false); } else { // No categories available or selected. ui_print_info_message(['no_close' => true, 'message' => __('No categories found') ]); @@ -228,24 +256,23 @@ if (empty($result) === false) { if ($is_management_allowed === true) { // Form to add new categories or search categories. - if (is_metaconsole() === true) { - echo '
        '; - } else { - echo ''; - } + $sec = (is_metaconsole() === true) ? 'advanced' : 'gmodules'; + + echo ''; html_print_input_hidden('create_category', '1', true); - html_print_div( + html_print_action_buttons( + html_print_submit_button( + __('Create category'), + 'create_button', + false, + [ 'icon' => 'next' ], + true + ), [ - 'class' => 'action-buttons', - 'content' => html_print_submit_button( - __('Create category'), - 'create_button', - false, - [ 'icon' => 'next' ], - true - ), + 'type' => 'form_action', + 'right_content' => $tablePagination, ] ); diff --git a/pandora_console/godmode/category/edit_category.php b/pandora_console/godmode/category/edit_category.php index 64b4a193c2..b042f23526 100755 --- a/pandora_console/godmode/category/edit_category.php +++ b/pandora_console/godmode/category/edit_category.php @@ -50,36 +50,29 @@ $update_category = (int) get_parameter('update_category', 0); $create_category = (int) get_parameter('create_category', 0); $name_category = (string) get_parameter('name_category', ''); $tab = (string) get_parameter('tab', 'list'); +// Main URL. +$mainUrl = 'index.php?sec=gagente&sec2=godmode/category/category'; +$sec = (is_metaconsole() === true) ? 'advanced' : 'gmodules'; -if (is_metaconsole() === true) { - $buttons = [ - 'list' => [ - 'active' => false, - 'text' => ''.html_print_image( - 'images/list.png', - true, - [ - 'title' => __('List categories'), - 'class' => 'invert_filter', - ] - ).'', - ], - ]; -} else { - $buttons = [ - 'list' => [ - 'active' => false, - 'text' => ''.html_print_image( - 'images/list.png', - true, - [ - 'title' => __('List categories'), - 'class' => 'invert_filter', - ] - ).'', - ], - ]; -} +$buttons = [ + 'list' => [ + 'active' => false, + 'text' => html_print_anchor( + [ + 'href' => 'index.php?sec='.$sec.'&sec2=godmode/category/category&tab=list&pure='.(int) $config['pure'], + 'content' => html_print_image( + 'images/logs@svg.svg', + true, + [ + 'title' => __('List categories'), + 'class' => 'main_menu_icon invert_filter', + ] + ), + ], + true + ), + ], +]; $buttons[$tab]['active'] = false; @@ -87,7 +80,25 @@ $buttons[$tab]['active'] = false; if (is_metaconsole() === true) { ui_meta_print_header(__('Categories configuration'), __('Editor'), $buttons); } else { - ui_print_page_header(__('Categories configuration'), 'images/gm_modules.png', false, '', true, $buttons); + // Header. + ui_print_standard_header( + __('Manage category'), + 'images/gm_modules.png', + false, + '', + true, + $buttons, + [ + [ + 'link' => '', + 'label' => __('Resources'), + ], + [ + 'link' => $mainUrl, + 'label' => __('Module categories'), + ], + ] + ); } @@ -151,7 +162,7 @@ if ($create_category) { // Form fields are filled here // Get results when update action is performed. -if ($action == 'update' && $id_category != 0) { +if ($action === 'update' && $id_category != 0) { $result_category = db_get_row_filter('tcategory', ['id' => $id_category]); $name_category = $result_category['name']; } //end if @@ -159,47 +170,28 @@ else { $name_category = ''; } +// Create/Update category form. +echo ''; -// Create/Update category form -echo ''; +$table = new stdClass(); +$table->id = 'edit_catagory_table'; +$table->class = 'databox m2020'; -if (!defined('METACONSOLE')) { - echo '
        '; -} else { - echo '
        '; -} - -echo ""; - -if (defined('METACONSOLE')) { - if ($action == 'update') { - echo ' - - - - '; - } - - if ($action == 'new') { - echo ' - - - - '; +$table->head = []; +if (is_metaconsole() === true) { + if ($action === 'update') { + $table->head[0] = __('Update category'); + } else if ($action === 'new') { + $table->head[0] = __('Create category'); } } - echo ''; - echo "'; - echo ''; - echo ''; +$table->data[0][0] = __('Name'); +$table->data[1][0] = html_print_input_text('name_category', $name_category, '', 50, 255, true); -echo '
        '.__('Update category').'
        '.__('Create category').'
        "; +$table->data = []; - html_print_label(__('Name'), 'name'); - echo ''; - html_print_input_text('name_category', $name_category); - echo '
        '; +html_print_table($table); if ($action === 'update') { html_print_input_hidden('update_category', 1); @@ -213,20 +205,25 @@ if ($action === 'update') { $buttonIcon = 'next'; } -html_print_div( - [ - 'class' => 'action-buttons', - 'content' => html_print_submit_button( - $buttonCaption, - $buttonName, - false, - [ 'icon' => $buttonIcon ], - true - ), - ] +$actionButtons = []; +$actionButtons[] = html_print_submit_button( + $buttonCaption, + $buttonName, + false, + [ 'icon' => $buttonIcon ], + true +); +$actionButtons[] = html_print_go_back_button( + $mainUrl, + ['button_class' => ''], + true +); + +html_print_action_buttons( + implode('', $actionButtons), + [ 'type' => 'form_action' ] ); -echo '
        '; echo ''; enterprise_hook('close_meta_frame'); diff --git a/pandora_console/godmode/groups/configure_modu_group.php b/pandora_console/godmode/groups/configure_modu_group.php index 548f711f6f..ef93882d14 100644 --- a/pandora_console/godmode/groups/configure_modu_group.php +++ b/pandora_console/godmode/groups/configure_modu_group.php @@ -26,9 +26,26 @@ if (! check_acl($config['id_user'], 0, 'PM')) { return; } -if (!is_metaconsole()) { +if (is_metaconsole() === false) { // Header - ui_print_page_header(__('Module group management'), 'images/module_group.png', false, '', true, ''); + ui_print_standard_header( + __('Module group management'), + 'images/module_group.png', + false, + '', + true, + [], + [ + [ + 'link' => '', + 'label' => __('Resources'), + ], + [ + 'link' => '', + 'label' => __('Module groups'), + ], + ] + ); } // Init vars @@ -60,33 +77,54 @@ if ($id_group) { } $table = new stdClass(); -$table->width = '100%'; -$table->class = 'databox filters'; +$table->class = 'databox m2020'; $table->style[0] = 'font-weight: bold'; $table->data = []; $table->data[0][0] = __('Name'); -$table->data[0][1] = html_print_input_text('name', $name, '', 35, 100, true); +$table->data[1][0] = html_print_input_text('name', $name, '', 35, 100, true); echo ''; -if (is_metaconsole()) { - echo '
        '; +if (is_metaconsole() === true) { + $formUrl = 'index.php?sec=advanced&sec2=advanced/component_management&tab=module_group'; } else { - echo ''; + $formUrl = 'index.php?sec=gmodules&sec2=godmode/groups/modu_group_list'; } +echo ''; html_print_table($table); -echo '
        '; + if ($id_group) { html_print_input_hidden('update_group', 1); html_print_input_hidden('id_group', $id_group); - html_print_submit_button(__('Update'), 'updbutton', false, 'class="sub upd"'); + $actionButtonTitle = __('Update'); + $actionButtonName = 'updbutton'; } else { + $actionButtonTitle = __('Create'); + $actionButtonName = 'crtbutton'; html_print_input_hidden('create_group', 1); - html_print_submit_button(__('Create'), 'crtbutton', false, 'class="sub wand"'); } -echo '
        '; +$actionButtons = []; + +$actionButtons[] = html_print_submit_button( + $actionButtonTitle, + $actionButtonName, + false, + ['icon' => 'wand'], + true +); + +$actionButtons[] = html_print_go_back_button( + ui_get_full_url('index.php?sec=gmodules&sec2=godmode/groups/modu_group_list'), + ['button_class' => ''], + true +); + +html_print_action_buttons( + implode('', $actionButtons), + ['type' => 'form_action'] +); echo '
        '; enterprise_hook('close_meta_frame'); diff --git a/pandora_console/godmode/groups/modu_group_list.php b/pandora_console/godmode/groups/modu_group_list.php index cbd9a4c0d5..876dedad72 100644 --- a/pandora_console/godmode/groups/modu_group_list.php +++ b/pandora_console/godmode/groups/modu_group_list.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2022 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 Artica Soluciones Tecnologicas * Please see http://pandorafms.org for full contribution list * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -66,13 +66,23 @@ if (is_ajax() === true) { if (is_metaconsole() === false) { // Header. - ui_print_page_header( - __('Module groups defined in %s', get_product_name()), + ui_print_standard_header( + __('Module groups list'), 'images/module_group.png', false, '', true, - '' + [], + [ + [ + 'link' => '', + 'label' => __('Resources'), + ], + [ + 'link' => '', + 'label' => __('Module groups'), + ], + ] ); } @@ -243,8 +253,7 @@ $sql = 'SELECT * $groups = db_get_all_rows_sql($sql); $table = new stdClass(); -$table->width = '100%'; -$table->class = 'info_table'; +$table->class = 'info_table m2020'; if (empty($groups) === false) { $table->head = []; @@ -254,6 +263,8 @@ if (empty($groups) === false) { $table->head[2] = __('Delete'); } + $table->size[0] = '5%'; + $table->align = []; $table->align[1] = 'left'; if ($is_management_allowed === true) { @@ -270,10 +281,10 @@ if (empty($groups) === false) { if ($is_management_allowed === true) { $data[1] = ''.ui_print_truncate_text($id_group['name'], GENERIC_SIZE_TEXT).''; if (is_metaconsole() === true) { - $data[2] = ''.html_print_image('images/cross.png', true, ['border' => '0']).''; + $data[2] = ''.html_print_image('images/delete.svg', true, ['class' => 'main_menu_icon']).''; } else { $table->cellclass[][2] = 'table_action_buttons'; - $data[2] = ''.html_print_image('images/cross.png', true, ['border' => '0']).''; + $data[2] = ''.html_print_image('images/delete.svg', true, ['class' => 'main_menu_icon']).''; } } else { $data[1] = ''; @@ -284,9 +295,8 @@ if (empty($groups) === false) { array_push($table->data, $data); } - ui_pagination($total_groups, $url, $offset); html_print_table($table); - ui_pagination($total_groups, $url, $offset, 0, false, 'offset', true, 'pagination-bottom'); + $tablePagination = ui_pagination($total_groups, $url, $offset, 0, true, 'offset', false); } else { ui_print_info_message( [ @@ -298,16 +308,17 @@ if (empty($groups) === false) { if ($is_management_allowed === true) { echo '
        '; - html_print_div( + html_print_action_buttons( + html_print_submit_button( + __('Create module group'), + 'crt', + false, + [ 'icon' => 'next' ], + true + ), [ - 'class' => 'action-buttons', - 'content' => html_print_submit_button( - __('Create module group'), - 'crt', - false, - [ 'icon' => 'next' ], - true - ), + 'type' => 'form_action', + 'right_content' => $tablePagination, ] ); echo '
        '; diff --git a/pandora_console/godmode/modules/manage_nc_groups.php b/pandora_console/godmode/modules/manage_nc_groups.php index 60d72aea79..fc25be5cd1 100644 --- a/pandora_console/godmode/modules/manage_nc_groups.php +++ b/pandora_console/godmode/modules/manage_nc_groups.php @@ -1,17 +1,32 @@ '', + 'label' => __('Resources'), + ], + [ + 'link' => '', + 'label' => __('Component groups'), + ], + ] ); $sec = 'gmodules'; } @@ -234,12 +260,11 @@ foreach ($groups as $group_key => $group_val) { $groups = component_groups_get_groups_tree_recursive($groups_clean, 0, 0); $table = new stdClass(); -$table->width = '100%'; -$table->class = 'info_table'; +$table->class = 'info_table m2020'; $table->head = []; $table->head['checkbox'] = html_print_checkbox('all_delete', 0, false, true, false); $table->head[0] = __('Name'); -if (is_management_allowed() === true || is_metaconsole()) { +if (is_management_allowed() === true || is_metaconsole() === true) { $table->head[1] = __('Action'); } @@ -272,8 +297,14 @@ foreach ($groups as $group) { $table->cellclass[][1] = 'table_action_buttons'; if (is_management_allowed() === true || is_metaconsole()) { - $data[1] = "".html_print_image('images/cross.png', true, ['title' => __('Delete')]).''; + $data[1] = html_print_anchor( + [ + 'onClick' => 'if(confirm(\"'.__('Are you sure?').'\")) return true; else return false;', + 'href' => 'index.php?sec='.$sec.'&sec2=godmode/modules/manage_nc_groups&delete=1&id='.$group['id_sg'].'&offset=0', + 'content' => html_print_image('images/delete.svg', true, ['title' => __('Delete'), 'class' => 'main_menu_icon']), + ], + true + ); } array_push($table->data, $data); @@ -296,35 +327,63 @@ if (is_management_allowed() === false && is_metaconsole() === false) { ); } -if (isset($data)) { - echo "
        "; - html_print_input_hidden('multiple_delete', 1); +$actionButtons = []; +if (isset($data) === true) { + echo ''; html_print_table($table); - if (is_management_allowed() === true || is_metaconsole()) { - echo "
        "; - html_print_submit_button(__('Delete'), 'delete_btn', false, 'class="sub delete"'); - echo '
        '; - } - echo '
        '; } else { ui_print_info_message(['no_close' => true, 'message' => __('There are no defined component groups') ]); } if (is_management_allowed() === true || is_metaconsole()) { - echo '
        '; - echo '
        '; - html_print_input_hidden('new', 1); - html_print_submit_button(__('Create'), 'crt', false, 'class="sub next"'); - echo '
        '; + // Create form. + echo ''; + html_print_input_hidden('new', 1); echo '
        '; + // Create action button. + $actionButtons[] = html_print_submit_button( + __('Create'), + 'crt', + false, + [ + 'icon' => 'wand', + 'form' => 'create_form', + ], + true + ); + // Delete action button. + if (isset($data) === true) { + $actionButtons[] = html_print_input_hidden( + 'multiple_delete', + 1, + false, + false, + 'form="multiple_delete_form"' + ); + $actionButtons[] = html_print_submit_button( + __('Delete'), + 'delete_btn', + false, + [ + 'icon' => 'delete', + 'mode' => 'secondary', + 'form' => 'multiple_delete_form', + ], + true + ); + } } +html_print_action_buttons( + implode('', $actionButtons), + ['type' => 'form_action'] +); + enterprise_hook('close_meta_frame'); ?> diff --git a/pandora_console/godmode/modules/manage_nc_groups_form.php b/pandora_console/godmode/modules/manage_nc_groups_form.php index 01beca52ed..3342c06e03 100644 --- a/pandora_console/godmode/modules/manage_nc_groups_form.php +++ b/pandora_console/godmode/modules/manage_nc_groups_form.php @@ -1,17 +1,32 @@ width = '100%'; -$table->class = 'databox filters'; +$table->class = 'databox m2020'; -if (defined('METACONSOLE')) { +if (is_metaconsole() === true) { $table->class = 'databox data'; - if ($id) { - $table->head[0] = __('Update Group Component'); - } else { - $table->head[0] = __('Create Group Component'); - } - + $table->head[0] = ($id) ? __('Update Group Component') : __('Create Group Component'); $table->head_colspan[0] = 4; $table->headstyle[0] = 'text-align: center'; } $table->style = []; -$table->style[0] = 'font-weight: bold'; -$table->style[2] = 'font-weight: bold'; +$table->style[0] = 'width: 0'; +$table->style[1] = 'width: 0'; + $table->data = []; - $table->data[0][0] = __('Name'); -$table->data[0][1] = html_print_input_text('name', $name, '', 15, 255, true); - -$table->data[0][2] = __('Parent'); -$table->data[0][3] = html_print_select( +$table->data[0][1] = __('Parent'); +$table->data[1][0] = html_print_input_text('name', $name, '', 0, 255, true, false, false, '', 'w100p'); +$table->data[1][1] = html_print_select( network_components_get_groups(), 'parent', $parent, @@ -81,17 +84,39 @@ $table->data[0][3] = html_print_select( false ); -echo '
        '; +$manageNcGroupsUrl = 'index.php?sec='.$sec.'&sec2=godmode/modules/manage_nc_groups'; + +echo ''; html_print_table($table); -echo '
        '; + if ($id) { html_print_input_hidden('update', 1); html_print_input_hidden('id', $id); - html_print_submit_button(__('Update'), 'crt', false, 'class="sub upd"'); + $actionButtonTitle = __('Update'); } else { html_print_input_hidden('create', 1); - html_print_submit_button(__('Create'), 'crt', false, 'class="sub wand"'); + $actionButtonTitle = __('Create'); } -echo '
        '; +$actionButtons = []; + +$actionButtons[] = html_print_submit_button( + $actionButtonTitle, + 'crt', + false, + ['icon' => 'wand'], + true +); + +$actionButtons[] = html_print_go_back_button( + $manageNcGroupsUrl, + ['button_class' => ''], + true +); + +html_print_action_buttons( + implode('', $actionButtons), + [ 'type' => 'form_action'] +); + echo '
        '; diff --git a/pandora_console/godmode/modules/module_list.php b/pandora_console/godmode/modules/module_list.php index f8c07d7848..9372d3c8c7 100644 --- a/pandora_console/godmode/modules/module_list.php +++ b/pandora_console/godmode/modules/module_list.php @@ -1,17 +1,32 @@ '', + 'label' => __('Resources'), + ], + [ + 'link' => '', + 'label' => __('Module types'), + ], + ] +); + $update_module = (bool) get_parameter_post('update_module'); // Update -if ($update_module) { +if ($update_module === true) { $name = get_parameter_post('name'); $id_type = get_parameter_post('id_type'); $description = get_parameter_post('description'); @@ -54,43 +87,33 @@ if ($update_module) { } } +$table = new stdClass(); +$table->id = 'module_type_list'; +$table->class = 'info_table m2020'; +$table->size = []; +$table->size[0] = '5%'; +$table->size[1] = '5%'; +$table->head = []; +$table->head[0] = __('ID'); +$table->head[1] = __('Icon'); +$table->head[2] = __('Name'); +$table->head[3] = __('Description'); -echo ""; -echo ''; -echo ''; -echo ''; -echo ''; -echo ''; -echo 'data = []; -$rows = db_get_all_rows_sql('SELECT * FROM ttipo_modulo ORDER BY nombre'); +$rows = db_get_all_rows_sql('SELECT * FROM ttipo_modulo ORDER BY id_tipo'); if ($rows === false) { $rows = []; } -$color = 0; foreach ($rows as $row) { - if ($color == 1) { - $tdcolor = 'datos'; - $color = 0; - } else { - $tdcolor = 'datos2'; - $color = 1; - } + $data[0] = $row['id_tipo']; + $data[1] = html_print_image('images/'.$row['icon'], true, ['class' => 'main_menu_icon invert_filter']); + $data[2] = $row['nombre']; + $data[3] = $row['descripcion']; - echo " - - - - - - '; + array_push($table->data, $data); } -echo '
        '.__('Icon').''.__('ID').''.__('Name').''.__('Description').'
        ".html_print_image('images/'.$row['icon'], true, ['border' => '0', 'class' => 'invert_filter'])." - ".$row['id_tipo']." - - ".$row['nombre']." - - ".$row['descripcion'].' -
        '; +html_print_table($table); +// $tablePagination = ui_pagination($total_groups, $url, $offset, 0, true, 'offset', false); diff --git a/pandora_console/godmode/setup/os.list.php b/pandora_console/godmode/setup/os.list.php index f8ba6a865a..1fd8b57348 100644 --- a/pandora_console/godmode/setup/os.list.php +++ b/pandora_console/godmode/setup/os.list.php @@ -62,23 +62,23 @@ if (is_management_allowed() === false) { $table = new stdClass(); // $table->width = '100%'; -$table->styleTable = 'margin: 10px 10px 0'; -$table->class = 'info_table'; +// $table->styleTable = 'margin: 10px 10px 0'; +$table->class = 'info_table m2020'; -$table->head[0] = ''; -$table->head[1] = __('ID'); +$table->head[0] = __('ID'); +$table->head[1] = __('Icon'); $table->head[2] = __('Name'); $table->head[3] = __('Description'); if ($is_management_allowed === true) { $table->head[4] = ''; } -$table->align[0] = 'center'; +$table->align[1] = 'center'; if ($is_management_allowed === true) { $table->align[4] = 'center'; } -$table->size[0] = '20px'; +$table->size[0] = '5%'; if ($is_management_allowed === true) { $table->size[4] = '20px'; } @@ -103,14 +103,22 @@ if ($osList === false) { $table->data = []; foreach ($osList as $os) { $data = []; - $data[] = html_print_div(['class' => 'main_menu_icon', 'content' => ui_print_os_icon($os['id_os'], false, true)], true); $data[] = $os['id_os']; + $data[] = html_print_div(['class' => 'main_menu_icon', 'content' => ui_print_os_icon($os['id_os'], false, true)], true); if ($is_management_allowed === true) { if (is_metaconsole() === true) { - $data[] = ''.io_safe_output($os['name']).''; + $osNameUrl = 'index.php?sec=advanced&sec2=advanced/component_management&tab=os_manage&action=edit&tab2=builder&id_os='.$os['id_os']; } else { - $data[] = ''.io_safe_output($os['name']).''; + $osNameUrl = 'index.php?sec=gsetup&sec2=godmode/setup/os&action=edit&tab=builder&id_os='.$os['id_os']; } + + $data[] = html_print_anchor( + [ + 'href' => $osNameUrl, + 'content' => io_safe_output($os['name']), + ], + true + ); } else { $data[] = io_safe_output($os['name']); } diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 88eb27d931..54d271ff5a 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -1982,15 +1982,17 @@ div#agent_wizard_subtabs { } table.databox { - background-color: #f9faf9; + background-color: #fff; border-spacing: 0px; - -moz-box-shadow: 0 3px 6px 0 rgb(0 0 0 / 13%); - -webkit-box-shadow: 0 3px 6px 0 rgb(0 0 0 / 13%); - box-shadow: 0 3px 6px 0 rgb(0 0 0 / 13%); - border-radius: 4px; - border: 1px solid #e2e2e2; + border-radius: 6px; + /*-moz-box-shadow: 0 3px 6px 0 rgb(0 0 0 / 13%);*/ + /* -webkit-box-shadow: 0 3px 6px 0 rgb(0 0 0 / 13%); */ + /* box-shadow: 0 3px 6px 0 rgb(0 0 0 / 13%); */ + border: 2px solid #c0ccdc; padding: 20px; margin-bottom: 20px; + width: -webkit-fill-available; + width: -moz-available; } .databox > tbody > tr > td { @@ -3717,7 +3719,7 @@ table#policy_modules td * { } .tactical_table > thead > tr span { - line-height: 26px; + /*line-height: 26px;*/ } .info_table thead th .sort_arrow, @@ -6746,10 +6748,6 @@ div.graph div.legend table { margin: 0px; } -.mrgn_5px_a0 { - margin: 5px auto 0; -} - .mrgn_10px { margin: 10px; } @@ -7022,6 +7020,17 @@ div.graph div.legend table { margin-bottom: 80px; } +.m1010 { + margin: 10px; +} + +.m1020 { + margin: 10px 20px; +} + +.m2020 { + margin: 20px; +} .snmp_view_div { float: left; padding-left: 30px; @@ -9887,7 +9896,8 @@ div#err_msg_centralised { .inputFile { background-color: #f6f7fb; height: 16px; - font: normal normal normal 13px Pandora-Light; + font-family: "Pandora-Regular"; + font-size: 12px; padding: 5.5pt 20pt; cursor: pointer; color: #14524f; @@ -9908,12 +9918,13 @@ input, textarea, select { background-color: #f6f7fb; - height: 38px; border: 2px solid #c0ccdc; border-radius: 6px; + height: 38px; + font-family: "Pandora-Regular"; + font-size: 12px; + color: #333333; padding-left: 12px; - font: normal normal normal 14px Pandora-Light; - color: #2b3332; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; @@ -10593,7 +10604,8 @@ tr.bring_next_field { -moz-box-sizing: border-box !important; box-sizing: border-box !important; cursor: pointer; - font: normal normal normal 12px Pandora-Light !important; + font-family: "Pandora-Regular" !important; + font-size: 12px !important; } .select2-container .select2-selection--single { @@ -10891,7 +10903,7 @@ pre.external_tools_output { .fixed_filter_bar { position: sticky; top: 114px; - margin-bottom: 10px; + /*margin-bottom: 10px;*/ border: 1px solid #e5e9ed; background-color: #fff; z-index: 1; diff --git a/pandora_console/include/styles/tables.css b/pandora_console/include/styles/tables.css index a726e6ecb9..ed0d219d12 100644 --- a/pandora_console/include/styles/tables.css +++ b/pandora_console/include/styles/tables.css @@ -91,11 +91,13 @@ .info_table, .filter_table { background-color: #fff; - /* margin-bottom: 10px; */ border-spacing: 0; - border-collapse: collapse; overflow: hidden; - border-radius: 5px; + border-radius: 6px; + border: 2px solid #c0ccdc; + width: -webkit-fill-available; + width: -moz-available; + margin-bottom: 50px !important; } .info_table > tbody > tr:nth-child(even) { @@ -111,20 +113,20 @@ }*/ .info_table > tbody > tr > th, .info_table > thead > tr > th { - border-top: 1px solid #c0ccdc; + /*border-top: 1px solid #c0ccdc;*/ } .info_table tr > td:first-child, .info_table tr > th:first-child { /*padding-left: 5px;*/ padding-left: 10px; - border-left: 1px solid #c0ccdc; + /*border-left: 1px solid #c0ccdc;*/ } .info_table tr > td:last-child, .info_table tr > th:last-child { /*padding-right: 5px;*/ padding-right: 10px; - border-right: 1px solid #c0ccdc; + /*border-right: 1px solid #c0ccdc;*/ } .info_table tr:first-child > th { @@ -155,8 +157,9 @@ } .info_table > thead > tr * { - font-size: 10pt; - font-family: "Pandora-Regular"; + font-size: 12px; + font-family: "Pandora-Bold"; + line-height: 23px; } /* Radius top */ @@ -186,12 +189,14 @@ /*margin-left: 0.5em;*/ } -.info_table > tbody > tr { +.info_table > tbody > tr:last-child { /*border-bottom: 1px solid #e2e2e2;*/ border-top: 0; - border-bottom: 1px solid #c0ccdc; + /*border-bottom: 1px solid #c0ccdc;*/ + /* border-left: 1px solid #c0ccdc; border-right: 1px solid #c0ccdc; + */ } .info_table > tbody > tr > th, .info_table > thead > tr > th, From 7a2cb912b2311eca151acde1bec0ea6ff6dbfc10 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Tue, 21 Feb 2023 14:16:37 +0100 Subject: [PATCH 303/474] Workaround for Status icon --- pandora_console/include/functions_ui.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 4675737c57..9b3060d1f8 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -2891,7 +2891,7 @@ function ui_print_status_image( if ($image_with_css === true) { $shape_status = get_shape_status_set($type); - $shape_status['is_tree_view'] = true; + // $shape_status['is_tree_view'] = true; return ui_print_status_sets($type, $title, $return, $shape_status, $extra_info); } else { $imagepath .= '/'.$type; From 9d3f253dd4304deadaf81c7b7b4b260d83005429 Mon Sep 17 00:00:00 2001 From: Rafael Date: Tue, 21 Feb 2023 15:36:37 +0100 Subject: [PATCH 304/474] 10435 fixing os description for ssh banner --- extras/deploy-scripts/pandora_deploy_community_el8.sh | 2 +- extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/extras/deploy-scripts/pandora_deploy_community_el8.sh b/extras/deploy-scripts/pandora_deploy_community_el8.sh index 721d60ffb5..fe00f81571 100644 --- a/extras/deploy-scripts/pandora_deploy_community_el8.sh +++ b/extras/deploy-scripts/pandora_deploy_community_el8.sh @@ -756,7 +756,7 @@ execute_cmd "systemctl start pandora_agent_daemon" "Starting Pandora FMS Agent" cat > /etc/issue.net << EOF_banner -Welcome to Pandora FMS appliance on CentOS +Welcome to Pandora FMS appliance on RHEL/Rocky Linux 8 ------------------------------------------ Go to Public http://$ipplublic/pandora_console$to to login web console $(ip addr | grep -w "inet" | grep -v "127.0.0.1" | grep -v "172.17.0.1" | awk '{print $2}' | awk -F '/' '{print "Go to Local http://"$1"/pandora_console to login web console"}') diff --git a/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh b/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh index 06f23804db..8bd8bcfaff 100644 --- a/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh +++ b/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh @@ -772,7 +772,7 @@ sed --follow-symlinks -i -e "s/^openssl_conf = openssl_init/#openssl_conf = open cat > /etc/issue.net << EOF_banner -Welcome to Pandora FMS appliance on CentOS +Welcome to Pandora FMS appliance on Ubuntu ------------------------------------------ Go to Public http://$ipplublic/pandora_console$to to login web console $(ip addr | grep -w "inet" | grep -v "127.0.0.1" | grep -v "172.17.0.1" | awk '{print $2}' | awk -F '/' '{print "Go to Local http://"$1"/pandora_console to login web console"}') From 2b185b5754c1d16793531ff8ed703ea4a22173c3 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Tue, 21 Feb 2023 15:44:41 +0100 Subject: [PATCH 305/474] #10493 fixed pagination in alerts --- pandora_console/godmode/alerts/alert_actions.php | 4 ++-- pandora_console/godmode/alerts/alert_commands.php | 6 +++--- pandora_console/godmode/alerts/alert_templates.php | 5 +++-- pandora_console/godmode/alerts/configure_alert_action.php | 3 ++- pandora_console/godmode/alerts/configure_alert_template.php | 3 ++- 5 files changed, 12 insertions(+), 9 deletions(-) diff --git a/pandora_console/godmode/alerts/alert_actions.php b/pandora_console/godmode/alerts/alert_actions.php index 873d91598c..2089dc5900 100644 --- a/pandora_console/godmode/alerts/alert_actions.php +++ b/pandora_console/godmode/alerts/alert_actions.php @@ -391,7 +391,7 @@ foreach ($actions as $action) { $data = []; - $data[0] = ''.$action['name'].''; + $data[0] = ''.$action['name'].''; if ($action['id_group'] == 0 && $can_edit_all == false) { $data[0] .= ui_print_help_tip(__('You cannot edit this action, You don\'t have the permission to edit All group.'), true); } @@ -467,7 +467,7 @@ if (isset($data)) { if (is_management_allowed() === true) { echo '
        '; - echo '
        '; + echo ''; html_print_submit_button(__('Create'), 'create', false, 'class="sub next"'); html_print_input_hidden('create_alert', 1); echo '
        '; diff --git a/pandora_console/godmode/alerts/alert_commands.php b/pandora_console/godmode/alerts/alert_commands.php index 24d07a392f..2090461050 100644 --- a/pandora_console/godmode/alerts/alert_commands.php +++ b/pandora_console/godmode/alerts/alert_commands.php @@ -795,15 +795,15 @@ foreach ($commands as $command) { ); $data['action'] = ''; $table->cellclass[]['action'] = 'action_buttons'; - + $offset_delete = ($offset >= ($total_commands - 1)) ? ($offset - $limit) : $offset; // (IMPORTANT, DO NOT CHANGE!) only users with permissions over "All" group have access to edition of commands belonging to "All" group. if ($is_management_allowed === true && !$command['internal'] && check_acl_restricted_all($config['id_user'], $command['id_group'], 'LM')) { if (is_user_admin($config['id_user']) === true) { $data['action'] = ''; - $data['action'] .= ''.html_print_image('images/copy.png', true, ['class' => 'invert_filter']).''; - $data['action'] .= ''.html_print_image('images/cross.png', true, ['class' => 'invert_filter']).''; $data['action'] .= ''; } diff --git a/pandora_console/godmode/alerts/alert_templates.php b/pandora_console/godmode/alerts/alert_templates.php index c0374c210b..cd49f7ee7c 100644 --- a/pandora_console/godmode/alerts/alert_templates.php +++ b/pandora_console/godmode/alerts/alert_templates.php @@ -352,7 +352,8 @@ if ($search_string) { $filter[] = "(name LIKE '%".$search_string."%' OR description LIKE '%".$search_string."%' OR value LIKE '%".$search_string."%')"; } -$filter['offset'] = (int) get_parameter('offset'); +$offset = (int) get_parameter('offset'); +$filter['offset'] = $offset; $filter['limit'] = (int) $config['block_size']; if (!is_user_admin($config['id_user'])) { $filter['id_group'] = array_keys(users_get_groups(false, 'LM')); @@ -420,7 +421,7 @@ foreach ($templates as $template) { && check_acl($config['id_user'], $template['id_group'], 'LM') ) { $table->cellclass[][4] = 'action_buttons'; - $data[4] = '
        '; + $data[4] = ''; $data[4] .= html_print_input_hidden('duplicate_template', 1, true); $data[4] .= html_print_input_hidden('source_id', $template['id'], true); $data[4] .= html_print_input_image( diff --git a/pandora_console/godmode/alerts/configure_alert_action.php b/pandora_console/godmode/alerts/configure_alert_action.php index 068026c953..240fa26fc3 100644 --- a/pandora_console/godmode/alerts/configure_alert_action.php +++ b/pandora_console/godmode/alerts/configure_alert_action.php @@ -372,8 +372,9 @@ for ($i = 1; $i <= $config['max_macro_fields']; $i++) { ); } +$offset = (int) get_parameter('offset', 0); -echo ''; +echo ''; $table_html = html_print_table($table, true); echo $table_html; diff --git a/pandora_console/godmode/alerts/configure_alert_template.php b/pandora_console/godmode/alerts/configure_alert_template.php index 8838c5c458..0269d94573 100644 --- a/pandora_console/godmode/alerts/configure_alert_template.php +++ b/pandora_console/godmode/alerts/configure_alert_template.php @@ -1147,9 +1147,10 @@ if ($step == 2) { echo ui_get_using_system_timezone_warning(); } +$offset = (int) get_parameter('offset'); // If it's the last step it will redirect to template lists. if ($step >= LAST_STEP) { - echo ''; + echo ''; } else { echo ''; } From f9c3524be887ff07169ca028e55c79899a07c07f Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Tue, 21 Feb 2023 16:05:24 +0100 Subject: [PATCH 306/474] #10493 fixed pagination in profiles --- pandora_console/godmode/users/user_list.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pandora_console/godmode/users/user_list.php b/pandora_console/godmode/users/user_list.php index 85e713bed0..11ecc02f11 100644 --- a/pandora_console/godmode/users/user_list.php +++ b/pandora_console/godmode/users/user_list.php @@ -816,7 +816,7 @@ foreach ($info as $user_id => $user_info) { $toDoClass = 'filter_none'; } - $data[6] = ''; + $data[6] = ''; $data[6] .= html_print_input_hidden( 'id', $user_info['id_user'], @@ -874,7 +874,8 @@ foreach ($info as $user_id => $user_info) { && $user_info['id_user'] != $config['id_user'] && isset($user_info['not_delete']) === false ) { - $data[6] .= ''; + $offset_delete = ($offset >= count($info) - 1) ? ($offset - $config['block_size']) : $offset; + $data[6] .= ''; $data[6] .= html_print_input_hidden( 'delete_user', $user_info['id_user'], From dfadbb0f80cc57d61bc1f1ccbb77163acf1ab6db Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Tue, 21 Feb 2023 16:51:05 +0100 Subject: [PATCH 307/474] #10493 added pagination in group module --- pandora_console/godmode/groups/configure_modu_group.php | 5 +++-- pandora_console/godmode/groups/modu_group_list.php | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pandora_console/godmode/groups/configure_modu_group.php b/pandora_console/godmode/groups/configure_modu_group.php index 9330aa1320..282bd81d18 100644 --- a/pandora_console/godmode/groups/configure_modu_group.php +++ b/pandora_console/godmode/groups/configure_modu_group.php @@ -40,6 +40,7 @@ $custom_id = ''; $create_group = (bool) get_parameter('create_group'); $id_group = (int) get_parameter('id_group'); +$offset = (int) get_parameter('offset', 0); if ($id_group) { $group = db_get_row('tmodule_group', 'id_mg', $id_group); @@ -70,9 +71,9 @@ $table->data[0][1] = html_print_input_text('name', $name, '', 35, 100, true); echo ''; if (is_metaconsole()) { - echo ''; + echo ''; } else { - echo ''; + echo ''; } html_print_table($table); diff --git a/pandora_console/godmode/groups/modu_group_list.php b/pandora_console/godmode/groups/modu_group_list.php index 84dc35ada8..ea74c92cf5 100644 --- a/pandora_console/godmode/groups/modu_group_list.php +++ b/pandora_console/godmode/groups/modu_group_list.php @@ -262,18 +262,18 @@ if (empty($groups) === false) { } $table->data = []; - + $offset_delete = ($offset >= $total_groups - 1) ? ($offset - $config['block_size']) : $offset; foreach ($groups as $id_group) { $data = []; $data[0] = $id_group['id_mg']; if ($is_management_allowed === true) { - $data[1] = ''.ui_print_truncate_text($id_group['name'], GENERIC_SIZE_TEXT).''; + $data[1] = ''.ui_print_truncate_text($id_group['name'], GENERIC_SIZE_TEXT).''; if (is_metaconsole() === true) { - $data[2] = ''.html_print_image('images/cross.png', true, ['border' => '0']).''; + $data[2] = ''.html_print_image('images/cross.png', true, ['border' => '0']).''; } else { $table->cellclass[][2] = 'action_buttons'; - $data[2] = ''.html_print_image('images/cross.png', true, ['border' => '0']).''; + $data[2] = ''.html_print_image('images/cross.png', true, ['border' => '0']).''; } } else { $data[1] = ''; From 05c2232daa2135eca7be5c8c97764fe8d41dd95a Mon Sep 17 00:00:00 2001 From: Jonathan Date: Tue, 21 Feb 2023 17:07:03 +0100 Subject: [PATCH 308/474] Modals dashboard view fix --- pandora_console/include/javascript/pandora_dashboards.js | 1 - pandora_console/include/styles/pandora.css | 5 ++++- pandora_console/views/dashboard/list.php | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/pandora_console/include/javascript/pandora_dashboards.js b/pandora_console/include/javascript/pandora_dashboards.js index 02b8e47c08..d8bd2af733 100644 --- a/pandora_console/include/javascript/pandora_dashboards.js +++ b/pandora_console/include/javascript/pandora_dashboards.js @@ -412,7 +412,6 @@ function initialiceLayout(data) { widgetId: widgetId }, width: size.width, - maxHeight: size.height, minHeight: size.height }, onsubmit: { diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 54d271ff5a..b6b23b4eff 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -10591,7 +10591,7 @@ tr.bring_next_field { vertical-align: middle; text-align: left; min-width: 150px !important; - z-index: 60; + z-index: 1115; } .select2-container .select2-selection--single, @@ -11268,3 +11268,6 @@ form#satellite_conf_edit > fieldset.full-column { background-size: 24px; background-image: url("../../images/enable.svg"); } +div[role="dialog"] { + z-index: 1115; +} diff --git a/pandora_console/views/dashboard/list.php b/pandora_console/views/dashboard/list.php index 46b1cd68cc..b67fd88beb 100644 --- a/pandora_console/views/dashboard/list.php +++ b/pandora_console/views/dashboard/list.php @@ -217,7 +217,7 @@ if ($writeDashboards === 1) { $text = __('Create a new dashboard'); // Button for display modal options dashboard. - $output = ' $text, @@ -236,7 +236,7 @@ if ($writeDashboards === 1) { 'class="sub next"', true ); - $output .= ''; + $output .= '
        '; echo $output; From 53ca82277949056c7f3c64001f4ac9d7e2317dfe Mon Sep 17 00:00:00 2001 From: artica Date: Wed, 22 Feb 2023 01:02:03 +0100 Subject: [PATCH 309/474] Auto-updated build strings. --- pandora_agents/unix/DEBIAN/control | 2 +- pandora_agents/unix/DEBIAN/make_deb_package.sh | 2 +- pandora_agents/unix/pandora_agent | 2 +- pandora_agents/unix/pandora_agent.redhat.spec | 2 +- pandora_agents/unix/pandora_agent.spec | 2 +- pandora_agents/unix/pandora_agent_installer | 2 +- pandora_agents/win32/installer/pandora.mpi | 2 +- pandora_agents/win32/pandora.cc | 2 +- pandora_agents/win32/versioninfo.rc | 2 +- pandora_console/DEBIAN/control | 2 +- pandora_console/DEBIAN/make_deb_package.sh | 2 +- pandora_console/include/config_process.php | 2 +- pandora_console/install.php | 2 +- pandora_console/pandora_console.redhat.spec | 2 +- pandora_console/pandora_console.rhel7.spec | 2 +- pandora_console/pandora_console.spec | 2 +- pandora_server/DEBIAN/control | 2 +- pandora_server/DEBIAN/make_deb_package.sh | 2 +- pandora_server/lib/PandoraFMS/Config.pm | 2 +- pandora_server/lib/PandoraFMS/PluginTools.pm | 2 +- pandora_server/pandora_server.redhat.spec | 2 +- pandora_server/pandora_server.spec | 2 +- pandora_server/pandora_server_installer | 2 +- pandora_server/util/pandora_db.pl | 2 +- pandora_server/util/pandora_manage.pl | 2 +- 25 files changed, 25 insertions(+), 25 deletions(-) diff --git a/pandora_agents/unix/DEBIAN/control b/pandora_agents/unix/DEBIAN/control index 5a537cea8d..c34db5f894 100644 --- a/pandora_agents/unix/DEBIAN/control +++ b/pandora_agents/unix/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-agent-unix -Version: 7.0NG.769-230221 +Version: 7.0NG.769-230222 Architecture: all Priority: optional Section: admin diff --git a/pandora_agents/unix/DEBIAN/make_deb_package.sh b/pandora_agents/unix/DEBIAN/make_deb_package.sh index 3bdb964eb0..72b549f170 100644 --- a/pandora_agents/unix/DEBIAN/make_deb_package.sh +++ b/pandora_agents/unix/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230221" +pandora_version="7.0NG.769-230222" echo "Test if you has the tools for to make the packages." whereis dpkg-deb | cut -d":" -f2 | grep dpkg-deb > /dev/null diff --git a/pandora_agents/unix/pandora_agent b/pandora_agents/unix/pandora_agent index cd0fdd0989..c82ed15205 100755 --- a/pandora_agents/unix/pandora_agent +++ b/pandora_agents/unix/pandora_agent @@ -1023,7 +1023,7 @@ my $Sem = undef; my $ThreadSem = undef; use constant AGENT_VERSION => '7.0NG.769'; -use constant AGENT_BUILD => '230221'; +use constant AGENT_BUILD => '230222'; # Agent log default file size maximum and instances use constant DEFAULT_MAX_LOG_SIZE => 600000; diff --git a/pandora_agents/unix/pandora_agent.redhat.spec b/pandora_agents/unix/pandora_agent.redhat.spec index 1a82c15221..fe2362d995 100644 --- a/pandora_agents/unix/pandora_agent.redhat.spec +++ b/pandora_agents/unix/pandora_agent.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230221 +%define release 230222 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent.spec b/pandora_agents/unix/pandora_agent.spec index 4015375532..81c0006686 100644 --- a/pandora_agents/unix/pandora_agent.spec +++ b/pandora_agents/unix/pandora_agent.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_agent_linux %define version 7.0NG.769 -%define release 230221 +%define release 230222 Summary: Pandora FMS Linux agent, PERL version Name: %{name} diff --git a/pandora_agents/unix/pandora_agent_installer b/pandora_agents/unix/pandora_agent_installer index 6d8458b318..dbba71464e 100755 --- a/pandora_agents/unix/pandora_agent_installer +++ b/pandora_agents/unix/pandora_agent_installer @@ -10,7 +10,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230221" +PI_BUILD="230222" OS_NAME=`uname -s` FORCE=0 diff --git a/pandora_agents/win32/installer/pandora.mpi b/pandora_agents/win32/installer/pandora.mpi index bd75795838..9cd2f1ce9b 100644 --- a/pandora_agents/win32/installer/pandora.mpi +++ b/pandora_agents/win32/installer/pandora.mpi @@ -186,7 +186,7 @@ UpgradeApplicationID {} Version -{230221} +{230222} ViewReadme {Yes} diff --git a/pandora_agents/win32/pandora.cc b/pandora_agents/win32/pandora.cc index f38933f5b9..8ea729b765 100644 --- a/pandora_agents/win32/pandora.cc +++ b/pandora_agents/win32/pandora.cc @@ -30,7 +30,7 @@ using namespace Pandora; using namespace Pandora_Strutils; #define PATH_SIZE _MAX_PATH+1 -#define PANDORA_VERSION ("7.0NG.769 Build 230221") +#define PANDORA_VERSION ("7.0NG.769 Build 230222") string pandora_path; string pandora_dir; diff --git a/pandora_agents/win32/versioninfo.rc b/pandora_agents/win32/versioninfo.rc index 21f5675492..16401cb766 100644 --- a/pandora_agents/win32/versioninfo.rc +++ b/pandora_agents/win32/versioninfo.rc @@ -11,7 +11,7 @@ BEGIN VALUE "LegalCopyright", "Artica ST" VALUE "OriginalFilename", "PandoraAgent.exe" VALUE "ProductName", "Pandora FMS Windows Agent" - VALUE "ProductVersion", "(7.0NG.769(Build 230221))" + VALUE "ProductVersion", "(7.0NG.769(Build 230222))" VALUE "FileVersion", "1.0.0.0" END END diff --git a/pandora_console/DEBIAN/control b/pandora_console/DEBIAN/control index 919f840961..2574c3509a 100644 --- a/pandora_console/DEBIAN/control +++ b/pandora_console/DEBIAN/control @@ -1,5 +1,5 @@ package: pandorafms-console -Version: 7.0NG.769-230221 +Version: 7.0NG.769-230222 Architecture: all Priority: optional Section: admin diff --git a/pandora_console/DEBIAN/make_deb_package.sh b/pandora_console/DEBIAN/make_deb_package.sh index 524fd6c38c..c60d8d2f48 100644 --- a/pandora_console/DEBIAN/make_deb_package.sh +++ b/pandora_console/DEBIAN/make_deb_package.sh @@ -14,7 +14,7 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -pandora_version="7.0NG.769-230221" +pandora_version="7.0NG.769-230222" package_pear=0 package_pandora=1 diff --git a/pandora_console/include/config_process.php b/pandora_console/include/config_process.php index af73bd3842..779168d363 100644 --- a/pandora_console/include/config_process.php +++ b/pandora_console/include/config_process.php @@ -20,7 +20,7 @@ /** * Pandora build version and version */ -$build_version = 'PC230221'; +$build_version = 'PC230222'; $pandora_version = 'v7.0NG.769'; // Do not overwrite default timezone set if defined. diff --git a/pandora_console/install.php b/pandora_console/install.php index 5976f2c24e..c5e562f2cc 100644 --- a/pandora_console/install.php +++ b/pandora_console/install.php @@ -131,7 +131,7 @@
        [ qw() ] ); diff --git a/pandora_server/pandora_server.redhat.spec b/pandora_server/pandora_server.redhat.spec index e972b323a3..11f52f0cc9 100644 --- a/pandora_server/pandora_server.redhat.spec +++ b/pandora_server/pandora_server.redhat.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230221 +%define release 230222 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server.spec b/pandora_server/pandora_server.spec index 3412365986..e97a126961 100644 --- a/pandora_server/pandora_server.spec +++ b/pandora_server/pandora_server.spec @@ -4,7 +4,7 @@ %global __os_install_post %{nil} %define name pandorafms_server %define version 7.0NG.769 -%define release 230221 +%define release 230222 Summary: Pandora FMS Server Name: %{name} diff --git a/pandora_server/pandora_server_installer b/pandora_server/pandora_server_installer index cd73c5e77f..a2864c992f 100755 --- a/pandora_server/pandora_server_installer +++ b/pandora_server/pandora_server_installer @@ -9,7 +9,7 @@ # ********************************************************************** PI_VERSION="7.0NG.769" -PI_BUILD="230221" +PI_BUILD="230222" MODE=$1 if [ $# -gt 1 ]; then diff --git a/pandora_server/util/pandora_db.pl b/pandora_server/util/pandora_db.pl index b54b653594..cd6b6075aa 100755 --- a/pandora_server/util/pandora_db.pl +++ b/pandora_server/util/pandora_db.pl @@ -35,7 +35,7 @@ use PandoraFMS::Config; use PandoraFMS::DB; # version: define current version -my $version = "7.0NG.769 Build 230221"; +my $version = "7.0NG.769 Build 230222"; # Pandora server configuration my %conf; diff --git a/pandora_server/util/pandora_manage.pl b/pandora_server/util/pandora_manage.pl index 37b388fb73..2aa01fdd62 100755 --- a/pandora_server/util/pandora_manage.pl +++ b/pandora_server/util/pandora_manage.pl @@ -36,7 +36,7 @@ use Encode::Locale; Encode::Locale::decode_argv; # version: define current version -my $version = "7.0NG.769 Build 230221"; +my $version = "7.0NG.769 Build 230222"; # save program name for logging my $progname = basename($0); From fe0bfbe9d6e243c93ee52c259487d20d5c4b0141 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 22 Feb 2023 08:08:11 +0100 Subject: [PATCH 310/474] Close mesage image fix --- pandora_console/include/functions_ui.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 9b3060d1f8..b97b828979 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -343,7 +343,7 @@ function ui_print_message($message, $class='', $attributes='', $return=false, $t [ 'href' => 'javascript: close_info_box(\''.$id.'\')', 'content' => html_print_image( - 'images/svg/fail.svg', + 'images/close@svg.svg', true, false, false, From 28d964651fa51d0ae05463ec4ca7c832273f4350 Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 22 Feb 2023 08:12:45 +0100 Subject: [PATCH 311/474] Modal report issue change email input style --- pandora_console/include/styles/pandora.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index b6b23b4eff..b154462933 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -6503,7 +6503,7 @@ form#modal_form_feedback label { font-size: 10pt; } -form#modal_form_feedback input[type="email"] { +/*form#modal_form_feedback input[type="email"] { background-color: transparent; border: none; border-radius: 0; @@ -6511,7 +6511,7 @@ form#modal_form_feedback input[type="email"] { padding: 0px 0px 2px 0px; box-sizing: border-box; margin-bottom: 4px; -} +}*/ form#modal_form_feedback ul.wizard li { padding-bottom: 10px; From 4d5891cd02a69a37c4a485d271d22986bcbfbd2c Mon Sep 17 00:00:00 2001 From: Jonathan Date: Wed, 22 Feb 2023 08:56:37 +0100 Subject: [PATCH 312/474] Select2 z-index for dialogs --- pandora_console/include/styles/pandora.css | 1 - pandora_console/include/styles/select2.min.css | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index b154462933..20c0884d93 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -10591,7 +10591,6 @@ tr.bring_next_field { vertical-align: middle; text-align: left; min-width: 150px !important; - z-index: 1115; } .select2-container .select2-selection--single, diff --git a/pandora_console/include/styles/select2.min.css b/pandora_console/include/styles/select2.min.css index ba24d67270..5e0b002480 100644 --- a/pandora_console/include/styles/select2.min.css +++ b/pandora_console/include/styles/select2.min.css @@ -71,7 +71,7 @@ position: absolute; left: -100000px; width: 100%; - z-index: 999; + z-index: 1115; } .select2-results { display: block; @@ -265,8 +265,8 @@ cursor: default; float: left; margin-right: 3px; - margin-top: 2px; - height: 17px; + margin-top: 2px; + height: 17px; padding: 0 5px; } .select2-container--default From 2f1060af56bb340d873b39c011e2b7c5e713ce16 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 22 Feb 2023 09:05:27 +0100 Subject: [PATCH 313/474] #10493 fixed pagination in collection --- .../modules/manage_network_components.php | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/pandora_console/godmode/modules/manage_network_components.php b/pandora_console/godmode/modules/manage_network_components.php index bdec795443..8a27800ec2 100644 --- a/pandora_console/godmode/modules/manage_network_components.php +++ b/pandora_console/godmode/modules/manage_network_components.php @@ -597,9 +597,10 @@ if ((bool) $id !== false || $new_component $search_id_group = (int) get_parameter('search_id_group'); $search_string = (string) get_parameter('search_string'); +$offset = (int) get_parameter('offset'); $url = ui_get_url_refresh( [ - 'offset' => false, + 'offset' => $offset, 'search_string' => $search_string, 'search_id_group' => $search_id_group, 'id' => $id, @@ -607,7 +608,7 @@ $url = ui_get_url_refresh( true, false ); - +$name_url = 'index.php?sec=templates&sec2=godmode/modules/manage_network_components'; $table = new stdClass(); $table->width = '100%'; $table->class = 'databox filters'; @@ -712,8 +713,9 @@ $total_components = network_components_get_network_components( 'COUNT(*) AS total' ); $total_components = $total_components[0]['total']; -ui_pagination($total_components, $url); -$filter['offset'] = (int) get_parameter('offset'); +$offset_delete = ($offset >= ($total_components - 1)) ? ($offset - $config['block_size']) : $offset; +ui_pagination($total_components, $name_url); +$filter['offset'] = $offset; $filter['limit'] = (int) $config['block_size']; $components = network_components_get_network_components( false, @@ -791,7 +793,7 @@ foreach ($components as $component) { true ); - $data[0] = ''; + $data[0] = ''; $data[0] .= io_safe_output($component['name']); $data[0] .= ''; } else { @@ -855,7 +857,7 @@ foreach ($components as $component) { if ($is_management_allowed === true) { $table->cellclass[][6] = 'action_buttons'; - $data[6] = ''.html_print_image( + $data[6] = ''.html_print_image( 'images/copy.png', true, [ @@ -864,7 +866,7 @@ foreach ($components as $component) { 'class' => 'invert_filter', ] ).''; - $data[6] .= ''.html_print_image( + $data[6] .= ''.html_print_image( 'images/cross.png', true, [ @@ -887,7 +889,7 @@ if (isset($data) === true) { html_print_table($table); ui_pagination( $total_components, - $url, + $name_url, 0, 0, false, From 2b7b49db2072c43a4682e2b1ed714ed8a7822a55 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 22 Feb 2023 09:29:55 +0100 Subject: [PATCH 314/474] #10493 fixed pagination in tags --- pandora_console/godmode/tag/tag.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pandora_console/godmode/tag/tag.php b/pandora_console/godmode/tag/tag.php index b808edde9b..6474abd437 100644 --- a/pandora_console/godmode/tag/tag.php +++ b/pandora_console/godmode/tag/tag.php @@ -207,14 +207,14 @@ if (empty($tag_name) === false) { // If the user has filtered the view. $filter_performed = !empty($filter); - -$filter['offset'] = (int) get_parameter('offset'); +$offset = (int) get_parameter('offset'); +$filter['offset'] = $offset; $filter['limit'] = (int) $config['block_size']; // Statements for pagination. -$url = ui_get_url_refresh(); +$url = 'index.php?sec=gusuarios&sec2=godmode/tag/tag'; $total_tags = tags_get_tag_count($filter); - +$offset_delete = ($offset >= ($total_tags - 1)) ? ($offset - $config['block_size']) : $offset; $result = tags_search_tag(false, $filter); // Filter form. @@ -392,7 +392,7 @@ if (empty($result) === false) { ] ); $data[6] .= ''; - $data[6] .= ''.html_print_image( + $data[6] .= ''.html_print_image( 'images/cross.png', true, [ From 8df0c8a66d2426cfe0149d0d59b65e962fc42db2 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Wed, 22 Feb 2023 09:39:13 +0100 Subject: [PATCH 315/474] Fonts changed at Sancho request --- pandora_console/include/styles/menu.css | 8 ++-- pandora_console/include/styles/pandora.css | 53 +++++++++++++--------- pandora_console/include/styles/tables.css | 11 +++-- 3 files changed, 41 insertions(+), 31 deletions(-) diff --git a/pandora_console/include/styles/menu.css b/pandora_console/include/styles/menu.css index beaecb1615..db1eebb9da 100644 --- a/pandora_console/include/styles/menu.css +++ b/pandora_console/include/styles/menu.css @@ -458,7 +458,7 @@ ul li { top: 0; left: 0; background-color: #ffffff; - border-right: 1px solid #c1ccdc; + border-right: 1px solid #eee; } .button_collapse { @@ -482,7 +482,7 @@ ul li { .menu_full_classic, .button_classic { - width: 280px; + width: 250px; } .menu_full_collapsed, @@ -551,7 +551,7 @@ ul li { * --------------------------------------------------------------------- */ .page_classic { - padding-left: 280px; + padding-left: 250px; } .page_collapsed { @@ -559,7 +559,7 @@ ul li { } .header_table_classic { - padding-left: 300px; + padding-left: 270px; /* 280 + 35 */ } diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 54d271ff5a..5ed8d43ef9 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -153,17 +153,20 @@ html { } body { - background-color: #f6f7fb; + background-color: #fbfbfb; margin: 0 auto; display: flex; flex-direction: column; min-height: 100%; - font-weight: 400; - font-family: "Pandora-Regular"; - -webkit-font-smoothing: antialiased; + color: #333; + font-family: "lato"; + -webkit-font-smoothing: initial; text-rendering: optimizeLegibility; } +body * { + font-family: "lato"; +} body.body-report { display: block; } @@ -1386,7 +1389,7 @@ div#head { height: 60px; padding-top: 0px; margin: 0 auto; - border-bottom: 1px solid #c1ccdc; + border-bottom: 1px solid #eee; min-width: 882px; background-color: #fff; color: #000; @@ -1747,7 +1750,7 @@ div.title_line { display: flex; align-items: flex-end; justify-content: space-between; - border-bottom: 1px solid #c1ccdc; + border-bottom: 1px solid #eee; /* width: calc(100% + 3em); */ width: -webkit-fill-available; width: -moz-available; @@ -1756,7 +1759,7 @@ div.title_line { height: 53px; box-sizing: border-box; background-color: #fff; - /* margin-left: -3em;*/ + /* margin-left: -3em; */ } /* Breadcrum */ @@ -1945,7 +1948,7 @@ div#agent_wizard_subtabs { #menu_tab_left li span { color: #161628; font-size: 15px; - font-family: Pandora-Bold; + /*font-family: 'Lato';*/ } /* New styles for data box */ @@ -1991,8 +1994,12 @@ table.databox { border: 2px solid #c0ccdc; padding: 20px; margin-bottom: 20px; + width: calc(100% - 40px); + width: -webkit-fill-available; + /* width: -webkit-fill-available; width: -moz-available; + */ } .databox > tbody > tr > td { @@ -2547,13 +2554,13 @@ div#pandora_logo_header { } .header_title { - font-size: 12px; - color: #161628; + font-size: 11pt; + color: #444; font-weight: 600; } .header_subtitle { - font-size: 15px; + font-size: 10pt; color: #8a96a6; font-weight: 300; } @@ -2745,7 +2752,8 @@ td.cellBig { .info_box .title * { font-size: 14pt; - font-family: "Pandora-Bold"; + /*font-family: "lato";*/ + font-weight: bold; } .info_box .icon { @@ -2906,7 +2914,7 @@ input#text-id_parent.ac_input { -moz-border-radius: 3px; -webkit-border-radius: 3px; border-radius: 3px; - font-family: inherit; + /*font-family: inherit;*/ } /* plugins */ @@ -6483,7 +6491,7 @@ table.table_modal_alternate tr td:first-child { .bars-graph-rotate .flot-text .flot-x-axis div .break_word { word-break: break-word; - font-family: "lato" !important; + /*font-family: "lato" !important;*/ } .flot-text .flot-x-axis div { @@ -9896,7 +9904,7 @@ div#err_msg_centralised { .inputFile { background-color: #f6f7fb; height: 16px; - font-family: "Pandora-Regular"; + /*font-family: "lato";*/ font-size: 12px; padding: 5.5pt 20pt; cursor: pointer; @@ -9921,7 +9929,7 @@ select { border: 2px solid #c0ccdc; border-radius: 6px; height: 38px; - font-family: "Pandora-Regular"; + /*font-family: "lato";*/ font-size: 12px; color: #333333; padding-left: 12px; @@ -9975,7 +9983,7 @@ input[type="submit"] { box-shadow: 0px 3px 6px #c7c7c7; letter-spacing: 0px; color: #ffffff; - font-family: Pandora-Regular; + /*font-family: "lato";*/ font-size: 16px; margin-left: 1em; cursor: pointer; @@ -10025,7 +10033,7 @@ button.submitButton { min-width: 110px; height: 42px; font-size: 14px; - font-family: "Pandora-Regular"; + /*font-family: "lato";*/ align-items: center; line-height: 24px; box-shadow: 0px 3px 6px #c7c7c7; @@ -10604,7 +10612,7 @@ tr.bring_next_field { -moz-box-sizing: border-box !important; box-sizing: border-box !important; cursor: pointer; - font-family: "Pandora-Regular" !important; + /*font-family: "lato" !important;*/ font-size: 12px !important; } @@ -10762,7 +10770,8 @@ tr.bring_next_field { .floating_form td { font-size: 13px; min-height: 32px; - font-family: "Pandora-Bold"; + /*font-family: "lato";*/ + font-weight: bold; } .floating_form td.subinput { @@ -11067,7 +11076,7 @@ span.subsection_header_title { height: 18px; } .regular_font { - font-family: "Pandora-Regular" !important; + font-family: "lato" !important; } .width_available { @@ -11214,7 +11223,7 @@ form#satellite_conf_edit > fieldset.full-column { .input_sub_placeholder { font-size: 8pt; color: #8a96a6; - font-family: "Pandora-Regular"; + /*font-family: "lato";*/ } #principal_action_buttons input, diff --git a/pandora_console/include/styles/tables.css b/pandora_console/include/styles/tables.css index 4568627976..d774123f9d 100644 --- a/pandora_console/include/styles/tables.css +++ b/pandora_console/include/styles/tables.css @@ -93,11 +93,12 @@ background-color: #fff; border-spacing: 0; overflow: hidden; - border-radius: 6px; - border: 2px solid #c0ccdc; + border-radius: 5px; + border: 1px solid #c0ccdc; width: -webkit-fill-available; width: -moz-available; - margin-bottom: 50px !important; + margin-bottom: 50px; + margin: 15px; } .info_table > tbody > tr:nth-child(even) { @@ -158,7 +159,7 @@ .info_table > thead > tr * { font-size: 12px; - font-family: "Pandora-Bold"; + font-weight: bold; line-height: 23px; } @@ -483,7 +484,7 @@ a.pandora_pagination.current:hover { flex: 0 1 auto; font-size: 15px; color: #14524f; - font-family: "Pandora-Bold"; + font-weight: bold; margin: 4px 0 7px; } From 2a9494b48d15082942403030ec19e6938ff56ab8 Mon Sep 17 00:00:00 2001 From: "alejandro.campos@artica.es" Date: Wed, 22 Feb 2023 10:10:59 +0100 Subject: [PATCH 316/474] fix conflicts --- pandora_console/extras/mr/62.sql | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 pandora_console/extras/mr/62.sql diff --git a/pandora_console/extras/mr/62.sql b/pandora_console/extras/mr/62.sql new file mode 100644 index 0000000000..794d0a4c94 --- /dev/null +++ b/pandora_console/extras/mr/62.sql @@ -0,0 +1,18 @@ +START TRANSACTION; + +CREATE TABLE IF NOT EXISTS `tagent_filter` ( + `id_filter` INT UNSIGNED NOT NULL AUTO_INCREMENT, + `id_name` VARCHAR(600) NOT NULL, + `id_group_filter` INT NOT NULL DEFAULT 0, + `group_id` INT NOT NULL DEFAULT 0, + `recursion` TEXT, + `status` INT NOT NULL DEFAULT -1, + `search` TEXT, + `id_os` INT NOT NULL DEFAULT 0, + `policies` TEXT, + `search_custom` TEXT, + `ag_custom_fields` TEXT, + PRIMARY KEY (`id_filter`) +) ENGINE=InnoDB DEFAULT CHARSET=UTF8MB4; + +COMMIT; From 95fb797a7e0522d02dcf12d2e161da5352c4aba9 Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Wed, 22 Feb 2023 10:33:45 +0100 Subject: [PATCH 317/474] 10488-Fix views reports --- .../reporting_builder.item_editor.php | 30 ++++++++++++------- .../reporting_builder.list_items.php | 6 ++-- .../reporting/reporting_builder.main.php | 29 +++++------------- pandora_console/include/functions_html.php | 8 ++--- pandora_console/include/functions_reports.php | 2 +- pandora_console/include/functions_ui.php | 9 ++++++ pandora_console/include/javascript/pandora.js | 8 ++--- .../include/styles/js/jquery-ui_custom.css | 18 +++++++++++ pandora_console/include/styles/pandora.css | 10 +++++++ 9 files changed, 76 insertions(+), 44 deletions(-) diff --git a/pandora_console/godmode/reporting/reporting_builder.item_editor.php b/pandora_console/godmode/reporting/reporting_builder.item_editor.php index 80e72e65cf..d48a4735a0 100755 --- a/pandora_console/godmode/reporting/reporting_builder.item_editor.php +++ b/pandora_console/godmode/reporting/reporting_builder.item_editor.php @@ -1100,7 +1100,7 @@ $class = 'databox filters'; false, false, '', - 'fullwidth' + '' ); } else { html_print_input_text( @@ -1113,7 +1113,7 @@ $class = 'databox filters'; false, false, '', - 'fullwidth' + '' ); } ?> @@ -1160,7 +1160,7 @@ $class = 'databox filters'; @@ -1276,13 +1276,13 @@ $class = 'databox filters'; 'label', $label, '', - 50, + 80, 255, true, false, false, '', - 'fullwidth' + '' ); ?> @@ -3920,21 +3920,25 @@ print_SLA_list('100%', $action, $idItem); print_General_list('100%', $action, $idItem, $type); echo '
        '; if ($action == 'new') { - html_print_submit_button( + $actionButtons = html_print_submit_button( __('Create item'), 'create_item', false, - 'class="sub wand"' + ['icon' => 'next'], + true ); } else { - html_print_submit_button( + $actionButtons = html_print_submit_button( __('Update item'), 'edit_item', false, - 'class="sub upd"' + ['icon' => 'next'], + true ); } +html_print_action_buttons($actionButtons, ['type' => 'form_action']); + echo '
        '; echo ''; @@ -3980,7 +3984,7 @@ function print_SLA_list($width, $action, $idItem=null) $idItem ); ?> - +
        @@ -4496,7 +4500,7 @@ function print_General_list($width, $action, $idItem=null, $type='general') include_once $config['homedir'].'/include/functions_html.php'; ?> - +
        diff --git a/pandora_console/godmode/reporting/reporting_builder.list_items.php b/pandora_console/godmode/reporting/reporting_builder.list_items.php index ae2d92bfbc..71190bbe99 100755 --- a/pandora_console/godmode/reporting/reporting_builder.list_items.php +++ b/pandora_console/godmode/reporting/reporting_builder.list_items.php @@ -204,7 +204,7 @@ $urlFilter = '&agent_filter='.$agentFilter.'&module_filter='.$moduleFilter.'&typ if (!defined('METACONSOLE')) { $table = new stdClass(); $table->width = '100%'; - $table->class = 'databox filters'; + $table->class = 'databox filters mrgn_btn_0'; $table->data[0][0] = __('Agents'); $table->data[0][0] .= html_print_select($agents, 'agent_filter', $agentFilter, '', __('All'), 0, true); $table->data[0][1] = __('Modules'); @@ -349,7 +349,7 @@ $table->style[0] = 'text-align: right;'; if ($items) { - $table->width = '98%'; + $table->width = '100%'; if (defined('METACONSOLE')) { $table->width = '100%'; $table->class = 'databox data'; @@ -687,7 +687,7 @@ if (defined('METACONSOLE')) { echo "
        "; html_print_input_hidden('ids_items_to_delete', ''); - html_print_submit_button(__('Delete'), 'delete_btn', false, 'class="sub delete right mrgn_btn_15px"'); + html_print_submit_button(__('Delete'), 'delete_btn', false, 'class="sub delete right mrgn_btn_15px mrgn_right_20px"'); echo '
        '; echo ''; } diff --git a/pandora_console/godmode/reporting/reporting_builder.main.php b/pandora_console/godmode/reporting/reporting_builder.main.php index 177c84d68d..e52634a065 100755 --- a/pandora_console/godmode/reporting/reporting_builder.main.php +++ b/pandora_console/godmode/reporting/reporting_builder.main.php @@ -41,22 +41,22 @@ $groups = users_get_groups(); switch ($action) { default: case 'new': - $actionButtonHtml = html_print_submit_button( + $actionButtons = html_print_submit_button( __('Save'), 'add', false, - 'class="sub wand"', + [ 'icon' => 'next' ], true ); $hiddenFieldAction = 'save'; break; case 'update': case 'edit': - $actionButtonHtml = html_print_submit_button( + $actionButtons = html_print_submit_button( __('Update'), 'edit', false, - 'class="sub upd"', + [ 'icon' => 'next' ], true ); $hiddenFieldAction = 'update'; @@ -191,22 +191,9 @@ if ($enterpriseEnable) { } $table->data['interactive_report'][0] = __('Non interactive report'); - $table->data['interactive_report'][1] = __('Yes'); - $table->data['interactive_report'][1] .= '   '; - $table->data['interactive_report'][1] .= html_print_radio_button( + $table->data['interactive_report'][1] .= html_print_checkbox_switch( 'non_interactive', 1, - '', - $non_interactive_check, - true - ); - $table->data['interactive_report'][1] .= '  '; - $table->data['interactive_report'][1] .= __('No'); - $table->data['interactive_report'][1] .= '   '; - $table->data['interactive_report'][1] .= html_print_radio_button( - 'non_interactive', - 0, - '', $non_interactive_check, true ); @@ -215,8 +202,8 @@ if ($enterpriseEnable) { $table->data['description'][0] = __('Description'); $table->data['description'][1] = html_print_textarea( 'description', - 5, - 15, + 2, + 80, $description, '', true @@ -244,7 +231,7 @@ echo ''; html_print_table($table); echo '
        '; -echo $actionButtonHtml; +html_print_action_buttons($actionButtons, ['type' => 'form_action']); html_print_input_hidden('action', $hiddenFieldAction); html_print_input_hidden('id_report', $idReport); echo '
        '; diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index ff02de3639..bf5e53a3b6 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -2150,7 +2150,7 @@ function html_print_extended_select_for_time( 'class' => $uniq_name.'_toggler '.$class.' invert_filter', 'alt' => __('Custom'), 'title' => __('Custom'), - 'style' => 'width: 18px; margin-bottom: -5px; margin-left: 10px'.$style_icon, + 'style' => 'width: 18px; margin-bottom: -5px; margin-left: 10px; padding-top: 10px;'.$style_icon, ], false, false, @@ -2162,7 +2162,7 @@ function html_print_extended_select_for_time( echo ''; - echo '
        '; + echo '
        '; html_print_input_text($uniq_name.'_text', $selected, '', $size, 255, false, $readonly, false, '', $class); html_print_input_hidden($name, $selected, false, $uniq_name); @@ -2178,7 +2178,7 @@ function html_print_extended_select_for_time( false, $class, $readonly, - 'padding: 0px 5px; height: 42px; margin: -6px 0 0 6px; width: 140px;'.$select_style, + ' margin-left: 5px; width: 140px;'.$select_style, false, false, false, @@ -2196,7 +2196,7 @@ function html_print_extended_select_for_time( 'class' => $uniq_name.'_toggler invert_filter', 'alt' => __('List'), 'title' => __('List'), - 'style' => 'width: 18px;margin-bottom: -5px;'.$style_icon, + 'style' => 'width: 18px;margin-bottom: -5px; padding-top: 10px;'.$style_icon, ] ).''; echo '
        '; diff --git a/pandora_console/include/functions_reports.php b/pandora_console/include/functions_reports.php index 0d39f5b916..41356e9455 100755 --- a/pandora_console/include/functions_reports.php +++ b/pandora_console/include/functions_reports.php @@ -1059,7 +1059,7 @@ function get_table_custom_macros_report($data) $table = new StdClass(); $table->data = []; $table->width = '100%'; - $table->class = 'databox data fullwidth'; + $table->class = 'info_table'; $table->id = 'table-macros-definition'; $table->rowclass = []; diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 9b3060d1f8..d1deaca26d 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -5841,6 +5841,15 @@ function ui_print_agent_autocomplete_input($parameters) .attr("style", "background-image: url(\'"+image+"\'); background-repeat: no-repeat; background-position: 97% center; background-size: 20px; '.$inputStyles.'"); } + $(document).ready(function () { + $("#'.$input_id.'").focusout(function (e) { + setTimeout(() => { + let iconImage = "'.$icon_image.'"; + $("#'.$input_id.'").attr("style", "background-image: url(\'"+iconImage+"\'); background-repeat: no-repeat; background-position: 97% center; background-size: 20px; '.$inputStyles.'"); + }, 100); + }); + }); + function set_functions_change_autocomplete_'.$input_name.'() { var cache_'.$input_name.' = {}; diff --git a/pandora_console/include/javascript/pandora.js b/pandora_console/include/javascript/pandora.js index 03c7308faf..661ed78545 100644 --- a/pandora_console/include/javascript/pandora.js +++ b/pandora_console/include/javascript/pandora.js @@ -894,7 +894,7 @@ function post_process_select_events(name) { function period_select_init(name, allow_zero) { // Manual mode is hidden by default $("#" + name + "_manual").css("display", "none"); - $("#" + name + "_default").css("display", "inline"); + $("#" + name + "_default").css("display", "flex"); // If the text input is empty, we put on it 5 minutes by default if ($("#text-" + name + "_text").val() == "") { $("#text-" + name + "_text").val(300); @@ -907,7 +907,7 @@ function period_select_init(name, allow_zero) { } } else if ($("#text-" + name + "_text").val() == 0 && allow_zero == 1) { $("#" + name + "_units option:last").prop("selected", false); - $("#" + name + "_manual").css("display", "inline"); + $("#" + name + "_manual").css("display", "flex"); $("#" + name + "_default").css("display", "none"); } } @@ -996,13 +996,13 @@ function selectFirst(name) { */ function toggleBoth(name) { if ($("#" + name + "_default").css("display") == "none") { - $("#" + name + "_default").css("display", "inline"); + $("#" + name + "_default").css("display", "flex"); } else { $("#" + name + "_default").css("display", "none"); } if ($("#" + name + "_manual").css("display") == "none") { - $("#" + name + "_manual").css("display", "inline"); + $("#" + name + "_manual").css("display", "flex"); } else { $("#" + name + "_manual").css("display", "none"); } diff --git a/pandora_console/include/styles/js/jquery-ui_custom.css b/pandora_console/include/styles/js/jquery-ui_custom.css index b0c0fce92e..d9adde2a0f 100644 --- a/pandora_console/include/styles/js/jquery-ui_custom.css +++ b/pandora_console/include/styles/js/jquery-ui_custom.css @@ -144,6 +144,7 @@ .ui_tpicker_second, .ui-slider-handle { border: 1px solid #aaaaaa; + background-color: #dadada !important; } .ui-timepicker-div dd { margin: 0px 15px 0px 15px; @@ -219,6 +220,23 @@ a.ui-button:active, border-bottom: 4px solid #82b92e; } +.ui-priority-secondary:hover { + content: ""; + position: absolute; + bottom: -5px; + width: 100%; + border-bottom: 5px solid #82b92e; +} + +.ui-priority-primary:hover { + content: ""; + position: absolute; + right: 5px; + bottom: -5px; + width: 100%; + border-bottom: 5px solid #82b92e; +} + .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { diff --git a/pandora_console/include/styles/pandora.css b/pandora_console/include/styles/pandora.css index 54d271ff5a..b4a31852de 100644 --- a/pandora_console/include/styles/pandora.css +++ b/pandora_console/include/styles/pandora.css @@ -11268,3 +11268,13 @@ form#satellite_conf_edit > fieldset.full-column { background-size: 24px; background-image: url("../../images/enable.svg"); } + +.orientation-report { + margin-right: 10px; +} + +#textarea_header_tbl, +#textarea_firstpage_tbl, +#textarea_footer_tbl { + width: 80% !important; +} From df86a428b7b9bcd45ff78f4f6a1e2266ee987fbd Mon Sep 17 00:00:00 2001 From: rafael Date: Wed, 22 Feb 2023 10:38:14 +0100 Subject: [PATCH 318/474] 10435 change gotty to be downloaded from firefly --- extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh | 1 + extras/deploy-scripts/pandora_deploy_community.sh | 2 +- extras/deploy-scripts/pandora_deploy_community_el8.sh | 4 ++-- extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh | 3 ++- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh b/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh index dba6aa2773..45a99783ab 100644 --- a/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh +++ b/extras/deploy-scripts/deploy_ext_database_ubuntu_2204.sh @@ -4,6 +4,7 @@ ############################################################################################################## ## Tested versions ## # Ubuntu 22.04.1 +# Ubuntu 22.04.2 #avoid promps export DEBIAN_FRONTEND=noninteractive diff --git a/extras/deploy-scripts/pandora_deploy_community.sh b/extras/deploy-scripts/pandora_deploy_community.sh index 78f1ef0e41..9386d55647 100644 --- a/extras/deploy-scripts/pandora_deploy_community.sh +++ b/extras/deploy-scripts/pandora_deploy_community.sh @@ -431,7 +431,7 @@ execute_cmd "curl -LSs --output pandorafms_agent_linux-7.0NG.noarch.rpm ${PANDOR execute_cmd "yum install -y $HOME/pandora_deploy_tmp/pandorafms*.rpm" "installing PandoraFMS packages" # Copy gotty utility -execute_cmd "wget https://pandorafms.com/library/wp-content/uploads/2019/11/gotty_linux_amd64.tar.gz" 'Dowloading gotty util' +execute_cmd "wget https://firefly.pandorafms.com/pandorafms/utils/gotty_linux_amd64.tar.gz" 'Dowloading gotty util' tar xvzf gotty_linux_amd64.tar.gz &>> $LOGFILE execute_cmd "mv gotty /usr/bin/" 'Installing gotty util' diff --git a/extras/deploy-scripts/pandora_deploy_community_el8.sh b/extras/deploy-scripts/pandora_deploy_community_el8.sh index fe00f81571..cc14ad1ffa 100644 --- a/extras/deploy-scripts/pandora_deploy_community_el8.sh +++ b/extras/deploy-scripts/pandora_deploy_community_el8.sh @@ -5,7 +5,7 @@ ## Tested versions ## # Centos 8.4, 8.5 # Rocky 8.4, 8.5, 8.6, 8.7 -# Almalinuz 8.4, 8.5 +# Almalinux 8.4, 8.5 # RedHat 8.5 #Constants @@ -530,7 +530,7 @@ execute_cmd "curl -LSs --output pandorafms_agent_linux-7.0NG.noarch.rpm ${PANDOR execute_cmd "dnf install -y $HOME/pandora_deploy_tmp/pandorafms*.rpm" "Installing Pandora FMS packages" # Copy gotty utility -execute_cmd "wget https://pandorafms.com/library/wp-content/uploads/2019/11/gotty_linux_amd64.tar.gz" 'Dowloading gotty util' +execute_cmd "wget https://firefly.pandorafms.com/pandorafms/utils/gotty_linux_amd64.tar.gz" 'Dowloading gotty util' tar xvzf gotty_linux_amd64.tar.gz &>> $LOGFILE execute_cmd "mv gotty /usr/bin/" 'Installing gotty util' diff --git a/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh b/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh index 8bd8bcfaff..1446abfab3 100644 --- a/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh +++ b/extras/deploy-scripts/pandora_deploy_community_ubuntu_2204.sh @@ -4,6 +4,7 @@ ############################################################################################################## ## Tested versions ## # Ubuntu 22.04.1 +# Ubuntu 22.04.2 #avoid promps export DEBIAN_FRONTEND=noninteractive @@ -496,7 +497,7 @@ check_cmd_status "Error installing PandoraFMS Agent" # Copy gotty utility cd $WORKDIR &>> "$LOGFILE" -execute_cmd "wget https://pandorafms.com/library/wp-content/uploads/2019/11/gotty_linux_amd64.tar.gz" 'Dowloading gotty util' +execute_cmd "wget https://firefly.pandorafms.com/pandorafms/utils/gotty_linux_amd64.tar.gz" 'Dowloading gotty util' tar xvzf gotty_linux_amd64.tar.gz &>> $LOGFILE execute_cmd "mv gotty /usr/bin/" 'Installing gotty util' From 3d5458ae4623d332d7cb38cd4ec9650e31fcfd56 Mon Sep 17 00:00:00 2001 From: Daniel Cebrian Date: Wed, 22 Feb 2023 11:36:09 +0100 Subject: [PATCH 319/474] #10302 fixed ack date --- pandora_console/operation/events/events.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index c7c8be45ce..251d95200d 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -521,7 +521,7 @@ if (is_ajax() === true) { $tmp->agent_name = io_safe_output($tmp->agent_name); - $tmp->ack_utimestamp_raw = strtotime($tmp->ack_utimestamp); + $tmp->ack_utimestamp_raw = $tmp->ack_utimestamp; $tmp->ack_utimestamp = ui_print_timestamp( (empty($tmp->ack_utimestamp) === true) ? 0 : $tmp->ack_utimestamp, From bbde3e418152a2ed7043eb2c35b5296ff8c23c22 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Wed, 22 Feb 2023 12:15:17 +0100 Subject: [PATCH 320/474] Minor fixes --- .../extensions/resource_exportation.php | 145 ++++++++++-------- .../godmode/servers/modificar_server.php | 37 +++-- .../godmode/servers/servers.build_table.php | 37 ++--- pandora_console/include/ajax/module.php | 3 +- pandora_console/include/functions_ui.php | 2 +- 5 files changed, 123 insertions(+), 101 deletions(-) diff --git a/pandora_console/extensions/resource_exportation.php b/pandora_console/extensions/resource_exportation.php index b6e594c744..ba9f6e5480 100755 --- a/pandora_console/extensions/resource_exportation.php +++ b/pandora_console/extensions/resource_exportation.php @@ -1,16 +1,32 @@ \n"; break; @@ -224,18 +209,6 @@ function output_xml_report($id) echo '\n"; break; - case 'event_report_module': - break; - - case 'alert_report_module': - break; - - case 'alert_report_agent': - break; - - case 'alert_report_group': - break; - case 'url': echo ''; break; @@ -245,6 +218,29 @@ function output_xml_report($id) echo ''; echo ''; break; + + case 1: + case 'simple_graph': + case 'simple_baseline_graph': + case 6: + case 'monitor_report': + case 7: + case 'avg_value': + case 8: + case 'max_value': + case 9: + case 'min_value': + case 10: + case 'sumatory': + case 'agent_detailed_event': + case 'event_report_agent': + case 'event_report_module': + case 'alert_report_module': + case 'alert_report_agent': + case 'alert_report_group': + default: + // Do nothing. + break; } echo "\n"; @@ -417,25 +413,42 @@ function resource_exportation_extension_main() $hook_enterprise = enterprise_include('extensions/resource_exportation/functions.php'); - ui_print_page_header(__('Resource exportation'), 'images/extensions.png', false, '', true, ''); + ui_print_standard_header( + __('Resource exportation'), + 'images/extensions.png', + false, + '', + true, + [], + [ + [ + 'link' => '', + 'label' => __('Resources'), + ], + [ + 'link' => '', + 'label' => __('Resource exporting'), + ], + ] + ); - echo '
        '; - echo __('This extension makes exportation of resource template more easy.').' '.__('You can export resource templates in .ptr format.'); - echo '
        '; - - echo '

        '; + ui_print_warning_message( + __('This extension makes exportation of resource template more easy.').'
        '.__('You can export resource templates in .ptr format.') + ); $table = new stdClass(); - $table->width = '100%'; - $table->style[0] = 'width: 30%;'; - $table->style[1] = 'width: 10%;'; - $table->class = 'databox filters'; + $table->class = 'databox m2020'; + $table->id = 'resource_exportation_table'; + $table->style = []; + $table->style[0] = 'width: 0'; + $table->style[1] = 'width: 0'; + $table->data = []; $table->data[0][0] = __('Report'); $table->data[0][1] = html_print_select_from_sql('SELECT id_report, name FROM treport', 'report', '', '', '', 0, true); - $table->data[0][2] = html_print_button(__('Export'), '', false, 'export_to_ptr(\'report\');', 'class="sub config"', true); + $table->data[0][2] = html_print_button(__('Export'), '', false, 'export_to_ptr(\'report\');', ['icon' => 'cog', 'mode' => 'secondary mini'], true); $table->data[1][0] = __('Visual console'); $table->data[1][1] = html_print_select_from_sql('SELECT id, name FROM tlayout', 'visual_console', '', '', '', 0, true); - $table->data[1][2] = html_print_button(__('Export'), '', false, 'export_to_ptr(\'visual_console\');', 'class="sub config"', true); + $table->data[1][2] = html_print_button(__('Export'), '', false, 'export_to_ptr(\'visual_console\');', ['icon' => 'cog', 'mode' => 'secondary mini'], true); if ($hook_enterprise === true) { add_rows_for_enterprise($table->data); diff --git a/pandora_console/godmode/servers/modificar_server.php b/pandora_console/godmode/servers/modificar_server.php index 0ab1377747..7d09120ca8 100644 --- a/pandora_console/godmode/servers/modificar_server.php +++ b/pandora_console/godmode/servers/modificar_server.php @@ -84,8 +84,8 @@ if (isset($_GET['server']) === true) { $table->cellpadding = 4; $table->cellspacing = 4; - $table->width = '100%'; - $table->class = 'databox filters'; + $table->class = 'databox m2020'; + $table->id = 'server_update_form'; $table->data[] = [ __('Name'), @@ -129,17 +129,24 @@ if (isset($_GET['server']) === true) { html_print_table($table); - html_print_div( - [ - 'class' => 'action-buttons w100p', - 'content' => html_print_submit_button( - __('Update'), - '', - false, - [ 'icon' => 'update' ], - true - ), - ] + $actionButtons = []; + $actionButtons[] = html_print_submit_button( + __('Update'), + '', + false, + [ 'icon' => 'update' ], + true + ); + + $actionButtons[] = html_print_go_back_button( + 'index.php?sec=gservers&sec2=godmode/servers/modificar_server', + ['button_class' => ''], + true + ); + + html_print_action_buttons( + implode('', $actionButtons), + ['type' => 'form_action'], ); echo ''; @@ -250,6 +257,10 @@ if (isset($_GET['server']) === true) { 'link' => '', 'label' => __('Servers'), ], + [ + 'link' => '', + 'label' => __('Manage Servers'), + ], ] ); diff --git a/pandora_console/godmode/servers/servers.build_table.php b/pandora_console/godmode/servers/servers.build_table.php index eb6943eccc..5940bcd5fd 100644 --- a/pandora_console/godmode/servers/servers.build_table.php +++ b/pandora_console/godmode/servers/servers.build_table.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2022 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 Artica Soluciones Tecnologicas * Please see http://pandorafms.org for full contribution list * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -54,15 +54,13 @@ if ($servers === false) { } $table = new StdClass(); -$table->width = '100%'; -$table->class = 'info_table'; +$table->class = 'info_table m2020'; $table->cellpadding = 0; $table->cellspacing = 0; $table->size = []; $table->style = []; -$table->style[0] = 'font-weight: bold'; - +// $table->style[0] = 'font-weight: bold'; $table->align = []; $table->align[1] = 'center'; $table->align[3] = 'center'; @@ -196,12 +194,11 @@ foreach ($servers as $server) { if ($server['type'] === 'recon') { $data[8] .= ''; $data[8] .= html_print_image( - 'images/first_task/icono_grande_reconserver.png', + 'images/snmp-trap@svg.svg', true, [ 'title' => __('Manage Discovery tasks'), - 'style' => 'width:21px;height:21px;', - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); @@ -211,22 +208,22 @@ foreach ($servers as $server) { if ($server['type'] === 'data') { $data[8] .= ''; $data[8] .= html_print_image( - 'images/target.png', + 'images/change-active.svg', true, [ 'title' => __('Reset module status and fired alert counts'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $data[8] .= ''; } else if ($server['type'] === 'enterprise snmp') { $data[8] .= ''; $data[8] .= html_print_image( - 'images/target.png', + 'images/change-active.svg', true, [ 'title' => __('Claim back SNMP modules'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $data[8] .= ''; @@ -234,11 +231,11 @@ foreach ($servers as $server) { $data[8] .= ''; $data[8] .= html_print_image( - 'images/config.png', + 'images/edit.svg', true, [ 'title' => __('Edit'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $data[8] .= ''; @@ -246,22 +243,22 @@ foreach ($servers as $server) { if (($names_servers[$safe_server_name] === true) && ($server['type'] === 'data' || $server['type'] === 'enterprise satellite')) { $data[8] .= ''; $data[8] .= html_print_image( - 'images/agent.png', + 'images/agents@svg.svg', true, [ 'title' => __('Manage satellite hosts'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $data[8] .= ''; $data[8] .= ''; $data[8] .= html_print_image( - 'images/remote_configuration.png', + 'images/remote_configuration@svg.svg', true, [ 'title' => __('Remote configuration'), - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $data[8] .= ''; @@ -270,12 +267,12 @@ foreach ($servers as $server) { $data[8] .= ''; $data[8] .= html_print_image( - 'images/cross.png', + 'images/delete.svg', true, [ 'title' => __('Delete'), 'onclick' => "if (! confirm ('".__('Modules run by this server will stop working. Do you want to continue?')."')) return false", - 'class' => 'invert_filter', + 'class' => 'main_menu_icon invert_filter', ] ); $data[8] .= ''; diff --git a/pandora_console/include/ajax/module.php b/pandora_console/include/ajax/module.php index 9913438275..7efb4d832b 100755 --- a/pandora_console/include/ajax/module.php +++ b/pandora_console/include/ajax/module.php @@ -1149,7 +1149,7 @@ if (check_login()) { $last_status_change_text = __('Time elapsed since last status change: '); $last_status_change_text .= (empty($module['last_status_change']) === false) ? human_time_comparation($module['last_status_change']) : __('N/A'); - $data[4] .= ui_print_status_image($status, htmlspecialchars($title), true, false, false, false, $last_status_change_text); + $data[4] .= ui_print_status_image($status, htmlspecialchars($title), true, false, false, true, $last_status_change_text); if ($show_context_help_first_time === false) { $show_context_help_first_time = true; @@ -1158,6 +1158,7 @@ if (check_login()) { } } + hd($data[4], true); // Module thresholds. $data[5] = ''; if ((int) $module['id_tipo_modulo'] !== 25) { diff --git a/pandora_console/include/functions_ui.php b/pandora_console/include/functions_ui.php index 9b3060d1f8..b97b828979 100755 --- a/pandora_console/include/functions_ui.php +++ b/pandora_console/include/functions_ui.php @@ -343,7 +343,7 @@ function ui_print_message($message, $class='', $attributes='', $return=false, $t [ 'href' => 'javascript: close_info_box(\''.$id.'\')', 'content' => html_print_image( - 'images/svg/fail.svg', + 'images/close@svg.svg', true, false, false, From fd0c1818203c8769bd9f8d2f607d2124f20ae7ed Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Wed, 22 Feb 2023 12:16:04 +0100 Subject: [PATCH 321/474] Margin reversed --- pandora_console/include/functions_html.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pandora_console/include/functions_html.php b/pandora_console/include/functions_html.php index ff02de3639..fb55ed5593 100644 --- a/pandora_console/include/functions_html.php +++ b/pandora_console/include/functions_html.php @@ -3474,7 +3474,8 @@ function html_print_button($label='OK', $name='', $disabled=false, $script='', $ $classes = ''; $fixedId = ''; $iconStyle = ''; - $spanStyle = 'margin-top: 4px;'; + // $spanStyle = 'margin-top: 4px;'; + $spanStyle = ''; if (empty($name) === true) { $name = 'unnamed'; } From 2081459556a5edc1a67ea0f6ca01fd6a47a1ac96 Mon Sep 17 00:00:00 2001 From: Pablo Aragon Date: Wed, 22 Feb 2023 13:08:15 +0100 Subject: [PATCH 322/474] 10454-Fix event view --- pandora_console/include/styles/events.css | 21 +++++++++++++++---- pandora_console/operation/events/events.php | 23 +++++++++++---------- 2 files changed, 29 insertions(+), 15 deletions(-) diff --git a/pandora_console/include/styles/events.css b/pandora_console/include/styles/events.css index dc1f7415b7..12502a5cc7 100644 --- a/pandora_console/include/styles/events.css +++ b/pandora_console/include/styles/events.css @@ -1,11 +1,11 @@ div.criticity { - width: 150px; - height: 2em; + width: 100px; + height: 15px; color: #fff; text-align: center; border-radius: 5px; - font-size: 0.8em; - padding: 5px; + font-size: 0.7em; + padding: 2px; margin: 0; display: table-cell; vertical-align: middle; @@ -82,6 +82,19 @@ table.dataTable tbody td { padding: 8px 10px; } +th:last-child { + padding-top: 0px !important; + padding-bottom: 0px !important; +} + +td { + padding: 0px !important; +} + +td > input[id^="checkbox-multi"] { + margin: 0px !important; +} + .info_table.events tr > th { padding-left: 1em; font-size: 8pt; diff --git a/pandora_console/operation/events/events.php b/pandora_console/operation/events/events.php index 009b0dd4bd..829ba01044 100644 --- a/pandora_console/operation/events/events.php +++ b/pandora_console/operation/events/events.php @@ -626,8 +626,8 @@ if (is_ajax() === true) { $tmp->mini_severity .= $output; $tmp->mini_severity .= '
        '; - $criticity = '
        '.$text.'
        '; + $criticity = '
        '.$text.'
        '; $tmp->criticity = $criticity; // Add event severity to end of text. @@ -695,8 +695,8 @@ if (is_ajax() === true) { break; } - $event_type = '
        '.$text.'
        '; + $event_type = '
         
        '; $tmp->event_type = $event_type; // Module status. @@ -735,8 +735,8 @@ if (is_ajax() === true) { break; } - $module_status = '
        '.$text.'
        '; + $module_status = '
         
        '; $tmp->module_status = $module_status; // Status. @@ -772,7 +772,7 @@ if (is_ajax() === true) { true, [ 'title' => __('Event in process'), - 'class' => 'forced-title invert_filter', + 'class' => 'forced-title invert_filter height_20px', ] ); break; @@ -790,7 +790,7 @@ if (is_ajax() === true) { break; } - $draw_state = '
        '; + $draw_state = '
        '; $draw_state .= ''; @@ -1812,7 +1812,7 @@ $in .= '
        '; $inputs[] = $in; // Trick view in table. -$inputs[] = '
        '; +$inputs[] = '
        '; $buttons = []; @@ -2211,7 +2211,8 @@ $filter .= ui_toggle( true, true, 'white_box white_box_opened', - 'no-border flex-row' + 'no-border flex-row', + 'box-flat white_table_graph w100p' ); try { @@ -2394,7 +2395,7 @@ try { [ 'id' => $table_id, 'class' => 'info_table events', - 'style' => 'width: 100%;', + 'style' => 'width: 99%;', 'ajax_url' => 'operation/events/events', 'ajax_data' => [ 'get_events' => 1, From ec58cb459372cc104f4dc1ddc3d11816e654b050 Mon Sep 17 00:00:00 2001 From: Jose Gonzalez Date: Wed, 22 Feb 2023 14:19:57 +0100 Subject: [PATCH 323/474] Plugins view --- pandora_console/godmode/servers/plugin.php | 481 +++++++++++-------- pandora_console/include/class/Tree.class.php | 6 +- pandora_console/include/functions_html.php | 2 +- 3 files changed, 290 insertions(+), 199 deletions(-) diff --git a/pandora_console/godmode/servers/plugin.php b/pandora_console/godmode/servers/plugin.php index 7b0a34efa7..a31b3e587b 100644 --- a/pandora_console/godmode/servers/plugin.php +++ b/pandora_console/godmode/servers/plugin.php @@ -14,7 +14,7 @@ * |___| |___._|__|__|_____||_____|__| |___._| |___| |__|_|__|_______| * * ============================================================================ - * Copyright (c) 2005-2021 Artica Soluciones Tecnologicas + * Copyright (c) 2005-2023 Artica Soluciones Tecnologicas * Please see http://pandorafms.org for full contribution list * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License @@ -71,15 +71,13 @@ if (is_ajax()) { $table = new stdClass(); $table->width = '100%'; $table->head[0] = __('Network Components'); - $table->data = []; + // $table->data = []; foreach ($network_components as $net_comp) { $table->data[] = [$net_comp['name']]; } - if (!empty($table->data)) { + if (empty($table->data) === false) { html_print_table($table); - - echo '
        '; } $table = new stdClass(); @@ -236,22 +234,22 @@ if ($filemanager) { $tabs = [ 'list' => [ 'text' => ''.html_print_image( - 'images/eye_show.png', + 'images/see-details@svg.svg', true, [ 'title' => __('Plugins'), - 'class' => 'invert_filter', + 'class' => 'invert_filter main_menu_icon', ] ).'', 'active' => (bool) ($tab != 'Attachments'), ], 'options' => [ 'text' => ''.html_print_image( - 'images/collection.png', + 'images/file-collection@svg.svg', true, [ 'title' => __('Attachments'), - 'class' => 'invert_filter', + 'class' => 'invert_filter main_menu_icon', ] ).'', 'active' => (bool) ($tab == 'Attachments'), @@ -333,35 +331,37 @@ if ($filemanager) { // ===================================================================== $sec = 'gservers'; -if (($create != '') || ($view != '')) { +if (empty($create) === false || empty($view) === false) { enterprise_hook('open_meta_frame'); $management_allowed = is_management_allowed(); - if (defined('METACONSOLE')) { + if (is_metaconsole() === true) { components_meta_print_header(); $sec = 'advanced'; if ($management_allowed === false) { ui_print_warning_message(__('To manage plugin you must activate centralized management')); } } else { - if ($create != '') { - ui_print_page_header( - __('Plugin registration'), - 'images/gm_servers.png', - false, - '', - true - ); - } else { - ui_print_page_header( - __('Plugin update'), - 'images/gm_servers.png', - false, - '', - true - ); - } + // Header. + ui_print_standard_header( + (empty($create) === false) ? __('Plugin registration') : __('Plugin update'), + 'images/gm_servers.png', + false, + '', + true, + [], + [ + [ + 'link' => '', + 'label' => __('Servers'), + ], + [ + 'link' => 'index.php?sec=gservers&sec2=godmode/servers/plugin', + 'label' => __('Plugins'), + ], + ] + ); if ($management_allowed === false) { ui_print_warning_message( @@ -373,66 +373,7 @@ if (($create != '') || ($view != '')) { } } - - if ($create == '') { - $plugin_id = get_parameter('view', ''); - echo "
        "; - } else { - echo ""; - } - - $table = new stdClass(); - $table->width = '100%'; - $table->id = 'table-form'; - $table->class = 'databox filters'; - $table->style = []; - $table->style[0] = 'font-weight: bold'; - $table->style[2] = 'font-weight: bold'; - $table->data = []; - - $data = []; - $data[0] = __('Name'); - $data[1] = ''; - $table->colspan['plugin_name'][1] = 3; - $table->data['plugin_name'] = $data; - - $data = []; - $data[0] = __('Plugin type'); - $fields[0] = __('Standard'); - $fields[1] = __('Nagios'); - $data[1] = html_print_select($fields, 'form_plugin_type', $form_plugin_type, '', '', 0, true); - $table->data['plugin_type'] = $data; - $table->colspan['plugin_type'][1] = 3; - - $data[0] = __('Max. timeout').ui_print_help_tip(__('This value only will be applied if is minor than the server general configuration plugin timeout').'.

        '.__('If you set a 0 seconds timeout, the server plugin timeout will be used'), true); - $data[1] = html_print_extended_select_for_time('form_max_timeout', $form_max_timeout, '', '', '0', false, true); - - $table->data['plugin_timeout'] = $data; - - $data = []; - $data[0] = __('Description'); - $data[1] = ''; - $table->colspan['plugin_desc'][1] = 3; - $table->data['plugin_desc'] = $data; - - $table->width = '100%'; - $table->class = 'databox filters'; - - if (defined('METACONSOLE')) { - $table->head[0] = __('General'); - $table->head_colspan[0] = 4; - $table->headstyle[0] = 'text-align: center'; - html_print_table($table); - } else { - echo '
        '.__('General').''; - html_print_table($table); - echo '
        '; - } - - $table->data = []; - - $plugin_id = get_parameter('view', 0); - + $plugin_id = (int) get_parameter('view'); $locked = true; // If we have plugin id (update mode) and this plugin used by any module or component @@ -447,46 +388,170 @@ if (($create != '') || ($view != '')) { $locked = false; } - $disabled = ''; - if ($locked) { - $disabled = 'readonly="readonly"'; + $disabled = ($locked === true) ? 'readonly="readonly"' : ''; + + if (empty($create) === true) { + $formAction = 'index.php?sec=gservers&sec2=godmode/servers/plugin&tab=$tab&update_plugin=$plugin_id&pure='.$config['pure']; + } else { + $formAction = 'index.php?sec=gservers&sec2=godmode/servers/plugin&tab=$tab&create_plugin=1&pure='.$config['pure']; } + $formPluginType = [ + 0 => __('Standard'), + 1 => __('Nagios'), + ]; + + echo ''; + + $table = new stdClass(); + $table->id = 'table-form'; + $table->class = 'floating_form'; + $table->style = []; + $table->data['plugin_name_captions'] = $data; + $table->style[0] = 'vertical-align: top'; + $table->style[1] = 'vertical-align: top'; + + $table->data = []; + // General title. + $generalTitleContent = []; + $generalTitleContent[] = html_print_div([ 'style' => 'width: 10px; flex: 0 0 auto; margin-right: 5px;}', 'class' => 'section_table_title_line' ], true); + $generalTitleContent[] = html_print_div([ 'class' => 'section_table_title', 'content' => __('General')], true); + $data[0] = html_print_div(['class' => 'flex-row-center', 'content' => implode('', $generalTitleContent) ], true); + $table->data['general_title'] = $data; + + $data = []; + $data[0] = __('Name'); + $table->data['plugin_name_captions'] = $data; + + $data = []; + $data[0] = html_print_input_text('form_name', $form_name, '', 100, 255, true, false, false, '', 'w100p'); + $table->data['plugin_name_inputs'] = $data; + $table->colspan['plugin_name_inputs'][0] = 3; + + + $data = []; + $data[0] = __('Plugin type'); + $data[1] = __('Max. timeout'); + $table->data['plugin_type_timeout_captions'] = $data; + // $table->colspan['plugin_type'][1] = 3; + $data = []; + $data[0] = html_print_select($formPluginType, 'form_plugin_type', $form_plugin_type, '', '', 0, true); + $timeoutContent = []; + $timeoutContent[] = '
        '.html_print_extended_select_for_time('form_max_timeout', $form_max_timeout, '', '', '0', false, true).'
        '; + $timeoutContent[] = ui_print_input_placeholder(__('This value only will be applied if is minor than the server general configuration plugin timeout').'
        '.__('If you set a 0 seconds timeout, the server plugin timeout will be used'), true); + $data[1] = html_print_div( + [ + 'class' => 'flex flex_column', + 'content' => implode('', $timeoutContent), + ], + true + ); + $table->data['plugin_type_timeout_inputs'] = $data; + + $data = []; + $data[0] = __('Description'); + $table->data['plugin_desc_captions'] = $data; + + $data = []; + $data[0] = html_print_textarea('form_description', 4, 50, $form_description, '', true, 'w100p'); + $table->colspan['plugin_desc_inputs'][0] = 3; + $table->data['plugin_desc_inputs'] = $data; + /* + if (is_metaconsole() === true) { + $table->head[0] = __('General'); + $table->head_colspan[0] = 4; + $table->headstyle[0] = 'text-align: center'; + html_print_table($table); + } else { + echo '
        '.__('General').''; + html_print_table($table); + echo '
        '; + } + + html_print_table($table); + + $table->data = []; + */ + + // Command title. + $commandTitleContent = []; + $commandTitleContent[] = html_print_div([ 'style' => 'width: 10px; flex: 0 0 auto; margin-right: 5px;}', 'class' => 'section_table_title_line' ], true); + $commandTitleContent[] = html_print_div([ 'class' => 'section_table_title', 'content' => __('Command')], true); + $data = []; + $data[0] = html_print_div(['class' => 'flex-row-center', 'content' => implode('', $commandTitleContent) ], true); + $table->data['command_title'] = $data; + $data = []; $data[0] = __('Plugin command').ui_print_help_tip(__('Specify interpreter and plugin path. The server needs permissions to run it.'), true); - $data[1] = ''; + $table->data['plugin_command_caption'] = $data; - $data[1] .= ' '; - $data[1] .= html_print_image('images/file.png', true, ['class' => 'invert_filter'], false, true); - $data[1] .= ''; - $table->data['plugin_command'] = $data; + $data = []; + $formExecuteContent = []; + $formExecuteContent[] = html_print_input_text('form_execute', $form_execute, '', 50, 255, true, false, false, '', 'command_component command_advanced_conf w100p'); + $formExecuteContent[] = html_print_anchor( + [ + 'title' => __('Save changes'), + 'href' => 'index.php?sec=gservers&sec2=godmode/servers/plugin&filemanager=1&tab=Attachments&id_plugin='.$form_id, + 'class' => 'mrgn_lft_5px', + 'content' => html_print_image('images/validate.svg', true, ['class' => 'main_menu_icon invert_filter'], false, true), + ], + true + ); + + $data[0] = html_print_div(['class' => 'flex-row-center', 'content' => implode('', $formExecuteContent)], true); + $table->data['plugin_command_inputs'] = $data; + $table->colspan['plugin_command_inputs'][0] = 2; $data = []; $data[0] = __('Plug-in parameters'); - $data[1] = ''; - $table->data['plugin_parameters'] = $data; + $table->data['plugin_parameters_caption'] = $data; + + $data = []; + $data[0] = html_print_input_text( + 'form_parameters', + $parameters, + '', + 100, + 255, + true, + false, + false, + '', + 'command_component command_advanced_conf text_input w100p' + ); + $table->data['plugin_parameters_inputs'] = $data; + $table->colspan['plugin_parameters_inputs'][0] = 2; $data = []; $data[0] = __('Command preview'); - $data[1] = '
        '; - $table->data['plugin_preview'] = $data; + $table->data['plugin_preview_captions'] = $data; + $data = []; - $table->width = '100%'; - $table->class = 'databox filters'; - if (defined('METACONSOLE')) { + $data[0] = html_print_div(['id' => 'command_preview', 'class' => 'mono'], true); + $table->data['plugin_preview_inputs'] = $data; + $table->colspan['plugin_preview_inputs'][0] = 2; + /* + $table->width = '100%'; + $table->class = 'databox filters'; + if (is_metaconsole() === true) { $table->head[0] = __('Command'); $table->head_colspan[0] = 4; $table->headstyle[0] = 'text-align: center'; html_print_table($table); - } else { + } else { echo '
        '.__('Command').''; html_print_table($table); echo '
        '; - } + } + */ + // Parameters macros title. + $macrosTitleContent = []; + $macrosTitleContent[] = html_print_div([ 'style' => 'width: 10px; flex: 0 0 auto; margin-right: 5px;}', 'class' => 'section_table_title_line' ], true); + $macrosTitleContent[] = html_print_div([ 'class' => 'section_table_title', 'content' => __('Parameters macros')], true); $data = []; - - $table->data = []; + $data[0] = html_print_div(['class' => 'flex-row-center', 'content' => implode('', $macrosTitleContent) ], true); + $table->data['parameters_macros_title'] = $data; $macros = json_decode($macros, true); @@ -494,8 +559,8 @@ if (($create != '') || ($view != '')) { $next_name_number = 9; $i = 1; while (1) { - // Always print at least one macro - if ((!isset($macros[$i]) || $macros[$i]['desc'] == '') && $i > 1) { + // Always print at least one macro. + if ((isset($macros[$i]) === false || $macros[$i]['desc'] == '') && $i > 1) { break; } @@ -617,9 +682,15 @@ if (($create != '') || ($view != '')) { $table->headstyle[0] = 'text-align: center'; html_print_table($table); } else { - echo '
        '.''.__('Parameters macros').''; - html_print_table($table); - echo '
        '; + // echo '
        '.''.__('Parameters macros').''; + html_print_div( + [ + 'class' => 'info_table', + 'content' => html_print_table($table, true), + ] + ); + + // echo '
        '; } echo '
        '; @@ -658,22 +729,22 @@ if (($create != '') || ($view != '')) { $tabs = [ 'list' => [ 'text' => ''.html_print_image( - 'images/eye_show.png', + 'images/see-details@svg.svg', true, [ 'title' => __('Plugins'), - 'class' => 'invert_filter', + 'class' => 'invert_filter main_menu_icon', ] ).'', 'active' => (bool) ($tab != 'Attachments'), ], 'options' => [ 'text' => ''.html_print_image( - 'images/collection.png', + 'images/file-collection@svg.svg', true, [ 'title' => __('Attachments'), - 'class' => 'invert_filter', + 'class' => 'invert_filter main_menu_icon', ] ).'', 'active' => (bool) ($tab == 'Attachments'), @@ -884,55 +955,32 @@ if (($create != '') || ($view != '')) { $rows = db_get_all_rows_sql('SELECT * FROM tplugin ORDER BY name'); if ($rows !== false) { - if (defined('METACONSOLE')) { - echo '
        '; - } else { - echo '
        '; + $pluginTable = new stdClass(); + $pluginTable->id = 'plugin_table'; + $pluginTable->class = (is_metaconsole() === true) ? 'databox data' : 'info_table m2020'; + + $pluginTable->head = []; + $pluginTable->head[0] = __('Name'); + $pluginTable->head[1] = __('Type'); + $pluginTable->head[2] = __('Command'); + if ($management_allowed === true) { + $pluginTable->head[3] = ''.__('Op.').''; } - echo ''; - echo ''; - echo ''; - echo ''; - if ($management_allowed) { - echo "'; - } + $pluginTable->data = []; - echo ''; + foreach ($rows as $k => $row) { + if ($management_allowed === true) { + $tableActionButtons = []; + $pluginNameContent = html_print_anchor( + [ + 'href' => 'index.php?sec=$sec&sec2=godmode/servers/plugin&view='.$row['id'].'&tab=plugins&pure='.$config['pure'], + 'content' => $row['name'], + ], + true + ); - $color = 0; - - foreach ($rows as $row) { - if ($color == 1) { - $tdcolor = 'datos'; - $color = 0; - } else { - $tdcolor = 'datos2'; - $color = 1; - } - - echo ''; - echo "'; - echo "'; - if ($management_allowed) { - echo "'; + $tableActionButtons[] = html_print_anchor( + [ + 'href' => 'index.php?sec=$sec&sec2=godmode/servers/plugin&tab=$tab&view='.$row['id'].'&tab=plugins&pure='.$config['pure'], + 'content' => html_print_image( + 'images/edit.svg', + true, + [ + 'title' => __('Edit'), + 'class' => 'invert_filter main_menu_icon ', + ] + ), + ], + true + ); + + if ((bool) $row['no_delete'] === false) { + $tableActionButtons[] = html_print_anchor( + [ + 'href' => 'index.php?sec=$sec&sec2=godmode/servers/plugin&tab=$tab&kill_plugin='.$row['id'].'&tab=plugins&pure='.$config['pure'], + 'onClick' => 'javascript: if (!confirm(\''.__('All the modules that are using this plugin will be deleted').'. '.__('Are you sure?').'\')) return false;', + 'content' => html_print_image( + 'images/delete.svg', + true, + [ + 'title' => __('Delete'), + 'class' => 'invert_filter main_menu_icon', + ] + ), + ], + true + ); + } + } else { + $pluginNameContent = $row['name']; } - echo ''; + $pluginTable->data[$k][0] = $pluginNameContent; + $pluginTable->data[$k][1] = ((int) $row['plugin_type'] === 0) ? __('Standard') : __('Nagios'); + $pluginTable->data[$k][2] = $row['execute']; + + if ($management_allowed === true) { + $pluginTable->data[$k][3] = html_print_div( + [ + 'class' => 'table_action_buttons', + 'content' => implode('', $tableActionButtons), + ], + true + ); + } } - echo '
        '.__('Name').''.__('Type').''.__('Command').'".''.__('Op.').''.'
        "; - if ($management_allowed) { - echo ""; - } - - echo $row['name']; - echo '"; - if ($row['plugin_type'] == 0) { - echo __('Standard'); - } else { - echo __('Nagios'); - } - - echo ""; - echo $row['execute']; - echo '"; - - // Show it is locket + // Show it is locket. $modules_using_plugin = db_get_value_filter( 'count(*)', 'tagente_modulo', @@ -947,49 +995,93 @@ if (($create != '') || ($view != '')) { ['id_plugin' => $row['id']] ); if (($components_using_plugin + $modules_using_plugin) > 0) { - echo ''; - html_print_image('images/lock_mc.png', false, ['class' => 'invert_filter']); - echo ''; - } - - echo "".html_print_image( - 'images/config.png', - true, - [ - 'title' => __('Edit'), - 'class' => 'invert_filter', - ] - ).'  '; - if ((bool) $row['no_delete'] === false) { - echo "".html_print_image( - 'images/cross.png', - true, + $tableActionButtons[] = html_print_anchor( [ - 'border' => '0', - 'class' => 'invert_filter', - ] - ).''; + 'href' => 'javascript: show_locked_dialog('.$row['id'].', \''.$row['name'].'\');', + 'content' => html_print_image( + 'images/policy@svg.svg', + true, + [ + 'title' => __('Lock'), + 'class' => 'main_menu_icon invert_filter', + ] + ), + ], + true + ); } - echo '
        '; + html_print_table($pluginTable); } else { ui_print_info_message(['no_close' => true, 'message' => __('There are no plugins in the system') ]); } - if ($management_allowed) { - echo ""; + if ($management_allowed === true) { + echo ''; - echo '
        '; - echo ""; - echo ""; - echo '
        '; - echo '